Phase 2a Multi-Workspace Sessions Fundament
Zusammenfassung
Dieses Dokument hält den Phase-2a-Foundation-Contract für Issue #6378 nach dem Phase-1-WorkspaceRegistry-PR fest. Der aktuelle Implementierungs-Batch kombiniert das Phase-1-Follow-up für wiederholte --workspace-Argumente, die Phase-2a-Prep-Guardrails und den ersten internen Registry/Runtime-Contract, der für die spätere Multi-Workspace-Session-Arbeit benötigt wird.
Phase 2a bleibt rein auf Sessions beschränkt. Es fügt in diesem Foundation-Batch keine Plural-Routes, keinen WorkspaceDaemonClient, kein Workspace-qualifiziertes ACP/WebSocket, keine File-, Memory-, MCP-, Settings-, Voice- oder Channel-Worker-Migration, keine Env-Overlays, keine Total-Session-Admission, keine workspaces[]-Capabilities, keine multi_workspace_sessions, kein Route-Dispatch und keine Non-Primary-Runtime-Konstruktion hinzu.
Foundation-Contract
--workspaceist auf der CLI-Parser-Ebene wiederholbar, sodass yargs die Array-Eingabe beibehält, anstatt sie zusammenzufassen.- Der Serve-Fast-Pfad fällt auf den vollständigen Parser zurück, wenn wiederholte Workspace-Werte vorhanden sind.
- Ein Workspace-Array mit einem einzigen Element wird als primärer Workspace behandelt und behält das bestehende Single-Workspace-Verhalten bei.
- Mehrere explizite Workspaces bleiben durch ein Gate geschützt und schlagen vor dem Runtime-Boot fehl.
- Doppelte kanonische Workspace-Inputs schlagen explizit fehl.
- Verschachtelte Workspace-Inputs schlagen explizit fehl.
- Unterschiedliche, nicht verschachtelte Multiple-Workspace-Inputs schlagen mit dem generischen Boot-Fehler “multi-workspace serve is not enabled” fehl.
- Der erste explizite Workspace ist der zukünftige primäre Workspace, sobald das Gate entfernt wird; dieser Foundation-Batch macht diese Liste nicht öffentlich zugänglich.
Der interne WorkspaceRuntime-Contract enthält jetzt stabile Metadaten für die spätere Phase-2a-Arbeit:
workspaceId: stabiler Hash des kanonischen Workspace-CWD.workspaceCwd: kanonisches Workspace-CWD.primary:truefür die primäre Runtime.trusted: Trust-Metadaten zur Boot-Zeit; der direktecreateServeApp-Fallback bleibtfalse, außer in der Production wird ein explizitertrusted-Wert übergeben.env: nur Metadaten. Dieser Foundation-Batch zeichnet den Parent-Process-Modus und leere Overlay-Keys auf; er berechnet keine Runtime-lokalen Env-Overlays.
Die interne WorkspaceRegistry unterstützt das exakte CWD-Lookup, das exakte ID-Lookup, den resolveWorkspaceCwd(undefined)-Primär-Fallback und die Live-Session-Owner-Auflösung. Die Live-Owner-Auflösung scannt nur die Runtime-Bridge-Zusammenfassungen; sie scannt keinen persistierten Speicher, erstellt keine Children und routet noch keine Requests. Doppelte Live-Owner schlagen fehl (fail closed) und liefern ein mehrdeutiges Ergebnis.
createServeApp kann für Tests und zukünftige Assembly eine injizierte Registry akzeptieren, aber Route-Module erhalten weiterhin nur die primäre Runtime. Die bestehenden Legacy-app.locals.boundWorkspace und app.locals.fsFactory bleiben reine Primary-Kompatibilitäts-Locals.
Phase-2a-Route-Klassifizierung
Der erste ungegate Phase-2a-Meilenstein muss alle /session/:id/*-Routen klassifizieren, bevor mehrere explizite Workspaces aktiviert werden.
Phase-2a-dispatchte Routen:
POST /sessionGET /session/:id/eventsPOST /session/:id/promptPOST /session/:id/cancelPOST /session/:id/permission/:requestIdPOST /session/:id/heartbeatPOST /session/:id/detachGET /session/:id/pending-promptsDELETE /session/:id/pending-prompts/:promptIdDELETE /session/:idGET /session/:id/status
Spätere oder Primary-only Routen:
- non-primary
POST /session/:id/load - non-primary
POST /session/:id/resume GET /session/:id/exportPOST /sessions/deletePOST /sessions/archivePOST /sessions/unarchivePATCH /session/:id/organization- session-group mutations
- branch, fork, cd, rewind, shell, model, and language session mutations
- non-session
POST /permission/:requestId /acp
Zusätzliche Live-Read-Routen dürfen erst in einem späteren Phase-2a-Slice owner-geroutet werden, nachdem Tests bewiesen haben, dass sie ausschließlich von der besitzenden Live-Bridge abhängen.
Spätere Phase-2a-Anforderungen
- Behalte Scan-Fehlschläge als
404 session_not_foundbei; falle niemals auf Primary zurück. - Schlage fehl (fail closed), wenn mehr als eine Runtime dieselbe Live-Session-ID meldet.
- Behalte die Non-Primary-Session-Auflistung als “live-only” bei, außer persistierte Einträge sind explizit als “non-resumable” markiert.
- Füge Runtime-lokale Env-Overlays vor dem Non-Primary-Child-Spawn hinzu.
- Füge
maxTotalSessionsan der Bridge-Fresh-Creation-Seam hinzu, damit REST und die primäre/acpsie nicht umgehen können, während Attach die Admission weiterhin umgeht. - Veröffentliche
workspaces[], Total-Limits undmulti_workspace_sessionserst im finalen UnGate-PR. - Aktualisiere die SDK-Capability-Types, wenn das additive Capabilities-Schema ausgeliefert wird, aber füge in Phase 2a keinen Workspace-Client hinzu.
Audit-Entscheidungen
- Der Foundation-PR darf keine Non-Primary-Runtimes erstellen oder REST-Routen auflockern.
- Die bestehenden
app.locals.boundWorkspaceundapp.locals.fsFactorybleiben reine Primary-Kompatibilitäts-Locals. - Die REST-
routeFileSystemFactorybleibt getrennt von den Bridge-Filesystem-Factories; sie darf nicht zur Darstellung von Non-Primary-Bridge-Grenzen verwendet werden. - Sekundäre Filesystem-Roots der IDE dürfen nicht zu expliziten Workspace-Runtimes hochgestuft werden.
- Das Single-Workspace-Parent-Env-Verhalten bleibt kompatibel, bis der echte Multi-Workspace-Modus ungegated ist.