From a6c6a76d37c729e17cccf2dd20fe8e8177d98b14 Mon Sep 17 00:00:00 2001
From: Ysopwnable <161784452+N0zoM1z0@users.noreply.github.com>
Date: Fri, 16 Oct 2026 22:49:06 +0800
Subject: [PATCH] fix(cutter): cancel discovery probes and queued work
Propagate CLI/MCP cancellation through shared Cutter discovery, stop queued probes, and drain admitted workers. Deliver terminal bridge results only after socket closure. Preserve confirmed command Evidence and caller reasons when cancellation arrives during finalization.
Validated 66 focused tests, full CI static/docs gates, actual CLI SIGINT, compiled stdio cancellation/recovery, and official Linux Cutter 2.5.0 Qt5 CLI/MCP ELF workflows. Native UI cancellation and descriptor filesystem cancellation remain unverified.
Fixes #3946.
---
src/cli/cutterCommands.ts | 7 +-
src/cutter/CutterBridgeClient.ts | 57 +++++++---
src/cutter/CutterBridgeService.ts | 49 ++++++++-
src/server/registerCutterTools.ts | 31 +++---
tests/boundary/cli/cutterCommands.test.ts | 72 +++++++++++-
.../mcp/cutterCancellationMcp.test.ts | 102 +++++++++++++++++
.../providers/CutterBridgeClient.test.ts | 103 +++++++++++++++++-
.../providers/CutterBridgeService.test.ts | 38 +++++++
8 files changed, 421 insertions(+), 38 deletions(-)
diff --git a/src/cli/cutterCommands.ts b/src/cli/cutterCommands.ts
index d521d7c394..0b62412584 100644
--- a/src/cli/cutterCommands.ts
+++ b/src/cli/cutterCommands.ts
@@ -23,8 +23,11 @@ export const registerCutterCommands = (
"List live Cutter instances connected through the REA Python plugin bridge",
args: z.object({}),
run: () =>
- logCliCommand(logger, CLI_COMMANDS.listCutterSessions, () =>
- cutter.listSessions(),
+ withCommandCancellation((signal) =>
+ logCliCommand(logger, CLI_COMMANDS.listCutterSessions, async () => {
+ const result = await cutter.listSessions({ signal });
+ return result.ok ? result.value : projectAnalysisError(result.error);
+ }),
),
});
cli.command(CLI_COMMANDS.cutterCommand, {
diff --git a/src/cutter/CutterBridgeClient.ts b/src/cutter/CutterBridgeClient.ts
index e725a5b2ab..f5c98f3d03 100644
--- a/src/cutter/CutterBridgeClient.ts
+++ b/src/cutter/CutterBridgeClient.ts
@@ -167,22 +167,39 @@ class CutterBridgeResponseFrames {
const mapDiscovery = async (
inputs: readonly Input[],
operation: (input: Input) => Promise