You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Ein langer Lauf endet, und niemand bekommt es mit: smith schreibt die letzte Zeile in ein Terminal, das möglicherweise seit zehn Minuten nicht sichtbar war. In cmux gibt es dafür einen Benachrichtigungsweg — einen Unix-Socket, den das Terminal in jeden Prozess exportiert, den es startet.
Ist-Zustand
cmux legt in seiner Umgebung ab:
CMUX_SOCKET_PATH — der Socket des Daemons (lokal: ~/.local/state/cmux/cmux.sock)
CMUX_SURFACE_ID, CMUX_WORKSPACE_ID — der Kontext, der gerade läuft
CMUX — gesetzt, wenn smith innerhalb von cmux läuft
Am Socket antwortet cmux auf JSON-RPC; notification.create_for_caller nimmt title/subtitle/body und löst den Aufruferkontext selbst auf. notification.create_for_surface und create_for_target erwarten stattdessen eine explizite surface_id bzw. workspace_id. Zusätzlich gibt es ältere Verben (notify, set_status, set_progress, …), die nicht dieselbe Form haben: rohes notify liest title|subtitle|body an einem Strich getrennt und versteht --title=… nicht als Flag.
Getestet gegen einen echten Socket: Verbindung ohne Passwort möglich, Fehlerfall ist durchgehend Socket::ConnectError — fehlender Pfad, reguläre Datei statt Socket, Socket ohne Server dahinter.
In smith existiert davon nichts. Es gibt keine [notify]-Sektion, keinen Ort, an dem die beiden Quellen — config.toml und die CMUX_*-Umgebung — zusammengeführt werden, und keinen Aufruf an einem Laufende.
Spezifikation
Eine [notify]-Sektion in config.toml: enabled, socket_path, surface_id, workspace_id, timeout
Die CMUX_*-Umgebung gewinnt gegen die Config: sie beschreibt das Terminal, das gerade offen ist, und nicht eines, das jemand beim Schreiben der Config offen hatte
enabled = true allein reicht nicht — ohne Socket-Pfad gibt es nichts zu senden
Ein falsey-Wert ("", 0, false, no, off) gilt als abwesend, damit die nächsttiefere Ebene sprechen kann; CMUX_SOCKET_PATH vor CMUX_SOCKET vor CMUX, und CMUX wird nur als Pfad gelesen, wenn es wie einer aussieht
Smith::Notify kennt keine Umgebung, keinen Socket und kein Protokoll, und der Rest von smith kennt keinen dieser drei Namen außer Notify
Ein Lauf, der nicht innerhalb von cmux läuft, merkt keinen Unterschied: dieselbe Zeile Code, nur ohne Wirkung
Eine fehlgeschlagene Benachrichtigung beendet keinen Lauf. Sie wird verschluckt, und der Lauf endet so, wie er ohne sie geendet hätte
Ein Body, der leer oder nur Whitespace ist, wird nicht gesendet — er rendert als Lücke statt als nichts
Offene Punkte
Die erste Fassung baut die Auflösung und den Orchestrator und endet an der Grenze zum Socket: CmuxClient.client liefert in jedem Fall den Null-Client, auch bei vollständiger Config. Absicht, damit nichts behauptet, eine Benachrichtigung sei zugestellt worden, solange kein Draht da ist. Danach zu klären:
Protokoll: notification.create_for_caller (löst den Kontext selbst auf) gegen die älteren Verben
Framing: ein JSON-Objekt pro Zeile, Antwort lesen oder fire-and-forget, Deadline
Aufrufstellen: welches Ereignis eine Benachrichtigung wert ist — TurnCompleted, BudgetExceeded, ContextExhausted, ein Tool, das auf Freigabe wartet
ob surface_id/workspace_id mitgesendet werden sollen, wenn der Caller-Kontext ohnehin serverseitig aufgelöst wird
Ein langer Lauf endet, und niemand bekommt es mit: smith schreibt die letzte Zeile in ein Terminal, das möglicherweise seit zehn Minuten nicht sichtbar war. In cmux gibt es dafür einen Benachrichtigungsweg — einen Unix-Socket, den das Terminal in jeden Prozess exportiert, den es startet.
Ist-Zustand
cmux legt in seiner Umgebung ab:
CMUX_SOCKET_PATH— der Socket des Daemons (lokal:~/.local/state/cmux/cmux.sock)CMUX_SURFACE_ID,CMUX_WORKSPACE_ID— der Kontext, der gerade läuftCMUX— gesetzt, wenn smith innerhalb von cmux läuftAm Socket antwortet cmux auf JSON-RPC;
notification.create_for_callernimmttitle/subtitle/bodyund löst den Aufruferkontext selbst auf.notification.create_for_surfaceundcreate_for_targeterwarten stattdessen eine explizitesurface_idbzw.workspace_id. Zusätzlich gibt es ältere Verben (notify,set_status,set_progress, …), die nicht dieselbe Form haben: rohesnotifyliesttitle|subtitle|bodyan einem Strich getrennt und versteht--title=…nicht als Flag.Getestet gegen einen echten Socket: Verbindung ohne Passwort möglich, Fehlerfall ist durchgehend
Socket::ConnectError— fehlender Pfad, reguläre Datei statt Socket, Socket ohne Server dahinter.In smith existiert davon nichts. Es gibt keine
[notify]-Sektion, keinen Ort, an dem die beiden Quellen —config.tomlund dieCMUX_*-Umgebung — zusammengeführt werden, und keinen Aufruf an einem Laufende.Spezifikation
[notify]-Sektion inconfig.toml:enabled,socket_path,surface_id,workspace_id,timeoutCMUX_*-Umgebung gewinnt gegen die Config: sie beschreibt das Terminal, das gerade offen ist, und nicht eines, das jemand beim Schreiben der Config offen hatteenabled = trueallein reicht nicht — ohne Socket-Pfad gibt es nichts zu senden"",0,false,no,off) gilt als abwesend, damit die nächsttiefere Ebene sprechen kann;CMUX_SOCKET_PATHvorCMUX_SOCKETvorCMUX, undCMUXwird nur als Pfad gelesen, wenn es wie einer aussiehtSmith::Notifykennt keine Umgebung, keinen Socket und kein Protokoll, und der Rest von smith kennt keinen dieser drei Namen außerNotifyOffene Punkte
Die erste Fassung baut die Auflösung und den Orchestrator und endet an der Grenze zum Socket:
CmuxClient.clientliefert in jedem Fall den Null-Client, auch bei vollständiger Config. Absicht, damit nichts behauptet, eine Benachrichtigung sei zugestellt worden, solange kein Draht da ist. Danach zu klären:notification.create_for_caller(löst den Kontext selbst auf) gegen die älteren VerbenTurnCompleted,BudgetExceeded,ContextExhausted, ein Tool, das auf Freigabe wartetsurface_id/workspace_idmitgesendet werden sollen, wenn der Caller-Kontext ohnehin serverseitig aufgelöst wird