@code-yeongyu/senpi 2026.8.21 → 2026.8.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/dist/core/auth-storage.d.ts.map +1 -1
  3. package/dist/core/auth-storage.js +5 -4
  4. package/dist/core/auth-storage.js.map +1 -1
  5. package/dist/core/extensions/builtin/permission-system/index.d.ts.map +1 -1
  6. package/dist/core/extensions/builtin/permission-system/index.js +7 -11
  7. package/dist/core/extensions/builtin/permission-system/index.js.map +1 -1
  8. package/dist/modes/interactive/interactive-mode.d.ts +2 -1
  9. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  10. package/dist/modes/interactive/interactive-mode.js +79 -31
  11. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  12. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +40 -0
  13. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  14. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/session-manager.ts +8 -3
  15. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +15 -1
  16. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  17. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/stream-retry.d.ts +21 -0
  18. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/stream-retry.d.ts.map +1 -0
  19. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/stream-retry.js +36 -0
  20. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/stream-retry.js.map +1 -0
  21. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/types.d.ts +10 -0
  22. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/types.d.ts.map +1 -1
  23. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/types.js.map +1 -1
  24. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts +6 -0
  25. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts.map +1 -1
  26. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js +166 -26
  27. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
  28. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  29. package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
  30. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
  31. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
  32. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  33. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  34. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  35. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  36. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  37. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  38. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  39. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  40. package/package.json +7 -7
  41. package/dist/modes/interactive/split-trailing-assistant-text.d.ts +0 -7
  42. package/dist/modes/interactive/split-trailing-assistant-text.d.ts.map +0 -1
  43. package/dist/modes/interactive/split-trailing-assistant-text.js +0 -19
  44. package/dist/modes/interactive/split-trailing-assistant-text.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"cursor-agent.js","sourceRoot":"","sources":["../../src/api/cursor-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cursor agent protocol (`agent.v1.AgentService/Run`) over HTTP/2 Connect.\n *\n * Ported from upstream oh-my-pi's Cursor provider and adapted to senpi's\n * provider-neutral API architecture. The protocol is server-driven: the\n * client opens one `Run` stream per assistant turn, the server streams\n * interaction updates (text/thinking/tool-call deltas) and, mid-turn, sends\n * `ExecServerMessage` frames asking the CLIENT to execute a tool and blocks\n * until the answer arrives on the same stream. Tool execution is therefore\n * bridged through injected {@link CursorExecHandlers}; each bridged call is\n * synthesized into the assistant message as an already-resolved `toolCall`\n * block (marked {@link kCursorExecResolved} so the agent loop never re-runs\n * it) and paired with a `ToolResultMessage` delivered via `onToolResult`.\n *\n * NOTE: This module is Node-only (node:http2) and must only be reached\n * through the lazy wrapper (`cursor-agent.lazy.ts`).\n */\n\nimport { createHash, randomUUID } from \"node:crypto\";\nimport * as http2 from \"node:http2\";\nimport { create, fromBinary, fromJson, type JsonValue as PbJsonValue, toBinary, toJson } from \"@bufbuild/protobuf\";\nimport { ValueSchema } from \"@bufbuild/protobuf/wkt\";\nimport { calculateCost } from \"../models.ts\";\nimport type {\n\tApi,\n\tAssistantMessage,\n\tContext,\n\tImageContent,\n\tMessage,\n\tModel,\n\tSimpleStreamOptions,\n\tStreamFunction,\n\tTextContent,\n\tThinkingContent,\n\tTool,\n\tToolCall,\n\tToolResultMessage,\n} from \"../types.ts\";\nimport {\n\ttype CursorExecResolvedCarrier,\n\tclearStreamingPartialJson,\n\tkCursorExecResolved,\n\tkStreamingBlockIndex,\n\tkStreamingBlockKind,\n\tkStreamingEnvelopeId,\n\tkStreamingLastParseLen,\n\tkStreamingPartialJson,\n} from \"../utils/block-symbols.ts\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.ts\";\nimport { providerHeadersToRecord } from \"../utils/headers.ts\";\nimport { parseJsonWithRepair, parseStreamingJson } from \"../utils/json-parse.ts\";\nimport { sanitizeSurrogates } from \"../utils/sanitize-unicode.ts\";\nimport { deterministicUuid } from \"./cursor-agent/deterministic-id.ts\";\nimport { armExecHeartbeat } from \"./cursor-agent/exec-lifecycle.ts\";\nimport {\n\tbuildMcpStateResult,\n\tbuildNeutralHookResult,\n\tbuildPiBashError,\n\tbuildPiBashResult,\n\tbuildPiEditError,\n\tbuildPiEditRejected,\n\tbuildPiEditResult,\n\tbuildPiFindError,\n\tbuildPiFindResult,\n\tbuildPiGrepError,\n\tbuildPiGrepResult,\n\tbuildPiLsError,\n\tbuildPiLsResult,\n\tbuildPiReadError,\n\tbuildPiReadResult,\n\tbuildPiWriteError,\n\tbuildPiWriteRejected,\n\tbuildPiWriteResult,\n} from \"./cursor-agent/exec-modern.ts\";\nimport {\n\tAgentClientMessageSchema,\n\tAgentConversationTurnStructureSchema,\n\tAgentRunRequestSchema,\n\ttype AgentServerMessage,\n\tAgentServerMessageSchema,\n\tAgentStoreConflictErrorSchema,\n\tAgentStoreConflictResultSchema,\n\tAssistantMessageSchema,\n\tBackgroundShellSpawnResultSchema,\n\tCanvasDiagnosticsErrorSchema,\n\tCanvasDiagnosticsResultSchema,\n\tClientHeartbeatSchema,\n\tComputerUseErrorSchema,\n\tComputerUseResultSchema,\n\tConversationActionSchema,\n\tConversationSearchErrorSchema,\n\tConversationSearchResultSchema,\n\ttype ConversationStateStructure,\n\tConversationStateStructureSchema,\n\ttype ConversationStep,\n\tConversationStepSchema,\n\tConversationTurnStructureSchema,\n\tDeleteErrorSchema,\n\tDeleteRejectedSchema,\n\tDeleteResultSchema,\n\tDeleteSuccessSchema,\n\tDiagnosticsErrorSchema,\n\tDiagnosticsRejectedSchema,\n\tDiagnosticsResultSchema,\n\tDiagnosticsSuccessSchema,\n\tExecClientControlMessageSchema,\n\tExecClientHeartbeatSchema,\n\ttype ExecClientMessage,\n\tExecClientMessageSchema,\n\tExecClientStreamCloseSchema,\n\tExecClientThrowSchema,\n\ttype ExecServerMessage,\n\tFetchErrorSchema,\n\tFetchResultSchema,\n\tForceBackgroundShellResultSchema,\n\tForceBackgroundShellStatus,\n\tForceBackgroundSubagentResultSchema,\n\tForceBackgroundSubagentStatus,\n\tGetBlobResultSchema,\n\tGetUsableModelsRequestSchema,\n\tGetUsableModelsResponseSchema,\n\tGrepContentMatchSchema,\n\tGrepContentResultSchema,\n\tGrepCountResultSchema,\n\tGrepErrorSchema,\n\ttype GrepFileCount,\n\tGrepFileCountSchema,\n\tGrepFileMatchSchema,\n\tGrepFilesResultSchema,\n\tGrepResultSchema,\n\tGrepSuccessSchema,\n\ttype GrepUnionResult,\n\tGrepUnionResultSchema,\n\tKvClientMessageSchema,\n\ttype KvServerMessage,\n\tListMcpResourcesExecResultSchema,\n\tListMcpResourcesSuccessSchema,\n\ttype LsDirectoryTreeNode,\n\ttype LsDirectoryTreeNode_File,\n\tLsDirectoryTreeNode_FileSchema,\n\tLsDirectoryTreeNodeSchema,\n\tLsErrorSchema,\n\tLsRejectedSchema,\n\tLsResultSchema,\n\tLsSuccessSchema,\n\tMcpAllowlistPrecheckResultSchema,\n\tMcpApprovedSchema,\n\tMcpArgsSchema,\n\tMcpErrorSchema,\n\tMcpImageContentSchema,\n\tMcpRejectedSchema,\n\tMcpResultSchema,\n\tMcpSuccessSchema,\n\tMcpTextContentSchema,\n\tMcpToolCallSchema,\n\ttype McpToolDefinition,\n\tMcpToolDefinitionSchema,\n\tMcpToolErrorSchema,\n\tMcpToolNotFoundSchema,\n\tMcpToolResultContentItemSchema,\n\tMcpToolResultSchema,\n\tModelDetailsSchema,\n\tReadErrorSchema,\n\tReadMcpResourceExecResultSchema,\n\tReadMcpResourceNotFoundSchema,\n\tReadRejectedSchema,\n\tReadResultSchema,\n\tReadSuccessSchema,\n\tRecordScreenFailureSchema,\n\tRecordScreenResultSchema,\n\tRequestContextResultSchema,\n\tRequestContextSchema,\n\tRequestContextSuccessSchema,\n\tResumeActionSchema,\n\tSelectedContextSchema,\n\tSelectedImageSchema,\n\tSetBlobResultSchema,\n\tShellAllowlistPrecheckResultSchema,\n\ttype ShellArgs,\n\tShellFailureSchema,\n\tShellRejectedSchema,\n\ttype ShellResult,\n\tShellResultSchema,\n\ttype ShellStream,\n\tShellStreamExitSchema,\n\tShellStreamSchema,\n\tShellStreamStartSchema,\n\tShellStreamStderrSchema,\n\tShellStreamStdoutSchema,\n\tShellSuccessSchema,\n\tSmartModeClassifierErrorSchema,\n\tSmartModeClassifierResultSchema,\n\tSubagentAwaitNotFoundSchema,\n\tSubagentAwaitResultSchema,\n\tSubagentErrorSchema,\n\tSubagentResultSchema,\n\tToolCallSchema,\n\ttype TurnEndedUpdate,\n\tUserMessageActionSchema,\n\tUserMessageSchema,\n\tWebFetchAllowlistPrecheckResultSchema,\n\tWriteErrorSchema,\n\tWriteRejectedSchema,\n\tWriteResultSchema,\n\tWriteShellStdinErrorSchema,\n\tWriteShellStdinResultSchema,\n\tWriteSuccessSchema,\n} from \"./cursor-agent/gen/agent_pb.ts\";\nimport {\n\tcomposeShellCommand,\n\tomitUndefinedArgs,\n\tpiLimit,\n\tpiLsPath,\n\tpiReadArgs,\n\tpiTimeout,\n} from \"./cursor-agent/pi-args.ts\";\nimport { buildRequestedModel } from \"./cursor-agent/reasoning-params.ts\";\nimport type {\n\tCursorAgentOptions,\n\tCursorExecHandlerResult,\n\tCursorExecHandlers,\n\tCursorExecPairing,\n\tCursorMcpCall,\n\tCursorShellStreamCallbacks,\n\tCursorToolResultHandler,\n} from \"./cursor-agent/types.ts\";\nimport {\n\tCURSOR_CONVERSATION_POISONED_MESSAGE,\n\tcreateConversationRotationStore,\n\tisZeroTokenResourceExhausted,\n\tresolveConversationRotationPersistPath,\n} from \"./cursor-conversation-rotation.ts\";\nimport { keepUsableCursorTaskArgs } from \"./cursor-task-args.ts\";\n\nexport type {\n\tCursorAgentOptions,\n\tCursorExecHandlerResult,\n\tCursorExecHandlers,\n\tCursorExecPairing,\n\tCursorMcpCall,\n\tCursorPiCall,\n\tCursorShellStreamCallbacks,\n\tCursorToolResultHandler,\n} from \"./cursor-agent/types.ts\";\n\nexport const CURSOR_API_URL = \"https://api2.cursor.sh\";\nexport const CURSOR_CLIENT_VERSION = \"cli-2026.07.23-e383d2b\";\nconst EXEC_HEARTBEAT_INTERVAL_MS = 3000;\n\n/**\n * HTTP/1 connection-specific headers that HTTP/2 forbids. Node's\n * `http2.request()` throws on these rather than dropping them.\n */\nconst HTTP2_FORBIDDEN_HEADERS = new Set([\n\t\"connection\",\n\t\"keep-alive\",\n\t\"proxy-connection\",\n\t\"transfer-encoding\",\n\t\"upgrade\",\n\t\"http2-settings\",\n]);\n\n/**\n * Header names the Cursor request sets for itself. A caller copy in ANY\n * casing has to go: the spread below adds the fixed lower-case name\n * regardless, and two spellings of one field are a duplicate (node throws\n * `ERR_HTTP2_HEADER_SINGLE_VALUE`) rather than an override.\n */\nconst CURSOR_RESERVED_HEADERS = new Set([\n\t\"content-type\",\n\t\"connect-protocol-version\",\n\t\"te\",\n\t\"authorization\",\n\t\"x-ghost-mode\",\n\t\"x-cursor-client-version\",\n\t\"x-cursor-client-type\",\n\t\"x-request-id\",\n\t// Transport-owned: a plain `host` header suppresses the `:authority` node\n\t// derives from the URL, silently retargeting the request.\n\t\"host\",\n\t// The Connect body is streamed after the headers (initial frame,\n\t// heartbeats, tool responses), so no caller-supplied length can describe it.\n\t\"content-length\",\n]);\n\n/** Reduce caller-supplied headers to what this HTTP/2 request can legally carry. */\nexport function sanitizeCursorCallerHeaders(headers: Record<string, string> | undefined): Record<string, string> {\n\tconst sanitized: Record<string, string> = {};\n\tfor (const [name, value] of Object.entries(headers ?? {})) {\n\t\tconst field = name.toLowerCase();\n\t\tif (field.startsWith(\":\")) continue;\n\t\tif (HTTP2_FORBIDDEN_HEADERS.has(field)) continue;\n\t\tif (CURSOR_RESERVED_HEADERS.has(field)) continue;\n\t\tsanitized[field] = value;\n\t}\n\treturn sanitized;\n}\n\n/**\n * Text for a recognised frame this client answers with its own typed error\n * variant. Phrased as a client capability statement, not a tool failure: the\n * model reads it and should route around the capability, not retry the call.\n */\nconst NOT_IMPLEMENTED_SUFFIX = \"not implemented by this client\";\nconst NOT_IMPLEMENTED = \"Not implemented by this client\";\n/** Bare gRPC `resource_exhausted` end-streams (also inside a Connect error message). */\nconst conversationStateCache = new Map<string, ConversationStateStructure>();\nconst conversationBlobStores = new Map<string, Map<string, Uint8Array>>();\n/**\n * Base conversation id → rotated wire id. Cursor's backend can pin a\n * per-conversation rejection (bare `resource_exhausted`, zero tokens) to one\n * conversationId forever. On the first such failure the id is rotated once\n * and the cached state migrates, so the retry loop's next attempt starts a\n * fresh conversation. Keyed by the base id so a failed rotation never repeats.\n */\nlet conversationRotationStore = createConversationRotationStore({\n\tpersistPath: resolveConversationRotationPersistPath(),\n});\nlet conversationRotationPersistPath = resolveConversationRotationPersistPath();\nfunction rotationStore() {\n\tconst persistPath = resolveConversationRotationPersistPath();\n\tif (persistPath !== conversationRotationPersistPath) {\n\t\tconversationRotationPersistPath = persistPath;\n\t\tconversationRotationStore = createConversationRotationStore({ persistPath });\n\t}\n\treturn conversationRotationStore;\n}\n\nconst CONNECT_END_STREAM_FLAG = 0b00000010;\n\nfunction log(type: string, subtype?: string, data?: unknown): void {\n\tif (!process.env.DEBUG_CURSOR) return;\n\tconst verbose = process.env.DEBUG_CURSOR === \"2\" || process.env.DEBUG_CURSOR === \"verbose\";\n\tlet dataStr = \"\";\n\tif (verbose && data !== undefined) {\n\t\ttry {\n\t\t\tdataStr = ` ${JSON.stringify(data, (_key, value) => {\n\t\t\t\tif (value instanceof Uint8Array) return `bytes(${value.length})`;\n\t\t\t\tif (typeof value === \"bigint\") return value.toString();\n\t\t\t\treturn value;\n\t\t\t})?.slice(0, 500)}`;\n\t\t} catch {\n\t\t\tdataStr = \" [unserializable]\";\n\t\t}\n\t}\n\tconsole.error(`[CURSOR] ${type}${subtype ? `: ${subtype}` : \"\"}${dataStr}`);\n}\n\nexport function frameConnectMessage(data: Uint8Array, flags = 0): Buffer {\n\tconst frame = Buffer.alloc(5 + data.length);\n\tframe[0] = flags;\n\tframe.writeUInt32BE(data.length, 1);\n\tframe.set(data, 5);\n\treturn frame;\n}\n\nfunction parseConnectEndStream(data: Uint8Array): Error | null {\n\ttry {\n\t\tconst payload = JSON.parse(new TextDecoder().decode(data));\n\t\tconst error = payload?.error;\n\t\tif (error) {\n\t\t\tconst code = typeof error.code === \"string\" ? error.code : \"unknown\";\n\t\t\tconst message = typeof error.message === \"string\" ? error.message : \"Unknown error\";\n\t\t\treturn new Error(`Connect error ${code}: ${message}`);\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn new Error(\"Failed to parse Connect end stream\");\n\t}\n}\n\n/**\n * Maps an opaque HTTP/2 negotiation failure into an actionable error. The\n * Cursor run RPC is HTTP/2-only (the ALB rejects HTTP/1.1 with 464), so a\n * TLS-intercepting proxy that strips ALPN kills the run with no h1 fallback.\n */\nexport function mapH2TransportError(error: unknown, baseUrl: string): unknown {\n\tconst code = (error as { code?: unknown } | null)?.code;\n\tconst message = error instanceof Error ? error.message : String(error);\n\tif (code === \"ERR_HTTP2_ERROR\" && /h2 is not supported/i.test(message)) {\n\t\treturn new Error(\n\t\t\t`Cursor run transport could not negotiate HTTP/2 with ${baseUrl}: \"h2 is not supported\". ` +\n\t\t\t\t\"This host serves the run RPC over HTTP/2 only, and the TLS handshake did not negotiate \" +\n\t\t\t\t\"h2 via ALPN — typically an ALPN-stripping TLS-intercepting proxy. \" +\n\t\t\t\t\"Front the provider with a local HTTP/2 bridge and point the model's baseUrl at it.\",\n\t\t);\n\t}\n\treturn error;\n}\n\nexport const stream: StreamFunction<\"cursor-agent\", CursorAgentOptions> = (\n\tmodel: Model<\"cursor-agent\">,\n\tcontext: Context,\n\toptions?: CursorAgentOptions,\n): AssistantMessageEventStream => {\n\tconst stream = new AssistantMessageEventStream();\n\n\t(async () => {\n\t\tconst output: AssistantMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: [],\n\t\t\tapi: \"cursor-agent\" as Api,\n\t\t\tprovider: model.provider,\n\t\t\tmodel: model.id,\n\t\t\tusage: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 0,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t},\n\t\t\tstopReason: \"stop\",\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\t// Declared outside the `try` because BOTH exits must drain it: an exec\n\t\t// handler decoded from the last chunk can still be running when the\n\t\t// transport fails, and the error path finalizes the synthesized call\n\t\t// just like the success path does.\n\t\tconst inFlightDispatches = new Set<Promise<void>>();\n\t\t// A dispatch can spawn another, so re-check rather than awaiting one\n\t\t// snapshot. The wait is bounded by the abort signal: exec handlers have\n\t\t// no cancellation contract, so a hung tool must not hold the terminal\n\t\t// event hostage after the user already gave up on the turn.\n\t\tlet abortSettled: Promise<void> | undefined;\n\t\tconst drainInFlightDispatches = async (): Promise<void> => {\n\t\t\tconst signal = options?.signal;\n\t\t\twhile (inFlightDispatches.size > 0) {\n\t\t\t\tif (signal?.aborted) return;\n\t\t\t\tconst settled = Promise.all([...inFlightDispatches]);\n\t\t\t\tif (!signal) {\n\t\t\t\t\tawait settled;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tabortSettled ??= new Promise<void>((resolve) =>\n\t\t\t\t\tsignal.addEventListener(\"abort\", () => resolve(), { once: true }),\n\t\t\t\t);\n\t\t\t\tawait Promise.race([settled, abortSettled]);\n\t\t\t}\n\t\t};\n\n\t\tlet h2Client: http2.ClientHttp2Session | null = null;\n\t\tlet h2Request: http2.ClientHttp2Stream | null = null;\n\t\tlet heartbeatTimer: NodeJS.Timeout | null = null;\n\t\tlet h2Settled = false;\n\t\tlet sawTurnEnded = false;\n\t\tlet endStreamError: Error | null = null;\n\t\t// Reachable from the catch: a stream that dies mid-turn must still close\n\t\t// and pair the blocks it left open.\n\t\tlet openBlockState: BlockState | undefined;\n\t\tlet resolveH2: () => void = () => {};\n\t\tlet rejectH2: (error: unknown) => void = () => {};\n\t\tconst settleH2 = (error?: unknown): void => {\n\t\t\tif (h2Settled) return;\n\t\t\th2Settled = true;\n\t\t\tif (error !== undefined) {\n\t\t\t\trejectH2(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (endStreamError) {\n\t\t\t\trejectH2(endStreamError);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!sawTurnEnded) {\n\t\t\t\trejectH2(new Error(\"Cursor stream ended before turnEnded\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresolveH2();\n\t\t};\n\n\t\t// Hoisted out of the try block: the rotation in the catch path needs\n\t\t// both ids, and the catch block cannot see try-scoped consts.\n\t\tlet baseConversationId: string | undefined;\n\t\tlet conversationId: string | undefined;\n\t\tlet usageState: UsageState | undefined;\n\t\tlet retryPoisonedConversation = false;\n\t\tlet attempt = 0;\n\t\tdo {\n\t\t\tretryPoisonedConversation = false;\n\t\t\tattempt += 1;\n\t\t\th2Settled = false;\n\t\t\tsawTurnEnded = false;\n\t\t\tendStreamError = null;\n\t\t\topenBlockState = undefined;\n\t\t\tconst h2Completion = new Promise<void>((resolve, reject) => {\n\t\t\t\tresolveH2 = resolve;\n\t\t\t\trejectH2 = reject;\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tconst apiKey = options?.apiKey;\n\t\t\t\tif (!apiKey) {\n\t\t\t\t\tthrow new Error(\"Cursor access token is required; run /login cursor\");\n\t\t\t\t}\n\n\t\t\t\tbaseConversationId = options?.conversationId ?? options?.sessionId ?? randomUUID();\n\t\t\t\tconversationId = rotationStore().getWireId(baseConversationId);\n\t\t\t\tconst blobStore = conversationBlobStores.get(conversationId) ?? new Map<string, Uint8Array>();\n\t\t\t\tconversationBlobStores.set(conversationId, blobStore);\n\t\t\t\tconst cachedState = conversationStateCache.get(conversationId);\n\t\t\t\tconst { requestBytes, conversationState } = await buildGrpcRequest(model, context, options, {\n\t\t\t\t\tconversationId,\n\t\t\t\t\tblobStore,\n\t\t\t\t\tconversationState: cachedState,\n\t\t\t\t});\n\t\t\t\tconversationStateCache.set(conversationId, conversationState);\n\t\t\t\tconst requestContextTools = buildMcpToolDefinitions(context.tools);\n\n\t\t\t\tconst baseUrl = model.baseUrl || CURSOR_API_URL;\n\t\t\t\tconst requestPath = \"/agent.v1.AgentService/Run\";\n\t\t\t\t// Caller headers are additive, and are spread FIRST so the protocol\n\t\t\t\t// framing, auth, and request id below always win.\n\t\t\t\tconst callerHeaders = sanitizeCursorCallerHeaders(providerHeadersToRecord(options?.headers));\n\t\t\t\tconst requestHeaders = {\n\t\t\t\t\t...callerHeaders,\n\t\t\t\t\t\":method\": \"POST\",\n\t\t\t\t\t\":path\": requestPath,\n\t\t\t\t\t\"content-type\": \"application/connect+proto\",\n\t\t\t\t\t\"connect-protocol-version\": \"1\",\n\t\t\t\t\tte: \"trailers\",\n\t\t\t\t\tauthorization: `Bearer ${apiKey}`,\n\t\t\t\t\t\"x-ghost-mode\": \"true\",\n\t\t\t\t\t\"x-cursor-client-version\": CURSOR_CLIENT_VERSION,\n\t\t\t\t\t\"x-cursor-client-type\": \"cli\",\n\t\t\t\t\t\"x-request-id\": randomUUID(),\n\t\t\t\t};\n\n\t\t\t\th2Client = http2.connect(baseUrl);\n\t\t\t\th2Client.on(\"error\", (error) => settleH2(mapH2TransportError(error, baseUrl)));\n\n\t\t\t\th2Request = h2Client.request(requestHeaders);\n\n\t\t\t\tif (attempt === 1) {\n\t\t\t\t\tstream.push({ type: \"start\", partial: output });\n\t\t\t\t}\n\n\t\t\t\tlet pendingBuffer: Buffer = Buffer.alloc(0);\n\t\t\t\tlet currentTextBlock: (TextContent & { [kStreamingBlockIndex]: number }) | null = null;\n\t\t\t\tlet currentThinkingBlock: (ThinkingContent & { [kStreamingBlockIndex]: number }) | null = null;\n\t\t\t\tlet currentToolCall: ToolCallState | null = null;\n\t\t\t\tconst resolvedMcpToolCallIds = new Set<string>();\n\t\t\t\tusageState = { sawTokenDelta: false, sawTurnEndedUsage: false };\n\n\t\t\t\tconst state: BlockState = {\n\t\t\t\t\tget currentTextBlock() {\n\t\t\t\t\t\treturn currentTextBlock;\n\t\t\t\t\t},\n\t\t\t\t\tget currentThinkingBlock() {\n\t\t\t\t\t\treturn currentThinkingBlock;\n\t\t\t\t\t},\n\t\t\t\t\tget currentToolCall() {\n\t\t\t\t\t\treturn currentToolCall;\n\t\t\t\t\t},\n\t\t\t\t\topenToolCalls: new Map<string, ToolCallState>(),\n\t\t\t\t\tresolvedMcpToolCallIds,\n\t\t\t\t\tsetTextBlock: (b) => {\n\t\t\t\t\t\tcurrentTextBlock = b;\n\t\t\t\t\t},\n\t\t\t\t\tsetThinkingBlock: (b) => {\n\t\t\t\t\t\tcurrentThinkingBlock = b;\n\t\t\t\t\t},\n\t\t\t\t\tsetToolCall: (t) => {\n\t\t\t\t\t\tcurrentToolCall = t;\n\t\t\t\t\t},\n\t\t\t\t\tonToolResult: options?.onToolResult ?? options?.execHandlers?.onToolResult,\n\t\t\t\t};\n\t\t\t\topenBlockState = state;\n\n\t\t\t\tconst onConversationCheckpoint = (checkpoint: ConversationStateStructure) => {\n\t\t\t\t\tconversationStateCache.set(conversationId!, checkpoint);\n\t\t\t\t};\n\n\t\t\t\th2Request.on(\"data\", (chunk: Buffer) => {\n\t\t\t\t\t// Steady state drains fully per chunk; alias the fresh h2 chunk\n\t\t\t\t\t// instead of copying it through Buffer.concat.\n\t\t\t\t\tpendingBuffer = pendingBuffer.length === 0 ? chunk : Buffer.concat([pendingBuffer, chunk]);\n\n\t\t\t\t\twhile (pendingBuffer.length >= 5) {\n\t\t\t\t\t\tconst flags = pendingBuffer[0];\n\t\t\t\t\t\tconst msgLen = pendingBuffer.readUInt32BE(1);\n\t\t\t\t\t\tif (pendingBuffer.length < 5 + msgLen) break;\n\n\t\t\t\t\t\tconst messageBytes = pendingBuffer.subarray(5, 5 + msgLen);\n\t\t\t\t\t\tpendingBuffer = pendingBuffer.subarray(5 + msgLen);\n\n\t\t\t\t\t\tif (flags & CONNECT_END_STREAM_FLAG) {\n\t\t\t\t\t\t\tconst endError = parseConnectEndStream(messageBytes);\n\t\t\t\t\t\t\tif (endError) {\n\t\t\t\t\t\t\t\tendStreamError = endError;\n\t\t\t\t\t\t\t\th2Request?.close();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst serverMessage = fromBinary(AgentServerMessageSchema, messageBytes);\n\t\t\t\t\t\t\tconst isTurnEnded =\n\t\t\t\t\t\t\t\tserverMessage.message.case === \"interactionUpdate\" &&\n\t\t\t\t\t\t\t\tserverMessage.message.value.message?.case === \"turnEnded\";\n\t\t\t\t\t\t\t// Dispatch is fire-and-forget so the socket keeps draining\n\t\t\t\t\t\t\t// while a handler runs, but the promise is tracked: `done`\n\t\t\t\t\t\t\t// must not be pushed while an exec handler is still resolving,\n\t\t\t\t\t\t\t// or the buffered tool result is delivered after the turn\n\t\t\t\t\t\t\t// already finalized and the call is left unpaired.\n\t\t\t\t\t\t\tconst dispatch = handleServerMessage(\n\t\t\t\t\t\t\t\tserverMessage,\n\t\t\t\t\t\t\t\toutput,\n\t\t\t\t\t\t\t\tstream,\n\t\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\t\tblobStore,\n\t\t\t\t\t\t\t\th2Request!,\n\t\t\t\t\t\t\t\toptions?.execHandlers,\n\t\t\t\t\t\t\t\tstate.onToolResult,\n\t\t\t\t\t\t\t\tusageState!,\n\t\t\t\t\t\t\t\trequestContextTools,\n\t\t\t\t\t\t\t\tonConversationCheckpoint,\n\t\t\t\t\t\t\t).catch((error) => {\n\t\t\t\t\t\t\t\tlog(\"error\", \"handleServerMessage\", { error: String(error) });\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tinFlightDispatches.add(dispatch);\n\t\t\t\t\t\t\tvoid dispatch.finally(() => inFlightDispatches.delete(dispatch));\n\n\t\t\t\t\t\t\t// Application completion is not protocol success; wait for a\n\t\t\t\t\t\t\t// clean HTTP/2 end.\n\t\t\t\t\t\t\tif (isTurnEnded) {\n\t\t\t\t\t\t\t\tsawTurnEnded = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tlog(\"error\", \"parseServerMessage\", { error: String(e) });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tconst sendHeartbeat = () => {\n\t\t\t\t\tif (!h2Request || h2Request.closed) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst heartbeatMessage = create(AgentClientMessageSchema, {\n\t\t\t\t\t\tmessage: { case: \"clientHeartbeat\", value: create(ClientHeartbeatSchema, {}) },\n\t\t\t\t\t});\n\t\t\t\t\tconst heartbeatBytes = toBinary(AgentClientMessageSchema, heartbeatMessage);\n\t\t\t\t\th2Request.write(frameConnectMessage(heartbeatBytes));\n\t\t\t\t};\n\n\t\t\t\th2Request.on(\"trailers\", (trailers) => {\n\t\t\t\t\tconst status = trailers[\"grpc-status\"];\n\t\t\t\t\tconst msg = trailers[\"grpc-message\"];\n\t\t\t\t\tif (status && status !== \"0\" && !endStreamError) {\n\t\t\t\t\t\tendStreamError = new Error(`gRPC error ${status}: ${decodeURIComponent(String(msg || \"\"))}`);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\th2Request.on(\"end\", () => {\n\t\t\t\t\tsettleH2();\n\t\t\t\t});\n\n\t\t\t\th2Request.on(\"error\", (error) => {\n\t\t\t\t\tsettleH2(mapH2TransportError(error, baseUrl));\n\t\t\t\t});\n\n\t\t\t\tif (options?.signal) {\n\t\t\t\t\toptions.signal.addEventListener(\"abort\", () => {\n\t\t\t\t\t\th2Request?.close();\n\t\t\t\t\t\tsettleH2(new Error(\"Request was aborted\"));\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\th2Request.write(frameConnectMessage(requestBytes));\n\t\t\t\theartbeatTimer = setInterval(sendHeartbeat, 5000);\n\t\t\t\tawait h2Completion;\n\t\t\t\t// The transport is done, but a handler decoded from the last chunk\n\t\t\t\t// may still be running. Pushing `done` now would let the host drain\n\t\t\t\t// its buffered tool results before such a handler reserved its entry,\n\t\t\t\t// leaving the call unpaired and stripped from rebuilt transcripts.\n\t\t\t\tawait drainInFlightDispatches();\n\n\t\t\t\tendCurrentTextBlock(output, stream, state);\n\t\t\t\tendCurrentThinkingBlock(output, stream, state);\n\t\t\t\tflushOpenToolCalls(output, stream, state);\n\n\t\t\t\tcalculateCost(model, output.usage);\n\n\t\t\t\tstream.push({\n\t\t\t\t\ttype: \"done\",\n\t\t\t\t\treason: output.stopReason as \"stop\" | \"length\" | \"toolUse\",\n\t\t\t\t\tmessage: output,\n\t\t\t\t});\n\t\t\t\tstream.end();\n\t\t\t} catch (error) {\n\t\t\t\t// Same reason as the success path: a handler still running would land\n\t\t\t\t// its real result after the turn finalized and be discarded — even\n\t\t\t\t// though the tool may already have run side effects. On abort the\n\t\t\t\t// drain returns immediately.\n\t\t\t\tawait drainInFlightDispatches();\n\t\t\t\t// A stream that dies mid-turn leaves blocks open. Closing them here\n\t\t\t\t// settles their live cards and pairs the server-owned calls that\n\t\t\t\t// nothing else answers — an unpaired call is stripped from every\n\t\t\t\t// rebuilt transcript.\n\t\t\t\tif (openBlockState) {\n\t\t\t\t\tendCurrentTextBlock(output, stream, openBlockState);\n\t\t\t\t\tendCurrentThinkingBlock(output, stream, openBlockState);\n\t\t\t\t\tflushOpenToolCalls(output, stream, openBlockState);\n\t\t\t\t}\n\t\t\t\tlet message = error instanceof Error ? error.message : JSON.stringify(error);\n\t\t\t\t// A server-side per-conversation rejection surfaces as a bare\n\t\t\t\t// resource_exhausted with zero tokens. That has two distinct causes:\n\t\t\t\t// an oversized payload, and a genuinely poisoned conversationId.\n\t\t\t\t// Only the second is fixed by rotating the wire id.\n\t\t\t\t//\n\t\t\t\t// The FIRST 0-token RE for a base conversation always surfaces without\n\t\t\t\t// rotating, so the session layer gets first refusal: agent-session\n\t\t\t\t// classifies a surfaced 0-token RE as overflow and compacts before\n\t\t\t\t// retrying. Rotating here instead would swallow the error, make that\n\t\t\t\t// compaction dead code, and burn the 3-rotation budget replaying the\n\t\t\t\t// same oversized payload. Once that surface has happened (the flag is\n\t\t\t\t// persisted with the wire id), compaction has had its turn and further\n\t\t\t\t// 0-token REs rotate and retry in-call, up to the cap.\n\t\t\t\tif (\n\t\t\t\t\tconversationId !== undefined &&\n\t\t\t\t\tbaseConversationId !== undefined &&\n\t\t\t\t\tusageState !== undefined &&\n\t\t\t\t\tisZeroTokenResourceExhausted(message, usageState.sawTokenDelta)\n\t\t\t\t) {\n\t\t\t\t\tif (rotationStore().shouldSkip(baseConversationId)) {\n\t\t\t\t\t\t// The base conversation burned its rotation cap; another wire id\n\t\t\t\t\t\t// will not help, so surface the poisoned-conversation error and\n\t\t\t\t\t\t// let the session move to a different provider.\n\t\t\t\t\t\tmessage = CURSOR_CONVERSATION_POISONED_MESSAGE;\n\t\t\t\t\t} else if (rotationStore().shouldSurfaceBeforeRotating(baseConversationId)) {\n\t\t\t\t\t\t// First 0-token RE for this conversation: surface it so the\n\t\t\t\t\t\t// session layer can compact. If the payload really was oversized,\n\t\t\t\t\t\t// the compacted retry succeeds and no rotation is ever spent.\n\t\t\t\t\t\trotationStore().markSurfaced(baseConversationId, conversationId);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst decision = rotationStore().recordZeroTokenPoison(baseConversationId, conversationId);\n\t\t\t\t\t\tif (decision.kind === \"rotated\") {\n\t\t\t\t\t\t\tconst cached = conversationStateCache.get(conversationId);\n\t\t\t\t\t\t\tif (cached) conversationStateCache.set(decision.wireId, cached);\n\t\t\t\t\t\t\tconst blobs = conversationBlobStores.get(conversationId);\n\t\t\t\t\t\t\tif (blobs) conversationBlobStores.set(decision.wireId, blobs);\n\t\t\t\t\t\t\tretryPoisonedConversation = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmessage = CURSOR_CONVERSATION_POISONED_MESSAGE;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!retryPoisonedConversation) {\n\t\t\t\t\toutput.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n\t\t\t\t\toutput.errorMessage = message;\n\t\t\t\t\tstream.push({ type: \"error\", reason: output.stopReason, error: output });\n\t\t\t\t\tstream.end();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (heartbeatTimer) {\n\t\t\t\t\tclearInterval(heartbeatTimer);\n\t\t\t\t\theartbeatTimer = null;\n\t\t\t\t}\n\t\t\t\th2Request?.close();\n\t\t\t\th2Client?.close();\n\t\t\t\th2Request = null;\n\t\t\t\th2Client = null;\n\t\t\t}\n\t\t} while (retryPoisonedConversation);\n\t})();\n\n\treturn stream;\n};\n\n/**\n * `streamSimple` for Cursor: an explicit thinking selection (`options.thinkingSelection`)\n * is rendered into `RequestedModel.parameters`; reasoning output itself streams back as\n * `ThinkingContent` regardless of the selection.\n */\nexport const streamSimple: StreamFunction<\"cursor-agent\", SimpleStreamOptions> = (\n\tmodel: Model<\"cursor-agent\">,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): AssistantMessageEventStream => {\n\treturn stream(model, context, options as CursorAgentOptions);\n};\n\nexport type ToolCallState = ToolCall & {\n\t[kStreamingBlockIndex]: number;\n\t[kStreamingPartialJson]?: string;\n\t[kStreamingLastParseLen]?: number;\n\t[kStreamingBlockKind]: \"mcp\" | \"todo\" | \"cursor-exec\" | \"connect-scm\";\n\t[kStreamingEnvelopeId]?: string;\n\t[kCursorExecResolved]?: true;\n};\n\nexport interface BlockState {\n\tcurrentTextBlock: (TextContent & { [kStreamingBlockIndex]: number }) | null;\n\tcurrentThinkingBlock: (ThinkingContent & { [kStreamingBlockIndex]: number }) | null;\n\tcurrentToolCall: ToolCallState | null;\n\t/**\n\t * Open streamed tool-call blocks, keyed by the interaction envelope's\n\t * `call_id`. Cursor interleaves calls: two `toolCallStarted` frames can\n\t * arrive before either completes.\n\t */\n\topenToolCalls: Map<string, ToolCallState>;\n\t/** MCP call IDs synthesized from exec frames before their redundant streamed block arrives. */\n\tresolvedMcpToolCallIds: Set<string>;\n\tsetTextBlock: (b: (TextContent & { [kStreamingBlockIndex]: number }) | null) => void;\n\tsetThinkingBlock: (b: (ThinkingContent & { [kStreamingBlockIndex]: number }) | null) => void;\n\tsetToolCall: (t: ToolCallState | null) => void;\n\t/**\n\t * Persist a paired `toolResult` for a server-resolved call. Native todo\n\t * calls never travel the exec channel, so without this the resolved block\n\t * has no matching result and every transcript rebuild strips it as dangling.\n\t */\n\tonToolResult?: CursorToolResultHandler;\n}\n\nfunction markCursorExecResolved(block: CursorExecResolvedCarrier): void {\n\tblock[kCursorExecResolved] = true;\n}\n\nexport interface UsageState {\n\tsawTokenDelta: boolean;\n\tsawTurnEndedUsage: boolean;\n\t/** Last checkpoint `usedTokens`; conversation window, not billed cache. */\n\tliveUsedTokens?: number;\n}\n\n/** Exported for tests: drives one Cursor server message through the stream (exec waits mark the stream busy). */\nexport async function handleServerMessage(\n\tmsg: AgentServerMessage,\n\toutput: AssistantMessage,\n\tstream: AssistantMessageEventStream,\n\tstate: BlockState,\n\tblobStore: Map<string, Uint8Array>,\n\th2Request: http2.ClientHttp2Stream,\n\texecHandlers: CursorExecHandlers | undefined,\n\tonToolResult: CursorToolResultHandler | undefined,\n\tusageState: UsageState,\n\trequestContextTools: McpToolDefinition[],\n\tonConversationCheckpoint?: (checkpoint: ConversationStateStructure) => void,\n): Promise<void> {\n\tconst msgCase = msg.message.case;\n\n\tlog(\"serverMessage\", msgCase);\n\n\tif (msgCase === \"interactionUpdate\") {\n\t\tprocessInteractionUpdate(msg.message.value, output, stream, state, usageState);\n\t} else if (msgCase === \"kvServerMessage\") {\n\t\thandleKvServerMessage(msg.message.value as KvServerMessage, blobStore, h2Request);\n\t} else if (msgCase === \"execServerMessage\") {\n\t\t// The server is waiting on OUR local tool result during this window — no\n\t\t// AssistantMessageEvent flows until the handler finishes. Mark the wait\n\t\t// as local work so idle watchdogs attribute the silence to the tool run\n\t\t// instead of aborting a healthy stream.\n\t\tawait stream.trackLocalWork(\n\t\t\thandleExecServerMessage(\n\t\t\t\tmsg.message.value as ExecServerMessage,\n\t\t\t\th2Request,\n\t\t\t\texecHandlers,\n\t\t\t\tonToolResult,\n\t\t\t\trequestContextTools,\n\t\t\t\toutput,\n\t\t\t\tstream,\n\t\t\t\tstate,\n\t\t\t),\n\t\t);\n\t} else if (msgCase === \"conversationCheckpointUpdate\") {\n\t\tapplyCheckpointTokenDetails(msg.message.value, output, usageState);\n\t\tonConversationCheckpoint?.(msg.message.value);\n\t}\n}\n\nfunction handleKvServerMessage(\n\tkvMsg: KvServerMessage,\n\tblobStore: Map<string, Uint8Array>,\n\th2Request: http2.ClientHttp2Stream,\n): void {\n\tconst kvCase = kvMsg.message.case;\n\n\tif (kvCase === \"getBlobArgs\") {\n\t\tconst blobId = kvMsg.message.value.blobId;\n\t\tconst blobIdKey = Buffer.from(blobId).toString(\"hex\");\n\t\tconst blobData = blobStore.get(blobIdKey);\n\t\tconst response = create(KvClientMessageSchema, {\n\t\t\tid: kvMsg.id,\n\t\t\tmessage: {\n\t\t\t\tcase: \"getBlobResult\",\n\t\t\t\tvalue: create(GetBlobResultSchema, blobData ? { blobData } : {}),\n\t\t\t},\n\t\t});\n\t\tconst kvClientMessage = create(AgentClientMessageSchema, {\n\t\t\tmessage: { case: \"kvClientMessage\", value: response },\n\t\t});\n\t\th2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema, kvClientMessage)));\n\t\tlog(\"kvClient\", \"getBlobResult\", { blobId: blobIdKey.slice(0, 40) });\n\t} else if (kvCase === \"setBlobArgs\") {\n\t\tconst { blobId, blobData } = kvMsg.message.value;\n\t\tconst blobIdKey = Buffer.from(blobId).toString(\"hex\");\n\t\tblobStore.set(blobIdKey, blobData);\n\t\tconst response = create(KvClientMessageSchema, {\n\t\t\tid: kvMsg.id,\n\t\t\tmessage: {\n\t\t\t\tcase: \"setBlobResult\",\n\t\t\t\tvalue: create(SetBlobResultSchema, {}),\n\t\t\t},\n\t\t});\n\t\tconst kvClientMessage = create(AgentClientMessageSchema, {\n\t\t\tmessage: { case: \"kvClientMessage\", value: response },\n\t\t});\n\t\th2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema, kvClientMessage)));\n\t\tlog(\"kvClient\", \"setBlobResult\", { blobId: blobIdKey.slice(0, 40) });\n\t}\n}\n\nfunction sendShellStreamEvent(\n\th2Request: http2.ClientHttp2Stream,\n\texecMsg: ExecServerMessage,\n\tevent: ShellStream[\"event\"],\n): void {\n\tsendExecClientMessage(h2Request, execMsg, \"shellStream\", create(ShellStreamSchema, { event }));\n}\n\nfunction sanitizeShellExecResult(execResult: ShellResult): ShellResult {\n\tconst result = execResult.result;\n\tif (!result) return execResult;\n\n\tswitch (result.case) {\n\t\tcase \"success\":\n\t\tcase \"failure\": {\n\t\t\tconst value = result.value;\n\t\t\treturn {\n\t\t\t\t...execResult,\n\t\t\t\tresult: {\n\t\t\t\t\tcase: result.case,\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\t...value,\n\t\t\t\t\t\tstdout: value.stdout ? sanitizeSurrogates(value.stdout) : value.stdout,\n\t\t\t\t\t\tstderr: value.stderr ? sanitizeSurrogates(value.stderr) : value.stderr,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t} as ShellResult;\n\t\t}\n\t\tdefault:\n\t\t\treturn execResult;\n\t}\n}\n\nasync function handleShellStreamArgs(\n\targs: ShellArgs,\n\texecMsg: ExecServerMessage,\n\th2Request: http2.ClientHttp2Stream,\n\texecHandlers: CursorExecHandlers | undefined,\n\tonToolResult: CursorToolResultHandler | undefined,\n): Promise<void> {\n\tconst normalizedWorkingDirectory = args.workingDirectory || process.cwd();\n\tconst normalizedArgs: ShellArgs = { ...args, workingDirectory: normalizedWorkingDirectory };\n\n\tsendShellStreamEvent(h2Request, execMsg, { case: \"start\", value: create(ShellStreamStartSchema, {}) });\n\n\t// Buffer for incomplete ANSI sequences across chunks.\n\tlet stdoutBuffer = \"\";\n\tlet stderrBuffer = \"\";\n\n\tconst incompleteEscapeRegex = /\\x1b(|\\[|\\[\\d*|\\[\\?|\\[\\?\\d*|\\]\\d*;?)$/;\n\n\tconst flushStdout = () => {\n\t\tif (stdoutBuffer) {\n\t\t\tlet safeEnd = stdoutBuffer.length;\n\t\t\tconst match = stdoutBuffer.match(incompleteEscapeRegex);\n\t\t\tif (match && match[0].length > 0) {\n\t\t\t\tsafeEnd = stdoutBuffer.length - match[0].length;\n\t\t\t}\n\t\t\tconst toSend = stdoutBuffer.slice(0, safeEnd);\n\t\t\tconst remaining = stdoutBuffer.slice(safeEnd);\n\t\t\tif (toSend) {\n\t\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\t\tcase: \"stdout\",\n\t\t\t\t\tvalue: create(ShellStreamStdoutSchema, { data: sanitizeSurrogates(toSend) }),\n\t\t\t\t});\n\t\t\t}\n\t\t\tstdoutBuffer = remaining;\n\t\t}\n\t};\n\n\tconst flushStderr = () => {\n\t\tif (stderrBuffer) {\n\t\t\tlet safeEnd = stderrBuffer.length;\n\t\t\tconst match = stderrBuffer.match(incompleteEscapeRegex);\n\t\t\tif (match && match[0].length > 0) {\n\t\t\t\tsafeEnd = stderrBuffer.length - match[0].length;\n\t\t\t}\n\t\t\tconst toSend = stderrBuffer.slice(0, safeEnd);\n\t\t\tconst remaining = stderrBuffer.slice(safeEnd);\n\t\t\tif (toSend) {\n\t\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\t\tcase: \"stderr\",\n\t\t\t\t\tvalue: create(ShellStreamStderrSchema, { data: sanitizeSurrogates(toSend) }),\n\t\t\t\t});\n\t\t\t}\n\t\t\tstderrBuffer = remaining;\n\t\t}\n\t};\n\n\tlet stdoutFlushTimer: NodeJS.Timeout | null = null;\n\tlet stderrFlushTimer: NodeJS.Timeout | null = null;\n\n\tconst scheduleStdoutFlush = () => {\n\t\tif (!stdoutFlushTimer) {\n\t\t\tstdoutFlushTimer = setTimeout(() => {\n\t\t\t\tstdoutFlushTimer = null;\n\t\t\t\tflushStdout();\n\t\t\t}, 100);\n\t\t}\n\t};\n\n\tconst scheduleStderrFlush = () => {\n\t\tif (!stderrFlushTimer) {\n\t\t\tstderrFlushTimer = setTimeout(() => {\n\t\t\t\tstderrFlushTimer = null;\n\t\t\t\tflushStderr();\n\t\t\t}, 100);\n\t\t}\n\t};\n\n\tconst streamCallbacks: CursorShellStreamCallbacks = {\n\t\tonStdout(data: string) {\n\t\t\tstdoutBuffer += data;\n\t\t\tif (stdoutBuffer.includes(\"\\n\") || stdoutBuffer.length > 4096) {\n\t\t\t\tif (stdoutFlushTimer) {\n\t\t\t\t\tclearTimeout(stdoutFlushTimer);\n\t\t\t\t\tstdoutFlushTimer = null;\n\t\t\t\t}\n\t\t\t\tflushStdout();\n\t\t\t} else {\n\t\t\t\tscheduleStdoutFlush();\n\t\t\t}\n\t\t},\n\t\tonStderr(data: string) {\n\t\t\tstderrBuffer += data;\n\t\t\tif (stderrBuffer.includes(\"\\n\") || stderrBuffer.length > 4096) {\n\t\t\t\tif (stderrFlushTimer) {\n\t\t\t\t\tclearTimeout(stderrFlushTimer);\n\t\t\t\t\tstderrFlushTimer = null;\n\t\t\t\t}\n\t\t\t\tflushStderr();\n\t\t\t} else {\n\t\t\t\tscheduleStderrFlush();\n\t\t\t}\n\t\t},\n\t};\n\n\t// Prefer the streaming handler — it forwards output chunks in real time.\n\tconst streamHandler = execHandlers?.shellStream?.bind(execHandlers);\n\tconst batchHandler = execHandlers?.shell?.bind(execHandlers);\n\tconst handler = streamHandler ? (shellArgs: ShellArgs) => streamHandler(shellArgs, streamCallbacks) : batchHandler;\n\n\tconst { execResult } = await resolveExecHandler(\n\t\tnormalizedArgs,\n\t\thandler as typeof batchHandler,\n\t\tonToolResult,\n\t\t(toolResult) => buildShellResultFromToolResult(normalizedArgs, toolResult),\n\t\t(reason) => buildShellRejectedResult(normalizedArgs.command, normalizedArgs.workingDirectory, reason),\n\t\t(error) => buildShellFailureResult(normalizedArgs.command, normalizedArgs.workingDirectory, error),\n\t\t{ toolCallId: args.toolCallId, toolName: \"bash\" },\n\t);\n\n\t// When using the batch handler (no shellStream), send buffered stdout/stderr\n\t// after execution completes. With shellStream these were already sent live.\n\tconst sendBufferedOutput = !streamHandler;\n\tconst sanitizedExecResult = sanitizeShellExecResult(execResult);\n\n\tif (stdoutFlushTimer) clearTimeout(stdoutFlushTimer);\n\tif (stderrFlushTimer) clearTimeout(stderrFlushTimer);\n\tflushStdout();\n\tflushStderr();\n\n\tsendShellStreamExitFromResult(h2Request, execMsg, sanitizedExecResult, sendBufferedOutput);\n\t// Cursor can keep the turn pending when it receives only stream deltas.\n\t// Send the final structured shellResult as completion acknowledgement.\n\tsendExecClientMessage(h2Request, execMsg, \"shellResult\", sanitizedExecResult);\n}\n\nfunction sendShellStreamExitFromResult(\n\th2Request: http2.ClientHttp2Stream,\n\texecMsg: ExecServerMessage,\n\texecResult: ShellResult,\n\tsendBufferedOutput: boolean,\n): void {\n\tconst result = execResult.result;\n\tswitch (result.case) {\n\t\tcase \"success\": {\n\t\t\tconst value = result.value;\n\t\t\tif (sendBufferedOutput) {\n\t\t\t\tif (value.stdout) {\n\t\t\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\t\t\tcase: \"stdout\",\n\t\t\t\t\t\tvalue: create(ShellStreamStdoutSchema, { data: sanitizeSurrogates(value.stdout) }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (value.stderr) {\n\t\t\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\t\t\tcase: \"stderr\",\n\t\t\t\t\t\tvalue: create(ShellStreamStderrSchema, { data: sanitizeSurrogates(value.stderr) }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\tcase: \"exit\",\n\t\t\t\tvalue: create(ShellStreamExitSchema, {\n\t\t\t\t\tcode: value.exitCode,\n\t\t\t\t\tcwd: value.workingDirectory,\n\t\t\t\t\taborted: false,\n\t\t\t\t}),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tcase \"failure\": {\n\t\t\tconst value = result.value;\n\t\t\tif (sendBufferedOutput) {\n\t\t\t\tif (value.stdout) {\n\t\t\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\t\t\tcase: \"stdout\",\n\t\t\t\t\t\tvalue: create(ShellStreamStdoutSchema, { data: sanitizeSurrogates(value.stdout) }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (value.stderr) {\n\t\t\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\t\t\tcase: \"stderr\",\n\t\t\t\t\t\tvalue: create(ShellStreamStderrSchema, { data: sanitizeSurrogates(value.stderr) }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\tcase: \"exit\",\n\t\t\t\tvalue: create(ShellStreamExitSchema, {\n\t\t\t\t\tcode: value.exitCode,\n\t\t\t\t\tcwd: value.workingDirectory,\n\t\t\t\t\taborted: value.aborted,\n\t\t\t\t\tabortReason: value.abortReason,\n\t\t\t\t}),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tcase \"rejected\": {\n\t\t\tsendShellStreamEvent(h2Request, execMsg, { case: \"rejected\", value: result.value });\n\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\tcase: \"exit\",\n\t\t\t\tvalue: create(ShellStreamExitSchema, {\n\t\t\t\t\tcode: 1,\n\t\t\t\t\tcwd: result.value.workingDirectory,\n\t\t\t\t\taborted: false,\n\t\t\t\t}),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tcase \"timeout\": {\n\t\t\tconst value = result.value;\n\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\tcase: \"stderr\",\n\t\t\t\tvalue: create(ShellStreamStderrSchema, {\n\t\t\t\t\tdata: `Command timed out after ${value.timeoutMs}ms`,\n\t\t\t\t}),\n\t\t\t});\n\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\tcase: \"exit\",\n\t\t\t\tvalue: create(ShellStreamExitSchema, {\n\t\t\t\t\tcode: 1,\n\t\t\t\t\tcwd: value.workingDirectory,\n\t\t\t\t\taborted: true,\n\t\t\t\t}),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tcase \"permissionDenied\": {\n\t\t\tsendShellStreamEvent(h2Request, execMsg, { case: \"permissionDenied\", value: result.value });\n\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\tcase: \"exit\",\n\t\t\t\tvalue: create(ShellStreamExitSchema, {\n\t\t\t\t\tcode: 1,\n\t\t\t\t\tcwd: result.value.workingDirectory,\n\t\t\t\t\taborted: false,\n\t\t\t\t}),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tdefault:\n\t\t\treturn;\n\t}\n}\n\ntype ExecDispatchContext = {\n\treadonly execMsg: ExecServerMessage;\n\treadonly h2Request: http2.ClientHttp2Stream;\n\treadonly execHandlers: CursorExecHandlers | undefined;\n\treadonly onToolResult: CursorToolResultHandler | undefined;\n\treadonly requestContextTools: McpToolDefinition[];\n\treadonly output: AssistantMessage;\n\treadonly stream: AssistantMessageEventStream;\n\treadonly state: BlockState;\n};\n\nasync function handleExecServerMessage(\n\texecMsg: ExecServerMessage,\n\th2Request: http2.ClientHttp2Stream,\n\texecHandlers: CursorExecHandlers | undefined,\n\tonToolResult: CursorToolResultHandler | undefined,\n\trequestContextTools: McpToolDefinition[],\n\toutput: AssistantMessage,\n\tstream: AssistantMessageEventStream,\n\tstate: BlockState,\n): Promise<void> {\n\tconst execCase = execMsg.message.case;\n\tlog(\"exec\", \"dispatch\", { execCase, execId: execMsg.execId, hasHandlers: !!execHandlers });\n\tif (!execCase) {\n\t\t// A frame carrying a oneof number this build's `agent.proto` does not\n\t\t// model at all. Returning silently strands the exec id — the server\n\t\t// waits on a reply that never comes.\n\t\tlog(\"warn\", \"unknownExecVariant\", { id: execMsg.id, execId: execMsg.execId });\n\t\tsendExecClientThrow(h2Request, execMsg, \"Unknown exec message variant\", \"unknown_exec_variant\");\n\t\tsendExecClientStreamClose(h2Request, execMsg);\n\t\treturn;\n\t}\n\n\tconst stopExecHeartbeat = armCursorExecHeartbeat(h2Request, execMsg);\n\ttry {\n\t\tawait dispatchExecServerMessage({\n\t\t\texecMsg,\n\t\t\th2Request,\n\t\t\texecHandlers,\n\t\t\tonToolResult,\n\t\t\trequestContextTools,\n\t\t\toutput,\n\t\t\tstream,\n\t\t\tstate,\n\t\t});\n\t} catch (error) {\n\t\tlog(\"error\", \"execDispatch\", {\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\tid: execMsg.id,\n\t\t\texecId: execMsg.execId,\n\t\t});\n\t\tsendExecClientThrow(h2Request, execMsg, \"Local exec dispatch failed\", \"exec_dispatch_failed\");\n\t} finally {\n\t\tstopExecHeartbeat();\n\t\tsendExecClientStreamClose(h2Request, execMsg);\n\t}\n}\n\nasync function dispatchExecServerMessage(context: ExecDispatchContext): Promise<void> {\n\tconst { execMsg, h2Request, execHandlers, onToolResult, requestContextTools, output, stream, state } = context;\n\tconst execCase = execMsg.message.case;\n\tif (!execCase) throw new Error(\"Expected a recognized exec message\");\n\tif (execCase === \"requestContextArgs\") {\n\t\tconst requestContext = create(RequestContextSchema, {\n\t\t\trules: [],\n\t\t\trepositoryInfo: [],\n\t\t\ttools: requestContextTools,\n\t\t\tgitRepos: [],\n\t\t\tprojectLayouts: [],\n\t\t\tmcpInstructions: [],\n\t\t\tfileContents: {},\n\t\t\tcustomSubagents: [],\n\t\t});\n\n\t\tconst requestContextResult = create(RequestContextResultSchema, {\n\t\t\tresult: {\n\t\t\t\tcase: \"success\",\n\t\t\t\tvalue: create(RequestContextSuccessSchema, { requestContext }),\n\t\t\t},\n\t\t});\n\n\t\tsendExecClientMessage(h2Request, execMsg, \"requestContextResult\", requestContextResult);\n\t\treturn;\n\t}\n\n\tswitch (execCase) {\n\t\tcase \"readArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tif (!args.toolCallId) args.toolCallId = randomUUID();\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, args.toolCallId, \"read\", {\n\t\t\t\tpath: args.path,\n\t\t\t\toffset: args.offset,\n\t\t\t\tlimit: args.limit,\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\targs,\n\t\t\t\texecHandlers?.read?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\t(toolResult) =>\n\t\t\t\t\tbuildReadResultFromToolResult(\n\t\t\t\t\t\targs.path,\n\t\t\t\t\t\ttoolResult,\n\t\t\t\t\t\targs.offset !== undefined || args.limit !== undefined,\n\t\t\t\t\t),\n\t\t\t\t(reason) => buildReadRejectedResult(args.path, reason),\n\t\t\t\t(error) => buildReadErrorResult(args.path, error),\n\t\t\t\t{ toolCallId: args.toolCallId, toolName: \"read\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"readResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"lsArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tif (!args.toolCallId) args.toolCallId = randomUUID();\n\t\t\t// The bridge maps `ls` onto the local `ls` tool; mirror that here so\n\t\t\t// the synthesized block matches the toolResult's `toolName`.\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, args.toolCallId, \"ls\", { path: piLsPath(args.path) });\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\targs,\n\t\t\t\texecHandlers?.ls?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\t(toolResult) => buildLsResultFromToolResult(args.path, toolResult),\n\t\t\t\t(reason) => buildLsRejectedResult(args.path, reason),\n\t\t\t\t(error) => buildLsErrorResult(args.path, error),\n\t\t\t\t{ toolCallId: args.toolCallId, toolName: \"ls\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"lsResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"grepArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tif (!args.toolCallId) args.toolCallId = randomUUID();\n\t\t\t// Cursor's model sometimes emits `grepArgs` with an empty `pattern`\n\t\t\t// and a non-empty `glob`, expecting grep to list files matching the\n\t\t\t// glob. Reject that up front with an actionable error.\n\t\t\tconst emptyPatternError = emptyGrepPatternRejection(args.pattern, args.glob);\n\t\t\tif (emptyPatternError !== null) {\n\t\t\t\tsendExecClientMessage(h2Request, execMsg, \"grepResult\", buildGrepErrorResult(emptyPatternError));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Mirror the coding-agent bridge's arg mapping so live UI (from\n\t\t\t// `tool_execution_start`) and rebuilt transcript display identical args.\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, args.toolCallId, \"grep\", {\n\t\t\t\tpattern: args.pattern,\n\t\t\t\tpath: args.path || undefined,\n\t\t\t\tglob: args.glob || undefined,\n\t\t\t\tignoreCase: args.caseInsensitive === true ? true : undefined,\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\targs,\n\t\t\t\texecHandlers?.grep?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\t(toolResult) => buildGrepResultFromToolResult(args, toolResult),\n\t\t\t\t(reason) => buildGrepErrorResult(reason),\n\t\t\t\t(error) => buildGrepErrorResult(error),\n\t\t\t\t{ toolCallId: args.toolCallId, toolName: \"grep\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"grepResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"writeArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tif (!args.toolCallId) args.toolCallId = randomUUID();\n\t\t\t// Match the bridge: prefer `fileText`, fall back to decoded `fileBytes`.\n\t\t\tconst content = args.fileText ?? new TextDecoder().decode(args.fileBytes ?? new Uint8Array());\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, args.toolCallId, \"write\", {\n\t\t\t\tpath: args.path,\n\t\t\t\tcontent,\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\targs,\n\t\t\t\texecHandlers?.write?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\t(toolResult) =>\n\t\t\t\t\tbuildWriteResultFromToolResult(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: args.path,\n\t\t\t\t\t\t\tfileText: args.fileText,\n\t\t\t\t\t\t\tfileBytes: args.fileBytes,\n\t\t\t\t\t\t\treturnFileContentAfterWrite: args.returnFileContentAfterWrite,\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttoolResult,\n\t\t\t\t\t),\n\t\t\t\t(reason) => buildWriteRejectedResult(args.path, reason),\n\t\t\t\t(error) => buildWriteErrorResult(args.path, error),\n\t\t\t\t{ toolCallId: args.toolCallId, toolName: \"write\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"writeResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"deleteArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tif (!args.toolCallId) args.toolCallId = randomUUID();\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, args.toolCallId, \"delete\", { path: args.path });\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\targs,\n\t\t\t\texecHandlers?.delete?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\t(toolResult) => buildDeleteResultFromToolResult(args.path, toolResult),\n\t\t\t\t(reason) => buildDeleteRejectedResult(args.path, reason),\n\t\t\t\t(error) => buildDeleteErrorResult(args.path, error),\n\t\t\t\t{ toolCallId: args.toolCallId, toolName: \"delete\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"deleteResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"shellArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tif (!args.toolCallId) args.toolCallId = randomUUID();\n\t\t\tconst normalizedArgs: ShellArgs = { ...args, workingDirectory: args.workingDirectory || process.cwd() };\n\t\t\tconst shellTimeout = args.timeout && args.timeout > 0 ? args.timeout : undefined;\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, args.toolCallId, \"bash\", {\n\t\t\t\tcommand: composeShellCommand(args.command, args.workingDirectory || undefined),\n\t\t\t\ttimeout: shellTimeout,\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\tnormalizedArgs,\n\t\t\t\texecHandlers?.shell?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\t(toolResult) => buildShellResultFromToolResult(normalizedArgs, toolResult),\n\t\t\t\t(reason) => buildShellRejectedResult(normalizedArgs.command, normalizedArgs.workingDirectory, reason),\n\t\t\t\t(error) => buildShellFailureResult(normalizedArgs.command, normalizedArgs.workingDirectory, error),\n\t\t\t\t{ toolCallId: args.toolCallId, toolName: \"bash\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"shellResult\", sanitizeShellExecResult(execResult));\n\t\t\treturn;\n\t\t}\n\t\tcase \"shellStreamArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tif (!args.toolCallId) args.toolCallId = randomUUID();\n\t\t\tconst shellStreamTimeout = args.timeout && args.timeout > 0 ? args.timeout : undefined;\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, args.toolCallId, \"bash\", {\n\t\t\t\tcommand: composeShellCommand(args.command, args.workingDirectory || undefined),\n\t\t\t\ttimeout: shellStreamTimeout,\n\t\t\t});\n\t\t\tawait handleShellStreamArgs(args, execMsg, h2Request, execHandlers, onToolResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"backgroundShellSpawnArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst execResult = create(BackgroundShellSpawnResultSchema, {\n\t\t\t\tresult: {\n\t\t\t\t\tcase: \"rejected\",\n\t\t\t\t\tvalue: create(ShellRejectedSchema, {\n\t\t\t\t\t\tcommand: args.command,\n\t\t\t\t\t\tworkingDirectory: args.workingDirectory,\n\t\t\t\t\t\treason: \"Not implemented\",\n\t\t\t\t\t\tisReadonly: false,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"backgroundShellSpawnResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"writeShellStdinArgs\": {\n\t\t\tconst execResult = create(WriteShellStdinResultSchema, {\n\t\t\t\tresult: {\n\t\t\t\t\tcase: \"error\",\n\t\t\t\t\tvalue: create(WriteShellStdinErrorSchema, {\n\t\t\t\t\t\terror: \"Not implemented\",\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"writeShellStdinResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"fetchArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst execResult = create(FetchResultSchema, {\n\t\t\t\tresult: {\n\t\t\t\t\tcase: \"error\",\n\t\t\t\t\tvalue: create(FetchErrorSchema, {\n\t\t\t\t\t\turl: args.url,\n\t\t\t\t\t\terror: \"Not implemented\",\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"fetchResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"diagnosticsArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tif (!args.toolCallId) args.toolCallId = randomUUID();\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\targs,\n\t\t\t\texecHandlers?.diagnostics?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\t(toolResult) => buildDiagnosticsResultFromToolResult(args.path, toolResult),\n\t\t\t\t(reason) => buildDiagnosticsRejectedResult(args.path, reason),\n\t\t\t\t(error) => buildDiagnosticsErrorResult(args.path, error),\n\t\t\t\t// senpi has no local diagnostics tool; the frame is answered with a\n\t\t\t\t// refusal and no block is synthesized (nothing ran).\n\t\t\t\tnull,\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"diagnosticsResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"mcpArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst mcpCall = decodeMcpCall(args);\n\t\t\t// An approval probe, not an invocation: the frame asks whether the\n\t\t\t// call would be permitted. Only a definite allow is approved; without\n\t\t\t// a handler there is nothing to decide with, so it is refused. Either\n\t\t\t// way no block is synthesized — nothing ran.\n\t\t\tif (mcpCall.approvalOnly) {\n\t\t\t\tconst approved = (await execHandlers?.mcpApprovalPreflight?.(mcpCall)) === true;\n\t\t\t\tsendExecClientMessage(\n\t\t\t\t\th2Request,\n\t\t\t\t\texecMsg,\n\t\t\t\t\t\"mcpResult\",\n\t\t\t\t\tcreate(McpResultSchema, {\n\t\t\t\t\t\tresult: approved\n\t\t\t\t\t\t\t? { case: \"approved\", value: create(McpApprovedSchema, {}) }\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\tcase: \"rejected\",\n\t\t\t\t\t\t\t\t\tvalue: create(McpRejectedSchema, {\n\t\t\t\t\t\t\t\t\t\treason: `Tool \"${mcpCall.toolName || mcpCall.name}\" is not approved to run without asking.`,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (execHandlers?.mcp) {\n\t\t\t\tconst existingBlock = output.content.find(\n\t\t\t\t\t(block) => block.type === \"toolCall\" && block.id === mcpCall.toolCallId,\n\t\t\t\t);\n\t\t\t\tif (existingBlock) {\n\t\t\t\t\tmarkCursorExecResolved(existingBlock);\n\t\t\t\t} else {\n\t\t\t\t\tsynthesizeCursorExecToolCall(\n\t\t\t\t\t\toutput,\n\t\t\t\t\t\tstream,\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tmcpCall.toolCallId,\n\t\t\t\t\t\tmcpCall.toolName || mcpCall.name,\n\t\t\t\t\t\tmcpCall.args,\n\t\t\t\t\t);\n\t\t\t\t\tstate.resolvedMcpToolCallIds.add(mcpCall.toolCallId);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\tmcpCall,\n\t\t\t\texecHandlers?.mcp?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\t(toolResult) => buildMcpResultFromToolResult(mcpCall, toolResult),\n\t\t\t\t(_reason) => buildMcpToolNotFoundResult(mcpCall),\n\t\t\t\t(error) => buildMcpErrorResult(error),\n\t\t\t\texecHandlers?.mcp ? { toolCallId: mcpCall.toolCallId, toolName: mcpCall.toolName } : null,\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"mcpResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"listMcpResourcesExecArgs\": {\n\t\t\t// This client hosts no MCP resources; the honest answer is an explicit\n\t\t\t// empty success. An unset-oneof result would read as \"the call\n\t\t\t// produced nothing\".\n\t\t\tconst execResult = create(ListMcpResourcesExecResultSchema, {\n\t\t\t\tresult: {\n\t\t\t\t\tcase: \"success\",\n\t\t\t\t\tvalue: create(ListMcpResourcesSuccessSchema, { resources: [] }),\n\t\t\t\t},\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"listMcpResourcesExecResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"readMcpResourceExecArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst execResult = create(ReadMcpResourceExecResultSchema, {\n\t\t\t\tresult: { case: \"notFound\", value: create(ReadMcpResourceNotFoundSchema, { uri: args.uri }) },\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"readMcpResourceExecResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"recordScreenArgs\": {\n\t\t\tconst execResult = create(RecordScreenResultSchema, {\n\t\t\t\tresult: { case: \"failure\", value: create(RecordScreenFailureSchema, { error: NOT_IMPLEMENTED }) },\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"recordScreenResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"computerUseArgs\": {\n\t\t\tconst execResult = create(ComputerUseResultSchema, {\n\t\t\t\tresult: { case: \"error\", value: create(ComputerUseErrorSchema, { error: NOT_IMPLEMENTED }) },\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"computerUseResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"piReadArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst toolCallId = randomUUID();\n\t\t\tconst readArgs = piReadArgs(args.path, args.offset, args.limit);\n\t\t\tsynthesizeCursorExecToolCall(\n\t\t\t\toutput,\n\t\t\t\tstream,\n\t\t\t\tstate,\n\t\t\t\ttoolCallId,\n\t\t\t\t\"read\",\n\t\t\t\treadArgs ?? { path: args.path, offset: args.offset, limit: 0 },\n\t\t\t);\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\t{ args, toolCallId },\n\t\t\t\texecHandlers?.piRead?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\tbuildPiReadResult,\n\t\t\t\tbuildPiReadError,\n\t\t\t\tbuildPiReadError,\n\t\t\t\t{ toolCallId, toolName: \"read\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"piReadResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"piBashArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst toolCallId = randomUUID();\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, toolCallId, \"bash\", {\n\t\t\t\tcommand: args.command,\n\t\t\t\ttimeout: piTimeout(args.timeout),\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\t{ args, toolCallId },\n\t\t\t\texecHandlers?.piBash?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\tbuildPiBashResult,\n\t\t\t\tbuildPiBashError,\n\t\t\t\tbuildPiBashError,\n\t\t\t\t{ toolCallId, toolName: \"bash\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"piBashResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"piEditArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst toolCallId = randomUUID();\n\t\t\t// `PiEditReplacement[]` maps 1:1 onto the local `edit` tool's\n\t\t\t// `edits[{oldText,newText}]` shape.\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, toolCallId, \"edit\", {\n\t\t\t\tpath: args.path,\n\t\t\t\tedits: args.edits.map((edit) => ({ oldText: edit.oldText, newText: edit.newText })),\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\t{ args, toolCallId },\n\t\t\t\texecHandlers?.piEdit?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\tbuildPiEditResult,\n\t\t\t\tbuildPiEditRejected,\n\t\t\t\tbuildPiEditError,\n\t\t\t\t{ toolCallId, toolName: \"edit\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"piEditResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"piWriteArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst toolCallId = randomUUID();\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, toolCallId, \"write\", {\n\t\t\t\tpath: args.path,\n\t\t\t\tcontent: args.content,\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\t{ args, toolCallId },\n\t\t\t\texecHandlers?.piWrite?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\tbuildPiWriteResult,\n\t\t\t\tbuildPiWriteRejected,\n\t\t\t\tbuildPiWriteError,\n\t\t\t\t{ toolCallId, toolName: \"write\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"piWriteResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"piGrepArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst toolCallId = randomUUID();\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, toolCallId, \"grep\", {\n\t\t\t\tpattern: args.pattern,\n\t\t\t\tpath: args.path || undefined,\n\t\t\t\tglob: args.glob || undefined,\n\t\t\t\tignoreCase: args.ignoreCase === true ? true : undefined,\n\t\t\t\tliteral: args.literal === true ? true : undefined,\n\t\t\t\tcontext: args.context,\n\t\t\t\tlimit: piLimit(args.limit),\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\t{ args, toolCallId },\n\t\t\t\texecHandlers?.piGrep?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\tbuildPiGrepResult,\n\t\t\t\tbuildPiGrepError,\n\t\t\t\tbuildPiGrepError,\n\t\t\t\t{ toolCallId, toolName: \"grep\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"piGrepResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"piFindArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst toolCallId = randomUUID();\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, toolCallId, \"find\", {\n\t\t\t\tpattern: args.pattern,\n\t\t\t\tpath: args.path || undefined,\n\t\t\t\tlimit: piLimit(args.limit),\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\t{ args, toolCallId },\n\t\t\t\texecHandlers?.piFind?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\tbuildPiFindResult,\n\t\t\t\tbuildPiFindError,\n\t\t\t\tbuildPiFindError,\n\t\t\t\t{ toolCallId, toolName: \"find\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"piFindResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"piLsArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst toolCallId = randomUUID();\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, toolCallId, \"ls\", {\n\t\t\t\tpath: piLsPath(args.path),\n\t\t\t\tlimit: piLimit(args.limit),\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\t{ args, toolCallId },\n\t\t\t\texecHandlers?.piLs?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\tbuildPiLsResult,\n\t\t\t\tbuildPiLsError,\n\t\t\t\tbuildPiLsError,\n\t\t\t\t{ toolCallId, toolName: \"ls\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"piLsResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"miniSweAgentBashArgs\": {\n\t\t\t// Same `ShellArgs`/`ShellResult` pair as `shellArgs`, under its own\n\t\t\t// frame number, so the existing shell handler answers it unchanged.\n\t\t\tconst args = execMsg.message.value;\n\t\t\tif (!args.toolCallId) args.toolCallId = randomUUID();\n\t\t\tconst normalizedArgs: ShellArgs = { ...args, workingDirectory: args.workingDirectory || process.cwd() };\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, args.toolCallId, \"bash\", {\n\t\t\t\tcommand: composeShellCommand(args.command, args.workingDirectory || undefined),\n\t\t\t\ttimeout: args.timeout && args.timeout > 0 ? args.timeout : undefined,\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\tnormalizedArgs,\n\t\t\t\texecHandlers?.shell?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\t(toolResult) => buildShellResultFromToolResult(normalizedArgs, toolResult),\n\t\t\t\t(reason) => buildShellRejectedResult(normalizedArgs.command, normalizedArgs.workingDirectory, reason),\n\t\t\t\t(error) => buildShellFailureResult(normalizedArgs.command, normalizedArgs.workingDirectory, error),\n\t\t\t\t{ toolCallId: args.toolCallId, toolName: \"bash\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"miniSweAgentBashResult\", sanitizeShellExecResult(execResult));\n\t\t\treturn;\n\t\t}\n\t\tcase \"redactedReadArgs\": {\n\t\t\t// The server expects the client to strip secrets from the content\n\t\t\t// first. No redaction is implemented here, and serving a plain read\n\t\t\t// would hand back exactly the unredacted bytes the frame exists to\n\t\t\t// withhold.\n\t\t\tconst args = execMsg.message.value;\n\t\t\tsendExecClientMessage(\n\t\t\t\th2Request,\n\t\t\t\texecMsg,\n\t\t\t\t\"redactedReadResult\",\n\t\t\t\tbuildReadErrorResult(args.path, \"Secret redaction is not implemented by this client\"),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tcase \"mcpStateExecArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tsendExecClientMessage(\n\t\t\t\th2Request,\n\t\t\t\texecMsg,\n\t\t\t\t\"mcpStateExecResult\",\n\t\t\t\tbuildMcpStateResult(requestContextTools, args.serverIdentifiers),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tcase \"executeHookArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst execResult = buildNeutralHookResult(args.request);\n\t\t\tif (!execResult) {\n\t\t\t\tsendExecClientThrow(\n\t\t\t\t\th2Request,\n\t\t\t\t\texecMsg,\n\t\t\t\t\t`Unsupported hook request: ${args.request?.request.case ?? \"unset\"}`,\n\t\t\t\t\t\"unknown_hook_request\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"executeHookResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"subagentArgs\": {\n\t\t\tconst execResult = create(SubagentResultSchema, {\n\t\t\t\tresult: {\n\t\t\t\t\tcase: \"error\",\n\t\t\t\t\tvalue: create(SubagentErrorSchema, { error: `Subagents are ${NOT_IMPLEMENTED_SUFFIX}` }),\n\t\t\t\t},\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"subagentResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"subagentAwaitArgs\": {\n\t\t\t// No subagent was ever spawned, so every awaited id is genuinely unknown.\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst execResult = create(SubagentAwaitResultSchema, {\n\t\t\t\tresult: {\n\t\t\t\t\tcase: \"notFound\",\n\t\t\t\t\tvalue: create(SubagentAwaitNotFoundSchema, { agentId: args.agentId }),\n\t\t\t\t},\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"subagentAwaitResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"forceBackgroundShellArgs\": {\n\t\t\t// Backgrounding targets a running tool call by id. This client runs\n\t\t\t// every shell to completion in band, so there is never one to move.\n\t\t\tconst execResult = create(ForceBackgroundShellResultSchema, {\n\t\t\t\tstatus: ForceBackgroundShellStatus.NOT_FOUND,\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"forceBackgroundShellResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"forceBackgroundSubagentArgs\": {\n\t\t\tconst execResult = create(ForceBackgroundSubagentResultSchema, {\n\t\t\t\tstatus: ForceBackgroundSubagentStatus.NOT_FOUND,\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"forceBackgroundSubagentResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"smartModeClassifierArgs\": {\n\t\t\t// The classifier decides whether a risky action needs approval.\n\t\t\t// Answering `ALLOW` would silently wave through actions the server\n\t\t\t// asked us to judge, so the honest answer is that no classifier\n\t\t\t// exists here.\n\t\t\tconst execResult = create(SmartModeClassifierResultSchema, {\n\t\t\t\tresult: {\n\t\t\t\t\tcase: \"error\",\n\t\t\t\t\tvalue: create(SmartModeClassifierErrorSchema, {\n\t\t\t\t\t\terror: `Smart-mode classification is ${NOT_IMPLEMENTED_SUFFIX}`,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"smartModeClassifierResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"canvasDiagnosticsArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst execResult = create(CanvasDiagnosticsResultSchema, {\n\t\t\t\tresult: {\n\t\t\t\t\tcase: \"error\",\n\t\t\t\t\tvalue: create(CanvasDiagnosticsErrorSchema, {\n\t\t\t\t\t\tpath: args.path,\n\t\t\t\t\t\terror: `Canvas diagnostics are ${NOT_IMPLEMENTED_SUFFIX}`,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"canvasDiagnosticsResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"shellAllowlistPrecheckArgs\": {\n\t\t\t// The prechecks ask \"is this pre-approved, so may it skip the approval\n\t\t\t// prompt?\". This client keeps no allowlist, so the answer is always\n\t\t\t// no: `false` costs an approval round-trip, `true` would grant one\n\t\t\t// that was never configured.\n\t\t\tsendExecClientMessage(\n\t\t\t\th2Request,\n\t\t\t\texecMsg,\n\t\t\t\t\"shellAllowlistPrecheckResult\",\n\t\t\t\tcreate(ShellAllowlistPrecheckResultSchema, { allowlisted: false }),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tcase \"mcpAllowlistPrecheckArgs\": {\n\t\t\tsendExecClientMessage(\n\t\t\t\th2Request,\n\t\t\t\texecMsg,\n\t\t\t\t\"mcpAllowlistPrecheckResult\",\n\t\t\t\tcreate(McpAllowlistPrecheckResultSchema, { allowlisted: false }),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tcase \"webFetchAllowlistPrecheckArgs\": {\n\t\t\tsendExecClientMessage(\n\t\t\t\th2Request,\n\t\t\t\texecMsg,\n\t\t\t\t\"webFetchAllowlistPrecheckResult\",\n\t\t\t\tcreate(WebFetchAllowlistPrecheckResultSchema, { allowlisted: false }),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tcase \"conversationSearchArgs\": {\n\t\t\t// Cursor conversation history lives server-side; this client keeps no\n\t\t\t// local index of it to search. The streamed envelope announces this\n\t\t\t// call but the interaction decoder builds no block for it, so the\n\t\t\t// block and its paired result are synthesized here.\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst toolCallId = args.toolCallId || randomUUID();\n\t\t\tconst error = `Conversation search is ${NOT_IMPLEMENTED_SUFFIX}`;\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, toolCallId, \"search_conversations\", {\n\t\t\t\tquery: args.query,\n\t\t\t\tlimit: args.limit,\n\t\t\t});\n\t\t\tawait pairSynthesizedExecResult(state, onToolResult, toolCallId, \"search_conversations\", error);\n\t\t\tconst execResult = create(ConversationSearchResultSchema, {\n\t\t\t\tresult: { case: \"error\", value: create(ConversationSearchErrorSchema, { error }) },\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"conversationSearchResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"agentStoreConflictArgs\": {\n\t\t\t// The agent store is Cursor's own on-disk journal; this client never\n\t\t\t// writes one, so it has no conflict events to replay.\n\t\t\tconst execResult = create(AgentStoreConflictResultSchema, {\n\t\t\t\tresult: {\n\t\t\t\t\tcase: \"error\",\n\t\t\t\t\tvalue: create(AgentStoreConflictErrorSchema, {\n\t\t\t\t\t\terror: `Agent store conflicts are ${NOT_IMPLEMENTED_SUFFIX}`,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"agentStoreConflictResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"gitDiffRequest\": {\n\t\t\t// `GetDiffResponse` has no error variant, so any in-band answer is a\n\t\t\t// claim that a diff was computed; a `throw` is the only truthful reply.\n\t\t\tsendExecClientThrow(h2Request, execMsg, `Git diff is ${NOT_IMPLEMENTED_SUFFIX}`, \"exec_variant_unsupported\");\n\t\t\treturn;\n\t\t}\n\t\tdefault: {\n\t\t\t// A frame number this build recognises structurally but has no answer\n\t\t\t// for. Distinct from the unset-case path above: there the client\n\t\t\t// cannot even name the frame.\n\t\t\tlog(\"warn\", \"unhandledExecMessage\", { execCase });\n\t\t\tsendExecClientThrow(\n\t\t\t\th2Request,\n\t\t\t\texecMsg,\n\t\t\t\t`No handler for exec message of type ${execCase}`,\n\t\t\t\t\"exec_variant_unsupported\",\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction armCursorExecHeartbeat(h2Request: http2.ClientHttp2Stream, execMsg: ExecServerMessage): () => void {\n\treturn armExecHeartbeat({\n\t\tintervalMs: EXEC_HEARTBEAT_INTERVAL_MS,\n\t\tisClosed: () => h2Request.closed,\n\t\twriteHeartbeat: (onComplete) => {\n\t\t\tconst controlMessage = create(ExecClientControlMessageSchema, {\n\t\t\t\tmessage: {\n\t\t\t\t\tcase: \"heartbeat\",\n\t\t\t\t\tvalue: create(ExecClientHeartbeatSchema, { id: execMsg.id }),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst clientMessage = create(AgentClientMessageSchema, {\n\t\t\t\tmessage: { case: \"execClientControlMessage\", value: controlMessage },\n\t\t\t});\n\t\t\th2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema, clientMessage)), onComplete);\n\t\t\tlog(\"execClientControl\", \"heartbeat\", { id: execMsg.id, execId: execMsg.execId });\n\t\t},\n\t});\n}\n\n/**\n * Send one typed answer on the exec channel.\n *\n * `ExecClientMessage[\"message\"]` is a discriminated union pairing each case\n * with its own result type, so the generic is keyed on the case: passing a\n * `ReadResult` under `\"shellResult\"` is a compile error rather than a wire\n * message the server rejects at runtime.\n */\nfunction sendExecClientMessage<TCase extends NonNullable<ExecClientMessage[\"message\"][\"case\"]>>(\n\th2Request: http2.ClientHttp2Stream,\n\texecMsg: ExecServerMessage,\n\tmessageCase: TCase,\n\tvalue: Extract<ExecClientMessage[\"message\"], { case: TCase }>[\"value\"],\n): void {\n\tconst execClientMessage = create(ExecClientMessageSchema, {\n\t\tid: execMsg.id,\n\t\texecId: execMsg.execId,\n\t\tmessage: { case: messageCase, value } as ExecClientMessage[\"message\"],\n\t});\n\n\tconst clientMessage = create(AgentClientMessageSchema, {\n\t\tmessage: { case: \"execClientMessage\", value: execClientMessage },\n\t});\n\n\th2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema, clientMessage)));\n\n\tlog(\"execClientMessage\", messageCase);\n}\n\n/**\n * Fail one exec frame in band.\n *\n * `ExecClientThrow` is the protocol's failure channel for a frame that cannot\n * be answered at all — as opposed to a frame answered with its own typed\n * error variant, which means \"the tool ran and failed\". The server surfaces\n * the error to the model instead of blocking on a reply that never comes.\n */\nfunction sendExecClientThrow(\n\th2Request: http2.ClientHttp2Stream,\n\texecMsg: ExecServerMessage,\n\terror: string,\n\terrorCode?: string,\n): void {\n\tconst controlMessage = create(ExecClientControlMessageSchema, {\n\t\tmessage: {\n\t\t\tcase: \"throw\",\n\t\t\tvalue: create(ExecClientThrowSchema, { id: execMsg.id, error, errorCode }),\n\t\t},\n\t});\n\tconst clientMessage = create(AgentClientMessageSchema, {\n\t\tmessage: { case: \"execClientControlMessage\", value: controlMessage },\n\t});\n\th2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema, clientMessage)));\n\tlog(\"execClientControl\", \"throw\", { id: execMsg.id, execId: execMsg.execId, error, errorCode });\n}\n\nfunction sendExecClientStreamClose(h2Request: http2.ClientHttp2Stream, execMsg: ExecServerMessage): void {\n\tconst closeMessage = create(ExecClientControlMessageSchema, {\n\t\tmessage: {\n\t\t\tcase: \"streamClose\",\n\t\t\tvalue: create(ExecClientStreamCloseSchema, {\n\t\t\t\tid: execMsg.id,\n\t\t\t}),\n\t\t},\n\t});\n\tconst clientMessage = create(AgentClientMessageSchema, {\n\t\tmessage: { case: \"execClientControlMessage\", value: closeMessage },\n\t});\n\th2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema, clientMessage)));\n\tlog(\"execClientControl\", \"streamClose\", { id: execMsg.id, execId: execMsg.execId });\n}\n\n/**\n * Exported for tests: dispatches one exec frame onto its handler.\n *\n * Every exit pairs a `toolResult`. The synthesized block was already marked\n * `kCursorExecResolved` before this runs, so the agent loop emits no\n * placeholder for it: a path that returns without a result leaves the call\n * unpaired and transcript rebuilds strip the whole interaction. The three\n * result-less paths — no handler installed, a handler that produced nothing,\n * and a thrown handler — therefore synthesize one from the same text the\n * server sees in `execResult`.\n *\n * `pairing` is required so a new callsite cannot silently recreate the\n * orphan, and nullable for the callers whose block is NOT pre-resolved (MCP\n * without an `mcp` handler, which the agent loop runs locally and pairs\n * itself, and frames that never synthesize a block).\n */\nexport async function resolveExecHandler<TArgs, TResult>(\n\targs: TArgs,\n\thandler: ((args: TArgs) => Promise<CursorExecHandlerResult<TResult>>) | undefined,\n\tonToolResult: CursorToolResultHandler | undefined,\n\tbuildFromToolResult: (toolResult: ToolResultMessage) => TResult,\n\tbuildRejected: (reason: string) => TResult,\n\tbuildError: (error: string) => TResult,\n\tpairing: CursorExecPairing | null,\n): Promise<{ execResult: TResult; toolResult?: ToolResultMessage }> {\n\tconst pair = async (text: string, isError: boolean): Promise<ToolResultMessage | undefined> => {\n\t\tif (!pairing) return undefined;\n\t\tconst synthesized: ToolResultMessage = {\n\t\t\trole: \"toolResult\",\n\t\t\ttoolCallId: pairing.toolCallId,\n\t\t\ttoolName: pairing.toolName,\n\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\tisError,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t\treturn await applyToolResultHandler(synthesized, onToolResult);\n\t};\n\n\tif (!handler) {\n\t\tconst reason = \"Tool not available\";\n\t\treturn { execResult: buildRejected(reason), toolResult: await pair(reason, true) };\n\t}\n\n\ttry {\n\t\tconst handlerResult = await handler(args);\n\t\tconst { execResult, toolResult } = splitExecHandlerResult(handlerResult);\n\t\tconst finalToolResult = await applyToolResultHandler(toolResult, onToolResult);\n\n\t\tif (execResult) {\n\t\t\t// TResult-only is a supported return form, so the transcript entry\n\t\t\t// has to be synthesized here, derived from the raw result so the two\n\t\t\t// views stay consistent.\n\t\t\treturn {\n\t\t\t\texecResult,\n\t\t\t\ttoolResult: finalToolResult ?? (await pair(...describeExecResult(execResult))),\n\t\t\t};\n\t\t}\n\t\tif (finalToolResult) {\n\t\t\treturn { execResult: buildFromToolResult(finalToolResult), toolResult: finalToolResult };\n\t\t}\n\t\tconst reason = \"Tool returned no result\";\n\t\treturn { execResult: buildRejected(reason), toolResult: await pair(reason, true) };\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn { execResult: buildError(message), toolResult: await pair(message, true) };\n\t}\n}\n\n/**\n * Derive the transcript state of an exec result the handler returned in the\n * TResult-only form, which carries no `toolResult` to copy it from.\n *\n * Every exec result in `agent.proto` is a `oneof result` whose success\n * variant is named `success` — the rest are failures. MCP is the one shape\n * where `success` is not enough: `McpSuccess.is_error` carries an\n * application-level tool failure inside the success variant.\n */\nfunction describeExecResult(execResult: unknown): [text: string, isError: boolean] {\n\tconst result = (execResult as { result?: { case?: string; value?: unknown } } | null)?.result;\n\tconst variant = result?.case;\n\tif (variant === \"success\") {\n\t\tconst success = result?.value as { isError?: boolean; content?: unknown[] } | undefined;\n\t\tif (!success?.isError) return [\"Tool produced no transcript result\", false];\n\t\treturn [mcpContentToText(success.content) || \"MCP tool reported an error\", true];\n\t}\n\tif (!variant) return [\"Tool produced no transcript result\", false];\n\tconst value = result?.value as { error?: string; reason?: string } | undefined;\n\treturn [value?.error || value?.reason || `Tool call ${variant}`, true];\n}\n\n/** Flatten `McpSuccess.content` into transcript text. */\nfunction mcpContentToText(content: unknown[] | undefined): string {\n\tif (!Array.isArray(content)) return \"\";\n\tconst parts: string[] = [];\n\tfor (const item of content) {\n\t\tconst inner = (item as { content?: { case?: string; value?: { text?: string } } } | null)?.content;\n\t\tif (inner?.case === \"text\" && inner.value?.text) parts.push(inner.value.text);\n\t}\n\treturn parts.join(\"\\n\");\n}\n\nfunction splitExecHandlerResult<TResult>(result: CursorExecHandlerResult<TResult>): {\n\texecResult?: TResult;\n\ttoolResult?: ToolResultMessage;\n} {\n\tif (isToolResultMessage(result)) {\n\t\treturn { toolResult: result };\n\t}\n\tif (result && typeof result === \"object\") {\n\t\tconst record = result as Record<string, unknown>;\n\t\tif (\"execResult\" in record) {\n\t\t\tconst { execResult, toolResult } = record as {\n\t\t\t\texecResult: TResult;\n\t\t\t\ttoolResult?: ToolResultMessage;\n\t\t\t};\n\t\t\treturn { execResult, toolResult };\n\t\t}\n\t\tif (\"toolResult\" in record && !isToolResultMessage(record)) {\n\t\t\tconst { result: execResult, toolResult } = record as {\n\t\t\t\tresult?: TResult;\n\t\t\t\ttoolResult?: ToolResultMessage;\n\t\t\t};\n\t\t\treturn { execResult, toolResult };\n\t\t}\n\t\tif (\"result\" in record && !(\"$typeName\" in record)) {\n\t\t\tconst { result: execResult, toolResult } = record as {\n\t\t\t\tresult: TResult;\n\t\t\t\ttoolResult?: ToolResultMessage;\n\t\t\t};\n\t\t\treturn { execResult, toolResult };\n\t\t}\n\t}\n\treturn { execResult: result as TResult };\n}\n\nfunction isToolResultMessage(value: unknown): value is ToolResultMessage {\n\treturn !!value && typeof value === \"object\" && (value as ToolResultMessage).role === \"toolResult\";\n}\n\nasync function applyToolResultHandler(\n\ttoolResult: ToolResultMessage | undefined,\n\tonToolResult: CursorToolResultHandler | undefined,\n): Promise<ToolResultMessage | undefined> {\n\tif (!toolResult || !onToolResult) {\n\t\treturn toolResult;\n\t}\n\tconst updated = await onToolResult(toolResult);\n\treturn updated ?? toolResult;\n}\n\nfunction toolResultToText(toolResult: ToolResultMessage): string {\n\treturn toolResult.content.map((item) => (item.type === \"text\" ? item.text : `[${item.mimeType} image]`)).join(\"\\n\");\n}\n\nfunction toolResultWasTruncated(toolResult: ToolResultMessage): boolean {\n\tif (!toolResult.details || typeof toolResult.details !== \"object\") {\n\t\treturn false;\n\t}\n\tconst truncation = (toolResult.details as { truncation?: { truncated?: boolean } }).truncation;\n\treturn !!truncation?.truncated;\n}\n\nfunction toolResultDetailBoolean(toolResult: ToolResultMessage, key: string): boolean {\n\tif (!toolResult.details || typeof toolResult.details !== \"object\") {\n\t\treturn false;\n\t}\n\tconst value = (toolResult.details as Record<string, unknown>)[key];\n\treturn typeof value === \"boolean\" ? value : false;\n}\n\n/** The file's own line count, when the tool recorded one. */\nfunction readTotalLinesFromDetails(toolResult: ToolResultMessage): number | undefined {\n\tconst details = toolResult.details;\n\tif (!details || typeof details !== \"object\") return undefined;\n\tconst direct = \"totalLines\" in details ? details.totalLines : undefined;\n\tif (typeof direct === \"number\" && Number.isFinite(direct)) return direct;\n\tconst meta = \"meta\" in details ? details.meta : undefined;\n\tif (!meta || typeof meta !== \"object\") return undefined;\n\tconst truncation = \"truncation\" in meta ? meta.truncation : undefined;\n\tif (!truncation || typeof truncation !== \"object\") return undefined;\n\tconst totalLines = \"totalLines\" in truncation ? truncation.totalLines : undefined;\n\treturn typeof totalLines === \"number\" && Number.isFinite(totalLines) ? totalLines : undefined;\n}\n\nfunction readFileSizeFromDetails(toolResult: ToolResultMessage): number | undefined {\n\tconst details = toolResult.details;\n\tif (!details || typeof details !== \"object\" || !(\"fileSize\" in details)) return undefined;\n\tconst { fileSize } = details;\n\treturn typeof fileSize === \"number\" && Number.isSafeInteger(fileSize) && fileSize >= 0 ? fileSize : undefined;\n}\n\nfunction buildReadResultFromToolResult(path: string, toolResult: ToolResultMessage, rangeApplied = false) {\n\tconst text = toolResultToText(toolResult);\n\tif (toolResult.isError) {\n\t\treturn buildReadErrorResult(path, text || \"Read failed\");\n\t}\n\t// Counting the payload is only the file's length when the payload is the\n\t// whole file: under a windowed read, answering a 20-line page of a 100-line\n\t// file with `total_lines: 20` tells a paginating server it reached the end.\n\tconst totalLines = readTotalLinesFromDetails(toolResult) ?? (rangeApplied ? 0 : text ? text.split(\"\\n\").length : 0);\n\treturn create(ReadResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(ReadSuccessSchema, {\n\t\t\t\tpath,\n\t\t\t\ttotalLines,\n\t\t\t\tfileSize: BigInt(readFileSizeFromDetails(toolResult) ?? Buffer.byteLength(text, \"utf-8\")),\n\t\t\t\ttruncated: toolResultWasTruncated(toolResult),\n\t\t\t\toutput: { case: \"content\", value: text },\n\t\t\t\trangeApplied,\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction buildReadErrorResult(path: string, error: string) {\n\treturn create(ReadResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"error\",\n\t\t\tvalue: create(ReadErrorSchema, { path, error }),\n\t\t},\n\t});\n}\n\nfunction buildReadRejectedResult(path: string, reason: string) {\n\treturn create(ReadResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"rejected\",\n\t\t\tvalue: create(ReadRejectedSchema, { path, reason }),\n\t\t},\n\t});\n}\n\nfunction buildWriteResultFromToolResult(\n\targs: { path: string; fileText?: string; fileBytes?: Uint8Array; returnFileContentAfterWrite?: boolean },\n\ttoolResult: ToolResultMessage,\n) {\n\tconst text = toolResultToText(toolResult);\n\tif (toolResult.isError) {\n\t\treturn buildWriteErrorResult(args.path, text || \"Write failed\");\n\t}\n\tconst fileText = args.fileText ?? \"\";\n\tconst fileSize = args.fileBytes?.length ?? Buffer.byteLength(fileText, \"utf-8\");\n\tconst linesCreated = fileText ? fileText.split(\"\\n\").length : 0;\n\treturn create(WriteResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(WriteSuccessSchema, {\n\t\t\t\tpath: args.path,\n\t\t\t\tlinesCreated,\n\t\t\t\tfileSize,\n\t\t\t\tfileContentAfterWrite: args.returnFileContentAfterWrite ? fileText : undefined,\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction buildWriteErrorResult(path: string, error: string) {\n\treturn create(WriteResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"error\",\n\t\t\tvalue: create(WriteErrorSchema, { path, error }),\n\t\t},\n\t});\n}\n\nfunction buildWriteRejectedResult(path: string, reason: string) {\n\treturn create(WriteResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"rejected\",\n\t\t\tvalue: create(WriteRejectedSchema, { path, reason }),\n\t\t},\n\t});\n}\n\nfunction buildDeleteResultFromToolResult(path: string, toolResult: ToolResultMessage) {\n\tconst text = toolResultToText(toolResult);\n\tif (toolResult.isError) {\n\t\treturn buildDeleteErrorResult(path, text || \"Delete failed\");\n\t}\n\treturn create(DeleteResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(DeleteSuccessSchema, {\n\t\t\t\tpath,\n\t\t\t\tdeletedFile: path,\n\t\t\t\tfileSize: BigInt(0),\n\t\t\t\tprevContent: \"\",\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction buildDeleteErrorResult(path: string, error: string) {\n\treturn create(DeleteResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"error\",\n\t\t\tvalue: create(DeleteErrorSchema, { path, error }),\n\t\t},\n\t});\n}\n\nfunction buildDeleteRejectedResult(path: string, reason: string) {\n\treturn create(DeleteResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"rejected\",\n\t\t\tvalue: create(DeleteRejectedSchema, { path, reason }),\n\t\t},\n\t});\n}\n\nfunction buildShellResultFromToolResult(\n\targs: { command: string; workingDirectory: string },\n\ttoolResult: ToolResultMessage,\n) {\n\tconst output = toolResultToText(toolResult);\n\tif (toolResult.isError) {\n\t\treturn buildShellFailureResult(args.command, args.workingDirectory, output || \"Shell failed\");\n\t}\n\treturn create(ShellResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(ShellSuccessSchema, {\n\t\t\t\tcommand: args.command,\n\t\t\t\tworkingDirectory: args.workingDirectory,\n\t\t\t\texitCode: 0,\n\t\t\t\tsignal: \"\",\n\t\t\t\tstdout: output,\n\t\t\t\tstderr: \"\",\n\t\t\t\texecutionTime: 0,\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction buildShellFailureResult(command: string, workingDirectory: string, error: string) {\n\treturn create(ShellResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"failure\",\n\t\t\tvalue: create(ShellFailureSchema, {\n\t\t\t\tcommand,\n\t\t\t\tworkingDirectory,\n\t\t\t\texitCode: 1,\n\t\t\t\tsignal: \"\",\n\t\t\t\tstdout: \"\",\n\t\t\t\tstderr: error,\n\t\t\t\texecutionTime: 0,\n\t\t\t\taborted: false,\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction buildShellRejectedResult(command: string, workingDirectory: string, reason: string) {\n\treturn create(ShellResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"rejected\",\n\t\t\tvalue: create(ShellRejectedSchema, {\n\t\t\t\tcommand,\n\t\t\t\tworkingDirectory,\n\t\t\t\treason,\n\t\t\t\tisReadonly: false,\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction buildLsResultFromToolResult(path: string, toolResult: ToolResultMessage) {\n\tconst text = toolResultToText(toolResult);\n\tif (toolResult.isError) {\n\t\treturn buildLsErrorResult(path, text || \"Ls failed\");\n\t}\n\tconst rootPath = path || \".\";\n\tconst entries = text\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trim())\n\t\t.filter((line) => line.length > 0 && !line.startsWith(\"[\"));\n\tconst childrenDirs: LsDirectoryTreeNode[] = [];\n\tconst childrenFiles: LsDirectoryTreeNode_File[] = [];\n\n\tfor (const entry of entries) {\n\t\tconst name = entry.split(\" (\")[0];\n\t\tif (name.endsWith(\"/\")) {\n\t\t\tconst dirName = name.slice(0, -1);\n\t\t\tchildrenDirs.push(\n\t\t\t\tcreate(LsDirectoryTreeNodeSchema, {\n\t\t\t\t\tabsPath: `${rootPath.replace(/\\/$/, \"\")}/${dirName}`,\n\t\t\t\t\tchildrenDirs: [],\n\t\t\t\t\tchildrenFiles: [],\n\t\t\t\t\tchildrenWereProcessed: false,\n\t\t\t\t\tfullSubtreeExtensionCounts: {},\n\t\t\t\t\tnumFiles: 0,\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tchildrenFiles.push(create(LsDirectoryTreeNode_FileSchema, { name }));\n\t\t}\n\t}\n\n\tconst root = create(LsDirectoryTreeNodeSchema, {\n\t\tabsPath: rootPath,\n\t\tchildrenDirs,\n\t\tchildrenFiles,\n\t\tchildrenWereProcessed: true,\n\t\tfullSubtreeExtensionCounts: {},\n\t\tnumFiles: childrenFiles.length,\n\t});\n\n\treturn create(LsResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(LsSuccessSchema, { directoryTreeRoot: root }),\n\t\t},\n\t});\n}\n\nfunction buildLsErrorResult(path: string, error: string) {\n\treturn create(LsResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"error\",\n\t\t\tvalue: create(LsErrorSchema, { path, error }),\n\t\t},\n\t});\n}\n\nfunction buildLsRejectedResult(path: string, reason: string) {\n\treturn create(LsResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"rejected\",\n\t\t\tvalue: create(LsRejectedSchema, { path, reason }),\n\t\t},\n\t});\n}\n\nfunction buildGrepResultFromToolResult(\n\targs: { pattern: string; path?: string; outputMode?: string; offset?: number },\n\ttoolResult: ToolResultMessage,\n) {\n\tconst text = toolResultToText(toolResult);\n\tif (toolResult.isError) {\n\t\treturn buildGrepErrorResult(text || \"Grep failed\");\n\t}\n\n\tconst outputMode = args.outputMode || \"content\";\n\tconst clientTruncated = toolResultDetailBoolean(toolResult, \"truncated\");\n\tconst lines = text\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trimEnd())\n\t\t.filter((line) => line.length > 0 && !line.startsWith(\"[\") && !line.toLowerCase().startsWith(\"no matches\"));\n\n\tconst workspaceKey = args.path || \".\";\n\tlet unionResult: GrepUnionResult;\n\n\tif (outputMode === \"files_with_matches\") {\n\t\tconst files = lines;\n\t\tunionResult = create(GrepUnionResultSchema, {\n\t\t\tresult: {\n\t\t\t\tcase: \"files\",\n\t\t\t\tvalue: create(GrepFilesResultSchema, {\n\t\t\t\t\tfiles,\n\t\t\t\t\ttotalFiles: files.length,\n\t\t\t\t\tclientTruncated,\n\t\t\t\t\tripgrepTruncated: false,\n\t\t\t\t\toffsetApplied: args.offset,\n\t\t\t\t}),\n\t\t\t},\n\t\t});\n\t} else if (outputMode === \"count\") {\n\t\tconst counts = lines\n\t\t\t.map((line) => {\n\t\t\t\tconst separatorIndex = line.lastIndexOf(\":\");\n\t\t\t\tif (separatorIndex === -1) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst file = line.slice(0, separatorIndex);\n\t\t\t\tconst count = Number.parseInt(line.slice(separatorIndex + 1), 10);\n\t\t\t\tif (!file || Number.isNaN(count)) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\treturn create(GrepFileCountSchema, { file, count });\n\t\t\t})\n\t\t\t.filter((entry): entry is GrepFileCount => entry !== null);\n\t\tconst totalMatches = counts.reduce((sum, entry) => sum + entry.count, 0);\n\t\tunionResult = create(GrepUnionResultSchema, {\n\t\t\tresult: {\n\t\t\t\tcase: \"count\",\n\t\t\t\tvalue: create(GrepCountResultSchema, {\n\t\t\t\t\tcounts,\n\t\t\t\t\ttotalFiles: counts.length,\n\t\t\t\t\ttotalMatches,\n\t\t\t\t\tclientTruncated,\n\t\t\t\t\tripgrepTruncated: false,\n\t\t\t\t\toffsetApplied: args.offset,\n\t\t\t\t}),\n\t\t\t},\n\t\t});\n\t} else {\n\t\tconst matchMap = new Map<string, Array<{ line: number; content: string; isContextLine: boolean }>>();\n\t\tlet totalMatchedLines = 0;\n\n\t\tfor (const line of lines) {\n\t\t\tconst matchLine = line.match(/^(.+?):(\\d+):\\s?(.*)$/);\n\t\t\tconst contextLine = line.match(/^(.+?)-(\\d+)-\\s?(.*)$/);\n\t\t\tconst match = matchLine ?? contextLine;\n\t\t\tif (!match) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst [, file, lineNumber, content] = match;\n\t\t\tconst isContextLine = Boolean(contextLine);\n\t\t\tconst list = matchMap.get(file) ?? [];\n\t\t\tlist.push({ line: Number(lineNumber), content, isContextLine });\n\t\t\tmatchMap.set(file, list);\n\t\t\tif (!isContextLine) {\n\t\t\t\ttotalMatchedLines += 1;\n\t\t\t}\n\t\t}\n\n\t\tconst matches = Array.from(matchMap.entries()).map(([file, fileMatches]) =>\n\t\t\tcreate(GrepFileMatchSchema, {\n\t\t\t\tfile,\n\t\t\t\tmatches: fileMatches.map((entry) =>\n\t\t\t\t\tcreate(GrepContentMatchSchema, {\n\t\t\t\t\t\tlineNumber: entry.line,\n\t\t\t\t\t\tcontent: entry.content,\n\t\t\t\t\t\tcontentTruncated: false,\n\t\t\t\t\t\tisContextLine: entry.isContextLine,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t}),\n\t\t);\n\t\tconst totalLines = matches.reduce((sum, entry) => sum + entry.matches.length, 0);\n\t\tunionResult = create(GrepUnionResultSchema, {\n\t\t\tresult: {\n\t\t\t\tcase: \"content\",\n\t\t\t\tvalue: create(GrepContentResultSchema, {\n\t\t\t\t\tmatches,\n\t\t\t\t\ttotalLines,\n\t\t\t\t\ttotalMatchedLines,\n\t\t\t\t\tclientTruncated,\n\t\t\t\t\tripgrepTruncated: false,\n\t\t\t\t\toffsetApplied: args.offset,\n\t\t\t\t}),\n\t\t\t},\n\t\t});\n\t}\n\n\treturn create(GrepResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(GrepSuccessSchema, {\n\t\t\t\tpattern: args.pattern,\n\t\t\t\tpath: args.path || \"\",\n\t\t\t\toutputMode,\n\t\t\t\tworkspaceResults: { [workspaceKey]: unionResult },\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction buildGrepErrorResult(error: string) {\n\treturn create(GrepResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"error\",\n\t\t\tvalue: create(GrepErrorSchema, { error }),\n\t\t},\n\t});\n}\n\n/**\n * Reject a Cursor exec-channel `grepArgs` frame whose `pattern` is empty or\n * whitespace-only. Returns an actionable error message (with a `glob`-aware\n * hint when the model likely meant to list files) or `null` when the pattern\n * is valid and grep should run. Exported for tests.\n */\nexport function emptyGrepPatternRejection(pattern: string | undefined, glob: string | undefined): string | null {\n\tif (pattern && pattern.trim().length > 0) return null;\n\tif (glob && glob.length > 0) {\n\t\treturn (\n\t\t\t`grep pattern is required (received an empty pattern). To list files matching \"${glob}\", ` +\n\t\t\t`pass a non-empty regex (e.g. \".\") and set path to that glob, or use the ls/read tool instead.`\n\t\t);\n\t}\n\treturn \"grep pattern is required (received an empty pattern).\";\n}\n\nfunction buildDiagnosticsResultFromToolResult(path: string, toolResult: ToolResultMessage) {\n\tconst text = toolResultToText(toolResult);\n\tif (toolResult.isError) {\n\t\treturn buildDiagnosticsErrorResult(path, text || \"Diagnostics failed\");\n\t}\n\treturn create(DiagnosticsResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(DiagnosticsSuccessSchema, {\n\t\t\t\tpath,\n\t\t\t\tdiagnostics: [],\n\t\t\t\ttotalDiagnostics: 0,\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction buildDiagnosticsErrorResult(_path: string, error: string) {\n\treturn create(DiagnosticsResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"error\",\n\t\t\tvalue: create(DiagnosticsErrorSchema, { error }),\n\t\t},\n\t});\n}\n\nfunction buildDiagnosticsRejectedResult(path: string, reason: string) {\n\treturn create(DiagnosticsResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"rejected\",\n\t\t\tvalue: create(DiagnosticsRejectedSchema, { path, reason }),\n\t\t},\n\t});\n}\n\nfunction parseToolArgsJson(text: string): unknown {\n\tconst trimmed = text.trim();\n\tif (!trimmed) {\n\t\treturn text;\n\t}\n\ttry {\n\t\treturn parseJsonWithRepair<unknown>(trimmed);\n\t} catch {\n\t\treturn text;\n\t}\n}\n\nfunction decodeMcpArgValue(value: Uint8Array): unknown {\n\ttry {\n\t\tconst parsedValue = fromBinary(ValueSchema, value);\n\t\tconst jsonValue = toJson(ValueSchema, parsedValue) as PbJsonValue;\n\t\tif (typeof jsonValue === \"string\") {\n\t\t\treturn parseToolArgsJson(jsonValue);\n\t\t}\n\t\treturn jsonValue;\n\t} catch {}\n\tconst text = new TextDecoder().decode(value);\n\treturn parseToolArgsJson(text);\n}\n\nfunction decodeMcpArgsMap(args?: Record<string, Uint8Array>): Record<string, unknown> | undefined {\n\tif (!args) {\n\t\treturn undefined;\n\t}\n\tconst decoded: Record<string, unknown> = {};\n\tfor (const [key, value] of Object.entries(args)) {\n\t\tdecoded[key] = decodeMcpArgValue(value);\n\t}\n\treturn decoded;\n}\n\nfunction decodeMcpCall(args: {\n\tname: string;\n\targs: Record<string, Uint8Array>;\n\ttoolCallId: string;\n\tproviderIdentifier: string;\n\ttoolName: string;\n\tsmartModeApprovalOnly?: boolean;\n}): CursorMcpCall {\n\tconst decodedArgs: Record<string, unknown> = {};\n\tfor (const [key, value] of Object.entries(args.args ?? {})) {\n\t\tdecodedArgs[key] = decodeMcpArgValue(value);\n\t}\n\treturn {\n\t\tname: args.name,\n\t\tproviderIdentifier: args.providerIdentifier,\n\t\ttoolName: args.toolName || args.name,\n\t\ttoolCallId: args.toolCallId,\n\t\targs: decodedArgs,\n\t\trawArgs: args.args ?? {},\n\t\tapprovalOnly: args.smartModeApprovalOnly === true,\n\t};\n}\n\n/**\n * Map Cursor's `TodoStatus` enum onto display statuses. Cancelled (4) maps to\n * `abandoned` rather than collapsing to `pending`, which would resurrect a\n * task the model explicitly cancelled.\n */\nfunction mapTodoStatusValue(status?: number): \"pending\" | \"in_progress\" | \"completed\" | \"abandoned\" {\n\tswitch (status) {\n\t\tcase 2:\n\t\t\treturn \"in_progress\";\n\t\tcase 3:\n\t\t\treturn \"completed\";\n\t\tcase 4:\n\t\t\treturn \"abandoned\";\n\t\tdefault:\n\t\t\treturn \"pending\";\n\t}\n}\n\ninterface CursorTodoItem {\n\tid?: string;\n\tcontent?: string;\n\tstatus?: number;\n\tdependencies?: string[];\n}\n\ninterface CursorTodoResult {\n\tresult?: {\n\t\tcase?: \"success\" | \"error\";\n\t\tvalue?: { todos?: CursorTodoItem[]; totalCount?: number; wasMerge?: boolean; error?: string };\n\t};\n}\n\ninterface CursorUpdateTodosCall {\n\targs?: { todos?: CursorTodoItem[]; merge?: boolean };\n\tresult?: CursorTodoResult;\n}\n\ninterface CursorReadTodosCall {\n\targs?: { statusFilter?: number[]; idFilter?: string[] };\n\tresult?: CursorTodoResult;\n}\n\n/**\n * `ToolCall` is a protobuf oneof, so a decoded message exposes the selected\n * variant as `tool: { case, value }` — NOT as a named property. Hand-built\n * fixtures use the flattened form, so both are accepted here.\n */\ninterface CursorTodoToolCall {\n\ttool?: { case?: string; value?: unknown };\n\tupdateTodosToolCall?: CursorUpdateTodosCall;\n\treadTodosToolCall?: CursorReadTodosCall;\n}\n\nfunction selectTodoCalls(toolCall: CursorTodoToolCall): {\n\tupdate?: CursorUpdateTodosCall;\n\tread?: CursorReadTodosCall;\n} {\n\tconst oneof = toolCall.tool;\n\tif (oneof?.case === \"updateTodosToolCall\") return { update: oneof.value as CursorUpdateTodosCall };\n\tif (oneof?.case === \"readTodosToolCall\") return { read: oneof.value as CursorReadTodosCall };\n\treturn { update: toolCall.updateTodosToolCall, read: toolCall.readTodosToolCall };\n}\n\nfunction mapTodoSnapshot(todos: CursorTodoItem[]) {\n\treturn todos.map((todo) => ({\n\t\tcontent: typeof todo.content === \"string\" ? todo.content : \"\",\n\t\tstatus: mapTodoStatusValue(typeof todo.status === \"number\" ? todo.status : undefined),\n\t}));\n}\n\ninterface CursorMcpToolCall {\n\targs?: {\n\t\tname?: string;\n\t\ttoolName?: string;\n\t\ttoolCallId?: string;\n\t\targs?: Record<string, Uint8Array>;\n\t};\n}\n\ninterface CursorMcpToolCallCarrier {\n\ttool?: { case?: string; value?: unknown };\n\tmcpToolCall?: CursorMcpToolCall;\n}\n\n/**\n * `ToolCall.tool` is a protobuf oneof: a wire-decoded message exposes the\n * variant as `{ case, value }` and NEVER as a flattened property. The flat\n * fallback is kept for hand-shaped test fixtures.\n */\nfunction selectMcpCall(toolCall: CursorMcpToolCallCarrier | undefined): CursorMcpToolCall | undefined {\n\tconst oneof = toolCall?.tool;\n\tif (oneof?.case === \"mcpToolCall\") return oneof.value as CursorMcpToolCall;\n\treturn toolCall?.mcpToolCall;\n}\n\n/**\n * The streamed `ToolCall` variants whose block the exec channel owns.\n *\n * Each of these is announced on the interaction stream AND dispatched as its\n * own `ExecServerMessage` frame, so the block is synthesized once, by the\n * exec handler, which is the side that has the result.\n */\nconst EXEC_OWNED_TOOL_CALL_CASES: ReadonlySet<string> = new Set([\n\t\"piReadToolCall\",\n\t\"piBashToolCall\",\n\t\"piEditToolCall\",\n\t\"piWriteToolCall\",\n\t\"piGrepToolCall\",\n\t\"piFindToolCall\",\n\t\"piLsToolCall\",\n\t\"listMcpResourcesToolCall\",\n\t\"readMcpResourceToolCall\",\n]);\n\nfunction isExecOwnedToolCall(toolCall: { tool?: { case?: string } } | undefined): boolean {\n\tconst variant = toolCall?.tool?.case;\n\treturn variant !== undefined && EXEC_OWNED_TOOL_CALL_CASES.has(variant);\n}\n\n/**\n * Close every tool-call block still open when the stream ends.\n *\n * Not just the last one started: with interleaved calls several can be open\n * at once, and an unclosed block leaves its live card animating and its call\n * unpaired. Only blocks fed by a streamed argument buffer get reparsed.\n * Server-owned blocks (`connect-scm`, `todo`) are also paired here: they are\n * stamped resolved the moment they open, so only their completion frame pairs\n * a result — a transport that closes before that frame would leave the call\n * unpaired. MCP blocks are excluded even when resolved: the exec dispatch\n * that marked them owns their result.\n */\nexport function flushOpenToolCalls(\n\toutput: AssistantMessage,\n\tstream: AssistantMessageEventStream,\n\tstate: BlockState,\n): void {\n\tconst openBlocks = new Set<ToolCallState>(state.openToolCalls.values());\n\tif (state.currentToolCall) openBlocks.add(state.currentToolCall);\n\tfor (const block of openBlocks) {\n\t\tconst idx = output.content.indexOf(block);\n\t\tconst partialJson = block[kStreamingPartialJson];\n\t\tif (partialJson !== undefined) {\n\t\t\tblock.arguments = parseStreamingJson(partialJson);\n\t\t\tclearStreamingPartialJson(block);\n\t\t}\n\t\tconst kind = block[kStreamingBlockKind];\n\t\tif (kind === \"connect-scm\" || kind === \"todo\") {\n\t\t\tvoid state.onToolResult?.({\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: block.id,\n\t\t\t\ttoolName: block.name,\n\t\t\t\tcontent: [{ type: \"text\", text: \"The connection to Cursor closed before this call completed.\" }],\n\t\t\t\tisError: true,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t}\n\t\tstream.push({ type: \"toolcall_end\", contentIndex: idx, toolCall: block, partial: output });\n\t}\n\tstate.openToolCalls.clear();\n\tstate.setToolCall(null);\n}\n\n/**\n * Retain a freshly opened streamed tool-call block, keyed by the interaction\n * envelope's `call_id`. `currentToolCall` is still set as the fallback for\n * frames that carry no `call_id`.\n */\nfunction retainStreamedCall(state: BlockState, block: ToolCallState, envelopeId: string | undefined): void {\n\tif (envelopeId) state.openToolCalls.set(envelopeId, block);\n\tstate.setToolCall(block);\n}\n\n/**\n * The open block a streamed update addresses, or `null` to ignore the update.\n *\n * Cursor interleaves calls: `start A, start B, complete A` is legal, so the\n * update must reach block A even though B opened last. An id naming no open\n * block is ignored rather than misapplied. A missing id falls back to the\n * current block.\n */\nfunction resolveStreamedCall(state: BlockState, envelopeId: string | undefined): ToolCallState | null {\n\tif (!envelopeId) return state.currentToolCall;\n\tconst keyed = state.openToolCalls.get(envelopeId);\n\tif (keyed) return keyed;\n\tconst current = state.currentToolCall;\n\treturn current && current[kStreamingEnvelopeId] === undefined ? current : null;\n}\n\n/** Release a settled block from both the keyed map and the current slot. */\nfunction releaseStreamedCall(state: BlockState, block: ToolCallState): void {\n\tconst envelopeId = block[kStreamingEnvelopeId];\n\tif (envelopeId) state.openToolCalls.delete(envelopeId);\n\tif (state.currentToolCall === block) state.setToolCall(null);\n}\n\ninterface CursorConnectScmRepository {\n\towner?: string;\n\trepo?: string;\n}\n\ninterface CursorConnectScmCall {\n\targs?: {\n\t\ttoolCallId?: string;\n\t\ttarget?: { case?: string; value?: { repository?: CursorConnectScmRepository } };\n\t\tgithub?: { repository?: CursorConnectScmRepository };\n\t};\n\tresult?: { result?: { case?: string; value?: { error?: string; reason?: string } } };\n}\n\ninterface CursorConnectScmCarrier {\n\ttool?: { case?: string; value?: unknown };\n\tconnectScmToolCall?: CursorConnectScmCall;\n}\n\nfunction selectConnectScmCall(toolCall: CursorConnectScmCarrier | undefined): CursorConnectScmCall | undefined {\n\tconst oneof = toolCall?.tool;\n\tif (oneof?.case === \"connectScmToolCall\") return oneof.value as CursorConnectScmCall;\n\treturn toolCall?.connectScmToolCall;\n}\n\nfunction selectConnectScmRepository(call: CursorConnectScmCall | undefined): CursorConnectScmRepository | undefined {\n\tconst target = call?.args?.target;\n\tif (target?.case === \"github\") return target.value?.repository;\n\treturn call?.args?.github?.repository;\n}\n\n/** Render a settled `ConnectScmResult` as the text of its paired tool result. */\nfunction describeConnectScmResult(call: CursorConnectScmCall | undefined): { text: string; isError: boolean } {\n\tconst result = call?.result?.result;\n\tswitch (result?.case) {\n\t\tcase \"success\":\n\t\t\treturn { text: \"SCM connected\", isError: false };\n\t\tcase \"error\":\n\t\t\treturn { text: result.value?.error || \"SCM connection failed\", isError: true };\n\t\tcase \"rejected\":\n\t\t\treturn { text: result.value?.reason || \"SCM connection rejected\", isError: true };\n\t\tdefault:\n\t\t\treturn { text: \"SCM connection reported no result\", isError: true };\n\t}\n}\n\n/**\n * Extract the authoritative full todo list from a completed native todo call.\n * Only `result.success.todos` is authoritative; filtered/partial/ambiguous\n * responses return `null`, which the caller MUST treat as \"nothing to mirror\".\n */\nfunction extractTodoSnapshot(\n\ttoolCall: CursorTodoToolCall,\n): { todos: ReturnType<typeof mapTodoSnapshot>; merged: boolean } | null {\n\tconst { update, read } = selectTodoCalls(toolCall);\n\tif (read && ((read.args?.statusFilter?.length ?? 0) > 0 || (read.args?.idFilter?.length ?? 0) > 0)) {\n\t\treturn null;\n\t}\n\tconst call = update ?? read;\n\tif (!call) return null;\n\tconst result = call.result?.result;\n\tif (result?.case !== \"success\") return null;\n\tconst todos = result.value?.todos;\n\tif (!todos) return null;\n\tconst totalCount = result.value?.totalCount;\n\tif (typeof totalCount === \"number\" && totalCount !== todos.length) {\n\t\treturn null;\n\t}\n\tif (read && todos.length === 0) {\n\t\treturn null;\n\t}\n\tconst mapped = mapTodoSnapshot(todos);\n\tif (mapped.some((todo) => todo.content.length === 0)) return null;\n\treturn {\n\t\ttodos: mapped,\n\t\tmerged: result.value?.wasMerge === true,\n\t};\n}\n\n/** Error text when the server itself rejected the call. */\nfunction extractTodoError(toolCall: CursorTodoToolCall): string | null {\n\tconst { update, read } = selectTodoCalls(toolCall);\n\tconst result = (update ?? read)?.result?.result;\n\tif (result?.case !== \"error\") return null;\n\tconst error = result.value?.error;\n\treturn typeof error === \"string\" && error.length > 0 ? error : \"Todo operation failed\";\n}\n\n/** Args echoed onto the synthesized display block, for rendering only. */\nfunction buildTodoDisplayArgs(toolCall: CursorTodoToolCall): {\n\ttodos: ReturnType<typeof mapTodoSnapshot>;\n\tmerge?: boolean;\n} {\n\tconst args = selectTodoCalls(toolCall).update?.args;\n\treturn {\n\t\ttodos: args?.todos ? mapTodoSnapshot(args.todos) : [],\n\t\tmerge: args?.merge === true ? true : undefined,\n\t};\n}\n\n/**\n * Paired result for a server-resolved native todo call. Nothing else would\n * produce a `toolResult` for the block — and transcript rebuilds strip any\n * `toolCall` left unpaired.\n */\nfunction buildTodoToolResult(\n\ttoolCallId: string,\n\tsnapshot: { todos: ReturnType<typeof mapTodoSnapshot> } | null,\n\terror: string | null,\n): ToolResultMessage {\n\tconst text = error ?? (snapshot ? formatTodoSnapshotSummary(snapshot.todos) : \"Todo snapshot not mirrored\");\n\treturn {\n\t\trole: \"toolResult\",\n\t\ttoolCallId,\n\t\ttoolName: \"todo\",\n\t\tcontent: [{ type: \"text\", text }],\n\t\tisError: error !== null,\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nfunction formatTodoSnapshotSummary(todos: { status: string }[]): string {\n\tif (todos.length === 0) return \"No todos\";\n\tconst done = todos.filter((todo) => todo.status === \"completed\").length;\n\treturn `${done}/${todos.length} tasks completed`;\n}\n\nfunction buildMcpResultFromToolResult(_mcpCall: CursorMcpCall, toolResult: ToolResultMessage) {\n\tif (toolResult.isError) {\n\t\treturn buildMcpErrorResult(toolResultToText(toolResult) || \"MCP tool failed\");\n\t}\n\tconst content = toolResult.content.map((item) => {\n\t\tif (item.type === \"image\") {\n\t\t\treturn create(McpToolResultContentItemSchema, {\n\t\t\t\tcontent: {\n\t\t\t\t\tcase: \"image\",\n\t\t\t\t\tvalue: create(McpImageContentSchema, {\n\t\t\t\t\t\tdata: Uint8Array.from(Buffer.from(item.data, \"base64\")),\n\t\t\t\t\t\tmimeType: item.mimeType,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\treturn create(McpToolResultContentItemSchema, {\n\t\t\tcontent: {\n\t\t\t\tcase: \"text\",\n\t\t\t\tvalue: create(McpTextContentSchema, { text: item.text }),\n\t\t\t},\n\t\t});\n\t});\n\n\treturn create(McpResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(McpSuccessSchema, {\n\t\t\t\tcontent,\n\t\t\t\tisError: false,\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction buildMcpToolNotFoundResult(mcpCall: CursorMcpCall) {\n\treturn create(McpResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"toolNotFound\",\n\t\t\tvalue: create(McpToolNotFoundSchema, { name: mcpCall.toolName, availableTools: [] }),\n\t\t},\n\t});\n}\n\nfunction buildMcpErrorResult(error: string) {\n\treturn create(McpResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"error\",\n\t\t\tvalue: create(McpErrorSchema, { error }),\n\t\t},\n\t});\n}\n\n/**\n * Merge the decoded completion-frame `McpArgs` map into the args assembled\n * from streamed `args_text_delta` snapshots.\n *\n * The completion frame is authoritative for the scalars it carries — but it\n * can omit oversized parameters entirely and can downgrade a structured value\n * to its raw string fallback. Rules per key:\n * - completion key absent → keep the streamed value.\n * - completion is a string while the streamed value is structured → keep the\n * streamed value (the completion frame downgraded it).\n * - otherwise → completion wins.\n */\nexport function mergeCursorMcpToolCallArgs(\n\tstreamed: Record<string, unknown> | undefined,\n\tcompletion: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n\tconst merged: Record<string, unknown> = { ...(streamed ?? {}) };\n\tif (!completion) return merged;\n\tfor (const [key, completionValue] of Object.entries(completion)) {\n\t\tconst streamedValue = merged[key];\n\t\tif (typeof completionValue === \"string\" && streamedValue !== null && typeof streamedValue === \"object\") {\n\t\t\tcontinue;\n\t\t}\n\t\tmerged[key] = completionValue;\n\t}\n\treturn merged;\n}\n\nfunction endCurrentTextBlock(output: AssistantMessage, stream: AssistantMessageEventStream, state: BlockState): void {\n\tconst block = state.currentTextBlock;\n\tif (!block) return;\n\tconst idx = output.content.indexOf(block);\n\tstream.push({\n\t\ttype: \"text_end\",\n\t\tcontentIndex: idx,\n\t\tcontent: block.text,\n\t\tpartial: output,\n\t});\n\tstate.setTextBlock(null);\n}\n\nfunction endCurrentThinkingBlock(\n\toutput: AssistantMessage,\n\tstream: AssistantMessageEventStream,\n\tstate: BlockState,\n): void {\n\tconst block = state.currentThinkingBlock;\n\tif (!block) return;\n\tconst idx = output.content.indexOf(block);\n\tstream.push({\n\t\ttype: \"thinking_end\",\n\t\tcontentIndex: idx,\n\t\tcontent: block.thinking,\n\t\tpartial: output,\n\t});\n\tstate.setThinkingBlock(null);\n}\n\n/**\n * Synthesize a completed `toolCall` content block for a Cursor exec-channel\n * native tool or for an MCP exec frame whose corresponding interaction block\n * is absent.\n *\n * Args arrive complete on the exec message, so the block opens and closes in\n * one step. Without this the persisted assistant message carries only\n * text/thinking blocks, and on replay the following `toolResult` messages\n * have no matching `toolCall.id`.\n *\n * The block is stamped with {@link kCursorExecResolved} so the agent loop's\n * execution pass skips it — Cursor's server-driven exec channel already ran\n * the tool via the bridge and buffered the result. Exported for tests.\n */\nexport function synthesizeCursorExecToolCall(\n\toutput: AssistantMessage,\n\tstream: AssistantMessageEventStream,\n\tstate: BlockState,\n\ttoolCallId: string,\n\ttoolName: string,\n\targs: Record<string, unknown>,\n): void {\n\tendCurrentTextBlock(output, stream, state);\n\tendCurrentThinkingBlock(output, stream, state);\n\tconst block: ToolCallState = {\n\t\ttype: \"toolCall\",\n\t\tid: toolCallId,\n\t\tname: toolName,\n\t\targuments: omitUndefinedArgs(args),\n\t\t[kStreamingBlockIndex]: output.content.length,\n\t\t[kStreamingBlockKind]: \"cursor-exec\",\n\t\t[kCursorExecResolved]: true,\n\t};\n\toutput.content.push(block);\n\tconst idx = output.content.length - 1;\n\tstream.push({ type: \"toolcall_start\", contentIndex: idx, partial: output });\n\tstream.push({ type: \"toolcall_end\", contentIndex: idx, toolCall: block, partial: output });\n}\n\n/**\n * Pair a `toolResult` for a synthesized block the client answered itself,\n * without ever consulting a handler. Frames answered from a fixed verdict —\n * no handler, no local execution — still need the pair: the block was stamped\n * {@link kCursorExecResolved}, so the agent loop emits no placeholder for it\n * and transcript rebuilds strip an unpaired call.\n */\nasync function pairSynthesizedExecResult(\n\tstate: BlockState,\n\tonToolResult: CursorToolResultHandler | undefined,\n\ttoolCallId: string,\n\ttoolName: string,\n\ttext: string,\n\tisError = true,\n): Promise<void> {\n\tconst synthesized: ToolResultMessage = {\n\t\trole: \"toolResult\",\n\t\ttoolCallId,\n\t\ttoolName,\n\t\tcontent: [{ type: \"text\", text }],\n\t\tisError,\n\t\ttimestamp: Date.now(),\n\t};\n\tconst sink = onToolResult ?? state.onToolResult;\n\tif (!sink) return;\n\tawait sink(synthesized);\n}\n\n/**\n * Throttle threshold for mid-stream argument JSON parses: reparse only when\n * the buffer grew by this much since the last successful parse, keeping total\n * parse work bounded while the authoritative full parse runs on completion.\n */\nconst STREAMING_ARGS_REPARSE_DELTA = 1024;\n\n/** Exported for tests: drives one Cursor interaction update through the streaming state machine. */\nexport function processInteractionUpdate(\n\tupdate: any,\n\toutput: AssistantMessage,\n\tstream: AssistantMessageEventStream,\n\tstate: BlockState,\n\tusageState: UsageState,\n): void {\n\tconst updateCase = update.message?.case;\n\n\tlog(\"interactionUpdate\", updateCase);\n\n\tif (updateCase === \"textDelta\") {\n\t\tconst delta = update.message.value.text || \"\";\n\t\tif (!state.currentTextBlock) {\n\t\t\tconst block: TextContent & { [kStreamingBlockIndex]: number } = {\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: \"\",\n\t\t\t\t[kStreamingBlockIndex]: output.content.length,\n\t\t\t};\n\t\t\toutput.content.push(block);\n\t\t\tstate.setTextBlock(block);\n\t\t\tstream.push({ type: \"text_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t}\n\t\tstate.currentTextBlock!.text += delta;\n\t\tconst idx = output.content.indexOf(state.currentTextBlock!);\n\t\tstream.push({ type: \"text_delta\", contentIndex: idx, delta, partial: output });\n\t} else if (updateCase === \"thinkingDelta\") {\n\t\tconst delta = update.message.value.text || \"\";\n\t\tif (!state.currentThinkingBlock) {\n\t\t\tconst block: ThinkingContent & { [kStreamingBlockIndex]: number } = {\n\t\t\t\ttype: \"thinking\",\n\t\t\t\tthinking: \"\",\n\t\t\t\t[kStreamingBlockIndex]: output.content.length,\n\t\t\t};\n\t\t\toutput.content.push(block);\n\t\t\tstate.setThinkingBlock(block);\n\t\t\tstream.push({ type: \"thinking_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t}\n\t\tstate.currentThinkingBlock!.thinking += delta;\n\t\tconst idx = output.content.indexOf(state.currentThinkingBlock!);\n\t\tstream.push({ type: \"thinking_delta\", contentIndex: idx, delta, partial: output });\n\t} else if (updateCase === \"thinkingCompleted\") {\n\t\tendCurrentThinkingBlock(output, stream, state);\n\t} else if (updateCase === \"toolCallStarted\" && selectConnectScmCall(update.message.value.toolCall)) {\n\t\t// `connect_scm` is resolved entirely server-side and has NO exec frame:\n\t\t// the streamed pair is the only signal this client sees. The\n\t\t// authoritative outcome rides on the COMPLETION's `result` oneof, so the\n\t\t// block is opened here and settled there.\n\t\tendCurrentTextBlock(output, stream, state);\n\t\tendCurrentThinkingBlock(output, stream, state);\n\t\tconst scmCall = selectConnectScmCall(update.message.value.toolCall);\n\t\tconst repository = selectConnectScmRepository(scmCall);\n\t\tconst block: ToolCallState = {\n\t\t\ttype: \"toolCall\",\n\t\t\tid: scmCall?.args?.toolCallId || update.message.value.callId || randomUUID(),\n\t\t\tname: \"connect_scm\",\n\t\t\targuments: repository ? { owner: repository.owner, repo: repository.repo } : {},\n\t\t\t[kStreamingBlockIndex]: output.content.length,\n\t\t\t[kStreamingBlockKind]: \"connect-scm\",\n\t\t\t[kStreamingEnvelopeId]: update.message.value.callId || undefined,\n\t\t\t[kCursorExecResolved]: true,\n\t\t};\n\t\toutput.content.push(block);\n\t\tretainStreamedCall(state, block, update.message.value.callId);\n\t\tstream.push({ type: \"toolcall_start\", contentIndex: output.content.length - 1, partial: output });\n\t} else if (updateCase === \"toolCallStarted\" && isExecOwnedToolCall(update.message.value.toolCall)) {\n\t\t// The exec channel already synthesized this block (and marked it\n\t\t// resolved) when it ran the tool locally, so the streamed announcement\n\t\t// must not create a second one.\n\t\tendCurrentTextBlock(output, stream, state);\n\t\tendCurrentThinkingBlock(output, stream, state);\n\t\tlog(\"exec\", \"streamedToolCallOwnedByExec\", { case: update.message.value.toolCall?.tool?.case });\n\t} else if (updateCase === \"toolCallStarted\") {\n\t\tendCurrentTextBlock(output, stream, state);\n\t\tendCurrentThinkingBlock(output, stream, state);\n\t\tconst toolCall = update.message.value.toolCall;\n\t\tif (toolCall) {\n\t\t\tconst mcpCall = selectMcpCall(toolCall);\n\t\t\tif (mcpCall) {\n\t\t\t\tconst args = mcpCall.args || {};\n\t\t\t\tconst id = args.toolCallId || randomUUID();\n\t\t\t\tconst resolvedByExec = state.resolvedMcpToolCallIds.delete(id);\n\t\t\t\tif (resolvedByExec && output.content.some((block) => block.type === \"toolCall\" && block.id === id)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst block: ToolCallState = {\n\t\t\t\t\ttype: \"toolCall\",\n\t\t\t\t\tid,\n\t\t\t\t\t// Same precedence as `decodeMcpCall` (`toolName || name`), which\n\t\t\t\t\t// is what the exec channel pairs its result under.\n\t\t\t\t\tname: args.toolName || args.name || \"\",\n\t\t\t\t\targuments: {},\n\t\t\t\t\t[kStreamingBlockIndex]: output.content.length,\n\t\t\t\t\t[kStreamingPartialJson]: \"\",\n\t\t\t\t\t[kStreamingBlockKind]: \"mcp\",\n\t\t\t\t\t[kStreamingEnvelopeId]: update.message.value.callId || undefined,\n\t\t\t\t};\n\t\t\t\tif (resolvedByExec) {\n\t\t\t\t\tmarkCursorExecResolved(block);\n\t\t\t\t}\n\t\t\t\toutput.content.push(block);\n\t\t\t\tretainStreamedCall(state, block, update.message.value.callId);\n\t\t\t\tstream.push({ type: \"toolcall_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Cursor resolves `update_todos` / `read_todos` server-side and\n\t\t\t// settles them on the tool call's `result`. Both blocks are stamped\n\t\t\t// resolved so the agent loop never runs them locally.\n\t\t\tconst todoCalls = selectTodoCalls(toolCall);\n\t\t\tif (todoCalls.update || todoCalls.read) {\n\t\t\t\tconst callId = update.message.value.callId || randomUUID();\n\t\t\t\tconst block: ToolCallState = {\n\t\t\t\t\ttype: \"toolCall\",\n\t\t\t\t\tid: callId,\n\t\t\t\t\tname: \"todo\",\n\t\t\t\t\targuments: buildTodoDisplayArgs(toolCall),\n\t\t\t\t\t[kStreamingBlockIndex]: output.content.length,\n\t\t\t\t\t[kStreamingBlockKind]: \"todo\",\n\t\t\t\t\t[kStreamingEnvelopeId]: update.message.value.callId || undefined,\n\t\t\t\t\t[kCursorExecResolved]: true,\n\t\t\t\t};\n\t\t\t\toutput.content.push(block);\n\t\t\t\tretainStreamedCall(state, block, update.message.value.callId);\n\t\t\t\tstream.push({ type: \"toolcall_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t}\n\t\t}\n\t} else if (updateCase === \"toolCallDelta\" || updateCase === \"partialToolCall\") {\n\t\t// An argument delta belonging to a different call must not be appended\n\t\t// to this block's buffer, which would corrupt the JSON both parse.\n\t\tconst target = resolveStreamedCall(state, update.message.value.callId);\n\t\tif (target?.[kStreamingBlockKind] === \"mcp\") {\n\t\t\t// Cursor's `args_text_delta` is \"aggregated args text so far\": each\n\t\t\t// delta is a cumulative snapshot. Strip the prefix we already have to\n\t\t\t// recover the new suffix; fall back to treating the value as an\n\t\t\t// incremental fragment when it doesn't extend the buffer.\n\t\t\tconst snapshot: string = update.message.value.argsTextDelta || \"\";\n\t\t\tconst current = target[kStreamingPartialJson] ?? \"\";\n\t\t\tconst chunk = snapshot.startsWith(current) ? snapshot.slice(current.length) : snapshot;\n\t\t\tif (chunk.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst nextBuffer = current + chunk;\n\t\t\ttarget[kStreamingPartialJson] = nextBuffer;\n\t\t\t// Throttle mid-stream parses to keep total parse work bounded; the\n\t\t\t// authoritative full parse runs in `toolCallCompleted`.\n\t\t\tconst lastParseLen = target[kStreamingLastParseLen] ?? 0;\n\t\t\tif (nextBuffer.length - lastParseLen >= STREAMING_ARGS_REPARSE_DELTA) {\n\t\t\t\ttarget.arguments = parseStreamingJson(nextBuffer);\n\t\t\t\ttarget[kStreamingLastParseLen] = nextBuffer.length;\n\t\t\t}\n\t\t\tconst idx = output.content.indexOf(target);\n\t\t\tstream.push({ type: \"toolcall_delta\", contentIndex: idx, delta: chunk, partial: output });\n\t\t}\n\t} else if (updateCase === \"toolCallCompleted\") {\n\t\t// Correlate on the envelope's `call_id`, NOT the block id: MCP, Pi and\n\t\t// SCM blocks are filed under the id inside the call's `args`, and that\n\t\t// need not equal the envelope id.\n\t\tconst settled = resolveStreamedCall(state, update.message.value.callId);\n\t\tif (settled) {\n\t\t\tconst toolCall = update.message.value.toolCall;\n\t\t\tif (settled[kStreamingBlockKind] === \"mcp\") {\n\t\t\t\t// Authoritative full parse of the accumulated argument buffer.\n\t\t\t\tconst previousArgs = settled.arguments;\n\t\t\t\tconst partial = settled[kStreamingPartialJson];\n\t\t\t\tif (partial !== undefined) {\n\t\t\t\t\tsettled.arguments = parseStreamingJson(partial);\n\t\t\t\t}\n\t\t\t\tconst decodedArgs = decodeMcpArgsMap(selectMcpCall(toolCall)?.args?.args);\n\t\t\t\tsettled.arguments = mergeCursorMcpToolCallArgs(\n\t\t\t\t\tsettled.arguments as Record<string, unknown> | undefined,\n\t\t\t\t\tdecodedArgs,\n\t\t\t\t);\n\t\t\t\tif (settled.name === \"task\") {\n\t\t\t\t\tsettled.arguments = keepUsableCursorTaskArgs(previousArgs, settled.arguments);\n\t\t\t\t}\n\t\t\t} else if (settled[kStreamingBlockKind] === \"connect-scm\") {\n\t\t\t\t// The authoritative outcome arrives only here. Late args are merged\n\t\t\t\t// too — a start frame may announce the call before the target\n\t\t\t\t// repository is known.\n\t\t\t\tconst scmCall = selectConnectScmCall(toolCall);\n\t\t\t\tconst repository = selectConnectScmRepository(scmCall);\n\t\t\t\tif (repository) {\n\t\t\t\t\tsettled.arguments = { owner: repository.owner, repo: repository.repo };\n\t\t\t\t}\n\t\t\t\tconst { text, isError } = describeConnectScmResult(scmCall);\n\t\t\t\tvoid state.onToolResult?.({\n\t\t\t\t\trole: \"toolResult\",\n\t\t\t\t\ttoolCallId: settled.id,\n\t\t\t\t\ttoolName: \"connect_scm\",\n\t\t\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\t\t\tisError,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t});\n\t\t\t} else if (settled[kStreamingBlockKind] === \"todo\") {\n\t\t\t\t// Only the server's success snapshot is authoritative. A completion\n\t\t\t\t// frame whose optional `toolCall` is absent still settles: the block\n\t\t\t\t// is already marked resolved, so nothing downstream pairs it.\n\t\t\t\tconst snapshot = toolCall ? extractTodoSnapshot(toolCall) : null;\n\t\t\t\tconst error = toolCall ? extractTodoError(toolCall) : null;\n\t\t\t\tif (snapshot) {\n\t\t\t\t\tsettled.arguments = { todos: snapshot.todos, merged: snapshot.merged };\n\t\t\t\t}\n\t\t\t\tvoid state.onToolResult?.(buildTodoToolResult(settled.id, snapshot, error));\n\t\t\t}\n\t\t\tconst idx = output.content.indexOf(settled);\n\t\t\tclearStreamingPartialJson(settled);\n\t\t\tstream.push({ type: \"toolcall_end\", contentIndex: idx, toolCall: settled, partial: output });\n\t\t\treleaseStreamedCall(state, settled);\n\t\t}\n\t} else if (updateCase === \"turnEnded\") {\n\t\toutput.stopReason = \"stop\";\n\t\tapplyBilledTurnEndedUsage(update.message.value, output, usageState);\n\t} else if (updateCase === \"tokenDelta\") {\n\t\tconst tokenDelta = update.message.value;\n\t\tusageState.sawTokenDelta = true;\n\t\toutput.usage.output += tokenDelta.tokens || 0;\n\t\toutput.usage.totalTokens =\n\t\t\toutput.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;\n\t}\n}\n\n/**\n * Cursor's production schema (cursor-agent 2026.08.11) carries the billed\n * token split on `turnEnded`: 1 input, 2 output, 3 cache read, 4 cache write,\n * 5 reasoning (optional int64). Live probes against api2.cursor.sh show\n * input_tokens is cache-INCLUSIVE (turn 1: input 21357 ≈ cacheWrite 21354;\n * turn 2: input 17989 ≈ cacheRead 17575 + cacheWrite 411), so the uncached\n * remainder is backed out for senpi's exclusive `usage.input`. The billed\n * split is authoritative for context accounting; the tokenDelta-accumulated\n * output is kept only when the server omits the billed output field.\n * Reasoning tokens are deliberately not folded into output: no other field of\n * `Usage` represents them and double counting against the billed output must\n * be avoided.\n */\nfunction applyBilledTurnEndedUsage(update: TurnEndedUpdate, output: AssistantMessage, usageState: UsageState): void {\n\tconst { inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens } = update;\n\tif (\n\t\tinputTokens === undefined &&\n\t\toutputTokens === undefined &&\n\t\tcacheReadTokens === undefined &&\n\t\tcacheWriteTokens === undefined\n\t) {\n\t\treturn;\n\t}\n\tusageState.sawTurnEndedUsage = true;\n\tconst usage = output.usage;\n\tconst cacheRead = Number(cacheReadTokens ?? 0n);\n\tconst cacheWrite = Number(cacheWriteTokens ?? 0n);\n\tconst liveUsed = usageState.liveUsedTokens ?? 0;\n\t// Cursor sometimes reports dashboard-cumulative cache_read (millions) while\n\t// usedTokens stays at the real window (~150k). Folding that into totalTokens\n\t// forces a useless compact and then a 0-token resource_exhausted.\n\tif (liveUsed > 0 && cacheRead > liveUsed * 3) {\n\t\tif (outputTokens !== undefined) {\n\t\t\tusage.output = Number(outputTokens);\n\t\t}\n\t\tusage.cacheRead = 0;\n\t\tusage.cacheWrite = cacheWrite <= liveUsed ? cacheWrite : 0;\n\t\tusage.input = Math.max(0, liveUsed - usage.output - usage.cacheWrite);\n\t\tusage.totalTokens = liveUsed;\n\t\treturn;\n\t}\n\tusage.cacheRead = cacheRead;\n\tusage.cacheWrite = cacheWrite;\n\tusage.input = Math.max(0, Number(inputTokens ?? 0n) - usage.cacheRead - usage.cacheWrite);\n\tif (outputTokens !== undefined) {\n\t\tusage.output = Number(outputTokens);\n\t}\n\tusage.totalTokens = usage.input + usage.output + usage.cacheRead + usage.cacheWrite;\n}\n\n/**\n * A checkpoint's `tokenDetails.usedTokens` is the server's live conversation\n * size, sent mid-turn. It feeds context accounting while the turn streams,\n * but never overrides the billed turnEnded split once that arrived.\n */\nfunction applyCheckpointTokenDetails(\n\tcheckpoint: ConversationStateStructure,\n\toutput: AssistantMessage,\n\tusageState: UsageState,\n): void {\n\tif (usageState.sawTurnEndedUsage) return;\n\tconst usedTokens = checkpoint.tokenDetails?.usedTokens ?? 0;\n\tif (usedTokens <= 0) return;\n\tusageState.liveUsedTokens = usedTokens;\n\tconst usage = output.usage;\n\tusage.input = Math.max(0, usedTokens - usage.output - usage.cacheRead - usage.cacheWrite);\n\tusage.totalTokens = usage.input + usage.output + usage.cacheRead + usage.cacheWrite;\n}\n\nfunction createBlobId(data: Uint8Array): Uint8Array {\n\treturn new Uint8Array(createHash(\"sha256\").update(data).digest());\n}\n\nfunction storeCursorBlob(blobStore: Map<string, Uint8Array>, data: Uint8Array): Uint8Array {\n\tconst blobId = createBlobId(data);\n\tblobStore.set(Buffer.from(blobId).toString(\"hex\"), data);\n\treturn blobId;\n}\n\nfunction readCursorBlob(blobStore: Map<string, Uint8Array>, blobId: Uint8Array): Uint8Array {\n\tconst data = blobStore.get(Buffer.from(blobId).toString(\"hex\"));\n\tif (!data) {\n\t\tthrow new Error(\"Cursor blob not found\");\n\t}\n\treturn data;\n}\n\n/**\n * Local tools Cursor already drives natively over the exec channel, so\n * advertising them again as MCP tools would give the model two ways to call\n * the same thing.\n */\nconst CURSOR_NATIVE_TOOL_NAMES = new Set([\"bash\", \"read\", \"write\", \"delete\", \"ls\", \"grep\", \"todo\"]);\n\n/** Strip TypeBox symbol metadata down to a plain JSON Schema document. */\nfunction toolParametersToJsonSchema(tool: Tool): unknown {\n\ttry {\n\t\treturn JSON.parse(JSON.stringify(tool.parameters));\n\t} catch {\n\t\treturn { type: \"object\", properties: {}, required: [] };\n\t}\n}\n\n/**\n * JSON-Schema composition keywords Cursor's gateway cannot carry: an\n * advertised tool whose inputSchema contains `oneOf`, `anyOf`, or `allOf` is\n * rejected upstream with a wrapped provider 400 for the WHOLE request\n * (zero tokens, `resource_exhausted` end-stream). MCP tools imported from\n * external servers routinely ship such schemas (e.g. ast-grep's `scan`).\n * `not` is tolerated upstream and kept. Returns a new structure; the input is\n * never mutated.\n */\nconst CURSOR_UNSUPPORTED_SCHEMA_KEYS = new Set([\"oneOf\", \"anyOf\", \"allOf\"]);\n\nexport function sanitizeCursorToolSchema(schema: unknown): unknown {\n\tif (Array.isArray(schema)) return schema.map(sanitizeCursorToolSchema);\n\tif (schema === null || typeof schema !== \"object\") return schema;\n\tconst sanitized: Record<string, unknown> = {};\n\tfor (const [key, value] of Object.entries(schema)) {\n\t\tif (CURSOR_UNSUPPORTED_SCHEMA_KEYS.has(key)) continue;\n\t\tsanitized[key] = sanitizeCursorToolSchema(value);\n\t}\n\treturn sanitized;\n}\n\nexport function buildMcpToolDefinitions(tools: Tool[] | undefined): McpToolDefinition[] {\n\tif (!tools || tools.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst advertisedTools = tools.filter((tool) => !CURSOR_NATIVE_TOOL_NAMES.has(tool.name));\n\tif (advertisedTools.length === 0) {\n\t\treturn [];\n\t}\n\n\treturn advertisedTools.map((tool) => {\n\t\tconst jsonSchema = sanitizeCursorToolSchema(toolParametersToJsonSchema(tool));\n\t\tconst schemaValue: PbJsonValue =\n\t\t\tjsonSchema && typeof jsonSchema === \"object\"\n\t\t\t\t? (jsonSchema as PbJsonValue)\n\t\t\t\t: { type: \"object\", properties: {}, required: [] };\n\t\tconst inputSchema = toBinary(ValueSchema, fromJson(ValueSchema, schemaValue));\n\t\treturn create(McpToolDefinitionSchema, {\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description || \"\",\n\t\t\tproviderIdentifier: \"pi-agent\",\n\t\t\ttoolName: tool.name,\n\t\t\tinputSchema,\n\t\t});\n\t});\n}\n\n/** Extract text content from a user message. */\nfunction extractUserMessageText(msg: Message): string {\n\tif (msg.role !== \"user\") return \"\";\n\tconst content = msg.content;\n\tif (typeof content === \"string\") return content.trim();\n\tconst text = content\n\t\t.filter((c): c is TextContent => c.type === \"text\")\n\t\t.map((c) => c.text)\n\t\t.join(\"\\n\");\n\treturn text.trim();\n}\n\nfunction hasUserMessageImages(msg: Message): boolean {\n\treturn msg.role === \"user\" && Array.isArray(msg.content) && msg.content.some((item) => item.type === \"image\");\n}\n\ntype CursorRootPromptContentPart = { type: \"text\"; text: string } | { type: \"image\"; image: string; mediaType: string };\n\nfunction buildCursorRootPromptContent(content: string | (TextContent | ImageContent)[]): CursorRootPromptContentPart[] {\n\tif (typeof content === \"string\") {\n\t\tconst text = content.trim();\n\t\treturn text ? [{ type: \"text\", text }] : [];\n\t}\n\tconst parts: CursorRootPromptContentPart[] = [];\n\tfor (const item of content) {\n\t\tif (item.type === \"text\") {\n\t\t\tconst text = item.text.trim();\n\t\t\tif (text) {\n\t\t\t\tparts.push({ type: \"text\", text });\n\t\t\t}\n\t\t} else {\n\t\t\tparts.push({ type: \"image\", image: `data:${item.mimeType};base64,${item.data}`, mediaType: item.mimeType });\n\t\t}\n\t}\n\treturn parts;\n}\n\nfunction cursorUserContentKey(content: string | (TextContent | ImageContent)[]): string {\n\tif (typeof content === \"string\") {\n\t\treturn content.trim();\n\t}\n\tconst hash = createHash(\"sha256\");\n\tfor (const item of content) {\n\t\thash.update(item.type);\n\t\tif (item.type === \"text\") {\n\t\t\thash.update(item.text);\n\t\t} else {\n\t\t\thash.update(item.mimeType);\n\t\t\thash.update(item.data);\n\t\t}\n\t}\n\treturn hash.digest(\"hex\");\n}\n\ntype CursorRootPromptAssistantContentPart =\n\t| { type: \"text\"; text: string }\n\t| { type: \"tool-call\"; toolCallId: string; toolName: string; args: Record<string, unknown> };\n\nfunction buildCursorAssistantContent(msg: AssistantMessage): CursorRootPromptAssistantContentPart[] {\n\tconst content: CursorRootPromptAssistantContentPart[] = [];\n\tfor (const item of msg.content) {\n\t\tif (item.type === \"text\") {\n\t\t\tif (item.text) content.push({ type: \"text\", text: item.text });\n\t\t} else if (item.type === \"toolCall\") {\n\t\t\tcontent.push({\n\t\t\t\ttype: \"tool-call\",\n\t\t\t\ttoolCallId: item.id,\n\t\t\t\ttoolName: item.name,\n\t\t\t\targs: item.arguments,\n\t\t\t});\n\t\t}\n\t\t// Thinking is never replayed: Cursor manages reasoning server-side and\n\t\t// foreign/hidden reasoning must not leak into history as native thinking.\n\t}\n\treturn content;\n}\n\n/**\n * Index of the last user message in `messages`, or -1 if none. Used to\n * exclude the current user turn from history builders — it goes in the\n * `userMessageAction`, not in history structures.\n */\nfunction findLastUserMessageIndex(messages: Message[]): number {\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tif (messages[i].role === \"user\") {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n}\n\n/**\n * Build one Cursor system-message JSON blob per system prompt. When no system\n * prompt is provided, returns a single default greeting so we never emit an\n * empty `rootPromptMessagesJson` head.\n */\nexport function buildCursorSystemPromptJsons(systemPrompt: string | undefined): string[] {\n\tconst trimmed = systemPrompt?.trim();\n\tif (!trimmed) {\n\t\treturn [JSON.stringify({ role: \"system\", content: \"You are a helpful assistant.\" })];\n\t}\n\treturn [JSON.stringify({ role: \"system\", content: trimmed })];\n}\n\n/**\n * Build `ConversationStateStructure.rootPromptMessagesJson` blob IDs for the\n * system prompt plus prior conversation history, as JSON blobs matching\n * Cursor's internal Vercel-AI-SDK-shaped message format.\n *\n * Cursor's server uses `rootPromptMessagesJson` (not `turns[]`) to build the\n * actual model prompt; `turns[]` is UI/display metadata. The active user\n * message is excluded because it is sent in the action.\n */\nfunction buildRootPromptMessagesJson(\n\tmessages: Message[],\n\tsystemPromptIds: Uint8Array[],\n\tblobStore: Map<string, Uint8Array>,\n\tactiveUserMessageIndex = findLastUserMessageIndex(messages),\n): Uint8Array[] {\n\tconst entries: Uint8Array[] = [...systemPromptIds];\n\tconst pushJson = (obj: unknown) => {\n\t\tconst bytes = new TextEncoder().encode(JSON.stringify(obj));\n\t\tentries.push(storeCursorBlob(blobStore, bytes));\n\t};\n\n\tfor (let i = 0; i < messages.length; i++) {\n\t\tif (i === activeUserMessageIndex) break;\n\t\tconst msg = messages[i];\n\t\tif (msg.role === \"user\") {\n\t\t\tconst content = buildCursorRootPromptContent(msg.content);\n\t\t\tif (content.length === 0) continue;\n\t\t\tpushJson({ role: \"user\", content });\n\t\t} else if (msg.role === \"assistant\") {\n\t\t\tconst content = buildCursorAssistantContent(msg);\n\t\t\tif (content.length === 0) continue;\n\t\t\tpushJson({ role: \"assistant\", content });\n\t\t} else if (msg.role === \"toolResult\") {\n\t\t\t// Emit even when the result text is empty: the assistant `tool-call`\n\t\t\t// is already in history, so dropping the pair would replay an\n\t\t\t// orphaned call.\n\t\t\tpushJson({\n\t\t\t\trole: \"tool\",\n\t\t\t\tid: msg.toolCallId,\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"tool-result\",\n\t\t\t\t\t\ttoolName: msg.toolName,\n\t\t\t\t\t\ttoolCallId: msg.toolCallId,\n\t\t\t\t\t\tresult: toolResultToText(msg),\n\t\t\t\t\t\t...(msg.isError ? { isError: true } : {}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t}\n\t}\n\n\treturn entries;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst prototype = Object.getPrototypeOf(value);\n\treturn prototype === Object.prototype || prototype === null;\n}\n\nfunction isJsonValue(value: unknown): value is PbJsonValue {\n\tif (value === null || typeof value === \"string\" || typeof value === \"boolean\") return true;\n\tif (typeof value === \"number\") return Number.isFinite(value);\n\tif (Array.isArray(value)) return value.every(isJsonValue);\n\tif (!isPlainRecord(value)) return false;\n\tfor (const key in value) {\n\t\tif (!isJsonValue(value[key])) return false;\n\t}\n\treturn true;\n}\n\nfunction encodeCursorMcpArguments(toolCall: ToolCall): Record<string, Uint8Array> {\n\tconst encoded: Record<string, Uint8Array> = {};\n\tfor (const name in toolCall.arguments) {\n\t\tconst value = toolCall.arguments[name];\n\t\tif (value === undefined) continue;\n\t\tif (!isJsonValue(value)) {\n\t\t\tthrow new Error(`Cursor tool argument ${toolCall.name}.${name} is not JSON-serializable`);\n\t\t}\n\t\tencoded[name] = toBinary(ValueSchema, fromJson(ValueSchema, value));\n\t}\n\treturn encoded;\n}\n\nfunction createCursorMcpResult(result: ToolResultMessage) {\n\tif (result.isError) {\n\t\treturn create(McpToolResultSchema, {\n\t\t\tresult: {\n\t\t\t\tcase: \"error\",\n\t\t\t\tvalue: create(McpToolErrorSchema, { error: toolResultToText(result) }),\n\t\t\t},\n\t\t});\n\t}\n\treturn create(McpToolResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(McpSuccessSchema, {\n\t\t\t\tcontent: result.content.map((item) =>\n\t\t\t\t\titem.type === \"text\"\n\t\t\t\t\t\t? create(McpToolResultContentItemSchema, {\n\t\t\t\t\t\t\t\tcontent: { case: \"text\", value: create(McpTextContentSchema, { text: item.text }) },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: create(McpToolResultContentItemSchema, {\n\t\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\tcase: \"image\",\n\t\t\t\t\t\t\t\t\tvalue: create(McpImageContentSchema, {\n\t\t\t\t\t\t\t\t\t\tdata: Uint8Array.from(Buffer.from(item.data, \"base64\")),\n\t\t\t\t\t\t\t\t\t\tmimeType: item.mimeType,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction createCursorToolCallStep(toolCall: ToolCall, result: ToolResultMessage | undefined) {\n\tconst mcpCall = create(McpToolCallSchema, {\n\t\targs: create(McpArgsSchema, {\n\t\t\tname: toolCall.name,\n\t\t\targs: encodeCursorMcpArguments(toolCall),\n\t\t\ttoolCallId: toolCall.id,\n\t\t\tproviderIdentifier: \"pi-agent\",\n\t\t\ttoolName: toolCall.name,\n\t\t}),\n\t\t...(result ? { result: createCursorMcpResult(result) } : {}),\n\t});\n\treturn create(ConversationStepSchema, {\n\t\tmessage: {\n\t\t\tcase: \"toolCall\",\n\t\t\tvalue: create(ToolCallSchema, {\n\t\t\t\ttool: { case: \"mcpToolCall\", value: mcpCall },\n\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t}),\n\t\t},\n\t});\n}\n\n/**\n * Convert context.messages to Cursor's ConversationTurnStructure blob IDs.\n * Groups messages into turns: each turn is a user message followed by the\n * assistant's response. Excludes the active user message (which goes in the\n * action).\n */\nfunction buildConversationTurns(\n\tmessages: Message[],\n\tblobStore: Map<string, Uint8Array>,\n\tactiveUserMessageIndex = findLastUserMessageIndex(messages),\n): Uint8Array[] {\n\tconst turns: Uint8Array[] = [];\n\tconst historyEnd = activeUserMessageIndex >= 0 ? activeUserMessageIndex : messages.length;\n\tconst toolResults = new Map<string, ToolResultMessage>();\n\tconst pairedToolCallIds = new Set<string>();\n\tfor (let index = 0; index < historyEnd; index++) {\n\t\tconst message = messages[index];\n\t\tif (message.role === \"toolResult\") {\n\t\t\ttoolResults.set(message.toolCallId, message);\n\t\t} else if (message.role === \"assistant\") {\n\t\t\tfor (const item of message.content) {\n\t\t\t\tif (item.type === \"toolCall\") pairedToolCallIds.add(item.id);\n\t\t\t}\n\t\t}\n\t}\n\n\tlet i = 0;\n\twhile (i < messages.length) {\n\t\tconst msg = messages[i];\n\t\tif (msg.role !== \"user\") {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (i === activeUserMessageIndex) break;\n\n\t\tconst userText = extractUserMessageText(msg);\n\t\tif (userText.length === 0 && !hasUserMessageImages(msg)) {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst userMessage = createCursorUserMessage(\n\t\t\tmsg.content,\n\t\t\tuserText,\n\t\t\tdeterministicUuid(`u:${turns.length}:${cursorUserContentKey(msg.content)}`),\n\t\t);\n\t\tconst userMessageBlobId = storeCursorBlob(blobStore, toBinary(UserMessageSchema, userMessage));\n\t\tconst stepBlobIds: Uint8Array[] = [];\n\t\ti++;\n\n\t\twhile (i < messages.length && messages[i].role !== \"user\") {\n\t\t\tconst stepMsg = messages[i];\n\t\t\tif (stepMsg.role === \"assistant\") {\n\t\t\t\tfor (const item of stepMsg.content) {\n\t\t\t\t\tlet step: ConversationStep;\n\t\t\t\t\tif (item.type === \"text\") {\n\t\t\t\t\t\tif (!item.text) continue;\n\t\t\t\t\t\tstep = create(ConversationStepSchema, {\n\t\t\t\t\t\t\tmessage: {\n\t\t\t\t\t\t\t\tcase: \"assistantMessage\",\n\t\t\t\t\t\t\t\tvalue: create(AssistantMessageSchema, { text: item.text }),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (item.type === \"thinking\") {\n\t\t\t\t\t\t// Foreign/hidden reasoning never leaks into Cursor's turn\n\t\t\t\t\t\t// history as native thinking.\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else if (item.type === \"toolCall\") {\n\t\t\t\t\t\tstep = createCursorToolCallStep(item, toolResults.get(item.id));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstepBlobIds.push(storeCursorBlob(blobStore, toBinary(ConversationStepSchema, step)));\n\t\t\t\t}\n\t\t\t} else if (stepMsg.role === \"toolResult\" && !pairedToolCallIds.has(stepMsg.toolCallId)) {\n\t\t\t\tconst text = toolResultToText(stepMsg);\n\t\t\t\tif (text) {\n\t\t\t\t\tconst prefix = stepMsg.isError ? \"[Tool Error]\" : \"[Tool Result]\";\n\t\t\t\t\tconst step = create(ConversationStepSchema, {\n\t\t\t\t\t\tmessage: {\n\t\t\t\t\t\t\tcase: \"assistantMessage\",\n\t\t\t\t\t\t\tvalue: create(AssistantMessageSchema, { text: `${prefix}\\n${text}` }),\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tstepBlobIds.push(storeCursorBlob(blobStore, toBinary(ConversationStepSchema, step)));\n\t\t\t\t}\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\n\t\tconst agentTurn = create(AgentConversationTurnStructureSchema, {\n\t\t\tuserMessage: userMessageBlobId,\n\t\t\tsteps: stepBlobIds,\n\t\t});\n\t\tconst turn = create(ConversationTurnStructureSchema, {\n\t\t\tturn: {\n\t\t\t\tcase: \"agentConversationTurn\",\n\t\t\t\tvalue: agentTurn,\n\t\t\t},\n\t\t});\n\t\tturns.push(storeCursorBlob(blobStore, toBinary(ConversationTurnStructureSchema, turn)));\n\t}\n\n\treturn turns;\n}\n\n/** Exported for tests: decodes Cursor history blobs built from conversation messages. */\nexport function buildCursorHistoryForTest(\n\tmessages: Message[],\n\tactiveUserMessageIndex = findLastUserMessageIndex(messages),\n): {\n\trootPromptMessagesJson: unknown[];\n\tturnUserMessagesJson: unknown[];\n\tturnStepMessagesJson: unknown[][];\n} {\n\tconst blobStore = new Map<string, Uint8Array>();\n\tconst rootPromptMessagesJson = buildRootPromptMessagesJson(messages, [], blobStore, activeUserMessageIndex).map(\n\t\t(blobId) => JSON.parse(new TextDecoder().decode(readCursorBlob(blobStore, blobId))),\n\t);\n\tconst turnUserMessagesJson: unknown[] = [];\n\tconst turnStepMessagesJson: unknown[][] = [];\n\tfor (const turnBlobId of buildConversationTurns(messages, blobStore, activeUserMessageIndex)) {\n\t\tconst turn = fromBinary(ConversationTurnStructureSchema, readCursorBlob(blobStore, turnBlobId));\n\t\tif (turn.turn.case !== \"agentConversationTurn\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst userMessage = fromBinary(UserMessageSchema, readCursorBlob(blobStore, turn.turn.value.userMessage));\n\t\tturnUserMessagesJson.push(toJson(UserMessageSchema, userMessage));\n\t\tturnStepMessagesJson.push(\n\t\t\tturn.turn.value.steps.map((stepBlobId) => {\n\t\t\t\tconst step = fromBinary(ConversationStepSchema, readCursorBlob(blobStore, stepBlobId));\n\t\t\t\treturn toJson(ConversationStepSchema, step);\n\t\t\t}),\n\t\t);\n\t}\n\treturn { rootPromptMessagesJson, turnUserMessagesJson, turnStepMessagesJson };\n}\n\nfunction createCursorUserMessage(\n\tcontent: string | (TextContent | ImageContent)[],\n\ttext: string,\n\tmessageId = randomUUID() as string,\n) {\n\tconst images = typeof content === \"string\" ? [] : extractImages(content);\n\treturn create(UserMessageSchema, {\n\t\ttext,\n\t\tmessageId,\n\t\t...(images.length > 0\n\t\t\t? {\n\t\t\t\t\tselectedContext: create(SelectedContextSchema, {\n\t\t\t\t\t\tselectedImages: images,\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: {}),\n\t});\n}\n\nfunction extractImages(content: (TextContent | ImageContent)[]) {\n\treturn content\n\t\t.filter((item): item is ImageContent => item.type === \"image\")\n\t\t.map((image) =>\n\t\t\tcreate(SelectedImageSchema, {\n\t\t\t\tuuid: randomUUID(),\n\t\t\t\tmimeType: image.mimeType,\n\t\t\t\tdataOrBlobId: {\n\t\t\t\t\tcase: \"data\",\n\t\t\t\t\tvalue: Uint8Array.from(Buffer.from(image.data, \"base64\")),\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n}\n\nasync function buildGrpcRequest(\n\tmodel: Model<\"cursor-agent\">,\n\tcontext: Context,\n\toptions: CursorAgentOptions | undefined,\n\tstate: {\n\t\tconversationId: string;\n\t\tblobStore: Map<string, Uint8Array>;\n\t\tconversationState?: ConversationStateStructure;\n\t},\n): Promise<{\n\trequestBytes: Uint8Array;\n\tblobStore: Map<string, Uint8Array>;\n\tconversationState: ConversationStateStructure;\n}> {\n\tconst blobStore = state.blobStore;\n\n\tconst systemPromptIds = buildCursorSystemPromptJsons(context.systemPrompt).map((json) =>\n\t\tstoreCursorBlob(blobStore, new TextEncoder().encode(json)),\n\t);\n\n\tconst activeUserMessageIndex = context.messages.length - 1;\n\tconst activeMessage = context.messages[activeUserMessageIndex];\n\tconst activeUserMessage = activeMessage?.role === \"user\" ? activeMessage : undefined;\n\tlet userContent: string | (TextContent | ImageContent)[] | undefined;\n\tlet userText = \"\";\n\tlet hasUserImages = false;\n\tif (activeUserMessage) {\n\t\tuserContent = activeUserMessage.content;\n\t\tif (typeof userContent === \"string\") {\n\t\t\tuserText = userContent.trim();\n\t\t} else {\n\t\t\tuserText = extractText(userContent);\n\t\t\thasUserImages = hasImages(userContent);\n\t\t}\n\t}\n\n\tconst action = create(ConversationActionSchema, {\n\t\taction:\n\t\t\tuserContent && (userText.trim().length > 0 || hasUserImages)\n\t\t\t\t? {\n\t\t\t\t\t\tcase: \"userMessageAction\",\n\t\t\t\t\t\tvalue: create(UserMessageActionSchema, {\n\t\t\t\t\t\t\tuserMessage: createCursorUserMessage(userContent, userText),\n\t\t\t\t\t\t}),\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tcase: \"resumeAction\",\n\t\t\t\t\t\tvalue: create(ResumeActionSchema, {}),\n\t\t\t\t\t},\n\t});\n\n\t// Build conversation turns from prior messages, excluding only the active\n\t// user message when the request is sending one. Resume actions must\n\t// preserve trailing tool results.\n\tconst turns = buildConversationTurns(context.messages, blobStore, activeUserMessage ? activeUserMessageIndex : -1);\n\n\t// Cursor's server uses `rootPromptMessagesJson` (not `turns[]`) to build\n\t// the actual model prompt; without it multi-turn conversations lose prior\n\t// context.\n\tconst rootPromptMessagesJson = buildRootPromptMessagesJson(\n\t\tcontext.messages,\n\t\tsystemPromptIds,\n\t\tblobStore,\n\t\tactiveUserMessage ? activeUserMessageIndex : -1,\n\t);\n\n\t// Preserve cached non-history state fields (todos, file states, summaries)\n\t// when the system prompt is unchanged; otherwise start fresh.\n\tconst cachedPromptHead = state.conversationState?.rootPromptMessagesJson?.slice(0, systemPromptIds.length) ?? [];\n\tconst hasMatchingPrompt =\n\t\tcachedPromptHead.length === systemPromptIds.length &&\n\t\tsystemPromptIds.every((id, idx) => Buffer.from(cachedPromptHead[idx]).equals(id));\n\tconst baseState =\n\t\tstate.conversationState && hasMatchingPrompt\n\t\t\t? state.conversationState\n\t\t\t: create(ConversationStateStructureSchema, {\n\t\t\t\t\trootPromptMessagesJson: systemPromptIds,\n\t\t\t\t\tturns: [],\n\t\t\t\t\ttodos: [],\n\t\t\t\t\tpendingToolCalls: [],\n\t\t\t\t\tpreviousWorkspaceUris: [],\n\t\t\t\t\tfileStates: {},\n\t\t\t\t\tfileStatesV2: {},\n\t\t\t\t\tsummaryArchives: [],\n\t\t\t\t\tturnTimings: [],\n\t\t\t\t\tsubagentStates: {},\n\t\t\t\t\tselfSummaryCount: 0,\n\t\t\t\t\treadPaths: [],\n\t\t\t\t});\n\n\t// Always override `rootPromptMessagesJson` and `turns` with content freshly\n\t// built from `context.messages`: the server-echoed checkpoint replaces\n\t// historical user entries with empty placeholders.\n\tconst conversationState = create(ConversationStateStructureSchema, {\n\t\t...baseState,\n\t\trootPromptMessagesJson,\n\t\tturns,\n\t});\n\n\tconst requestedModel = buildRequestedModel(model, options?.thinkingSelection);\n\tconst wireModelId = requestedModel.modelId;\n\tconst cursorMaxMode = model.compat?.cursorMaxMode === true;\n\tconst modelDetails = create(ModelDetailsSchema, {\n\t\tmodelId: wireModelId,\n\t\tdisplayModelId: model.id,\n\t\tdisplayName: model.name,\n\t\t...(cursorMaxMode ? { maxMode: true } : undefined),\n\t});\n\n\tconst runRequest = create(AgentRunRequestSchema, {\n\t\tconversationState,\n\t\taction,\n\t\tmodelDetails,\n\t\trequestedModel,\n\t\tconversationId: state.conversationId,\n\t});\n\n\tif (options?.customSystemPrompt) {\n\t\trunRequest.customSystemPrompt = options.customSystemPrompt;\n\t}\n\n\tawait options?.onPayload?.(runRequest, model as Model<Api>);\n\n\tconst clientMessage = create(AgentClientMessageSchema, {\n\t\tmessage: { case: \"runRequest\", value: runRequest },\n\t});\n\n\tconst requestBytes = toBinary(AgentClientMessageSchema, clientMessage);\n\n\tlog(\"info\", \"builtRunRequest\", {\n\t\tbytes: requestBytes.length,\n\t\ttools: context.tools?.length ?? 0,\n\t});\n\n\treturn { requestBytes, blobStore, conversationState };\n}\n\nfunction hasImages(content: (TextContent | ImageContent)[]): boolean {\n\treturn content.some((item) => item.type === \"image\");\n}\n\nfunction extractText(content: (TextContent | ImageContent)[]): string {\n\treturn content\n\t\t.filter((c): c is TextContent => c.type === \"text\")\n\t\t.map((c) => c.text)\n\t\t.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Model discovery (GetUsableModels)\n// ---------------------------------------------------------------------------\n\nconst CURSOR_GET_USABLE_MODELS_PATH = \"/agent.v1.AgentService/GetUsableModels\";\nconst CURSOR_DEFAULT_CONTEXT_WINDOW = 200_000;\nconst CURSOR_DEFAULT_MAX_TOKENS = 64_000;\n/**\n * `GetUsableModels` carries no context-window field, so the 1M ceiling is\n * recovered from the signals Cursor does send: display-name \"1M\" labels and\n * the max-mode flag on Claude/Gemini families.\n */\nconst CURSOR_1M_CONTEXT_WINDOW = 1_000_000;\nconst CURSOR_1M_NAME_PATTERN = /\\b1m\\b/i;\nconst CURSOR_MAX_MODE_1M_ID_PATTERN = /claude|gemini/;\n/**\n * Model-id families whose native catalogs are multimodal. Cursor-only or\n * text-only families (`composer-*`, `grok-code-*`) stay outside this pattern.\n */\nconst CURSOR_MULTIMODAL_ID_PATTERN = /claude|gemini|gpt-|codex/;\n\nexport interface CursorDiscoveredModel {\n\tid: string;\n\tname: string;\n\treasoning: boolean;\n\tinput: (\"text\" | \"image\")[];\n\tcontextWindow: number;\n\tmaxTokens: number;\n\tcursorMaxMode: boolean;\n}\n\n/**\n * Fetches Cursor models through `GetUsableModels` (unary protobuf over\n * HTTP/2; the ALB rejects HTTP/1.1 with 464) and normalizes them.\n *\n * Returns `null` on request/decode failures; `[]` only when the endpoint\n * responds successfully with no usable models.\n */\nexport async function fetchCursorUsableModels(options: {\n\tapiKey: string;\n\tbaseUrl?: string;\n\ttimeoutMs?: number;\n\tsignal?: AbortSignal;\n}): Promise<CursorDiscoveredModel[] | null> {\n\tconst timeoutMs = options.timeoutMs ?? 10_000;\n\ttry {\n\t\tconst requestPayload = create(GetUsableModelsRequestSchema, { customModelIds: [] });\n\t\tconst body = toBinary(GetUsableModelsRequestSchema, requestPayload);\n\t\tconst baseUrl = (options.baseUrl ?? CURSOR_API_URL).replace(/\\/+$/, \"\");\n\n\t\tconst responseBuffer = await new Promise<Uint8Array | null>((resolve) => {\n\t\t\tconst client = http2.connect(baseUrl);\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tclient.destroy();\n\t\t\t\tresolve(null);\n\t\t\t}, timeoutMs);\n\t\t\tconst abort = () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tclient.destroy();\n\t\t\t\tresolve(null);\n\t\t\t};\n\t\t\toptions.signal?.addEventListener(\"abort\", abort, { once: true });\n\n\t\t\tclient.on(\"error\", () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tresolve(null);\n\t\t\t});\n\n\t\t\tconst req = client.request({\n\t\t\t\t\":method\": \"POST\",\n\t\t\t\t\":path\": CURSOR_GET_USABLE_MODELS_PATH,\n\t\t\t\t\"content-type\": \"application/proto\",\n\t\t\t\tte: \"trailers\",\n\t\t\t\tauthorization: `Bearer ${options.apiKey}`,\n\t\t\t\t\"x-ghost-mode\": \"true\",\n\t\t\t\t\"x-cursor-client-version\": CURSOR_CLIENT_VERSION,\n\t\t\t\t\"x-cursor-client-type\": \"cli\",\n\t\t\t});\n\n\t\t\tconst chunks: Buffer[] = [];\n\t\t\treq.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n\t\t\treq.on(\"end\", () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tclient.close();\n\t\t\t\tresolve(new Uint8Array(Buffer.concat(chunks)));\n\t\t\t});\n\t\t\treq.on(\"error\", () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tclient.close();\n\t\t\t\tresolve(null);\n\t\t\t});\n\t\t\treq.on(\"response\", (headers) => {\n\t\t\t\tconst status = Number(headers[\":status\"] ?? 0);\n\t\t\t\tif (status < 200 || status >= 300) {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tclient.close();\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (body.length > 0) {\n\t\t\t\treq.end(Buffer.from(body));\n\t\t\t} else {\n\t\t\t\treq.end();\n\t\t\t}\n\t\t});\n\n\t\tif (!responseBuffer || responseBuffer.length === 0) {\n\t\t\treturn null;\n\t\t}\n\t\tconst decoded = decodeGetUsableModelsResponse(responseBuffer);\n\t\tif (!decoded) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst byId = new Map<string, CursorDiscoveredModel>();\n\t\tfor (const model of decoded.models ?? []) {\n\t\t\tconst id = model.modelId?.trim();\n\t\t\tif (!id) continue;\n\t\t\tconst name = pickModelDisplayName(model, id);\n\t\t\tconst labeled1M =\n\t\t\t\tCURSOR_1M_NAME_PATTERN.test(id) ||\n\t\t\t\t[model.displayName, model.displayNameShort, model.displayModelId, ...(model.aliases ?? [])].some(\n\t\t\t\t\t(candidate) => typeof candidate === \"string\" && CURSOR_1M_NAME_PATTERN.test(candidate),\n\t\t\t\t);\n\t\t\tconst maxMode = model.maxMode === true;\n\t\t\tconst contextWindow =\n\t\t\t\tlabeled1M || (maxMode && CURSOR_MAX_MODE_1M_ID_PATTERN.test(id))\n\t\t\t\t\t? CURSOR_1M_CONTEXT_WINDOW\n\t\t\t\t\t: CURSOR_DEFAULT_CONTEXT_WINDOW;\n\t\t\tbyId.set(id, {\n\t\t\t\tid,\n\t\t\t\tname,\n\t\t\t\treasoning: Boolean(model.thinkingDetails),\n\t\t\t\tinput: CURSOR_MULTIMODAL_ID_PATTERN.test(id.toLowerCase()) ? [\"text\", \"image\"] : [\"text\"],\n\t\t\t\tcontextWindow,\n\t\t\t\tmaxTokens: CURSOR_DEFAULT_MAX_TOKENS,\n\t\t\t\tcursorMaxMode: maxMode,\n\t\t\t});\n\t\t}\n\t\treturn [...byId.values()].sort((a, b) => a.id.localeCompare(b.id));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction decodeGetUsableModelsResponse(payload: Uint8Array) {\n\tconst framedBody = decodeConnectUnaryBody(payload);\n\tif (framedBody) {\n\t\ttry {\n\t\t\treturn fromBinary(GetUsableModelsResponseSchema, framedBody);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\ttry {\n\t\treturn fromBinary(GetUsableModelsResponseSchema, payload);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction decodeConnectUnaryBody(payload: Uint8Array): Uint8Array | null {\n\tif (payload.length < 5) {\n\t\treturn null;\n\t}\n\n\tlet offset = 0;\n\twhile (offset + 5 <= payload.length) {\n\t\tconst flags = payload[offset];\n\t\tconst view = new DataView(payload.buffer, payload.byteOffset + offset, payload.byteLength - offset);\n\t\tconst messageLength = view.getUint32(1, false);\n\t\tconst frameEnd = offset + 5 + messageLength;\n\t\tif (frameEnd > payload.length) {\n\t\t\treturn null;\n\t\t}\n\t\tconst compressionFlagSet = (flags & 0b0000_0001) !== 0;\n\t\tif (compressionFlagSet) {\n\t\t\treturn null;\n\t\t}\n\t\tconst endStreamFlagSet = (flags & 0b0000_0010) !== 0;\n\t\tif (!endStreamFlagSet) {\n\t\t\treturn payload.subarray(offset + 5, frameEnd);\n\t\t}\n\n\t\toffset = frameEnd;\n\t}\n\n\treturn null;\n}\n\nfunction pickModelDisplayName(\n\tmodel: { displayName?: string; displayNameShort?: string; displayModelId?: string; aliases?: string[] },\n\tfallbackId: string,\n): string {\n\tconst candidates = [model.displayName, model.displayNameShort, model.displayModelId, ...(model.aliases ?? [])];\n\tfor (const candidate of candidates) {\n\t\tif (typeof candidate !== \"string\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst trimmed = candidate.trim();\n\t\tif (trimmed) {\n\t\t\treturn trimmed;\n\t\t}\n\t}\n\treturn fallbackId;\n}\n"]}
1
+ {"version":3,"file":"cursor-agent.js","sourceRoot":"","sources":["../../src/api/cursor-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cursor agent protocol (`agent.v1.AgentService/Run`) over HTTP/2 Connect.\n *\n * Ported from upstream oh-my-pi's Cursor provider and adapted to senpi's\n * provider-neutral API architecture. The protocol is server-driven: the\n * client opens one `Run` stream per assistant turn, the server streams\n * interaction updates (text/thinking/tool-call deltas) and, mid-turn, sends\n * `ExecServerMessage` frames asking the CLIENT to execute a tool and blocks\n * until the answer arrives on the same stream. Tool execution is therefore\n * bridged through injected {@link CursorExecHandlers}; each bridged call is\n * synthesized into the assistant message as an already-resolved `toolCall`\n * block (marked {@link kCursorExecResolved} so the agent loop never re-runs\n * it) and paired with a `ToolResultMessage` delivered via `onToolResult`.\n *\n * NOTE: This module is Node-only (node:http2) and must only be reached\n * through the lazy wrapper (`cursor-agent.lazy.ts`).\n */\n\nimport { createHash, randomUUID } from \"node:crypto\";\nimport * as http2 from \"node:http2\";\nimport { create, fromBinary, fromJson, type JsonValue as PbJsonValue, toBinary, toJson } from \"@bufbuild/protobuf\";\nimport { ValueSchema } from \"@bufbuild/protobuf/wkt\";\nimport { calculateCost } from \"../models.ts\";\nimport type {\n\tApi,\n\tAssistantMessage,\n\tContext,\n\tImageContent,\n\tMessage,\n\tModel,\n\tSimpleStreamOptions,\n\tStreamFunction,\n\tTextContent,\n\tThinkingContent,\n\tTool,\n\tToolCall,\n\tToolResultMessage,\n} from \"../types.ts\";\nimport {\n\ttype CursorExecResolvedCarrier,\n\tclearStreamingPartialJson,\n\tkCursorExecResolved,\n\tkStreamingBlockIndex,\n\tkStreamingBlockKind,\n\tkStreamingEnvelopeId,\n\tkStreamingLastParseLen,\n\tkStreamingPartialJson,\n} from \"../utils/block-symbols.ts\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.ts\";\nimport { providerHeadersToRecord } from \"../utils/headers.ts\";\nimport { parseJsonWithRepair, parseStreamingJson } from \"../utils/json-parse.ts\";\nimport { sanitizeSurrogates } from \"../utils/sanitize-unicode.ts\";\nimport { deterministicUuid } from \"./cursor-agent/deterministic-id.ts\";\nimport { armExecHeartbeat } from \"./cursor-agent/exec-lifecycle.ts\";\nimport {\n\tbuildMcpStateResult,\n\tbuildNeutralHookResult,\n\tbuildPiBashError,\n\tbuildPiBashResult,\n\tbuildPiEditError,\n\tbuildPiEditRejected,\n\tbuildPiEditResult,\n\tbuildPiFindError,\n\tbuildPiFindResult,\n\tbuildPiGrepError,\n\tbuildPiGrepResult,\n\tbuildPiLsError,\n\tbuildPiLsResult,\n\tbuildPiReadError,\n\tbuildPiReadResult,\n\tbuildPiWriteError,\n\tbuildPiWriteRejected,\n\tbuildPiWriteResult,\n} from \"./cursor-agent/exec-modern.ts\";\nimport {\n\tAgentClientMessageSchema,\n\tAgentConversationTurnStructureSchema,\n\tAgentRunRequestSchema,\n\ttype AgentServerMessage,\n\tAgentServerMessageSchema,\n\tAgentStoreConflictErrorSchema,\n\tAgentStoreConflictResultSchema,\n\tAssistantMessageSchema,\n\tBackgroundShellSpawnResultSchema,\n\tCanvasDiagnosticsErrorSchema,\n\tCanvasDiagnosticsResultSchema,\n\tClientHeartbeatSchema,\n\tComputerUseErrorSchema,\n\tComputerUseResultSchema,\n\tConversationActionSchema,\n\tConversationSearchErrorSchema,\n\tConversationSearchResultSchema,\n\ttype ConversationStateStructure,\n\tConversationStateStructureSchema,\n\ttype ConversationStep,\n\tConversationStepSchema,\n\tConversationTurnStructureSchema,\n\tDeleteErrorSchema,\n\tDeleteRejectedSchema,\n\tDeleteResultSchema,\n\tDeleteSuccessSchema,\n\tDiagnosticsErrorSchema,\n\tDiagnosticsRejectedSchema,\n\tDiagnosticsResultSchema,\n\tDiagnosticsSuccessSchema,\n\tExecClientControlMessageSchema,\n\tExecClientHeartbeatSchema,\n\ttype ExecClientMessage,\n\tExecClientMessageSchema,\n\tExecClientStreamCloseSchema,\n\tExecClientThrowSchema,\n\ttype ExecServerMessage,\n\tFetchErrorSchema,\n\tFetchResultSchema,\n\tForceBackgroundShellResultSchema,\n\tForceBackgroundShellStatus,\n\tForceBackgroundSubagentResultSchema,\n\tForceBackgroundSubagentStatus,\n\tGetBlobResultSchema,\n\tGetUsableModelsRequestSchema,\n\tGetUsableModelsResponseSchema,\n\tGrepContentMatchSchema,\n\tGrepContentResultSchema,\n\tGrepCountResultSchema,\n\tGrepErrorSchema,\n\ttype GrepFileCount,\n\tGrepFileCountSchema,\n\tGrepFileMatchSchema,\n\tGrepFilesResultSchema,\n\tGrepResultSchema,\n\tGrepSuccessSchema,\n\ttype GrepUnionResult,\n\tGrepUnionResultSchema,\n\tKvClientMessageSchema,\n\ttype KvServerMessage,\n\tListMcpResourcesExecResultSchema,\n\tListMcpResourcesSuccessSchema,\n\ttype LsDirectoryTreeNode,\n\ttype LsDirectoryTreeNode_File,\n\tLsDirectoryTreeNode_FileSchema,\n\tLsDirectoryTreeNodeSchema,\n\tLsErrorSchema,\n\tLsRejectedSchema,\n\tLsResultSchema,\n\tLsSuccessSchema,\n\tMcpAllowlistPrecheckResultSchema,\n\tMcpApprovedSchema,\n\tMcpArgsSchema,\n\tMcpErrorSchema,\n\tMcpImageContentSchema,\n\tMcpRejectedSchema,\n\tMcpResultSchema,\n\tMcpSuccessSchema,\n\tMcpTextContentSchema,\n\tMcpToolCallSchema,\n\ttype McpToolDefinition,\n\tMcpToolDefinitionSchema,\n\tMcpToolErrorSchema,\n\tMcpToolNotFoundSchema,\n\tMcpToolResultContentItemSchema,\n\tMcpToolResultSchema,\n\ttype ModelDetails,\n\tModelDetailsSchema,\n\tReadErrorSchema,\n\tReadMcpResourceExecResultSchema,\n\tReadMcpResourceNotFoundSchema,\n\tReadRejectedSchema,\n\tReadResultSchema,\n\tReadSuccessSchema,\n\tRecordScreenFailureSchema,\n\tRecordScreenResultSchema,\n\tRequestContextResultSchema,\n\tRequestContextSchema,\n\tRequestContextSuccessSchema,\n\ttype RequestedModel,\n\tResumeActionSchema,\n\tSelectedContextSchema,\n\tSelectedImageSchema,\n\tSetBlobResultSchema,\n\tShellAllowlistPrecheckResultSchema,\n\ttype ShellArgs,\n\tShellFailureSchema,\n\tShellRejectedSchema,\n\ttype ShellResult,\n\tShellResultSchema,\n\ttype ShellStream,\n\tShellStreamExitSchema,\n\tShellStreamSchema,\n\tShellStreamStartSchema,\n\tShellStreamStderrSchema,\n\tShellStreamStdoutSchema,\n\tShellSuccessSchema,\n\tSmartModeClassifierErrorSchema,\n\tSmartModeClassifierResultSchema,\n\tSubagentAwaitNotFoundSchema,\n\tSubagentAwaitResultSchema,\n\tSubagentErrorSchema,\n\tSubagentResultSchema,\n\tToolCallSchema,\n\ttype TurnEndedUpdate,\n\tUserMessageActionSchema,\n\tUserMessageSchema,\n\tWebFetchAllowlistPrecheckResultSchema,\n\tWriteErrorSchema,\n\tWriteRejectedSchema,\n\tWriteResultSchema,\n\tWriteShellStdinErrorSchema,\n\tWriteShellStdinResultSchema,\n\tWriteSuccessSchema,\n} from \"./cursor-agent/gen/agent_pb.ts\";\nimport {\n\tcomposeShellCommand,\n\tomitUndefinedArgs,\n\tpiLimit,\n\tpiLsPath,\n\tpiReadArgs,\n\tpiTimeout,\n} from \"./cursor-agent/pi-args.ts\";\nimport { buildRequestedModel } from \"./cursor-agent/reasoning-params.ts\";\nimport {\n\tCursorRetryableStreamError,\n\tcursorStreamRetryDelayMs,\n\tshouldRetryCursorStream,\n\twaitForCursorStreamRetry,\n} from \"./cursor-agent/stream-retry.ts\";\nimport type {\n\tCursorAgentOptions,\n\tCursorExecHandlerResult,\n\tCursorExecHandlers,\n\tCursorExecPairing,\n\tCursorMcpCall,\n\tCursorShellStreamCallbacks,\n\tCursorToolResultHandler,\n} from \"./cursor-agent/types.ts\";\nimport {\n\tCURSOR_CONVERSATION_POISONED_MESSAGE,\n\tcreateConversationRotationStore,\n\tisZeroTokenResourceExhausted,\n\tresolveConversationRotationPersistPath,\n} from \"./cursor-conversation-rotation.ts\";\nimport { keepUsableCursorTaskArgs } from \"./cursor-task-args.ts\";\n\nexport type {\n\tCursorAgentOptions,\n\tCursorExecHandlerResult,\n\tCursorExecHandlers,\n\tCursorExecPairing,\n\tCursorMcpCall,\n\tCursorPiCall,\n\tCursorShellStreamCallbacks,\n\tCursorToolResultHandler,\n} from \"./cursor-agent/types.ts\";\n\nexport const CURSOR_API_URL = \"https://api2.cursor.sh\";\nexport const CURSOR_CLIENT_VERSION = \"cli-2026.07.23-e383d2b\";\nconst EXEC_HEARTBEAT_INTERVAL_MS = 3000;\n/** Maximum inbound silence before a Cursor turn without turnEnded is failed. */\nexport const CURSOR_STREAM_HEALTH_FAIL_THRESHOLD_MS = 30_000;\n/** @deprecated Heartbeats and checkpoints count as inbound liveness without a separate deadline. */\nexport const CURSOR_STREAM_HEALTH_HEARTBEAT_ONLY_THRESHOLD_MS = CURSOR_STREAM_HEALTH_FAIL_THRESHOLD_MS * 3;\n/** Maximum time allowed to drain exec handlers after turnEnded. */\nexport const CURSOR_TURN_END_DRAIN_TIMEOUT_MS = 5000;\n\n/**\n * HTTP/1 connection-specific headers that HTTP/2 forbids. Node's\n * `http2.request()` throws on these rather than dropping them.\n */\nconst HTTP2_FORBIDDEN_HEADERS = new Set([\n\t\"connection\",\n\t\"keep-alive\",\n\t\"proxy-connection\",\n\t\"transfer-encoding\",\n\t\"upgrade\",\n\t\"http2-settings\",\n]);\n\n/**\n * Header names the Cursor request sets for itself. A caller copy in ANY\n * casing has to go: the spread below adds the fixed lower-case name\n * regardless, and two spellings of one field are a duplicate (node throws\n * `ERR_HTTP2_HEADER_SINGLE_VALUE`) rather than an override.\n */\nconst CURSOR_RESERVED_HEADERS = new Set([\n\t\"content-type\",\n\t\"connect-protocol-version\",\n\t\"te\",\n\t\"authorization\",\n\t\"x-ghost-mode\",\n\t\"x-cursor-client-version\",\n\t\"x-cursor-client-type\",\n\t\"x-request-id\",\n\t// Transport-owned: a plain `host` header suppresses the `:authority` node\n\t// derives from the URL, silently retargeting the request.\n\t\"host\",\n\t// The Connect body is streamed after the headers (initial frame,\n\t// heartbeats, tool responses), so no caller-supplied length can describe it.\n\t\"content-length\",\n]);\n\n/** Reduce caller-supplied headers to what this HTTP/2 request can legally carry. */\nexport function sanitizeCursorCallerHeaders(headers: Record<string, string> | undefined): Record<string, string> {\n\tconst sanitized: Record<string, string> = {};\n\tfor (const [name, value] of Object.entries(headers ?? {})) {\n\t\tconst field = name.toLowerCase();\n\t\tif (field.startsWith(\":\")) continue;\n\t\tif (HTTP2_FORBIDDEN_HEADERS.has(field)) continue;\n\t\tif (CURSOR_RESERVED_HEADERS.has(field)) continue;\n\t\tsanitized[field] = value;\n\t}\n\treturn sanitized;\n}\n\n/**\n * Text for a recognised frame this client answers with its own typed error\n * variant. Phrased as a client capability statement, not a tool failure: the\n * model reads it and should route around the capability, not retry the call.\n */\nconst NOT_IMPLEMENTED_SUFFIX = \"not implemented by this client\";\nconst NOT_IMPLEMENTED = \"Not implemented by this client\";\n/** Bare gRPC `resource_exhausted` end-streams (also inside a Connect error message). */\nconst conversationStateCache = new Map<string, ConversationStateStructure>();\nconst conversationBlobStores = new Map<string, Map<string, Uint8Array>>();\n/**\n * Base conversation id → rotated wire id. Cursor's backend can pin a\n * per-conversation rejection (bare `resource_exhausted`, zero tokens) to one\n * conversationId forever. On the first such failure the id is rotated once\n * and the cached state migrates, so the retry loop's next attempt starts a\n * fresh conversation. Keyed by the base id so a failed rotation never repeats.\n */\nlet conversationRotationStore = createConversationRotationStore({\n\tpersistPath: resolveConversationRotationPersistPath(),\n});\nlet conversationRotationPersistPath = resolveConversationRotationPersistPath();\nfunction rotationStore() {\n\tconst persistPath = resolveConversationRotationPersistPath();\n\tif (persistPath !== conversationRotationPersistPath) {\n\t\tconversationRotationPersistPath = persistPath;\n\t\tconversationRotationStore = createConversationRotationStore({ persistPath });\n\t}\n\treturn conversationRotationStore;\n}\n\nconst CONNECT_END_STREAM_FLAG = 0b00000010;\n\nfunction log(type: string, subtype?: string, data?: unknown): void {\n\tif (!process.env.DEBUG_CURSOR) return;\n\tconst verbose = process.env.DEBUG_CURSOR === \"2\" || process.env.DEBUG_CURSOR === \"verbose\";\n\tlet dataStr = \"\";\n\tif (verbose && data !== undefined) {\n\t\ttry {\n\t\t\tdataStr = ` ${JSON.stringify(data, (_key, value) => {\n\t\t\t\tif (value instanceof Uint8Array) return `bytes(${value.length})`;\n\t\t\t\tif (typeof value === \"bigint\") return value.toString();\n\t\t\t\treturn value;\n\t\t\t})?.slice(0, 500)}`;\n\t\t} catch {\n\t\t\tdataStr = \" [unserializable]\";\n\t\t}\n\t}\n\tconsole.error(`[CURSOR] ${type}${subtype ? `: ${subtype}` : \"\"}${dataStr}`);\n}\n\nexport function frameConnectMessage(data: Uint8Array, flags = 0): Buffer {\n\tconst frame = Buffer.alloc(5 + data.length);\n\tframe[0] = flags;\n\tframe.writeUInt32BE(data.length, 1);\n\tframe.set(data, 5);\n\treturn frame;\n}\n\nfunction parseConnectEndStream(data: Uint8Array): Error | null {\n\ttry {\n\t\tconst payload = JSON.parse(new TextDecoder().decode(data));\n\t\tconst error = payload?.error;\n\t\tif (error) {\n\t\t\tconst code = typeof error.code === \"string\" ? error.code : \"unknown\";\n\t\t\tconst message = typeof error.message === \"string\" ? error.message : \"Unknown error\";\n\t\t\treturn new Error(`Connect error ${code}: ${message}`);\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn new Error(\"Failed to parse Connect end stream\");\n\t}\n}\n\n/**\n * Maps an opaque HTTP/2 negotiation failure into an actionable error. The\n * Cursor run RPC is HTTP/2-only (the ALB rejects HTTP/1.1 with 464), so a\n * TLS-intercepting proxy that strips ALPN kills the run with no h1 fallback.\n */\nexport function mapH2TransportError(error: unknown, baseUrl: string): unknown {\n\tconst code = (error as { code?: unknown } | null)?.code;\n\tconst message = error instanceof Error ? error.message : String(error);\n\tif (code === \"ERR_HTTP2_ERROR\" && /h2 is not supported/i.test(message)) {\n\t\treturn new Error(\n\t\t\t`Cursor run transport could not negotiate HTTP/2 with ${baseUrl}: \"h2 is not supported\". ` +\n\t\t\t\t\"This host serves the run RPC over HTTP/2 only, and the TLS handshake did not negotiate \" +\n\t\t\t\t\"h2 via ALPN — typically an ALPN-stripping TLS-intercepting proxy. \" +\n\t\t\t\t\"Front the provider with a local HTTP/2 bridge and point the model's baseUrl at it.\",\n\t\t);\n\t}\n\treturn error;\n}\n\nexport const stream: StreamFunction<\"cursor-agent\", CursorAgentOptions> = (\n\tmodel: Model<\"cursor-agent\">,\n\tcontext: Context,\n\toptions?: CursorAgentOptions,\n): AssistantMessageEventStream => {\n\tconst stream = new AssistantMessageEventStream();\n\n\t(async () => {\n\t\tconst output: AssistantMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: [],\n\t\t\tapi: \"cursor-agent\" as Api,\n\t\t\tprovider: model.provider,\n\t\t\tmodel: model.id,\n\t\t\tusage: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 0,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t},\n\t\t\tstopReason: \"stop\",\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\t// Declared outside the `try` because BOTH exits must drain it: an exec\n\t\t// handler decoded from the last chunk can still be running when the\n\t\t// transport fails, and the error path finalizes the synthesized call\n\t\t// just like the success path does.\n\t\tconst inFlightDispatches = new Set<Promise<void>>();\n\t\t// A dispatch can spawn another, so re-check rather than awaiting one\n\t\t// snapshot. The wait is bounded by the abort signal: exec handlers have\n\t\t// no cancellation contract, so a hung tool must not hold the terminal\n\t\t// event hostage after the user already gave up on the turn.\n\t\tlet abortSettled: Promise<void> | undefined;\n\t\tconst drainInFlightDispatches = async (): Promise<void> => {\n\t\t\tconst signal = options?.signal;\n\t\t\twhile (inFlightDispatches.size > 0) {\n\t\t\t\tif (signal?.aborted) return;\n\t\t\t\tconst settled = Promise.all([...inFlightDispatches]);\n\t\t\t\tif (!signal) {\n\t\t\t\t\tawait settled;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tabortSettled ??= new Promise<void>((resolve) =>\n\t\t\t\t\tsignal.addEventListener(\"abort\", () => resolve(), { once: true }),\n\t\t\t\t);\n\t\t\t\tawait Promise.race([settled, abortSettled]);\n\t\t\t}\n\t\t};\n\n\t\tlet h2Client: http2.ClientHttp2Session | null = null;\n\t\tlet h2Request: http2.ClientHttp2Stream | null = null;\n\t\tlet heartbeatTimer: NodeJS.Timeout | null = null;\n\t\tlet streamHealthTimer: NodeJS.Timeout | null = null;\n\t\tlet h2Settled = false;\n\t\tlet sawTurnEnded = false;\n\t\tlet turnEndDrainTimedOut = false;\n\t\tlet endStreamError: Error | null = null;\n\t\t// Reachable from the catch: a stream that dies mid-turn must still close\n\t\t// and pair the blocks it left open.\n\t\tlet openBlockState: BlockState | undefined;\n\t\tlet resolveH2: () => void = () => {};\n\t\tlet rejectH2: (error: unknown) => void = () => {};\n\t\tconst settleH2 = (error?: unknown): void => {\n\t\t\tif (h2Settled) return;\n\t\t\th2Settled = true;\n\t\t\tif (streamHealthTimer) {\n\t\t\t\tclearTimeout(streamHealthTimer);\n\t\t\t\tstreamHealthTimer = null;\n\t\t\t}\n\t\t\tif (error !== undefined) {\n\t\t\t\trejectH2(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (endStreamError) {\n\t\t\t\trejectH2(endStreamError);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!sawTurnEnded) {\n\t\t\t\trejectH2(new Error(\"Cursor stream ended before turnEnded\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresolveH2();\n\t\t};\n\n\t\t// Hoisted out of the try block: the rotation in the catch path needs\n\t\t// both ids, and the catch block cannot see try-scoped consts.\n\t\tlet baseConversationId: string | undefined;\n\t\tlet conversationId: string | undefined;\n\t\tlet usageState: UsageState | undefined;\n\t\tlet retryAttempt = false;\n\t\tlet attempt = 0;\n\t\tlet streamRetries = 0;\n\t\tlet forceResumeAction = false;\n\t\tlet pinnedRequestedModel: RequestedModel | undefined;\n\t\tlet pinnedModelDetails: ModelDetails | undefined;\n\t\tdo {\n\t\t\tretryAttempt = false;\n\t\t\tattempt += 1;\n\t\t\th2Settled = false;\n\t\t\tsawTurnEnded = false;\n\t\t\tturnEndDrainTimedOut = false;\n\t\t\tendStreamError = null;\n\t\t\topenBlockState = undefined;\n\t\t\tconst h2Completion = new Promise<void>((resolve, reject) => {\n\t\t\t\tresolveH2 = resolve;\n\t\t\t\trejectH2 = reject;\n\t\t\t});\n\t\t\tlet attemptSawCheckpoint = false;\n\t\t\ttry {\n\t\t\t\tconst apiKey = options?.apiKey;\n\t\t\t\tif (!apiKey) {\n\t\t\t\t\tthrow new Error(\"Cursor access token is required; run /login cursor\");\n\t\t\t\t}\n\n\t\t\t\tbaseConversationId = options?.conversationId ?? options?.sessionId ?? randomUUID();\n\t\t\t\tconversationId = rotationStore().getWireId(baseConversationId);\n\t\t\t\tconst blobStore = conversationBlobStores.get(conversationId) ?? new Map<string, Uint8Array>();\n\t\t\t\tconversationBlobStores.set(conversationId, blobStore);\n\t\t\t\tconst cachedState = conversationStateCache.get(conversationId);\n\t\t\t\tconst { requestBytes, conversationState, requestedModel, modelDetails } = await buildGrpcRequest(\n\t\t\t\t\tmodel,\n\t\t\t\t\tcontext,\n\t\t\t\t\toptions,\n\t\t\t\t\t{\n\t\t\t\t\t\tconversationId,\n\t\t\t\t\t\tblobStore,\n\t\t\t\t\t\tconversationState: cachedState,\n\t\t\t\t\t\tforceResumeAction,\n\t\t\t\t\t\tpinnedRequestedModel,\n\t\t\t\t\t\tpinnedModelDetails,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tpinnedRequestedModel ??= requestedModel;\n\t\t\t\tpinnedModelDetails ??= modelDetails;\n\t\t\t\tconversationStateCache.set(conversationId, conversationState);\n\t\t\t\tconst requestContextTools = buildMcpToolDefinitions(context.tools);\n\n\t\t\t\tconst baseUrl = model.baseUrl || CURSOR_API_URL;\n\t\t\t\tconst requestPath = \"/agent.v1.AgentService/Run\";\n\t\t\t\t// Caller headers are additive, and are spread FIRST so the protocol\n\t\t\t\t// framing, auth, and request id below always win.\n\t\t\t\tconst callerHeaders = sanitizeCursorCallerHeaders(providerHeadersToRecord(options?.headers));\n\t\t\t\tconst requestHeaders = {\n\t\t\t\t\t...callerHeaders,\n\t\t\t\t\t\":method\": \"POST\",\n\t\t\t\t\t\":path\": requestPath,\n\t\t\t\t\t\"content-type\": \"application/connect+proto\",\n\t\t\t\t\t\"connect-protocol-version\": \"1\",\n\t\t\t\t\tte: \"trailers\",\n\t\t\t\t\tauthorization: `Bearer ${apiKey}`,\n\t\t\t\t\t\"x-ghost-mode\": \"true\",\n\t\t\t\t\t\"x-cursor-client-version\": CURSOR_CLIENT_VERSION,\n\t\t\t\t\t\"x-cursor-client-type\": \"cli\",\n\t\t\t\t\t\"x-request-id\": randomUUID(),\n\t\t\t\t};\n\n\t\t\t\tconst attemptH2Client = http2.connect(baseUrl);\n\t\t\t\th2Client = attemptH2Client;\n\t\t\t\tattemptH2Client.on(\"error\", (error) => {\n\t\t\t\t\tif (h2Client !== attemptH2Client) return;\n\t\t\t\t\tconst mapped = mapH2TransportError(error, baseUrl);\n\t\t\t\t\tsettleH2(\n\t\t\t\t\t\tsawTurnEnded\n\t\t\t\t\t\t\t? mapped\n\t\t\t\t\t\t\t: new CursorRetryableStreamError(\n\t\t\t\t\t\t\t\t\tmapped instanceof Error ? mapped.message : String(mapped),\n\t\t\t\t\t\t\t\t\t\"transport\",\n\t\t\t\t\t\t\t\t\t{ cause: mapped },\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tattemptH2Client.on(\"goaway\", () => {\n\t\t\t\t\tif (h2Client === attemptH2Client && !h2Settled && !sawTurnEnded) {\n\t\t\t\t\t\tsettleH2(new CursorRetryableStreamError(\"Cursor HTTP/2 session received GOAWAY\", \"transport\"));\n\t\t\t\t\t\th2Request?.close();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tattemptH2Client.on(\"close\", () => {\n\t\t\t\t\tif (h2Client === attemptH2Client && !h2Settled && !sawTurnEnded && !endStreamError) {\n\t\t\t\t\t\tsettleH2(new CursorRetryableStreamError(\"Cursor HTTP/2 session closed\", \"transport\"));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\th2Request = attemptH2Client.request(requestHeaders);\n\n\t\t\t\tif (attempt === 1) {\n\t\t\t\t\tstream.push({ type: \"start\", partial: output });\n\t\t\t\t}\n\n\t\t\t\tlet pendingBuffer: Buffer = Buffer.alloc(0);\n\t\t\t\tlet currentTextBlock: (TextContent & { [kStreamingBlockIndex]: number }) | null = null;\n\t\t\t\tlet currentThinkingBlock: (ThinkingContent & { [kStreamingBlockIndex]: number }) | null = null;\n\t\t\t\tlet currentToolCall: ToolCallState | null = null;\n\t\t\t\tconst resolvedMcpToolCallIds = new Set<string>();\n\t\t\t\tusageState = { sawTokenDelta: false, sawTurnEndedUsage: false };\n\n\t\t\t\tconst state: BlockState = {\n\t\t\t\t\tget currentTextBlock() {\n\t\t\t\t\t\treturn currentTextBlock;\n\t\t\t\t\t},\n\t\t\t\t\tget currentThinkingBlock() {\n\t\t\t\t\t\treturn currentThinkingBlock;\n\t\t\t\t\t},\n\t\t\t\t\tget currentToolCall() {\n\t\t\t\t\t\treturn currentToolCall;\n\t\t\t\t\t},\n\t\t\t\t\topenToolCalls: new Map<string, ToolCallState>(),\n\t\t\t\t\tresolvedMcpToolCallIds,\n\t\t\t\t\tsetTextBlock: (b) => {\n\t\t\t\t\t\tcurrentTextBlock = b;\n\t\t\t\t\t},\n\t\t\t\t\tsetThinkingBlock: (b) => {\n\t\t\t\t\t\tcurrentThinkingBlock = b;\n\t\t\t\t\t},\n\t\t\t\t\tsetToolCall: (t) => {\n\t\t\t\t\t\tcurrentToolCall = t;\n\t\t\t\t\t},\n\t\t\t\t\tonToolResult: options?.onToolResult ?? options?.execHandlers?.onToolResult,\n\t\t\t\t};\n\t\t\t\topenBlockState = state;\n\n\t\t\t\tconst onConversationCheckpoint = (checkpoint: ConversationStateStructure) => {\n\t\t\t\t\tattemptSawCheckpoint = true;\n\t\t\t\t\tconversationStateCache.set(conversationId!, checkpoint);\n\t\t\t\t};\n\t\t\t\tconst healthFailThresholdMs =\n\t\t\t\t\toptions?.streamHealthFailThresholdMs ?? CURSOR_STREAM_HEALTH_FAIL_THRESHOLD_MS;\n\t\t\t\tlet lastInboundFrameAt = Date.now();\n\t\t\t\tlet turnEndCompletionStarted = false;\n\t\t\t\tconst armStreamHealthTimer = (): void => {\n\t\t\t\t\tif (streamHealthTimer) clearTimeout(streamHealthTimer);\n\t\t\t\t\tif (sawTurnEnded || h2Settled) return;\n\t\t\t\t\tconst now = Date.now();\n\t\t\t\t\tconst deadline = lastInboundFrameAt + healthFailThresholdMs;\n\t\t\t\t\tstreamHealthTimer = setTimeout(\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tstreamHealthTimer = null;\n\t\t\t\t\t\t\tif (sawTurnEnded || h2Settled) return;\n\t\t\t\t\t\t\tconst stalledFor = Date.now() - lastInboundFrameAt;\n\t\t\t\t\t\t\tif (stalledFor < healthFailThresholdMs) {\n\t\t\t\t\t\t\t\tarmStreamHealthTimer();\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsettleH2(\n\t\t\t\t\t\t\t\tnew CursorRetryableStreamError(\n\t\t\t\t\t\t\t\t\t\"Cursor stream ended before turnEnded: inbound stream stalled\",\n\t\t\t\t\t\t\t\t\t\"stall\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\th2Request?.close();\n\t\t\t\t\t\t},\n\t\t\t\t\t\tMath.max(0, deadline - now),\n\t\t\t\t\t);\n\t\t\t\t};\n\t\t\t\tconst completeAfterTurnEnded = async (): Promise<void> => {\n\t\t\t\t\tconst drainTimeoutMs = options?.turnEndDrainTimeoutMs ?? CURSOR_TURN_END_DRAIN_TIMEOUT_MS;\n\t\t\t\t\tlet timeout: NodeJS.Timeout | undefined;\n\t\t\t\t\tconst drained = await Promise.race([\n\t\t\t\t\t\tdrainInFlightDispatches().then(() => true),\n\t\t\t\t\t\tnew Promise<false>((resolve) => {\n\t\t\t\t\t\t\ttimeout = setTimeout(() => resolve(false), drainTimeoutMs);\n\t\t\t\t\t\t}),\n\t\t\t\t\t]);\n\t\t\t\t\tif (timeout) clearTimeout(timeout);\n\t\t\t\t\tif (h2Settled) return;\n\t\t\t\t\tif (!drained) {\n\t\t\t\t\t\tturnEndDrainTimedOut = true;\n\t\t\t\t\t\tsettleH2(\n\t\t\t\t\t\t\tnew Error(`Cursor exec dispatches did not settle within ${drainTimeoutMs}ms after turnEnded`),\n\t\t\t\t\t\t);\n\t\t\t\t\t\th2Request?.close();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\th2Request?.close();\n\t\t\t\t\tsettleH2();\n\t\t\t\t};\n\t\t\t\tarmStreamHealthTimer();\n\n\t\t\t\th2Request.on(\"data\", (chunk: Buffer) => {\n\t\t\t\t\t// Steady state drains fully per chunk; alias the fresh h2 chunk\n\t\t\t\t\t// instead of copying it through Buffer.concat.\n\t\t\t\t\tpendingBuffer = pendingBuffer.length === 0 ? chunk : Buffer.concat([pendingBuffer, chunk]);\n\n\t\t\t\t\twhile (pendingBuffer.length >= 5) {\n\t\t\t\t\t\tconst flags = pendingBuffer[0];\n\t\t\t\t\t\tconst msgLen = pendingBuffer.readUInt32BE(1);\n\t\t\t\t\t\tif (pendingBuffer.length < 5 + msgLen) break;\n\n\t\t\t\t\t\tconst messageBytes = pendingBuffer.subarray(5, 5 + msgLen);\n\t\t\t\t\t\tpendingBuffer = pendingBuffer.subarray(5 + msgLen);\n\n\t\t\t\t\t\tif (flags & CONNECT_END_STREAM_FLAG) {\n\t\t\t\t\t\t\tconst endError = parseConnectEndStream(messageBytes);\n\t\t\t\t\t\t\tif (endError) {\n\t\t\t\t\t\t\t\tendStreamError = endError;\n\t\t\t\t\t\t\t\th2Request?.close();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst serverMessage = fromBinary(AgentServerMessageSchema, messageBytes);\n\t\t\t\t\t\t\tconst interactionUpdateCase =\n\t\t\t\t\t\t\t\tserverMessage.message.case === \"interactionUpdate\"\n\t\t\t\t\t\t\t\t\t? serverMessage.message.value.message?.case\n\t\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\t\tconst isTurnEnded = interactionUpdateCase === \"turnEnded\";\n\t\t\t\t\t\t\tlastInboundFrameAt = Date.now();\n\t\t\t\t\t\t\tarmStreamHealthTimer();\n\t\t\t\t\t\t\t// Dispatch is fire-and-forget so the socket keeps draining\n\t\t\t\t\t\t\t// while a handler runs, but the promise is tracked: `done`\n\t\t\t\t\t\t\t// must not be pushed while an exec handler is still resolving,\n\t\t\t\t\t\t\t// or the buffered tool result is delivered after the turn\n\t\t\t\t\t\t\t// already finalized and the call is left unpaired.\n\t\t\t\t\t\t\tconst dispatch = handleServerMessage(\n\t\t\t\t\t\t\t\tserverMessage,\n\t\t\t\t\t\t\t\toutput,\n\t\t\t\t\t\t\t\tstream,\n\t\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\t\tblobStore,\n\t\t\t\t\t\t\t\th2Request!,\n\t\t\t\t\t\t\t\toptions?.execHandlers,\n\t\t\t\t\t\t\t\tstate.onToolResult,\n\t\t\t\t\t\t\t\tusageState!,\n\t\t\t\t\t\t\t\trequestContextTools,\n\t\t\t\t\t\t\t\tonConversationCheckpoint,\n\t\t\t\t\t\t\t).catch((error) => {\n\t\t\t\t\t\t\t\tlog(\"error\", \"handleServerMessage\", { error: String(error) });\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tinFlightDispatches.add(dispatch);\n\t\t\t\t\t\t\tvoid dispatch.finally(() => inFlightDispatches.delete(dispatch));\n\n\t\t\t\t\t\t\t// turnEnded is the definitive application completion signal. Drain\n\t\t\t\t\t\t\t// every dispatch it follows, then close our side of the stream so a\n\t\t\t\t\t\t\t// server that keeps HTTP/2 open cannot hold the turn hostage.\n\t\t\t\t\t\t\tif (isTurnEnded && !turnEndCompletionStarted) {\n\t\t\t\t\t\t\t\tsawTurnEnded = true;\n\t\t\t\t\t\t\t\tturnEndCompletionStarted = true;\n\t\t\t\t\t\t\t\tvoid completeAfterTurnEnded().catch((error) => settleH2(error));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tlog(\"error\", \"parseServerMessage\", { error: String(e) });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tconst sendHeartbeat = () => {\n\t\t\t\t\tif (!h2Request || h2Request.closed) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst heartbeatMessage = create(AgentClientMessageSchema, {\n\t\t\t\t\t\tmessage: { case: \"clientHeartbeat\", value: create(ClientHeartbeatSchema, {}) },\n\t\t\t\t\t});\n\t\t\t\t\tconst heartbeatBytes = toBinary(AgentClientMessageSchema, heartbeatMessage);\n\t\t\t\t\th2Request.write(frameConnectMessage(heartbeatBytes));\n\t\t\t\t};\n\n\t\t\t\th2Request.on(\"trailers\", (trailers) => {\n\t\t\t\t\tconst status = trailers[\"grpc-status\"];\n\t\t\t\t\tconst msg = trailers[\"grpc-message\"];\n\t\t\t\t\tif (status && status !== \"0\" && !endStreamError) {\n\t\t\t\t\t\tendStreamError = new Error(`gRPC error ${status}: ${decodeURIComponent(String(msg || \"\"))}`);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\th2Request.on(\"end\", () => {\n\t\t\t\t\tif (!sawTurnEnded && !endStreamError) {\n\t\t\t\t\t\tsettleH2(new CursorRetryableStreamError(\"Cursor stream ended before turnEnded\", \"clean-end\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tsettleH2();\n\t\t\t\t});\n\n\t\t\t\th2Request.on(\"error\", (error) => {\n\t\t\t\t\tconst mapped = mapH2TransportError(error, baseUrl);\n\t\t\t\t\tsettleH2(\n\t\t\t\t\t\tsawTurnEnded\n\t\t\t\t\t\t\t? mapped\n\t\t\t\t\t\t\t: new CursorRetryableStreamError(\n\t\t\t\t\t\t\t\t\tmapped instanceof Error ? mapped.message : String(mapped),\n\t\t\t\t\t\t\t\t\t\"transport\",\n\t\t\t\t\t\t\t\t\t{ cause: mapped },\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tif (options?.signal) {\n\t\t\t\t\toptions.signal.addEventListener(\"abort\", () => {\n\t\t\t\t\t\th2Request?.close();\n\t\t\t\t\t\tsettleH2(new Error(\"Request was aborted\"));\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\th2Request.write(frameConnectMessage(requestBytes));\n\t\t\t\theartbeatTimer = setInterval(sendHeartbeat, 5000);\n\t\t\t\tawait h2Completion;\n\t\t\t\t// The transport is done, but a handler decoded from the last chunk\n\t\t\t\t// may still be running. Pushing `done` now would let the host drain\n\t\t\t\t// its buffered tool results before such a handler reserved its entry,\n\t\t\t\t// leaving the call unpaired and stripped from rebuilt transcripts.\n\t\t\t\tawait drainInFlightDispatches();\n\n\t\t\t\tendCurrentTextBlock(output, stream, state);\n\t\t\t\tendCurrentThinkingBlock(output, stream, state);\n\t\t\t\tflushOpenToolCalls(output, stream, state);\n\n\t\t\t\tcalculateCost(model, output.usage);\n\n\t\t\t\tstream.push({\n\t\t\t\t\ttype: \"done\",\n\t\t\t\t\treason: output.stopReason as \"stop\" | \"length\" | \"toolUse\",\n\t\t\t\t\tmessage: output,\n\t\t\t\t});\n\t\t\t\tstream.end();\n\t\t\t} catch (error) {\n\t\t\t\t// Same reason as the success path: a handler still running would land\n\t\t\t\t// its real result after the turn finalized and be discarded — even\n\t\t\t\t// though the tool may already have run side effects. On abort the\n\t\t\t\t// drain returns immediately. A post-turn drain timeout is already the\n\t\t\t\t// bound: do not wait forever a second time in the error path.\n\t\t\t\tif (!turnEndDrainTimedOut) await drainInFlightDispatches();\n\t\t\t\tconst shouldRetryStream = shouldRetryCursorStream({\n\t\t\t\t\terror,\n\t\t\t\t\tretries: streamRetries,\n\t\t\t\t\tmaxRetries: options?.streamStallMaxRetries ?? 10,\n\t\t\t\t\tsawTurnEnded,\n\t\t\t\t\taborted: options?.signal?.aborted === true,\n\t\t\t\t});\n\t\t\t\tif (shouldRetryStream) {\n\t\t\t\t\tif (openBlockState) {\n\t\t\t\t\t\t// Resume responses continue from the server checkpoint. Close any\n\t\t\t\t\t\t// locally open cards before resetting per-attempt bookkeeping; no\n\t\t\t\t\t\t// speculative replay deduplication is attempted.\n\t\t\t\t\t\tendCurrentTextBlock(output, stream, openBlockState);\n\t\t\t\t\t\tendCurrentThinkingBlock(output, stream, openBlockState);\n\t\t\t\t\t\tflushOpenToolCalls(output, stream, openBlockState);\n\t\t\t\t\t}\n\t\t\t\t\tforceResumeAction ||= attemptSawCheckpoint;\n\t\t\t\t\tconst retryDelayMs = cursorStreamRetryDelayMs({\n\t\t\t\t\t\tattempt: streamRetries,\n\t\t\t\t\t\tfixedDelayMs: options?.streamStallRetryDelayMs,\n\t\t\t\t\t});\n\t\t\t\t\tstreamRetries += 1;\n\t\t\t\t\tretryAttempt = true;\n\t\t\t\t\tawait waitForCursorStreamRetry(retryDelayMs, options?.signal);\n\t\t\t\t\tif (options?.signal?.aborted) {\n\t\t\t\t\t\tretryAttempt = false;\n\t\t\t\t\t\toutput.stopReason = \"aborted\";\n\t\t\t\t\t\toutput.errorMessage = \"Request was aborted\";\n\t\t\t\t\t\tstream.push({ type: \"error\", reason: output.stopReason, error: output });\n\t\t\t\t\t\tstream.end();\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// A stream that dies mid-turn leaves blocks open. Closing them here\n\t\t\t\t// settles their live cards and pairs the server-owned calls that\n\t\t\t\t// nothing else answers — an unpaired call is stripped from every\n\t\t\t\t// rebuilt transcript.\n\t\t\t\tif (openBlockState) {\n\t\t\t\t\tendCurrentTextBlock(output, stream, openBlockState);\n\t\t\t\t\tendCurrentThinkingBlock(output, stream, openBlockState);\n\t\t\t\t\tflushOpenToolCalls(output, stream, openBlockState);\n\t\t\t\t}\n\t\t\t\tlet message = error instanceof Error ? error.message : JSON.stringify(error);\n\t\t\t\t// A server-side per-conversation rejection surfaces as a bare\n\t\t\t\t// resource_exhausted with zero tokens. That has two distinct causes:\n\t\t\t\t// an oversized payload, and a genuinely poisoned conversationId.\n\t\t\t\t// Only the second is fixed by rotating the wire id.\n\t\t\t\t//\n\t\t\t\t// The FIRST 0-token RE for a base conversation always surfaces without\n\t\t\t\t// rotating, so the session layer gets first refusal: agent-session\n\t\t\t\t// classifies a surfaced 0-token RE as overflow and compacts before\n\t\t\t\t// retrying. Rotating here instead would swallow the error, make that\n\t\t\t\t// compaction dead code, and burn the 3-rotation budget replaying the\n\t\t\t\t// same oversized payload. Once that surface has happened (the flag is\n\t\t\t\t// persisted with the wire id), compaction has had its turn and further\n\t\t\t\t// 0-token REs rotate and retry in-call, up to the cap.\n\t\t\t\tif (\n\t\t\t\t\tconversationId !== undefined &&\n\t\t\t\t\tbaseConversationId !== undefined &&\n\t\t\t\t\tusageState !== undefined &&\n\t\t\t\t\tisZeroTokenResourceExhausted(message, usageState.sawTokenDelta)\n\t\t\t\t) {\n\t\t\t\t\tif (rotationStore().shouldSkip(baseConversationId)) {\n\t\t\t\t\t\t// The base conversation burned its rotation cap; another wire id\n\t\t\t\t\t\t// will not help, so surface the poisoned-conversation error and\n\t\t\t\t\t\t// let the session move to a different provider.\n\t\t\t\t\t\tmessage = CURSOR_CONVERSATION_POISONED_MESSAGE;\n\t\t\t\t\t} else if (rotationStore().shouldSurfaceBeforeRotating(baseConversationId)) {\n\t\t\t\t\t\t// First 0-token RE for this conversation: surface it so the\n\t\t\t\t\t\t// session layer can compact. If the payload really was oversized,\n\t\t\t\t\t\t// the compacted retry succeeds and no rotation is ever spent.\n\t\t\t\t\t\trotationStore().markSurfaced(baseConversationId, conversationId);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst decision = rotationStore().recordZeroTokenPoison(baseConversationId, conversationId);\n\t\t\t\t\t\tif (decision.kind === \"rotated\") {\n\t\t\t\t\t\t\tconst cached = conversationStateCache.get(conversationId);\n\t\t\t\t\t\t\tif (cached) conversationStateCache.set(decision.wireId, cached);\n\t\t\t\t\t\t\tconst blobs = conversationBlobStores.get(conversationId);\n\t\t\t\t\t\t\tif (blobs) conversationBlobStores.set(decision.wireId, blobs);\n\t\t\t\t\t\t\tretryAttempt = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmessage = CURSOR_CONVERSATION_POISONED_MESSAGE;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!retryAttempt) {\n\t\t\t\t\toutput.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n\t\t\t\t\toutput.errorMessage = message;\n\t\t\t\t\tstream.push({ type: \"error\", reason: output.stopReason, error: output });\n\t\t\t\t\tstream.end();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (heartbeatTimer) {\n\t\t\t\t\tclearInterval(heartbeatTimer);\n\t\t\t\t\theartbeatTimer = null;\n\t\t\t\t}\n\t\t\t\th2Request?.close();\n\t\t\t\th2Client?.close();\n\t\t\t\th2Request = null;\n\t\t\t\th2Client = null;\n\t\t\t}\n\t\t} while (retryAttempt);\n\t})();\n\n\treturn stream;\n};\n\n/**\n * `streamSimple` for Cursor: an explicit thinking selection (`options.thinkingSelection`)\n * is rendered into `RequestedModel.parameters`; reasoning output itself streams back as\n * `ThinkingContent` regardless of the selection.\n */\nexport const streamSimple: StreamFunction<\"cursor-agent\", SimpleStreamOptions> = (\n\tmodel: Model<\"cursor-agent\">,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): AssistantMessageEventStream => {\n\treturn stream(model, context, options as CursorAgentOptions);\n};\n\nexport type ToolCallState = ToolCall & {\n\t[kStreamingBlockIndex]: number;\n\t[kStreamingPartialJson]?: string;\n\t[kStreamingLastParseLen]?: number;\n\t[kStreamingBlockKind]: \"mcp\" | \"todo\" | \"cursor-exec\" | \"connect-scm\";\n\t[kStreamingEnvelopeId]?: string;\n\t[kCursorExecResolved]?: true;\n};\n\nexport interface BlockState {\n\tcurrentTextBlock: (TextContent & { [kStreamingBlockIndex]: number }) | null;\n\tcurrentThinkingBlock: (ThinkingContent & { [kStreamingBlockIndex]: number }) | null;\n\tcurrentToolCall: ToolCallState | null;\n\t/**\n\t * Open streamed tool-call blocks, keyed by the interaction envelope's\n\t * `call_id`. Cursor interleaves calls: two `toolCallStarted` frames can\n\t * arrive before either completes.\n\t */\n\topenToolCalls: Map<string, ToolCallState>;\n\t/** MCP call IDs synthesized from exec frames before their redundant streamed block arrives. */\n\tresolvedMcpToolCallIds: Set<string>;\n\tsetTextBlock: (b: (TextContent & { [kStreamingBlockIndex]: number }) | null) => void;\n\tsetThinkingBlock: (b: (ThinkingContent & { [kStreamingBlockIndex]: number }) | null) => void;\n\tsetToolCall: (t: ToolCallState | null) => void;\n\t/**\n\t * Persist a paired `toolResult` for a server-resolved call. Native todo\n\t * calls never travel the exec channel, so without this the resolved block\n\t * has no matching result and every transcript rebuild strips it as dangling.\n\t */\n\tonToolResult?: CursorToolResultHandler;\n}\n\nfunction markCursorExecResolved(block: CursorExecResolvedCarrier): void {\n\tblock[kCursorExecResolved] = true;\n}\n\nexport interface UsageState {\n\tsawTokenDelta: boolean;\n\tsawTurnEndedUsage: boolean;\n\t/** Last checkpoint `usedTokens`; conversation window, not billed cache. */\n\tliveUsedTokens?: number;\n}\n\n/** Exported for tests: drives one Cursor server message through the stream (exec waits mark the stream busy). */\nexport async function handleServerMessage(\n\tmsg: AgentServerMessage,\n\toutput: AssistantMessage,\n\tstream: AssistantMessageEventStream,\n\tstate: BlockState,\n\tblobStore: Map<string, Uint8Array>,\n\th2Request: http2.ClientHttp2Stream,\n\texecHandlers: CursorExecHandlers | undefined,\n\tonToolResult: CursorToolResultHandler | undefined,\n\tusageState: UsageState,\n\trequestContextTools: McpToolDefinition[],\n\tonConversationCheckpoint?: (checkpoint: ConversationStateStructure) => void,\n): Promise<void> {\n\tconst msgCase = msg.message.case;\n\n\tlog(\"serverMessage\", msgCase);\n\n\tif (msgCase === \"interactionUpdate\") {\n\t\tprocessInteractionUpdate(msg.message.value, output, stream, state, usageState);\n\t} else if (msgCase === \"kvServerMessage\") {\n\t\thandleKvServerMessage(msg.message.value as KvServerMessage, blobStore, h2Request);\n\t} else if (msgCase === \"execServerMessage\") {\n\t\t// The server is waiting on OUR local tool result during this window — no\n\t\t// AssistantMessageEvent flows until the handler finishes. Mark the wait\n\t\t// as local work so idle watchdogs attribute the silence to the tool run\n\t\t// instead of aborting a healthy stream.\n\t\tawait stream.trackLocalWork(\n\t\t\thandleExecServerMessage(\n\t\t\t\tmsg.message.value as ExecServerMessage,\n\t\t\t\th2Request,\n\t\t\t\texecHandlers,\n\t\t\t\tonToolResult,\n\t\t\t\trequestContextTools,\n\t\t\t\toutput,\n\t\t\t\tstream,\n\t\t\t\tstate,\n\t\t\t),\n\t\t);\n\t} else if (msgCase === \"conversationCheckpointUpdate\") {\n\t\tapplyCheckpointTokenDetails(msg.message.value, output, usageState);\n\t\tonConversationCheckpoint?.(msg.message.value);\n\t}\n}\n\nfunction handleKvServerMessage(\n\tkvMsg: KvServerMessage,\n\tblobStore: Map<string, Uint8Array>,\n\th2Request: http2.ClientHttp2Stream,\n): void {\n\tconst kvCase = kvMsg.message.case;\n\n\tif (kvCase === \"getBlobArgs\") {\n\t\tconst blobId = kvMsg.message.value.blobId;\n\t\tconst blobIdKey = Buffer.from(blobId).toString(\"hex\");\n\t\tconst blobData = blobStore.get(blobIdKey);\n\t\tconst response = create(KvClientMessageSchema, {\n\t\t\tid: kvMsg.id,\n\t\t\tmessage: {\n\t\t\t\tcase: \"getBlobResult\",\n\t\t\t\tvalue: create(GetBlobResultSchema, blobData ? { blobData } : {}),\n\t\t\t},\n\t\t});\n\t\tconst kvClientMessage = create(AgentClientMessageSchema, {\n\t\t\tmessage: { case: \"kvClientMessage\", value: response },\n\t\t});\n\t\th2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema, kvClientMessage)));\n\t\tlog(\"kvClient\", \"getBlobResult\", { blobId: blobIdKey.slice(0, 40) });\n\t} else if (kvCase === \"setBlobArgs\") {\n\t\tconst { blobId, blobData } = kvMsg.message.value;\n\t\tconst blobIdKey = Buffer.from(blobId).toString(\"hex\");\n\t\tblobStore.set(blobIdKey, blobData);\n\t\tconst response = create(KvClientMessageSchema, {\n\t\t\tid: kvMsg.id,\n\t\t\tmessage: {\n\t\t\t\tcase: \"setBlobResult\",\n\t\t\t\tvalue: create(SetBlobResultSchema, {}),\n\t\t\t},\n\t\t});\n\t\tconst kvClientMessage = create(AgentClientMessageSchema, {\n\t\t\tmessage: { case: \"kvClientMessage\", value: response },\n\t\t});\n\t\th2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema, kvClientMessage)));\n\t\tlog(\"kvClient\", \"setBlobResult\", { blobId: blobIdKey.slice(0, 40) });\n\t}\n}\n\nfunction sendShellStreamEvent(\n\th2Request: http2.ClientHttp2Stream,\n\texecMsg: ExecServerMessage,\n\tevent: ShellStream[\"event\"],\n): void {\n\tsendExecClientMessage(h2Request, execMsg, \"shellStream\", create(ShellStreamSchema, { event }));\n}\n\nfunction sanitizeShellExecResult(execResult: ShellResult): ShellResult {\n\tconst result = execResult.result;\n\tif (!result) return execResult;\n\n\tswitch (result.case) {\n\t\tcase \"success\":\n\t\tcase \"failure\": {\n\t\t\tconst value = result.value;\n\t\t\treturn {\n\t\t\t\t...execResult,\n\t\t\t\tresult: {\n\t\t\t\t\tcase: result.case,\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\t...value,\n\t\t\t\t\t\tstdout: value.stdout ? sanitizeSurrogates(value.stdout) : value.stdout,\n\t\t\t\t\t\tstderr: value.stderr ? sanitizeSurrogates(value.stderr) : value.stderr,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t} as ShellResult;\n\t\t}\n\t\tdefault:\n\t\t\treturn execResult;\n\t}\n}\n\nasync function handleShellStreamArgs(\n\targs: ShellArgs,\n\texecMsg: ExecServerMessage,\n\th2Request: http2.ClientHttp2Stream,\n\texecHandlers: CursorExecHandlers | undefined,\n\tonToolResult: CursorToolResultHandler | undefined,\n): Promise<void> {\n\tconst normalizedWorkingDirectory = args.workingDirectory || process.cwd();\n\tconst normalizedArgs: ShellArgs = { ...args, workingDirectory: normalizedWorkingDirectory };\n\n\tsendShellStreamEvent(h2Request, execMsg, { case: \"start\", value: create(ShellStreamStartSchema, {}) });\n\n\t// Buffer for incomplete ANSI sequences across chunks.\n\tlet stdoutBuffer = \"\";\n\tlet stderrBuffer = \"\";\n\n\tconst incompleteEscapeRegex = /\\x1b(|\\[|\\[\\d*|\\[\\?|\\[\\?\\d*|\\]\\d*;?)$/;\n\n\tconst flushStdout = () => {\n\t\tif (stdoutBuffer) {\n\t\t\tlet safeEnd = stdoutBuffer.length;\n\t\t\tconst match = stdoutBuffer.match(incompleteEscapeRegex);\n\t\t\tif (match && match[0].length > 0) {\n\t\t\t\tsafeEnd = stdoutBuffer.length - match[0].length;\n\t\t\t}\n\t\t\tconst toSend = stdoutBuffer.slice(0, safeEnd);\n\t\t\tconst remaining = stdoutBuffer.slice(safeEnd);\n\t\t\tif (toSend) {\n\t\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\t\tcase: \"stdout\",\n\t\t\t\t\tvalue: create(ShellStreamStdoutSchema, { data: sanitizeSurrogates(toSend) }),\n\t\t\t\t});\n\t\t\t}\n\t\t\tstdoutBuffer = remaining;\n\t\t}\n\t};\n\n\tconst flushStderr = () => {\n\t\tif (stderrBuffer) {\n\t\t\tlet safeEnd = stderrBuffer.length;\n\t\t\tconst match = stderrBuffer.match(incompleteEscapeRegex);\n\t\t\tif (match && match[0].length > 0) {\n\t\t\t\tsafeEnd = stderrBuffer.length - match[0].length;\n\t\t\t}\n\t\t\tconst toSend = stderrBuffer.slice(0, safeEnd);\n\t\t\tconst remaining = stderrBuffer.slice(safeEnd);\n\t\t\tif (toSend) {\n\t\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\t\tcase: \"stderr\",\n\t\t\t\t\tvalue: create(ShellStreamStderrSchema, { data: sanitizeSurrogates(toSend) }),\n\t\t\t\t});\n\t\t\t}\n\t\t\tstderrBuffer = remaining;\n\t\t}\n\t};\n\n\tlet stdoutFlushTimer: NodeJS.Timeout | null = null;\n\tlet stderrFlushTimer: NodeJS.Timeout | null = null;\n\n\tconst scheduleStdoutFlush = () => {\n\t\tif (!stdoutFlushTimer) {\n\t\t\tstdoutFlushTimer = setTimeout(() => {\n\t\t\t\tstdoutFlushTimer = null;\n\t\t\t\tflushStdout();\n\t\t\t}, 100);\n\t\t}\n\t};\n\n\tconst scheduleStderrFlush = () => {\n\t\tif (!stderrFlushTimer) {\n\t\t\tstderrFlushTimer = setTimeout(() => {\n\t\t\t\tstderrFlushTimer = null;\n\t\t\t\tflushStderr();\n\t\t\t}, 100);\n\t\t}\n\t};\n\n\tconst streamCallbacks: CursorShellStreamCallbacks = {\n\t\tonStdout(data: string) {\n\t\t\tstdoutBuffer += data;\n\t\t\tif (stdoutBuffer.includes(\"\\n\") || stdoutBuffer.length > 4096) {\n\t\t\t\tif (stdoutFlushTimer) {\n\t\t\t\t\tclearTimeout(stdoutFlushTimer);\n\t\t\t\t\tstdoutFlushTimer = null;\n\t\t\t\t}\n\t\t\t\tflushStdout();\n\t\t\t} else {\n\t\t\t\tscheduleStdoutFlush();\n\t\t\t}\n\t\t},\n\t\tonStderr(data: string) {\n\t\t\tstderrBuffer += data;\n\t\t\tif (stderrBuffer.includes(\"\\n\") || stderrBuffer.length > 4096) {\n\t\t\t\tif (stderrFlushTimer) {\n\t\t\t\t\tclearTimeout(stderrFlushTimer);\n\t\t\t\t\tstderrFlushTimer = null;\n\t\t\t\t}\n\t\t\t\tflushStderr();\n\t\t\t} else {\n\t\t\t\tscheduleStderrFlush();\n\t\t\t}\n\t\t},\n\t};\n\n\t// Prefer the streaming handler — it forwards output chunks in real time.\n\tconst streamHandler = execHandlers?.shellStream?.bind(execHandlers);\n\tconst batchHandler = execHandlers?.shell?.bind(execHandlers);\n\tconst handler = streamHandler ? (shellArgs: ShellArgs) => streamHandler(shellArgs, streamCallbacks) : batchHandler;\n\n\tconst { execResult } = await resolveExecHandler(\n\t\tnormalizedArgs,\n\t\thandler as typeof batchHandler,\n\t\tonToolResult,\n\t\t(toolResult) => buildShellResultFromToolResult(normalizedArgs, toolResult),\n\t\t(reason) => buildShellRejectedResult(normalizedArgs.command, normalizedArgs.workingDirectory, reason),\n\t\t(error) => buildShellFailureResult(normalizedArgs.command, normalizedArgs.workingDirectory, error),\n\t\t{ toolCallId: args.toolCallId, toolName: \"bash\" },\n\t);\n\n\t// When using the batch handler (no shellStream), send buffered stdout/stderr\n\t// after execution completes. With shellStream these were already sent live.\n\tconst sendBufferedOutput = !streamHandler;\n\tconst sanitizedExecResult = sanitizeShellExecResult(execResult);\n\n\tif (stdoutFlushTimer) clearTimeout(stdoutFlushTimer);\n\tif (stderrFlushTimer) clearTimeout(stderrFlushTimer);\n\tflushStdout();\n\tflushStderr();\n\n\tsendShellStreamExitFromResult(h2Request, execMsg, sanitizedExecResult, sendBufferedOutput);\n\t// Cursor can keep the turn pending when it receives only stream deltas.\n\t// Send the final structured shellResult as completion acknowledgement.\n\tsendExecClientMessage(h2Request, execMsg, \"shellResult\", sanitizedExecResult);\n}\n\nfunction sendShellStreamExitFromResult(\n\th2Request: http2.ClientHttp2Stream,\n\texecMsg: ExecServerMessage,\n\texecResult: ShellResult,\n\tsendBufferedOutput: boolean,\n): void {\n\tconst result = execResult.result;\n\tswitch (result.case) {\n\t\tcase \"success\": {\n\t\t\tconst value = result.value;\n\t\t\tif (sendBufferedOutput) {\n\t\t\t\tif (value.stdout) {\n\t\t\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\t\t\tcase: \"stdout\",\n\t\t\t\t\t\tvalue: create(ShellStreamStdoutSchema, { data: sanitizeSurrogates(value.stdout) }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (value.stderr) {\n\t\t\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\t\t\tcase: \"stderr\",\n\t\t\t\t\t\tvalue: create(ShellStreamStderrSchema, { data: sanitizeSurrogates(value.stderr) }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\tcase: \"exit\",\n\t\t\t\tvalue: create(ShellStreamExitSchema, {\n\t\t\t\t\tcode: value.exitCode,\n\t\t\t\t\tcwd: value.workingDirectory,\n\t\t\t\t\taborted: false,\n\t\t\t\t}),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tcase \"failure\": {\n\t\t\tconst value = result.value;\n\t\t\tif (sendBufferedOutput) {\n\t\t\t\tif (value.stdout) {\n\t\t\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\t\t\tcase: \"stdout\",\n\t\t\t\t\t\tvalue: create(ShellStreamStdoutSchema, { data: sanitizeSurrogates(value.stdout) }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (value.stderr) {\n\t\t\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\t\t\tcase: \"stderr\",\n\t\t\t\t\t\tvalue: create(ShellStreamStderrSchema, { data: sanitizeSurrogates(value.stderr) }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\tcase: \"exit\",\n\t\t\t\tvalue: create(ShellStreamExitSchema, {\n\t\t\t\t\tcode: value.exitCode,\n\t\t\t\t\tcwd: value.workingDirectory,\n\t\t\t\t\taborted: value.aborted,\n\t\t\t\t\tabortReason: value.abortReason,\n\t\t\t\t}),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tcase \"rejected\": {\n\t\t\tsendShellStreamEvent(h2Request, execMsg, { case: \"rejected\", value: result.value });\n\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\tcase: \"exit\",\n\t\t\t\tvalue: create(ShellStreamExitSchema, {\n\t\t\t\t\tcode: 1,\n\t\t\t\t\tcwd: result.value.workingDirectory,\n\t\t\t\t\taborted: false,\n\t\t\t\t}),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tcase \"timeout\": {\n\t\t\tconst value = result.value;\n\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\tcase: \"stderr\",\n\t\t\t\tvalue: create(ShellStreamStderrSchema, {\n\t\t\t\t\tdata: `Command timed out after ${value.timeoutMs}ms`,\n\t\t\t\t}),\n\t\t\t});\n\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\tcase: \"exit\",\n\t\t\t\tvalue: create(ShellStreamExitSchema, {\n\t\t\t\t\tcode: 1,\n\t\t\t\t\tcwd: value.workingDirectory,\n\t\t\t\t\taborted: true,\n\t\t\t\t}),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tcase \"permissionDenied\": {\n\t\t\tsendShellStreamEvent(h2Request, execMsg, { case: \"permissionDenied\", value: result.value });\n\t\t\tsendShellStreamEvent(h2Request, execMsg, {\n\t\t\t\tcase: \"exit\",\n\t\t\t\tvalue: create(ShellStreamExitSchema, {\n\t\t\t\t\tcode: 1,\n\t\t\t\t\tcwd: result.value.workingDirectory,\n\t\t\t\t\taborted: false,\n\t\t\t\t}),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tdefault:\n\t\t\treturn;\n\t}\n}\n\ntype ExecDispatchContext = {\n\treadonly execMsg: ExecServerMessage;\n\treadonly h2Request: http2.ClientHttp2Stream;\n\treadonly execHandlers: CursorExecHandlers | undefined;\n\treadonly onToolResult: CursorToolResultHandler | undefined;\n\treadonly requestContextTools: McpToolDefinition[];\n\treadonly output: AssistantMessage;\n\treadonly stream: AssistantMessageEventStream;\n\treadonly state: BlockState;\n};\n\nasync function handleExecServerMessage(\n\texecMsg: ExecServerMessage,\n\th2Request: http2.ClientHttp2Stream,\n\texecHandlers: CursorExecHandlers | undefined,\n\tonToolResult: CursorToolResultHandler | undefined,\n\trequestContextTools: McpToolDefinition[],\n\toutput: AssistantMessage,\n\tstream: AssistantMessageEventStream,\n\tstate: BlockState,\n): Promise<void> {\n\tconst execCase = execMsg.message.case;\n\tlog(\"exec\", \"dispatch\", { execCase, execId: execMsg.execId, hasHandlers: !!execHandlers });\n\tif (!execCase) {\n\t\t// A frame carrying a oneof number this build's `agent.proto` does not\n\t\t// model at all. Returning silently strands the exec id — the server\n\t\t// waits on a reply that never comes.\n\t\tlog(\"warn\", \"unknownExecVariant\", { id: execMsg.id, execId: execMsg.execId });\n\t\tsendExecClientThrow(h2Request, execMsg, \"Unknown exec message variant\", \"unknown_exec_variant\");\n\t\tsendExecClientStreamClose(h2Request, execMsg);\n\t\treturn;\n\t}\n\n\tconst stopExecHeartbeat = armCursorExecHeartbeat(h2Request, execMsg);\n\ttry {\n\t\tawait dispatchExecServerMessage({\n\t\t\texecMsg,\n\t\t\th2Request,\n\t\t\texecHandlers,\n\t\t\tonToolResult,\n\t\t\trequestContextTools,\n\t\t\toutput,\n\t\t\tstream,\n\t\t\tstate,\n\t\t});\n\t} catch (error) {\n\t\tlog(\"error\", \"execDispatch\", {\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\tid: execMsg.id,\n\t\t\texecId: execMsg.execId,\n\t\t});\n\t\tsendExecClientThrow(h2Request, execMsg, \"Local exec dispatch failed\", \"exec_dispatch_failed\");\n\t} finally {\n\t\tstopExecHeartbeat();\n\t\tsendExecClientStreamClose(h2Request, execMsg);\n\t}\n}\n\nasync function dispatchExecServerMessage(context: ExecDispatchContext): Promise<void> {\n\tconst { execMsg, h2Request, execHandlers, onToolResult, requestContextTools, output, stream, state } = context;\n\tconst execCase = execMsg.message.case;\n\tif (!execCase) throw new Error(\"Expected a recognized exec message\");\n\tif (execCase === \"requestContextArgs\") {\n\t\tconst requestContext = create(RequestContextSchema, {\n\t\t\trules: [],\n\t\t\trepositoryInfo: [],\n\t\t\ttools: requestContextTools,\n\t\t\tgitRepos: [],\n\t\t\tprojectLayouts: [],\n\t\t\tmcpInstructions: [],\n\t\t\tfileContents: {},\n\t\t\tcustomSubagents: [],\n\t\t});\n\n\t\tconst requestContextResult = create(RequestContextResultSchema, {\n\t\t\tresult: {\n\t\t\t\tcase: \"success\",\n\t\t\t\tvalue: create(RequestContextSuccessSchema, { requestContext }),\n\t\t\t},\n\t\t});\n\n\t\tsendExecClientMessage(h2Request, execMsg, \"requestContextResult\", requestContextResult);\n\t\treturn;\n\t}\n\n\tswitch (execCase) {\n\t\tcase \"readArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tif (!args.toolCallId) args.toolCallId = randomUUID();\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, args.toolCallId, \"read\", {\n\t\t\t\tpath: args.path,\n\t\t\t\toffset: args.offset,\n\t\t\t\tlimit: args.limit,\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\targs,\n\t\t\t\texecHandlers?.read?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\t(toolResult) =>\n\t\t\t\t\tbuildReadResultFromToolResult(\n\t\t\t\t\t\targs.path,\n\t\t\t\t\t\ttoolResult,\n\t\t\t\t\t\targs.offset !== undefined || args.limit !== undefined,\n\t\t\t\t\t),\n\t\t\t\t(reason) => buildReadRejectedResult(args.path, reason),\n\t\t\t\t(error) => buildReadErrorResult(args.path, error),\n\t\t\t\t{ toolCallId: args.toolCallId, toolName: \"read\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"readResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"lsArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tif (!args.toolCallId) args.toolCallId = randomUUID();\n\t\t\t// The bridge maps `ls` onto the local `ls` tool; mirror that here so\n\t\t\t// the synthesized block matches the toolResult's `toolName`.\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, args.toolCallId, \"ls\", { path: piLsPath(args.path) });\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\targs,\n\t\t\t\texecHandlers?.ls?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\t(toolResult) => buildLsResultFromToolResult(args.path, toolResult),\n\t\t\t\t(reason) => buildLsRejectedResult(args.path, reason),\n\t\t\t\t(error) => buildLsErrorResult(args.path, error),\n\t\t\t\t{ toolCallId: args.toolCallId, toolName: \"ls\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"lsResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"grepArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tif (!args.toolCallId) args.toolCallId = randomUUID();\n\t\t\t// Cursor's model sometimes emits `grepArgs` with an empty `pattern`\n\t\t\t// and a non-empty `glob`, expecting grep to list files matching the\n\t\t\t// glob. Reject that up front with an actionable error.\n\t\t\tconst emptyPatternError = emptyGrepPatternRejection(args.pattern, args.glob);\n\t\t\tif (emptyPatternError !== null) {\n\t\t\t\tsendExecClientMessage(h2Request, execMsg, \"grepResult\", buildGrepErrorResult(emptyPatternError));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Mirror the coding-agent bridge's arg mapping so live UI (from\n\t\t\t// `tool_execution_start`) and rebuilt transcript display identical args.\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, args.toolCallId, \"grep\", {\n\t\t\t\tpattern: args.pattern,\n\t\t\t\tpath: args.path || undefined,\n\t\t\t\tglob: args.glob || undefined,\n\t\t\t\tignoreCase: args.caseInsensitive === true ? true : undefined,\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\targs,\n\t\t\t\texecHandlers?.grep?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\t(toolResult) => buildGrepResultFromToolResult(args, toolResult),\n\t\t\t\t(reason) => buildGrepErrorResult(reason),\n\t\t\t\t(error) => buildGrepErrorResult(error),\n\t\t\t\t{ toolCallId: args.toolCallId, toolName: \"grep\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"grepResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"writeArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tif (!args.toolCallId) args.toolCallId = randomUUID();\n\t\t\t// Match the bridge: prefer `fileText`, fall back to decoded `fileBytes`.\n\t\t\tconst content = args.fileText ?? new TextDecoder().decode(args.fileBytes ?? new Uint8Array());\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, args.toolCallId, \"write\", {\n\t\t\t\tpath: args.path,\n\t\t\t\tcontent,\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\targs,\n\t\t\t\texecHandlers?.write?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\t(toolResult) =>\n\t\t\t\t\tbuildWriteResultFromToolResult(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: args.path,\n\t\t\t\t\t\t\tfileText: args.fileText,\n\t\t\t\t\t\t\tfileBytes: args.fileBytes,\n\t\t\t\t\t\t\treturnFileContentAfterWrite: args.returnFileContentAfterWrite,\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttoolResult,\n\t\t\t\t\t),\n\t\t\t\t(reason) => buildWriteRejectedResult(args.path, reason),\n\t\t\t\t(error) => buildWriteErrorResult(args.path, error),\n\t\t\t\t{ toolCallId: args.toolCallId, toolName: \"write\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"writeResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"deleteArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tif (!args.toolCallId) args.toolCallId = randomUUID();\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, args.toolCallId, \"delete\", { path: args.path });\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\targs,\n\t\t\t\texecHandlers?.delete?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\t(toolResult) => buildDeleteResultFromToolResult(args.path, toolResult),\n\t\t\t\t(reason) => buildDeleteRejectedResult(args.path, reason),\n\t\t\t\t(error) => buildDeleteErrorResult(args.path, error),\n\t\t\t\t{ toolCallId: args.toolCallId, toolName: \"delete\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"deleteResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"shellArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tif (!args.toolCallId) args.toolCallId = randomUUID();\n\t\t\tconst normalizedArgs: ShellArgs = { ...args, workingDirectory: args.workingDirectory || process.cwd() };\n\t\t\tconst shellTimeout = args.timeout && args.timeout > 0 ? args.timeout : undefined;\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, args.toolCallId, \"bash\", {\n\t\t\t\tcommand: composeShellCommand(args.command, args.workingDirectory || undefined),\n\t\t\t\ttimeout: shellTimeout,\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\tnormalizedArgs,\n\t\t\t\texecHandlers?.shell?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\t(toolResult) => buildShellResultFromToolResult(normalizedArgs, toolResult),\n\t\t\t\t(reason) => buildShellRejectedResult(normalizedArgs.command, normalizedArgs.workingDirectory, reason),\n\t\t\t\t(error) => buildShellFailureResult(normalizedArgs.command, normalizedArgs.workingDirectory, error),\n\t\t\t\t{ toolCallId: args.toolCallId, toolName: \"bash\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"shellResult\", sanitizeShellExecResult(execResult));\n\t\t\treturn;\n\t\t}\n\t\tcase \"shellStreamArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tif (!args.toolCallId) args.toolCallId = randomUUID();\n\t\t\tconst shellStreamTimeout = args.timeout && args.timeout > 0 ? args.timeout : undefined;\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, args.toolCallId, \"bash\", {\n\t\t\t\tcommand: composeShellCommand(args.command, args.workingDirectory || undefined),\n\t\t\t\ttimeout: shellStreamTimeout,\n\t\t\t});\n\t\t\tawait handleShellStreamArgs(args, execMsg, h2Request, execHandlers, onToolResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"backgroundShellSpawnArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst execResult = create(BackgroundShellSpawnResultSchema, {\n\t\t\t\tresult: {\n\t\t\t\t\tcase: \"rejected\",\n\t\t\t\t\tvalue: create(ShellRejectedSchema, {\n\t\t\t\t\t\tcommand: args.command,\n\t\t\t\t\t\tworkingDirectory: args.workingDirectory,\n\t\t\t\t\t\treason: \"Not implemented\",\n\t\t\t\t\t\tisReadonly: false,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"backgroundShellSpawnResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"writeShellStdinArgs\": {\n\t\t\tconst execResult = create(WriteShellStdinResultSchema, {\n\t\t\t\tresult: {\n\t\t\t\t\tcase: \"error\",\n\t\t\t\t\tvalue: create(WriteShellStdinErrorSchema, {\n\t\t\t\t\t\terror: \"Not implemented\",\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"writeShellStdinResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"fetchArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst execResult = create(FetchResultSchema, {\n\t\t\t\tresult: {\n\t\t\t\t\tcase: \"error\",\n\t\t\t\t\tvalue: create(FetchErrorSchema, {\n\t\t\t\t\t\turl: args.url,\n\t\t\t\t\t\terror: \"Not implemented\",\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"fetchResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"diagnosticsArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tif (!args.toolCallId) args.toolCallId = randomUUID();\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\targs,\n\t\t\t\texecHandlers?.diagnostics?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\t(toolResult) => buildDiagnosticsResultFromToolResult(args.path, toolResult),\n\t\t\t\t(reason) => buildDiagnosticsRejectedResult(args.path, reason),\n\t\t\t\t(error) => buildDiagnosticsErrorResult(args.path, error),\n\t\t\t\t// senpi has no local diagnostics tool; the frame is answered with a\n\t\t\t\t// refusal and no block is synthesized (nothing ran).\n\t\t\t\tnull,\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"diagnosticsResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"mcpArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst mcpCall = decodeMcpCall(args);\n\t\t\t// An approval probe, not an invocation: the frame asks whether the\n\t\t\t// call would be permitted. Only a definite allow is approved; without\n\t\t\t// a handler there is nothing to decide with, so it is refused. Either\n\t\t\t// way no block is synthesized — nothing ran.\n\t\t\tif (mcpCall.approvalOnly) {\n\t\t\t\tconst approved = (await execHandlers?.mcpApprovalPreflight?.(mcpCall)) === true;\n\t\t\t\tsendExecClientMessage(\n\t\t\t\t\th2Request,\n\t\t\t\t\texecMsg,\n\t\t\t\t\t\"mcpResult\",\n\t\t\t\t\tcreate(McpResultSchema, {\n\t\t\t\t\t\tresult: approved\n\t\t\t\t\t\t\t? { case: \"approved\", value: create(McpApprovedSchema, {}) }\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\tcase: \"rejected\",\n\t\t\t\t\t\t\t\t\tvalue: create(McpRejectedSchema, {\n\t\t\t\t\t\t\t\t\t\treason: `Tool \"${mcpCall.toolName || mcpCall.name}\" is not approved to run without asking.`,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (execHandlers?.mcp) {\n\t\t\t\tconst existingBlock = output.content.find(\n\t\t\t\t\t(block) => block.type === \"toolCall\" && block.id === mcpCall.toolCallId,\n\t\t\t\t);\n\t\t\t\tif (existingBlock) {\n\t\t\t\t\tmarkCursorExecResolved(existingBlock);\n\t\t\t\t} else {\n\t\t\t\t\tsynthesizeCursorExecToolCall(\n\t\t\t\t\t\toutput,\n\t\t\t\t\t\tstream,\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tmcpCall.toolCallId,\n\t\t\t\t\t\tmcpCall.toolName || mcpCall.name,\n\t\t\t\t\t\tmcpCall.args,\n\t\t\t\t\t);\n\t\t\t\t\tstate.resolvedMcpToolCallIds.add(mcpCall.toolCallId);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\tmcpCall,\n\t\t\t\texecHandlers?.mcp?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\t(toolResult) => buildMcpResultFromToolResult(mcpCall, toolResult),\n\t\t\t\t(_reason) => buildMcpToolNotFoundResult(mcpCall),\n\t\t\t\t(error) => buildMcpErrorResult(error),\n\t\t\t\texecHandlers?.mcp ? { toolCallId: mcpCall.toolCallId, toolName: mcpCall.toolName } : null,\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"mcpResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"listMcpResourcesExecArgs\": {\n\t\t\t// This client hosts no MCP resources; the honest answer is an explicit\n\t\t\t// empty success. An unset-oneof result would read as \"the call\n\t\t\t// produced nothing\".\n\t\t\tconst execResult = create(ListMcpResourcesExecResultSchema, {\n\t\t\t\tresult: {\n\t\t\t\t\tcase: \"success\",\n\t\t\t\t\tvalue: create(ListMcpResourcesSuccessSchema, { resources: [] }),\n\t\t\t\t},\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"listMcpResourcesExecResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"readMcpResourceExecArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst execResult = create(ReadMcpResourceExecResultSchema, {\n\t\t\t\tresult: { case: \"notFound\", value: create(ReadMcpResourceNotFoundSchema, { uri: args.uri }) },\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"readMcpResourceExecResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"recordScreenArgs\": {\n\t\t\tconst execResult = create(RecordScreenResultSchema, {\n\t\t\t\tresult: { case: \"failure\", value: create(RecordScreenFailureSchema, { error: NOT_IMPLEMENTED }) },\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"recordScreenResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"computerUseArgs\": {\n\t\t\tconst execResult = create(ComputerUseResultSchema, {\n\t\t\t\tresult: { case: \"error\", value: create(ComputerUseErrorSchema, { error: NOT_IMPLEMENTED }) },\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"computerUseResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"piReadArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst toolCallId = randomUUID();\n\t\t\tconst readArgs = piReadArgs(args.path, args.offset, args.limit);\n\t\t\tsynthesizeCursorExecToolCall(\n\t\t\t\toutput,\n\t\t\t\tstream,\n\t\t\t\tstate,\n\t\t\t\ttoolCallId,\n\t\t\t\t\"read\",\n\t\t\t\treadArgs ?? { path: args.path, offset: args.offset, limit: 0 },\n\t\t\t);\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\t{ args, toolCallId },\n\t\t\t\texecHandlers?.piRead?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\tbuildPiReadResult,\n\t\t\t\tbuildPiReadError,\n\t\t\t\tbuildPiReadError,\n\t\t\t\t{ toolCallId, toolName: \"read\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"piReadResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"piBashArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst toolCallId = randomUUID();\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, toolCallId, \"bash\", {\n\t\t\t\tcommand: args.command,\n\t\t\t\ttimeout: piTimeout(args.timeout),\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\t{ args, toolCallId },\n\t\t\t\texecHandlers?.piBash?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\tbuildPiBashResult,\n\t\t\t\tbuildPiBashError,\n\t\t\t\tbuildPiBashError,\n\t\t\t\t{ toolCallId, toolName: \"bash\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"piBashResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"piEditArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst toolCallId = randomUUID();\n\t\t\t// `PiEditReplacement[]` maps 1:1 onto the local `edit` tool's\n\t\t\t// `edits[{oldText,newText}]` shape.\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, toolCallId, \"edit\", {\n\t\t\t\tpath: args.path,\n\t\t\t\tedits: args.edits.map((edit) => ({ oldText: edit.oldText, newText: edit.newText })),\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\t{ args, toolCallId },\n\t\t\t\texecHandlers?.piEdit?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\tbuildPiEditResult,\n\t\t\t\tbuildPiEditRejected,\n\t\t\t\tbuildPiEditError,\n\t\t\t\t{ toolCallId, toolName: \"edit\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"piEditResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"piWriteArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst toolCallId = randomUUID();\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, toolCallId, \"write\", {\n\t\t\t\tpath: args.path,\n\t\t\t\tcontent: args.content,\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\t{ args, toolCallId },\n\t\t\t\texecHandlers?.piWrite?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\tbuildPiWriteResult,\n\t\t\t\tbuildPiWriteRejected,\n\t\t\t\tbuildPiWriteError,\n\t\t\t\t{ toolCallId, toolName: \"write\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"piWriteResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"piGrepArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst toolCallId = randomUUID();\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, toolCallId, \"grep\", {\n\t\t\t\tpattern: args.pattern,\n\t\t\t\tpath: args.path || undefined,\n\t\t\t\tglob: args.glob || undefined,\n\t\t\t\tignoreCase: args.ignoreCase === true ? true : undefined,\n\t\t\t\tliteral: args.literal === true ? true : undefined,\n\t\t\t\tcontext: args.context,\n\t\t\t\tlimit: piLimit(args.limit),\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\t{ args, toolCallId },\n\t\t\t\texecHandlers?.piGrep?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\tbuildPiGrepResult,\n\t\t\t\tbuildPiGrepError,\n\t\t\t\tbuildPiGrepError,\n\t\t\t\t{ toolCallId, toolName: \"grep\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"piGrepResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"piFindArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst toolCallId = randomUUID();\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, toolCallId, \"find\", {\n\t\t\t\tpattern: args.pattern,\n\t\t\t\tpath: args.path || undefined,\n\t\t\t\tlimit: piLimit(args.limit),\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\t{ args, toolCallId },\n\t\t\t\texecHandlers?.piFind?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\tbuildPiFindResult,\n\t\t\t\tbuildPiFindError,\n\t\t\t\tbuildPiFindError,\n\t\t\t\t{ toolCallId, toolName: \"find\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"piFindResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"piLsArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst toolCallId = randomUUID();\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, toolCallId, \"ls\", {\n\t\t\t\tpath: piLsPath(args.path),\n\t\t\t\tlimit: piLimit(args.limit),\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\t{ args, toolCallId },\n\t\t\t\texecHandlers?.piLs?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\tbuildPiLsResult,\n\t\t\t\tbuildPiLsError,\n\t\t\t\tbuildPiLsError,\n\t\t\t\t{ toolCallId, toolName: \"ls\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"piLsResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"miniSweAgentBashArgs\": {\n\t\t\t// Same `ShellArgs`/`ShellResult` pair as `shellArgs`, under its own\n\t\t\t// frame number, so the existing shell handler answers it unchanged.\n\t\t\tconst args = execMsg.message.value;\n\t\t\tif (!args.toolCallId) args.toolCallId = randomUUID();\n\t\t\tconst normalizedArgs: ShellArgs = { ...args, workingDirectory: args.workingDirectory || process.cwd() };\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, args.toolCallId, \"bash\", {\n\t\t\t\tcommand: composeShellCommand(args.command, args.workingDirectory || undefined),\n\t\t\t\ttimeout: args.timeout && args.timeout > 0 ? args.timeout : undefined,\n\t\t\t});\n\t\t\tconst { execResult } = await resolveExecHandler(\n\t\t\t\tnormalizedArgs,\n\t\t\t\texecHandlers?.shell?.bind(execHandlers),\n\t\t\t\tonToolResult,\n\t\t\t\t(toolResult) => buildShellResultFromToolResult(normalizedArgs, toolResult),\n\t\t\t\t(reason) => buildShellRejectedResult(normalizedArgs.command, normalizedArgs.workingDirectory, reason),\n\t\t\t\t(error) => buildShellFailureResult(normalizedArgs.command, normalizedArgs.workingDirectory, error),\n\t\t\t\t{ toolCallId: args.toolCallId, toolName: \"bash\" },\n\t\t\t);\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"miniSweAgentBashResult\", sanitizeShellExecResult(execResult));\n\t\t\treturn;\n\t\t}\n\t\tcase \"redactedReadArgs\": {\n\t\t\t// The server expects the client to strip secrets from the content\n\t\t\t// first. No redaction is implemented here, and serving a plain read\n\t\t\t// would hand back exactly the unredacted bytes the frame exists to\n\t\t\t// withhold.\n\t\t\tconst args = execMsg.message.value;\n\t\t\tsendExecClientMessage(\n\t\t\t\th2Request,\n\t\t\t\texecMsg,\n\t\t\t\t\"redactedReadResult\",\n\t\t\t\tbuildReadErrorResult(args.path, \"Secret redaction is not implemented by this client\"),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tcase \"mcpStateExecArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tsendExecClientMessage(\n\t\t\t\th2Request,\n\t\t\t\texecMsg,\n\t\t\t\t\"mcpStateExecResult\",\n\t\t\t\tbuildMcpStateResult(requestContextTools, args.serverIdentifiers),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tcase \"executeHookArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst execResult = buildNeutralHookResult(args.request);\n\t\t\tif (!execResult) {\n\t\t\t\tsendExecClientThrow(\n\t\t\t\t\th2Request,\n\t\t\t\t\texecMsg,\n\t\t\t\t\t`Unsupported hook request: ${args.request?.request.case ?? \"unset\"}`,\n\t\t\t\t\t\"unknown_hook_request\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"executeHookResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"subagentArgs\": {\n\t\t\tconst execResult = create(SubagentResultSchema, {\n\t\t\t\tresult: {\n\t\t\t\t\tcase: \"error\",\n\t\t\t\t\tvalue: create(SubagentErrorSchema, { error: `Subagents are ${NOT_IMPLEMENTED_SUFFIX}` }),\n\t\t\t\t},\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"subagentResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"subagentAwaitArgs\": {\n\t\t\t// No subagent was ever spawned, so every awaited id is genuinely unknown.\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst execResult = create(SubagentAwaitResultSchema, {\n\t\t\t\tresult: {\n\t\t\t\t\tcase: \"notFound\",\n\t\t\t\t\tvalue: create(SubagentAwaitNotFoundSchema, { agentId: args.agentId }),\n\t\t\t\t},\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"subagentAwaitResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"forceBackgroundShellArgs\": {\n\t\t\t// Backgrounding targets a running tool call by id. This client runs\n\t\t\t// every shell to completion in band, so there is never one to move.\n\t\t\tconst execResult = create(ForceBackgroundShellResultSchema, {\n\t\t\t\tstatus: ForceBackgroundShellStatus.NOT_FOUND,\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"forceBackgroundShellResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"forceBackgroundSubagentArgs\": {\n\t\t\tconst execResult = create(ForceBackgroundSubagentResultSchema, {\n\t\t\t\tstatus: ForceBackgroundSubagentStatus.NOT_FOUND,\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"forceBackgroundSubagentResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"smartModeClassifierArgs\": {\n\t\t\t// The classifier decides whether a risky action needs approval.\n\t\t\t// Answering `ALLOW` would silently wave through actions the server\n\t\t\t// asked us to judge, so the honest answer is that no classifier\n\t\t\t// exists here.\n\t\t\tconst execResult = create(SmartModeClassifierResultSchema, {\n\t\t\t\tresult: {\n\t\t\t\t\tcase: \"error\",\n\t\t\t\t\tvalue: create(SmartModeClassifierErrorSchema, {\n\t\t\t\t\t\terror: `Smart-mode classification is ${NOT_IMPLEMENTED_SUFFIX}`,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"smartModeClassifierResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"canvasDiagnosticsArgs\": {\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst execResult = create(CanvasDiagnosticsResultSchema, {\n\t\t\t\tresult: {\n\t\t\t\t\tcase: \"error\",\n\t\t\t\t\tvalue: create(CanvasDiagnosticsErrorSchema, {\n\t\t\t\t\t\tpath: args.path,\n\t\t\t\t\t\terror: `Canvas diagnostics are ${NOT_IMPLEMENTED_SUFFIX}`,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"canvasDiagnosticsResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"shellAllowlistPrecheckArgs\": {\n\t\t\t// The prechecks ask \"is this pre-approved, so may it skip the approval\n\t\t\t// prompt?\". This client keeps no allowlist, so the answer is always\n\t\t\t// no: `false` costs an approval round-trip, `true` would grant one\n\t\t\t// that was never configured.\n\t\t\tsendExecClientMessage(\n\t\t\t\th2Request,\n\t\t\t\texecMsg,\n\t\t\t\t\"shellAllowlistPrecheckResult\",\n\t\t\t\tcreate(ShellAllowlistPrecheckResultSchema, { allowlisted: false }),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tcase \"mcpAllowlistPrecheckArgs\": {\n\t\t\tsendExecClientMessage(\n\t\t\t\th2Request,\n\t\t\t\texecMsg,\n\t\t\t\t\"mcpAllowlistPrecheckResult\",\n\t\t\t\tcreate(McpAllowlistPrecheckResultSchema, { allowlisted: false }),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tcase \"webFetchAllowlistPrecheckArgs\": {\n\t\t\tsendExecClientMessage(\n\t\t\t\th2Request,\n\t\t\t\texecMsg,\n\t\t\t\t\"webFetchAllowlistPrecheckResult\",\n\t\t\t\tcreate(WebFetchAllowlistPrecheckResultSchema, { allowlisted: false }),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tcase \"conversationSearchArgs\": {\n\t\t\t// Cursor conversation history lives server-side; this client keeps no\n\t\t\t// local index of it to search. The streamed envelope announces this\n\t\t\t// call but the interaction decoder builds no block for it, so the\n\t\t\t// block and its paired result are synthesized here.\n\t\t\tconst args = execMsg.message.value;\n\t\t\tconst toolCallId = args.toolCallId || randomUUID();\n\t\t\tconst error = `Conversation search is ${NOT_IMPLEMENTED_SUFFIX}`;\n\t\t\tsynthesizeCursorExecToolCall(output, stream, state, toolCallId, \"search_conversations\", {\n\t\t\t\tquery: args.query,\n\t\t\t\tlimit: args.limit,\n\t\t\t});\n\t\t\tawait pairSynthesizedExecResult(state, onToolResult, toolCallId, \"search_conversations\", error);\n\t\t\tconst execResult = create(ConversationSearchResultSchema, {\n\t\t\t\tresult: { case: \"error\", value: create(ConversationSearchErrorSchema, { error }) },\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"conversationSearchResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"agentStoreConflictArgs\": {\n\t\t\t// The agent store is Cursor's own on-disk journal; this client never\n\t\t\t// writes one, so it has no conflict events to replay.\n\t\t\tconst execResult = create(AgentStoreConflictResultSchema, {\n\t\t\t\tresult: {\n\t\t\t\t\tcase: \"error\",\n\t\t\t\t\tvalue: create(AgentStoreConflictErrorSchema, {\n\t\t\t\t\t\terror: `Agent store conflicts are ${NOT_IMPLEMENTED_SUFFIX}`,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t});\n\t\t\tsendExecClientMessage(h2Request, execMsg, \"agentStoreConflictResult\", execResult);\n\t\t\treturn;\n\t\t}\n\t\tcase \"gitDiffRequest\": {\n\t\t\t// `GetDiffResponse` has no error variant, so any in-band answer is a\n\t\t\t// claim that a diff was computed; a `throw` is the only truthful reply.\n\t\t\tsendExecClientThrow(h2Request, execMsg, `Git diff is ${NOT_IMPLEMENTED_SUFFIX}`, \"exec_variant_unsupported\");\n\t\t\treturn;\n\t\t}\n\t\tdefault: {\n\t\t\t// A frame number this build recognises structurally but has no answer\n\t\t\t// for. Distinct from the unset-case path above: there the client\n\t\t\t// cannot even name the frame.\n\t\t\tlog(\"warn\", \"unhandledExecMessage\", { execCase });\n\t\t\tsendExecClientThrow(\n\t\t\t\th2Request,\n\t\t\t\texecMsg,\n\t\t\t\t`No handler for exec message of type ${execCase}`,\n\t\t\t\t\"exec_variant_unsupported\",\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction armCursorExecHeartbeat(h2Request: http2.ClientHttp2Stream, execMsg: ExecServerMessage): () => void {\n\treturn armExecHeartbeat({\n\t\tintervalMs: EXEC_HEARTBEAT_INTERVAL_MS,\n\t\tisClosed: () => h2Request.closed,\n\t\twriteHeartbeat: (onComplete) => {\n\t\t\tconst controlMessage = create(ExecClientControlMessageSchema, {\n\t\t\t\tmessage: {\n\t\t\t\t\tcase: \"heartbeat\",\n\t\t\t\t\tvalue: create(ExecClientHeartbeatSchema, { id: execMsg.id }),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst clientMessage = create(AgentClientMessageSchema, {\n\t\t\t\tmessage: { case: \"execClientControlMessage\", value: controlMessage },\n\t\t\t});\n\t\t\th2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema, clientMessage)), onComplete);\n\t\t\tlog(\"execClientControl\", \"heartbeat\", { id: execMsg.id, execId: execMsg.execId });\n\t\t},\n\t});\n}\n\n/**\n * Send one typed answer on the exec channel.\n *\n * `ExecClientMessage[\"message\"]` is a discriminated union pairing each case\n * with its own result type, so the generic is keyed on the case: passing a\n * `ReadResult` under `\"shellResult\"` is a compile error rather than a wire\n * message the server rejects at runtime.\n */\nfunction sendExecClientMessage<TCase extends NonNullable<ExecClientMessage[\"message\"][\"case\"]>>(\n\th2Request: http2.ClientHttp2Stream,\n\texecMsg: ExecServerMessage,\n\tmessageCase: TCase,\n\tvalue: Extract<ExecClientMessage[\"message\"], { case: TCase }>[\"value\"],\n): void {\n\tconst execClientMessage = create(ExecClientMessageSchema, {\n\t\tid: execMsg.id,\n\t\texecId: execMsg.execId,\n\t\tmessage: { case: messageCase, value } as ExecClientMessage[\"message\"],\n\t});\n\n\tconst clientMessage = create(AgentClientMessageSchema, {\n\t\tmessage: { case: \"execClientMessage\", value: execClientMessage },\n\t});\n\n\th2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema, clientMessage)));\n\n\tlog(\"execClientMessage\", messageCase);\n}\n\n/**\n * Fail one exec frame in band.\n *\n * `ExecClientThrow` is the protocol's failure channel for a frame that cannot\n * be answered at all — as opposed to a frame answered with its own typed\n * error variant, which means \"the tool ran and failed\". The server surfaces\n * the error to the model instead of blocking on a reply that never comes.\n */\nfunction sendExecClientThrow(\n\th2Request: http2.ClientHttp2Stream,\n\texecMsg: ExecServerMessage,\n\terror: string,\n\terrorCode?: string,\n): void {\n\tconst controlMessage = create(ExecClientControlMessageSchema, {\n\t\tmessage: {\n\t\t\tcase: \"throw\",\n\t\t\tvalue: create(ExecClientThrowSchema, { id: execMsg.id, error, errorCode }),\n\t\t},\n\t});\n\tconst clientMessage = create(AgentClientMessageSchema, {\n\t\tmessage: { case: \"execClientControlMessage\", value: controlMessage },\n\t});\n\th2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema, clientMessage)));\n\tlog(\"execClientControl\", \"throw\", { id: execMsg.id, execId: execMsg.execId, error, errorCode });\n}\n\nfunction sendExecClientStreamClose(h2Request: http2.ClientHttp2Stream, execMsg: ExecServerMessage): void {\n\tconst closeMessage = create(ExecClientControlMessageSchema, {\n\t\tmessage: {\n\t\t\tcase: \"streamClose\",\n\t\t\tvalue: create(ExecClientStreamCloseSchema, {\n\t\t\t\tid: execMsg.id,\n\t\t\t}),\n\t\t},\n\t});\n\tconst clientMessage = create(AgentClientMessageSchema, {\n\t\tmessage: { case: \"execClientControlMessage\", value: closeMessage },\n\t});\n\th2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema, clientMessage)));\n\tlog(\"execClientControl\", \"streamClose\", { id: execMsg.id, execId: execMsg.execId });\n}\n\n/**\n * Exported for tests: dispatches one exec frame onto its handler.\n *\n * Every exit pairs a `toolResult`. The synthesized block was already marked\n * `kCursorExecResolved` before this runs, so the agent loop emits no\n * placeholder for it: a path that returns without a result leaves the call\n * unpaired and transcript rebuilds strip the whole interaction. The three\n * result-less paths — no handler installed, a handler that produced nothing,\n * and a thrown handler — therefore synthesize one from the same text the\n * server sees in `execResult`.\n *\n * `pairing` is required so a new callsite cannot silently recreate the\n * orphan, and nullable for the callers whose block is NOT pre-resolved (MCP\n * without an `mcp` handler, which the agent loop runs locally and pairs\n * itself, and frames that never synthesize a block).\n */\nexport async function resolveExecHandler<TArgs, TResult>(\n\targs: TArgs,\n\thandler: ((args: TArgs) => Promise<CursorExecHandlerResult<TResult>>) | undefined,\n\tonToolResult: CursorToolResultHandler | undefined,\n\tbuildFromToolResult: (toolResult: ToolResultMessage) => TResult,\n\tbuildRejected: (reason: string) => TResult,\n\tbuildError: (error: string) => TResult,\n\tpairing: CursorExecPairing | null,\n): Promise<{ execResult: TResult; toolResult?: ToolResultMessage }> {\n\tconst pair = async (text: string, isError: boolean): Promise<ToolResultMessage | undefined> => {\n\t\tif (!pairing) return undefined;\n\t\tconst synthesized: ToolResultMessage = {\n\t\t\trole: \"toolResult\",\n\t\t\ttoolCallId: pairing.toolCallId,\n\t\t\ttoolName: pairing.toolName,\n\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\tisError,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t\treturn await applyToolResultHandler(synthesized, onToolResult);\n\t};\n\n\tif (!handler) {\n\t\tconst reason = \"Tool not available\";\n\t\treturn { execResult: buildRejected(reason), toolResult: await pair(reason, true) };\n\t}\n\n\ttry {\n\t\tconst handlerResult = await handler(args);\n\t\tconst { execResult, toolResult } = splitExecHandlerResult(handlerResult);\n\t\tconst finalToolResult = await applyToolResultHandler(toolResult, onToolResult);\n\n\t\tif (execResult) {\n\t\t\t// TResult-only is a supported return form, so the transcript entry\n\t\t\t// has to be synthesized here, derived from the raw result so the two\n\t\t\t// views stay consistent.\n\t\t\treturn {\n\t\t\t\texecResult,\n\t\t\t\ttoolResult: finalToolResult ?? (await pair(...describeExecResult(execResult))),\n\t\t\t};\n\t\t}\n\t\tif (finalToolResult) {\n\t\t\treturn { execResult: buildFromToolResult(finalToolResult), toolResult: finalToolResult };\n\t\t}\n\t\tconst reason = \"Tool returned no result\";\n\t\treturn { execResult: buildRejected(reason), toolResult: await pair(reason, true) };\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn { execResult: buildError(message), toolResult: await pair(message, true) };\n\t}\n}\n\n/**\n * Derive the transcript state of an exec result the handler returned in the\n * TResult-only form, which carries no `toolResult` to copy it from.\n *\n * Every exec result in `agent.proto` is a `oneof result` whose success\n * variant is named `success` — the rest are failures. MCP is the one shape\n * where `success` is not enough: `McpSuccess.is_error` carries an\n * application-level tool failure inside the success variant.\n */\nfunction describeExecResult(execResult: unknown): [text: string, isError: boolean] {\n\tconst result = (execResult as { result?: { case?: string; value?: unknown } } | null)?.result;\n\tconst variant = result?.case;\n\tif (variant === \"success\") {\n\t\tconst success = result?.value as { isError?: boolean; content?: unknown[] } | undefined;\n\t\tif (!success?.isError) return [\"Tool produced no transcript result\", false];\n\t\treturn [mcpContentToText(success.content) || \"MCP tool reported an error\", true];\n\t}\n\tif (!variant) return [\"Tool produced no transcript result\", false];\n\tconst value = result?.value as { error?: string; reason?: string } | undefined;\n\treturn [value?.error || value?.reason || `Tool call ${variant}`, true];\n}\n\n/** Flatten `McpSuccess.content` into transcript text. */\nfunction mcpContentToText(content: unknown[] | undefined): string {\n\tif (!Array.isArray(content)) return \"\";\n\tconst parts: string[] = [];\n\tfor (const item of content) {\n\t\tconst inner = (item as { content?: { case?: string; value?: { text?: string } } } | null)?.content;\n\t\tif (inner?.case === \"text\" && inner.value?.text) parts.push(inner.value.text);\n\t}\n\treturn parts.join(\"\\n\");\n}\n\nfunction splitExecHandlerResult<TResult>(result: CursorExecHandlerResult<TResult>): {\n\texecResult?: TResult;\n\ttoolResult?: ToolResultMessage;\n} {\n\tif (isToolResultMessage(result)) {\n\t\treturn { toolResult: result };\n\t}\n\tif (result && typeof result === \"object\") {\n\t\tconst record = result as Record<string, unknown>;\n\t\tif (\"execResult\" in record) {\n\t\t\tconst { execResult, toolResult } = record as {\n\t\t\t\texecResult: TResult;\n\t\t\t\ttoolResult?: ToolResultMessage;\n\t\t\t};\n\t\t\treturn { execResult, toolResult };\n\t\t}\n\t\tif (\"toolResult\" in record && !isToolResultMessage(record)) {\n\t\t\tconst { result: execResult, toolResult } = record as {\n\t\t\t\tresult?: TResult;\n\t\t\t\ttoolResult?: ToolResultMessage;\n\t\t\t};\n\t\t\treturn { execResult, toolResult };\n\t\t}\n\t\tif (\"result\" in record && !(\"$typeName\" in record)) {\n\t\t\tconst { result: execResult, toolResult } = record as {\n\t\t\t\tresult: TResult;\n\t\t\t\ttoolResult?: ToolResultMessage;\n\t\t\t};\n\t\t\treturn { execResult, toolResult };\n\t\t}\n\t}\n\treturn { execResult: result as TResult };\n}\n\nfunction isToolResultMessage(value: unknown): value is ToolResultMessage {\n\treturn !!value && typeof value === \"object\" && (value as ToolResultMessage).role === \"toolResult\";\n}\n\nasync function applyToolResultHandler(\n\ttoolResult: ToolResultMessage | undefined,\n\tonToolResult: CursorToolResultHandler | undefined,\n): Promise<ToolResultMessage | undefined> {\n\tif (!toolResult || !onToolResult) {\n\t\treturn toolResult;\n\t}\n\tconst updated = await onToolResult(toolResult);\n\treturn updated ?? toolResult;\n}\n\nfunction toolResultToText(toolResult: ToolResultMessage): string {\n\treturn toolResult.content.map((item) => (item.type === \"text\" ? item.text : `[${item.mimeType} image]`)).join(\"\\n\");\n}\n\nfunction toolResultWasTruncated(toolResult: ToolResultMessage): boolean {\n\tif (!toolResult.details || typeof toolResult.details !== \"object\") {\n\t\treturn false;\n\t}\n\tconst truncation = (toolResult.details as { truncation?: { truncated?: boolean } }).truncation;\n\treturn !!truncation?.truncated;\n}\n\nfunction toolResultDetailBoolean(toolResult: ToolResultMessage, key: string): boolean {\n\tif (!toolResult.details || typeof toolResult.details !== \"object\") {\n\t\treturn false;\n\t}\n\tconst value = (toolResult.details as Record<string, unknown>)[key];\n\treturn typeof value === \"boolean\" ? value : false;\n}\n\n/** The file's own line count, when the tool recorded one. */\nfunction readTotalLinesFromDetails(toolResult: ToolResultMessage): number | undefined {\n\tconst details = toolResult.details;\n\tif (!details || typeof details !== \"object\") return undefined;\n\tconst direct = \"totalLines\" in details ? details.totalLines : undefined;\n\tif (typeof direct === \"number\" && Number.isFinite(direct)) return direct;\n\tconst meta = \"meta\" in details ? details.meta : undefined;\n\tif (!meta || typeof meta !== \"object\") return undefined;\n\tconst truncation = \"truncation\" in meta ? meta.truncation : undefined;\n\tif (!truncation || typeof truncation !== \"object\") return undefined;\n\tconst totalLines = \"totalLines\" in truncation ? truncation.totalLines : undefined;\n\treturn typeof totalLines === \"number\" && Number.isFinite(totalLines) ? totalLines : undefined;\n}\n\nfunction readFileSizeFromDetails(toolResult: ToolResultMessage): number | undefined {\n\tconst details = toolResult.details;\n\tif (!details || typeof details !== \"object\" || !(\"fileSize\" in details)) return undefined;\n\tconst { fileSize } = details;\n\treturn typeof fileSize === \"number\" && Number.isSafeInteger(fileSize) && fileSize >= 0 ? fileSize : undefined;\n}\n\nfunction buildReadResultFromToolResult(path: string, toolResult: ToolResultMessage, rangeApplied = false) {\n\tconst text = toolResultToText(toolResult);\n\tif (toolResult.isError) {\n\t\treturn buildReadErrorResult(path, text || \"Read failed\");\n\t}\n\t// Counting the payload is only the file's length when the payload is the\n\t// whole file: under a windowed read, answering a 20-line page of a 100-line\n\t// file with `total_lines: 20` tells a paginating server it reached the end.\n\tconst totalLines = readTotalLinesFromDetails(toolResult) ?? (rangeApplied ? 0 : text ? text.split(\"\\n\").length : 0);\n\treturn create(ReadResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(ReadSuccessSchema, {\n\t\t\t\tpath,\n\t\t\t\ttotalLines,\n\t\t\t\tfileSize: BigInt(readFileSizeFromDetails(toolResult) ?? Buffer.byteLength(text, \"utf-8\")),\n\t\t\t\ttruncated: toolResultWasTruncated(toolResult),\n\t\t\t\toutput: { case: \"content\", value: text },\n\t\t\t\trangeApplied,\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction buildReadErrorResult(path: string, error: string) {\n\treturn create(ReadResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"error\",\n\t\t\tvalue: create(ReadErrorSchema, { path, error }),\n\t\t},\n\t});\n}\n\nfunction buildReadRejectedResult(path: string, reason: string) {\n\treturn create(ReadResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"rejected\",\n\t\t\tvalue: create(ReadRejectedSchema, { path, reason }),\n\t\t},\n\t});\n}\n\nfunction buildWriteResultFromToolResult(\n\targs: { path: string; fileText?: string; fileBytes?: Uint8Array; returnFileContentAfterWrite?: boolean },\n\ttoolResult: ToolResultMessage,\n) {\n\tconst text = toolResultToText(toolResult);\n\tif (toolResult.isError) {\n\t\treturn buildWriteErrorResult(args.path, text || \"Write failed\");\n\t}\n\tconst fileText = args.fileText ?? \"\";\n\tconst fileSize = args.fileBytes?.length ?? Buffer.byteLength(fileText, \"utf-8\");\n\tconst linesCreated = fileText ? fileText.split(\"\\n\").length : 0;\n\treturn create(WriteResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(WriteSuccessSchema, {\n\t\t\t\tpath: args.path,\n\t\t\t\tlinesCreated,\n\t\t\t\tfileSize,\n\t\t\t\tfileContentAfterWrite: args.returnFileContentAfterWrite ? fileText : undefined,\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction buildWriteErrorResult(path: string, error: string) {\n\treturn create(WriteResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"error\",\n\t\t\tvalue: create(WriteErrorSchema, { path, error }),\n\t\t},\n\t});\n}\n\nfunction buildWriteRejectedResult(path: string, reason: string) {\n\treturn create(WriteResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"rejected\",\n\t\t\tvalue: create(WriteRejectedSchema, { path, reason }),\n\t\t},\n\t});\n}\n\nfunction buildDeleteResultFromToolResult(path: string, toolResult: ToolResultMessage) {\n\tconst text = toolResultToText(toolResult);\n\tif (toolResult.isError) {\n\t\treturn buildDeleteErrorResult(path, text || \"Delete failed\");\n\t}\n\treturn create(DeleteResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(DeleteSuccessSchema, {\n\t\t\t\tpath,\n\t\t\t\tdeletedFile: path,\n\t\t\t\tfileSize: BigInt(0),\n\t\t\t\tprevContent: \"\",\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction buildDeleteErrorResult(path: string, error: string) {\n\treturn create(DeleteResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"error\",\n\t\t\tvalue: create(DeleteErrorSchema, { path, error }),\n\t\t},\n\t});\n}\n\nfunction buildDeleteRejectedResult(path: string, reason: string) {\n\treturn create(DeleteResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"rejected\",\n\t\t\tvalue: create(DeleteRejectedSchema, { path, reason }),\n\t\t},\n\t});\n}\n\nfunction buildShellResultFromToolResult(\n\targs: { command: string; workingDirectory: string },\n\ttoolResult: ToolResultMessage,\n) {\n\tconst output = toolResultToText(toolResult);\n\tif (toolResult.isError) {\n\t\treturn buildShellFailureResult(args.command, args.workingDirectory, output || \"Shell failed\");\n\t}\n\treturn create(ShellResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(ShellSuccessSchema, {\n\t\t\t\tcommand: args.command,\n\t\t\t\tworkingDirectory: args.workingDirectory,\n\t\t\t\texitCode: 0,\n\t\t\t\tsignal: \"\",\n\t\t\t\tstdout: output,\n\t\t\t\tstderr: \"\",\n\t\t\t\texecutionTime: 0,\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction buildShellFailureResult(command: string, workingDirectory: string, error: string) {\n\treturn create(ShellResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"failure\",\n\t\t\tvalue: create(ShellFailureSchema, {\n\t\t\t\tcommand,\n\t\t\t\tworkingDirectory,\n\t\t\t\texitCode: 1,\n\t\t\t\tsignal: \"\",\n\t\t\t\tstdout: \"\",\n\t\t\t\tstderr: error,\n\t\t\t\texecutionTime: 0,\n\t\t\t\taborted: false,\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction buildShellRejectedResult(command: string, workingDirectory: string, reason: string) {\n\treturn create(ShellResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"rejected\",\n\t\t\tvalue: create(ShellRejectedSchema, {\n\t\t\t\tcommand,\n\t\t\t\tworkingDirectory,\n\t\t\t\treason,\n\t\t\t\tisReadonly: false,\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction buildLsResultFromToolResult(path: string, toolResult: ToolResultMessage) {\n\tconst text = toolResultToText(toolResult);\n\tif (toolResult.isError) {\n\t\treturn buildLsErrorResult(path, text || \"Ls failed\");\n\t}\n\tconst rootPath = path || \".\";\n\tconst entries = text\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trim())\n\t\t.filter((line) => line.length > 0 && !line.startsWith(\"[\"));\n\tconst childrenDirs: LsDirectoryTreeNode[] = [];\n\tconst childrenFiles: LsDirectoryTreeNode_File[] = [];\n\n\tfor (const entry of entries) {\n\t\tconst name = entry.split(\" (\")[0];\n\t\tif (name.endsWith(\"/\")) {\n\t\t\tconst dirName = name.slice(0, -1);\n\t\t\tchildrenDirs.push(\n\t\t\t\tcreate(LsDirectoryTreeNodeSchema, {\n\t\t\t\t\tabsPath: `${rootPath.replace(/\\/$/, \"\")}/${dirName}`,\n\t\t\t\t\tchildrenDirs: [],\n\t\t\t\t\tchildrenFiles: [],\n\t\t\t\t\tchildrenWereProcessed: false,\n\t\t\t\t\tfullSubtreeExtensionCounts: {},\n\t\t\t\t\tnumFiles: 0,\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tchildrenFiles.push(create(LsDirectoryTreeNode_FileSchema, { name }));\n\t\t}\n\t}\n\n\tconst root = create(LsDirectoryTreeNodeSchema, {\n\t\tabsPath: rootPath,\n\t\tchildrenDirs,\n\t\tchildrenFiles,\n\t\tchildrenWereProcessed: true,\n\t\tfullSubtreeExtensionCounts: {},\n\t\tnumFiles: childrenFiles.length,\n\t});\n\n\treturn create(LsResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(LsSuccessSchema, { directoryTreeRoot: root }),\n\t\t},\n\t});\n}\n\nfunction buildLsErrorResult(path: string, error: string) {\n\treturn create(LsResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"error\",\n\t\t\tvalue: create(LsErrorSchema, { path, error }),\n\t\t},\n\t});\n}\n\nfunction buildLsRejectedResult(path: string, reason: string) {\n\treturn create(LsResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"rejected\",\n\t\t\tvalue: create(LsRejectedSchema, { path, reason }),\n\t\t},\n\t});\n}\n\nfunction buildGrepResultFromToolResult(\n\targs: { pattern: string; path?: string; outputMode?: string; offset?: number },\n\ttoolResult: ToolResultMessage,\n) {\n\tconst text = toolResultToText(toolResult);\n\tif (toolResult.isError) {\n\t\treturn buildGrepErrorResult(text || \"Grep failed\");\n\t}\n\n\tconst outputMode = args.outputMode || \"content\";\n\tconst clientTruncated = toolResultDetailBoolean(toolResult, \"truncated\");\n\tconst lines = text\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trimEnd())\n\t\t.filter((line) => line.length > 0 && !line.startsWith(\"[\") && !line.toLowerCase().startsWith(\"no matches\"));\n\n\tconst workspaceKey = args.path || \".\";\n\tlet unionResult: GrepUnionResult;\n\n\tif (outputMode === \"files_with_matches\") {\n\t\tconst files = lines;\n\t\tunionResult = create(GrepUnionResultSchema, {\n\t\t\tresult: {\n\t\t\t\tcase: \"files\",\n\t\t\t\tvalue: create(GrepFilesResultSchema, {\n\t\t\t\t\tfiles,\n\t\t\t\t\ttotalFiles: files.length,\n\t\t\t\t\tclientTruncated,\n\t\t\t\t\tripgrepTruncated: false,\n\t\t\t\t\toffsetApplied: args.offset,\n\t\t\t\t}),\n\t\t\t},\n\t\t});\n\t} else if (outputMode === \"count\") {\n\t\tconst counts = lines\n\t\t\t.map((line) => {\n\t\t\t\tconst separatorIndex = line.lastIndexOf(\":\");\n\t\t\t\tif (separatorIndex === -1) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst file = line.slice(0, separatorIndex);\n\t\t\t\tconst count = Number.parseInt(line.slice(separatorIndex + 1), 10);\n\t\t\t\tif (!file || Number.isNaN(count)) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\treturn create(GrepFileCountSchema, { file, count });\n\t\t\t})\n\t\t\t.filter((entry): entry is GrepFileCount => entry !== null);\n\t\tconst totalMatches = counts.reduce((sum, entry) => sum + entry.count, 0);\n\t\tunionResult = create(GrepUnionResultSchema, {\n\t\t\tresult: {\n\t\t\t\tcase: \"count\",\n\t\t\t\tvalue: create(GrepCountResultSchema, {\n\t\t\t\t\tcounts,\n\t\t\t\t\ttotalFiles: counts.length,\n\t\t\t\t\ttotalMatches,\n\t\t\t\t\tclientTruncated,\n\t\t\t\t\tripgrepTruncated: false,\n\t\t\t\t\toffsetApplied: args.offset,\n\t\t\t\t}),\n\t\t\t},\n\t\t});\n\t} else {\n\t\tconst matchMap = new Map<string, Array<{ line: number; content: string; isContextLine: boolean }>>();\n\t\tlet totalMatchedLines = 0;\n\n\t\tfor (const line of lines) {\n\t\t\tconst matchLine = line.match(/^(.+?):(\\d+):\\s?(.*)$/);\n\t\t\tconst contextLine = line.match(/^(.+?)-(\\d+)-\\s?(.*)$/);\n\t\t\tconst match = matchLine ?? contextLine;\n\t\t\tif (!match) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst [, file, lineNumber, content] = match;\n\t\t\tconst isContextLine = Boolean(contextLine);\n\t\t\tconst list = matchMap.get(file) ?? [];\n\t\t\tlist.push({ line: Number(lineNumber), content, isContextLine });\n\t\t\tmatchMap.set(file, list);\n\t\t\tif (!isContextLine) {\n\t\t\t\ttotalMatchedLines += 1;\n\t\t\t}\n\t\t}\n\n\t\tconst matches = Array.from(matchMap.entries()).map(([file, fileMatches]) =>\n\t\t\tcreate(GrepFileMatchSchema, {\n\t\t\t\tfile,\n\t\t\t\tmatches: fileMatches.map((entry) =>\n\t\t\t\t\tcreate(GrepContentMatchSchema, {\n\t\t\t\t\t\tlineNumber: entry.line,\n\t\t\t\t\t\tcontent: entry.content,\n\t\t\t\t\t\tcontentTruncated: false,\n\t\t\t\t\t\tisContextLine: entry.isContextLine,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t}),\n\t\t);\n\t\tconst totalLines = matches.reduce((sum, entry) => sum + entry.matches.length, 0);\n\t\tunionResult = create(GrepUnionResultSchema, {\n\t\t\tresult: {\n\t\t\t\tcase: \"content\",\n\t\t\t\tvalue: create(GrepContentResultSchema, {\n\t\t\t\t\tmatches,\n\t\t\t\t\ttotalLines,\n\t\t\t\t\ttotalMatchedLines,\n\t\t\t\t\tclientTruncated,\n\t\t\t\t\tripgrepTruncated: false,\n\t\t\t\t\toffsetApplied: args.offset,\n\t\t\t\t}),\n\t\t\t},\n\t\t});\n\t}\n\n\treturn create(GrepResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(GrepSuccessSchema, {\n\t\t\t\tpattern: args.pattern,\n\t\t\t\tpath: args.path || \"\",\n\t\t\t\toutputMode,\n\t\t\t\tworkspaceResults: { [workspaceKey]: unionResult },\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction buildGrepErrorResult(error: string) {\n\treturn create(GrepResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"error\",\n\t\t\tvalue: create(GrepErrorSchema, { error }),\n\t\t},\n\t});\n}\n\n/**\n * Reject a Cursor exec-channel `grepArgs` frame whose `pattern` is empty or\n * whitespace-only. Returns an actionable error message (with a `glob`-aware\n * hint when the model likely meant to list files) or `null` when the pattern\n * is valid and grep should run. Exported for tests.\n */\nexport function emptyGrepPatternRejection(pattern: string | undefined, glob: string | undefined): string | null {\n\tif (pattern && pattern.trim().length > 0) return null;\n\tif (glob && glob.length > 0) {\n\t\treturn (\n\t\t\t`grep pattern is required (received an empty pattern). To list files matching \"${glob}\", ` +\n\t\t\t`pass a non-empty regex (e.g. \".\") and set path to that glob, or use the ls/read tool instead.`\n\t\t);\n\t}\n\treturn \"grep pattern is required (received an empty pattern).\";\n}\n\nfunction buildDiagnosticsResultFromToolResult(path: string, toolResult: ToolResultMessage) {\n\tconst text = toolResultToText(toolResult);\n\tif (toolResult.isError) {\n\t\treturn buildDiagnosticsErrorResult(path, text || \"Diagnostics failed\");\n\t}\n\treturn create(DiagnosticsResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(DiagnosticsSuccessSchema, {\n\t\t\t\tpath,\n\t\t\t\tdiagnostics: [],\n\t\t\t\ttotalDiagnostics: 0,\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction buildDiagnosticsErrorResult(_path: string, error: string) {\n\treturn create(DiagnosticsResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"error\",\n\t\t\tvalue: create(DiagnosticsErrorSchema, { error }),\n\t\t},\n\t});\n}\n\nfunction buildDiagnosticsRejectedResult(path: string, reason: string) {\n\treturn create(DiagnosticsResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"rejected\",\n\t\t\tvalue: create(DiagnosticsRejectedSchema, { path, reason }),\n\t\t},\n\t});\n}\n\nfunction parseToolArgsJson(text: string): unknown {\n\tconst trimmed = text.trim();\n\tif (!trimmed) {\n\t\treturn text;\n\t}\n\ttry {\n\t\treturn parseJsonWithRepair<unknown>(trimmed);\n\t} catch {\n\t\treturn text;\n\t}\n}\n\nfunction decodeMcpArgValue(value: Uint8Array): unknown {\n\ttry {\n\t\tconst parsedValue = fromBinary(ValueSchema, value);\n\t\tconst jsonValue = toJson(ValueSchema, parsedValue) as PbJsonValue;\n\t\tif (typeof jsonValue === \"string\") {\n\t\t\treturn parseToolArgsJson(jsonValue);\n\t\t}\n\t\treturn jsonValue;\n\t} catch {}\n\tconst text = new TextDecoder().decode(value);\n\treturn parseToolArgsJson(text);\n}\n\nfunction decodeMcpArgsMap(args?: Record<string, Uint8Array>): Record<string, unknown> | undefined {\n\tif (!args) {\n\t\treturn undefined;\n\t}\n\tconst decoded: Record<string, unknown> = {};\n\tfor (const [key, value] of Object.entries(args)) {\n\t\tdecoded[key] = decodeMcpArgValue(value);\n\t}\n\treturn decoded;\n}\n\nfunction decodeMcpCall(args: {\n\tname: string;\n\targs: Record<string, Uint8Array>;\n\ttoolCallId: string;\n\tproviderIdentifier: string;\n\ttoolName: string;\n\tsmartModeApprovalOnly?: boolean;\n}): CursorMcpCall {\n\tconst decodedArgs: Record<string, unknown> = {};\n\tfor (const [key, value] of Object.entries(args.args ?? {})) {\n\t\tdecodedArgs[key] = decodeMcpArgValue(value);\n\t}\n\treturn {\n\t\tname: args.name,\n\t\tproviderIdentifier: args.providerIdentifier,\n\t\ttoolName: args.toolName || args.name,\n\t\ttoolCallId: args.toolCallId,\n\t\targs: decodedArgs,\n\t\trawArgs: args.args ?? {},\n\t\tapprovalOnly: args.smartModeApprovalOnly === true,\n\t};\n}\n\n/**\n * Map Cursor's `TodoStatus` enum onto display statuses. Cancelled (4) maps to\n * `abandoned` rather than collapsing to `pending`, which would resurrect a\n * task the model explicitly cancelled.\n */\nfunction mapTodoStatusValue(status?: number): \"pending\" | \"in_progress\" | \"completed\" | \"abandoned\" {\n\tswitch (status) {\n\t\tcase 2:\n\t\t\treturn \"in_progress\";\n\t\tcase 3:\n\t\t\treturn \"completed\";\n\t\tcase 4:\n\t\t\treturn \"abandoned\";\n\t\tdefault:\n\t\t\treturn \"pending\";\n\t}\n}\n\ninterface CursorTodoItem {\n\tid?: string;\n\tcontent?: string;\n\tstatus?: number;\n\tdependencies?: string[];\n}\n\ninterface CursorTodoResult {\n\tresult?: {\n\t\tcase?: \"success\" | \"error\";\n\t\tvalue?: { todos?: CursorTodoItem[]; totalCount?: number; wasMerge?: boolean; error?: string };\n\t};\n}\n\ninterface CursorUpdateTodosCall {\n\targs?: { todos?: CursorTodoItem[]; merge?: boolean };\n\tresult?: CursorTodoResult;\n}\n\ninterface CursorReadTodosCall {\n\targs?: { statusFilter?: number[]; idFilter?: string[] };\n\tresult?: CursorTodoResult;\n}\n\n/**\n * `ToolCall` is a protobuf oneof, so a decoded message exposes the selected\n * variant as `tool: { case, value }` — NOT as a named property. Hand-built\n * fixtures use the flattened form, so both are accepted here.\n */\ninterface CursorTodoToolCall {\n\ttool?: { case?: string; value?: unknown };\n\tupdateTodosToolCall?: CursorUpdateTodosCall;\n\treadTodosToolCall?: CursorReadTodosCall;\n}\n\nfunction selectTodoCalls(toolCall: CursorTodoToolCall): {\n\tupdate?: CursorUpdateTodosCall;\n\tread?: CursorReadTodosCall;\n} {\n\tconst oneof = toolCall.tool;\n\tif (oneof?.case === \"updateTodosToolCall\") return { update: oneof.value as CursorUpdateTodosCall };\n\tif (oneof?.case === \"readTodosToolCall\") return { read: oneof.value as CursorReadTodosCall };\n\treturn { update: toolCall.updateTodosToolCall, read: toolCall.readTodosToolCall };\n}\n\nfunction mapTodoSnapshot(todos: CursorTodoItem[]) {\n\treturn todos.map((todo) => ({\n\t\tcontent: typeof todo.content === \"string\" ? todo.content : \"\",\n\t\tstatus: mapTodoStatusValue(typeof todo.status === \"number\" ? todo.status : undefined),\n\t}));\n}\n\ninterface CursorMcpToolCall {\n\targs?: {\n\t\tname?: string;\n\t\ttoolName?: string;\n\t\ttoolCallId?: string;\n\t\targs?: Record<string, Uint8Array>;\n\t};\n}\n\ninterface CursorMcpToolCallCarrier {\n\ttool?: { case?: string; value?: unknown };\n\tmcpToolCall?: CursorMcpToolCall;\n}\n\n/**\n * `ToolCall.tool` is a protobuf oneof: a wire-decoded message exposes the\n * variant as `{ case, value }` and NEVER as a flattened property. The flat\n * fallback is kept for hand-shaped test fixtures.\n */\nfunction selectMcpCall(toolCall: CursorMcpToolCallCarrier | undefined): CursorMcpToolCall | undefined {\n\tconst oneof = toolCall?.tool;\n\tif (oneof?.case === \"mcpToolCall\") return oneof.value as CursorMcpToolCall;\n\treturn toolCall?.mcpToolCall;\n}\n\n/**\n * The streamed `ToolCall` variants whose block the exec channel owns.\n *\n * Each of these is announced on the interaction stream AND dispatched as its\n * own `ExecServerMessage` frame, so the block is synthesized once, by the\n * exec handler, which is the side that has the result.\n */\nconst EXEC_OWNED_TOOL_CALL_CASES: ReadonlySet<string> = new Set([\n\t\"piReadToolCall\",\n\t\"piBashToolCall\",\n\t\"piEditToolCall\",\n\t\"piWriteToolCall\",\n\t\"piGrepToolCall\",\n\t\"piFindToolCall\",\n\t\"piLsToolCall\",\n\t\"listMcpResourcesToolCall\",\n\t\"readMcpResourceToolCall\",\n]);\n\nfunction isExecOwnedToolCall(toolCall: { tool?: { case?: string } } | undefined): boolean {\n\tconst variant = toolCall?.tool?.case;\n\treturn variant !== undefined && EXEC_OWNED_TOOL_CALL_CASES.has(variant);\n}\n\n/**\n * Close every tool-call block still open when the stream ends.\n *\n * Not just the last one started: with interleaved calls several can be open\n * at once, and an unclosed block leaves its live card animating and its call\n * unpaired. Only blocks fed by a streamed argument buffer get reparsed.\n * Server-owned blocks (`connect-scm`, `todo`) are also paired here: they are\n * stamped resolved the moment they open, so only their completion frame pairs\n * a result — a transport that closes before that frame would leave the call\n * unpaired. MCP blocks are excluded even when resolved: the exec dispatch\n * that marked them owns their result.\n */\nexport function flushOpenToolCalls(\n\toutput: AssistantMessage,\n\tstream: AssistantMessageEventStream,\n\tstate: BlockState,\n): void {\n\tconst openBlocks = new Set<ToolCallState>(state.openToolCalls.values());\n\tif (state.currentToolCall) openBlocks.add(state.currentToolCall);\n\tfor (const block of openBlocks) {\n\t\tconst idx = output.content.indexOf(block);\n\t\tconst partialJson = block[kStreamingPartialJson];\n\t\tif (partialJson !== undefined) {\n\t\t\tblock.arguments = parseStreamingJson(partialJson);\n\t\t\tclearStreamingPartialJson(block);\n\t\t}\n\t\tconst kind = block[kStreamingBlockKind];\n\t\tif (kind === \"connect-scm\" || kind === \"todo\") {\n\t\t\tvoid state.onToolResult?.({\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: block.id,\n\t\t\t\ttoolName: block.name,\n\t\t\t\tcontent: [{ type: \"text\", text: \"The connection to Cursor closed before this call completed.\" }],\n\t\t\t\tisError: true,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t}\n\t\tstream.push({ type: \"toolcall_end\", contentIndex: idx, toolCall: block, partial: output });\n\t}\n\tstate.openToolCalls.clear();\n\tstate.setToolCall(null);\n}\n\n/**\n * Retain a freshly opened streamed tool-call block, keyed by the interaction\n * envelope's `call_id`. `currentToolCall` is still set as the fallback for\n * frames that carry no `call_id`.\n */\nfunction retainStreamedCall(state: BlockState, block: ToolCallState, envelopeId: string | undefined): void {\n\tif (envelopeId) state.openToolCalls.set(envelopeId, block);\n\tstate.setToolCall(block);\n}\n\n/**\n * The open block a streamed update addresses, or `null` to ignore the update.\n *\n * Cursor interleaves calls: `start A, start B, complete A` is legal, so the\n * update must reach block A even though B opened last. An id naming no open\n * block is ignored rather than misapplied. A missing id falls back to the\n * current block.\n */\nfunction resolveStreamedCall(state: BlockState, envelopeId: string | undefined): ToolCallState | null {\n\tif (!envelopeId) return state.currentToolCall;\n\tconst keyed = state.openToolCalls.get(envelopeId);\n\tif (keyed) return keyed;\n\tconst current = state.currentToolCall;\n\treturn current && current[kStreamingEnvelopeId] === undefined ? current : null;\n}\n\n/** Release a settled block from both the keyed map and the current slot. */\nfunction releaseStreamedCall(state: BlockState, block: ToolCallState): void {\n\tconst envelopeId = block[kStreamingEnvelopeId];\n\tif (envelopeId) state.openToolCalls.delete(envelopeId);\n\tif (state.currentToolCall === block) state.setToolCall(null);\n}\n\ninterface CursorConnectScmRepository {\n\towner?: string;\n\trepo?: string;\n}\n\ninterface CursorConnectScmCall {\n\targs?: {\n\t\ttoolCallId?: string;\n\t\ttarget?: { case?: string; value?: { repository?: CursorConnectScmRepository } };\n\t\tgithub?: { repository?: CursorConnectScmRepository };\n\t};\n\tresult?: { result?: { case?: string; value?: { error?: string; reason?: string } } };\n}\n\ninterface CursorConnectScmCarrier {\n\ttool?: { case?: string; value?: unknown };\n\tconnectScmToolCall?: CursorConnectScmCall;\n}\n\nfunction selectConnectScmCall(toolCall: CursorConnectScmCarrier | undefined): CursorConnectScmCall | undefined {\n\tconst oneof = toolCall?.tool;\n\tif (oneof?.case === \"connectScmToolCall\") return oneof.value as CursorConnectScmCall;\n\treturn toolCall?.connectScmToolCall;\n}\n\nfunction selectConnectScmRepository(call: CursorConnectScmCall | undefined): CursorConnectScmRepository | undefined {\n\tconst target = call?.args?.target;\n\tif (target?.case === \"github\") return target.value?.repository;\n\treturn call?.args?.github?.repository;\n}\n\n/** Render a settled `ConnectScmResult` as the text of its paired tool result. */\nfunction describeConnectScmResult(call: CursorConnectScmCall | undefined): { text: string; isError: boolean } {\n\tconst result = call?.result?.result;\n\tswitch (result?.case) {\n\t\tcase \"success\":\n\t\t\treturn { text: \"SCM connected\", isError: false };\n\t\tcase \"error\":\n\t\t\treturn { text: result.value?.error || \"SCM connection failed\", isError: true };\n\t\tcase \"rejected\":\n\t\t\treturn { text: result.value?.reason || \"SCM connection rejected\", isError: true };\n\t\tdefault:\n\t\t\treturn { text: \"SCM connection reported no result\", isError: true };\n\t}\n}\n\n/**\n * Extract the authoritative full todo list from a completed native todo call.\n * Only `result.success.todos` is authoritative; filtered/partial/ambiguous\n * responses return `null`, which the caller MUST treat as \"nothing to mirror\".\n */\nfunction extractTodoSnapshot(\n\ttoolCall: CursorTodoToolCall,\n): { todos: ReturnType<typeof mapTodoSnapshot>; merged: boolean } | null {\n\tconst { update, read } = selectTodoCalls(toolCall);\n\tif (read && ((read.args?.statusFilter?.length ?? 0) > 0 || (read.args?.idFilter?.length ?? 0) > 0)) {\n\t\treturn null;\n\t}\n\tconst call = update ?? read;\n\tif (!call) return null;\n\tconst result = call.result?.result;\n\tif (result?.case !== \"success\") return null;\n\tconst todos = result.value?.todos;\n\tif (!todos) return null;\n\tconst totalCount = result.value?.totalCount;\n\tif (typeof totalCount === \"number\" && totalCount !== todos.length) {\n\t\treturn null;\n\t}\n\tif (read && todos.length === 0) {\n\t\treturn null;\n\t}\n\tconst mapped = mapTodoSnapshot(todos);\n\tif (mapped.some((todo) => todo.content.length === 0)) return null;\n\treturn {\n\t\ttodos: mapped,\n\t\tmerged: result.value?.wasMerge === true,\n\t};\n}\n\n/** Error text when the server itself rejected the call. */\nfunction extractTodoError(toolCall: CursorTodoToolCall): string | null {\n\tconst { update, read } = selectTodoCalls(toolCall);\n\tconst result = (update ?? read)?.result?.result;\n\tif (result?.case !== \"error\") return null;\n\tconst error = result.value?.error;\n\treturn typeof error === \"string\" && error.length > 0 ? error : \"Todo operation failed\";\n}\n\n/** Args echoed onto the synthesized display block, for rendering only. */\nfunction buildTodoDisplayArgs(toolCall: CursorTodoToolCall): {\n\ttodos: ReturnType<typeof mapTodoSnapshot>;\n\tmerge?: boolean;\n} {\n\tconst args = selectTodoCalls(toolCall).update?.args;\n\treturn {\n\t\ttodos: args?.todos ? mapTodoSnapshot(args.todos) : [],\n\t\tmerge: args?.merge === true ? true : undefined,\n\t};\n}\n\n/**\n * Paired result for a server-resolved native todo call. Nothing else would\n * produce a `toolResult` for the block — and transcript rebuilds strip any\n * `toolCall` left unpaired.\n */\nfunction buildTodoToolResult(\n\ttoolCallId: string,\n\tsnapshot: { todos: ReturnType<typeof mapTodoSnapshot> } | null,\n\terror: string | null,\n): ToolResultMessage {\n\tconst text = error ?? (snapshot ? formatTodoSnapshotSummary(snapshot.todos) : \"Todo snapshot not mirrored\");\n\treturn {\n\t\trole: \"toolResult\",\n\t\ttoolCallId,\n\t\ttoolName: \"todo\",\n\t\tcontent: [{ type: \"text\", text }],\n\t\tisError: error !== null,\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nfunction formatTodoSnapshotSummary(todos: { status: string }[]): string {\n\tif (todos.length === 0) return \"No todos\";\n\tconst done = todos.filter((todo) => todo.status === \"completed\").length;\n\treturn `${done}/${todos.length} tasks completed`;\n}\n\nfunction buildMcpResultFromToolResult(_mcpCall: CursorMcpCall, toolResult: ToolResultMessage) {\n\tif (toolResult.isError) {\n\t\treturn buildMcpErrorResult(toolResultToText(toolResult) || \"MCP tool failed\");\n\t}\n\tconst content = toolResult.content.map((item) => {\n\t\tif (item.type === \"image\") {\n\t\t\treturn create(McpToolResultContentItemSchema, {\n\t\t\t\tcontent: {\n\t\t\t\t\tcase: \"image\",\n\t\t\t\t\tvalue: create(McpImageContentSchema, {\n\t\t\t\t\t\tdata: Uint8Array.from(Buffer.from(item.data, \"base64\")),\n\t\t\t\t\t\tmimeType: item.mimeType,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\treturn create(McpToolResultContentItemSchema, {\n\t\t\tcontent: {\n\t\t\t\tcase: \"text\",\n\t\t\t\tvalue: create(McpTextContentSchema, { text: item.text }),\n\t\t\t},\n\t\t});\n\t});\n\n\treturn create(McpResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(McpSuccessSchema, {\n\t\t\t\tcontent,\n\t\t\t\tisError: false,\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction buildMcpToolNotFoundResult(mcpCall: CursorMcpCall) {\n\treturn create(McpResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"toolNotFound\",\n\t\t\tvalue: create(McpToolNotFoundSchema, { name: mcpCall.toolName, availableTools: [] }),\n\t\t},\n\t});\n}\n\nfunction buildMcpErrorResult(error: string) {\n\treturn create(McpResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"error\",\n\t\t\tvalue: create(McpErrorSchema, { error }),\n\t\t},\n\t});\n}\n\n/**\n * Merge the decoded completion-frame `McpArgs` map into the args assembled\n * from streamed `args_text_delta` snapshots.\n *\n * The completion frame is authoritative for the scalars it carries — but it\n * can omit oversized parameters entirely and can downgrade a structured value\n * to its raw string fallback. Rules per key:\n * - completion key absent → keep the streamed value.\n * - completion is a string while the streamed value is structured → keep the\n * streamed value (the completion frame downgraded it).\n * - otherwise → completion wins.\n */\nexport function mergeCursorMcpToolCallArgs(\n\tstreamed: Record<string, unknown> | undefined,\n\tcompletion: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n\tconst merged: Record<string, unknown> = { ...(streamed ?? {}) };\n\tif (!completion) return merged;\n\tfor (const [key, completionValue] of Object.entries(completion)) {\n\t\tconst streamedValue = merged[key];\n\t\tif (typeof completionValue === \"string\" && streamedValue !== null && typeof streamedValue === \"object\") {\n\t\t\tcontinue;\n\t\t}\n\t\tmerged[key] = completionValue;\n\t}\n\treturn merged;\n}\n\nfunction endCurrentTextBlock(output: AssistantMessage, stream: AssistantMessageEventStream, state: BlockState): void {\n\tconst block = state.currentTextBlock;\n\tif (!block) return;\n\tconst idx = output.content.indexOf(block);\n\tstream.push({\n\t\ttype: \"text_end\",\n\t\tcontentIndex: idx,\n\t\tcontent: block.text,\n\t\tpartial: output,\n\t});\n\tstate.setTextBlock(null);\n}\n\nfunction endCurrentThinkingBlock(\n\toutput: AssistantMessage,\n\tstream: AssistantMessageEventStream,\n\tstate: BlockState,\n): void {\n\tconst block = state.currentThinkingBlock;\n\tif (!block) return;\n\tconst idx = output.content.indexOf(block);\n\tstream.push({\n\t\ttype: \"thinking_end\",\n\t\tcontentIndex: idx,\n\t\tcontent: block.thinking,\n\t\tpartial: output,\n\t});\n\tstate.setThinkingBlock(null);\n}\n\n/**\n * Synthesize a completed `toolCall` content block for a Cursor exec-channel\n * native tool or for an MCP exec frame whose corresponding interaction block\n * is absent.\n *\n * Args arrive complete on the exec message, so the block opens and closes in\n * one step. Without this the persisted assistant message carries only\n * text/thinking blocks, and on replay the following `toolResult` messages\n * have no matching `toolCall.id`.\n *\n * The block is stamped with {@link kCursorExecResolved} so the agent loop's\n * execution pass skips it — Cursor's server-driven exec channel already ran\n * the tool via the bridge and buffered the result. Exported for tests.\n */\nexport function synthesizeCursorExecToolCall(\n\toutput: AssistantMessage,\n\tstream: AssistantMessageEventStream,\n\tstate: BlockState,\n\ttoolCallId: string,\n\ttoolName: string,\n\targs: Record<string, unknown>,\n): void {\n\tendCurrentTextBlock(output, stream, state);\n\tendCurrentThinkingBlock(output, stream, state);\n\tconst block: ToolCallState = {\n\t\ttype: \"toolCall\",\n\t\tid: toolCallId,\n\t\tname: toolName,\n\t\targuments: omitUndefinedArgs(args),\n\t\t[kStreamingBlockIndex]: output.content.length,\n\t\t[kStreamingBlockKind]: \"cursor-exec\",\n\t\t[kCursorExecResolved]: true,\n\t};\n\toutput.content.push(block);\n\tconst idx = output.content.length - 1;\n\tstream.push({ type: \"toolcall_start\", contentIndex: idx, partial: output });\n\tstream.push({ type: \"toolcall_end\", contentIndex: idx, toolCall: block, partial: output });\n}\n\n/**\n * Pair a `toolResult` for a synthesized block the client answered itself,\n * without ever consulting a handler. Frames answered from a fixed verdict —\n * no handler, no local execution — still need the pair: the block was stamped\n * {@link kCursorExecResolved}, so the agent loop emits no placeholder for it\n * and transcript rebuilds strip an unpaired call.\n */\nasync function pairSynthesizedExecResult(\n\tstate: BlockState,\n\tonToolResult: CursorToolResultHandler | undefined,\n\ttoolCallId: string,\n\ttoolName: string,\n\ttext: string,\n\tisError = true,\n): Promise<void> {\n\tconst synthesized: ToolResultMessage = {\n\t\trole: \"toolResult\",\n\t\ttoolCallId,\n\t\ttoolName,\n\t\tcontent: [{ type: \"text\", text }],\n\t\tisError,\n\t\ttimestamp: Date.now(),\n\t};\n\tconst sink = onToolResult ?? state.onToolResult;\n\tif (!sink) return;\n\tawait sink(synthesized);\n}\n\n/**\n * Throttle threshold for mid-stream argument JSON parses: reparse only when\n * the buffer grew by this much since the last successful parse, keeping total\n * parse work bounded while the authoritative full parse runs on completion.\n */\nconst STREAMING_ARGS_REPARSE_DELTA = 1024;\n\n/** Exported for tests: drives one Cursor interaction update through the streaming state machine. */\nexport function processInteractionUpdate(\n\tupdate: any,\n\toutput: AssistantMessage,\n\tstream: AssistantMessageEventStream,\n\tstate: BlockState,\n\tusageState: UsageState,\n): void {\n\tconst updateCase = update.message?.case;\n\n\tlog(\"interactionUpdate\", updateCase);\n\n\tif (updateCase === \"textDelta\") {\n\t\tconst delta = update.message.value.text || \"\";\n\t\tif (!state.currentTextBlock) {\n\t\t\tconst block: TextContent & { [kStreamingBlockIndex]: number } = {\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: \"\",\n\t\t\t\t[kStreamingBlockIndex]: output.content.length,\n\t\t\t};\n\t\t\toutput.content.push(block);\n\t\t\tstate.setTextBlock(block);\n\t\t\tstream.push({ type: \"text_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t}\n\t\tstate.currentTextBlock!.text += delta;\n\t\tconst idx = output.content.indexOf(state.currentTextBlock!);\n\t\tstream.push({ type: \"text_delta\", contentIndex: idx, delta, partial: output });\n\t} else if (updateCase === \"thinkingDelta\") {\n\t\tconst delta = update.message.value.text || \"\";\n\t\tif (!state.currentThinkingBlock) {\n\t\t\tconst block: ThinkingContent & { [kStreamingBlockIndex]: number } = {\n\t\t\t\ttype: \"thinking\",\n\t\t\t\tthinking: \"\",\n\t\t\t\t[kStreamingBlockIndex]: output.content.length,\n\t\t\t};\n\t\t\toutput.content.push(block);\n\t\t\tstate.setThinkingBlock(block);\n\t\t\tstream.push({ type: \"thinking_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t}\n\t\tstate.currentThinkingBlock!.thinking += delta;\n\t\tconst idx = output.content.indexOf(state.currentThinkingBlock!);\n\t\tstream.push({ type: \"thinking_delta\", contentIndex: idx, delta, partial: output });\n\t} else if (updateCase === \"thinkingCompleted\") {\n\t\tendCurrentThinkingBlock(output, stream, state);\n\t} else if (updateCase === \"toolCallStarted\" && selectConnectScmCall(update.message.value.toolCall)) {\n\t\t// `connect_scm` is resolved entirely server-side and has NO exec frame:\n\t\t// the streamed pair is the only signal this client sees. The\n\t\t// authoritative outcome rides on the COMPLETION's `result` oneof, so the\n\t\t// block is opened here and settled there.\n\t\tendCurrentTextBlock(output, stream, state);\n\t\tendCurrentThinkingBlock(output, stream, state);\n\t\tconst scmCall = selectConnectScmCall(update.message.value.toolCall);\n\t\tconst repository = selectConnectScmRepository(scmCall);\n\t\tconst block: ToolCallState = {\n\t\t\ttype: \"toolCall\",\n\t\t\tid: scmCall?.args?.toolCallId || update.message.value.callId || randomUUID(),\n\t\t\tname: \"connect_scm\",\n\t\t\targuments: repository ? { owner: repository.owner, repo: repository.repo } : {},\n\t\t\t[kStreamingBlockIndex]: output.content.length,\n\t\t\t[kStreamingBlockKind]: \"connect-scm\",\n\t\t\t[kStreamingEnvelopeId]: update.message.value.callId || undefined,\n\t\t\t[kCursorExecResolved]: true,\n\t\t};\n\t\toutput.content.push(block);\n\t\tretainStreamedCall(state, block, update.message.value.callId);\n\t\tstream.push({ type: \"toolcall_start\", contentIndex: output.content.length - 1, partial: output });\n\t} else if (updateCase === \"toolCallStarted\" && isExecOwnedToolCall(update.message.value.toolCall)) {\n\t\t// The exec channel already synthesized this block (and marked it\n\t\t// resolved) when it ran the tool locally, so the streamed announcement\n\t\t// must not create a second one.\n\t\tendCurrentTextBlock(output, stream, state);\n\t\tendCurrentThinkingBlock(output, stream, state);\n\t\tlog(\"exec\", \"streamedToolCallOwnedByExec\", { case: update.message.value.toolCall?.tool?.case });\n\t} else if (updateCase === \"toolCallStarted\") {\n\t\tendCurrentTextBlock(output, stream, state);\n\t\tendCurrentThinkingBlock(output, stream, state);\n\t\tconst toolCall = update.message.value.toolCall;\n\t\tif (toolCall) {\n\t\t\tconst mcpCall = selectMcpCall(toolCall);\n\t\t\tif (mcpCall) {\n\t\t\t\tconst args = mcpCall.args || {};\n\t\t\t\tconst id = args.toolCallId || randomUUID();\n\t\t\t\tconst resolvedByExec = state.resolvedMcpToolCallIds.delete(id);\n\t\t\t\tif (resolvedByExec && output.content.some((block) => block.type === \"toolCall\" && block.id === id)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst block: ToolCallState = {\n\t\t\t\t\ttype: \"toolCall\",\n\t\t\t\t\tid,\n\t\t\t\t\t// Same precedence as `decodeMcpCall` (`toolName || name`), which\n\t\t\t\t\t// is what the exec channel pairs its result under.\n\t\t\t\t\tname: args.toolName || args.name || \"\",\n\t\t\t\t\targuments: {},\n\t\t\t\t\t[kStreamingBlockIndex]: output.content.length,\n\t\t\t\t\t[kStreamingPartialJson]: \"\",\n\t\t\t\t\t[kStreamingBlockKind]: \"mcp\",\n\t\t\t\t\t[kStreamingEnvelopeId]: update.message.value.callId || undefined,\n\t\t\t\t};\n\t\t\t\tif (resolvedByExec) {\n\t\t\t\t\tmarkCursorExecResolved(block);\n\t\t\t\t}\n\t\t\t\toutput.content.push(block);\n\t\t\t\tretainStreamedCall(state, block, update.message.value.callId);\n\t\t\t\tstream.push({ type: \"toolcall_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Cursor resolves `update_todos` / `read_todos` server-side and\n\t\t\t// settles them on the tool call's `result`. Both blocks are stamped\n\t\t\t// resolved so the agent loop never runs them locally.\n\t\t\tconst todoCalls = selectTodoCalls(toolCall);\n\t\t\tif (todoCalls.update || todoCalls.read) {\n\t\t\t\tconst callId = update.message.value.callId || randomUUID();\n\t\t\t\tconst block: ToolCallState = {\n\t\t\t\t\ttype: \"toolCall\",\n\t\t\t\t\tid: callId,\n\t\t\t\t\tname: \"todo\",\n\t\t\t\t\targuments: buildTodoDisplayArgs(toolCall),\n\t\t\t\t\t[kStreamingBlockIndex]: output.content.length,\n\t\t\t\t\t[kStreamingBlockKind]: \"todo\",\n\t\t\t\t\t[kStreamingEnvelopeId]: update.message.value.callId || undefined,\n\t\t\t\t\t[kCursorExecResolved]: true,\n\t\t\t\t};\n\t\t\t\toutput.content.push(block);\n\t\t\t\tretainStreamedCall(state, block, update.message.value.callId);\n\t\t\t\tstream.push({ type: \"toolcall_start\", contentIndex: output.content.length - 1, partial: output });\n\t\t\t}\n\t\t}\n\t} else if (updateCase === \"toolCallDelta\" || updateCase === \"partialToolCall\") {\n\t\t// An argument delta belonging to a different call must not be appended\n\t\t// to this block's buffer, which would corrupt the JSON both parse.\n\t\tconst target = resolveStreamedCall(state, update.message.value.callId);\n\t\tif (target?.[kStreamingBlockKind] === \"mcp\") {\n\t\t\t// Cursor's `args_text_delta` is \"aggregated args text so far\": each\n\t\t\t// delta is a cumulative snapshot. Strip the prefix we already have to\n\t\t\t// recover the new suffix; fall back to treating the value as an\n\t\t\t// incremental fragment when it doesn't extend the buffer.\n\t\t\tconst snapshot: string = update.message.value.argsTextDelta || \"\";\n\t\t\tconst current = target[kStreamingPartialJson] ?? \"\";\n\t\t\tconst chunk = snapshot.startsWith(current) ? snapshot.slice(current.length) : snapshot;\n\t\t\tif (chunk.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst nextBuffer = current + chunk;\n\t\t\ttarget[kStreamingPartialJson] = nextBuffer;\n\t\t\t// Throttle mid-stream parses to keep total parse work bounded; the\n\t\t\t// authoritative full parse runs in `toolCallCompleted`.\n\t\t\tconst lastParseLen = target[kStreamingLastParseLen] ?? 0;\n\t\t\tif (nextBuffer.length - lastParseLen >= STREAMING_ARGS_REPARSE_DELTA) {\n\t\t\t\ttarget.arguments = parseStreamingJson(nextBuffer);\n\t\t\t\ttarget[kStreamingLastParseLen] = nextBuffer.length;\n\t\t\t}\n\t\t\tconst idx = output.content.indexOf(target);\n\t\t\tstream.push({ type: \"toolcall_delta\", contentIndex: idx, delta: chunk, partial: output });\n\t\t}\n\t} else if (updateCase === \"toolCallCompleted\") {\n\t\t// Correlate on the envelope's `call_id`, NOT the block id: MCP, Pi and\n\t\t// SCM blocks are filed under the id inside the call's `args`, and that\n\t\t// need not equal the envelope id.\n\t\tconst settled = resolveStreamedCall(state, update.message.value.callId);\n\t\tif (settled) {\n\t\t\tconst toolCall = update.message.value.toolCall;\n\t\t\tif (settled[kStreamingBlockKind] === \"mcp\") {\n\t\t\t\t// Authoritative full parse of the accumulated argument buffer.\n\t\t\t\tconst previousArgs = settled.arguments;\n\t\t\t\tconst partial = settled[kStreamingPartialJson];\n\t\t\t\tif (partial !== undefined) {\n\t\t\t\t\tsettled.arguments = parseStreamingJson(partial);\n\t\t\t\t}\n\t\t\t\tconst decodedArgs = decodeMcpArgsMap(selectMcpCall(toolCall)?.args?.args);\n\t\t\t\tsettled.arguments = mergeCursorMcpToolCallArgs(\n\t\t\t\t\tsettled.arguments as Record<string, unknown> | undefined,\n\t\t\t\t\tdecodedArgs,\n\t\t\t\t);\n\t\t\t\tif (settled.name === \"task\") {\n\t\t\t\t\tsettled.arguments = keepUsableCursorTaskArgs(previousArgs, settled.arguments);\n\t\t\t\t}\n\t\t\t} else if (settled[kStreamingBlockKind] === \"connect-scm\") {\n\t\t\t\t// The authoritative outcome arrives only here. Late args are merged\n\t\t\t\t// too — a start frame may announce the call before the target\n\t\t\t\t// repository is known.\n\t\t\t\tconst scmCall = selectConnectScmCall(toolCall);\n\t\t\t\tconst repository = selectConnectScmRepository(scmCall);\n\t\t\t\tif (repository) {\n\t\t\t\t\tsettled.arguments = { owner: repository.owner, repo: repository.repo };\n\t\t\t\t}\n\t\t\t\tconst { text, isError } = describeConnectScmResult(scmCall);\n\t\t\t\tvoid state.onToolResult?.({\n\t\t\t\t\trole: \"toolResult\",\n\t\t\t\t\ttoolCallId: settled.id,\n\t\t\t\t\ttoolName: \"connect_scm\",\n\t\t\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\t\t\tisError,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t});\n\t\t\t} else if (settled[kStreamingBlockKind] === \"todo\") {\n\t\t\t\t// Only the server's success snapshot is authoritative. A completion\n\t\t\t\t// frame whose optional `toolCall` is absent still settles: the block\n\t\t\t\t// is already marked resolved, so nothing downstream pairs it.\n\t\t\t\tconst snapshot = toolCall ? extractTodoSnapshot(toolCall) : null;\n\t\t\t\tconst error = toolCall ? extractTodoError(toolCall) : null;\n\t\t\t\tif (snapshot) {\n\t\t\t\t\tsettled.arguments = { todos: snapshot.todos, merged: snapshot.merged };\n\t\t\t\t}\n\t\t\t\tvoid state.onToolResult?.(buildTodoToolResult(settled.id, snapshot, error));\n\t\t\t}\n\t\t\tconst idx = output.content.indexOf(settled);\n\t\t\tclearStreamingPartialJson(settled);\n\t\t\tstream.push({ type: \"toolcall_end\", contentIndex: idx, toolCall: settled, partial: output });\n\t\t\treleaseStreamedCall(state, settled);\n\t\t}\n\t} else if (updateCase === \"turnEnded\") {\n\t\toutput.stopReason = \"stop\";\n\t\tapplyBilledTurnEndedUsage(update.message.value, output, usageState);\n\t} else if (updateCase === \"tokenDelta\") {\n\t\tconst tokenDelta = update.message.value;\n\t\tusageState.sawTokenDelta = true;\n\t\toutput.usage.output += tokenDelta.tokens || 0;\n\t\toutput.usage.totalTokens =\n\t\t\toutput.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;\n\t}\n}\n\n/**\n * Cursor's production schema (cursor-agent 2026.08.11) carries the billed\n * token split on `turnEnded`: 1 input, 2 output, 3 cache read, 4 cache write,\n * 5 reasoning (optional int64). Live probes against api2.cursor.sh show\n * input_tokens is cache-INCLUSIVE (turn 1: input 21357 ≈ cacheWrite 21354;\n * turn 2: input 17989 ≈ cacheRead 17575 + cacheWrite 411), so the uncached\n * remainder is backed out for senpi's exclusive `usage.input`. The billed\n * split is authoritative for context accounting; the tokenDelta-accumulated\n * output is kept only when the server omits the billed output field.\n * Reasoning tokens are deliberately not folded into output: no other field of\n * `Usage` represents them and double counting against the billed output must\n * be avoided.\n */\nfunction applyBilledTurnEndedUsage(update: TurnEndedUpdate, output: AssistantMessage, usageState: UsageState): void {\n\tconst { inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens } = update;\n\tif (\n\t\tinputTokens === undefined &&\n\t\toutputTokens === undefined &&\n\t\tcacheReadTokens === undefined &&\n\t\tcacheWriteTokens === undefined\n\t) {\n\t\treturn;\n\t}\n\tusageState.sawTurnEndedUsage = true;\n\tconst usage = output.usage;\n\tconst cacheRead = Number(cacheReadTokens ?? 0n);\n\tconst cacheWrite = Number(cacheWriteTokens ?? 0n);\n\tconst liveUsed = usageState.liveUsedTokens ?? 0;\n\t// Cursor sometimes reports dashboard-cumulative cache_read (millions) while\n\t// usedTokens stays at the real window (~150k). Folding that into totalTokens\n\t// forces a useless compact and then a 0-token resource_exhausted.\n\tif (liveUsed > 0 && cacheRead > liveUsed * 3) {\n\t\tif (outputTokens !== undefined) {\n\t\t\tusage.output = Number(outputTokens);\n\t\t}\n\t\tusage.cacheRead = 0;\n\t\tusage.cacheWrite = cacheWrite <= liveUsed ? cacheWrite : 0;\n\t\tusage.input = Math.max(0, liveUsed - usage.output - usage.cacheWrite);\n\t\tusage.totalTokens = liveUsed;\n\t\treturn;\n\t}\n\tusage.cacheRead = cacheRead;\n\tusage.cacheWrite = cacheWrite;\n\tusage.input = Math.max(0, Number(inputTokens ?? 0n) - usage.cacheRead - usage.cacheWrite);\n\tif (outputTokens !== undefined) {\n\t\tusage.output = Number(outputTokens);\n\t}\n\tusage.totalTokens = usage.input + usage.output + usage.cacheRead + usage.cacheWrite;\n}\n\n/**\n * A checkpoint's `tokenDetails.usedTokens` is the server's live conversation\n * size, sent mid-turn. It feeds context accounting while the turn streams,\n * but never overrides the billed turnEnded split once that arrived.\n */\nfunction applyCheckpointTokenDetails(\n\tcheckpoint: ConversationStateStructure,\n\toutput: AssistantMessage,\n\tusageState: UsageState,\n): void {\n\tif (usageState.sawTurnEndedUsage) return;\n\tconst usedTokens = checkpoint.tokenDetails?.usedTokens ?? 0;\n\tif (usedTokens <= 0) return;\n\tusageState.liveUsedTokens = usedTokens;\n\tconst usage = output.usage;\n\tusage.input = Math.max(0, usedTokens - usage.output - usage.cacheRead - usage.cacheWrite);\n\tusage.totalTokens = usage.input + usage.output + usage.cacheRead + usage.cacheWrite;\n}\n\nfunction createBlobId(data: Uint8Array): Uint8Array {\n\treturn new Uint8Array(createHash(\"sha256\").update(data).digest());\n}\n\nfunction storeCursorBlob(blobStore: Map<string, Uint8Array>, data: Uint8Array): Uint8Array {\n\tconst blobId = createBlobId(data);\n\tblobStore.set(Buffer.from(blobId).toString(\"hex\"), data);\n\treturn blobId;\n}\n\nfunction readCursorBlob(blobStore: Map<string, Uint8Array>, blobId: Uint8Array): Uint8Array {\n\tconst data = blobStore.get(Buffer.from(blobId).toString(\"hex\"));\n\tif (!data) {\n\t\tthrow new Error(\"Cursor blob not found\");\n\t}\n\treturn data;\n}\n\n/**\n * Local tools Cursor already drives natively over the exec channel, so\n * advertising them again as MCP tools would give the model two ways to call\n * the same thing.\n */\nconst CURSOR_NATIVE_TOOL_NAMES = new Set([\"bash\", \"read\", \"write\", \"delete\", \"ls\", \"grep\", \"todo\"]);\n\n/** Strip TypeBox symbol metadata down to a plain JSON Schema document. */\nfunction toolParametersToJsonSchema(tool: Tool): unknown {\n\ttry {\n\t\treturn JSON.parse(JSON.stringify(tool.parameters));\n\t} catch {\n\t\treturn { type: \"object\", properties: {}, required: [] };\n\t}\n}\n\n/**\n * JSON-Schema composition keywords Cursor's gateway cannot carry: an\n * advertised tool whose inputSchema contains `oneOf`, `anyOf`, or `allOf` is\n * rejected upstream with a wrapped provider 400 for the WHOLE request\n * (zero tokens, `resource_exhausted` end-stream). MCP tools imported from\n * external servers routinely ship such schemas (e.g. ast-grep's `scan`).\n * `not` is tolerated upstream and kept. Returns a new structure; the input is\n * never mutated.\n */\nconst CURSOR_UNSUPPORTED_SCHEMA_KEYS = new Set([\"oneOf\", \"anyOf\", \"allOf\"]);\n\nexport function sanitizeCursorToolSchema(schema: unknown): unknown {\n\tif (Array.isArray(schema)) return schema.map(sanitizeCursorToolSchema);\n\tif (schema === null || typeof schema !== \"object\") return schema;\n\tconst sanitized: Record<string, unknown> = {};\n\tfor (const [key, value] of Object.entries(schema)) {\n\t\tif (CURSOR_UNSUPPORTED_SCHEMA_KEYS.has(key)) continue;\n\t\tsanitized[key] = sanitizeCursorToolSchema(value);\n\t}\n\treturn sanitized;\n}\n\nexport function buildMcpToolDefinitions(tools: Tool[] | undefined): McpToolDefinition[] {\n\tif (!tools || tools.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst advertisedTools = tools.filter((tool) => !CURSOR_NATIVE_TOOL_NAMES.has(tool.name));\n\tif (advertisedTools.length === 0) {\n\t\treturn [];\n\t}\n\n\treturn advertisedTools.map((tool) => {\n\t\tconst jsonSchema = sanitizeCursorToolSchema(toolParametersToJsonSchema(tool));\n\t\tconst schemaValue: PbJsonValue =\n\t\t\tjsonSchema && typeof jsonSchema === \"object\"\n\t\t\t\t? (jsonSchema as PbJsonValue)\n\t\t\t\t: { type: \"object\", properties: {}, required: [] };\n\t\tconst inputSchema = toBinary(ValueSchema, fromJson(ValueSchema, schemaValue));\n\t\treturn create(McpToolDefinitionSchema, {\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description || \"\",\n\t\t\tproviderIdentifier: \"pi-agent\",\n\t\t\ttoolName: tool.name,\n\t\t\tinputSchema,\n\t\t});\n\t});\n}\n\n/** Extract text content from a user message. */\nfunction extractUserMessageText(msg: Message): string {\n\tif (msg.role !== \"user\") return \"\";\n\tconst content = msg.content;\n\tif (typeof content === \"string\") return content.trim();\n\tconst text = content\n\t\t.filter((c): c is TextContent => c.type === \"text\")\n\t\t.map((c) => c.text)\n\t\t.join(\"\\n\");\n\treturn text.trim();\n}\n\nfunction hasUserMessageImages(msg: Message): boolean {\n\treturn msg.role === \"user\" && Array.isArray(msg.content) && msg.content.some((item) => item.type === \"image\");\n}\n\ntype CursorRootPromptContentPart = { type: \"text\"; text: string } | { type: \"image\"; image: string; mediaType: string };\n\nfunction buildCursorRootPromptContent(content: string | (TextContent | ImageContent)[]): CursorRootPromptContentPart[] {\n\tif (typeof content === \"string\") {\n\t\tconst text = content.trim();\n\t\treturn text ? [{ type: \"text\", text }] : [];\n\t}\n\tconst parts: CursorRootPromptContentPart[] = [];\n\tfor (const item of content) {\n\t\tif (item.type === \"text\") {\n\t\t\tconst text = item.text.trim();\n\t\t\tif (text) {\n\t\t\t\tparts.push({ type: \"text\", text });\n\t\t\t}\n\t\t} else {\n\t\t\tparts.push({ type: \"image\", image: `data:${item.mimeType};base64,${item.data}`, mediaType: item.mimeType });\n\t\t}\n\t}\n\treturn parts;\n}\n\nfunction cursorUserContentKey(content: string | (TextContent | ImageContent)[]): string {\n\tif (typeof content === \"string\") {\n\t\treturn content.trim();\n\t}\n\tconst hash = createHash(\"sha256\");\n\tfor (const item of content) {\n\t\thash.update(item.type);\n\t\tif (item.type === \"text\") {\n\t\t\thash.update(item.text);\n\t\t} else {\n\t\t\thash.update(item.mimeType);\n\t\t\thash.update(item.data);\n\t\t}\n\t}\n\treturn hash.digest(\"hex\");\n}\n\ntype CursorRootPromptAssistantContentPart =\n\t| { type: \"text\"; text: string }\n\t| { type: \"tool-call\"; toolCallId: string; toolName: string; args: Record<string, unknown> };\n\nfunction buildCursorAssistantContent(msg: AssistantMessage): CursorRootPromptAssistantContentPart[] {\n\tconst content: CursorRootPromptAssistantContentPart[] = [];\n\tfor (const item of msg.content) {\n\t\tif (item.type === \"text\") {\n\t\t\tif (item.text) content.push({ type: \"text\", text: item.text });\n\t\t} else if (item.type === \"toolCall\") {\n\t\t\tcontent.push({\n\t\t\t\ttype: \"tool-call\",\n\t\t\t\ttoolCallId: item.id,\n\t\t\t\ttoolName: item.name,\n\t\t\t\targs: item.arguments,\n\t\t\t});\n\t\t}\n\t\t// Thinking is never replayed: Cursor manages reasoning server-side and\n\t\t// foreign/hidden reasoning must not leak into history as native thinking.\n\t}\n\treturn content;\n}\n\n/**\n * Index of the last user message in `messages`, or -1 if none. Used to\n * exclude the current user turn from history builders — it goes in the\n * `userMessageAction`, not in history structures.\n */\nfunction findLastUserMessageIndex(messages: Message[]): number {\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tif (messages[i].role === \"user\") {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n}\n\n/**\n * Build one Cursor system-message JSON blob per system prompt. When no system\n * prompt is provided, returns a single default greeting so we never emit an\n * empty `rootPromptMessagesJson` head.\n */\nexport function buildCursorSystemPromptJsons(systemPrompt: string | undefined): string[] {\n\tconst trimmed = systemPrompt?.trim();\n\tif (!trimmed) {\n\t\treturn [JSON.stringify({ role: \"system\", content: \"You are a helpful assistant.\" })];\n\t}\n\treturn [JSON.stringify({ role: \"system\", content: trimmed })];\n}\n\n/**\n * Build `ConversationStateStructure.rootPromptMessagesJson` blob IDs for the\n * system prompt plus prior conversation history, as JSON blobs matching\n * Cursor's internal Vercel-AI-SDK-shaped message format.\n *\n * Cursor's server uses `rootPromptMessagesJson` (not `turns[]`) to build the\n * actual model prompt; `turns[]` is UI/display metadata. The active user\n * message is excluded because it is sent in the action.\n */\nfunction buildRootPromptMessagesJson(\n\tmessages: Message[],\n\tsystemPromptIds: Uint8Array[],\n\tblobStore: Map<string, Uint8Array>,\n\tactiveUserMessageIndex = findLastUserMessageIndex(messages),\n): Uint8Array[] {\n\tconst entries: Uint8Array[] = [...systemPromptIds];\n\tconst pushJson = (obj: unknown) => {\n\t\tconst bytes = new TextEncoder().encode(JSON.stringify(obj));\n\t\tentries.push(storeCursorBlob(blobStore, bytes));\n\t};\n\n\tfor (let i = 0; i < messages.length; i++) {\n\t\tif (i === activeUserMessageIndex) break;\n\t\tconst msg = messages[i];\n\t\tif (msg.role === \"user\") {\n\t\t\tconst content = buildCursorRootPromptContent(msg.content);\n\t\t\tif (content.length === 0) continue;\n\t\t\tpushJson({ role: \"user\", content });\n\t\t} else if (msg.role === \"assistant\") {\n\t\t\tconst content = buildCursorAssistantContent(msg);\n\t\t\tif (content.length === 0) continue;\n\t\t\tpushJson({ role: \"assistant\", content });\n\t\t} else if (msg.role === \"toolResult\") {\n\t\t\t// Emit even when the result text is empty: the assistant `tool-call`\n\t\t\t// is already in history, so dropping the pair would replay an\n\t\t\t// orphaned call.\n\t\t\tpushJson({\n\t\t\t\trole: \"tool\",\n\t\t\t\tid: msg.toolCallId,\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"tool-result\",\n\t\t\t\t\t\ttoolName: msg.toolName,\n\t\t\t\t\t\ttoolCallId: msg.toolCallId,\n\t\t\t\t\t\tresult: toolResultToText(msg),\n\t\t\t\t\t\t...(msg.isError ? { isError: true } : {}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t}\n\t}\n\n\treturn entries;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst prototype = Object.getPrototypeOf(value);\n\treturn prototype === Object.prototype || prototype === null;\n}\n\nfunction isJsonValue(value: unknown): value is PbJsonValue {\n\tif (value === null || typeof value === \"string\" || typeof value === \"boolean\") return true;\n\tif (typeof value === \"number\") return Number.isFinite(value);\n\tif (Array.isArray(value)) return value.every(isJsonValue);\n\tif (!isPlainRecord(value)) return false;\n\tfor (const key in value) {\n\t\tif (!isJsonValue(value[key])) return false;\n\t}\n\treturn true;\n}\n\nfunction encodeCursorMcpArguments(toolCall: ToolCall): Record<string, Uint8Array> {\n\tconst encoded: Record<string, Uint8Array> = {};\n\tfor (const name in toolCall.arguments) {\n\t\tconst value = toolCall.arguments[name];\n\t\tif (value === undefined) continue;\n\t\tif (!isJsonValue(value)) {\n\t\t\tthrow new Error(`Cursor tool argument ${toolCall.name}.${name} is not JSON-serializable`);\n\t\t}\n\t\tencoded[name] = toBinary(ValueSchema, fromJson(ValueSchema, value));\n\t}\n\treturn encoded;\n}\n\nfunction createCursorMcpResult(result: ToolResultMessage) {\n\tif (result.isError) {\n\t\treturn create(McpToolResultSchema, {\n\t\t\tresult: {\n\t\t\t\tcase: \"error\",\n\t\t\t\tvalue: create(McpToolErrorSchema, { error: toolResultToText(result) }),\n\t\t\t},\n\t\t});\n\t}\n\treturn create(McpToolResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(McpSuccessSchema, {\n\t\t\t\tcontent: result.content.map((item) =>\n\t\t\t\t\titem.type === \"text\"\n\t\t\t\t\t\t? create(McpToolResultContentItemSchema, {\n\t\t\t\t\t\t\t\tcontent: { case: \"text\", value: create(McpTextContentSchema, { text: item.text }) },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: create(McpToolResultContentItemSchema, {\n\t\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\tcase: \"image\",\n\t\t\t\t\t\t\t\t\tvalue: create(McpImageContentSchema, {\n\t\t\t\t\t\t\t\t\t\tdata: Uint8Array.from(Buffer.from(item.data, \"base64\")),\n\t\t\t\t\t\t\t\t\t\tmimeType: item.mimeType,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t}),\n\t\t},\n\t});\n}\n\nfunction createCursorToolCallStep(toolCall: ToolCall, result: ToolResultMessage | undefined) {\n\tconst mcpCall = create(McpToolCallSchema, {\n\t\targs: create(McpArgsSchema, {\n\t\t\tname: toolCall.name,\n\t\t\targs: encodeCursorMcpArguments(toolCall),\n\t\t\ttoolCallId: toolCall.id,\n\t\t\tproviderIdentifier: \"pi-agent\",\n\t\t\ttoolName: toolCall.name,\n\t\t}),\n\t\t...(result ? { result: createCursorMcpResult(result) } : {}),\n\t});\n\treturn create(ConversationStepSchema, {\n\t\tmessage: {\n\t\t\tcase: \"toolCall\",\n\t\t\tvalue: create(ToolCallSchema, {\n\t\t\t\ttool: { case: \"mcpToolCall\", value: mcpCall },\n\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t}),\n\t\t},\n\t});\n}\n\n/**\n * Convert context.messages to Cursor's ConversationTurnStructure blob IDs.\n * Groups messages into turns: each turn is a user message followed by the\n * assistant's response. Excludes the active user message (which goes in the\n * action).\n */\nfunction buildConversationTurns(\n\tmessages: Message[],\n\tblobStore: Map<string, Uint8Array>,\n\tactiveUserMessageIndex = findLastUserMessageIndex(messages),\n): Uint8Array[] {\n\tconst turns: Uint8Array[] = [];\n\tconst historyEnd = activeUserMessageIndex >= 0 ? activeUserMessageIndex : messages.length;\n\tconst toolResults = new Map<string, ToolResultMessage>();\n\tconst pairedToolCallIds = new Set<string>();\n\tfor (let index = 0; index < historyEnd; index++) {\n\t\tconst message = messages[index];\n\t\tif (message.role === \"toolResult\") {\n\t\t\ttoolResults.set(message.toolCallId, message);\n\t\t} else if (message.role === \"assistant\") {\n\t\t\tfor (const item of message.content) {\n\t\t\t\tif (item.type === \"toolCall\") pairedToolCallIds.add(item.id);\n\t\t\t}\n\t\t}\n\t}\n\n\tlet i = 0;\n\twhile (i < messages.length) {\n\t\tconst msg = messages[i];\n\t\tif (msg.role !== \"user\") {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (i === activeUserMessageIndex) break;\n\n\t\tconst userText = extractUserMessageText(msg);\n\t\tif (userText.length === 0 && !hasUserMessageImages(msg)) {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst userMessage = createCursorUserMessage(\n\t\t\tmsg.content,\n\t\t\tuserText,\n\t\t\tdeterministicUuid(`u:${turns.length}:${cursorUserContentKey(msg.content)}`),\n\t\t);\n\t\tconst userMessageBlobId = storeCursorBlob(blobStore, toBinary(UserMessageSchema, userMessage));\n\t\tconst stepBlobIds: Uint8Array[] = [];\n\t\ti++;\n\n\t\twhile (i < messages.length && messages[i].role !== \"user\") {\n\t\t\tconst stepMsg = messages[i];\n\t\t\tif (stepMsg.role === \"assistant\") {\n\t\t\t\tfor (const item of stepMsg.content) {\n\t\t\t\t\tlet step: ConversationStep;\n\t\t\t\t\tif (item.type === \"text\") {\n\t\t\t\t\t\tif (!item.text) continue;\n\t\t\t\t\t\tstep = create(ConversationStepSchema, {\n\t\t\t\t\t\t\tmessage: {\n\t\t\t\t\t\t\t\tcase: \"assistantMessage\",\n\t\t\t\t\t\t\t\tvalue: create(AssistantMessageSchema, { text: item.text }),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (item.type === \"thinking\") {\n\t\t\t\t\t\t// Foreign/hidden reasoning never leaks into Cursor's turn\n\t\t\t\t\t\t// history as native thinking.\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else if (item.type === \"toolCall\") {\n\t\t\t\t\t\tstep = createCursorToolCallStep(item, toolResults.get(item.id));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstepBlobIds.push(storeCursorBlob(blobStore, toBinary(ConversationStepSchema, step)));\n\t\t\t\t}\n\t\t\t} else if (stepMsg.role === \"toolResult\" && !pairedToolCallIds.has(stepMsg.toolCallId)) {\n\t\t\t\tconst text = toolResultToText(stepMsg);\n\t\t\t\tif (text) {\n\t\t\t\t\tconst prefix = stepMsg.isError ? \"[Tool Error]\" : \"[Tool Result]\";\n\t\t\t\t\tconst step = create(ConversationStepSchema, {\n\t\t\t\t\t\tmessage: {\n\t\t\t\t\t\t\tcase: \"assistantMessage\",\n\t\t\t\t\t\t\tvalue: create(AssistantMessageSchema, { text: `${prefix}\\n${text}` }),\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tstepBlobIds.push(storeCursorBlob(blobStore, toBinary(ConversationStepSchema, step)));\n\t\t\t\t}\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\n\t\tconst agentTurn = create(AgentConversationTurnStructureSchema, {\n\t\t\tuserMessage: userMessageBlobId,\n\t\t\tsteps: stepBlobIds,\n\t\t});\n\t\tconst turn = create(ConversationTurnStructureSchema, {\n\t\t\tturn: {\n\t\t\t\tcase: \"agentConversationTurn\",\n\t\t\t\tvalue: agentTurn,\n\t\t\t},\n\t\t});\n\t\tturns.push(storeCursorBlob(blobStore, toBinary(ConversationTurnStructureSchema, turn)));\n\t}\n\n\treturn turns;\n}\n\n/** Exported for tests: decodes Cursor history blobs built from conversation messages. */\nexport function buildCursorHistoryForTest(\n\tmessages: Message[],\n\tactiveUserMessageIndex = findLastUserMessageIndex(messages),\n): {\n\trootPromptMessagesJson: unknown[];\n\tturnUserMessagesJson: unknown[];\n\tturnStepMessagesJson: unknown[][];\n} {\n\tconst blobStore = new Map<string, Uint8Array>();\n\tconst rootPromptMessagesJson = buildRootPromptMessagesJson(messages, [], blobStore, activeUserMessageIndex).map(\n\t\t(blobId) => JSON.parse(new TextDecoder().decode(readCursorBlob(blobStore, blobId))),\n\t);\n\tconst turnUserMessagesJson: unknown[] = [];\n\tconst turnStepMessagesJson: unknown[][] = [];\n\tfor (const turnBlobId of buildConversationTurns(messages, blobStore, activeUserMessageIndex)) {\n\t\tconst turn = fromBinary(ConversationTurnStructureSchema, readCursorBlob(blobStore, turnBlobId));\n\t\tif (turn.turn.case !== \"agentConversationTurn\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst userMessage = fromBinary(UserMessageSchema, readCursorBlob(blobStore, turn.turn.value.userMessage));\n\t\tturnUserMessagesJson.push(toJson(UserMessageSchema, userMessage));\n\t\tturnStepMessagesJson.push(\n\t\t\tturn.turn.value.steps.map((stepBlobId) => {\n\t\t\t\tconst step = fromBinary(ConversationStepSchema, readCursorBlob(blobStore, stepBlobId));\n\t\t\t\treturn toJson(ConversationStepSchema, step);\n\t\t\t}),\n\t\t);\n\t}\n\treturn { rootPromptMessagesJson, turnUserMessagesJson, turnStepMessagesJson };\n}\n\nfunction createCursorUserMessage(\n\tcontent: string | (TextContent | ImageContent)[],\n\ttext: string,\n\tmessageId = randomUUID() as string,\n) {\n\tconst images = typeof content === \"string\" ? [] : extractImages(content);\n\treturn create(UserMessageSchema, {\n\t\ttext,\n\t\tmessageId,\n\t\t...(images.length > 0\n\t\t\t? {\n\t\t\t\t\tselectedContext: create(SelectedContextSchema, {\n\t\t\t\t\t\tselectedImages: images,\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: {}),\n\t});\n}\n\nfunction extractImages(content: (TextContent | ImageContent)[]) {\n\treturn content\n\t\t.filter((item): item is ImageContent => item.type === \"image\")\n\t\t.map((image) =>\n\t\t\tcreate(SelectedImageSchema, {\n\t\t\t\tuuid: randomUUID(),\n\t\t\t\tmimeType: image.mimeType,\n\t\t\t\tdataOrBlobId: {\n\t\t\t\t\tcase: \"data\",\n\t\t\t\t\tvalue: Uint8Array.from(Buffer.from(image.data, \"base64\")),\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n}\n\nasync function buildGrpcRequest(\n\tmodel: Model<\"cursor-agent\">,\n\tcontext: Context,\n\toptions: CursorAgentOptions | undefined,\n\tstate: {\n\t\tconversationId: string;\n\t\tblobStore: Map<string, Uint8Array>;\n\t\tconversationState?: ConversationStateStructure;\n\t\tforceResumeAction?: boolean;\n\t\tpinnedRequestedModel?: RequestedModel;\n\t\tpinnedModelDetails?: ModelDetails;\n\t},\n): Promise<{\n\trequestBytes: Uint8Array;\n\tblobStore: Map<string, Uint8Array>;\n\tconversationState: ConversationStateStructure;\n\trequestedModel: RequestedModel;\n\tmodelDetails: ModelDetails;\n}> {\n\tconst blobStore = state.blobStore;\n\n\tconst systemPromptIds = buildCursorSystemPromptJsons(context.systemPrompt).map((json) =>\n\t\tstoreCursorBlob(blobStore, new TextEncoder().encode(json)),\n\t);\n\n\tconst activeUserMessageIndex = context.messages.length - 1;\n\tconst activeMessage = context.messages[activeUserMessageIndex];\n\tconst activeUserMessage = activeMessage?.role === \"user\" ? activeMessage : undefined;\n\tlet userContent: string | (TextContent | ImageContent)[] | undefined;\n\tlet userText = \"\";\n\tlet hasUserImages = false;\n\tif (activeUserMessage) {\n\t\tuserContent = activeUserMessage.content;\n\t\tif (typeof userContent === \"string\") {\n\t\t\tuserText = userContent.trim();\n\t\t} else {\n\t\t\tuserText = extractText(userContent);\n\t\t\thasUserImages = hasImages(userContent);\n\t\t}\n\t}\n\n\tconst action = create(ConversationActionSchema, {\n\t\taction:\n\t\t\t!state.forceResumeAction && userContent && (userText.trim().length > 0 || hasUserImages)\n\t\t\t\t? {\n\t\t\t\t\t\tcase: \"userMessageAction\",\n\t\t\t\t\t\tvalue: create(UserMessageActionSchema, {\n\t\t\t\t\t\t\tuserMessage: createCursorUserMessage(userContent, userText),\n\t\t\t\t\t\t}),\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tcase: \"resumeAction\",\n\t\t\t\t\t\tvalue: create(ResumeActionSchema, {}),\n\t\t\t\t\t},\n\t});\n\n\t// Build conversation turns from prior messages, excluding only the active\n\t// user message when the request is sending one. Resume actions must\n\t// preserve trailing tool results.\n\tconst turns = buildConversationTurns(context.messages, blobStore, activeUserMessage ? activeUserMessageIndex : -1);\n\n\t// Cursor's server uses `rootPromptMessagesJson` (not `turns[]`) to build\n\t// the actual model prompt; without it multi-turn conversations lose prior\n\t// context.\n\tconst rootPromptMessagesJson = buildRootPromptMessagesJson(\n\t\tcontext.messages,\n\t\tsystemPromptIds,\n\t\tblobStore,\n\t\tactiveUserMessage ? activeUserMessageIndex : -1,\n\t);\n\n\t// Preserve cached non-history state fields (todos, file states, summaries)\n\t// when the system prompt is unchanged; otherwise start fresh.\n\tconst cachedPromptHead = state.conversationState?.rootPromptMessagesJson?.slice(0, systemPromptIds.length) ?? [];\n\tconst hasMatchingPrompt =\n\t\tcachedPromptHead.length === systemPromptIds.length &&\n\t\tsystemPromptIds.every((id, idx) => Buffer.from(cachedPromptHead[idx]).equals(id));\n\tconst baseState =\n\t\tstate.conversationState && hasMatchingPrompt\n\t\t\t? state.conversationState\n\t\t\t: create(ConversationStateStructureSchema, {\n\t\t\t\t\trootPromptMessagesJson: systemPromptIds,\n\t\t\t\t\tturns: [],\n\t\t\t\t\ttodos: [],\n\t\t\t\t\tpendingToolCalls: [],\n\t\t\t\t\tpreviousWorkspaceUris: [],\n\t\t\t\t\tfileStates: {},\n\t\t\t\t\tfileStatesV2: {},\n\t\t\t\t\tsummaryArchives: [],\n\t\t\t\t\tturnTimings: [],\n\t\t\t\t\tsubagentStates: {},\n\t\t\t\t\tselfSummaryCount: 0,\n\t\t\t\t\treadPaths: [],\n\t\t\t\t});\n\n\t// Always override `rootPromptMessagesJson` and `turns` with content freshly\n\t// built from `context.messages`: the server-echoed checkpoint replaces\n\t// historical user entries with empty placeholders.\n\tconst conversationState = create(ConversationStateStructureSchema, {\n\t\t...baseState,\n\t\trootPromptMessagesJson,\n\t\tturns,\n\t});\n\n\tconst requestedModel = state.pinnedRequestedModel ?? buildRequestedModel(model, options?.thinkingSelection);\n\tconst wireModelId = requestedModel.modelId;\n\tconst cursorMaxMode = model.compat?.cursorMaxMode === true;\n\tconst modelDetails =\n\t\tstate.pinnedModelDetails ??\n\t\tcreate(ModelDetailsSchema, {\n\t\t\tmodelId: wireModelId,\n\t\t\tdisplayModelId: model.id,\n\t\t\tdisplayName: model.name,\n\t\t\t...(cursorMaxMode ? { maxMode: true } : undefined),\n\t\t});\n\n\tconst runRequest = create(AgentRunRequestSchema, {\n\t\tconversationState,\n\t\taction,\n\t\tmodelDetails,\n\t\trequestedModel,\n\t\tconversationId: state.conversationId,\n\t});\n\n\tif (options?.customSystemPrompt) {\n\t\trunRequest.customSystemPrompt = options.customSystemPrompt;\n\t}\n\n\tawait options?.onPayload?.(runRequest, model as Model<Api>);\n\n\tconst clientMessage = create(AgentClientMessageSchema, {\n\t\tmessage: { case: \"runRequest\", value: runRequest },\n\t});\n\n\tconst requestBytes = toBinary(AgentClientMessageSchema, clientMessage);\n\n\tlog(\"info\", \"builtRunRequest\", {\n\t\tbytes: requestBytes.length,\n\t\ttools: context.tools?.length ?? 0,\n\t});\n\n\treturn { requestBytes, blobStore, conversationState, requestedModel, modelDetails };\n}\n\nfunction hasImages(content: (TextContent | ImageContent)[]): boolean {\n\treturn content.some((item) => item.type === \"image\");\n}\n\nfunction extractText(content: (TextContent | ImageContent)[]): string {\n\treturn content\n\t\t.filter((c): c is TextContent => c.type === \"text\")\n\t\t.map((c) => c.text)\n\t\t.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Model discovery (GetUsableModels)\n// ---------------------------------------------------------------------------\n\nconst CURSOR_GET_USABLE_MODELS_PATH = \"/agent.v1.AgentService/GetUsableModels\";\nconst CURSOR_DEFAULT_CONTEXT_WINDOW = 200_000;\nconst CURSOR_DEFAULT_MAX_TOKENS = 64_000;\n/**\n * `GetUsableModels` carries no context-window field, so the 1M ceiling is\n * recovered from the signals Cursor does send: display-name \"1M\" labels and\n * the max-mode flag on Claude/Gemini families.\n */\nconst CURSOR_1M_CONTEXT_WINDOW = 1_000_000;\nconst CURSOR_1M_NAME_PATTERN = /\\b1m\\b/i;\nconst CURSOR_MAX_MODE_1M_ID_PATTERN = /claude|gemini/;\n/**\n * Model-id families whose native catalogs are multimodal. Cursor-only or\n * text-only families (`composer-*`, `grok-code-*`) stay outside this pattern.\n */\nconst CURSOR_MULTIMODAL_ID_PATTERN = /claude|gemini|gpt-|codex/;\n\nexport interface CursorDiscoveredModel {\n\tid: string;\n\tname: string;\n\treasoning: boolean;\n\tinput: (\"text\" | \"image\")[];\n\tcontextWindow: number;\n\tmaxTokens: number;\n\tcursorMaxMode: boolean;\n}\n\n/**\n * Fetches Cursor models through `GetUsableModels` (unary protobuf over\n * HTTP/2; the ALB rejects HTTP/1.1 with 464) and normalizes them.\n *\n * Returns `null` on request/decode failures; `[]` only when the endpoint\n * responds successfully with no usable models.\n */\nexport async function fetchCursorUsableModels(options: {\n\tapiKey: string;\n\tbaseUrl?: string;\n\ttimeoutMs?: number;\n\tsignal?: AbortSignal;\n}): Promise<CursorDiscoveredModel[] | null> {\n\tconst timeoutMs = options.timeoutMs ?? 10_000;\n\ttry {\n\t\tconst requestPayload = create(GetUsableModelsRequestSchema, { customModelIds: [] });\n\t\tconst body = toBinary(GetUsableModelsRequestSchema, requestPayload);\n\t\tconst baseUrl = (options.baseUrl ?? CURSOR_API_URL).replace(/\\/+$/, \"\");\n\n\t\tconst responseBuffer = await new Promise<Uint8Array | null>((resolve) => {\n\t\t\tconst client = http2.connect(baseUrl);\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tclient.destroy();\n\t\t\t\tresolve(null);\n\t\t\t}, timeoutMs);\n\t\t\tconst abort = () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tclient.destroy();\n\t\t\t\tresolve(null);\n\t\t\t};\n\t\t\toptions.signal?.addEventListener(\"abort\", abort, { once: true });\n\n\t\t\tclient.on(\"error\", () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tresolve(null);\n\t\t\t});\n\n\t\t\tconst req = client.request({\n\t\t\t\t\":method\": \"POST\",\n\t\t\t\t\":path\": CURSOR_GET_USABLE_MODELS_PATH,\n\t\t\t\t\"content-type\": \"application/proto\",\n\t\t\t\tte: \"trailers\",\n\t\t\t\tauthorization: `Bearer ${options.apiKey}`,\n\t\t\t\t\"x-ghost-mode\": \"true\",\n\t\t\t\t\"x-cursor-client-version\": CURSOR_CLIENT_VERSION,\n\t\t\t\t\"x-cursor-client-type\": \"cli\",\n\t\t\t});\n\n\t\t\tconst chunks: Buffer[] = [];\n\t\t\treq.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n\t\t\treq.on(\"end\", () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tclient.close();\n\t\t\t\tresolve(new Uint8Array(Buffer.concat(chunks)));\n\t\t\t});\n\t\t\treq.on(\"error\", () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tclient.close();\n\t\t\t\tresolve(null);\n\t\t\t});\n\t\t\treq.on(\"response\", (headers) => {\n\t\t\t\tconst status = Number(headers[\":status\"] ?? 0);\n\t\t\t\tif (status < 200 || status >= 300) {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tclient.close();\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (body.length > 0) {\n\t\t\t\treq.end(Buffer.from(body));\n\t\t\t} else {\n\t\t\t\treq.end();\n\t\t\t}\n\t\t});\n\n\t\tif (!responseBuffer || responseBuffer.length === 0) {\n\t\t\treturn null;\n\t\t}\n\t\tconst decoded = decodeGetUsableModelsResponse(responseBuffer);\n\t\tif (!decoded) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst byId = new Map<string, CursorDiscoveredModel>();\n\t\tfor (const model of decoded.models ?? []) {\n\t\t\tconst id = model.modelId?.trim();\n\t\t\tif (!id) continue;\n\t\t\tconst name = pickModelDisplayName(model, id);\n\t\t\tconst labeled1M =\n\t\t\t\tCURSOR_1M_NAME_PATTERN.test(id) ||\n\t\t\t\t[model.displayName, model.displayNameShort, model.displayModelId, ...(model.aliases ?? [])].some(\n\t\t\t\t\t(candidate) => typeof candidate === \"string\" && CURSOR_1M_NAME_PATTERN.test(candidate),\n\t\t\t\t);\n\t\t\tconst maxMode = model.maxMode === true;\n\t\t\tconst contextWindow =\n\t\t\t\tlabeled1M || (maxMode && CURSOR_MAX_MODE_1M_ID_PATTERN.test(id))\n\t\t\t\t\t? CURSOR_1M_CONTEXT_WINDOW\n\t\t\t\t\t: CURSOR_DEFAULT_CONTEXT_WINDOW;\n\t\t\tbyId.set(id, {\n\t\t\t\tid,\n\t\t\t\tname,\n\t\t\t\treasoning: Boolean(model.thinkingDetails),\n\t\t\t\tinput: CURSOR_MULTIMODAL_ID_PATTERN.test(id.toLowerCase()) ? [\"text\", \"image\"] : [\"text\"],\n\t\t\t\tcontextWindow,\n\t\t\t\tmaxTokens: CURSOR_DEFAULT_MAX_TOKENS,\n\t\t\t\tcursorMaxMode: maxMode,\n\t\t\t});\n\t\t}\n\t\treturn [...byId.values()].sort((a, b) => a.id.localeCompare(b.id));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction decodeGetUsableModelsResponse(payload: Uint8Array) {\n\tconst framedBody = decodeConnectUnaryBody(payload);\n\tif (framedBody) {\n\t\ttry {\n\t\t\treturn fromBinary(GetUsableModelsResponseSchema, framedBody);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\ttry {\n\t\treturn fromBinary(GetUsableModelsResponseSchema, payload);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction decodeConnectUnaryBody(payload: Uint8Array): Uint8Array | null {\n\tif (payload.length < 5) {\n\t\treturn null;\n\t}\n\n\tlet offset = 0;\n\twhile (offset + 5 <= payload.length) {\n\t\tconst flags = payload[offset];\n\t\tconst view = new DataView(payload.buffer, payload.byteOffset + offset, payload.byteLength - offset);\n\t\tconst messageLength = view.getUint32(1, false);\n\t\tconst frameEnd = offset + 5 + messageLength;\n\t\tif (frameEnd > payload.length) {\n\t\t\treturn null;\n\t\t}\n\t\tconst compressionFlagSet = (flags & 0b0000_0001) !== 0;\n\t\tif (compressionFlagSet) {\n\t\t\treturn null;\n\t\t}\n\t\tconst endStreamFlagSet = (flags & 0b0000_0010) !== 0;\n\t\tif (!endStreamFlagSet) {\n\t\t\treturn payload.subarray(offset + 5, frameEnd);\n\t\t}\n\n\t\toffset = frameEnd;\n\t}\n\n\treturn null;\n}\n\nfunction pickModelDisplayName(\n\tmodel: { displayName?: string; displayNameShort?: string; displayModelId?: string; aliases?: string[] },\n\tfallbackId: string,\n): string {\n\tconst candidates = [model.displayName, model.displayNameShort, model.displayModelId, ...(model.aliases ?? [])];\n\tfor (const candidate of candidates) {\n\t\tif (typeof candidate !== \"string\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst trimmed = candidate.trim();\n\t\tif (trimmed) {\n\t\t\treturn trimmed;\n\t\t}\n\t}\n\treturn fallbackId;\n}\n"]}