Chats teilen: Upvote-Daumen verteilt Chat samt Workspace über das Vault-Repo #240
Labels
No labels
herkunft/alpha-feedback
status
blockiert
status
zu-testen
typ
bug
typ
docs
typ
enhancement
typ
feature
typ
idea
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
iris/Iris#240
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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
vote = "up"ist heute nur die Markierung. Der Knopf bleibt wie er ist (beim Überfahren sichtbar, aktiv = gefüllter heller grüner Daumen).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.chat.md(Frontmattertype: 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)
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 lesbarechat.md(Frontmattertype: 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_Storewerden 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.POST /agent/:id/votemit{vote, confirm_large?}; über 250 MB ohneconfirm_largeantwortet der Server mit409und{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 ausvote == "up", kein neues Feld. Dokumentiert in02-Wire-Protokoll.md.share_id), geändert (Prüfsumme von Manifest und Verlauf) → aktualisieren, Ordner weg bei einem Job, der geteilt war → Daumen zurücknehmen (Kopie bleibt), Konfliktkopiemessages (Server).json→ zweiter Chat „… (Kopie)“.app/chat_share.py, Mac-ServerChatShareFiles.swift(Dateiebene, im Kerntest),ChatShareManager.swift(Iris),ChatShareConfirmation.swift(Rückfragen), Clients Iris, IrisClient, IrisRemote, RAG (obsidian-rag) nimmt nurchat.mdauf.Offen / nicht entschieden
Abnahmekriterien (Entwurf)
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:
Stand 2026-10-28: Linux-Server gebaut
app/chat_share.py(Export, Löschen, Import, Größenprüfung, Migration). Ein geteilter Chat liegt als entpacktes.irischat-Bundle unterIris-Internal/Geteilte-Chats/<JOB-ID>/(bundle-manifest.json,chats/<ID>/{chat-manifest.json, messages.json, workspace/},chat.mdmittype: 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),.gitund.DS_Storenie.POST /agent/:id/vote(upteilt, über 250 MB und ohneconfirm_large409 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_jobkann einen vorhandenen Job an Ort und Stelle aktualisieren (replace_job_id).messages (Server).jsonaus „Beide behalten“) werden ein zweiter, eigener Chat „… (Kopie)“ und danach entfernt. Manifest-Daten ohne Sekundenbruchteile (Swifts.iso8601).skills/obsidian-rag/obsidian.pyindiziert von geteilten Chats nurchat.md, niechats/…(Workspace).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.mainlässt sich lokal nicht importieren (fehlendes Modulvault_admin_generate_indexgibt es nur im Container), die Routen sind deshalb überchat_share.apply_vote/unshare_before_deletegetestet, nicht über HTTP.PR #241 gemergt: feat(chats-teilen): Upvote-Daumen teilt Chat samt Workspace, Mac-Server, Iris und IrisClient (#240)
#241
Commits:
Stand 2026-10-28: Mac-Server, Iris und IrisClient gebaut
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 unterJobHookManager.runExclusive),ChatShareConfirmation.swift(Rückfragen: erstes Teilen, Workspace über 250 MB, Teilen beenden, Löschen eines geteilten Chats).AgentJobManager.requestVote(genau setzen, nicht umschalten; über 250 MBneedsConfirmation),POST /agent/:id/votemitconfirm_largeund409 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;AgentJobbekommtshareID,sharedInRepo,shareRevision(intern). Der Job→Bundle-Abbild wurde dafür ausChatExportManagerherausgezogen (chatFiles(for:)),importJobzerlegt (importedMessages,copyWorkspaceItems) und umupdateSharedJobergänzt.RemoteServerClient.voteJobInteractively, lokaltoggleVoteInteractively); blauer Punkt hinter dem Statuspunkt, wennvote == "up"; Löschen-Rückfrage mit Hinweis bei geteilten Chats.scripts/test-vault-sync-core.sh(jetzt mitChatBundleBuilderundChatShareFiles): 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/varmit/vargefunden und behoben). Schemes Iris und IrisClient bauen (eigener DerivedData-Ordner, nichts installiert).ChatShareManager,requestVoteund 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.Handbuch/), sie ist lokal neu erzeugt.PR #61 gemergt: feat(chats-teilen): Upvote-Daumen mit Rückfragen und blauem Punkt, IrisRemote (iris/Iris#240)
iris/2ndbrain-ios#61
Commits:
Stand 2026-10-28: IrisRemote (iOS) gebaut
AgentJob.swift,MainView.swift):AgentJobManager.setVotesetzt den Wert genau (kein Umschalten mehr, der Aufrufer entscheidet) und liefertapplied,needsConfirmation(workspaceBytes)(Antwort409 needs_confirmation) oderfailed; neuerconfirm_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, wennvote == "up"; Löschen-Rückfrage mit Hinweis bei geteilten Chats.PR #132 gemergt: feat(chats-teilen): Wire-Doku und RAG nimmt nur chat.md geteilter Chats auf (iris/Iris#240)
alf/2ndbrain#132
Commits:
Stand 2026-10-28: Wire-Doku und RAG
Entwicklerdokumentation/02-Wire-Protokoll.md(neuer Abschnitt „Geteilte Chats“:votemitconfirm_largeund409 needs_confirmation, Ablage im Vault, Ablauf, Grenzen);skills/obsidian-rag/obsidian.pyindiziert von geteilten Chats nurchat.md, nie den Workspace unterchats/.ast). Nicht geprüft: ein echter RAG-Lauf (der Skill muss nach dem Deploy perdeploy-iris-skills.shzu Hermes), und die Benutzeranleitung läuft getrennt (Vault-Kapitel, gebauteBENUTZERHANDBUCH.mdin macos-iris).Endkommentar 2026-10-28: Stand der Entwicklung
Gebaut und gemergt (alle fünf Repos, jeweils mit eigenem Stand-Kommentar oben):
iris-linux-servermain=541a46a(app/chat_share.py, vote-Route, Löschen, Umbenennen, Export nach Jobende, Import nach Abgleich, Migration)iris/Irismain=a6ca70b(ChatShareFiles,ChatShareManager,ChatShareConfirmation,requestVote, Rückfragen, blauer Punkt)iris/2ndbrain-iosmain=f58485a(Rückfragen, blauer Punkt,setVotemit 409)alf/2ndbrainmain=524a2cd(Abschnitt „Geteilte Chats“,obsidian-ragnimmt nurchat.mdauf)BENUTZERHANDBUCH.mdiniris/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.mdin 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:
tests/test_chat_share.py) und die bestehenden Vault-Sync-, Import-, Kategorien- und Job-Tests: 143 grün, 1 übersprungen.scripts/test-vault-sync-core.sh272 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/vargegen/var).Nicht geprüft (ehrlich):
ChatShareManager,requestVoteund 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.app.mainlässt sich lokal nicht importieren); getestet sind die Funktionen dahinter.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
xcodebuildim Terminal),deploy-iris-skills.shfür den RAG-Skill.Offen / bekannte Grenzen:
workingDirectory(Mac-Pfad) ins Manifest; ein anderer Rechner ignoriert es.status/zu-testen), bis du es im Alltag ausprobiert hast.PR #127 gemergt: fix(chats-teilen): chat_share.py und Tests fehlten im Repository (iris/Iris#240)
iris/iris-linux-server#127
Commits:
Nachtrag 2026-10-28: Linux-Server, fehlende Dateien
541a46awurde ohneship -aeingereicht:app/chat_share.pyundtests/test_chat_share.pyfehlten im Repository, obwohlmain.py,agent_jobs.pyundvault_git_sync.pysie importieren.mainwar damit unvollständig (lokal und per rsync lief alles, weil die Dateien auf der Platte lagen).git ls-filesenthält sie; die 13 Tests intests/test_chat_share.pyliefen vorher grün (Stand im Kommentar oben).PR #242 gemergt: chore(skills): obsidian-rag aus dem Quellbaum (nur chat.md geteilter Chats), Localizable nachgezogen (#240)
#242
Commits: