Versionierung der Arbeitsbereiche: Verlauf je Datei mit Agent, Lauf und Vorfassung (#719)

Eigene inhaltsadressierte Ablage (Agents/.history/objects, SHA-256) statt Git,
Journal FileHistory in state.db. Jeder Schreibweg - FileRW write/append/copy/
delete/stock_add, FTP- und RocketChat-Downloads - legt die alte Fassung ab und
verbucht die Aenderung mit RunId. Externe Aenderungen findet ein Abgleich beim
Start und stuendlich. Aufbewahrung nach Tagen und Fassungen, verwaiste Objekte
werden entfernt. WebUI: Dateiverlauf mit Filter, Diff und Wiederherstellen nur
durch den Menschen mit Grund.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-09-28 11:12:13 +02:00
co-authored by Claude Opus 5.5
parent 621a83de43
commit e9c39c3c96
21 changed files with 1663 additions and 2 deletions
@@ -986,5 +986,49 @@
"team.conflicts.title": "Dateien, in denen sich Agenten gegenseitig überschreiben",
"team.conflicts.hint": "Hier wurden Schreibvorgänge abgelehnt, weil sie die Änderung eines anderen Agenten verloren hätten. Passiert das oft, sollte die Ablage anders werden: eine Datei je Agent oder Tag, Anhängen statt Ersetzen oder eine Tabelle.",
"team.conflicts.count": "{n} Konflikte in 7 Tagen, zwischen {agents}; zuletzt {time}"
"team.conflicts.count": "{n} Konflikte in 7 Tagen, zwischen {agents}; zuletzt {time}",
"nav.fileHistory": "Dateiverlauf",
"fileHistory.title": "Dateiverlauf",
"fileHistory.intro": "Jede Änderung in den Arbeitsbereichen: wer welche Datei in welchem Lauf angelegt, ersetzt, ergänzt oder gelöscht hat, und was vorher darin stand. Änderungen außerhalb der Werkzeuge werden gefunden und als extern geführt. Eine Fassung lässt sich zurückholen – mit Grund, als eigener Eintrag.",
"fileHistory.workspace": "Arbeitsbereich",
"fileHistory.allWorkspaces": "Alle Arbeitsbereiche",
"fileHistory.agent": "Agent",
"fileHistory.path": "Dateipfad (genau)",
"fileHistory.run": "Lauf",
"fileHistory.apply": "Filtern",
"fileHistory.reset": "Zurücksetzen",
"fileHistory.more": "Ältere Einträge",
"fileHistory.unavailable": "Dateiverlauf nicht verfügbar",
"fileHistory.empty.title": "Keine Änderungen",
"fileHistory.empty.text": "Nichts passt – oder seit Beginn des Verlaufs wurde nichts geändert.",
"fileHistory.external": "außerhalb der Werkzeuge",
"fileHistory.toRun": "Lauf",
"fileHistory.onlyThisFile": "Nur diese Datei zeigen",
"fileHistory.show": "Anzeigen",
"fileHistory.action.create": "angelegt",
"fileHistory.action.replace": "ersetzt",
"fileHistory.action.append": "ergänzt",
"fileHistory.action.copy": "kopiert",
"fileHistory.action.delete": "gelöscht",
"fileHistory.action.restore": "wiederhergestellt",
"fileHistory.action.external": "extern",
"fileHistory.before": "Vorher",
"fileHistory.after": "Nachher",
"fileHistory.text": "Text",
"fileHistory.absent": "keine Datei",
"fileHistory.notKept": "nicht aufbewahrt",
"fileHistory.tooLarge": "zu groß zum Anzeigen ({bytes} Bytes)",
"fileHistory.binary": "binär ({bytes} Bytes)",
"fileHistory.restoreBefore": "Fassung davor wiederherstellen",
"fileHistory.restoreAfter": "Fassung danach wiederherstellen",
"fileHistory.restore": "Wiederherstellen",
"fileHistory.restoreTitle": "{path} wiederherstellen",
"fileHistory.restoreBeforeHint": "Die Datei bekommt den Inhalt, den sie vor dieser Änderung hatte. Was jetzt darin steht, bleibt im Verlauf erhalten.",
"fileHistory.restoreAfterHint": "Die Datei bekommt den Inhalt, den ihr diese Änderung gegeben hat. Was jetzt darin steht, bleibt im Verlauf erhalten.",
"fileHistory.reason": "Grund",
"fileHistory.reasonPlaceholder": "Warum wird diese Fassung zurückgeholt?",
"fileHistory.reasonMissing": "Eine Wiederherstellung braucht einen Grund.",
"fileHistory.restored": "{path} wiederhergestellt.",
"fileHistory.failed": "Fehlgeschlagen: {error}"
}
@@ -986,5 +986,49 @@
"team.conflicts.title": "Files agents keep overwriting each other in",
"team.conflicts.hint": "Writes were refused here because they would have lost another agent's change. If it keeps happening, change how the file is kept: one file per agent or day, appending instead of replacing, or a table.",
"team.conflicts.count": "{n} conflicts in 7 days, between {agents}; last {time}"
"team.conflicts.count": "{n} conflicts in 7 days, between {agents}; last {time}",
"nav.fileHistory": "File History",
"fileHistory.title": "File History",
"fileHistory.intro": "Every change in the workspaces: who created, replaced, appended to or deleted which file, in which run, and what was in it before. Changes made outside the tools are found and listed as external. A version can be put back — with a reason, as an entry of its own.",
"fileHistory.workspace": "Workspace",
"fileHistory.allWorkspaces": "All workspaces",
"fileHistory.agent": "Agent",
"fileHistory.path": "File path (exact)",
"fileHistory.run": "Run",
"fileHistory.apply": "Filter",
"fileHistory.reset": "Reset",
"fileHistory.more": "Older entries",
"fileHistory.unavailable": "File history unavailable",
"fileHistory.empty.title": "No changes",
"fileHistory.empty.text": "Nothing matches — or nothing has been changed since the history started.",
"fileHistory.external": "outside the tools",
"fileHistory.toRun": "run",
"fileHistory.onlyThisFile": "Show only this file",
"fileHistory.show": "Show",
"fileHistory.action.create": "created",
"fileHistory.action.replace": "replaced",
"fileHistory.action.append": "appended",
"fileHistory.action.copy": "copied",
"fileHistory.action.delete": "deleted",
"fileHistory.action.restore": "restored",
"fileHistory.action.external": "external",
"fileHistory.before": "Before",
"fileHistory.after": "After",
"fileHistory.text": "text",
"fileHistory.absent": "no file",
"fileHistory.notKept": "not kept",
"fileHistory.tooLarge": "too large to show ({bytes} bytes)",
"fileHistory.binary": "binary ({bytes} bytes)",
"fileHistory.restoreBefore": "Restore version before",
"fileHistory.restoreAfter": "Restore version after",
"fileHistory.restore": "Restore",
"fileHistory.restoreTitle": "Restore {path}",
"fileHistory.restoreBeforeHint": "The file gets the content it had before this change. What it holds now is kept in the history.",
"fileHistory.restoreAfterHint": "The file gets the content this change gave it. What it holds now is kept in the history.",
"fileHistory.reason": "Reason",
"fileHistory.reasonPlaceholder": "Why is this version put back?",
"fileHistory.reasonMissing": "A restore needs a reason.",
"fileHistory.restored": "{path} restored.",
"fileHistory.failed": "Failed: {error}"
}