Chats teilen: Upvote-Daumen verteilt Chat samt Workspace über das Vault-Repo #240

Closed
opened 2026-10-28 18:15:36 +00:00 by alf · 7 comments
Owner

Chats gezielt mit den eigenen Iris-Rechnern teilen: Der grüne Daumen (Upvote) in der Jobliste markiert einen Chat als „gut und soll bleiben“. Das steuert zugleich den späteren Dreamer und das Verteilen über das Vault-Repo. Ausgangspunkt: Betatester chatten statt Notizen zu schreiben (das Wissen ist das Abfallprodukt der Arbeit, so war es gedacht), aber Chats und Workspaces liegen nur auf einem Rechner und im Backup, auf einer anderen Iris findet man sie nicht wieder.

Entstanden aus einem grill-me (28.10.2026); die Entscheidungen unten sind abgestimmt.

Verhalten

  1. Ein Knopf, eine Bedeutung. Daumen aktiv = der Chat ist „gut“ (Dreamer, später) und geteilt. Es gibt keinen Zwischenzustand. Der Dreamer ist noch nicht implementiert; vote = "up" ist heute nur die Markierung. Der Knopf bleibt wie er ist (beim Überfahren sichtbar, aktiv = gefüllter heller grüner Daumen).
  2. Größenprüfung beim Aktivieren. Der Server misst den Workspace, wenn der Daumen eingeschaltet wird. Ab 250 MB kommt eine Sicherheitsabfrage (mit der Größe). Übertragen wird immer der komplette Chat samt Workspace, es gibt keine Variante „nur Verlauf“. Lehnt der Nutzer ab, passiert nichts und der Daumen bleibt aus.
  3. Ankunft auf den anderen Iris: automatisch. Der Server legt den Chat als Job in der normalen Jobliste an (gleiche ID, Daumen aktiv), der Workspace wird in den lokalen Workspace-Ordner kopiert, Pfade werden umgeschrieben.
  4. Ausschalten: Der Chat verschwindet aus dem Repo. Auf den anderen Rechnern bleibt er als lokale Kopie ohne aktiven Daumen.
  5. Historie: Das Entfernen gilt nur für den aktuellen Stand; Git behält den Chat in der Versionsgeschichte (und die LFS-Objekte bleiben auf dem Forgejo). Iris sagt das ehrlich vor dem ersten Teilen und beim Entfernen.
  6. Gleichzeitiges Weiterführen auf zwei Rechnern: ein Chat = eine Datei (chat.json), der vorhandene Konfliktdialog (Meine / Server / Beide behalten) entscheidet. „Beide behalten“ ergibt zwei Chats (die Konfliktkopie bekommt eine neue ID). Die Nachrichten haben weder ID noch Zeitstempel, ein automatisches Zusammenführen gibt es deshalb nicht.
  7. Zeitpunkt: Sofort beim Einschalten, danach nach jedem Jobende (Verlauf und neue/geänderte Workspace-Dateien), nie während ein Job läuft. Umbenennen aktualisiert den Titel.
  8. Bisherige Daumen werden beim ersten Start der neuen Version stillschweigend geteilt (Entscheidung des Nutzers; Hinweis in den Versionsnotizen). Chats mit Workspace über 250 MB werden dabei übersprungen: Der Daumen wird zurückgenommen, die Liste der übersprungenen Chats zeigt Iris einmal an.
  9. Löschen eines geteilten Chats beendet das Teilen (entfernt ihn auch aus dem Repo; Rückfrage vorher). Archivieren lässt ihn geteilt, das Archiv-Flag wandert nicht mit.
  10. Suche: Zu jedem geteilten Chat gehört eine lesbare chat.md (Frontmatter type: chat), die in der Vault-Suche und im RAG indiziert wird. Der Workspace wird nicht indiziert.

Anzeige

In der Jobliste zeigt die Zeile unter dem Titel den Statuspunkt (grün = läuft). Neu: ein blauer Punkt direkt dahinter, vor der Zeit, wenn der Chat geteilt ist (vote == "up"). Gleiche Anzeige in IrisRemote. Kein Schein um die Zeile, kein dauerhaft sichtbarer Daumen.

Technische Umsetzung (Stand 2026-10-28)

  • Ort und Format: im Vault-Repo unter Iris-Internal/Geteilte-Chats/<JOB-ID>/ als entpacktes .irischat-Bundle, also im Format des bestehenden Chat-Exports (ChatBundleBuilder, chat_bundle.py, import_job), nur ohne Zip: bundle-manifest.json, chats/<ID>/{chat-manifest.json, messages.json, workspace/…} und eine lesbare chat.md (Frontmatter type: chat). So übertragen Git und LFS nach einem Jobende nur Geändertes. Workspace-Dateien laufen über Git LFS (Regel in der .gitattributes, wird beim Export ergänzt); .git-Ordner und .DS_Store werden nie mitgenommen; Manifest-Daten ohne Sekundenbruchteile (Swifts .iso8601). Ist das Vault nicht mit einem Git-Server verbunden, wird trotzdem lokal exportiert, der Abgleich holt es nach.
  • Wire (beide Server, alle Clients): POST /agent/:id/vote mit {vote, confirm_large?}; über 250 MB ohne confirm_large antwortet der Server mit 409 und {error: "needs_confirmation", workspace_bytes, limit_bytes}. Löschen eines geteilten Chats nimmt ihn aus dem Repo, Umbenennen aktualisiert den Titel. Die Clients zeigen den blauen Punkt aus vote == "up", kein neues Feld. Dokumentiert in 02-Wire-Protokoll.md.
  • Import nach jedem Abgleich, der etwas gebracht hat (auch nach Verbinden und Auflösen von Konflikten) und beim Start: neu → Job anlegen (Ursprungs-ID als share_id), geändert (Prüfsumme von Manifest und Verlauf) → aktualisieren, Ordner weg bei einem Job, der geteilt war → Daumen zurücknehmen (Kopie bleibt), Konfliktkopie messages (Server).json → zweiter Chat „… (Kopie)“.
  • Hermes-Sitzung: Der interne Zustand wandert nicht mit. Das Fortsetzen geht mit Verlauf und Workspace. Ein Linux-Server übernimmt nur Hermes-Chats.
  • Umsetzung: Linux-Server app/chat_share.py, Mac-Server ChatShareFiles.swift (Dateiebene, im Kerntest), ChatShareManager.swift (Iris), ChatShareConfirmation.swift (Rückfragen), Clients Iris, IrisClient, IrisRemote, RAG (obsidian-rag) nimmt nur chat.md auf.

Offen / nicht entschieden

  • Ob Iris Chats vor dem Teilen auf Geheimnisse (Zugangsdaten im Workspace) prüft. Das Repo liegt beim eigenen Git-Server.
  • Wie der Dreamer die geteilten Chats später einliest.
  • Verwaiste Workspaces nach dem Löschen eines Chats auf anderen Rechnern.

Abnahmekriterien (Entwurf)

  1. Daumen an: Chat samt Workspace liegt im Repo und kommt auf einer zweiten Iris als Job mit blauem Punkt an.
  2. Workspace über 250 MB: Rückfrage; Ablehnen lässt alles unverändert.
  3. Daumen aus: Chat weg aus dem Repo, auf der zweiten Iris bleibt die lokale Kopie ohne Daumen.
  4. Chat wird auf einer Iris fortgesetzt: Änderung kommt auf der anderen an; gleichzeitiges Fortsetzen ergibt den Konfliktdialog, „Beide behalten“ zwei Chats.
  5. Löschen eines geteilten Chats entfernt ihn aus dem Repo.
  6. Migration: bisherige Daumen werden geteilt, große übersprungen und gemeldet.
  7. Server-Parität (Mac gegen Linux), alle drei Clients, Tests grün, Benutzeranleitung aktuell.
Chats gezielt mit den eigenen Iris-Rechnern teilen: Der grüne **Daumen** (Upvote) in der Jobliste markiert einen Chat als „gut und soll bleiben“. Das steuert zugleich den späteren Dreamer und das Verteilen über das Vault-Repo. Ausgangspunkt: Betatester chatten statt Notizen zu schreiben (das Wissen ist das Abfallprodukt der Arbeit, so war es gedacht), aber Chats und Workspaces liegen nur auf einem Rechner und im Backup, auf einer anderen Iris findet man sie nicht wieder. Entstanden aus einem grill-me (28.10.2026); die Entscheidungen unten sind abgestimmt. ## Verhalten 1. **Ein Knopf, eine Bedeutung.** Daumen aktiv = der Chat ist „gut“ (Dreamer, später) **und geteilt**. Es gibt keinen Zwischenzustand. Der Dreamer ist noch nicht implementiert; `vote = "up"` ist heute nur die Markierung. Der Knopf bleibt wie er ist (beim Überfahren sichtbar, aktiv = gefüllter heller grüner Daumen). 2. **Größenprüfung beim Aktivieren.** Der Server misst den Workspace, wenn der Daumen eingeschaltet wird. Ab **250 MB** kommt eine Sicherheitsabfrage (mit der Größe). Übertragen wird immer der komplette Chat samt Workspace, es gibt keine Variante „nur Verlauf“. Lehnt der Nutzer ab, passiert nichts und der Daumen bleibt aus. 3. **Ankunft auf den anderen Iris:** automatisch. Der Server legt den Chat als Job in der normalen Jobliste an (gleiche ID, Daumen aktiv), der Workspace wird in den lokalen Workspace-Ordner kopiert, Pfade werden umgeschrieben. 4. **Ausschalten:** Der Chat verschwindet aus dem Repo. Auf den anderen Rechnern bleibt er als **lokale Kopie** ohne aktiven Daumen. 5. **Historie:** Das Entfernen gilt nur für den aktuellen Stand; Git behält den Chat in der Versionsgeschichte (und die LFS-Objekte bleiben auf dem Forgejo). Iris sagt das ehrlich vor dem ersten Teilen und beim Entfernen. 6. **Gleichzeitiges Weiterführen** auf zwei Rechnern: ein Chat = eine Datei (`chat.json`), der vorhandene Konfliktdialog (Meine / Server / **Beide behalten**) entscheidet. „Beide behalten“ ergibt zwei Chats (die Konfliktkopie bekommt eine neue ID). Die Nachrichten haben weder ID noch Zeitstempel, ein automatisches Zusammenführen gibt es deshalb nicht. 7. **Zeitpunkt:** Sofort beim Einschalten, danach nach jedem Jobende (Verlauf und neue/geänderte Workspace-Dateien), nie während ein Job läuft. Umbenennen aktualisiert den Titel. 8. **Bisherige Daumen** werden beim ersten Start der neuen Version **stillschweigend geteilt** (Entscheidung des Nutzers; Hinweis in den Versionsnotizen). Chats mit Workspace über 250 MB werden dabei **übersprungen**: Der Daumen wird zurückgenommen, die Liste der übersprungenen Chats zeigt Iris einmal an. 9. **Löschen** eines geteilten Chats beendet das Teilen (entfernt ihn auch aus dem Repo; Rückfrage vorher). **Archivieren** lässt ihn geteilt, das Archiv-Flag wandert nicht mit. 10. **Suche:** Zu jedem geteilten Chat gehört eine lesbare `chat.md` (Frontmatter `type: chat`), die in der Vault-Suche und im RAG indiziert wird. Der Workspace wird nicht indiziert. ## Anzeige In der Jobliste zeigt die Zeile unter dem Titel den Statuspunkt (grün = läuft). Neu: ein **blauer Punkt direkt dahinter, vor der Zeit**, wenn der Chat geteilt ist (`vote == "up"`). Gleiche Anzeige in IrisRemote. Kein Schein um die Zeile, kein dauerhaft sichtbarer Daumen. ## Technische Umsetzung (Stand 2026-10-28) - **Ort und Format:** im Vault-Repo unter `Iris-Internal/Geteilte-Chats/<JOB-ID>/` als **entpacktes `.irischat`-Bundle**, also im Format des bestehenden Chat-Exports (`ChatBundleBuilder`, `chat_bundle.py`, `import_job`), nur ohne Zip: `bundle-manifest.json`, `chats/<ID>/{chat-manifest.json, messages.json, workspace/…}` und eine lesbare `chat.md` (Frontmatter `type: chat`). So übertragen Git und LFS nach einem Jobende nur Geändertes. Workspace-Dateien laufen über Git LFS (Regel in der `.gitattributes`, wird beim Export ergänzt); `.git`-Ordner und `.DS_Store` werden nie mitgenommen; Manifest-Daten ohne Sekundenbruchteile (Swifts `.iso8601`). Ist das Vault nicht mit einem Git-Server verbunden, wird trotzdem lokal exportiert, der Abgleich holt es nach. - **Wire (beide Server, alle Clients):** `POST /agent/:id/vote` mit `{vote, confirm_large?}`; über 250 MB ohne `confirm_large` antwortet der Server mit `409` und `{error: "needs_confirmation", workspace_bytes, limit_bytes}`. Löschen eines geteilten Chats nimmt ihn aus dem Repo, Umbenennen aktualisiert den Titel. Die Clients zeigen den blauen Punkt aus `vote == "up"`, kein neues Feld. Dokumentiert in `02-Wire-Protokoll.md`. - **Import** nach jedem Abgleich, der etwas gebracht hat (auch nach Verbinden und Auflösen von Konflikten) und beim Start: neu → Job anlegen (Ursprungs-ID als `share_id`), geändert (Prüfsumme von Manifest und Verlauf) → aktualisieren, Ordner weg bei einem Job, der geteilt war → Daumen zurücknehmen (Kopie bleibt), Konfliktkopie `messages (Server).json` → zweiter Chat „… (Kopie)“. - **Hermes-Sitzung:** Der interne Zustand wandert nicht mit. Das Fortsetzen geht mit Verlauf und Workspace. Ein Linux-Server übernimmt nur Hermes-Chats. - **Umsetzung:** Linux-Server `app/chat_share.py`, Mac-Server `ChatShareFiles.swift` (Dateiebene, im Kerntest), `ChatShareManager.swift` (Iris), `ChatShareConfirmation.swift` (Rückfragen), Clients Iris, IrisClient, IrisRemote, RAG (`obsidian-rag`) nimmt nur `chat.md` auf. ## Offen / nicht entschieden - Ob Iris Chats vor dem Teilen auf Geheimnisse (Zugangsdaten im Workspace) prüft. Das Repo liegt beim eigenen Git-Server. - Wie der Dreamer die geteilten Chats später einliest. - Verwaiste Workspaces nach dem Löschen eines Chats auf anderen Rechnern. ## Abnahmekriterien (Entwurf) 1. Daumen an: Chat samt Workspace liegt im Repo und kommt auf einer zweiten Iris als Job mit blauem Punkt an. 2. Workspace über 250 MB: Rückfrage; Ablehnen lässt alles unverändert. 3. Daumen aus: Chat weg aus dem Repo, auf der zweiten Iris bleibt die lokale Kopie ohne Daumen. 4. Chat wird auf einer Iris fortgesetzt: Änderung kommt auf der anderen an; gleichzeitiges Fortsetzen ergibt den Konfliktdialog, „Beide behalten“ zwei Chats. 5. Löschen eines geteilten Chats entfernt ihn aus dem Repo. 6. Migration: bisherige Daumen werden geteilt, große übersprungen und gemeldet. 7. Server-Parität (Mac gegen Linux), alle drei Clients, Tests grün, Benutzeranleitung aktuell.
Author
Owner

PR #126 gemergt: feat(chats-teilen): Upvote-Daumen teilt Chat samt Workspace über das Vault-Repo, Linux-Server (iris/Iris#240)
iris/iris-linux-server#126

Commits:

  • feat(chats-teilen): Upvote-Daumen teilt Chat samt Workspace über das Vault-Repo, Linux-Server (iris/Iris#240)

Stand 2026-10-28: Linux-Server gebaut

  • Neu: app/chat_share.py (Export, Löschen, Import, Größenprüfung, Migration). Ein geteilter Chat liegt als entpacktes .irischat-Bundle unter Iris-Internal/Geteilte-Chats/<JOB-ID>/ (bundle-manifest.json, chats/<ID>/{chat-manifest.json, messages.json, workspace/}, chat.md mit type: chat), also im Format des vorhandenen Exports, nur ohne Zip: Git und LFS übertragen nach einem Jobende nur Geändertes. Workspace-Dateien über Git LFS (Regel in der .gitattributes, wird beim Export ergänzt), .git und .DS_Store nie.
  • Angebunden: POST /agent/:id/vote (up teilt, über 250 MB und ohne confirm_large 409 needs_confirmation; jeder andere Wert nimmt den Chat aus dem Bestand), Löschen und Umbenennen (main.py); Export nach jedem Jobende vor den Hooks (agent_jobs._after_turn, damit der Vault-Commit ihn mitnimmt); Import nach jedem Abgleich, der etwas gebracht hat, und nach Verbinden/Auflösen (vault_git_sync._import_shared_chats); Start: einmalige Migration bisheriger Daumen (über 250 MB übersprungen, Daumen zurück, Hinweis per Benachrichtigung) und Import (chat_share.startup). jobs_store.import_job kann einen vorhandenen Job an Ort und Stelle aktualisieren (replace_job_id).
  • Konfliktkopien (messages (Server).json aus „Beide behalten“) werden ein zweiter, eigener Chat „… (Kopie)“ und danach entfernt. Manifest-Daten ohne Sekundenbruchteile (Swifts .iso8601).
  • RAG: skills/obsidian-rag/obsidian.py indiziert von geteilten Chats nur chat.md, nie chats/… (Workspace).
  • Geprüft: 13 neue Tests in tests/test_chat_share.py (Export-Layout, Spiegelung mit Löschen, Import auf „anderer Iris“, Aktualisierung, Daumen aus, Konfliktkopie, Größenschwelle, Migration, Vote/Löschen), dazu die bestehenden Vault-Sync-, Import- und Job-Tests: 143 grün, 1 übersprungen. app.main lässt sich lokal nicht importieren (fehlendes Modul vault_admin_generate_index gibt es nur im Container), die Routen sind deshalb über chat_share.apply_vote/unshare_before_delete getestet, nicht über HTTP.
  • Nicht geprüft: HTTP-Pfad der Routen, der echte Ablauf über zwei Server mit Git und Forgejo, große Workspaces, Hermes-Betrieb nach dem Import.
  • Nicht deployt.
PR #126 gemergt: feat(chats-teilen): Upvote-Daumen teilt Chat samt Workspace über das Vault-Repo, Linux-Server (iris/Iris#240) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/126 Commits: - feat(chats-teilen): Upvote-Daumen teilt Chat samt Workspace über das Vault-Repo, Linux-Server (iris/Iris#240) --- **Stand 2026-10-28: Linux-Server gebaut** - **Neu:** `app/chat_share.py` (Export, Löschen, Import, Größenprüfung, Migration). Ein geteilter Chat liegt als **entpacktes `.irischat`-Bundle** unter `Iris-Internal/Geteilte-Chats/<JOB-ID>/` (`bundle-manifest.json`, `chats/<ID>/{chat-manifest.json, messages.json, workspace/}`, `chat.md` mit `type: chat`), also im Format des vorhandenen Exports, nur ohne Zip: Git und LFS übertragen nach einem Jobende nur Geändertes. Workspace-Dateien über Git LFS (Regel in der `.gitattributes`, wird beim Export ergänzt), `.git` und `.DS_Store` nie. - **Angebunden:** `POST /agent/:id/vote` (`up` teilt, über 250 MB und ohne `confirm_large` `409 needs_confirmation`; jeder andere Wert nimmt den Chat aus dem Bestand), Löschen und Umbenennen (`main.py`); Export nach jedem Jobende vor den Hooks (`agent_jobs._after_turn`, damit der Vault-Commit ihn mitnimmt); Import nach jedem Abgleich, der etwas gebracht hat, und nach Verbinden/Auflösen (`vault_git_sync._import_shared_chats`); Start: einmalige Migration bisheriger Daumen (über 250 MB übersprungen, Daumen zurück, Hinweis per Benachrichtigung) und Import (`chat_share.startup`). `jobs_store.import_job` kann einen vorhandenen Job an Ort und Stelle aktualisieren (`replace_job_id`). - **Konfliktkopien** (`messages (Server).json` aus „Beide behalten“) werden ein zweiter, eigener Chat „… (Kopie)“ und danach entfernt. Manifest-Daten ohne Sekundenbruchteile (Swifts `.iso8601`). - **RAG:** `skills/obsidian-rag/obsidian.py` indiziert von geteilten Chats nur `chat.md`, nie `chats/…` (Workspace). - **Geprüft:** 13 neue Tests in `tests/test_chat_share.py` (Export-Layout, Spiegelung mit Löschen, Import auf „anderer Iris“, Aktualisierung, Daumen aus, Konfliktkopie, Größenschwelle, Migration, Vote/Löschen), dazu die bestehenden Vault-Sync-, Import- und Job-Tests: 143 grün, 1 übersprungen. `app.main` lässt sich lokal nicht importieren (fehlendes Modul `vault_admin_generate_index` gibt es nur im Container), die Routen sind deshalb über `chat_share.apply_vote`/`unshare_before_delete` getestet, nicht über HTTP. - **Nicht geprüft:** HTTP-Pfad der Routen, der echte Ablauf über zwei Server mit Git und Forgejo, große Workspaces, Hermes-Betrieb nach dem Import. - **Nicht deployt.**
Author
Owner

PR #241 gemergt: feat(chats-teilen): Upvote-Daumen teilt Chat samt Workspace, Mac-Server, Iris und IrisClient (#240)
#241

Commits:

  • feat(chats-teilen): Upvote-Daumen teilt Chat samt Workspace, Mac-Server, Iris und IrisClient (#240)

Stand 2026-10-28: Mac-Server, Iris und IrisClient gebaut

  • Neu: ChatShareFiles.swift (Dateiebene: entpacktes .irischat-Bundle im Vault, Spiegelung des Workspaces mit Löschen, LFS-Regel, Prüfsumme, Lesen inklusive Konfliktkopien; ohne Abhängigkeit zu Jobs, deshalb im Kerntest), ChatShareManager.swift (nur Iris: Export, Löschen, Import nach dem Abgleich, Migration bisheriger Daumen, alles unter JobHookManager.runExclusive), ChatShareConfirmation.swift (Rückfragen: erstes Teilen, Workspace über 250 MB, Teilen beenden, Löschen eines geteilten Chats).
  • Angebunden: AgentJobManager.requestVote (genau setzen, nicht umschalten; über 250 MB needsConfirmation), POST /agent/:id/vote mit confirm_large und 409 needs_confirmation, terminateJob (Löschen nimmt den Chat aus dem Repo), renameJob, Export nach jedem Jobende, Import nach Abgleich/Auflösen/Verbinden (VaultSyncController.vaultContentChangedHook, damit IrisClient ohne Jobliste unberührt bleibt), Start-Migration; AgentJob bekommt shareID, sharedInRepo, shareRevision (intern). Der Job→Bundle-Abbild wurde dafür aus ChatExportManager herausgezogen (chatFiles(for:)), importJob zerlegt (importedMessages, copyWorkspaceItems) und um updateSharedJob ergänzt.
  • Clients (Iris und IrisClient): Der Daumen fragt vor dem ersten Teilen, bei großem Workspace und beim Beenden (RemoteServerClient.voteJobInteractively, lokal toggleVoteInteractively); blauer Punkt hinter dem Statuspunkt, wenn vote == "up"; Löschen-Rückfrage mit Hinweis bei geteilten Chats.
  • Geprüft: Kerntest scripts/test-vault-sync-core.sh (jetzt mit ChatBundleBuilder und ChatShareFiles): 272 Prüfungen, 0 Fehler, darunter Bundle-Aufbau, Spiegelung mit Löschen, Größe, LFS-Regel einmalig, Konfliktkopie, Ordner entfernen (der Test hat einen Fehler beim Vergleich von /private/var mit /var gefunden und behoben). Schemes Iris und IrisClient bauen (eigener DerivedData-Ordner, nichts installiert).
  • Nicht geprüft: ChatShareManager, requestVote und der Import als Ganzes (Jobs hängen an der App; dafür gibt es keinen Kerntest), der echte Ablauf Mac → Linux und zurück, die Dialoge im laufenden Programm, große Workspaces.
  • Nicht eingecheckt (gitignored): die HTML-Hilfe (Handbuch/), sie ist lokal neu erzeugt.
PR #241 gemergt: feat(chats-teilen): Upvote-Daumen teilt Chat samt Workspace, Mac-Server, Iris und IrisClient (#240) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/241 Commits: - feat(chats-teilen): Upvote-Daumen teilt Chat samt Workspace, Mac-Server, Iris und IrisClient (#240) --- **Stand 2026-10-28: Mac-Server, Iris und IrisClient gebaut** - **Neu:** `ChatShareFiles.swift` (Dateiebene: entpacktes `.irischat`-Bundle im Vault, Spiegelung des Workspaces mit Löschen, LFS-Regel, Prüfsumme, Lesen inklusive Konfliktkopien; ohne Abhängigkeit zu Jobs, deshalb im Kerntest), `ChatShareManager.swift` (nur Iris: Export, Löschen, Import nach dem Abgleich, Migration bisheriger Daumen, alles unter `JobHookManager.runExclusive`), `ChatShareConfirmation.swift` (Rückfragen: erstes Teilen, Workspace über 250 MB, Teilen beenden, Löschen eines geteilten Chats). - **Angebunden:** `AgentJobManager.requestVote` (genau setzen, nicht umschalten; über 250 MB `needsConfirmation`), `POST /agent/:id/vote` mit `confirm_large` und `409 needs_confirmation`, `terminateJob` (Löschen nimmt den Chat aus dem Repo), `renameJob`, Export nach jedem Jobende, Import nach Abgleich/Auflösen/Verbinden (`VaultSyncController.vaultContentChangedHook`, damit IrisClient ohne Jobliste unberührt bleibt), Start-Migration; `AgentJob` bekommt `shareID`, `sharedInRepo`, `shareRevision` (intern). Der Job→Bundle-Abbild wurde dafür aus `ChatExportManager` herausgezogen (`chatFiles(for:)`), `importJob` zerlegt (`importedMessages`, `copyWorkspaceItems`) und um `updateSharedJob` ergänzt. - **Clients (Iris und IrisClient):** Der Daumen fragt vor dem ersten Teilen, bei großem Workspace und beim Beenden (`RemoteServerClient.voteJobInteractively`, lokal `toggleVoteInteractively`); **blauer Punkt** hinter dem Statuspunkt, wenn `vote == "up"`; Löschen-Rückfrage mit Hinweis bei geteilten Chats. - **Geprüft:** Kerntest `scripts/test-vault-sync-core.sh` (jetzt mit `ChatBundleBuilder` und `ChatShareFiles`): 272 Prüfungen, 0 Fehler, darunter Bundle-Aufbau, Spiegelung mit Löschen, Größe, LFS-Regel einmalig, Konfliktkopie, Ordner entfernen (der Test hat einen Fehler beim Vergleich von `/private/var` mit `/var` gefunden und behoben). Schemes Iris und IrisClient bauen (eigener DerivedData-Ordner, nichts installiert). - **Nicht geprüft:** `ChatShareManager`, `requestVote` und der Import als Ganzes (Jobs hängen an der App; dafür gibt es keinen Kerntest), der echte Ablauf Mac → Linux und zurück, die Dialoge im laufenden Programm, große Workspaces. - **Nicht eingecheckt (gitignored):** die HTML-Hilfe (`Handbuch/`), sie ist lokal neu erzeugt.
Author
Owner

PR #61 gemergt: feat(chats-teilen): Upvote-Daumen mit Rückfragen und blauem Punkt, IrisRemote (iris/Iris#240)
iris/2ndbrain-ios#61

Commits:

  • feat(chats-teilen): Upvote-Daumen mit Rückfragen und blauem Punkt, IrisRemote (iris/Iris#240)

Stand 2026-10-28: IrisRemote (iOS) gebaut

  • Geändert (AgentJob.swift, MainView.swift): AgentJobManager.setVote setzt den Wert genau (kein Umschalten mehr, der Aufrufer entscheidet) und liefert applied, needsConfirmation(workspaceBytes) (Antwort 409 needs_confirmation) oder failed; neuer confirm_large-Parameter. In der Jobliste: Daumen-Knopf und Kontextmenü Teilen (Upvote) bzw. Teilen beenden mit Rückfragen (erstes Teilen, einmalig; Workspace über 250 MB mit Größe; Teilen beenden); blauer Punkt in der Zeile unter dem Titel, wenn vote == "up"; Löschen-Rückfrage mit Hinweis bei geteilten Chats.
  • Geprüft: Scheme IrisRemote baut für den iOS-Simulator (eigener DerivedData-Ordner, nichts installiert).
  • Nicht geprüft: die Dialoge und der Punkt im Simulator oder auf einem Gerät, der 409-Pfad gegen einen echten Server.
PR #61 gemergt: feat(chats-teilen): Upvote-Daumen mit Rückfragen und blauem Punkt, IrisRemote (iris/Iris#240) https://forgejo.lewerken.duckdns.org/iris/2ndbrain-ios/pulls/61 Commits: - feat(chats-teilen): Upvote-Daumen mit Rückfragen und blauem Punkt, IrisRemote (iris/Iris#240) --- **Stand 2026-10-28: IrisRemote (iOS) gebaut** - **Geändert (`AgentJob.swift`, `MainView.swift`):** `AgentJobManager.setVote` setzt den Wert genau (kein Umschalten mehr, der Aufrufer entscheidet) und liefert `applied`, `needsConfirmation(workspaceBytes)` (Antwort `409 needs_confirmation`) oder `failed`; neuer `confirm_large`-Parameter. In der Jobliste: Daumen-Knopf und Kontextmenü **Teilen (Upvote)** bzw. **Teilen beenden** mit Rückfragen (erstes Teilen, einmalig; Workspace über 250 MB mit Größe; Teilen beenden); **blauer Punkt** in der Zeile unter dem Titel, wenn `vote == "up"`; Löschen-Rückfrage mit Hinweis bei geteilten Chats. - **Geprüft:** Scheme IrisRemote baut für den iOS-Simulator (eigener DerivedData-Ordner, nichts installiert). - **Nicht geprüft:** die Dialoge und der Punkt im Simulator oder auf einem Gerät, der 409-Pfad gegen einen echten Server.
Author
Owner

PR #132 gemergt: feat(chats-teilen): Wire-Doku und RAG nimmt nur chat.md geteilter Chats auf (iris/Iris#240)
alf/2ndbrain#132

Commits:

  • feat(chats-teilen): Wire-Doku und RAG nimmt nur chat.md geteilter Chats auf (iris/Iris#240)

Stand 2026-10-28: Wire-Doku und RAG

  • Geändert: Entwicklerdokumentation/02-Wire-Protokoll.md (neuer Abschnitt „Geteilte Chats“: vote mit confirm_large und 409 needs_confirmation, Ablage im Vault, Ablauf, Grenzen); skills/obsidian-rag/obsidian.py indiziert von geteilten Chats nur chat.md, nie den Workspace unter chats/.
  • Geprüft: gegen den gebauten Code gelesen; das Skript parst (ast). Nicht geprüft: ein echter RAG-Lauf (der Skill muss nach dem Deploy per deploy-iris-skills.sh zu Hermes), und die Benutzeranleitung läuft getrennt (Vault-Kapitel, gebaute BENUTZERHANDBUCH.md in macos-iris).
PR #132 gemergt: feat(chats-teilen): Wire-Doku und RAG nimmt nur chat.md geteilter Chats auf (iris/Iris#240) https://forgejo.lewerken.duckdns.org/alf/2ndbrain/pulls/132 Commits: - feat(chats-teilen): Wire-Doku und RAG nimmt nur chat.md geteilter Chats auf (iris/Iris#240) --- **Stand 2026-10-28: Wire-Doku und RAG** - **Geändert:** `Entwicklerdokumentation/02-Wire-Protokoll.md` (neuer Abschnitt „Geteilte Chats“: `vote` mit `confirm_large` und `409 needs_confirmation`, Ablage im Vault, Ablauf, Grenzen); `skills/obsidian-rag/obsidian.py` indiziert von geteilten Chats nur `chat.md`, nie den Workspace unter `chats/`. - **Geprüft:** gegen den gebauten Code gelesen; das Skript parst (`ast`). Nicht geprüft: ein echter RAG-Lauf (der Skill muss nach dem Deploy per `deploy-iris-skills.sh` zu Hermes), und die Benutzeranleitung läuft getrennt (Vault-Kapitel, gebaute `BENUTZERHANDBUCH.md` in macos-iris).
Author
Owner

Endkommentar 2026-10-28: Stand der Entwicklung

Gebaut und gemergt (alle fünf Repos, jeweils mit eigenem Stand-Kommentar oben):

Teil Repo / Stand
Linux-Server iris-linux-server main = 541a46a (app/chat_share.py, vote-Route, Löschen, Umbenennen, Export nach Jobende, Import nach Abgleich, Migration)
Mac-Server, Iris, IrisClient iris/Iris main = a6ca70b (ChatShareFiles, ChatShareManager, ChatShareConfirmation, requestVote, Rückfragen, blauer Punkt)
IrisRemote iris/2ndbrain-ios main = f58485a (Rückfragen, blauer Punkt, setVote mit 409)
Wire-Doku, RAG alf/2ndbrain main = 524a2cd (Abschnitt „Geteilte Chats“, obsidian-rag nimmt nur chat.md auf)
Benutzeranleitung Kapitel „Vault-Synchronisation“, Abschnitt „Chats teilen“ (Quelle im Vault, gebaute BENUTZERHANDBUCH.md in iris/Iris)

Umgesetzt wie abgestimmt: ein Daumen für Dreamer und Teilen; Größenprüfung beim Aktivieren mit Rückfrage ab 250 MB (immer ganz oder gar nicht, Ablehnen lässt alles unverändert); automatische Übernahme als Job auf den anderen Iris; Ausschalten und Löschen entfernen den Chat aus dem Repo (Historie bleibt, lokale Kopie bleibt), Archivieren ändert nichts; Nachlaufen nach jedem Jobende, nie während ein Job läuft; Konfliktdialog mit „Beide behalten“ = zwei Chats; bisherige Daumen werden einmalig stillschweigend geteilt, über 250 MB übersprungen und gemeldet; chat.md in Suche und RAG; blauer Punkt hinter dem Statuspunkt.

Abweichung vom Entwurf (besser): Statt eines neuen Formats (chat.json) liegt der Chat als entpacktes .irischat-Bundle im Vault, also im Format, das Export und Import beider Server schon beherrschen (inklusive Pfad-Umschreibung). Die Beschreibung oben ist angepasst.

Geprüft:

  • Linux-Server: 13 neue Tests (tests/test_chat_share.py) und die bestehenden Vault-Sync-, Import-, Kategorien- und Job-Tests: 143 grün, 1 übersprungen.
  • Mac-Kern: scripts/test-vault-sync-core.sh 272 Prüfungen, 0 Fehler (Bundle-Aufbau, Spiegelung mit Löschen, Größe, LFS-Regel, Konfliktkopie, Ordner entfernen; der Test fand und behob einen Pfadfehler /private/var gegen /var).
  • Iris, IrisClient und IrisRemote (iOS-Simulator) bauen.

Nicht geprüft (ehrlich):

  • Der Ablauf als Ganzes zwischen zwei echten Servern über Git und Forgejo (Mac → Linux und zurück), auch mit großen Workspaces und LFS.
  • ChatShareManager, requestVote und der Import auf dem Mac als Programm (Jobs hängen an der App, kein Kerntest); die Dialoge und der blaue Punkt im laufenden Programm, auf dem Simulator und auf Geräten.
  • Der HTTP-Pfad des Linux-Servers (app.main lässt sich lokal nicht importieren); getestet sind die Funktionen dahinter.
  • Das Fortsetzen eines importierten Chats mit Hermes; der Import eines Chats mit Claude Code auf dem Linux-Server (wird übersprungen, nicht geprüft).
  • Konflikte durch gleichzeitiges Fortsetzen in der Praxis.

Nicht deployt: iris-server und die Mac-Apps laufen noch mit dem alten Stand. Zum Ausprobieren: Linux-Server per rsync auf iris-server, Mac-App neu bauen (Xcode, nicht xcodebuild im Terminal), deploy-iris-skills.sh für den RAG-Skill.

Offen / bekannte Grenzen:

  • Geheimnisprüfung vor dem Teilen (bewusst nicht entschieden), Dreamer-Einlesen, verwaiste Workspaces auf anderen Rechnern nach dem Löschen.
  • Der interne Zustand der Hermes-Sitzung wandert nicht mit; ein Linux-Server übernimmt nur Hermes-Chats.
  • Bei jedem Jobende läuft ein Export unter der Hook-Sperre; ein sehr großer Workspace kann Hooks und Wächter kurz aufhalten (nur Geändertes wird kopiert).
  • Der Mac-Server schreibt workingDirectory (Mac-Pfad) ins Manifest; ein anderer Rechner ignoriert es.
  • Issue bleibt offen (status/zu-testen), bis du es im Alltag ausprobiert hast.
## Endkommentar 2026-10-28: Stand der Entwicklung **Gebaut und gemergt** (alle fünf Repos, jeweils mit eigenem Stand-Kommentar oben): | Teil | Repo / Stand | |---|---| | Linux-Server | `iris-linux-server` `main` = `541a46a` (`app/chat_share.py`, vote-Route, Löschen, Umbenennen, Export nach Jobende, Import nach Abgleich, Migration) | | Mac-Server, Iris, IrisClient | `iris/Iris` `main` = `a6ca70b` (`ChatShareFiles`, `ChatShareManager`, `ChatShareConfirmation`, `requestVote`, Rückfragen, blauer Punkt) | | IrisRemote | `iris/2ndbrain-ios` `main` = `f58485a` (Rückfragen, blauer Punkt, `setVote` mit 409) | | Wire-Doku, RAG | `alf/2ndbrain` `main` = `524a2cd` (Abschnitt „Geteilte Chats“, `obsidian-rag` nimmt nur `chat.md` auf) | | Benutzeranleitung | Kapitel „Vault-Synchronisation“, Abschnitt „Chats teilen“ (Quelle im Vault, gebaute `BENUTZERHANDBUCH.md` in `iris/Iris`) | **Umgesetzt wie abgestimmt:** ein Daumen für Dreamer und Teilen; Größenprüfung beim Aktivieren mit Rückfrage ab 250 MB (immer ganz oder gar nicht, Ablehnen lässt alles unverändert); automatische Übernahme als Job auf den anderen Iris; Ausschalten und Löschen entfernen den Chat aus dem Repo (Historie bleibt, lokale Kopie bleibt), Archivieren ändert nichts; Nachlaufen nach jedem Jobende, nie während ein Job läuft; Konfliktdialog mit „Beide behalten“ = zwei Chats; bisherige Daumen werden einmalig stillschweigend geteilt, über 250 MB übersprungen und gemeldet; `chat.md` in Suche und RAG; blauer Punkt hinter dem Statuspunkt. **Abweichung vom Entwurf (besser):** Statt eines neuen Formats (`chat.json`) liegt der Chat als **entpacktes `.irischat`-Bundle** im Vault, also im Format, das Export und Import beider Server schon beherrschen (inklusive Pfad-Umschreibung). Die Beschreibung oben ist angepasst. **Geprüft:** - Linux-Server: 13 neue Tests (`tests/test_chat_share.py`) und die bestehenden Vault-Sync-, Import-, Kategorien- und Job-Tests: 143 grün, 1 übersprungen. - Mac-Kern: `scripts/test-vault-sync-core.sh` 272 Prüfungen, 0 Fehler (Bundle-Aufbau, Spiegelung mit Löschen, Größe, LFS-Regel, Konfliktkopie, Ordner entfernen; der Test fand und behob einen Pfadfehler `/private/var` gegen `/var`). - Iris, IrisClient und IrisRemote (iOS-Simulator) bauen. **Nicht geprüft (ehrlich):** - Der Ablauf als Ganzes zwischen zwei echten Servern über Git und Forgejo (Mac → Linux und zurück), auch mit großen Workspaces und LFS. - `ChatShareManager`, `requestVote` und der Import auf dem Mac als Programm (Jobs hängen an der App, kein Kerntest); die Dialoge und der blaue Punkt im laufenden Programm, auf dem Simulator und auf Geräten. - Der HTTP-Pfad des Linux-Servers (`app.main` lässt sich lokal nicht importieren); getestet sind die Funktionen dahinter. - Das Fortsetzen eines importierten Chats mit Hermes; der Import eines Chats mit Claude Code auf dem Linux-Server (wird übersprungen, nicht geprüft). - Konflikte durch gleichzeitiges Fortsetzen in der Praxis. **Nicht deployt:** iris-server und die Mac-Apps laufen noch mit dem alten Stand. Zum Ausprobieren: Linux-Server per rsync auf iris-server, Mac-App neu bauen (Xcode, nicht `xcodebuild` im Terminal), `deploy-iris-skills.sh` für den RAG-Skill. **Offen / bekannte Grenzen:** - Geheimnisprüfung vor dem Teilen (bewusst nicht entschieden), Dreamer-Einlesen, verwaiste Workspaces auf anderen Rechnern nach dem Löschen. - Der interne Zustand der Hermes-Sitzung wandert nicht mit; ein Linux-Server übernimmt nur Hermes-Chats. - Bei jedem Jobende läuft ein Export unter der Hook-Sperre; ein sehr großer Workspace kann Hooks und Wächter kurz aufhalten (nur Geändertes wird kopiert). - Der Mac-Server schreibt `workingDirectory` (Mac-Pfad) ins Manifest; ein anderer Rechner ignoriert es. - Issue bleibt offen (`status/zu-testen`), bis du es im Alltag ausprobiert hast.
Author
Owner

PR #127 gemergt: fix(chats-teilen): chat_share.py und Tests fehlten im Repository (iris/Iris#240)
iris/iris-linux-server#127

Commits:

  • fix(chats-teilen): chat_share.py und Tests fehlten im Repository (iris/Iris#240)

Nachtrag 2026-10-28: Linux-Server, fehlende Dateien

  • Fehler: Der Linux-Server-Stand 541a46a wurde ohne ship -a eingereicht: app/chat_share.py und tests/test_chat_share.py fehlten im Repository, obwohl main.py, agent_jobs.py und vault_git_sync.py sie importieren. main war damit unvollständig (lokal und per rsync lief alles, weil die Dateien auf der Platte lagen).
  • Behoben: beide Dateien nachgereicht. Geprüft: git ls-files enthält sie; die 13 Tests in tests/test_chat_share.py liefen vorher grün (Stand im Kommentar oben).
PR #127 gemergt: fix(chats-teilen): chat_share.py und Tests fehlten im Repository (iris/Iris#240) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/127 Commits: - fix(chats-teilen): chat_share.py und Tests fehlten im Repository (iris/Iris#240) --- **Nachtrag 2026-10-28: Linux-Server, fehlende Dateien** - **Fehler:** Der Linux-Server-Stand `541a46a` wurde ohne `ship -a` eingereicht: `app/chat_share.py` und `tests/test_chat_share.py` fehlten im Repository, obwohl `main.py`, `agent_jobs.py` und `vault_git_sync.py` sie importieren. `main` war damit unvollständig (lokal und per rsync lief alles, weil die Dateien auf der Platte lagen). - **Behoben:** beide Dateien nachgereicht. Geprüft: `git ls-files` enthält sie; die 13 Tests in `tests/test_chat_share.py` liefen vorher grün (Stand im Kommentar oben).
Author
Owner

PR #242 gemergt: chore(skills): obsidian-rag aus dem Quellbaum (nur chat.md geteilter Chats), Localizable nachgezogen (#240)
#242

Commits:

  • chore(skills): obsidian-rag aus dem Quellbaum (nur chat.md geteilter Chats), Localizable nachgezogen (#240)
PR #242 gemergt: chore(skills): obsidian-rag aus dem Quellbaum (nur chat.md geteilter Chats), Localizable nachgezogen (#240) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/242 Commits: - chore(skills): obsidian-rag aus dem Quellbaum (nur chat.md geteilter Chats), Localizable nachgezogen (#240)
alf 2026-10-31 09:11:38 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
iris/Iris#240
No description provided.