@code-yeongyu/senpi 2026.10.25-3 → 2026.10.26-1
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.
- package/CHANGELOG.md +40 -0
- package/dist/bundle/chunks/{anthropic-messages-WBASBTIW.js → anthropic-messages-M235FJQV.js} +3 -3
- package/dist/bundle/chunks/{args-B444OQBK.js → args-FBNJOJSR.js} +1 -1
- package/dist/bundle/chunks/azure-openai-responses-YQRTQ7H6.js +2 -0
- package/dist/bundle/chunks/bedrock-converse-stream.js +3 -3
- package/dist/bundle/chunks/{chunk-FFQOEC76.js → chunk-3A3XCLNH.js} +3 -3
- package/dist/bundle/chunks/{chunk-EHQXLHRB.js → chunk-3LPWILUZ.js} +2 -2
- package/dist/bundle/chunks/{chunk-3BTN337S.js → chunk-3WP5RFQR.js} +1 -1
- package/dist/bundle/chunks/{chunk-WLHNEUGD.js → chunk-5FQMNHXV.js} +1 -1
- package/dist/bundle/chunks/{chunk-HVJI5T75.js → chunk-5KZH6EYQ.js} +2 -2
- package/dist/bundle/chunks/{chunk-4P7WARQZ.js → chunk-5LWUUXMH.js} +1 -1
- package/dist/bundle/chunks/{chunk-ODTGC6YU.js → chunk-6U3TBFBA.js} +1 -1
- package/dist/bundle/chunks/chunk-6VWIMHMH.js +2 -0
- package/dist/bundle/chunks/{chunk-BWA4FVFW.js → chunk-7KOUQSBX.js} +2 -2
- package/dist/bundle/chunks/{chunk-7CNOCJCN.js → chunk-ADQAPDPV.js} +1 -1
- package/dist/bundle/chunks/{chunk-ITGYN22E.js → chunk-CDQPA4FP.js} +1 -1
- package/dist/bundle/chunks/{chunk-WDPQ6CZJ.js → chunk-DMFAVE5N.js} +1 -1
- package/dist/bundle/chunks/{chunk-XF3LJC3O.js → chunk-DYWIFF2Q.js} +1 -1
- package/dist/bundle/chunks/{chunk-YRF4I43T.js → chunk-EZP6AYW2.js} +37 -31
- package/dist/bundle/chunks/chunk-GQJYNFMO.js +2 -0
- package/dist/bundle/chunks/{chunk-O3Q2ET6W.js → chunk-GWGNVYPB.js} +1 -1
- package/dist/bundle/chunks/{chunk-Z3UYNSVR.js → chunk-H4WJ4LY3.js} +1 -1
- package/dist/bundle/chunks/{chunk-UQNRW3VU.js → chunk-HWTD4QF3.js} +1 -1
- package/dist/bundle/chunks/{chunk-WD6WBYC5.js → chunk-I7QWTWVZ.js} +1 -1
- package/dist/bundle/chunks/{chunk-SWJXRC2I.js → chunk-J2YAYTB2.js} +1 -1
- package/dist/bundle/chunks/{chunk-TTU2RNVX.js → chunk-J5FCH7TI.js} +1 -1
- package/dist/bundle/chunks/chunk-JFQUWEN7.js +13 -0
- package/dist/bundle/chunks/{chunk-JA2R2ZSE.js → chunk-L2O6K3SJ.js} +1 -1
- package/dist/bundle/chunks/{chunk-4AOMNOGY.js → chunk-LO5MYLGF.js} +1 -1
- package/dist/bundle/chunks/{chunk-P3M2PF6K.js → chunk-MSHRIZGT.js} +8 -6
- package/dist/bundle/chunks/{chunk-T36LJ6MW.js → chunk-MY4ZD3EW.js} +1 -1
- package/dist/bundle/chunks/{chunk-UFJ2K7Q7.js → chunk-OQ3WDMB3.js} +1 -1
- package/dist/bundle/chunks/{chunk-7GZUFOM3.js → chunk-PH3JDRB2.js} +1 -1
- package/dist/bundle/chunks/{chunk-E6WYH3ZL.js → chunk-QREKAXKX.js} +7 -5
- package/dist/bundle/chunks/{chunk-MJ5NNWX4.js → chunk-QYFOHFPS.js} +1 -1
- package/dist/bundle/chunks/chunk-SOXQ42VS.js +2 -0
- package/dist/bundle/chunks/{chunk-FHXR4ZAC.js → chunk-UDM7VO6O.js} +1 -1
- package/dist/bundle/chunks/{chunk-OLCDIITS.js → chunk-UW6M3EXY.js} +1 -1
- package/dist/bundle/chunks/chunk-VICDRG3J.js +410 -0
- package/dist/bundle/chunks/chunk-VL7O5PO4.js +5 -0
- package/dist/bundle/chunks/chunk-XMJKZK5H.js +2 -0
- package/dist/bundle/chunks/{chunk-C5UFJ7B3.js → chunk-XMNPK472.js} +1 -1
- package/dist/bundle/chunks/{chunk-GSSD3R5X.js → chunk-XQ45JMGN.js} +1 -1
- package/dist/bundle/chunks/{client-WTYEICLH.js → chunk-Y3TMJV3J.js} +3 -3
- package/dist/bundle/chunks/{chunk-KXB5WIS5.js → chunk-Z6SAQ5O3.js} +1 -1
- package/dist/bundle/chunks/{chunk-CNL6QSUB.js → chunk-ZAUVY6ZC.js} +3 -3
- package/dist/bundle/chunks/{chunk-E4LBKOZG.js → chunk-ZLIVZQDY.js} +4 -4
- package/dist/bundle/chunks/{chunk-6AOVUTUR.js → chunk-ZXHLH4MW.js} +2 -2
- package/dist/bundle/chunks/cli-main-55EQA5PS.js +3 -0
- package/dist/bundle/chunks/client-LOS6GSEW.js +2 -0
- package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-K5H6BJP3.js → cloudflare-workers-ai-system-one-ZJQGIIRC.js} +1 -1
- package/dist/bundle/chunks/cursor-agent.js +3 -3
- package/dist/bundle/chunks/devin-agent.js +3 -3
- package/dist/bundle/chunks/dispatch-C2IBP5VV.js +9 -0
- package/dist/bundle/chunks/google-generative-ai-5G4RIQA6.js +2 -0
- package/dist/bundle/chunks/google-vertex-ALD4P27O.js +2 -0
- package/dist/bundle/chunks/{help-fast-path-3Z26DQSV.js → help-fast-path-PEIKGCKZ.js} +1 -1
- package/dist/bundle/chunks/host-command-657VCQ34.js +2 -0
- package/dist/bundle/chunks/{host-lifecycle-ONQIMWMX.js → host-lifecycle-HX3EGRRW.js} +1 -1
- package/dist/bundle/chunks/host-lifecycle.js +2 -2
- package/dist/bundle/chunks/{host-session-command-J65ENSV5.js → host-session-command-OV5XDOJK.js} +1 -1
- package/dist/bundle/chunks/{host-socket-request-3CWE4265.js → host-socket-request-K4LCUOUD.js} +1 -1
- package/dist/bundle/chunks/interactive-mode-MLXSYK2H.js +2 -0
- package/dist/bundle/chunks/{mcp-presenter-bootstrap-XUSCQVRC.js → mcp-presenter-bootstrap-FOMKF4TU.js} +1 -1
- package/dist/bundle/chunks/{mistral-conversations-DH44NOYV.js → mistral-conversations-RAE4K2XY.js} +1 -1
- package/dist/bundle/chunks/{multi-session-host-YI2WZOET.js → multi-session-host-774MACJU.js} +5 -6
- package/dist/bundle/chunks/{openai-codex-responses-SERAFKAS.js → openai-codex-responses-3CW4R7TG.js} +1 -1
- package/dist/bundle/chunks/{openai-completions-BZB5O45A.js → openai-completions-5UIJXQUF.js} +1 -1
- package/dist/bundle/chunks/openai-responses-2BO44MRW.js +3 -0
- package/dist/bundle/chunks/{package-manager-cli-GHZPJMRF.js → package-manager-cli-MZHVCX2S.js} +1 -1
- package/dist/bundle/chunks/{pi-messages-VXATX45B.js → pi-messages-RF6GER4R.js} +2 -2
- package/dist/bundle/chunks/{role-JVSBNKGE.js → role-ETSFSDTS.js} +1 -1
- package/dist/bundle/chunks/rotation-stream-ZMQB4GPO.js +2 -0
- package/dist/bundle/chunks/rpc-mode-UJXOIZCW.js +2 -0
- package/dist/bundle/chunks/{rpc-monitor-source-FFEQS744.js → rpc-monitor-source-DRZXJHTL.js} +1 -1
- package/dist/bundle/chunks/{schedule-command-YWG6D6ZF.js → schedule-command-KA7LFFNK.js} +1 -1
- package/dist/bundle/chunks/session-control-endpoint-MFWXUR7Z.js +3 -0
- package/dist/bundle/chunks/session-picker-BP33NRSL.js +2 -0
- package/dist/bundle/chunks/session-worker.js +212 -203
- package/dist/bundle/chunks/{typesafe-system-one-P75WJ767.js → typesafe-system-one-GNNZ5O5U.js} +1 -1
- package/dist/bundle/cli.js +2 -2
- package/dist/bundle/host-supervisor.js +2 -2
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/bundle/runtime-manifest.json +1 -1
- package/dist/cli/host-command-args.d.ts +1 -0
- package/dist/cli/host-command-args.js +5 -0
- package/dist/cli/host-command.js +7 -1
- package/dist/cli.js +21 -3
- package/dist/core/extensions/builtin/mcp/catalog-cache.d.ts +2 -1
- package/dist/core/extensions/builtin/mcp/catalog-cache.js +19 -6
- package/dist/core/extensions/builtin/mcp/catalog.d.ts +3 -2
- package/dist/core/extensions/builtin/mcp/catalog.js +20 -3
- package/dist/core/extensions/builtin/mcp/elicitation.js +2 -4
- package/dist/core/extensions/builtin/mcp/expose/call.d.ts +2 -1
- package/dist/core/extensions/builtin/mcp/expose/call.js +2 -1
- package/dist/core/extensions/builtin/mcp/expose/register.js +1 -1
- package/dist/core/extensions/builtin/mcp/expose/schema-compat.d.ts +2 -2
- package/dist/core/extensions/builtin/mcp/expose/schema-compat.js +11 -1
- package/dist/core/extensions/builtin/mcp/invocation.js +16 -2
- package/dist/core/extensions/builtin/mcp/modern/request.d.ts +1 -1
- package/dist/core/extensions/builtin/mcp/modern/request.js +1 -1
- package/dist/core/extensions/builtin/mcp/modern/sdk-bridge.js +18 -3
- package/dist/core/extensions/builtin/mcp/modern/stdio-probe.js +23 -0
- package/dist/core/extensions/builtin/mcp/modern/subscriptions.d.ts +14 -0
- package/dist/core/extensions/builtin/mcp/modern/subscriptions.js +226 -0
- package/dist/core/extensions/builtin/mcp/modern/tool-schema.d.ts +13 -0
- package/dist/core/extensions/builtin/mcp/modern/tool-schema.js +75 -0
- package/dist/core/extensions/builtin/mcp/modern/tools.d.ts +107 -0
- package/dist/core/extensions/builtin/mcp/modern/tools.js +53 -0
- package/dist/core/extensions/builtin/mcp/resources.js +4 -0
- package/dist/core/extensions/builtin/mcp/tool-client.d.ts +13 -0
- package/dist/core/extensions/builtin/mcp/tool-client.js +17 -0
- package/dist/core/extensions/builtin/mcp/tool-contracts.d.ts +19 -0
- package/dist/core/extensions/builtin/mcp/tool-contracts.js +2 -0
- package/dist/core/extensions/builtin/mcp/wrap.js +2 -2
- package/dist/core/extensions/builtin/permission-system/bash-command-segments.d.ts +37 -0
- package/dist/core/extensions/builtin/permission-system/bash-command-segments.js +899 -0
- package/dist/core/extensions/builtin/permission-system/parsers.d.ts +2 -0
- package/dist/core/extensions/builtin/permission-system/parsers.js +44 -10
- package/dist/core/session-control-actions.js +0 -2
- package/dist/modes/interactive/session-control-attach.d.ts +20 -0
- package/dist/modes/interactive/session-control-attach.js +13 -0
- package/dist/modes/interactive/session-control-commands.js +37 -10
- package/dist/modes/interactive/session-control-registry.d.ts +2 -1
- package/dist/modes/interactive/session-control-registry.js +3 -2
- package/dist/modes/interactive/session-control-rpc-commands.d.ts +4 -2
- package/dist/modes/interactive/session-control-rpc-commands.js +133 -4
- package/dist/modes/interactive/session-control-server.js +9 -3
- package/dist/modes/rpc/compact-content-store.d.ts +96 -0
- package/dist/modes/rpc/compact-content-store.js +269 -0
- package/dist/modes/rpc/compact-session-state.d.ts +111 -0
- package/dist/modes/rpc/compact-session-state.js +206 -0
- package/dist/modes/rpc/compact-spool-dir.d.ts +5 -0
- package/dist/modes/rpc/compact-spool-dir.js +61 -0
- package/dist/modes/rpc/compact-storage-io.d.ts +27 -0
- package/dist/modes/rpc/compact-storage-io.js +19 -0
- package/dist/modes/rpc/connection-handler.d.ts +2 -0
- package/dist/modes/rpc/connection-handler.js +45 -47
- package/dist/modes/rpc/connection-question-bridge.d.ts +2 -1
- package/dist/modes/rpc/connection-question-bridge.js +6 -2
- package/dist/modes/rpc/custom-capability.d.ts +6 -0
- package/dist/modes/rpc/custom-capability.js +6 -0
- package/dist/modes/rpc/extension-ui-response.d.ts +7 -2
- package/dist/modes/rpc/extension-ui-response.js +27 -7
- package/dist/modes/rpc/get-entries-command.d.ts +13 -0
- package/dist/modes/rpc/get-entries-command.js +61 -0
- package/dist/modes/rpc/get-entries-page.d.ts +22 -0
- package/dist/modes/rpc/get-entries-page.js +41 -2
- package/dist/modes/rpc/get-snapshot.d.ts +18 -0
- package/dist/modes/rpc/get-snapshot.js +43 -0
- package/dist/modes/rpc/host-capabilities.js +7 -1
- package/dist/modes/rpc/host-ensure-start.js +1 -0
- package/dist/modes/rpc/host-ensure-types.d.ts +2 -0
- package/dist/modes/rpc/host-ensure.js +1 -0
- package/dist/modes/rpc/host-handoff.d.ts +2 -0
- package/dist/modes/rpc/host-handover-request.d.ts +1 -1
- package/dist/modes/rpc/host-handover-request.js +4 -3
- package/dist/modes/rpc/host-handover-wire.js +6 -0
- package/dist/modes/rpc/host-idle-handover.d.ts +2 -0
- package/dist/modes/rpc/host-idle-handover.js +3 -1
- package/dist/modes/rpc/host-observe-request.d.ts +2 -1
- package/dist/modes/rpc/host-observe-request.js +5 -1
- package/dist/modes/rpc/host-runner.d.ts +1 -0
- package/dist/modes/rpc/host-runner.js +9 -7
- package/dist/modes/rpc/host-successor.js +4 -0
- package/dist/modes/rpc/json-normal-value.d.ts +6 -0
- package/dist/modes/rpc/json-normal-value.js +100 -0
- package/dist/modes/rpc/mcp-presenter-bootstrap.js +5 -0
- package/dist/modes/rpc/media-placeholders.d.ts +9 -3
- package/dist/modes/rpc/media-placeholders.js +12 -4
- package/dist/modes/rpc/rpc-host-command-types.d.ts +2 -0
- package/dist/modes/rpc/rpc-question-types.d.ts +1 -0
- package/dist/modes/rpc/rpc-read-response-types.d.ts +9 -0
- package/dist/modes/rpc/rpc-session-command-types.d.ts +14 -1
- package/dist/modes/rpc/rpc-session-state-types.d.ts +3 -0
- package/dist/modes/rpc/rpc-session-state.js +2 -0
- package/dist/modes/rpc/rpc-types.d.ts +1 -0
- package/dist/modes/rpc/session-attachment-gate.js +1 -0
- package/dist/modes/rpc/session-binding.js +21 -18
- package/dist/modes/rpc/session-command-activity.js +1 -0
- package/dist/modes/rpc/session-event-fanout.d.ts +1 -1
- package/dist/modes/rpc/session-event-fanout.js +17 -9
- package/dist/modes/rpc/session-event-writer.js +22 -5
- package/dist/modes/rpc/session-extension-ui-requests.d.ts +2 -1
- package/dist/modes/rpc/session-extension-ui-requests.js +15 -10
- package/dist/modes/rpc/session-held.js +1 -0
- package/dist/modes/rpc/session-status-stream.d.ts +2 -1
- package/dist/modes/rpc/session-status-stream.js +8 -2
- package/dist/modes/rpc/session-status-subscriptions.d.ts +2 -1
- package/dist/modes/rpc/session-status-subscriptions.js +4 -0
- package/dist/modes/rpc/session-worker.js +5 -2
- package/dist/modes/rpc/snapshot-types.d.ts +29 -0
- package/dist/modes/rpc/snapshot-types.js +2 -0
- package/dist/modes/rpc/ui-answer-ledger.d.ts +13 -0
- package/dist/modes/rpc/ui-answer-ledger.js +34 -0
- package/dist/senpi +21 -3
- package/docs/mcp.md +20 -0
- package/docs/rpc.md +87 -11
- package/package.json +7 -6
- package/dist/bundle/chunks/azure-openai-responses-7I45DI72.js +0 -2
- package/dist/bundle/chunks/chunk-3LNSLJ7N.js +0 -2
- package/dist/bundle/chunks/chunk-6O4SEW2W.js +0 -5
- package/dist/bundle/chunks/chunk-7W7OJDIY.js +0 -410
- package/dist/bundle/chunks/chunk-DMI55M2N.js +0 -2
- package/dist/bundle/chunks/chunk-H3HNMY2W.js +0 -13
- package/dist/bundle/chunks/chunk-MSQCTH6V.js +0 -2
- package/dist/bundle/chunks/cli-main-HEKFFB5S.js +0 -3
- package/dist/bundle/chunks/dispatch-NYAULNVW.js +0 -9
- package/dist/bundle/chunks/google-generative-ai-UM5Y7T6B.js +0 -2
- package/dist/bundle/chunks/google-vertex-OKU2VQHL.js +0 -2
- package/dist/bundle/chunks/host-command-Z3WPHJOW.js +0 -2
- package/dist/bundle/chunks/interactive-mode-DEPQC6TX.js +0 -2
- package/dist/bundle/chunks/openai-responses-TNHQ6SJS.js +0 -3
- package/dist/bundle/chunks/rotation-stream-ZPVCFOVD.js +0 -2
- package/dist/bundle/chunks/rpc-mode-ORHBGBBV.js +0 -2
- package/dist/bundle/chunks/session-control-endpoint-36HAQSQO.js +0 -3
- package/dist/bundle/chunks/session-picker-25H5KNYP.js +0 -2
|
@@ -15,7 +15,7 @@ Run independent searches and reads together in one batch. Keep dependent steps i
|
|
|
15
15
|
|
|
16
16
|
A task is finished when the requested behavior is in place and you have watched it work: the relevant test, build, or command run, and its output read. Until you have that, keep going. If something remains unproven or broken, say which part and why.
|
|
17
17
|
|
|
18
|
-
When asked a question, answer it from the code and stop there. Edit when a change was requested or when a fix is confirmed.`,COMPOSER_MODEL_ID_PATTERN=/(?:^|[/:._-])composer(?:[/:._-]|\d|$)/i;function isCursorComposerModel(modelId){return COMPOSER_MODEL_ID_PATTERN.test(modelId)}var CURSOR_MULTIMODAL_ID_PATTERN=/^default$|claude|gemini|gpt-|codex|kimi-k3|muse-|cursor-grok-4\.[56]/;function cursorDiscoveredInput(modelId){return CURSOR_MULTIMODAL_ID_PATTERN.test(modelId.toLowerCase())?["text","image"]:["text"]}var FifoQueue=class{constructor(){this.incoming=[],this.outgoing=[]}get length(){return this.incoming.length+this.outgoing.length}enqueue(value){this.incoming.push(value)}dequeue(){if(this.outgoing.length===0)for(;this.incoming.length>0;)this.outgoing.push(this.incoming.pop());return this.outgoing.pop()}},EventStream=class{#queue;#queueHead;#failed;#error;#localWorkDepth;constructor(isComplete,extractResult){this.#queue=[],this.#queueHead=0,this.waiting=new FifoQueue,this.done=!1,this.#failed=!1,this.#localWorkDepth=0,this.isComplete=isComplete,this.extractResult=extractResult,this.finalResultPromise=new Promise((resolve,reject)=>{this.resolveFinalResult=resolve,this.rejectFinalResult=reject}),this.finalResultPromise.catch(()=>{})}get queue(){return this.#queue.slice(this.#queueHead)}#enqueue(event){this.#queue.push(event)}#dequeue(){let event=this.#queue[this.#queueHead];if(event===void 0)throw new Error("EventStream queue underflow");return this.#queueHead++,this.#queueHead>1024&&this.#queueHead*2>=this.#queue.length&&(this.#queue=this.#queue.slice(this.#queueHead),this.#queueHead=0),event}push(event){
|
|
18
|
+
When asked a question, answer it from the code and stop there. Edit when a change was requested or when a fix is confirmed.`,COMPOSER_MODEL_ID_PATTERN=/(?:^|[/:._-])composer(?:[/:._-]|\d|$)/i;function isCursorComposerModel(modelId){return COMPOSER_MODEL_ID_PATTERN.test(modelId)}var CURSOR_MULTIMODAL_ID_PATTERN=/^default$|claude|gemini|gpt-|codex|kimi-k3|muse-|cursor-grok-4\.[56]/;function cursorDiscoveredInput(modelId){return CURSOR_MULTIMODAL_ID_PATTERN.test(modelId.toLowerCase())?["text","image"]:["text"]}var captures=new WeakMap,readers=new WeakMap,writers=new WeakMap,states=new WeakMap,demanded=new WeakSet,warned=new WeakSet,NO_CHANGE=Object.freeze({}),subscribers=0,capturedAny=!1;function setAssistantReader(owner,reader){readers.set(owner,reader)}function setAssistantProgressWriter(owner,writer){writers.set(owner,writer)}function enableAssistantCapture(owner){states.has(owner)||states.set(owner,void 0)}function activeState(owner){let state=states.get(owner);if(state!==void 0||!states.has(owner))return state??void 0;let decided=subscribers>0||demanded.has(owner)?{positions:new Map,metadata:new Map,insertCopies:new Map,failedBlocks:new Set}:null;return capturedAny||=decided!==null,states.set(owner,decided),decided??void 0}function dropCapture(owner,error,state,contentIndex){contentIndex!==void 0&&state?.failedBlocks.add(contentIndex),!warned.has(owner)&&(warned.add(owner),console.warn("[assistant-capture] could not build an internal capture record; that block's records are dropped",error))}function freezeCapture(value){let freeze=part=>{if(!(part===null||typeof part!="object"||Object.isFrozen(part))){for(let child of Object.values(part))freeze(child);Object.freeze(part)}},copy=structuredClone(value);return freeze(copy),copy}function publicBlock(block){return Object.fromEntries({text:["type","text","audience","textSignature"],thinking:["type","thinking","thinkingSignature","redacted","startedAt","endedAt"],toolCall:["type","id","name","arguments","incomplete","errorMessage","thoughtSignature","namespace"],providerNative:["type","subtype","raw"]}[block.type].filter(key=>key in block).map(key=>[key,Reflect.get(block,key)]))}function sameValue(left,right){if(left===right)return!0;if(!isPlainData(left)||!isPlainData(right)||Array.isArray(left)!==Array.isArray(right))return!1;let keys=Object.keys(left);return keys.length===Object.keys(right).length&&keys.every(key=>Object.hasOwn(right,key)&&sameValue(Reflect.get(left,key),Reflect.get(right,key)))}function isPlainData(value){if(typeof value!="object"||value===null)return!1;let prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===Array.prototype||prototype===null}function dropAssistantCapture(event){capturedAny&&captures.delete(event)}function captureAssistantEvent(owner,event,hint={}){let state=activeState(owner);if(!state||captures.has(event))return;let contentIndex="contentIndex"in event?hint.contentIndex??event.contentIndex:void 0;if(!(contentIndex!==void 0&&state.failedBlocks.has(contentIndex)))try{captures.set(event,buildCapture(state,event,hint))}catch(error){dropCapture(owner,error,state,contentIndex)}}function buildCapture(state,event,hint){let message=event.type==="done"?event.message:event.type==="error"?event.error:event.partial,usage=usageCopy(state,message.usage);if(!("contentIndex"in event))return Object.freeze({usage,metadata:changedMetadata(state,message),message:freezeCapture({...message,content:message.content.map(publicBlock)})});let index=hint.contentIndex??event.contentIndex,own=index===event.contentIndex?{}:{contentIndex:index};if("delta"in event){let position=state.positions.get(index)??{offset:0,parsedThrough:0},offset=hint.offset??position.offset;return position.offset=offset+event.delta.length,event.type==="toolcall_delta"&&event.delta.length>0&&(position.parsedThrough=hint.parsedThrough??Math.max(position.parsedThrough,position.offset)),state.positions.set(index,position),Object.freeze({usage,offset,...own,...event.type==="toolcall_delta"?{parsedThrough:position.parsedThrough}:{}})}let metadata=changedMetadata(state,message),block=freezeCapture(publicBlock(event.type==="toolcall_end"?event.toolCall:message.content[index]));if(event.type!=="text_start"&&event.type!=="thinking_start"&&event.type!=="toolcall_start")return Object.freeze({usage,metadata,block,...own});let rawArgumentPrefix=hint.rawArgumentPrefix??"",coveredCodeUnits=block.type==="text"?block.text.length:block.type==="thinking"?block.thinking.length:rawArgumentPrefix.length,parsedThrough=hint.parsedThrough??0;return state.positions.set(index,{offset:hint.offset??coveredCodeUnits,parsedThrough}),Object.freeze({usage,metadata,block,coveredCodeUnits,...own,...block.type==="toolCall"?{rawArgumentPrefix,parsedThrough}:{}})}function usageCopy(state,usage){if(state.usage!==void 0&&sameValue(usage,state.usage))return state.usage;let copy=Object.freeze({...usage,cost:Object.freeze({...usage.cost}),...usage.contextUsage?{contextUsage:Object.freeze({...usage.contextUsage})}:{}});return state.usage=copy,copy}function changedMetadata(state,message){let changed={};for(let key of Object.keys(message)){if(key==="content"||key==="usage")continue;let value=Reflect.get(message,key);(!state.metadata.has(key)||state.metadata.get(key)!==value)&&(changed[key]=value)}for(let key of state.metadata.keys())key in message||(changed[key]=null);let frozen=Object.keys(changed).length===0?NO_CHANGE:freezeCapture(changed);for(let key of Object.keys(changed))key in message?state.metadata.set(key,Reflect.get(message,key)):state.metadata.delete(key);return frozen}var FifoQueue=class{constructor(){this.incoming=[],this.outgoing=[]}get length(){return this.incoming.length+this.outgoing.length}enqueue(value){this.incoming.push(value)}prepend(value){this.outgoing.push(value)}dequeue(){if(this.outgoing.length===0)for(;this.incoming.length>0;)this.outgoing.push(this.incoming.pop());return this.outgoing.pop()}},EventStream=class{#queue;#queueHead;#failed;#error;#localWorkDepth;constructor(isComplete,extractResult){this.#queue=[],this.#queueHead=0,this.waiting=new FifoQueue,this.done=!1,this.#failed=!1,this.#localWorkDepth=0,this.isComplete=isComplete,this.extractResult=extractResult,this.finalResultPromise=new Promise((resolve,reject)=>{this.resolveFinalResult=resolve,this.rejectFinalResult=reject}),this.finalResultPromise.catch(()=>{})}get queue(){return this.#queue.slice(this.#queueHead).flatMap(entry=>"event"in entry?[entry.event]:[])}#enqueue(event){this.#queue.push(event)}#dequeue(){let event=this.#queue[this.#queueHead];if(event===void 0)throw new Error("EventStream queue underflow");return this.#queueHead++,this.#queueHead>1024&&this.#queueHead*2>=this.#queue.length&&(this.#queue=this.#queue.slice(this.#queueHead),this.#queueHead=0),event}push(event){this.done||(this.isComplete(event)&&(this.done=!0,this.resolveFinalResult(this.extractResult(event))),this.#deliver({event}))}enqueueProgress(progress){this.done||this.#deliver({progress})}#deliver(entry){let waiter=this.waiting.dequeue();waiter?waiter.resolve({value:entry,done:!1}):this.#enqueue(entry)}end(result){for(this.done=!0,result!==void 0&&this.resolveFinalResult(result);this.waiting.length>0;){let waiter=this.waiting.dequeue();waiter&&waiter.resolve({value:void 0,done:!0})}}fail(error){if(!this.done)for(this.done=!0,this.#failed=!0,this.#error=error,this.rejectFinalResult(error);this.waiting.length>0;){let waiter=this.waiting.dequeue();waiter&&waiter.reject(error)}}[Symbol.asyncIterator](){return this.mapIterator(entry=>"event"in entry?{value:entry.event,done:!1}:void 0)}mapIterator(project){return{next:()=>{for(;this.#queueHead<this.#queue.length;){let result=project(this.#dequeue());if(result)return Promise.resolve(result)}return this.#failed?Promise.reject(this.#error):this.done?Promise.resolve({value:void 0,done:!0}):new Promise((resolve,reject)=>{let waiter={reject,resolve:next=>{let result=next.done?{value:void 0,done:!0}:project(next.value);result?resolve(result):this.waiting.prepend(waiter)}};this.waiting.enqueue(waiter)})}}}result(){return this.finalResultPromise}async trackLocalWork(work){this.#localWorkDepth++;try{return await work}finally{this.#localWorkDepth--}}hasPendingLocalWork(){return this.#localWorkDepth>0}},AssistantMessageEventStream=class _AssistantMessageEventStream extends EventStream{constructor(options={}){super(event=>event.type==="done"||event.type==="error",event=>{if(event.type==="done")return event.message;if(event.type==="error")return event.error;throw new Error("Unexpected event type for final result")}),options.captureBlocks&&enableAssistantCapture(this),setAssistantProgressWriter(this,progress=>this.enqueueProgress(progress)),new.target.prototype[Symbol.asyncIterator]===_AssistantMessageEventStream.prototype[Symbol.asyncIterator]&&setAssistantReader(this,project=>this.mapIterator(project))}push(event,hint){this.done||(captureAssistantEvent(this,event,hint),super.push(event))}[Symbol.asyncIterator](){return this.mapIterator(entry=>{if("event"in entry)return dropAssistantCapture(entry.event),{value:entry.event,done:!1}})}};function costCardAt(cost,atMs){let card=cost,startedAt=Number.NEGATIVE_INFINITY;for(let rate of cost.effectiveRates??[]){let from=Date.parse(rate.effectiveFrom);from<=atMs&&from>startedAt&&(card=rate,startedAt=from)}return card}function contentText(content,separator=`
|
|
19
19
|
`){return typeof content=="string"?content:content.filter(block=>block.type==="text").map(block=>block.text).join(separator)}function getSystemMessageText(message){let parts=[contentText(message.content)];for(let text of Object.values(message.sections??{}))text!==null&&parts.push(text);return parts.filter(part=>part.length>0).join(`
|
|
20
20
|
|
|
21
21
|
`)}function isSystemMessage(message){return message.role==="system"}function getCurrentTools(messages){let tools=new Map;for(let message of messages)if(isSystemMessage(message)){for(let tool of message.toolsRemoved??[])tools.delete(tool.name);for(let tool of message.toolsAdded??[])tools.set(tool.name,tool)}return[...tools.values()]}function getCurrentSystemMessage(messages){let content=[],sections=new Map,timestamp;for(let message of messages){if(!isSystemMessage(message))continue;timestamp??=message.timestamp;let text=contentText(message.content);text.length>0&&content.push(text);for(let[name,value]of Object.entries(message.sections??{}))value===null?sections.delete(name):sections.set(name,value)}let tools=getCurrentTools(messages);if(!(timestamp===void 0&&tools.length===0))return{role:"system",content:content.join(`
|
|
@@ -29,7 +29,7 @@ When asked a question, answer it from the code and stop there. Edit when a chang
|
|
|
29
29
|
`)};return{getWireId(baseId){let existing=records[baseId];if(!existing)return baseId;if(!existing.skip)return existing.wireId;let wireId=randomId();return existing.wireId=wireId,existing.skip=!1,existing.poisonCount=0,existing.surfaced=!1,records[baseId]=existing,persist(),wireId},shouldSkip(baseId){return records[baseId]?.skip===!0},shouldSurfaceBeforeRotating(baseId){return records[baseId]?.surfaced!==!0},markSurfaced(baseId,currentWireId){let existing=records[baseId]??{wireId:currentWireId,poisonCount:0,skip:!1,surfaced:!1};existing.surfaced||(existing.surfaced=!0,records[baseId]=existing,persist())},recordCount(){return Object.keys(records).length},recordZeroTokenPoison(baseId,currentWireId){let existing=records[baseId]??{wireId:currentWireId,poisonCount:0,skip:!1,surfaced:!1};if(existing.skip||existing.poisonCount>=MAX_CURSOR_CONVERSATION_ROTATIONS)return existing.skip=!0,existing.wireId=currentWireId,records[baseId]=existing,persist(),{kind:"exhausted"};let wireId=randomId();return existing.wireId=wireId,existing.poisonCount+=1,records[baseId]=existing,persist(),{kind:"rotated",wireId}}}}function resolveConversationRotationPersistPath(env=process.env){return env.CURSOR_CONVERSATION_ID_STORE?env.CURSOR_CONVERSATION_ID_STORE:`${(env.SENPI_CODING_AGENT_DIR??env.CODING_AGENT_DIR??`${(env.HOME??".").replace(/\/$/,"")}/.senpi/agent`).replace(/\/$/,"")}/cursor-conversation-ids.json`}function readRotationRecordLimit(raw){let parsed=Number(raw);return Number.isFinite(parsed)&&parsed>0?Math.floor(parsed):void 0}function loadRecords(persistPath){try{let parsed=JSON.parse(readFileSync2(persistPath,"utf8"));if(!parsed||typeof parsed!="object"||Array.isArray(parsed))return{};let records={};for(let[baseId,value]of Object.entries(parsed)){if(!value||typeof value!="object")continue;let raw=value;typeof raw.wireId!="string"||raw.wireId.length===0||(records[baseId]={wireId:raw.wireId,poisonCount:typeof raw.poisonCount=="number"&&raw.poisonCount>=0?raw.poisonCount:0,skip:raw.skip===!0,surfaced:raw.surfaced===!0})}return records}catch{return{}}}function isUsableCursorTaskArgs(args){if(!args||typeof args!="object"||Array.isArray(args))return!1;let rec=args;return!!(rec.category||rec.subagent_type||typeof rec.prompt=="string"&&rec.prompt.trim()||Array.isArray(rec.tasks)&&rec.tasks.length>0)}function keepUsableCursorTaskArgs(previous,next){return isUsableCursorTaskArgs(next)?next:isUsableCursorTaskArgs(previous)?previous:next}function hashBytes(input){let out=new Uint8Array(32),b=typeof input=="string"?new TextEncoder().encode(input):input;for(let i=0;i<b.length;i++)out[i%32]=out[i%32]+b[i]+i&255;return out}function createHash2(input){let data=typeof input=="string"?input:new TextDecoder().decode(input);return{update(v){return data+=typeof v=="string"?v:new TextDecoder().decode(v),this},digest(format){let b=hashBytes(data);return format==="hex"?[...b].map(x=>x.toString(16).padStart(2,"0")).join(""):b}}}function deterministicUuid2(s){let h=[...hashBytes(s)].map(x=>x.toString(16).padStart(2,"0")).join("");return`${h.slice(0,8)}-${h.slice(8,12)}-${h.slice(12,16)}-${h.slice(16,20)}-${h.slice(20,32)}`}function randomUUID2(){let h=[...hashBytes(String(Math.random())+Date.now())].map(x=>x.toString(16).padStart(2,"0")).join("");return`${h.slice(0,8)}-${h.slice(8,12)}-${h.slice(12,16)}-${h.slice(16,20)}-${h.slice(20,32)}`}function storeCursorBlob(m,d){let id=hashBytes(d);return m.set([...id].map(x=>x.toString(16).padStart(2,"0")).join(""),d),id}function readCursorBlob(m,id){let d=m.get([...id].map(x=>x.toString(16).padStart(2,"0")).join(""));if(!d)throw Error("Cursor blob not found");return d}function toolResultToText(r){return r.content.map(i=>i.type==="text"?i.text:`[${i.mimeType} image]`).join(`
|
|
30
30
|
`)}function extractUserMessageText(msg){if(msg.role!=="user")return"";let content=msg.content;return typeof content=="string"?content.trim():content.filter(c=>c.type==="text").map(c=>c.text).join(`
|
|
31
31
|
`).trim()}function hasUserMessageImages(msg){return msg.role==="user"&&Array.isArray(msg.content)&&msg.content.some(item=>item.type==="image")}function buildCursorRootPromptContent(content){if(typeof content=="string"){let text=content.trim();return text?[{type:"text",text}]:[]}let parts=[];for(let item of content)if(item.type==="text"){let text=item.text.trim();text&&parts.push({type:"text",text})}else parts.push({type:"image",image:`data:${item.mimeType};base64,${item.data}`,mediaType:item.mimeType});return parts}function cursorUserContentKey(content){if(typeof content=="string")return content.trim();let hash=createHash2("sha256");for(let item of content)hash.update(item.type),item.type==="text"?hash.update(item.text):(hash.update(item.mimeType),hash.update(item.data));return hash.digest("hex")}function buildCursorAssistantContent(msg){let content=[];for(let item of msg.content)item.type==="text"?item.text&&content.push({type:"text",text:item.text}):item.type==="toolCall"&&content.push({type:"tool-call",toolCallId:item.id,toolName:item.name,args:item.arguments});return content}function findLastUserMessageIndex(messages){for(let i=messages.length-1;i>=0;i--)if(messages[i].role==="user")return i;return-1}function buildRootPromptMessagesJson(messages,systemPromptIds,blobStore,activeUserMessageIndex=findLastUserMessageIndex(messages)){let entries=[...systemPromptIds],pushJson=obj=>{let bytes=new TextEncoder().encode(JSON.stringify(obj));entries.push(storeCursorBlob(blobStore,bytes))};for(let i=0;i<messages.length&&i!==activeUserMessageIndex;i++){let msg=messages[i];if(msg.role==="user"){let content=buildCursorRootPromptContent(msg.content);if(content.length===0)continue;pushJson({role:"user",content})}else if(msg.role==="assistant"){let content=buildCursorAssistantContent(msg);if(content.length===0)continue;pushJson({role:"assistant",content})}else msg.role==="toolResult"&&pushJson({role:"tool",id:msg.toolCallId,content:[{type:"tool-result",toolName:msg.toolName,toolCallId:msg.toolCallId,result:toolResultToText(msg),...msg.isError?{isError:!0}:{}}]})}return entries}function isPlainRecord(value){if(value===null||typeof value!="object"||Array.isArray(value))return!1;let prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}function isJsonValue(value){if(value===null||typeof value=="string"||typeof value=="boolean")return!0;if(typeof value=="number")return Number.isFinite(value);if(Array.isArray(value))return value.every(isJsonValue);if(!isPlainRecord(value))return!1;for(let key in value)if(!isJsonValue(value[key]))return!1;return!0}function encodeCursorMcpArguments(toolCall){let encoded={};for(let name in toolCall.arguments){let value=toolCall.arguments[name];if(value!==void 0){if(!isJsonValue(value))throw new Error(`Cursor tool argument ${toolCall.name}.${name} is not JSON-serializable`);encoded[name]=toBinary(ValueSchema,fromJson(ValueSchema,value))}}return encoded}function createCursorMcpResult(result){return result.isError?create(McpToolResultSchema,{result:{case:"error",value:create(McpToolErrorSchema,{error:toolResultToText(result)})}}):create(McpToolResultSchema,{result:{case:"success",value:create(McpSuccessSchema,{content:result.content.map(item=>item.type==="text"?create(McpToolResultContentItemSchema,{content:{case:"text",value:create(McpTextContentSchema,{text:item.text})}}):create(McpToolResultContentItemSchema,{content:{case:"image",value:create(McpImageContentSchema,{data:Uint8Array.from(Uint8Array.from(atob(item.data),c=>c.charCodeAt(0))),mimeType:item.mimeType})}}))})}})}function createCursorToolCallStep(toolCall,result){let mcpCall=create(McpToolCallSchema,{args:create(McpArgsSchema,{name:toolCall.name,args:encodeCursorMcpArguments(toolCall),toolCallId:toolCall.id,providerIdentifier:"pi-agent",toolName:toolCall.name}),...result?{result:createCursorMcpResult(result)}:{}});return create(ConversationStepSchema,{message:{case:"toolCall",value:create(ToolCallSchema,{tool:{case:"mcpToolCall",value:mcpCall},toolCallId:toolCall.id})}})}function buildConversationTurns(messages,blobStore,activeUserMessageIndex=findLastUserMessageIndex(messages)){let turns=[],historyEnd=activeUserMessageIndex>=0?activeUserMessageIndex:messages.length,toolResults=new Map,pairedToolCallIds=new Set;for(let index=0;index<historyEnd;index++){let message=messages[index];if(message.role==="toolResult")toolResults.set(message.toolCallId,message);else if(message.role==="assistant")for(let item of message.content)item.type==="toolCall"&&pairedToolCallIds.add(item.id)}let i=0;for(;i<messages.length;){let msg=messages[i];if(msg.role!=="user"){i++;continue}if(i===activeUserMessageIndex)break;let userText=extractUserMessageText(msg);if(userText.length===0&&!hasUserMessageImages(msg)){i++;continue}let userMessage=createCursorUserMessage(msg.content,userText,deterministicUuid2(`u:${turns.length}:${cursorUserContentKey(msg.content)}`)),userMessageBlobId=storeCursorBlob(blobStore,toBinary(UserMessageSchema,userMessage)),stepBlobIds=[];for(i++;i<messages.length&&messages[i].role!=="user";){let stepMsg=messages[i];if(stepMsg.role==="assistant")for(let item of stepMsg.content){let step;if(item.type==="text"){if(!item.text)continue;step=create(ConversationStepSchema,{message:{case:"assistantMessage",value:create(AssistantMessageSchema,{text:item.text})}})}else{if(item.type==="thinking")continue;if(item.type==="toolCall")step=createCursorToolCallStep(item,toolResults.get(item.id));else continue}stepBlobIds.push(storeCursorBlob(blobStore,toBinary(ConversationStepSchema,step)))}else if(stepMsg.role==="toolResult"&&!pairedToolCallIds.has(stepMsg.toolCallId)){let text=toolResultToText(stepMsg);if(text){let prefix=stepMsg.isError?"[Tool Error]":"[Tool Result]",step=create(ConversationStepSchema,{message:{case:"assistantMessage",value:create(AssistantMessageSchema,{text:`${prefix}
|
|
32
|
-
${text}`})}});stepBlobIds.push(storeCursorBlob(blobStore,toBinary(ConversationStepSchema,step)))}}i++}let agentTurn=create(AgentConversationTurnStructureSchema,{userMessage:userMessageBlobId,steps:stepBlobIds}),turn=create(ConversationTurnStructureSchema,{turn:{case:"agentConversationTurn",value:agentTurn}});turns.push(storeCursorBlob(blobStore,toBinary(ConversationTurnStructureSchema,turn)))}return turns}function createCursorUserMessage(content,text,messageId=randomUUID2()){let images=typeof content=="string"?[]:extractImages(content);return create(UserMessageSchema,{text,messageId,...images.length>0?{selectedContext:create(SelectedContextSchema,{selectedImages:images})}:{}})}function extractImages(content){return content.filter(item=>item.type==="image").map(image=>create(SelectedImageSchema,{uuid:randomUUID2(),mimeType:image.mimeType,dataOrBlobId:{case:"data",value:Uint8Array.from(atob(image.data),c=>c.charCodeAt(0))}}))}function measureCursorModelInputSerializedBytes(messages,activeUserMessageIndex=findLastUserMessageIndex(messages)){let blobStore=new Map,total=0;for(let blobId of buildRootPromptMessagesJson(messages,[],blobStore,activeUserMessageIndex))total+=readCursorBlob(blobStore,blobId).byteLength;return total}function measureCursorHistorySerializedBytes(messages,activeUserMessageIndex=findLastUserMessageIndex(messages)){return buildCursorHistoryWireBytesForTest(messages,activeUserMessageIndex).reduce((total,bytes)=>total+bytes.byteLength,0)}function buildCursorHistoryWireBytesForTest(messages,activeUserMessageIndex=findLastUserMessageIndex(messages)){let blobStore=new Map;return buildRootPromptMessagesJson(messages,[],blobStore,activeUserMessageIndex),buildConversationTurns(messages,blobStore,activeUserMessageIndex),[...blobStore.values()]}var CURSOR_API_URL="https://api2.cursor.sh",CURSOR_CLIENT_VERSION="cli-2026.07.23-e383d2b",EXEC_HEARTBEAT_INTERVAL_MS=3e3,CURSOR_STREAM_HEALTH_FAIL_THRESHOLD_MS=3e4,CURSOR_STREAM_HEALTH_HEARTBEAT_ONLY_THRESHOLD_MS=CURSOR_STREAM_HEALTH_FAIL_THRESHOLD_MS*3,CURSOR_TURN_END_DRAIN_TIMEOUT_MS=5e3,HTTP2_FORBIDDEN_HEADERS=new Set(["connection","keep-alive","proxy-connection","transfer-encoding","upgrade","http2-settings"]),CURSOR_RESERVED_HEADERS=new Set(["content-type","connect-protocol-version","te","authorization","x-ghost-mode","x-cursor-client-version","x-cursor-client-type","x-request-id","host","content-length"]);function sanitizeCursorCallerHeaders(headers){let sanitized={};for(let[name,value]of Object.entries(headers??{})){let field=name.toLowerCase();field.startsWith(":")||HTTP2_FORBIDDEN_HEADERS.has(field)||CURSOR_RESERVED_HEADERS.has(field)||(sanitized[field]=value)}return sanitized}var NOT_IMPLEMENTED_SUFFIX="not implemented by this client",NOT_IMPLEMENTED="Not implemented by this client",conversationStateCache=new Map,conversationBlobStores=new Map,conversationCacheKeySessions=new Map,DEFAULT_CONVERSATION_CACHE_LIMIT=64,DEFAULT_CONVERSATION_BLOB_LIMIT_BYTES=256*1024*1024,DEFAULT_CONVERSATION_TOTAL_BLOB_LIMIT_BYTES=1024*1024*1024;function readPositiveIntEnv(raw,fallback){let parsed=Number(raw);return Number.isFinite(parsed)&&parsed>0?Math.floor(parsed):fallback}function conversationCacheLimit(){return readPositiveIntEnv(process.env.PI_CURSOR_CONVERSATION_CACHE_LIMIT,DEFAULT_CONVERSATION_CACHE_LIMIT)}function conversationBlobLimitBytes(){return readPositiveIntEnv(process.env.PI_CURSOR_CONVERSATION_BLOB_LIMIT_BYTES,DEFAULT_CONVERSATION_BLOB_LIMIT_BYTES)}function conversationTotalBlobLimitBytes(){return readPositiveIntEnv(process.env.PI_CURSOR_CONVERSATION_TOTAL_BLOB_LIMIT_BYTES,DEFAULT_CONVERSATION_TOTAL_BLOB_LIMIT_BYTES)}var ConversationBlobStore=class extends Map{constructor(){super(...arguments),this.blobBytes=0,this.pinnedKeys=new Set,this.pinHolders=0,this.warnedOverBudget=!1}set(key,value){let previous=super.get(key);return previous!==void 0&&(this.blobBytes-=previous.byteLength,super.delete(key)),this.blobBytes+=value.byteLength,super.set(key,value),this.pinHolders>0&&this.pinnedKeys.add(key),this.trimToBudget(),this}get(key){let value=super.get(key);if(value!==void 0)return super.delete(key),super.set(key,value),this.pinHolders>0&&this.pinnedKeys.add(key),value}delete(key){let existing=super.get(key);return this.pinnedKeys.delete(key),existing===void 0?super.delete(key):(this.blobBytes-=existing.byteLength,super.delete(key))}clear(){this.blobBytes=0,this.pinnedKeys.clear(),super.clear()}get totalBytes(){return this.blobBytes}get pinnedCount(){return this.pinnedKeys.size}beginRequestPins(){this.pinHolders+=1}shedUnpinnedBytes(keepBytes){let released=0;for(let[key,value]of this){if(this.blobBytes<=keepBytes)break;this.pinnedKeys.has(key)||(this.blobBytes-=value.byteLength,released+=value.byteLength,super.delete(key))}return released}releaseRequestPins(){this.pinHolders!==0&&(this.pinHolders-=1,!(this.pinHolders>0)&&(this.pinnedKeys.clear(),this.warnedOverBudget=!1,this.trimToBudget()))}trimToBudget(){let limit=conversationBlobLimitBytes();if(!(this.blobBytes<=limit)){for(let[key,value]of this){if(this.blobBytes<=limit)break;this.pinnedKeys.has(key)||(this.blobBytes-=value.byteLength,super.delete(key))}this.blobBytes<=limit||this.warnedOverBudget||(this.warnedOverBudget=!0,console.warn(`[cursor-agent] conversation blob store over budget: ${this.blobBytes} bytes pinned by the in-flight request exceed the ${limit} byte cap (${this.pinnedKeys.size} pinned blobs); the cap applies again when the stream settles`))}}};function registerConversationCacheKey(sessionId,conversationId){sessionId&&conversationCacheKeySessions.set(conversationId,sessionId)}function forgetConversationCacheKey(conversationId){conversationStateCache.delete(conversationId),conversationBlobStores.delete(conversationId),conversationCacheKeySessions.delete(conversationId)}var liveConversationKeys=new Map;function retainLiveConversation(conversationId){liveConversationKeys.set(conversationId,(liveConversationKeys.get(conversationId)??0)+1)}function releaseLiveConversation(conversationId){let holders=liveConversationKeys.get(conversationId);holders!==void 0&&(holders<=1?liveConversationKeys.delete(conversationId):liveConversationKeys.set(conversationId,holders-1))}function enforceConversationCacheLimit(newestKey,sessionId){let limit=conversationCacheLimit(),owner=sessionId??conversationCacheKeySessions.get(newestKey),ownedKeys=[...conversationBlobStores.keys()].filter(key=>conversationCacheKeySessions.get(key)===owner),owned=ownedKeys.length;for(let key of ownedKeys){if(owned<=limit)return;key!==newestKey&&(liveConversationKeys.has(key)||(forgetConversationCacheKey(key),owned-=1))}}function enforceConversationTotalBlobLimit(){let limit=conversationTotalBlobLimitBytes(),total=0;for(let store2 of conversationBlobStores.values())total+=store2.totalBytes;if(total<=limit)return;let cold=[],live=[];for(let entry of conversationBlobStores)(liveConversationKeys.has(entry[0])?live:cold).push(entry);for(let[key,store2]of[...cold,...live]){if(total<=limit)break;total-=store2.shedUnpinnedBytes(Math.max(0,store2.totalBytes-(total-limit))),store2.size===0&&!liveConversationKeys.has(key)&&forgetConversationCacheKey(key)}total<=limit||console.warn(`[cursor-agent] cursor conversation blobs total ${total} bytes over the ${limit} byte process ceiling; the remainder is pinned by in-flight requests and is released when their streams settle`)}function getOrCreateConversationBlobStore(conversationId,sessionId){let existing=conversationBlobStores.get(conversationId);if(existing)return existing;let store2=new ConversationBlobStore;return conversationBlobStores.set(conversationId,store2),enforceConversationCacheLimit(conversationId,sessionId),store2}function releaseConversationCacheForSession(sessionId){if(sessionId===void 0){conversationStateCache.clear(),conversationBlobStores.clear(),conversationCacheKeySessions.clear(),liveConversationKeys.clear();return}for(let[key,owner]of conversationCacheKeySessions)owner===sessionId&&(conversationStateCache.delete(key),conversationBlobStores.delete(key),conversationCacheKeySessions.delete(key))}registerSessionResourceCleanup(sessionId=>{releaseConversationCacheForSession(sessionId)});function getCursorConversationCacheStats(){let blobBytes=0;for(let store2 of conversationBlobStores.values())blobBytes+=store2.totalBytes;return{conversations:conversationBlobStores.size,states:conversationStateCache.size,blobBytes,keys:[...conversationBlobStores.keys()]}}var conversationRotationStore=createConversationRotationStore({persistPath:resolveConversationRotationPersistPath()}),conversationRotationPersistPath=resolveConversationRotationPersistPath();function rotationStore(){let persistPath=resolveConversationRotationPersistPath();return persistPath!==conversationRotationPersistPath&&(conversationRotationPersistPath=persistPath,conversationRotationStore=createConversationRotationStore({persistPath})),conversationRotationStore}var CONNECT_END_STREAM_FLAG=2;function log(type,subtype,data){if(!process.env.DEBUG_CURSOR)return;let verbose=process.env.DEBUG_CURSOR==="2"||process.env.DEBUG_CURSOR==="verbose",dataStr="";if(verbose&&data!==void 0)try{dataStr=` ${JSON.stringify(data,(_key,value)=>value instanceof Uint8Array?`bytes(${value.length})`:typeof value=="bigint"?value.toString():value)?.slice(0,500)}`}catch{dataStr=" [unserializable]"}console.error(`[CURSOR] ${type}${subtype?`: ${subtype}`:""}${dataStr}`)}function frameConnectMessage(data,flags=0){let frame=Buffer.alloc(5+data.length);return frame[0]=flags,frame.writeUInt32BE(data.length,1),frame.set(data,5),frame}function parseConnectEndStream(data){try{let error=JSON.parse(new TextDecoder().decode(data))?.error;if(error){let code=typeof error.code=="string"?error.code:"unknown",message=typeof error.message=="string"?error.message:"Unknown error";return new Error(`Connect error ${code}: ${message}`)}return null}catch{return new Error("Failed to parse Connect end stream")}}function mapH2TransportError(error,baseUrl){let code=error?.code,message=error instanceof Error?error.message:String(error);return code==="ERR_HTTP2_ERROR"&&/h2 is not supported/i.test(message)?new Error(`Cursor run transport could not negotiate HTTP/2 with ${baseUrl}: "h2 is not supported". This host serves the run RPC over HTTP/2 only, and the TLS handshake did not negotiate h2 via ALPN: typically an ALPN-stripping TLS-intercepting proxy. Front the provider with a local HTTP/2 bridge and point the model's baseUrl at it.`):error}var stream=(model,context,options)=>{let stream2=new AssistantMessageEventStream,requestView=toCursorRequestView(context);return(async()=>{let output={role:"assistant",content:[],api:"cursor-agent",provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()},inFlightDispatches=new Set,abortSettled,drainInFlightDispatches=async()=>{let signal=options?.signal;for(;inFlightDispatches.size>0;){if(signal?.aborted)return;let settled=Promise.all([...inFlightDispatches]);if(!signal){await settled;continue}abortSettled??=new Promise(resolve=>signal.addEventListener("abort",()=>resolve(),{once:!0})),await Promise.race([settled,abortSettled])}},h2Client=null,h2Request=null,heartbeatTimer=null,streamHealthTimer=null,h2Settled=!1,sawTurnEnded=!1,turnEndDrainTimedOut=!1,endStreamError=null,openBlockState,resolveH2=()=>{},rejectH2=()=>{},settleH2=error=>{if(!h2Settled){if(h2Settled=!0,error!==void 0){rejectH2(error);return}if(endStreamError){rejectH2(endStreamError);return}if(!sawTurnEnded){rejectH2(new Error("Cursor stream ended before turnEnded"));return}resolveH2()}},baseConversationId,conversationId,usageState,retryAttempt=!1,attempt=0,streamRetries=0,forceResumeAction=!1,pinnedRequestedModel,pinnedModelDetails;do{retryAttempt=!1,attempt+=1,h2Settled=!1,sawTurnEnded=!1,turnEndDrainTimedOut=!1,endStreamError=null,openBlockState=void 0;let h2Completion=new Promise((resolve,reject)=>{resolveH2=resolve,rejectH2=reject}),attemptSawCheckpoint=!1,attemptLiveKey,attemptPinnedStore;try{let apiKey=options?.apiKey;if(!apiKey)throw new Error("Cursor access token is required; run /login cursor");baseConversationId=options?.conversationId??options?.sessionId??randomUUID3(),conversationId=rotationStore().getWireId(baseConversationId),registerConversationCacheKey(options?.sessionId,conversationId),attemptLiveKey=conversationId,retainLiveConversation(conversationId);let blobStore=getOrCreateConversationBlobStore(conversationId,options?.sessionId);attemptPinnedStore=blobStore,blobStore.beginRequestPins();let cachedState=conversationStateCache.get(conversationId),{requestBytes,conversationState,requestedModel,modelDetails}=await buildGrpcRequest(model,requestView,options,{conversationId,blobStore,conversationState:cachedState,forceResumeAction,pinnedRequestedModel,pinnedModelDetails});pinnedRequestedModel??=requestedModel,pinnedModelDetails??=modelDetails,conversationStateCache.set(conversationId,conversationState),enforceConversationTotalBlobLimit();let requestContextTools=buildMcpToolDefinitions(requestView.tools),baseUrl=model.baseUrl||CURSOR_API_URL,requestHeaders={...sanitizeCursorCallerHeaders(providerHeadersToRecord(options?.headers)),":method":"POST",":path":"/agent.v1.AgentService/Run","content-type":"application/connect+proto","connect-protocol-version":"1",te:"trailers",authorization:`Bearer ${apiKey}`,"x-ghost-mode":"true","x-cursor-client-version":CURSOR_CLIENT_VERSION,"x-cursor-client-type":"cli","x-request-id":randomUUID3()},attemptH2Client=http2.connect(baseUrl);h2Client=attemptH2Client,attemptH2Client.on("error",error=>{if(h2Client!==attemptH2Client)return;let mapped=mapH2TransportError(error,baseUrl);settleH2(sawTurnEnded?mapped:new CursorRetryableStreamError(mapped instanceof Error?mapped.message:String(mapped),"transport",{cause:mapped}))}),attemptH2Client.on("goaway",()=>{h2Client===attemptH2Client&&!h2Settled&&!sawTurnEnded&&(settleH2(new CursorRetryableStreamError("Cursor HTTP/2 session received GOAWAY","transport")),h2Request?.close())}),attemptH2Client.on("close",()=>{h2Client===attemptH2Client&&!h2Settled&&!sawTurnEnded&&!endStreamError&&settleH2(new CursorRetryableStreamError("Cursor HTTP/2 session closed","transport"))}),h2Request=attemptH2Client.request(requestHeaders),attempt===1&&stream2.push({type:"start",partial:output});let pendingBuffer=Buffer.alloc(0),currentTextBlock=null,currentThinkingBlock=null,currentToolCall=null,resolvedMcpToolCallIds=new Set;usageState={sawTokenDelta:!1,sawTurnEndedUsage:!1};let state={get currentTextBlock(){return currentTextBlock},get currentThinkingBlock(){return currentThinkingBlock},get currentToolCall(){return currentToolCall},openToolCalls:new Map,resolvedMcpToolCallIds,setTextBlock:b=>{currentTextBlock=b},setThinkingBlock:b=>{currentThinkingBlock=b},setToolCall:t=>{currentToolCall=t},onToolResult:options?.onToolResult??options?.execHandlers?.onToolResult};openBlockState=state;let onConversationCheckpoint=checkpoint=>{attemptSawCheckpoint=!0,recordCursorContextLimit2(model.id,checkpoint.tokenDetails?.maxTokens),conversationStateCache.set(conversationId,checkpoint)},healthFailThresholdMs=options?.streamHealthFailThresholdMs??CURSOR_STREAM_HEALTH_FAIL_THRESHOLD_MS,lastInboundFrameAt=Date.now(),turnEndCompletionStarted=!1,armStreamHealthTimer=()=>{if(streamHealthTimer&&clearTimeout(streamHealthTimer),sawTurnEnded||h2Settled)return;let now=Date.now(),deadline=lastInboundFrameAt+healthFailThresholdMs;streamHealthTimer=setTimeout(()=>{if(streamHealthTimer=null,sawTurnEnded||h2Settled)return;if(Date.now()-lastInboundFrameAt<healthFailThresholdMs){armStreamHealthTimer();return}settleH2(new CursorRetryableStreamError("Cursor stream ended before turnEnded: inbound stream stalled","stall")),h2Request?.close()},Math.max(0,deadline-now))},completeAfterTurnEnded=async()=>{let drainTimeoutMs=options?.turnEndDrainTimeoutMs??CURSOR_TURN_END_DRAIN_TIMEOUT_MS,timeout,drained=await Promise.race([drainInFlightDispatches().then(()=>!0),new Promise(resolve=>{timeout=setTimeout(()=>resolve(!1),drainTimeoutMs)})]);if(timeout&&clearTimeout(timeout),!h2Settled){if(!drained){turnEndDrainTimedOut=!0,settleH2(new Error(`Cursor exec dispatches did not settle within ${drainTimeoutMs}ms after turnEnded`)),h2Request?.close();return}h2Request?.close(),settleH2()}};armStreamHealthTimer(),h2Request.on("data",chunk=>{for(pendingBuffer=pendingBuffer.length===0?chunk:Buffer.concat([pendingBuffer,chunk]);pendingBuffer.length>=5;){let flags=pendingBuffer[0],msgLen=pendingBuffer.readUInt32BE(1);if(pendingBuffer.length<5+msgLen)break;let messageBytes=pendingBuffer.subarray(5,5+msgLen);if(pendingBuffer=pendingBuffer.subarray(5+msgLen),flags&CONNECT_END_STREAM_FLAG){let endError=parseConnectEndStream(messageBytes);endError&&(endStreamError=endError,h2Request?.close());continue}try{let serverMessage=fromBinary(AgentServerMessageSchema,messageBytes),isTurnEnded=(serverMessage.message.case==="interactionUpdate"?serverMessage.message.value.message?.case:void 0)==="turnEnded";lastInboundFrameAt=Date.now(),armStreamHealthTimer();let dispatch=handleServerMessage(serverMessage,output,stream2,state,blobStore,h2Request,options?.execHandlers,state.onToolResult,usageState,requestContextTools,onConversationCheckpoint).catch(error=>{log("error","handleServerMessage",{error:String(error)})});inFlightDispatches.add(dispatch),dispatch.finally(()=>inFlightDispatches.delete(dispatch)),isTurnEnded&&!turnEndCompletionStarted&&(sawTurnEnded=!0,turnEndCompletionStarted=!0,completeAfterTurnEnded().catch(error=>settleH2(error)))}catch(e){log("error","parseServerMessage",{error:String(e)})}}});let sendHeartbeat=()=>{if(!h2Request||h2Request.closed)return;let heartbeatMessage=create(AgentClientMessageSchema,{message:{case:"clientHeartbeat",value:create(ClientHeartbeatSchema,{})}}),heartbeatBytes=toBinary(AgentClientMessageSchema,heartbeatMessage);h2Request.write(frameConnectMessage(heartbeatBytes))};h2Request.on("trailers",trailers=>{let status=trailers["grpc-status"],msg=trailers["grpc-message"];status&&status!=="0"&&!endStreamError&&(endStreamError=new Error(`gRPC error ${status}: ${decodeURIComponent(String(msg||""))}`))}),h2Request.on("end",()=>{if(!sawTurnEnded&&!endStreamError){settleH2(new CursorRetryableStreamError("Cursor stream ended before turnEnded","clean-end"));return}settleH2()}),h2Request.on("error",error=>{let mapped=mapH2TransportError(error,baseUrl);settleH2(sawTurnEnded?mapped:new CursorRetryableStreamError(mapped instanceof Error?mapped.message:String(mapped),"transport",{cause:mapped}))}),options?.signal&&options.signal.addEventListener("abort",()=>{h2Request?.close(),settleH2(new Error("Request was aborted"))}),h2Request.write(frameConnectMessage(requestBytes)),heartbeatTimer=setInterval(sendHeartbeat,5e3),await h2Completion,await drainInFlightDispatches(),endCurrentTextBlock(output,stream2,state),endCurrentThinkingBlock(output,stream2,state),flushOpenToolCalls(output,stream2,state),calculateCost(model,output.usage),stream2.push({type:"done",reason:output.stopReason,message:output}),stream2.end()}catch(error){if(turnEndDrainTimedOut||await drainInFlightDispatches(),shouldRetryCursorStream({error,retries:streamRetries,maxRetries:options?.streamStallMaxRetries??10,sawTurnEnded,aborted:options?.signal?.aborted===!0})){openBlockState&&(endCurrentTextBlock(output,stream2,openBlockState),endCurrentThinkingBlock(output,stream2,openBlockState),flushOpenToolCalls(output,stream2,openBlockState)),forceResumeAction||=attemptSawCheckpoint;let retryDelayMs=cursorStreamRetryDelayMs({attempt:streamRetries,fixedDelayMs:options?.streamStallRetryDelayMs});streamRetries+=1,retryAttempt=!0,await waitForCursorStreamRetry(retryDelayMs,options?.signal),options?.signal?.aborted&&(retryAttempt=!1,output.stopReason="aborted",output.errorMessage="Request was aborted",stream2.push({type:"error",reason:output.stopReason,error:output}),stream2.end());continue}openBlockState&&(endCurrentTextBlock(output,stream2,openBlockState),endCurrentThinkingBlock(output,stream2,openBlockState),flushOpenToolCalls(output,stream2,openBlockState));let message=error instanceof Error?error.message:JSON.stringify(error);if(conversationId!==void 0&&baseConversationId!==void 0&&usageState!==void 0&&isZeroTokenResourceExhausted(message,usageState.sawTokenDelta))if(rotationStore().shouldSkip(baseConversationId))message=CURSOR_CONVERSATION_POISONED_MESSAGE;else if(rotationStore().shouldSurfaceBeforeRotating(baseConversationId))rotationStore().markSurfaced(baseConversationId,conversationId);else{let decision=rotationStore().recordZeroTokenPoison(baseConversationId,conversationId);if(decision.kind==="rotated"){let cached=conversationStateCache.get(conversationId);cached&&conversationStateCache.set(decision.wireId,cached);let blobs=conversationBlobStores.get(conversationId);blobs&&conversationBlobStores.set(decision.wireId,blobs),registerConversationCacheKey(options?.sessionId,decision.wireId),enforceConversationCacheLimit(decision.wireId,options?.sessionId),decision.wireId!==conversationId&&forgetConversationCacheKey(conversationId),retryAttempt=!0}else message=CURSOR_CONVERSATION_POISONED_MESSAGE}retryAttempt||(output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=message,stream2.push({type:"error",reason:output.stopReason,error:output}),stream2.end())}finally{attemptPinnedStore?.releaseRequestPins(),attemptLiveKey!==void 0&&releaseLiveConversation(attemptLiveKey),attemptPinnedStore&&enforceConversationTotalBlobLimit(),heartbeatTimer&&(clearInterval(heartbeatTimer),heartbeatTimer=null),streamHealthTimer&&(clearTimeout(streamHealthTimer),streamHealthTimer=null),h2Request?.close(),h2Client?.close(),h2Request=null,h2Client=null}}while(retryAttempt)})(),stream2},streamSimple=(model,context,options)=>stream(model,context,options);function markCursorExecResolved(block){block[kCursorExecResolved]=!0}async function handleServerMessage(msg,output,stream2,state,blobStore,h2Request,execHandlers,onToolResult,usageState,requestContextTools,onConversationCheckpoint){let msgCase=msg.message.case;log("serverMessage",msgCase),msgCase==="interactionUpdate"?processInteractionUpdate(msg.message.value,output,stream2,state,usageState):msgCase==="kvServerMessage"?handleKvServerMessage(msg.message.value,blobStore,h2Request):msgCase==="execServerMessage"?await stream2.trackLocalWork(handleExecServerMessage(msg.message.value,h2Request,execHandlers,onToolResult,requestContextTools,output,stream2,state)):msgCase==="conversationCheckpointUpdate"&&(applyCheckpointTokenDetails(msg.message.value,output,usageState),onConversationCheckpoint?.(msg.message.value))}function handleKvServerMessage(kvMsg,blobStore,h2Request){let kvCase=kvMsg.message.case;if(kvCase==="getBlobArgs"){let blobId=kvMsg.message.value.blobId,blobIdKey=Buffer.from(blobId).toString("hex"),blobData=blobStore.get(blobIdKey),response=create(KvClientMessageSchema,{id:kvMsg.id,message:{case:"getBlobResult",value:create(GetBlobResultSchema,blobData?{blobData}:{})}}),kvClientMessage=create(AgentClientMessageSchema,{message:{case:"kvClientMessage",value:response}});h2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema,kvClientMessage))),log("kvClient","getBlobResult",{blobId:blobIdKey.slice(0,40)})}else if(kvCase==="setBlobArgs"){let{blobId,blobData}=kvMsg.message.value,blobIdKey=Buffer.from(blobId).toString("hex");blobStore.set(blobIdKey,blobData);let response=create(KvClientMessageSchema,{id:kvMsg.id,message:{case:"setBlobResult",value:create(SetBlobResultSchema,{})}}),kvClientMessage=create(AgentClientMessageSchema,{message:{case:"kvClientMessage",value:response}});h2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema,kvClientMessage))),log("kvClient","setBlobResult",{blobId:blobIdKey.slice(0,40)})}}function sendShellStreamEvent(h2Request,execMsg,event){sendExecClientMessage(h2Request,execMsg,"shellStream",create(ShellStreamSchema,{event}))}function sanitizeShellExecResult(execResult){let result=execResult.result;if(!result)return execResult;switch(result.case){case"success":case"failure":{let value=result.value;return{...execResult,result:{case:result.case,value:{...value,stdout:value.stdout?sanitizeSurrogates(value.stdout):value.stdout,stderr:value.stderr?sanitizeSurrogates(value.stderr):value.stderr}}}}default:return execResult}}async function handleShellStreamArgs(args,execMsg,h2Request,execHandlers,onToolResult){let normalizedWorkingDirectory=args.workingDirectory||process.cwd(),normalizedArgs={...args,workingDirectory:normalizedWorkingDirectory};sendShellStreamEvent(h2Request,execMsg,{case:"start",value:create(ShellStreamStartSchema,{})});let stdoutBuffer="",stderrBuffer="",incompleteEscapeRegex=/\x1b(|\[|\[\d*|\[\?|\[\?\d*|\]\d*;?)$/,flushStdout=()=>{if(stdoutBuffer){let safeEnd=stdoutBuffer.length,match=stdoutBuffer.match(incompleteEscapeRegex);match&&match[0].length>0&&(safeEnd=stdoutBuffer.length-match[0].length);let toSend=stdoutBuffer.slice(0,safeEnd),remaining=stdoutBuffer.slice(safeEnd);toSend&&sendShellStreamEvent(h2Request,execMsg,{case:"stdout",value:create(ShellStreamStdoutSchema,{data:sanitizeSurrogates(toSend)})}),stdoutBuffer=remaining}},flushStderr=()=>{if(stderrBuffer){let safeEnd=stderrBuffer.length,match=stderrBuffer.match(incompleteEscapeRegex);match&&match[0].length>0&&(safeEnd=stderrBuffer.length-match[0].length);let toSend=stderrBuffer.slice(0,safeEnd),remaining=stderrBuffer.slice(safeEnd);toSend&&sendShellStreamEvent(h2Request,execMsg,{case:"stderr",value:create(ShellStreamStderrSchema,{data:sanitizeSurrogates(toSend)})}),stderrBuffer=remaining}},stdoutFlushTimer=null,stderrFlushTimer=null,scheduleStdoutFlush=()=>{stdoutFlushTimer||(stdoutFlushTimer=setTimeout(()=>{stdoutFlushTimer=null,flushStdout()},100))},scheduleStderrFlush=()=>{stderrFlushTimer||(stderrFlushTimer=setTimeout(()=>{stderrFlushTimer=null,flushStderr()},100))},streamCallbacks={onStdout(data){stdoutBuffer+=data,stdoutBuffer.includes(`
|
|
32
|
+
${text}`})}});stepBlobIds.push(storeCursorBlob(blobStore,toBinary(ConversationStepSchema,step)))}}i++}let agentTurn=create(AgentConversationTurnStructureSchema,{userMessage:userMessageBlobId,steps:stepBlobIds}),turn=create(ConversationTurnStructureSchema,{turn:{case:"agentConversationTurn",value:agentTurn}});turns.push(storeCursorBlob(blobStore,toBinary(ConversationTurnStructureSchema,turn)))}return turns}function createCursorUserMessage(content,text,messageId=randomUUID2()){let images=typeof content=="string"?[]:extractImages(content);return create(UserMessageSchema,{text,messageId,...images.length>0?{selectedContext:create(SelectedContextSchema,{selectedImages:images})}:{}})}function extractImages(content){return content.filter(item=>item.type==="image").map(image=>create(SelectedImageSchema,{uuid:randomUUID2(),mimeType:image.mimeType,dataOrBlobId:{case:"data",value:Uint8Array.from(atob(image.data),c=>c.charCodeAt(0))}}))}function measureCursorModelInputSerializedBytes(messages,activeUserMessageIndex=findLastUserMessageIndex(messages)){let blobStore=new Map,total=0;for(let blobId of buildRootPromptMessagesJson(messages,[],blobStore,activeUserMessageIndex))total+=readCursorBlob(blobStore,blobId).byteLength;return total}function measureCursorHistorySerializedBytes(messages,activeUserMessageIndex=findLastUserMessageIndex(messages)){return buildCursorHistoryWireBytesForTest(messages,activeUserMessageIndex).reduce((total,bytes)=>total+bytes.byteLength,0)}function buildCursorHistoryWireBytesForTest(messages,activeUserMessageIndex=findLastUserMessageIndex(messages)){let blobStore=new Map;return buildRootPromptMessagesJson(messages,[],blobStore,activeUserMessageIndex),buildConversationTurns(messages,blobStore,activeUserMessageIndex),[...blobStore.values()]}var CURSOR_API_URL="https://api2.cursor.sh",CURSOR_CLIENT_VERSION="cli-2026.07.23-e383d2b",EXEC_HEARTBEAT_INTERVAL_MS=3e3,CURSOR_STREAM_HEALTH_FAIL_THRESHOLD_MS=3e4,CURSOR_STREAM_HEALTH_HEARTBEAT_ONLY_THRESHOLD_MS=CURSOR_STREAM_HEALTH_FAIL_THRESHOLD_MS*3,CURSOR_TURN_END_DRAIN_TIMEOUT_MS=5e3,HTTP2_FORBIDDEN_HEADERS=new Set(["connection","keep-alive","proxy-connection","transfer-encoding","upgrade","http2-settings"]),CURSOR_RESERVED_HEADERS=new Set(["content-type","connect-protocol-version","te","authorization","x-ghost-mode","x-cursor-client-version","x-cursor-client-type","x-request-id","host","content-length"]);function sanitizeCursorCallerHeaders(headers){let sanitized={};for(let[name,value]of Object.entries(headers??{})){let field=name.toLowerCase();field.startsWith(":")||HTTP2_FORBIDDEN_HEADERS.has(field)||CURSOR_RESERVED_HEADERS.has(field)||(sanitized[field]=value)}return sanitized}var NOT_IMPLEMENTED_SUFFIX="not implemented by this client",NOT_IMPLEMENTED="Not implemented by this client",conversationStateCache=new Map,conversationBlobStores=new Map,conversationCacheKeySessions=new Map,DEFAULT_CONVERSATION_CACHE_LIMIT=64,DEFAULT_CONVERSATION_BLOB_LIMIT_BYTES=256*1024*1024,DEFAULT_CONVERSATION_TOTAL_BLOB_LIMIT_BYTES=1024*1024*1024;function readPositiveIntEnv(raw,fallback){let parsed=Number(raw);return Number.isFinite(parsed)&&parsed>0?Math.floor(parsed):fallback}function conversationCacheLimit(){return readPositiveIntEnv(process.env.PI_CURSOR_CONVERSATION_CACHE_LIMIT,DEFAULT_CONVERSATION_CACHE_LIMIT)}function conversationBlobLimitBytes(){return readPositiveIntEnv(process.env.PI_CURSOR_CONVERSATION_BLOB_LIMIT_BYTES,DEFAULT_CONVERSATION_BLOB_LIMIT_BYTES)}function conversationTotalBlobLimitBytes(){return readPositiveIntEnv(process.env.PI_CURSOR_CONVERSATION_TOTAL_BLOB_LIMIT_BYTES,DEFAULT_CONVERSATION_TOTAL_BLOB_LIMIT_BYTES)}var ConversationBlobStore=class extends Map{constructor(){super(...arguments),this.blobBytes=0,this.pinnedKeys=new Set,this.pinHolders=0,this.warnedOverBudget=!1}set(key,value){let previous=super.get(key);return previous!==void 0&&(this.blobBytes-=previous.byteLength,super.delete(key)),this.blobBytes+=value.byteLength,super.set(key,value),this.pinHolders>0&&this.pinnedKeys.add(key),this.trimToBudget(),this}get(key){let value=super.get(key);if(value!==void 0)return super.delete(key),super.set(key,value),this.pinHolders>0&&this.pinnedKeys.add(key),value}delete(key){let existing=super.get(key);return this.pinnedKeys.delete(key),existing===void 0?super.delete(key):(this.blobBytes-=existing.byteLength,super.delete(key))}clear(){this.blobBytes=0,this.pinnedKeys.clear(),super.clear()}get totalBytes(){return this.blobBytes}get pinnedCount(){return this.pinnedKeys.size}beginRequestPins(){this.pinHolders+=1}shedUnpinnedBytes(keepBytes){let released=0;for(let[key,value]of this){if(this.blobBytes<=keepBytes)break;this.pinnedKeys.has(key)||(this.blobBytes-=value.byteLength,released+=value.byteLength,super.delete(key))}return released}releaseRequestPins(){this.pinHolders!==0&&(this.pinHolders-=1,!(this.pinHolders>0)&&(this.pinnedKeys.clear(),this.warnedOverBudget=!1,this.trimToBudget()))}trimToBudget(){let limit=conversationBlobLimitBytes();if(!(this.blobBytes<=limit)){for(let[key,value]of this){if(this.blobBytes<=limit)break;this.pinnedKeys.has(key)||(this.blobBytes-=value.byteLength,super.delete(key))}this.blobBytes<=limit||this.warnedOverBudget||(this.warnedOverBudget=!0,console.warn(`[cursor-agent] conversation blob store over budget: ${this.blobBytes} bytes pinned by the in-flight request exceed the ${limit} byte cap (${this.pinnedKeys.size} pinned blobs); the cap applies again when the stream settles`))}}};function registerConversationCacheKey(sessionId,conversationId){sessionId&&conversationCacheKeySessions.set(conversationId,sessionId)}function forgetConversationCacheKey(conversationId){conversationStateCache.delete(conversationId),conversationBlobStores.delete(conversationId),conversationCacheKeySessions.delete(conversationId)}var liveConversationKeys=new Map;function retainLiveConversation(conversationId){liveConversationKeys.set(conversationId,(liveConversationKeys.get(conversationId)??0)+1)}function releaseLiveConversation(conversationId){let holders=liveConversationKeys.get(conversationId);holders!==void 0&&(holders<=1?liveConversationKeys.delete(conversationId):liveConversationKeys.set(conversationId,holders-1))}function enforceConversationCacheLimit(newestKey,sessionId){let limit=conversationCacheLimit(),owner=sessionId??conversationCacheKeySessions.get(newestKey),ownedKeys=[...conversationBlobStores.keys()].filter(key=>conversationCacheKeySessions.get(key)===owner),owned=ownedKeys.length;for(let key of ownedKeys){if(owned<=limit)return;key!==newestKey&&(liveConversationKeys.has(key)||(forgetConversationCacheKey(key),owned-=1))}}function enforceConversationTotalBlobLimit(){let limit=conversationTotalBlobLimitBytes(),total=0;for(let store2 of conversationBlobStores.values())total+=store2.totalBytes;if(total<=limit)return;let cold=[],live=[];for(let entry of conversationBlobStores)(liveConversationKeys.has(entry[0])?live:cold).push(entry);for(let[key,store2]of[...cold,...live]){if(total<=limit)break;total-=store2.shedUnpinnedBytes(Math.max(0,store2.totalBytes-(total-limit))),store2.size===0&&!liveConversationKeys.has(key)&&forgetConversationCacheKey(key)}total<=limit||console.warn(`[cursor-agent] cursor conversation blobs total ${total} bytes over the ${limit} byte process ceiling; the remainder is pinned by in-flight requests and is released when their streams settle`)}function getOrCreateConversationBlobStore(conversationId,sessionId){let existing=conversationBlobStores.get(conversationId);if(existing)return existing;let store2=new ConversationBlobStore;return conversationBlobStores.set(conversationId,store2),enforceConversationCacheLimit(conversationId,sessionId),store2}function releaseConversationCacheForSession(sessionId){if(sessionId===void 0){conversationStateCache.clear(),conversationBlobStores.clear(),conversationCacheKeySessions.clear(),liveConversationKeys.clear();return}for(let[key,owner]of conversationCacheKeySessions)owner===sessionId&&(conversationStateCache.delete(key),conversationBlobStores.delete(key),conversationCacheKeySessions.delete(key))}registerSessionResourceCleanup(sessionId=>{releaseConversationCacheForSession(sessionId)});function getCursorConversationCacheStats(){let blobBytes=0;for(let store2 of conversationBlobStores.values())blobBytes+=store2.totalBytes;return{conversations:conversationBlobStores.size,states:conversationStateCache.size,blobBytes,keys:[...conversationBlobStores.keys()]}}var conversationRotationStore=createConversationRotationStore({persistPath:resolveConversationRotationPersistPath()}),conversationRotationPersistPath=resolveConversationRotationPersistPath();function rotationStore(){let persistPath=resolveConversationRotationPersistPath();return persistPath!==conversationRotationPersistPath&&(conversationRotationPersistPath=persistPath,conversationRotationStore=createConversationRotationStore({persistPath})),conversationRotationStore}var CONNECT_END_STREAM_FLAG=2;function log(type,subtype,data){if(!process.env.DEBUG_CURSOR)return;let verbose=process.env.DEBUG_CURSOR==="2"||process.env.DEBUG_CURSOR==="verbose",dataStr="";if(verbose&&data!==void 0)try{dataStr=` ${JSON.stringify(data,(_key,value)=>value instanceof Uint8Array?`bytes(${value.length})`:typeof value=="bigint"?value.toString():value)?.slice(0,500)}`}catch{dataStr=" [unserializable]"}console.error(`[CURSOR] ${type}${subtype?`: ${subtype}`:""}${dataStr}`)}function frameConnectMessage(data,flags=0){let frame=Buffer.alloc(5+data.length);return frame[0]=flags,frame.writeUInt32BE(data.length,1),frame.set(data,5),frame}function parseConnectEndStream(data){try{let error=JSON.parse(new TextDecoder().decode(data))?.error;if(error){let code=typeof error.code=="string"?error.code:"unknown",message=typeof error.message=="string"?error.message:"Unknown error";return new Error(`Connect error ${code}: ${message}`)}return null}catch{return new Error("Failed to parse Connect end stream")}}function mapH2TransportError(error,baseUrl){let code=error?.code,message=error instanceof Error?error.message:String(error);return code==="ERR_HTTP2_ERROR"&&/h2 is not supported/i.test(message)?new Error(`Cursor run transport could not negotiate HTTP/2 with ${baseUrl}: "h2 is not supported". This host serves the run RPC over HTTP/2 only, and the TLS handshake did not negotiate h2 via ALPN: typically an ALPN-stripping TLS-intercepting proxy. Front the provider with a local HTTP/2 bridge and point the model's baseUrl at it.`):error}var stream=(model,context,options)=>{let stream2=new AssistantMessageEventStream({captureBlocks:!0}),requestView=toCursorRequestView(context);return(async()=>{let output={role:"assistant",content:[],api:"cursor-agent",provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()},inFlightDispatches=new Set,abortSettled,drainInFlightDispatches=async()=>{let signal=options?.signal;for(;inFlightDispatches.size>0;){if(signal?.aborted)return;let settled=Promise.all([...inFlightDispatches]);if(!signal){await settled;continue}abortSettled??=new Promise(resolve=>signal.addEventListener("abort",()=>resolve(),{once:!0})),await Promise.race([settled,abortSettled])}},h2Client=null,h2Request=null,heartbeatTimer=null,streamHealthTimer=null,h2Settled=!1,sawTurnEnded=!1,turnEndDrainTimedOut=!1,endStreamError=null,openBlockState,resolveH2=()=>{},rejectH2=()=>{},settleH2=error=>{if(!h2Settled){if(h2Settled=!0,error!==void 0){rejectH2(error);return}if(endStreamError){rejectH2(endStreamError);return}if(!sawTurnEnded){rejectH2(new Error("Cursor stream ended before turnEnded"));return}resolveH2()}},baseConversationId,conversationId,usageState,retryAttempt=!1,attempt=0,streamRetries=0,forceResumeAction=!1,pinnedRequestedModel,pinnedModelDetails;do{retryAttempt=!1,attempt+=1,h2Settled=!1,sawTurnEnded=!1,turnEndDrainTimedOut=!1,endStreamError=null,openBlockState=void 0;let h2Completion=new Promise((resolve,reject)=>{resolveH2=resolve,rejectH2=reject}),attemptSawCheckpoint=!1,attemptLiveKey,attemptPinnedStore;try{let apiKey=options?.apiKey;if(!apiKey)throw new Error("Cursor access token is required; run /login cursor");baseConversationId=options?.conversationId??options?.sessionId??randomUUID3(),conversationId=rotationStore().getWireId(baseConversationId),registerConversationCacheKey(options?.sessionId,conversationId),attemptLiveKey=conversationId,retainLiveConversation(conversationId);let blobStore=getOrCreateConversationBlobStore(conversationId,options?.sessionId);attemptPinnedStore=blobStore,blobStore.beginRequestPins();let cachedState=conversationStateCache.get(conversationId),{requestBytes,conversationState,requestedModel,modelDetails}=await buildGrpcRequest(model,requestView,options,{conversationId,blobStore,conversationState:cachedState,forceResumeAction,pinnedRequestedModel,pinnedModelDetails});pinnedRequestedModel??=requestedModel,pinnedModelDetails??=modelDetails,conversationStateCache.set(conversationId,conversationState),enforceConversationTotalBlobLimit();let requestContextTools=buildMcpToolDefinitions(requestView.tools),baseUrl=model.baseUrl||CURSOR_API_URL,requestHeaders={...sanitizeCursorCallerHeaders(providerHeadersToRecord(options?.headers)),":method":"POST",":path":"/agent.v1.AgentService/Run","content-type":"application/connect+proto","connect-protocol-version":"1",te:"trailers",authorization:`Bearer ${apiKey}`,"x-ghost-mode":"true","x-cursor-client-version":CURSOR_CLIENT_VERSION,"x-cursor-client-type":"cli","x-request-id":randomUUID3()},attemptH2Client=http2.connect(baseUrl);h2Client=attemptH2Client,attemptH2Client.on("error",error=>{if(h2Client!==attemptH2Client)return;let mapped=mapH2TransportError(error,baseUrl);settleH2(sawTurnEnded?mapped:new CursorRetryableStreamError(mapped instanceof Error?mapped.message:String(mapped),"transport",{cause:mapped}))}),attemptH2Client.on("goaway",()=>{h2Client===attemptH2Client&&!h2Settled&&!sawTurnEnded&&(settleH2(new CursorRetryableStreamError("Cursor HTTP/2 session received GOAWAY","transport")),h2Request?.close())}),attemptH2Client.on("close",()=>{h2Client===attemptH2Client&&!h2Settled&&!sawTurnEnded&&!endStreamError&&settleH2(new CursorRetryableStreamError("Cursor HTTP/2 session closed","transport"))}),h2Request=attemptH2Client.request(requestHeaders),attempt===1&&stream2.push({type:"start",partial:output});let pendingBuffer=Buffer.alloc(0),currentTextBlock=null,currentThinkingBlock=null,currentToolCall=null,resolvedMcpToolCallIds=new Set;usageState={sawTokenDelta:!1,sawTurnEndedUsage:!1};let state={get currentTextBlock(){return currentTextBlock},get currentThinkingBlock(){return currentThinkingBlock},get currentToolCall(){return currentToolCall},openToolCalls:new Map,resolvedMcpToolCallIds,setTextBlock:b=>{currentTextBlock=b},setThinkingBlock:b=>{currentThinkingBlock=b},setToolCall:t=>{currentToolCall=t},onToolResult:options?.onToolResult??options?.execHandlers?.onToolResult};openBlockState=state;let onConversationCheckpoint=checkpoint=>{attemptSawCheckpoint=!0,recordCursorContextLimit2(model.id,checkpoint.tokenDetails?.maxTokens),conversationStateCache.set(conversationId,checkpoint)},healthFailThresholdMs=options?.streamHealthFailThresholdMs??CURSOR_STREAM_HEALTH_FAIL_THRESHOLD_MS,lastInboundFrameAt=Date.now(),turnEndCompletionStarted=!1,armStreamHealthTimer=()=>{if(streamHealthTimer&&clearTimeout(streamHealthTimer),sawTurnEnded||h2Settled)return;let now=Date.now(),deadline=lastInboundFrameAt+healthFailThresholdMs;streamHealthTimer=setTimeout(()=>{if(streamHealthTimer=null,sawTurnEnded||h2Settled)return;if(Date.now()-lastInboundFrameAt<healthFailThresholdMs){armStreamHealthTimer();return}settleH2(new CursorRetryableStreamError("Cursor stream ended before turnEnded: inbound stream stalled","stall")),h2Request?.close()},Math.max(0,deadline-now))},completeAfterTurnEnded=async()=>{let drainTimeoutMs=options?.turnEndDrainTimeoutMs??CURSOR_TURN_END_DRAIN_TIMEOUT_MS,timeout,drained=await Promise.race([drainInFlightDispatches().then(()=>!0),new Promise(resolve=>{timeout=setTimeout(()=>resolve(!1),drainTimeoutMs)})]);if(timeout&&clearTimeout(timeout),!h2Settled){if(!drained){turnEndDrainTimedOut=!0,settleH2(new Error(`Cursor exec dispatches did not settle within ${drainTimeoutMs}ms after turnEnded`)),h2Request?.close();return}h2Request?.close(),settleH2()}};armStreamHealthTimer(),h2Request.on("data",chunk=>{for(pendingBuffer=pendingBuffer.length===0?chunk:Buffer.concat([pendingBuffer,chunk]);pendingBuffer.length>=5;){let flags=pendingBuffer[0],msgLen=pendingBuffer.readUInt32BE(1);if(pendingBuffer.length<5+msgLen)break;let messageBytes=pendingBuffer.subarray(5,5+msgLen);if(pendingBuffer=pendingBuffer.subarray(5+msgLen),flags&CONNECT_END_STREAM_FLAG){let endError=parseConnectEndStream(messageBytes);endError&&(endStreamError=endError,h2Request?.close());continue}try{let serverMessage=fromBinary(AgentServerMessageSchema,messageBytes),isTurnEnded=(serverMessage.message.case==="interactionUpdate"?serverMessage.message.value.message?.case:void 0)==="turnEnded";lastInboundFrameAt=Date.now(),armStreamHealthTimer();let dispatch=handleServerMessage(serverMessage,output,stream2,state,blobStore,h2Request,options?.execHandlers,state.onToolResult,usageState,requestContextTools,onConversationCheckpoint).catch(error=>{log("error","handleServerMessage",{error:String(error)})});inFlightDispatches.add(dispatch),dispatch.finally(()=>inFlightDispatches.delete(dispatch)),isTurnEnded&&!turnEndCompletionStarted&&(sawTurnEnded=!0,turnEndCompletionStarted=!0,completeAfterTurnEnded().catch(error=>settleH2(error)))}catch(e){log("error","parseServerMessage",{error:String(e)})}}});let sendHeartbeat=()=>{if(!h2Request||h2Request.closed)return;let heartbeatMessage=create(AgentClientMessageSchema,{message:{case:"clientHeartbeat",value:create(ClientHeartbeatSchema,{})}}),heartbeatBytes=toBinary(AgentClientMessageSchema,heartbeatMessage);h2Request.write(frameConnectMessage(heartbeatBytes))};h2Request.on("trailers",trailers=>{let status=trailers["grpc-status"],msg=trailers["grpc-message"];status&&status!=="0"&&!endStreamError&&(endStreamError=new Error(`gRPC error ${status}: ${decodeURIComponent(String(msg||""))}`))}),h2Request.on("end",()=>{if(!sawTurnEnded&&!endStreamError){settleH2(new CursorRetryableStreamError("Cursor stream ended before turnEnded","clean-end"));return}settleH2()}),h2Request.on("error",error=>{let mapped=mapH2TransportError(error,baseUrl);settleH2(sawTurnEnded?mapped:new CursorRetryableStreamError(mapped instanceof Error?mapped.message:String(mapped),"transport",{cause:mapped}))}),options?.signal&&options.signal.addEventListener("abort",()=>{h2Request?.close(),settleH2(new Error("Request was aborted"))}),h2Request.write(frameConnectMessage(requestBytes)),heartbeatTimer=setInterval(sendHeartbeat,5e3),await h2Completion,await drainInFlightDispatches(),endCurrentTextBlock(output,stream2,state),endCurrentThinkingBlock(output,stream2,state),flushOpenToolCalls(output,stream2,state),calculateCost(model,output.usage),stream2.push({type:"done",reason:output.stopReason,message:output}),stream2.end()}catch(error){if(turnEndDrainTimedOut||await drainInFlightDispatches(),shouldRetryCursorStream({error,retries:streamRetries,maxRetries:options?.streamStallMaxRetries??10,sawTurnEnded,aborted:options?.signal?.aborted===!0})){openBlockState&&(endCurrentTextBlock(output,stream2,openBlockState),endCurrentThinkingBlock(output,stream2,openBlockState),flushOpenToolCalls(output,stream2,openBlockState)),forceResumeAction||=attemptSawCheckpoint;let retryDelayMs=cursorStreamRetryDelayMs({attempt:streamRetries,fixedDelayMs:options?.streamStallRetryDelayMs});streamRetries+=1,retryAttempt=!0,await waitForCursorStreamRetry(retryDelayMs,options?.signal),options?.signal?.aborted&&(retryAttempt=!1,output.stopReason="aborted",output.errorMessage="Request was aborted",stream2.push({type:"error",reason:output.stopReason,error:output}),stream2.end());continue}openBlockState&&(endCurrentTextBlock(output,stream2,openBlockState),endCurrentThinkingBlock(output,stream2,openBlockState),flushOpenToolCalls(output,stream2,openBlockState));let message=error instanceof Error?error.message:JSON.stringify(error);if(conversationId!==void 0&&baseConversationId!==void 0&&usageState!==void 0&&isZeroTokenResourceExhausted(message,usageState.sawTokenDelta))if(rotationStore().shouldSkip(baseConversationId))message=CURSOR_CONVERSATION_POISONED_MESSAGE;else if(rotationStore().shouldSurfaceBeforeRotating(baseConversationId))rotationStore().markSurfaced(baseConversationId,conversationId);else{let decision=rotationStore().recordZeroTokenPoison(baseConversationId,conversationId);if(decision.kind==="rotated"){let cached=conversationStateCache.get(conversationId);cached&&conversationStateCache.set(decision.wireId,cached);let blobs=conversationBlobStores.get(conversationId);blobs&&conversationBlobStores.set(decision.wireId,blobs),registerConversationCacheKey(options?.sessionId,decision.wireId),enforceConversationCacheLimit(decision.wireId,options?.sessionId),decision.wireId!==conversationId&&forgetConversationCacheKey(conversationId),retryAttempt=!0}else message=CURSOR_CONVERSATION_POISONED_MESSAGE}retryAttempt||(output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=message,stream2.push({type:"error",reason:output.stopReason,error:output}),stream2.end())}finally{attemptPinnedStore?.releaseRequestPins(),attemptLiveKey!==void 0&&releaseLiveConversation(attemptLiveKey),attemptPinnedStore&&enforceConversationTotalBlobLimit(),heartbeatTimer&&(clearInterval(heartbeatTimer),heartbeatTimer=null),streamHealthTimer&&(clearTimeout(streamHealthTimer),streamHealthTimer=null),h2Request?.close(),h2Client?.close(),h2Request=null,h2Client=null}}while(retryAttempt)})(),stream2},streamSimple=(model,context,options)=>stream(model,context,options);function markCursorExecResolved(block){block[kCursorExecResolved]=!0}async function handleServerMessage(msg,output,stream2,state,blobStore,h2Request,execHandlers,onToolResult,usageState,requestContextTools,onConversationCheckpoint){let msgCase=msg.message.case;log("serverMessage",msgCase),msgCase==="interactionUpdate"?processInteractionUpdate(msg.message.value,output,stream2,state,usageState):msgCase==="kvServerMessage"?handleKvServerMessage(msg.message.value,blobStore,h2Request):msgCase==="execServerMessage"?await stream2.trackLocalWork(handleExecServerMessage(msg.message.value,h2Request,execHandlers,onToolResult,requestContextTools,output,stream2,state)):msgCase==="conversationCheckpointUpdate"&&(applyCheckpointTokenDetails(msg.message.value,output,usageState),onConversationCheckpoint?.(msg.message.value))}function handleKvServerMessage(kvMsg,blobStore,h2Request){let kvCase=kvMsg.message.case;if(kvCase==="getBlobArgs"){let blobId=kvMsg.message.value.blobId,blobIdKey=Buffer.from(blobId).toString("hex"),blobData=blobStore.get(blobIdKey),response=create(KvClientMessageSchema,{id:kvMsg.id,message:{case:"getBlobResult",value:create(GetBlobResultSchema,blobData?{blobData}:{})}}),kvClientMessage=create(AgentClientMessageSchema,{message:{case:"kvClientMessage",value:response}});h2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema,kvClientMessage))),log("kvClient","getBlobResult",{blobId:blobIdKey.slice(0,40)})}else if(kvCase==="setBlobArgs"){let{blobId,blobData}=kvMsg.message.value,blobIdKey=Buffer.from(blobId).toString("hex");blobStore.set(blobIdKey,blobData);let response=create(KvClientMessageSchema,{id:kvMsg.id,message:{case:"setBlobResult",value:create(SetBlobResultSchema,{})}}),kvClientMessage=create(AgentClientMessageSchema,{message:{case:"kvClientMessage",value:response}});h2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema,kvClientMessage))),log("kvClient","setBlobResult",{blobId:blobIdKey.slice(0,40)})}}function sendShellStreamEvent(h2Request,execMsg,event){sendExecClientMessage(h2Request,execMsg,"shellStream",create(ShellStreamSchema,{event}))}function sanitizeShellExecResult(execResult){let result=execResult.result;if(!result)return execResult;switch(result.case){case"success":case"failure":{let value=result.value;return{...execResult,result:{case:result.case,value:{...value,stdout:value.stdout?sanitizeSurrogates(value.stdout):value.stdout,stderr:value.stderr?sanitizeSurrogates(value.stderr):value.stderr}}}}default:return execResult}}async function handleShellStreamArgs(args,execMsg,h2Request,execHandlers,onToolResult){let normalizedWorkingDirectory=args.workingDirectory||process.cwd(),normalizedArgs={...args,workingDirectory:normalizedWorkingDirectory};sendShellStreamEvent(h2Request,execMsg,{case:"start",value:create(ShellStreamStartSchema,{})});let stdoutBuffer="",stderrBuffer="",incompleteEscapeRegex=/\x1b(|\[|\[\d*|\[\?|\[\?\d*|\]\d*;?)$/,flushStdout=()=>{if(stdoutBuffer){let safeEnd=stdoutBuffer.length,match=stdoutBuffer.match(incompleteEscapeRegex);match&&match[0].length>0&&(safeEnd=stdoutBuffer.length-match[0].length);let toSend=stdoutBuffer.slice(0,safeEnd),remaining=stdoutBuffer.slice(safeEnd);toSend&&sendShellStreamEvent(h2Request,execMsg,{case:"stdout",value:create(ShellStreamStdoutSchema,{data:sanitizeSurrogates(toSend)})}),stdoutBuffer=remaining}},flushStderr=()=>{if(stderrBuffer){let safeEnd=stderrBuffer.length,match=stderrBuffer.match(incompleteEscapeRegex);match&&match[0].length>0&&(safeEnd=stderrBuffer.length-match[0].length);let toSend=stderrBuffer.slice(0,safeEnd),remaining=stderrBuffer.slice(safeEnd);toSend&&sendShellStreamEvent(h2Request,execMsg,{case:"stderr",value:create(ShellStreamStderrSchema,{data:sanitizeSurrogates(toSend)})}),stderrBuffer=remaining}},stdoutFlushTimer=null,stderrFlushTimer=null,scheduleStdoutFlush=()=>{stdoutFlushTimer||(stdoutFlushTimer=setTimeout(()=>{stdoutFlushTimer=null,flushStdout()},100))},scheduleStderrFlush=()=>{stderrFlushTimer||(stderrFlushTimer=setTimeout(()=>{stderrFlushTimer=null,flushStderr()},100))},streamCallbacks={onStdout(data){stdoutBuffer+=data,stdoutBuffer.includes(`
|
|
33
33
|
`)||stdoutBuffer.length>4096?(stdoutFlushTimer&&(clearTimeout(stdoutFlushTimer),stdoutFlushTimer=null),flushStdout()):scheduleStdoutFlush()},onStderr(data){stderrBuffer+=data,stderrBuffer.includes(`
|
|
34
34
|
`)||stderrBuffer.length>4096?(stderrFlushTimer&&(clearTimeout(stderrFlushTimer),stderrFlushTimer=null),flushStderr()):scheduleStderrFlush()}},streamHandler=execHandlers?.shellStream?.bind(execHandlers),batchHandler=execHandlers?.shell?.bind(execHandlers),handler=streamHandler?shellArgs=>streamHandler(shellArgs,streamCallbacks):batchHandler,{execResult}=await resolveExecHandler(normalizedArgs,handler,onToolResult,toolResult=>buildShellResultFromToolResult(normalizedArgs,toolResult),reason=>buildShellRejectedResult(normalizedArgs.command,normalizedArgs.workingDirectory,reason),error=>buildShellFailureResult(normalizedArgs.command,normalizedArgs.workingDirectory,error),{toolCallId:args.toolCallId,toolName:"bash"}),sendBufferedOutput=!streamHandler,sanitizedExecResult=sanitizeShellExecResult(execResult);stdoutFlushTimer&&clearTimeout(stdoutFlushTimer),stderrFlushTimer&&clearTimeout(stderrFlushTimer),flushStdout(),flushStderr(),sendShellStreamExitFromResult(h2Request,execMsg,sanitizedExecResult,sendBufferedOutput),sendExecClientMessage(h2Request,execMsg,"shellResult",sanitizedExecResult)}function sendShellStreamExitFromResult(h2Request,execMsg,execResult,sendBufferedOutput){let result=execResult.result;switch(result.case){case"success":{let value=result.value;sendBufferedOutput&&(value.stdout&&sendShellStreamEvent(h2Request,execMsg,{case:"stdout",value:create(ShellStreamStdoutSchema,{data:sanitizeSurrogates(value.stdout)})}),value.stderr&&sendShellStreamEvent(h2Request,execMsg,{case:"stderr",value:create(ShellStreamStderrSchema,{data:sanitizeSurrogates(value.stderr)})})),sendShellStreamEvent(h2Request,execMsg,{case:"exit",value:create(ShellStreamExitSchema,{code:value.exitCode,cwd:value.workingDirectory,aborted:!1})});return}case"failure":{let value=result.value;sendBufferedOutput&&(value.stdout&&sendShellStreamEvent(h2Request,execMsg,{case:"stdout",value:create(ShellStreamStdoutSchema,{data:sanitizeSurrogates(value.stdout)})}),value.stderr&&sendShellStreamEvent(h2Request,execMsg,{case:"stderr",value:create(ShellStreamStderrSchema,{data:sanitizeSurrogates(value.stderr)})})),sendShellStreamEvent(h2Request,execMsg,{case:"exit",value:create(ShellStreamExitSchema,{code:value.exitCode,cwd:value.workingDirectory,aborted:value.aborted,abortReason:value.abortReason})});return}case"rejected":{sendShellStreamEvent(h2Request,execMsg,{case:"rejected",value:result.value}),sendShellStreamEvent(h2Request,execMsg,{case:"exit",value:create(ShellStreamExitSchema,{code:1,cwd:result.value.workingDirectory,aborted:!1})});return}case"timeout":{let value=result.value;sendShellStreamEvent(h2Request,execMsg,{case:"stderr",value:create(ShellStreamStderrSchema,{data:`Command timed out after ${value.timeoutMs}ms`})}),sendShellStreamEvent(h2Request,execMsg,{case:"exit",value:create(ShellStreamExitSchema,{code:1,cwd:value.workingDirectory,aborted:!0})});return}case"permissionDenied":{sendShellStreamEvent(h2Request,execMsg,{case:"permissionDenied",value:result.value}),sendShellStreamEvent(h2Request,execMsg,{case:"exit",value:create(ShellStreamExitSchema,{code:1,cwd:result.value.workingDirectory,aborted:!1})});return}default:return}}async function handleExecServerMessage(execMsg,h2Request,execHandlers,onToolResult,requestContextTools,output,stream2,state){let execCase=execMsg.message.case;if(log("exec","dispatch",{execCase,execId:execMsg.execId,hasHandlers:!!execHandlers}),!execCase){log("warn","unknownExecVariant",{id:execMsg.id,execId:execMsg.execId}),sendExecClientThrow(h2Request,execMsg,"Unknown exec message variant","unknown_exec_variant"),sendExecClientStreamClose(h2Request,execMsg);return}let stopExecHeartbeat=armCursorExecHeartbeat(h2Request,execMsg);try{await dispatchExecServerMessage({execMsg,h2Request,execHandlers,onToolResult,requestContextTools,output,stream:stream2,state})}catch(error){log("error","execDispatch",{error:error instanceof Error?error.message:String(error),id:execMsg.id,execId:execMsg.execId}),sendExecClientThrow(h2Request,execMsg,"Local exec dispatch failed","exec_dispatch_failed")}finally{stopExecHeartbeat(),sendExecClientStreamClose(h2Request,execMsg)}}async function dispatchExecServerMessage(context){let{execMsg,h2Request,execHandlers,onToolResult,requestContextTools,output,stream:stream2,state}=context,execCase=execMsg.message.case;if(!execCase)throw new Error("Expected a recognized exec message");if(execCase==="requestContextArgs"){let requestContext=create(RequestContextSchema,{rules:[],repositoryInfo:[],tools:requestContextTools,gitRepos:[],projectLayouts:[],mcpInstructions:[],fileContents:{},customSubagents:[]}),requestContextResult=create(RequestContextResultSchema,{result:{case:"success",value:create(RequestContextSuccessSchema,{requestContext})}});sendExecClientMessage(h2Request,execMsg,"requestContextResult",requestContextResult);return}switch(execCase){case"readArgs":{let args=execMsg.message.value;ensureUniqueCursorExecToolCallId(output,args),synthesizeCursorExecToolCall(output,stream2,state,args.toolCallId,"read",{path:args.path,offset:args.offset,limit:args.limit});let{execResult}=await resolveExecHandler(args,execHandlers?.read?.bind(execHandlers),onToolResult,toolResult=>buildReadResultFromToolResult(args.path,toolResult,args.offset!==void 0||args.limit!==void 0),reason=>buildReadRejectedResult(args.path,reason),error=>buildReadErrorResult(args.path,error),{toolCallId:args.toolCallId,toolName:"read"});sendExecClientMessage(h2Request,execMsg,"readResult",execResult);return}case"lsArgs":{let args=execMsg.message.value;ensureUniqueCursorExecToolCallId(output,args),synthesizeCursorExecToolCall(output,stream2,state,args.toolCallId,"ls",{path:piLsPath(args.path)});let{execResult}=await resolveExecHandler(args,execHandlers?.ls?.bind(execHandlers),onToolResult,toolResult=>buildLsResultFromToolResult(args.path,toolResult),reason=>buildLsRejectedResult(args.path,reason),error=>buildLsErrorResult(args.path,error),{toolCallId:args.toolCallId,toolName:"ls"});sendExecClientMessage(h2Request,execMsg,"lsResult",execResult);return}case"grepArgs":{let args=execMsg.message.value;ensureUniqueCursorExecToolCallId(output,args);let emptyPatternError=emptyGrepPatternRejection(args.pattern,args.glob);if(emptyPatternError!==null){sendExecClientMessage(h2Request,execMsg,"grepResult",buildGrepErrorResult(emptyPatternError));return}synthesizeCursorExecToolCall(output,stream2,state,args.toolCallId,"grep",{pattern:args.pattern,path:args.path||void 0,glob:args.glob||void 0,ignoreCase:args.caseInsensitive===!0?!0:void 0});let{execResult}=await resolveExecHandler(args,execHandlers?.grep?.bind(execHandlers),onToolResult,toolResult=>buildGrepResultFromToolResult(args,toolResult),reason=>buildGrepErrorResult(reason),error=>buildGrepErrorResult(error),{toolCallId:args.toolCallId,toolName:"grep"});sendExecClientMessage(h2Request,execMsg,"grepResult",execResult);return}case"writeArgs":{let args=execMsg.message.value;ensureUniqueCursorExecToolCallId(output,args);let content=args.fileText??new TextDecoder().decode(args.fileBytes??new Uint8Array);synthesizeCursorExecToolCall(output,stream2,state,args.toolCallId,"write",{path:args.path,content});let{execResult}=await resolveExecHandler(args,execHandlers?.write?.bind(execHandlers),onToolResult,toolResult=>buildWriteResultFromToolResult({path:args.path,fileText:args.fileText,fileBytes:args.fileBytes,returnFileContentAfterWrite:args.returnFileContentAfterWrite},toolResult),reason=>buildWriteRejectedResult(args.path,reason),error=>buildWriteErrorResult(args.path,error),{toolCallId:args.toolCallId,toolName:"write"});sendExecClientMessage(h2Request,execMsg,"writeResult",execResult);return}case"deleteArgs":{let args=execMsg.message.value;ensureUniqueCursorExecToolCallId(output,args),synthesizeCursorExecToolCall(output,stream2,state,args.toolCallId,"delete",{path:args.path});let{execResult}=await resolveExecHandler(args,execHandlers?.delete?.bind(execHandlers),onToolResult,toolResult=>buildDeleteResultFromToolResult(args.path,toolResult),reason=>buildDeleteRejectedResult(args.path,reason),error=>buildDeleteErrorResult(args.path,error),{toolCallId:args.toolCallId,toolName:"delete"});sendExecClientMessage(h2Request,execMsg,"deleteResult",execResult);return}case"shellArgs":{let args=execMsg.message.value;ensureUniqueCursorExecToolCallId(output,args);let normalizedArgs={...args,workingDirectory:args.workingDirectory||process.cwd()},shellTimeout=args.timeout&&args.timeout>0?args.timeout:void 0;synthesizeCursorExecToolCall(output,stream2,state,args.toolCallId,"bash",{command:composeShellCommand(args.command,args.workingDirectory||void 0),timeout:shellTimeout});let{execResult}=await resolveExecHandler(normalizedArgs,execHandlers?.shell?.bind(execHandlers),onToolResult,toolResult=>buildShellResultFromToolResult(normalizedArgs,toolResult),reason=>buildShellRejectedResult(normalizedArgs.command,normalizedArgs.workingDirectory,reason),error=>buildShellFailureResult(normalizedArgs.command,normalizedArgs.workingDirectory,error),{toolCallId:args.toolCallId,toolName:"bash"});sendExecClientMessage(h2Request,execMsg,"shellResult",sanitizeShellExecResult(execResult));return}case"shellStreamArgs":{let args=execMsg.message.value;ensureUniqueCursorExecToolCallId(output,args);let shellStreamTimeout=args.timeout&&args.timeout>0?args.timeout:void 0;synthesizeCursorExecToolCall(output,stream2,state,args.toolCallId,"bash",{command:composeShellCommand(args.command,args.workingDirectory||void 0),timeout:shellStreamTimeout}),await handleShellStreamArgs(args,execMsg,h2Request,execHandlers,onToolResult);return}case"backgroundShellSpawnArgs":{let args=execMsg.message.value,execResult=create(BackgroundShellSpawnResultSchema,{result:{case:"rejected",value:create(ShellRejectedSchema,{command:args.command,workingDirectory:args.workingDirectory,reason:"Not implemented",isReadonly:!1})}});sendExecClientMessage(h2Request,execMsg,"backgroundShellSpawnResult",execResult);return}case"writeShellStdinArgs":{let execResult=create(WriteShellStdinResultSchema,{result:{case:"error",value:create(WriteShellStdinErrorSchema,{error:"Not implemented"})}});sendExecClientMessage(h2Request,execMsg,"writeShellStdinResult",execResult);return}case"fetchArgs":{let args=execMsg.message.value,execResult=create(FetchResultSchema,{result:{case:"error",value:create(FetchErrorSchema,{url:args.url,error:"Not implemented"})}});sendExecClientMessage(h2Request,execMsg,"fetchResult",execResult);return}case"diagnosticsArgs":{let args=execMsg.message.value;args.toolCallId||(args.toolCallId=randomUUID3());let{execResult}=await resolveExecHandler(args,execHandlers?.diagnostics?.bind(execHandlers),onToolResult,toolResult=>buildDiagnosticsResultFromToolResult(args.path,toolResult),reason=>buildDiagnosticsRejectedResult(args.path,reason),error=>buildDiagnosticsErrorResult(args.path,error),null);sendExecClientMessage(h2Request,execMsg,"diagnosticsResult",execResult);return}case"mcpArgs":{let args=execMsg.message.value,mcpCall=decodeMcpCall(args);if(mcpCall.approvalOnly){let approved=await execHandlers?.mcpApprovalPreflight?.(mcpCall)===!0;sendExecClientMessage(h2Request,execMsg,"mcpResult",create(McpResultSchema,{result:approved?{case:"approved",value:create(McpApprovedSchema,{})}:{case:"rejected",value:create(McpRejectedSchema,{reason:`Tool "${mcpCall.toolName||mcpCall.name}" is not approved to run without asking.`})}}));return}if(execHandlers?.mcp){let existingBlock=output.content.find(block=>block.type==="toolCall"&&block.id===mcpCall.toolCallId);existingBlock?markCursorExecResolved(existingBlock):(synthesizeCursorExecToolCall(output,stream2,state,mcpCall.toolCallId,mcpCall.toolName||mcpCall.name,mcpCall.args),state.resolvedMcpToolCallIds.add(mcpCall.toolCallId))}let{execResult}=await resolveExecHandler(mcpCall,execHandlers?.mcp?.bind(execHandlers),onToolResult,toolResult=>buildMcpResultFromToolResult(mcpCall,toolResult),_reason=>buildMcpToolNotFoundResult(mcpCall),error=>buildMcpErrorResult(error),execHandlers?.mcp?{toolCallId:mcpCall.toolCallId,toolName:mcpCall.toolName}:null);sendExecClientMessage(h2Request,execMsg,"mcpResult",execResult);return}case"listMcpResourcesExecArgs":{let execResult=create(ListMcpResourcesExecResultSchema,{result:{case:"success",value:create(ListMcpResourcesSuccessSchema,{resources:[]})}});sendExecClientMessage(h2Request,execMsg,"listMcpResourcesExecResult",execResult);return}case"readMcpResourceExecArgs":{let args=execMsg.message.value,execResult=create(ReadMcpResourceExecResultSchema,{result:{case:"notFound",value:create(ReadMcpResourceNotFoundSchema,{uri:args.uri})}});sendExecClientMessage(h2Request,execMsg,"readMcpResourceExecResult",execResult);return}case"recordScreenArgs":{let execResult=create(RecordScreenResultSchema,{result:{case:"failure",value:create(RecordScreenFailureSchema,{error:NOT_IMPLEMENTED})}});sendExecClientMessage(h2Request,execMsg,"recordScreenResult",execResult);return}case"computerUseArgs":{let execResult=create(ComputerUseResultSchema,{result:{case:"error",value:create(ComputerUseErrorSchema,{error:NOT_IMPLEMENTED})}});sendExecClientMessage(h2Request,execMsg,"computerUseResult",execResult);return}case"piReadArgs":{let args=execMsg.message.value,toolCallId=randomUUID3(),readArgs=piReadArgs(args.path,args.offset,args.limit);synthesizeCursorExecToolCall(output,stream2,state,toolCallId,"read",readArgs??{path:args.path,offset:args.offset,limit:0});let{execResult}=await resolveExecHandler({args,toolCallId},execHandlers?.piRead?.bind(execHandlers),onToolResult,buildPiReadResult,buildPiReadError,buildPiReadError,{toolCallId,toolName:"read"});sendExecClientMessage(h2Request,execMsg,"piReadResult",execResult);return}case"piBashArgs":{let args=execMsg.message.value,toolCallId=randomUUID3();synthesizeCursorExecToolCall(output,stream2,state,toolCallId,"bash",{command:args.command,timeout:piTimeout(args.timeout)});let{execResult}=await resolveExecHandler({args,toolCallId},execHandlers?.piBash?.bind(execHandlers),onToolResult,buildPiBashResult,buildPiBashError,buildPiBashError,{toolCallId,toolName:"bash"});sendExecClientMessage(h2Request,execMsg,"piBashResult",execResult);return}case"piEditArgs":{let args=execMsg.message.value,toolCallId=randomUUID3();synthesizeCursorExecToolCall(output,stream2,state,toolCallId,"edit",{path:args.path,edits:args.edits.map(edit=>({oldText:edit.oldText,newText:edit.newText}))});let{execResult}=await resolveExecHandler({args,toolCallId},execHandlers?.piEdit?.bind(execHandlers),onToolResult,buildPiEditResult,buildPiEditRejected,buildPiEditError,{toolCallId,toolName:"edit"});sendExecClientMessage(h2Request,execMsg,"piEditResult",execResult);return}case"piWriteArgs":{let args=execMsg.message.value,toolCallId=randomUUID3();synthesizeCursorExecToolCall(output,stream2,state,toolCallId,"write",{path:args.path,content:args.content});let{execResult}=await resolveExecHandler({args,toolCallId},execHandlers?.piWrite?.bind(execHandlers),onToolResult,buildPiWriteResult,buildPiWriteRejected,buildPiWriteError,{toolCallId,toolName:"write"});sendExecClientMessage(h2Request,execMsg,"piWriteResult",execResult);return}case"piGrepArgs":{let args=execMsg.message.value,toolCallId=randomUUID3();synthesizeCursorExecToolCall(output,stream2,state,toolCallId,"grep",{pattern:args.pattern,path:args.path||void 0,glob:args.glob||void 0,ignoreCase:args.ignoreCase===!0?!0:void 0,literal:args.literal===!0?!0:void 0,context:args.context,limit:piLimit(args.limit)});let{execResult}=await resolveExecHandler({args,toolCallId},execHandlers?.piGrep?.bind(execHandlers),onToolResult,buildPiGrepResult,buildPiGrepError,buildPiGrepError,{toolCallId,toolName:"grep"});sendExecClientMessage(h2Request,execMsg,"piGrepResult",execResult);return}case"piFindArgs":{let args=execMsg.message.value,toolCallId=randomUUID3();synthesizeCursorExecToolCall(output,stream2,state,toolCallId,"find",{pattern:args.pattern,path:args.path||void 0,limit:piLimit(args.limit)});let{execResult}=await resolveExecHandler({args,toolCallId},execHandlers?.piFind?.bind(execHandlers),onToolResult,buildPiFindResult,buildPiFindError,buildPiFindError,{toolCallId,toolName:"find"});sendExecClientMessage(h2Request,execMsg,"piFindResult",execResult);return}case"piLsArgs":{let args=execMsg.message.value,toolCallId=randomUUID3();synthesizeCursorExecToolCall(output,stream2,state,toolCallId,"ls",{path:piLsPath(args.path),limit:piLimit(args.limit)});let{execResult}=await resolveExecHandler({args,toolCallId},execHandlers?.piLs?.bind(execHandlers),onToolResult,buildPiLsResult,buildPiLsError,buildPiLsError,{toolCallId,toolName:"ls"});sendExecClientMessage(h2Request,execMsg,"piLsResult",execResult);return}case"miniSweAgentBashArgs":{let args=execMsg.message.value;ensureUniqueCursorExecToolCallId(output,args);let normalizedArgs={...args,workingDirectory:args.workingDirectory||process.cwd()};synthesizeCursorExecToolCall(output,stream2,state,args.toolCallId,"bash",{command:composeShellCommand(args.command,args.workingDirectory||void 0),timeout:args.timeout&&args.timeout>0?args.timeout:void 0});let{execResult}=await resolveExecHandler(normalizedArgs,execHandlers?.shell?.bind(execHandlers),onToolResult,toolResult=>buildShellResultFromToolResult(normalizedArgs,toolResult),reason=>buildShellRejectedResult(normalizedArgs.command,normalizedArgs.workingDirectory,reason),error=>buildShellFailureResult(normalizedArgs.command,normalizedArgs.workingDirectory,error),{toolCallId:args.toolCallId,toolName:"bash"});sendExecClientMessage(h2Request,execMsg,"miniSweAgentBashResult",sanitizeShellExecResult(execResult));return}case"redactedReadArgs":{let args=execMsg.message.value;sendExecClientMessage(h2Request,execMsg,"redactedReadResult",buildReadErrorResult(args.path,"Secret redaction is not implemented by this client"));return}case"mcpStateExecArgs":{let args=execMsg.message.value;sendExecClientMessage(h2Request,execMsg,"mcpStateExecResult",buildMcpStateResult(requestContextTools,args.serverIdentifiers));return}case"executeHookArgs":{let args=execMsg.message.value,execResult=buildNeutralHookResult(args.request);if(!execResult){sendExecClientThrow(h2Request,execMsg,`Unsupported hook request: ${args.request?.request.case??"unset"}`,"unknown_hook_request");return}sendExecClientMessage(h2Request,execMsg,"executeHookResult",execResult);return}case"subagentArgs":{let execResult=create(SubagentResultSchema,{result:{case:"error",value:create(SubagentErrorSchema,{error:`Subagents are ${NOT_IMPLEMENTED_SUFFIX}`})}});sendExecClientMessage(h2Request,execMsg,"subagentResult",execResult);return}case"subagentAwaitArgs":{let args=execMsg.message.value,execResult=create(SubagentAwaitResultSchema,{result:{case:"notFound",value:create(SubagentAwaitNotFoundSchema,{agentId:args.agentId})}});sendExecClientMessage(h2Request,execMsg,"subagentAwaitResult",execResult);return}case"forceBackgroundShellArgs":{let execResult=create(ForceBackgroundShellResultSchema,{status:ForceBackgroundShellStatus.NOT_FOUND});sendExecClientMessage(h2Request,execMsg,"forceBackgroundShellResult",execResult);return}case"forceBackgroundSubagentArgs":{let execResult=create(ForceBackgroundSubagentResultSchema,{status:ForceBackgroundSubagentStatus.NOT_FOUND});sendExecClientMessage(h2Request,execMsg,"forceBackgroundSubagentResult",execResult);return}case"smartModeClassifierArgs":{let execResult=create(SmartModeClassifierResultSchema,{result:{case:"error",value:create(SmartModeClassifierErrorSchema,{error:`Smart-mode classification is ${NOT_IMPLEMENTED_SUFFIX}`})}});sendExecClientMessage(h2Request,execMsg,"smartModeClassifierResult",execResult);return}case"canvasDiagnosticsArgs":{let args=execMsg.message.value,execResult=create(CanvasDiagnosticsResultSchema,{result:{case:"error",value:create(CanvasDiagnosticsErrorSchema,{path:args.path,error:`Canvas diagnostics are ${NOT_IMPLEMENTED_SUFFIX}`})}});sendExecClientMessage(h2Request,execMsg,"canvasDiagnosticsResult",execResult);return}case"shellAllowlistPrecheckArgs":{sendExecClientMessage(h2Request,execMsg,"shellAllowlistPrecheckResult",create(ShellAllowlistPrecheckResultSchema,{allowlisted:!1}));return}case"mcpAllowlistPrecheckArgs":{sendExecClientMessage(h2Request,execMsg,"mcpAllowlistPrecheckResult",create(McpAllowlistPrecheckResultSchema,{allowlisted:!1}));return}case"webFetchAllowlistPrecheckArgs":{sendExecClientMessage(h2Request,execMsg,"webFetchAllowlistPrecheckResult",create(WebFetchAllowlistPrecheckResultSchema,{allowlisted:!1}));return}case"conversationSearchArgs":{let args=execMsg.message.value,toolCallId=args.toolCallId||randomUUID3(),error=`Conversation search is ${NOT_IMPLEMENTED_SUFFIX}`;synthesizeCursorExecToolCall(output,stream2,state,toolCallId,"search_conversations",{query:args.query,limit:args.limit}),await pairSynthesizedExecResult(state,onToolResult,toolCallId,"search_conversations",error);let execResult=create(ConversationSearchResultSchema,{result:{case:"error",value:create(ConversationSearchErrorSchema,{error})}});sendExecClientMessage(h2Request,execMsg,"conversationSearchResult",execResult);return}case"agentStoreConflictArgs":{let execResult=create(AgentStoreConflictResultSchema,{result:{case:"error",value:create(AgentStoreConflictErrorSchema,{error:`Agent store conflicts are ${NOT_IMPLEMENTED_SUFFIX}`})}});sendExecClientMessage(h2Request,execMsg,"agentStoreConflictResult",execResult);return}case"gitDiffRequest":{sendExecClientThrow(h2Request,execMsg,`Git diff is ${NOT_IMPLEMENTED_SUFFIX}`,"exec_variant_unsupported");return}default:log("warn","unhandledExecMessage",{execCase}),sendExecClientThrow(h2Request,execMsg,`No handler for exec message of type ${execCase}`,"exec_variant_unsupported")}}function armCursorExecHeartbeat(h2Request,execMsg){return armExecHeartbeat({intervalMs:EXEC_HEARTBEAT_INTERVAL_MS,isClosed:()=>h2Request.closed,writeHeartbeat:onComplete=>{let controlMessage=create(ExecClientControlMessageSchema,{message:{case:"heartbeat",value:create(ExecClientHeartbeatSchema,{id:execMsg.id})}}),clientMessage=create(AgentClientMessageSchema,{message:{case:"execClientControlMessage",value:controlMessage}});h2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema,clientMessage)),onComplete),log("execClientControl","heartbeat",{id:execMsg.id,execId:execMsg.execId})}})}function sendExecClientMessage(h2Request,execMsg,messageCase,value){let execClientMessage=create(ExecClientMessageSchema,{id:execMsg.id,execId:execMsg.execId,message:{case:messageCase,value}}),clientMessage=create(AgentClientMessageSchema,{message:{case:"execClientMessage",value:execClientMessage}});h2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema,clientMessage))),log("execClientMessage",messageCase)}function sendExecClientThrow(h2Request,execMsg,error,errorCode){let controlMessage=create(ExecClientControlMessageSchema,{message:{case:"throw",value:create(ExecClientThrowSchema,{id:execMsg.id,error,errorCode})}}),clientMessage=create(AgentClientMessageSchema,{message:{case:"execClientControlMessage",value:controlMessage}});h2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema,clientMessage))),log("execClientControl","throw",{id:execMsg.id,execId:execMsg.execId,error,errorCode})}function sendExecClientStreamClose(h2Request,execMsg){let closeMessage=create(ExecClientControlMessageSchema,{message:{case:"streamClose",value:create(ExecClientStreamCloseSchema,{id:execMsg.id})}}),clientMessage=create(AgentClientMessageSchema,{message:{case:"execClientControlMessage",value:closeMessage}});h2Request.write(frameConnectMessage(toBinary(AgentClientMessageSchema,clientMessage))),log("execClientControl","streamClose",{id:execMsg.id,execId:execMsg.execId})}async function resolveExecHandler(args,handler,onToolResult,buildFromToolResult,buildRejected,buildError,pairing){let pair=async(text,isError)=>{if(!pairing)return;let synthesized={role:"toolResult",toolCallId:pairing.toolCallId,toolName:pairing.toolName,content:[{type:"text",text}],isError,timestamp:Date.now()};return await applyToolResultHandler(synthesized,onToolResult)};if(!handler){let reason="Tool not available";return{execResult:buildRejected(reason),toolResult:await pair(reason,!0)}}try{let handlerResult=await handler(args),{execResult,toolResult}=splitExecHandlerResult(handlerResult),finalToolResult=await applyToolResultHandler(toolResult,onToolResult);if(execResult)return{execResult,toolResult:finalToolResult??await pair(...describeExecResult(execResult))};if(finalToolResult)return{execResult:buildFromToolResult(finalToolResult),toolResult:finalToolResult};let reason="Tool returned no result";return{execResult:buildRejected(reason),toolResult:await pair(reason,!0)}}catch(error){let message=error instanceof Error?error.message:String(error);return{execResult:buildError(message),toolResult:await pair(message,!0)}}}function describeExecResult(execResult){let result=execResult?.result,variant=result?.case;if(variant==="success"){let success=result?.value;return success?.isError?[mcpContentToText(success.content)||"MCP tool reported an error",!0]:["Tool produced no transcript result",!1]}if(!variant)return["Tool produced no transcript result",!1];let value=result?.value;return[value?.error||value?.reason||`Tool call ${variant}`,!0]}function mcpContentToText(content){if(!Array.isArray(content))return"";let parts=[];for(let item of content){let inner=item?.content;inner?.case==="text"&&inner.value?.text&&parts.push(inner.value.text)}return parts.join(`
|
|
35
35
|
`)}function splitExecHandlerResult(result){if(isToolResultMessage(result))return{toolResult:result};if(result&&typeof result=="object"){let record=result;if("execResult"in record){let{execResult,toolResult}=record;return{execResult,toolResult}}if("toolResult"in record&&!isToolResultMessage(record)){let{result:execResult,toolResult}=record;return{execResult,toolResult}}if("result"in record&&!("$typeName"in record)){let{result:execResult,toolResult}=record;return{execResult,toolResult}}}return{execResult:result}}function isToolResultMessage(value){return!!value&&typeof value=="object"&&value.role==="toolResult"}async function applyToolResultHandler(toolResult,onToolResult){return!toolResult||!onToolResult?toolResult:await onToolResult(toolResult)??toolResult}function toolResultToText2(toolResult){return toolResult.content.map(item=>item.type==="text"?item.text:`[${item.mimeType} image]`).join(`
|
|
@@ -37,7 +37,7 @@ ${text}`})}});stepBlobIds.push(storeCursorBlob(blobStore,toBinary(ConversationSt
|
|
|
37
37
|
`).length:0);return create(ReadResultSchema,{result:{case:"success",value:create(ReadSuccessSchema,{path,totalLines,fileSize:BigInt(readFileSizeFromDetails(toolResult)??Buffer.byteLength(text,"utf-8")),truncated:toolResultWasTruncated(toolResult),output:{case:"content",value:text},rangeApplied})}})}function buildReadErrorResult(path,error){return create(ReadResultSchema,{result:{case:"error",value:create(ReadErrorSchema,{path,error})}})}function buildReadRejectedResult(path,reason){return create(ReadResultSchema,{result:{case:"rejected",value:create(ReadRejectedSchema,{path,reason})}})}function buildWriteResultFromToolResult(args,toolResult){let text=toolResultToText2(toolResult);if(toolResult.isError)return buildWriteErrorResult(args.path,text||"Write failed");let fileText=args.fileText??"",fileSize=args.fileBytes?.length??Buffer.byteLength(fileText,"utf-8"),linesCreated=fileText?fileText.split(`
|
|
38
38
|
`).length:0;return create(WriteResultSchema,{result:{case:"success",value:create(WriteSuccessSchema,{path:args.path,linesCreated,fileSize,fileContentAfterWrite:args.returnFileContentAfterWrite?fileText:void 0})}})}function buildWriteErrorResult(path,error){return create(WriteResultSchema,{result:{case:"error",value:create(WriteErrorSchema,{path,error})}})}function buildWriteRejectedResult(path,reason){return create(WriteResultSchema,{result:{case:"rejected",value:create(WriteRejectedSchema,{path,reason})}})}function buildDeleteResultFromToolResult(path,toolResult){let text=toolResultToText2(toolResult);return toolResult.isError?buildDeleteErrorResult(path,text||"Delete failed"):create(DeleteResultSchema,{result:{case:"success",value:create(DeleteSuccessSchema,{path,deletedFile:path,fileSize:BigInt(0),prevContent:""})}})}function buildDeleteErrorResult(path,error){return create(DeleteResultSchema,{result:{case:"error",value:create(DeleteErrorSchema,{path,error})}})}function buildDeleteRejectedResult(path,reason){return create(DeleteResultSchema,{result:{case:"rejected",value:create(DeleteRejectedSchema,{path,reason})}})}function buildShellResultFromToolResult(args,toolResult){let output=toolResultToText2(toolResult);return toolResult.isError?buildShellFailureResult(args.command,args.workingDirectory,output||"Shell failed"):create(ShellResultSchema,{result:{case:"success",value:create(ShellSuccessSchema,{command:args.command,workingDirectory:args.workingDirectory,exitCode:0,signal:"",stdout:output,stderr:"",executionTime:0})}})}function buildShellFailureResult(command,workingDirectory,error){return create(ShellResultSchema,{result:{case:"failure",value:create(ShellFailureSchema,{command,workingDirectory,exitCode:1,signal:"",stdout:"",stderr:error,executionTime:0,aborted:!1})}})}function buildShellRejectedResult(command,workingDirectory,reason){return create(ShellResultSchema,{result:{case:"rejected",value:create(ShellRejectedSchema,{command,workingDirectory,reason,isReadonly:!1})}})}function buildLsResultFromToolResult(path,toolResult){let text=toolResultToText2(toolResult);if(toolResult.isError)return buildLsErrorResult(path,text||"Ls failed");let rootPath=path||".",entries=text.split(`
|
|
39
39
|
`).map(line=>line.trim()).filter(line=>line.length>0&&!line.startsWith("[")),childrenDirs=[],childrenFiles=[];for(let entry of entries){let name=entry.split(" (")[0];if(name.endsWith("/")){let dirName=name.slice(0,-1);childrenDirs.push(create(LsDirectoryTreeNodeSchema,{absPath:`${rootPath.replace(/\/$/,"")}/${dirName}`,childrenDirs:[],childrenFiles:[],childrenWereProcessed:!1,fullSubtreeExtensionCounts:{},numFiles:0}))}else childrenFiles.push(create(LsDirectoryTreeNode_FileSchema,{name}))}let root=create(LsDirectoryTreeNodeSchema,{absPath:rootPath,childrenDirs,childrenFiles,childrenWereProcessed:!0,fullSubtreeExtensionCounts:{},numFiles:childrenFiles.length});return create(LsResultSchema,{result:{case:"success",value:create(LsSuccessSchema,{directoryTreeRoot:root})}})}function buildLsErrorResult(path,error){return create(LsResultSchema,{result:{case:"error",value:create(LsErrorSchema,{path,error})}})}function buildLsRejectedResult(path,reason){return create(LsResultSchema,{result:{case:"rejected",value:create(LsRejectedSchema,{path,reason})}})}function buildGrepResultFromToolResult(args,toolResult){let text=toolResultToText2(toolResult);if(toolResult.isError)return buildGrepErrorResult(text||"Grep failed");let outputMode=args.outputMode||"content",clientTruncated=toolResultDetailBoolean(toolResult,"truncated"),lines=text.split(`
|
|
40
|
-
`).map(line=>line.trimEnd()).filter(line=>line.length>0&&!line.startsWith("[")&&!line.toLowerCase().startsWith("no matches")),workspaceKey=args.path||".",unionResult;if(outputMode==="files_with_matches"){let files=lines;unionResult=create(GrepUnionResultSchema,{result:{case:"files",value:create(GrepFilesResultSchema,{files,totalFiles:files.length,clientTruncated,ripgrepTruncated:!1,offsetApplied:args.offset})}})}else if(outputMode==="count"){let counts=lines.map(line=>{let separatorIndex=line.lastIndexOf(":");if(separatorIndex===-1)return null;let file=line.slice(0,separatorIndex),count=Number.parseInt(line.slice(separatorIndex+1),10);return!file||Number.isNaN(count)?null:create(GrepFileCountSchema,{file,count})}).filter(entry=>entry!==null),totalMatches=counts.reduce((sum,entry)=>sum+entry.count,0);unionResult=create(GrepUnionResultSchema,{result:{case:"count",value:create(GrepCountResultSchema,{counts,totalFiles:counts.length,totalMatches,clientTruncated,ripgrepTruncated:!1,offsetApplied:args.offset})}})}else{let matchMap=new Map,totalMatchedLines=0;for(let line of lines){let matchLine=line.match(/^(.+?):(\d+):\s?(.*)$/),contextLine=line.match(/^(.+?)-(\d+)-\s?(.*)$/),match=matchLine??contextLine;if(!match)continue;let[,file,lineNumber,content]=match,isContextLine=!!contextLine,list=matchMap.get(file)??[];list.push({line:Number(lineNumber),content,isContextLine}),matchMap.set(file,list),isContextLine||(totalMatchedLines+=1)}let matches=Array.from(matchMap.entries()).map(([file,fileMatches])=>create(GrepFileMatchSchema,{file,matches:fileMatches.map(entry=>create(GrepContentMatchSchema,{lineNumber:entry.line,content:entry.content,contentTruncated:!1,isContextLine:entry.isContextLine}))})),totalLines=matches.reduce((sum,entry)=>sum+entry.matches.length,0);unionResult=create(GrepUnionResultSchema,{result:{case:"content",value:create(GrepContentResultSchema,{matches,totalLines,totalMatchedLines,clientTruncated,ripgrepTruncated:!1,offsetApplied:args.offset})}})}return create(GrepResultSchema,{result:{case:"success",value:create(GrepSuccessSchema,{pattern:args.pattern,path:args.path||"",outputMode,workspaceResults:{[workspaceKey]:unionResult}})}})}function buildGrepErrorResult(error){return create(GrepResultSchema,{result:{case:"error",value:create(GrepErrorSchema,{error})}})}function emptyGrepPatternRejection(pattern,glob){return pattern&&pattern.trim().length>0?null:glob&&glob.length>0?`grep pattern is required (received an empty pattern). To list files matching "${glob}", pass a non-empty regex (e.g. ".") and set path to that glob, or use the ls/read tool instead.`:"grep pattern is required (received an empty pattern)."}function buildDiagnosticsResultFromToolResult(path,toolResult){let text=toolResultToText2(toolResult);return toolResult.isError?buildDiagnosticsErrorResult(path,text||"Diagnostics failed"):create(DiagnosticsResultSchema,{result:{case:"success",value:create(DiagnosticsSuccessSchema,{path,diagnostics:[],totalDiagnostics:0})}})}function buildDiagnosticsErrorResult(_path,error){return create(DiagnosticsResultSchema,{result:{case:"error",value:create(DiagnosticsErrorSchema,{error})}})}function buildDiagnosticsRejectedResult(path,reason){return create(DiagnosticsResultSchema,{result:{case:"rejected",value:create(DiagnosticsRejectedSchema,{path,reason})}})}function parseToolArgsJson(text){let trimmed=text.trim();if(!trimmed)return text;try{return parseJsonWithRepair(trimmed)}catch{return text}}function decodeMcpArgValue(value){try{let parsedValue=fromBinary(ValueSchema,value),jsonValue=toJson(ValueSchema,parsedValue);return typeof jsonValue=="string"?parseToolArgsJson(jsonValue):jsonValue}catch{}let text=new TextDecoder().decode(value);return parseToolArgsJson(text)}function decodeMcpArgsMap(args){if(!args)return;let decoded={};for(let[key,value]of Object.entries(args))decoded[key]=decodeMcpArgValue(value);return decoded}function decodeMcpCall(args){let decodedArgs={};for(let[key,value]of Object.entries(args.args??{}))decodedArgs[key]=decodeMcpArgValue(value);return{name:args.name,providerIdentifier:args.providerIdentifier,toolName:args.toolName||args.name,toolCallId:args.toolCallId,args:decodedArgs,rawArgs:args.args??{},approvalOnly:args.smartModeApprovalOnly===!0}}function mapTodoStatusValue(status){switch(status){case 2:return"in_progress";case 3:return"completed";case 4:return"abandoned";default:return"pending"}}function selectTodoCalls(toolCall){let oneof=toolCall.tool;return oneof?.case==="updateTodosToolCall"?{update:oneof.value}:oneof?.case==="readTodosToolCall"?{read:oneof.value}:{update:toolCall.updateTodosToolCall,read:toolCall.readTodosToolCall}}function mapTodoSnapshot(todos){return todos.map(todo=>({content:typeof todo.content=="string"?todo.content:"",status:mapTodoStatusValue(typeof todo.status=="number"?todo.status:void 0)}))}function selectMcpCall(toolCall){let oneof=toolCall?.tool;return oneof?.case==="mcpToolCall"?oneof.value:toolCall?.mcpToolCall}var EXEC_OWNED_TOOL_CALL_CASES=new Set(["piReadToolCall","piBashToolCall","piEditToolCall","piWriteToolCall","piGrepToolCall","piFindToolCall","piLsToolCall","listMcpResourcesToolCall","readMcpResourceToolCall"]);function isExecOwnedToolCall(toolCall){let variant=toolCall?.tool?.case;return variant!==void 0&&EXEC_OWNED_TOOL_CALL_CASES.has(variant)}function flushOpenToolCalls(output,stream2,state){let openBlocks=new Set(state.openToolCalls.values());state.currentToolCall&&openBlocks.add(state.currentToolCall);for(let block of openBlocks){let idx=output.content.indexOf(block),partialJson=block[kStreamingPartialJson];partialJson!==void 0&&(block.arguments=parseStreamingJson(partialJson),clearStreamingPartialJson(block));let kind=block[kStreamingBlockKind];(kind==="connect-scm"||kind==="todo")&&state.onToolResult?.({role:"toolResult",toolCallId:block.id,toolName:block.name,content:[{type:"text",text:"The connection to Cursor closed before this call completed."}],isError:!0,timestamp:Date.now()}),stream2.push({type:"toolcall_end",contentIndex:idx,toolCall:block,partial:output})}state.openToolCalls.clear(),state.setToolCall(null)}function retainStreamedCall(state,block,envelopeId){envelopeId&&state.openToolCalls.set(envelopeId,block),state.setToolCall(block)}function resolveStreamedCall(state,envelopeId){if(!envelopeId)return state.currentToolCall;let keyed=state.openToolCalls.get(envelopeId);if(keyed)return keyed;let current=state.currentToolCall;return current&¤t[kStreamingEnvelopeId]===void 0?current:null}function releaseStreamedCall(state,block){let envelopeId=block[kStreamingEnvelopeId];envelopeId&&state.openToolCalls.delete(envelopeId),state.currentToolCall===block&&state.setToolCall(null)}function selectConnectScmCall(toolCall){let oneof=toolCall?.tool;return oneof?.case==="connectScmToolCall"?oneof.value:toolCall?.connectScmToolCall}function selectConnectScmRepository(call){let target=call?.args?.target;return target?.case==="github"?target.value?.repository:call?.args?.github?.repository}function describeConnectScmResult(call){let result=call?.result?.result;switch(result?.case){case"success":return{text:"SCM connected",isError:!1};case"error":return{text:result.value?.error||"SCM connection failed",isError:!0};case"rejected":return{text:result.value?.reason||"SCM connection rejected",isError:!0};default:return{text:"SCM connection reported no result",isError:!0}}}function extractTodoSnapshot(toolCall){let{update,read}=selectTodoCalls(toolCall);if(read&&((read.args?.statusFilter?.length??0)>0||(read.args?.idFilter?.length??0)>0))return null;let call=update??read;if(!call)return null;let result=call.result?.result;if(result?.case!=="success")return null;let todos=result.value?.todos;if(!todos)return null;let totalCount=result.value?.totalCount;if(typeof totalCount=="number"&&totalCount!==todos.length||read&&todos.length===0)return null;let mapped=mapTodoSnapshot(todos);return mapped.some(todo=>todo.content.length===0)?null:{todos:mapped,merged:result.value?.wasMerge===!0}}function extractTodoError(toolCall){let{update,read}=selectTodoCalls(toolCall),result=(update??read)?.result?.result;if(result?.case!=="error")return null;let error=result.value?.error;return typeof error=="string"&&error.length>0?error:"Todo operation failed"}function buildTodoDisplayArgs(toolCall){let args=selectTodoCalls(toolCall).update?.args;return{todos:args?.todos?mapTodoSnapshot(args.todos):[],merge:args?.merge===!0?!0:void 0}}function buildTodoToolResult(toolCallId,snapshot,error){let text=error??(snapshot?formatTodoSnapshotSummary(snapshot.todos):"Todo snapshot not mirrored");return{role:"toolResult",toolCallId,toolName:"todo",content:[{type:"text",text}],isError:error!==null,timestamp:Date.now()}}function formatTodoSnapshotSummary(todos){return todos.length===0?"No todos":`${todos.filter(todo=>todo.status==="completed").length}/${todos.length} tasks completed`}function buildMcpResultFromToolResult(_mcpCall,toolResult){if(toolResult.isError)return buildMcpErrorResult(toolResultToText2(toolResult)||"MCP tool failed");let content=toolResult.content.map(item=>item.type==="image"?create(McpToolResultContentItemSchema,{content:{case:"image",value:create(McpImageContentSchema,{data:Uint8Array.from(Buffer.from(item.data,"base64")),mimeType:item.mimeType})}}):create(McpToolResultContentItemSchema,{content:{case:"text",value:create(McpTextContentSchema,{text:item.text})}}));return create(McpResultSchema,{result:{case:"success",value:create(McpSuccessSchema,{content,isError:!1})}})}function buildMcpToolNotFoundResult(mcpCall){return create(McpResultSchema,{result:{case:"toolNotFound",value:create(McpToolNotFoundSchema,{name:mcpCall.toolName,availableTools:[]})}})}function buildMcpErrorResult(error){return create(McpResultSchema,{result:{case:"error",value:create(McpErrorSchema,{error})}})}function mergeCursorMcpToolCallArgs(streamed,completion){let merged={...streamed??{}};if(!completion)return merged;for(let[key,completionValue]of Object.entries(completion)){let streamedValue=merged[key];typeof completionValue=="string"&&streamedValue!==null&&typeof streamedValue=="object"||(merged[key]=completionValue)}return merged}function endCurrentTextBlock(output,stream2,state){let block=state.currentTextBlock;if(!block)return;let idx=output.content.indexOf(block);stream2.push({type:"text_end",contentIndex:idx,content:block.text,partial:output}),state.setTextBlock(null)}function endCurrentThinkingBlock(output,stream2,state){let block=state.currentThinkingBlock;if(!block)return;let idx=output.content.indexOf(block);stream2.push({type:"thinking_end",contentIndex:idx,content:block.thinking,partial:output}),state.setThinkingBlock(null)}function ensureUniqueCursorExecToolCallId(output,args){if(!args.toolCallId){args.toolCallId=randomUUID3();return}let base=args.toolCallId,candidate=base,suffix=2;for(;output.content.some(block=>block.type==="toolCall"&&block.id===candidate);)candidate=`${base}-${suffix}`,suffix+=1;args.toolCallId=candidate}function synthesizeCursorExecToolCall(output,stream2,state,toolCallId,toolName,args){endCurrentTextBlock(output,stream2,state),endCurrentThinkingBlock(output,stream2,state);let block={type:"toolCall",id:toolCallId,name:toolName,arguments:omitUndefinedArgs(args),[kStreamingBlockIndex]:output.content.length,[kStreamingBlockKind]:"cursor-exec",[kCursorExecResolved]:!0};output.content.push(block);let idx=output.content.length-1;stream2.push({type:"toolcall_start",contentIndex:idx,partial:output}),stream2.push({type:"toolcall_end",contentIndex:idx,toolCall:block,partial:output})}async function pairSynthesizedExecResult(state,onToolResult,toolCallId,toolName,text,isError=!0){let synthesized={role:"toolResult",toolCallId,toolName,content:[{type:"text",text}],isError,timestamp:Date.now()},sink=onToolResult??state.onToolResult;sink&&await sink(synthesized)}var STREAMING_ARGS_REPARSE_DELTA=1024;function processInteractionUpdate(update,output,stream2,state,usageState){let updateCase=update.message?.case;if(log("interactionUpdate",updateCase),updateCase==="textDelta"){let delta=update.message.value.text||"";if(!state.currentTextBlock){let block={type:"text",text:"",[kStreamingBlockIndex]:output.content.length};output.content.push(block),state.setTextBlock(block),stream2.push({type:"text_start",contentIndex:output.content.length-1,partial:output})}state.currentTextBlock.text+=delta;let idx=output.content.indexOf(state.currentTextBlock);stream2.push({type:"text_delta",contentIndex:idx,delta,partial:output})}else if(updateCase==="thinkingDelta"){let delta=update.message.value.text||"";if(!state.currentThinkingBlock){let block={type:"thinking",thinking:"",[kStreamingBlockIndex]:output.content.length};output.content.push(block),state.setThinkingBlock(block),stream2.push({type:"thinking_start",contentIndex:output.content.length-1,partial:output})}state.currentThinkingBlock.thinking+=delta;let idx=output.content.indexOf(state.currentThinkingBlock);stream2.push({type:"thinking_delta",contentIndex:idx,delta,partial:output})}else if(updateCase==="thinkingCompleted")endCurrentThinkingBlock(output,stream2,state);else if(updateCase==="toolCallStarted"&&selectConnectScmCall(update.message.value.toolCall)){endCurrentTextBlock(output,stream2,state),endCurrentThinkingBlock(output,stream2,state);let scmCall=selectConnectScmCall(update.message.value.toolCall),repository=selectConnectScmRepository(scmCall),block={type:"toolCall",id:scmCall?.args?.toolCallId||update.message.value.callId||randomUUID3(),name:"connect_scm",arguments:repository?{owner:repository.owner,repo:repository.repo}:{},[kStreamingBlockIndex]:output.content.length,[kStreamingBlockKind]:"connect-scm",[kStreamingEnvelopeId]:update.message.value.callId||void 0,[kCursorExecResolved]:!0};output.content.push(block),retainStreamedCall(state,block,update.message.value.callId),stream2.push({type:"toolcall_start",contentIndex:output.content.length-1,partial:output})}else if(updateCase==="toolCallStarted"&&isExecOwnedToolCall(update.message.value.toolCall))endCurrentTextBlock(output,stream2,state),endCurrentThinkingBlock(output,stream2,state),log("exec","streamedToolCallOwnedByExec",{case:update.message.value.toolCall?.tool?.case});else if(updateCase==="toolCallStarted"){endCurrentTextBlock(output,stream2,state),endCurrentThinkingBlock(output,stream2,state);let toolCall=update.message.value.toolCall;if(toolCall){let mcpCall=selectMcpCall(toolCall);if(mcpCall){let args=mcpCall.args||{},id=args.toolCallId||randomUUID3(),resolvedByExec=state.resolvedMcpToolCallIds.delete(id);if(resolvedByExec&&output.content.some(block2=>block2.type==="toolCall"&&block2.id===id))return;let block={type:"toolCall",id,name:args.toolName||args.name||"",arguments:{},[kStreamingBlockIndex]:output.content.length,[kStreamingPartialJson]:"",[kStreamingBlockKind]:"mcp",[kStreamingEnvelopeId]:update.message.value.callId||void 0};resolvedByExec&&markCursorExecResolved(block),output.content.push(block),retainStreamedCall(state,block,update.message.value.callId),stream2.push({type:"toolcall_start",contentIndex:output.content.length-1,partial:output});return}let todoCalls=selectTodoCalls(toolCall);if(todoCalls.update||todoCalls.read){let block={type:"toolCall",id:update.message.value.callId||randomUUID3(),name:"todo",arguments:buildTodoDisplayArgs(toolCall),[kStreamingBlockIndex]:output.content.length,[kStreamingBlockKind]:"todo",[kStreamingEnvelopeId]:update.message.value.callId||void 0,[kCursorExecResolved]:!0};output.content.push(block),retainStreamedCall(state,block,update.message.value.callId),stream2.push({type:"toolcall_start",contentIndex:output.content.length-1,partial:output})}}}else if(updateCase==="toolCallDelta"||updateCase==="partialToolCall"){let target=resolveStreamedCall(state,update.message.value.callId);if(target?.[kStreamingBlockKind]==="mcp"){let snapshot=update.message.value.argsTextDelta||"",current=target[kStreamingPartialJson]??"",chunk=snapshot.startsWith(current)?snapshot.slice(current.length):snapshot;if(chunk.length===0)return;let nextBuffer=current+chunk;target[kStreamingPartialJson]=nextBuffer;let lastParseLen=target[kStreamingLastParseLen]??0;nextBuffer.length-lastParseLen>=STREAMING_ARGS_REPARSE_DELTA&&(target.arguments=parseStreamingJson(nextBuffer),target[kStreamingLastParseLen]=nextBuffer.length);let idx=output.content.indexOf(target);stream2.push({type:"toolcall_delta",contentIndex:idx,delta:chunk,partial:output})}}else if(updateCase==="toolCallCompleted"){let settled=resolveStreamedCall(state,update.message.value.callId);if(settled){let toolCall=update.message.value.toolCall;if(settled[kStreamingBlockKind]==="mcp"){let previousArgs=settled.arguments,partial=settled[kStreamingPartialJson];partial!==void 0&&(settled.arguments=parseStreamingJson(partial));let decodedArgs=decodeMcpArgsMap(selectMcpCall(toolCall)?.args?.args);settled.arguments=mergeCursorMcpToolCallArgs(settled.arguments,decodedArgs),settled.name==="task"&&(settled.arguments=keepUsableCursorTaskArgs(previousArgs,settled.arguments))}else if(settled[kStreamingBlockKind]==="connect-scm"){let scmCall=selectConnectScmCall(toolCall),repository=selectConnectScmRepository(scmCall);repository&&(settled.arguments={owner:repository.owner,repo:repository.repo});let{text,isError}=describeConnectScmResult(scmCall);state.onToolResult?.({role:"toolResult",toolCallId:settled.id,toolName:"connect_scm",content:[{type:"text",text}],isError,timestamp:Date.now()})}else if(settled[kStreamingBlockKind]==="todo"){let snapshot=toolCall?extractTodoSnapshot(toolCall):null,error=toolCall?extractTodoError(toolCall):null;snapshot&&(settled.arguments={todos:snapshot.todos,merged:snapshot.merged}),state.onToolResult?.(buildTodoToolResult(settled.id,snapshot,error))}let idx=output.content.indexOf(settled);clearStreamingPartialJson(settled),stream2.push({type:"toolcall_end",contentIndex:idx,toolCall:settled,partial:output}),releaseStreamedCall(state,settled)}}else if(updateCase==="turnEnded")output.stopReason="stop",applyBilledTurnEndedUsage(update.message.value,output,usageState);else if(updateCase==="tokenDelta"){let tokenDelta=update.message.value;usageState.sawTokenDelta=!0,output.usage.output+=tokenDelta.tokens||0,output.usage.totalTokens=output.usage.input+output.usage.output+output.usage.cacheRead+output.usage.cacheWrite}}function applyBilledTurnEndedUsage(update,output,usageState){let{inputTokens,outputTokens,cacheReadTokens,cacheWriteTokens}=update;if(inputTokens===void 0&&outputTokens===void 0&&cacheReadTokens===void 0&&cacheWriteTokens===void 0)return;usageState.sawTurnEndedUsage=!0;let usage=output.usage,cacheRead=Number(cacheReadTokens??0n),cacheWrite=Number(cacheWriteTokens??0n),liveUsed=usageState.liveUsedTokens??0;if(liveUsed>0&&cacheRead>liveUsed*3){outputTokens!==void 0&&(usage.output=Number(outputTokens)),usage.cacheRead=0,usage.cacheWrite=cacheWrite<=liveUsed?cacheWrite:0,usage.input=Math.max(0,liveUsed-usage.output-usage.cacheWrite),usage.totalTokens=liveUsed;return}usage.cacheRead=cacheRead,usage.cacheWrite=cacheWrite,usage.input=Math.max(0,Number(inputTokens??0n)-usage.cacheRead-usage.cacheWrite),outputTokens!==void 0&&(usage.output=Number(outputTokens)),usage.totalTokens=usage.input+usage.output+usage.cacheRead+usage.cacheWrite}function applyCheckpointTokenDetails(checkpoint,output,usageState){if(usageState.sawTurnEndedUsage)return;let usedTokens=checkpoint.tokenDetails?.usedTokens??0;if(usedTokens<=0)return;usageState.liveUsedTokens=usedTokens;let usage=output.usage;usage.input=Math.max(0,usedTokens-usage.output-usage.cacheRead-usage.cacheWrite),usage.totalTokens=usage.input+usage.output+usage.cacheRead+usage.cacheWrite}function createBlobId(data){return new Uint8Array(createHash3("sha256").update(data).digest())}function storeCursorBlob2(blobStore,data){let blobId=createBlobId(data);return blobStore.set(Buffer.from(blobId).toString("hex"),data),blobId}function readCursorBlob2(blobStore,blobId){let data=blobStore.get(Buffer.from(blobId).toString("hex"));if(!data)throw new Error("Cursor blob not found");return data}var CURSOR_NATIVE_TOOL_NAMES=new Set(["bash","read","write","delete","ls","grep","todo"]);function toolParametersToJsonSchema(tool){try{return JSON.parse(JSON.stringify(tool.parameters))}catch{return{type:"object",properties:{},required:[]}}}var CURSOR_UNSUPPORTED_SCHEMA_KEYS=new Set(["oneOf","anyOf","allOf"]);function sanitizeCursorToolSchema(schema){if(Array.isArray(schema))return schema.map(sanitizeCursorToolSchema);if(schema===null||typeof schema!="object")return schema;let sanitized={};for(let[key,value]of Object.entries(schema))CURSOR_UNSUPPORTED_SCHEMA_KEYS.has(key)||(sanitized[key]=sanitizeCursorToolSchema(value));return sanitized}function buildMcpToolDefinitions(tools){if(!tools||tools.length===0)return[];let advertisedTools=tools.filter(tool=>!CURSOR_NATIVE_TOOL_NAMES.has(tool.name));return advertisedTools.length===0?[]:advertisedTools.map(tool=>{let jsonSchema=sanitizeCursorToolSchema(toolParametersToJsonSchema(tool)),inputSchema=toBinary(ValueSchema,fromJson(ValueSchema,jsonSchema&&typeof jsonSchema=="object"?jsonSchema:{type:"object",properties:{},required:[]}));return create(McpToolDefinitionSchema,{name:tool.name,description:tool.description||"",providerIdentifier:"pi-agent",toolName:tool.name,inputSchema})})}function extractUserMessageText2(msg){if(msg.role!=="user")return"";let content=msg.content;return typeof content=="string"?content.trim():content.filter(c=>c.type==="text").map(c=>c.text).join(`
|
|
40
|
+
`).map(line=>line.trimEnd()).filter(line=>line.length>0&&!line.startsWith("[")&&!line.toLowerCase().startsWith("no matches")),workspaceKey=args.path||".",unionResult;if(outputMode==="files_with_matches"){let files=lines;unionResult=create(GrepUnionResultSchema,{result:{case:"files",value:create(GrepFilesResultSchema,{files,totalFiles:files.length,clientTruncated,ripgrepTruncated:!1,offsetApplied:args.offset})}})}else if(outputMode==="count"){let counts=lines.map(line=>{let separatorIndex=line.lastIndexOf(":");if(separatorIndex===-1)return null;let file=line.slice(0,separatorIndex),count=Number.parseInt(line.slice(separatorIndex+1),10);return!file||Number.isNaN(count)?null:create(GrepFileCountSchema,{file,count})}).filter(entry=>entry!==null),totalMatches=counts.reduce((sum,entry)=>sum+entry.count,0);unionResult=create(GrepUnionResultSchema,{result:{case:"count",value:create(GrepCountResultSchema,{counts,totalFiles:counts.length,totalMatches,clientTruncated,ripgrepTruncated:!1,offsetApplied:args.offset})}})}else{let matchMap=new Map,totalMatchedLines=0;for(let line of lines){let matchLine=line.match(/^(.+?):(\d+):\s?(.*)$/),contextLine=line.match(/^(.+?)-(\d+)-\s?(.*)$/),match=matchLine??contextLine;if(!match)continue;let[,file,lineNumber,content]=match,isContextLine=!!contextLine,list=matchMap.get(file)??[];list.push({line:Number(lineNumber),content,isContextLine}),matchMap.set(file,list),isContextLine||(totalMatchedLines+=1)}let matches=Array.from(matchMap.entries()).map(([file,fileMatches])=>create(GrepFileMatchSchema,{file,matches:fileMatches.map(entry=>create(GrepContentMatchSchema,{lineNumber:entry.line,content:entry.content,contentTruncated:!1,isContextLine:entry.isContextLine}))})),totalLines=matches.reduce((sum,entry)=>sum+entry.matches.length,0);unionResult=create(GrepUnionResultSchema,{result:{case:"content",value:create(GrepContentResultSchema,{matches,totalLines,totalMatchedLines,clientTruncated,ripgrepTruncated:!1,offsetApplied:args.offset})}})}return create(GrepResultSchema,{result:{case:"success",value:create(GrepSuccessSchema,{pattern:args.pattern,path:args.path||"",outputMode,workspaceResults:{[workspaceKey]:unionResult}})}})}function buildGrepErrorResult(error){return create(GrepResultSchema,{result:{case:"error",value:create(GrepErrorSchema,{error})}})}function emptyGrepPatternRejection(pattern,glob){return pattern&&pattern.trim().length>0?null:glob&&glob.length>0?`grep pattern is required (received an empty pattern). To list files matching "${glob}", pass a non-empty regex (e.g. ".") and set path to that glob, or use the ls/read tool instead.`:"grep pattern is required (received an empty pattern)."}function buildDiagnosticsResultFromToolResult(path,toolResult){let text=toolResultToText2(toolResult);return toolResult.isError?buildDiagnosticsErrorResult(path,text||"Diagnostics failed"):create(DiagnosticsResultSchema,{result:{case:"success",value:create(DiagnosticsSuccessSchema,{path,diagnostics:[],totalDiagnostics:0})}})}function buildDiagnosticsErrorResult(_path,error){return create(DiagnosticsResultSchema,{result:{case:"error",value:create(DiagnosticsErrorSchema,{error})}})}function buildDiagnosticsRejectedResult(path,reason){return create(DiagnosticsResultSchema,{result:{case:"rejected",value:create(DiagnosticsRejectedSchema,{path,reason})}})}function parseToolArgsJson(text){let trimmed=text.trim();if(!trimmed)return text;try{return parseJsonWithRepair(trimmed)}catch{return text}}function decodeMcpArgValue(value){try{let parsedValue=fromBinary(ValueSchema,value),jsonValue=toJson(ValueSchema,parsedValue);return typeof jsonValue=="string"?parseToolArgsJson(jsonValue):jsonValue}catch{}let text=new TextDecoder().decode(value);return parseToolArgsJson(text)}function decodeMcpArgsMap(args){if(!args)return;let decoded={};for(let[key,value]of Object.entries(args))decoded[key]=decodeMcpArgValue(value);return decoded}function decodeMcpCall(args){let decodedArgs={};for(let[key,value]of Object.entries(args.args??{}))decodedArgs[key]=decodeMcpArgValue(value);return{name:args.name,providerIdentifier:args.providerIdentifier,toolName:args.toolName||args.name,toolCallId:args.toolCallId,args:decodedArgs,rawArgs:args.args??{},approvalOnly:args.smartModeApprovalOnly===!0}}function mapTodoStatusValue(status){switch(status){case 2:return"in_progress";case 3:return"completed";case 4:return"abandoned";default:return"pending"}}function selectTodoCalls(toolCall){let oneof=toolCall.tool;return oneof?.case==="updateTodosToolCall"?{update:oneof.value}:oneof?.case==="readTodosToolCall"?{read:oneof.value}:{update:toolCall.updateTodosToolCall,read:toolCall.readTodosToolCall}}function mapTodoSnapshot(todos){return todos.map(todo=>({content:typeof todo.content=="string"?todo.content:"",status:mapTodoStatusValue(typeof todo.status=="number"?todo.status:void 0)}))}function selectMcpCall(toolCall){let oneof=toolCall?.tool;return oneof?.case==="mcpToolCall"?oneof.value:toolCall?.mcpToolCall}var EXEC_OWNED_TOOL_CALL_CASES=new Set(["piReadToolCall","piBashToolCall","piEditToolCall","piWriteToolCall","piGrepToolCall","piFindToolCall","piLsToolCall","listMcpResourcesToolCall","readMcpResourceToolCall"]);function isExecOwnedToolCall(toolCall){let variant=toolCall?.tool?.case;return variant!==void 0&&EXEC_OWNED_TOOL_CALL_CASES.has(variant)}function flushOpenToolCalls(output,stream2,state){let openBlocks=new Set(state.openToolCalls.values());state.currentToolCall&&openBlocks.add(state.currentToolCall);for(let block of openBlocks){let idx=output.content.indexOf(block),partialJson=block[kStreamingPartialJson];partialJson!==void 0&&(block.arguments=parseStreamingJson(partialJson),clearStreamingPartialJson(block));let kind=block[kStreamingBlockKind];(kind==="connect-scm"||kind==="todo")&&state.onToolResult?.({role:"toolResult",toolCallId:block.id,toolName:block.name,content:[{type:"text",text:"The connection to Cursor closed before this call completed."}],isError:!0,timestamp:Date.now()}),stream2.push({type:"toolcall_end",contentIndex:idx,toolCall:block,partial:output})}state.openToolCalls.clear(),state.setToolCall(null)}function retainStreamedCall(state,block,envelopeId){envelopeId&&state.openToolCalls.set(envelopeId,block),state.setToolCall(block)}function resolveStreamedCall(state,envelopeId){if(!envelopeId)return state.currentToolCall;let keyed=state.openToolCalls.get(envelopeId);if(keyed)return keyed;let current=state.currentToolCall;return current&¤t[kStreamingEnvelopeId]===void 0?current:null}function releaseStreamedCall(state,block){let envelopeId=block[kStreamingEnvelopeId];envelopeId&&state.openToolCalls.delete(envelopeId),state.currentToolCall===block&&state.setToolCall(null)}function selectConnectScmCall(toolCall){let oneof=toolCall?.tool;return oneof?.case==="connectScmToolCall"?oneof.value:toolCall?.connectScmToolCall}function selectConnectScmRepository(call){let target=call?.args?.target;return target?.case==="github"?target.value?.repository:call?.args?.github?.repository}function describeConnectScmResult(call){let result=call?.result?.result;switch(result?.case){case"success":return{text:"SCM connected",isError:!1};case"error":return{text:result.value?.error||"SCM connection failed",isError:!0};case"rejected":return{text:result.value?.reason||"SCM connection rejected",isError:!0};default:return{text:"SCM connection reported no result",isError:!0}}}function extractTodoSnapshot(toolCall){let{update,read}=selectTodoCalls(toolCall);if(read&&((read.args?.statusFilter?.length??0)>0||(read.args?.idFilter?.length??0)>0))return null;let call=update??read;if(!call)return null;let result=call.result?.result;if(result?.case!=="success")return null;let todos=result.value?.todos;if(!todos)return null;let totalCount=result.value?.totalCount;if(typeof totalCount=="number"&&totalCount!==todos.length||read&&todos.length===0)return null;let mapped=mapTodoSnapshot(todos);return mapped.some(todo=>todo.content.length===0)?null:{todos:mapped,merged:result.value?.wasMerge===!0}}function extractTodoError(toolCall){let{update,read}=selectTodoCalls(toolCall),result=(update??read)?.result?.result;if(result?.case!=="error")return null;let error=result.value?.error;return typeof error=="string"&&error.length>0?error:"Todo operation failed"}function buildTodoDisplayArgs(toolCall){let args=selectTodoCalls(toolCall).update?.args;return{todos:args?.todos?mapTodoSnapshot(args.todos):[],merge:args?.merge===!0?!0:void 0}}function buildTodoToolResult(toolCallId,snapshot,error){let text=error??(snapshot?formatTodoSnapshotSummary(snapshot.todos):"Todo snapshot not mirrored");return{role:"toolResult",toolCallId,toolName:"todo",content:[{type:"text",text}],isError:error!==null,timestamp:Date.now()}}function formatTodoSnapshotSummary(todos){return todos.length===0?"No todos":`${todos.filter(todo=>todo.status==="completed").length}/${todos.length} tasks completed`}function buildMcpResultFromToolResult(_mcpCall,toolResult){if(toolResult.isError)return buildMcpErrorResult(toolResultToText2(toolResult)||"MCP tool failed");let content=toolResult.content.map(item=>item.type==="image"?create(McpToolResultContentItemSchema,{content:{case:"image",value:create(McpImageContentSchema,{data:Uint8Array.from(Buffer.from(item.data,"base64")),mimeType:item.mimeType})}}):create(McpToolResultContentItemSchema,{content:{case:"text",value:create(McpTextContentSchema,{text:item.text})}}));return create(McpResultSchema,{result:{case:"success",value:create(McpSuccessSchema,{content,isError:!1})}})}function buildMcpToolNotFoundResult(mcpCall){return create(McpResultSchema,{result:{case:"toolNotFound",value:create(McpToolNotFoundSchema,{name:mcpCall.toolName,availableTools:[]})}})}function buildMcpErrorResult(error){return create(McpResultSchema,{result:{case:"error",value:create(McpErrorSchema,{error})}})}function mergeCursorMcpToolCallArgs(streamed,completion){let merged={...streamed??{}};if(!completion)return merged;for(let[key,completionValue]of Object.entries(completion)){let streamedValue=merged[key];typeof completionValue=="string"&&streamedValue!==null&&typeof streamedValue=="object"||(merged[key]=completionValue)}return merged}function endCurrentTextBlock(output,stream2,state){let block=state.currentTextBlock;if(!block)return;let idx=output.content.indexOf(block);stream2.push({type:"text_end",contentIndex:idx,content:block.text,partial:output}),state.setTextBlock(null)}function endCurrentThinkingBlock(output,stream2,state){let block=state.currentThinkingBlock;if(!block)return;let idx=output.content.indexOf(block);stream2.push({type:"thinking_end",contentIndex:idx,content:block.thinking,partial:output}),state.setThinkingBlock(null)}function ensureUniqueCursorExecToolCallId(output,args){if(!args.toolCallId){args.toolCallId=randomUUID3();return}let base=args.toolCallId,candidate=base,suffix=2;for(;output.content.some(block=>block.type==="toolCall"&&block.id===candidate);)candidate=`${base}-${suffix}`,suffix+=1;args.toolCallId=candidate}function synthesizeCursorExecToolCall(output,stream2,state,toolCallId,toolName,args){endCurrentTextBlock(output,stream2,state),endCurrentThinkingBlock(output,stream2,state);let block={type:"toolCall",id:toolCallId,name:toolName,arguments:omitUndefinedArgs(args),[kStreamingBlockIndex]:output.content.length,[kStreamingBlockKind]:"cursor-exec",[kCursorExecResolved]:!0};output.content.push(block);let idx=output.content.length-1;stream2.push({type:"toolcall_start",contentIndex:idx,partial:output}),stream2.push({type:"toolcall_end",contentIndex:idx,toolCall:block,partial:output})}async function pairSynthesizedExecResult(state,onToolResult,toolCallId,toolName,text,isError=!0){let synthesized={role:"toolResult",toolCallId,toolName,content:[{type:"text",text}],isError,timestamp:Date.now()},sink=onToolResult??state.onToolResult;sink&&await sink(synthesized)}var STREAMING_ARGS_REPARSE_DELTA=1024;function processInteractionUpdate(update,output,stream2,state,usageState){let updateCase=update.message?.case;if(log("interactionUpdate",updateCase),updateCase==="textDelta"){let delta=update.message.value.text||"";if(!state.currentTextBlock){let block={type:"text",text:"",[kStreamingBlockIndex]:output.content.length};output.content.push(block),state.setTextBlock(block),stream2.push({type:"text_start",contentIndex:output.content.length-1,partial:output})}state.currentTextBlock.text+=delta;let idx=output.content.indexOf(state.currentTextBlock);stream2.push({type:"text_delta",contentIndex:idx,delta,partial:output})}else if(updateCase==="thinkingDelta"){let delta=update.message.value.text||"";if(!state.currentThinkingBlock){let block={type:"thinking",thinking:"",[kStreamingBlockIndex]:output.content.length};output.content.push(block),state.setThinkingBlock(block),stream2.push({type:"thinking_start",contentIndex:output.content.length-1,partial:output})}state.currentThinkingBlock.thinking+=delta;let idx=output.content.indexOf(state.currentThinkingBlock);stream2.push({type:"thinking_delta",contentIndex:idx,delta,partial:output})}else if(updateCase==="thinkingCompleted")endCurrentThinkingBlock(output,stream2,state);else if(updateCase==="toolCallStarted"&&selectConnectScmCall(update.message.value.toolCall)){endCurrentTextBlock(output,stream2,state),endCurrentThinkingBlock(output,stream2,state);let scmCall=selectConnectScmCall(update.message.value.toolCall),repository=selectConnectScmRepository(scmCall),block={type:"toolCall",id:scmCall?.args?.toolCallId||update.message.value.callId||randomUUID3(),name:"connect_scm",arguments:repository?{owner:repository.owner,repo:repository.repo}:{},[kStreamingBlockIndex]:output.content.length,[kStreamingBlockKind]:"connect-scm",[kStreamingEnvelopeId]:update.message.value.callId||void 0,[kCursorExecResolved]:!0};output.content.push(block),retainStreamedCall(state,block,update.message.value.callId),stream2.push({type:"toolcall_start",contentIndex:output.content.length-1,partial:output})}else if(updateCase==="toolCallStarted"&&isExecOwnedToolCall(update.message.value.toolCall))endCurrentTextBlock(output,stream2,state),endCurrentThinkingBlock(output,stream2,state),log("exec","streamedToolCallOwnedByExec",{case:update.message.value.toolCall?.tool?.case});else if(updateCase==="toolCallStarted"){endCurrentTextBlock(output,stream2,state),endCurrentThinkingBlock(output,stream2,state);let toolCall=update.message.value.toolCall;if(toolCall){let mcpCall=selectMcpCall(toolCall);if(mcpCall){let args=mcpCall.args||{},id=args.toolCallId||randomUUID3(),resolvedByExec=state.resolvedMcpToolCallIds.delete(id);if(resolvedByExec&&output.content.some(block2=>block2.type==="toolCall"&&block2.id===id))return;let block={type:"toolCall",id,name:args.toolName||args.name||"",arguments:{},[kStreamingBlockIndex]:output.content.length,[kStreamingPartialJson]:"",[kStreamingBlockKind]:"mcp",[kStreamingEnvelopeId]:update.message.value.callId||void 0};resolvedByExec&&markCursorExecResolved(block),output.content.push(block),retainStreamedCall(state,block,update.message.value.callId),stream2.push({type:"toolcall_start",contentIndex:output.content.length-1,partial:output});return}let todoCalls=selectTodoCalls(toolCall);if(todoCalls.update||todoCalls.read){let block={type:"toolCall",id:update.message.value.callId||randomUUID3(),name:"todo",arguments:buildTodoDisplayArgs(toolCall),[kStreamingBlockIndex]:output.content.length,[kStreamingBlockKind]:"todo",[kStreamingEnvelopeId]:update.message.value.callId||void 0,[kCursorExecResolved]:!0};output.content.push(block),retainStreamedCall(state,block,update.message.value.callId),stream2.push({type:"toolcall_start",contentIndex:output.content.length-1,partial:output})}}}else if(updateCase==="toolCallDelta"||updateCase==="partialToolCall"){let target=resolveStreamedCall(state,update.message.value.callId);if(target?.[kStreamingBlockKind]==="mcp"){let snapshot=update.message.value.argsTextDelta||"",current=target[kStreamingPartialJson]??"",chunk=snapshot.startsWith(current)?snapshot.slice(current.length):snapshot;if(chunk.length===0)return;let nextBuffer=current+chunk;target[kStreamingPartialJson]=nextBuffer;let lastParseLen=target[kStreamingLastParseLen]??0;nextBuffer.length-lastParseLen>=STREAMING_ARGS_REPARSE_DELTA&&(target.arguments=parseStreamingJson(nextBuffer),target[kStreamingLastParseLen]=nextBuffer.length);let idx=output.content.indexOf(target);stream2.push({type:"toolcall_delta",contentIndex:idx,delta:chunk,partial:output},{parsedThrough:target[kStreamingLastParseLen]??0})}}else if(updateCase==="toolCallCompleted"){let settled=resolveStreamedCall(state,update.message.value.callId);if(settled){let toolCall=update.message.value.toolCall;if(settled[kStreamingBlockKind]==="mcp"){let previousArgs=settled.arguments,partial=settled[kStreamingPartialJson];partial!==void 0&&(settled.arguments=parseStreamingJson(partial));let decodedArgs=decodeMcpArgsMap(selectMcpCall(toolCall)?.args?.args);settled.arguments=mergeCursorMcpToolCallArgs(settled.arguments,decodedArgs),settled.name==="task"&&(settled.arguments=keepUsableCursorTaskArgs(previousArgs,settled.arguments))}else if(settled[kStreamingBlockKind]==="connect-scm"){let scmCall=selectConnectScmCall(toolCall),repository=selectConnectScmRepository(scmCall);repository&&(settled.arguments={owner:repository.owner,repo:repository.repo});let{text,isError}=describeConnectScmResult(scmCall);state.onToolResult?.({role:"toolResult",toolCallId:settled.id,toolName:"connect_scm",content:[{type:"text",text}],isError,timestamp:Date.now()})}else if(settled[kStreamingBlockKind]==="todo"){let snapshot=toolCall?extractTodoSnapshot(toolCall):null,error=toolCall?extractTodoError(toolCall):null;snapshot&&(settled.arguments={todos:snapshot.todos,merged:snapshot.merged}),state.onToolResult?.(buildTodoToolResult(settled.id,snapshot,error))}let idx=output.content.indexOf(settled);clearStreamingPartialJson(settled),stream2.push({type:"toolcall_end",contentIndex:idx,toolCall:settled,partial:output}),releaseStreamedCall(state,settled)}}else if(updateCase==="turnEnded")output.stopReason="stop",applyBilledTurnEndedUsage(update.message.value,output,usageState);else if(updateCase==="tokenDelta"){let tokenDelta=update.message.value;usageState.sawTokenDelta=!0,output.usage.output+=tokenDelta.tokens||0,output.usage.totalTokens=output.usage.input+output.usage.output+output.usage.cacheRead+output.usage.cacheWrite}}function applyBilledTurnEndedUsage(update,output,usageState){let{inputTokens,outputTokens,cacheReadTokens,cacheWriteTokens}=update;if(inputTokens===void 0&&outputTokens===void 0&&cacheReadTokens===void 0&&cacheWriteTokens===void 0)return;usageState.sawTurnEndedUsage=!0;let usage=output.usage,cacheRead=Number(cacheReadTokens??0n),cacheWrite=Number(cacheWriteTokens??0n),liveUsed=usageState.liveUsedTokens??0;if(liveUsed>0&&cacheRead>liveUsed*3){outputTokens!==void 0&&(usage.output=Number(outputTokens)),usage.cacheRead=0,usage.cacheWrite=cacheWrite<=liveUsed?cacheWrite:0,usage.input=Math.max(0,liveUsed-usage.output-usage.cacheWrite),usage.totalTokens=liveUsed;return}usage.cacheRead=cacheRead,usage.cacheWrite=cacheWrite,usage.input=Math.max(0,Number(inputTokens??0n)-usage.cacheRead-usage.cacheWrite),outputTokens!==void 0&&(usage.output=Number(outputTokens)),usage.totalTokens=usage.input+usage.output+usage.cacheRead+usage.cacheWrite}function applyCheckpointTokenDetails(checkpoint,output,usageState){if(usageState.sawTurnEndedUsage)return;let usedTokens=checkpoint.tokenDetails?.usedTokens??0;if(usedTokens<=0)return;usageState.liveUsedTokens=usedTokens;let usage=output.usage;usage.input=Math.max(0,usedTokens-usage.output-usage.cacheRead-usage.cacheWrite),usage.totalTokens=usage.input+usage.output+usage.cacheRead+usage.cacheWrite}function createBlobId(data){return new Uint8Array(createHash3("sha256").update(data).digest())}function storeCursorBlob2(blobStore,data){let blobId=createBlobId(data);return blobStore.set(Buffer.from(blobId).toString("hex"),data),blobId}function readCursorBlob2(blobStore,blobId){let data=blobStore.get(Buffer.from(blobId).toString("hex"));if(!data)throw new Error("Cursor blob not found");return data}var CURSOR_NATIVE_TOOL_NAMES=new Set(["bash","read","write","delete","ls","grep","todo"]);function toolParametersToJsonSchema(tool){try{return JSON.parse(JSON.stringify(tool.parameters))}catch{return{type:"object",properties:{},required:[]}}}var CURSOR_UNSUPPORTED_SCHEMA_KEYS=new Set(["oneOf","anyOf","allOf"]);function sanitizeCursorToolSchema(schema){if(Array.isArray(schema))return schema.map(sanitizeCursorToolSchema);if(schema===null||typeof schema!="object")return schema;let sanitized={};for(let[key,value]of Object.entries(schema))CURSOR_UNSUPPORTED_SCHEMA_KEYS.has(key)||(sanitized[key]=sanitizeCursorToolSchema(value));return sanitized}function buildMcpToolDefinitions(tools){if(!tools||tools.length===0)return[];let advertisedTools=tools.filter(tool=>!CURSOR_NATIVE_TOOL_NAMES.has(tool.name));return advertisedTools.length===0?[]:advertisedTools.map(tool=>{let jsonSchema=sanitizeCursorToolSchema(toolParametersToJsonSchema(tool)),inputSchema=toBinary(ValueSchema,fromJson(ValueSchema,jsonSchema&&typeof jsonSchema=="object"?jsonSchema:{type:"object",properties:{},required:[]}));return create(McpToolDefinitionSchema,{name:tool.name,description:tool.description||"",providerIdentifier:"pi-agent",toolName:tool.name,inputSchema})})}function extractUserMessageText2(msg){if(msg.role!=="user")return"";let content=msg.content;return typeof content=="string"?content.trim():content.filter(c=>c.type==="text").map(c=>c.text).join(`
|
|
41
41
|
`).trim()}function hasUserMessageImages2(msg){return msg.role==="user"&&Array.isArray(msg.content)&&msg.content.some(item=>item.type==="image")}function buildCursorRootPromptContent2(content){if(typeof content=="string"){let text=content.trim();return text?[{type:"text",text}]:[]}let parts=[];for(let item of content)if(item.type==="text"){let text=item.text.trim();text&&parts.push({type:"text",text})}else parts.push({type:"image",image:`data:${item.mimeType};base64,${item.data}`,mediaType:item.mimeType});return parts}function cursorUserContentKey2(content){if(typeof content=="string")return content.trim();let hash=createHash3("sha256");for(let item of content)hash.update(item.type),item.type==="text"?hash.update(item.text):(hash.update(item.mimeType),hash.update(item.data));return hash.digest("hex")}function buildCursorAssistantContent2(msg){let content=[];for(let item of msg.content)item.type==="text"?item.text&&content.push({type:"text",text:item.text}):item.type==="toolCall"&&content.push({type:"tool-call",toolCallId:item.id,toolName:item.name,args:item.arguments});return content}function findLastUserMessageIndex2(messages){for(let i=messages.length-1;i>=0;i--)if(messages[i].role==="user")return i;return-1}function buildCursorSystemPromptJsons(systemPrompt,modelId){let trimmed=systemPrompt?.trim(),host=trimmed?[JSON.stringify({role:"system",content:trimmed})]:[JSON.stringify({role:"system",content:"You are a helpful assistant."})];return modelId!==void 0&&isCursorComposerModel(modelId)?[JSON.stringify({role:"system",content:CURSOR_COMPOSER_PROMPT}),...host]:host}function buildRootPromptMessagesJson2(messages,systemPromptIds,blobStore,activeUserMessageIndex=findLastUserMessageIndex2(messages)){let entries=[...systemPromptIds],pushJson=obj=>{let bytes=new TextEncoder().encode(JSON.stringify(obj));entries.push(storeCursorBlob2(blobStore,bytes))};for(let i=0;i<messages.length&&i!==activeUserMessageIndex;i++){let msg=messages[i];if(msg.role==="user"){let content=buildCursorRootPromptContent2(msg.content);if(content.length===0)continue;pushJson({role:"user",content})}else if(msg.role==="assistant"){let content=buildCursorAssistantContent2(msg);if(content.length===0)continue;pushJson({role:"assistant",content})}else msg.role==="toolResult"&&pushJson({role:"tool",id:msg.toolCallId,content:[{type:"tool-result",toolName:msg.toolName,toolCallId:msg.toolCallId,result:toolResultToText2(msg),...msg.isError?{isError:!0}:{}}]})}return entries}function isPlainRecord2(value){if(value===null||typeof value!="object"||Array.isArray(value))return!1;let prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}function isJsonValue2(value){if(value===null||typeof value=="string"||typeof value=="boolean")return!0;if(typeof value=="number")return Number.isFinite(value);if(Array.isArray(value))return value.every(isJsonValue2);if(!isPlainRecord2(value))return!1;for(let key in value)if(!isJsonValue2(value[key]))return!1;return!0}function encodeCursorMcpArguments2(toolCall){let encoded={};for(let name in toolCall.arguments){let value=toolCall.arguments[name];if(value!==void 0){if(!isJsonValue2(value))throw new Error(`Cursor tool argument ${toolCall.name}.${name} is not JSON-serializable`);encoded[name]=toBinary(ValueSchema,fromJson(ValueSchema,value))}}return encoded}function createCursorMcpResult2(result){return result.isError?create(McpToolResultSchema,{result:{case:"error",value:create(McpToolErrorSchema,{error:toolResultToText2(result)})}}):create(McpToolResultSchema,{result:{case:"success",value:create(McpSuccessSchema,{content:result.content.map(item=>item.type==="text"?create(McpToolResultContentItemSchema,{content:{case:"text",value:create(McpTextContentSchema,{text:item.text})}}):create(McpToolResultContentItemSchema,{content:{case:"image",value:create(McpImageContentSchema,{data:Uint8Array.from(Buffer.from(item.data,"base64")),mimeType:item.mimeType})}}))})}})}function createCursorToolCallStep2(toolCall,result){let mcpCall=create(McpToolCallSchema,{args:create(McpArgsSchema,{name:toolCall.name,args:encodeCursorMcpArguments2(toolCall),toolCallId:toolCall.id,providerIdentifier:"pi-agent",toolName:toolCall.name}),...result?{result:createCursorMcpResult2(result)}:{}});return create(ConversationStepSchema,{message:{case:"toolCall",value:create(ToolCallSchema,{tool:{case:"mcpToolCall",value:mcpCall},toolCallId:toolCall.id})}})}function buildConversationTurns2(messages,blobStore,activeUserMessageIndex=findLastUserMessageIndex2(messages)){let turns=[],historyEnd=activeUserMessageIndex>=0?activeUserMessageIndex:messages.length,toolResults=new Map,pairedToolCallIds=new Set;for(let index=0;index<historyEnd;index++){let message=messages[index];if(message.role==="toolResult")toolResults.set(message.toolCallId,message);else if(message.role==="assistant")for(let item of message.content)item.type==="toolCall"&&pairedToolCallIds.add(item.id)}let i=0;for(;i<messages.length;){let msg=messages[i];if(msg.role!=="user"){i++;continue}if(i===activeUserMessageIndex)break;let userText=extractUserMessageText2(msg);if(userText.length===0&&!hasUserMessageImages2(msg)){i++;continue}let userMessage=createCursorUserMessage2(msg.content,userText,deterministicUuid(`u:${turns.length}:${cursorUserContentKey2(msg.content)}`)),userMessageBlobId=storeCursorBlob2(blobStore,toBinary(UserMessageSchema,userMessage)),stepBlobIds=[];for(i++;i<messages.length&&messages[i].role!=="user";){let stepMsg=messages[i];if(stepMsg.role==="assistant")for(let item of stepMsg.content){let step;if(item.type==="text"){if(!item.text)continue;step=create(ConversationStepSchema,{message:{case:"assistantMessage",value:create(AssistantMessageSchema,{text:item.text})}})}else{if(item.type==="thinking")continue;if(item.type==="toolCall")step=createCursorToolCallStep2(item,toolResults.get(item.id));else continue}stepBlobIds.push(storeCursorBlob2(blobStore,toBinary(ConversationStepSchema,step)))}else if(stepMsg.role==="toolResult"&&!pairedToolCallIds.has(stepMsg.toolCallId)){let text=toolResultToText2(stepMsg);if(text){let prefix=stepMsg.isError?"[Tool Error]":"[Tool Result]",step=create(ConversationStepSchema,{message:{case:"assistantMessage",value:create(AssistantMessageSchema,{text:`${prefix}
|
|
42
42
|
${text}`})}});stepBlobIds.push(storeCursorBlob2(blobStore,toBinary(ConversationStepSchema,step)))}}i++}let agentTurn=create(AgentConversationTurnStructureSchema,{userMessage:userMessageBlobId,steps:stepBlobIds}),turn=create(ConversationTurnStructureSchema,{turn:{case:"agentConversationTurn",value:agentTurn}});turns.push(storeCursorBlob2(blobStore,toBinary(ConversationTurnStructureSchema,turn)))}return turns}function buildCursorHistoryForTest(messages,activeUserMessageIndex=findLastUserMessageIndex2(messages)){let blobStore=new Map,rootPromptMessagesJson=buildRootPromptMessagesJson2(messages,[],blobStore,activeUserMessageIndex).map(blobId=>JSON.parse(new TextDecoder().decode(readCursorBlob2(blobStore,blobId)))),turnUserMessagesJson=[],turnStepMessagesJson=[];for(let turnBlobId of buildConversationTurns2(messages,blobStore,activeUserMessageIndex)){let turn=fromBinary(ConversationTurnStructureSchema,readCursorBlob2(blobStore,turnBlobId));if(turn.turn.case!=="agentConversationTurn")continue;let userMessage=fromBinary(UserMessageSchema,readCursorBlob2(blobStore,turn.turn.value.userMessage));turnUserMessagesJson.push(toJson(UserMessageSchema,userMessage)),turnStepMessagesJson.push(turn.turn.value.steps.map(stepBlobId=>{let step=fromBinary(ConversationStepSchema,readCursorBlob2(blobStore,stepBlobId));return toJson(ConversationStepSchema,step)}))}return{rootPromptMessagesJson,turnUserMessagesJson,turnStepMessagesJson}}function createCursorUserMessage2(content,text,messageId=randomUUID3()){let images=typeof content=="string"?[]:extractImages2(content);return create(UserMessageSchema,{text,messageId,...images.length>0?{selectedContext:create(SelectedContextSchema,{selectedImages:images})}:{}})}function extractImages2(content){return content.filter(item=>item.type==="image").map(image=>create(SelectedImageSchema,{uuid:randomUUID3(),mimeType:image.mimeType,dataOrBlobId:{case:"data",value:Uint8Array.from(Buffer.from(image.data,"base64"))}}))}function toCursorRequestView(context){return{systemPrompt:getCurrentSystemPrompt(context.messages),messages:context.messages.filter(message=>message.role!=="system"),tools:getCurrentTools(context.messages)}}async function buildGrpcRequest(model,request,options,state){let blobStore=state.blobStore,systemPromptIds=buildCursorSystemPromptJsons(request.systemPrompt,model.id).map(json=>storeCursorBlob2(blobStore,new TextEncoder().encode(json))),activeUserMessageIndex=request.messages.length-1,activeMessage=request.messages[activeUserMessageIndex],activeUserMessage=activeMessage?.role==="user"?activeMessage:void 0,userContent,userText="",hasUserImages=!1;activeUserMessage&&(userContent=activeUserMessage.content,typeof userContent=="string"?userText=userContent.trim():(userText=extractText(userContent),hasUserImages=hasImages(userContent)));let action=create(ConversationActionSchema,{action:!state.forceResumeAction&&userContent&&(userText.trim().length>0||hasUserImages)?{case:"userMessageAction",value:create(UserMessageActionSchema,{userMessage:createCursorUserMessage2(userContent,userText)})}:{case:"resumeAction",value:create(ResumeActionSchema,{})}}),turns=buildConversationTurns2(request.messages,blobStore,activeUserMessage?activeUserMessageIndex:-1),rootPromptMessagesJson=buildRootPromptMessagesJson2(request.messages,systemPromptIds,blobStore,activeUserMessage?activeUserMessageIndex:-1),cachedPromptHead=state.conversationState?.rootPromptMessagesJson?.slice(0,systemPromptIds.length)??[],hasMatchingPrompt=cachedPromptHead.length===systemPromptIds.length&&systemPromptIds.every((id,idx)=>Buffer.from(cachedPromptHead[idx]).equals(id)),baseState=state.conversationState&&hasMatchingPrompt?state.conversationState:create(ConversationStateStructureSchema,{rootPromptMessagesJson:systemPromptIds,turns:[],todos:[],pendingToolCalls:[],previousWorkspaceUris:[],fileStates:{},fileStatesV2:{},summaryArchives:[],turnTimings:[],subagentStates:{},selfSummaryCount:0,readPaths:[]}),conversationState=create(ConversationStateStructureSchema,{...baseState,rootPromptMessagesJson,turns}),requestedModel=state.pinnedRequestedModel??buildRequestedModel(model,options?.thinkingSelection),wireModelId=requestedModel.modelId,cursorMaxMode=model.compat?.cursorMaxMode===!0,modelDetails=state.pinnedModelDetails??create(ModelDetailsSchema,{modelId:wireModelId,displayModelId:model.id,displayName:model.name,...cursorMaxMode?{maxMode:!0}:void 0}),runRequest=create(AgentRunRequestSchema,{conversationState,action,modelDetails,requestedModel,conversationId:state.conversationId});options?.customSystemPrompt&&(runRequest.customSystemPrompt=options.customSystemPrompt),await options?.onPayload?.(runRequest,model);let clientMessage=create(AgentClientMessageSchema,{message:{case:"runRequest",value:runRequest}}),requestBytes=toBinary(AgentClientMessageSchema,clientMessage);return log("info","builtRunRequest",{bytes:requestBytes.length,tools:request.tools.length}),{requestBytes,blobStore,conversationState,requestedModel,modelDetails}}function hasImages(content){return content.some(item=>item.type==="image")}function extractText(content){return content.filter(c=>c.type==="text").map(c=>c.text).join(`
|
|
43
43
|
`)}var CURSOR_GET_USABLE_MODELS_PATH="/agent.v1.AgentService/GetUsableModels",CURSOR_DEFAULT_CONTEXT_WINDOW=2e5,CURSOR_DEFAULT_MAX_TOKENS=64e3,CURSOR_1M_CONTEXT_WINDOW=1e6,CURSOR_1M_NAME_PATTERN=/\b1m\b/i,CURSOR_MAX_MODE_1M_ID_PATTERN=/claude|gemini/;async function fetchCursorUsableModels(options){let timeoutMs=options.timeoutMs??1e4;try{let requestPayload=create(GetUsableModelsRequestSchema,{customModelIds:[]}),body=toBinary(GetUsableModelsRequestSchema,requestPayload),baseUrl=(options.baseUrl??CURSOR_API_URL).replace(/\/+$/,""),responseBuffer=await new Promise(resolve=>{let client=http2.connect(baseUrl),timer=setTimeout(()=>{client.destroy(),resolve(null)},timeoutMs),abort=()=>{clearTimeout(timer),client.destroy(),resolve(null)};options.signal?.addEventListener("abort",abort,{once:!0}),client.on("error",()=>{clearTimeout(timer),resolve(null)});let req=client.request({":method":"POST",":path":CURSOR_GET_USABLE_MODELS_PATH,"content-type":"application/proto",te:"trailers",authorization:`Bearer ${options.apiKey}`,"x-ghost-mode":"true","x-cursor-client-version":CURSOR_CLIENT_VERSION,"x-cursor-client-type":"cli"}),chunks=[];req.on("data",chunk=>chunks.push(chunk)),req.on("end",()=>{clearTimeout(timer),client.close(),resolve(new Uint8Array(Buffer.concat(chunks)))}),req.on("error",()=>{clearTimeout(timer),client.close(),resolve(null)}),req.on("response",headers=>{let status=Number(headers[":status"]??0);(status<200||status>=300)&&(clearTimeout(timer),client.close(),resolve(null))}),body.length>0?req.end(Buffer.from(body)):req.end()});if(!responseBuffer||responseBuffer.length===0)return null;let decoded=decodeGetUsableModelsResponse(responseBuffer);if(!decoded)return null;let byId=new Map;for(let model of decoded.models??[]){let id=model.modelId?.trim();if(!id)continue;let name=pickModelDisplayName(model,id),labeled1M=CURSOR_1M_NAME_PATTERN.test(id)||[model.displayName,model.displayNameShort,model.displayModelId,...model.aliases??[]].some(candidate=>typeof candidate=="string"&&CURSOR_1M_NAME_PATTERN.test(candidate)),maxMode=model.maxMode===!0,contextWindow=labeled1M||maxMode&&CURSOR_MAX_MODE_1M_ID_PATTERN.test(id)?CURSOR_1M_CONTEXT_WINDOW:CURSOR_DEFAULT_CONTEXT_WINDOW;byId.set(id,{id,name,reasoning:!!model.thinkingDetails,input:cursorDiscoveredInput(id),contextWindow,maxTokens:CURSOR_DEFAULT_MAX_TOKENS,cursorMaxMode:maxMode})}return[...byId.values()].sort((a,b)=>a.id.localeCompare(b.id))}catch{return null}}function decodeGetUsableModelsResponse(payload){let framedBody=decodeConnectUnaryBody(payload);if(framedBody)try{return fromBinary(GetUsableModelsResponseSchema,framedBody)}catch{return null}try{return fromBinary(GetUsableModelsResponseSchema,payload)}catch{return null}}function decodeConnectUnaryBody(payload){if(payload.length<5)return null;let offset=0;for(;offset+5<=payload.length;){let flags=payload[offset],messageLength=new DataView(payload.buffer,payload.byteOffset+offset,payload.byteLength-offset).getUint32(1,!1),frameEnd=offset+5+messageLength;if(frameEnd>payload.length||(flags&1)!==0)return null;if(!((flags&2)!==0))return payload.subarray(offset+5,frameEnd);offset=frameEnd}return null}function pickModelDisplayName(model,fallbackId){let candidates=[model.displayName,model.displayNameShort,model.displayModelId,...model.aliases??[]];for(let candidate of candidates){if(typeof candidate!="string")continue;let trimmed=candidate.trim();if(trimmed)return trimmed}return fallbackId}export{CURSOR_API_URL,CURSOR_CLIENT_VERSION,CURSOR_STREAM_HEALTH_FAIL_THRESHOLD_MS,CURSOR_STREAM_HEALTH_HEARTBEAT_ONLY_THRESHOLD_MS,CURSOR_TURN_END_DRAIN_TIMEOUT_MS,buildCursorHistoryForTest,buildCursorHistoryWireBytesForTest,buildCursorSystemPromptJsons,buildMcpToolDefinitions,emptyGrepPatternRejection,ensureUniqueCursorExecToolCallId,fetchCursorUsableModels,flushOpenToolCalls,frameConnectMessage,getCursorConversationCacheStats,handleServerMessage,mapH2TransportError,measureCursorHistorySerializedBytes,measureCursorModelInputSerializedBytes,mergeCursorMcpToolCallArgs,processInteractionUpdate,resolveExecHandler,sanitizeCursorCallerHeaders,sanitizeCursorToolSchema,stream,streamSimple,synthesizeCursorExecToolCall};
|