F3 SLICE-5 review fixes: fence-aware replacement extraction + editSelection guards (#6)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+17
-2
@@ -86,7 +86,12 @@ export function activate(context: vscode.ExtensionContext): CowritingApi | undef
|
||||
context.subscriptions.push(
|
||||
vscode.commands.registerCommand("cowriting.editSelection", async () => {
|
||||
const editor = vscode.window.activeTextEditor;
|
||||
if (!editor || editor.selection.isEmpty || !editor.document.uri.fsPath.startsWith(root)) {
|
||||
if (
|
||||
!editor ||
|
||||
editor.selection.isEmpty ||
|
||||
editor.document.uri.scheme !== "file" ||
|
||||
!editor.document.uri.fsPath.startsWith(root)
|
||||
) {
|
||||
void vscode.window.showWarningMessage("Cowriting: select some text in a workspace document first.");
|
||||
return;
|
||||
}
|
||||
@@ -95,6 +100,10 @@ export function activate(context: vscode.ExtensionContext): CowritingApi | undef
|
||||
placeHolder: "e.g. tighten this paragraph",
|
||||
});
|
||||
if (!instruction) return;
|
||||
if (editor.selection.isEmpty) {
|
||||
void vscode.window.showWarningMessage("Cowriting: select some text in a workspace document first.");
|
||||
return;
|
||||
}
|
||||
const document = editor.document;
|
||||
const selection = editor.selection;
|
||||
const expectedVersion = document.version;
|
||||
@@ -106,6 +115,12 @@ export function activate(context: vscode.ExtensionContext): CowritingApi | undef
|
||||
async () => {
|
||||
const { runEditTurn } = await import("./liveTurn");
|
||||
const turn = await runEditTurn(instruction, selectedText);
|
||||
if (turn.replacement === "") {
|
||||
void vscode.window.showWarningMessage(
|
||||
"Cowriting: Claude returned an empty replacement — nothing was applied.",
|
||||
);
|
||||
return;
|
||||
}
|
||||
const ok = await attributionController.applyAgentEdit(
|
||||
document,
|
||||
new vscode.Range(selection.start, selection.end),
|
||||
@@ -119,7 +134,7 @@ export function activate(context: vscode.ExtensionContext): CowritingApi | undef
|
||||
);
|
||||
if (!ok) {
|
||||
void vscode.window.showWarningMessage(
|
||||
"Cowriting: the document changed while Claude was editing — nothing was applied.",
|
||||
"Cowriting: the edit could not be applied (the document changed during the turn, or the editor rejected the edit) — nothing was changed.",
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
+10
-3
@@ -24,8 +24,15 @@ const SYSTEM_PROMPT = [
|
||||
"unless the instruction says otherwise.",
|
||||
].join(" ");
|
||||
|
||||
/** Strip a wrapping markdown code fence if the model added one anyway. */
|
||||
export function extractReplacement(outputText: string): string {
|
||||
/**
|
||||
* Strip a wrapping markdown code fence if the model added one anyway.
|
||||
* If `selectedText` itself was fence-wrapped (i.e. the user's selection was a
|
||||
* fenced block), the model mirroring that format is correct — return
|
||||
* `outputText` unchanged so the fence is preserved.
|
||||
*/
|
||||
export function extractReplacement(outputText: string, selectedText: string): string {
|
||||
const fencePattern = /^\s*```[^\n]*\n[\s\S]*?\n?```\s*$/;
|
||||
if (fencePattern.test(selectedText)) return outputText;
|
||||
const m = outputText.match(/^\s*```[^\n]*\n([\s\S]*?)\n?```\s*$/);
|
||||
return m ? m[1] : outputText;
|
||||
}
|
||||
@@ -53,5 +60,5 @@ export async function runEditTurn(
|
||||
"(is Claude Code installed and signed in?)",
|
||||
);
|
||||
}
|
||||
return { replacement: extractReplacement(result.outputText), model: modelId, sessionId: result.runId };
|
||||
return { replacement: extractReplacement(result.outputText, selectedText), model: modelId, sessionId: result.runId };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user