feat: CoeditingRegistry opt-in gate (INV-10, spec §6.4) — enter/stop commands + context keys

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
BenStullsBets
2026-07-02 06:40:15 -07:00
parent ef61b141b6
commit 2597cba229
5 changed files with 189 additions and 0 deletions
+29
View File
@@ -14,6 +14,7 @@ import { TrackChangesPreviewController } from "./trackChangesPreview";
import { LiveProgressUi } from "./liveProgressUi";
import { EditorProposalController } from "./editorProposalController";
import { isAuthorable, routeEdit, selectionRejection } from "./workspacePath";
import { CoeditingRegistry } from "./coeditingRegistry";
const CHANNEL_NAME = "Cowriting (Cline SDK)";
@@ -27,6 +28,7 @@ export interface CowritingApi {
sidecarRouter: SidecarRouter;
liveProgressUi: LiveProgressUi;
editorProposalController: EditorProposalController;
coeditingRegistry: CoeditingRegistry;
}
export function activate(context: vscode.ExtensionContext): CowritingApi | undefined {
@@ -59,6 +61,32 @@ export function activate(context: vscode.ExtensionContext): CowritingApi | undef
}),
);
// --- PUC-7 (native-surfaces migration): the INV-10 opt-in gate ---
// Every later native surface (SCM/QuickDiff, comments, preview annotations,
// edit commands, decorations) checks isCoediting before attaching. Persisted
// in workspaceState so a reload restores the set.
const coeditingRegistry = new CoeditingRegistry(context.workspaceState);
context.subscriptions.push(coeditingRegistry);
context.subscriptions.push(
vscode.commands.registerCommand("cowriting.coeditDocument", () => {
const ed = vscode.window.activeTextEditor;
if (!ed || ed.document.languageId !== "markdown" || !isAuthorable(ed.document.uri.scheme)) {
void vscode.window.showWarningMessage("Cowriting: open a Markdown document to coedit it.");
return;
}
coeditingRegistry.enter(ed.document.uri);
coeditingRegistry.syncContext(ed);
}),
vscode.commands.registerCommand("cowriting.stopCoediting", () => {
const ed = vscode.window.activeTextEditor;
if (!ed) return;
coeditingRegistry.exit(ed.document.uri);
coeditingRegistry.syncContext(ed);
}),
vscode.window.onDidChangeActiveTextEditor((ed) => coeditingRegistry.syncContext(ed)),
);
coeditingRegistry.syncContext(vscode.window.activeTextEditor);
// --- F6: baseline data layer (Features #17 + #19) — workspace-INDEPENDENT ---
// The two-pane vscode.diff VIEW was removed in #34 (F10's rendered preview is
// the single review surface); only the baseline store survives, consumed by
@@ -362,6 +390,7 @@ export function activate(context: vscode.ExtensionContext): CowritingApi | undef
sidecarRouter,
liveProgressUi,
editorProposalController,
coeditingRegistry,
};
}