@code-yeongyu/senpi 2026.11.6-2 → 2026.11.9
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 +52 -0
- package/dist/bundle/chunks/{bun-extension-importer-RCGPQTI2.js → bun-extension-importer-GQ6IKEXD.js} +2 -2
- package/dist/bundle/chunks/{chunk-GSKCWXXG.js → chunk-3CRPNPTR.js} +1 -1
- package/dist/bundle/chunks/{chunk-RQ6CHXQ2.js → chunk-3TZQXZKH.js} +1 -1
- package/dist/bundle/chunks/{chunk-QN2BHP3M.js → chunk-44BJPS5I.js} +1 -1
- package/dist/bundle/chunks/{chunk-WGRKM3N6.js → chunk-45MVD7BU.js} +1 -1
- package/dist/bundle/chunks/chunk-4JIBEZZE.js +106 -0
- package/dist/bundle/chunks/{chunk-CF5OGBC4.js → chunk-4NYNMAYF.js} +1 -1
- package/dist/bundle/chunks/{chunk-X5ZVYNOL.js → chunk-4UR6UFBH.js} +1 -1
- package/dist/bundle/chunks/{chunk-LNPAT22L.js → chunk-527Q2UYM.js} +9 -8
- package/dist/bundle/chunks/{chunk-HLM46XEB.js → chunk-622VYTRI.js} +1 -1
- package/dist/bundle/chunks/{chunk-GKAYPJ4E.js → chunk-7PROV6BB.js} +1 -1
- package/dist/bundle/chunks/{chunk-4E7GDG4H.js → chunk-7VMEE62L.js} +1 -1
- package/dist/bundle/chunks/{chunk-ECW7VBMB.js → chunk-HXNXISJD.js} +1 -1
- package/dist/bundle/chunks/{chunk-C7OKUC7L.js → chunk-K3UHGDUQ.js} +1 -1
- package/dist/bundle/chunks/{chunk-47PPZKPO.js → chunk-LM6DOWQH.js} +4 -4
- package/dist/bundle/chunks/chunk-LPYBKMPT.js +2 -0
- package/dist/bundle/chunks/{chunk-2FDW2LQL.js → chunk-M7GF73FO.js} +2 -2
- package/dist/bundle/chunks/{chunk-D5MRJWUK.js → chunk-OCMGRBJ5.js} +221 -229
- package/dist/bundle/chunks/{chunk-TIPKAMSS.js → chunk-SGAFIMAU.js} +1 -1
- package/dist/bundle/chunks/{chunk-7PSBD5KS.js → chunk-STGOYIXC.js} +1 -1
- package/dist/bundle/chunks/{chunk-DSWDJ7HT.js → chunk-WQ4RBPMS.js} +1 -1
- package/dist/bundle/chunks/{chunk-7III44PV.js → chunk-WX2HB4DD.js} +1 -1
- package/dist/bundle/chunks/chunk-XZDCMDUH.js +2 -0
- package/dist/bundle/chunks/{chunk-GNSMNSL7.js → chunk-Y5L4UFMI.js} +2 -2
- package/dist/bundle/chunks/{cli-main-T74YJGIF.js → cli-main-E4NDWAUD.js} +1 -1
- package/dist/bundle/chunks/{dispatch-BAK2YZKD.js → dispatch-VDIYSXQN.js} +1 -1
- package/dist/bundle/chunks/{hand-entry-AYRUGE2A.js → hand-entry-5X5Z5Y3D.js} +1 -1
- package/dist/bundle/chunks/{headless-host-ES74ZB6M.js → headless-host-YXUGONR3.js} +1 -1
- package/dist/bundle/chunks/{host-command-YRXZE4TV.js → host-command-VHX2ILLM.js} +1 -1
- package/dist/bundle/chunks/{host-session-command-N7IN7ZDV.js → host-session-command-P3MRW63Z.js} +1 -1
- package/dist/bundle/chunks/interactive-mode-XUSBLLWI.js +2 -0
- package/dist/bundle/chunks/main-3TWVKTJN.js +2 -0
- package/dist/bundle/chunks/{multi-session-host-XSUJDHFZ.js → multi-session-host-HRGM66PY.js} +20 -17
- package/dist/bundle/chunks/{package-manager-cli-GLUNPQJU.js → package-manager-cli-WSH7U4YE.js} +1 -1
- package/dist/bundle/chunks/{role-RRFFHZF5.js → role-4BUU46VW.js} +3 -3
- package/dist/bundle/chunks/{rotation-stream-BN2YK2MC.js → rotation-stream-TODBIHXJ.js} +1 -1
- package/dist/bundle/chunks/rpc-mode-OAPIV46G.js +2 -0
- package/dist/bundle/chunks/{run-attached-tui-W236SEOR.js → run-attached-tui-MXCC5IZR.js} +1 -1
- package/dist/bundle/chunks/{runtime-session-OBXYK4PI.js → runtime-session-VO3X4OE3.js} +1 -1
- package/dist/bundle/chunks/{schedule-command-B2EJTBOE.js → schedule-command-MX56D6UE.js} +1 -1
- package/dist/bundle/chunks/{session-control-endpoint-YIMLHGLG.js → session-control-endpoint-IL6ERD4U.js} +1 -1
- package/dist/bundle/chunks/{session-picker-E6ZONUJB.js → session-picker-6VRC25MJ.js} +1 -1
- package/dist/bundle/chunks/session-worker.js +114 -110
- package/dist/bundle/cli.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/core/agent-session-runtime.d.ts +2 -0
- package/dist/core/agent-session-runtime.js +9 -2
- package/dist/core/agent-session-services.d.ts +2 -0
- package/dist/core/agent-session-services.js +1 -0
- package/dist/core/agent-session.d.ts +32 -3
- package/dist/core/agent-session.js +142 -29
- package/dist/core/credential-pool/rotation-slots.d.ts +3 -3
- package/dist/core/credential-pool/state-store.d.ts +1 -1
- package/dist/core/egress/classify.d.ts +8 -3
- package/dist/core/egress/classify.js +177 -158
- package/dist/core/egress/console-redactor.d.ts +7 -0
- package/dist/core/egress/console-redactor.js +74 -0
- package/dist/core/egress/credentials.d.ts +73 -0
- package/dist/core/egress/credentials.js +20 -0
- package/dist/core/egress/device-custody.d.ts +1 -1
- package/dist/core/egress/device-custody.js +18 -15
- package/dist/core/egress/device-proxy-call.d.ts +59 -0
- package/dist/core/egress/device-proxy-call.js +148 -0
- package/dist/core/egress/device-proxy-lost-calls.d.ts +27 -0
- package/dist/core/egress/device-proxy-lost-calls.js +28 -0
- package/dist/core/egress/device-proxy-ports.d.ts +49 -0
- package/dist/core/egress/device-proxy-ports.js +2 -0
- package/dist/core/egress/device-proxy-request.d.ts +34 -0
- package/dist/core/egress/device-proxy-request.js +69 -0
- package/dist/core/egress/device-proxy-waits.d.ts +40 -0
- package/dist/core/egress/device-proxy-waits.js +67 -0
- package/dist/core/egress/device-proxy.d.ts +3 -0
- package/dist/core/egress/device-proxy.js +214 -0
- package/dist/core/egress/endpoint.js +2 -1
- package/dist/core/egress/entry-verify.d.ts +13 -0
- package/dist/core/egress/entry-verify.js +33 -0
- package/dist/core/egress/hpke.d.ts +63 -0
- package/dist/core/egress/hpke.js +192 -0
- package/dist/core/egress/key-policy-template.d.ts +7 -1
- package/dist/core/egress/ledger-schema.d.ts +80 -0
- package/dist/core/egress/ledger-schema.js +117 -0
- package/dist/core/egress/ledger.d.ts +55 -0
- package/dist/core/egress/ledger.js +159 -0
- package/dist/core/egress/pinned-infra.d.ts +23 -2
- package/dist/core/egress/pinned-infra.js +9 -2
- package/dist/core/egress/placement-claim.d.ts +69 -0
- package/dist/core/egress/placement-claim.js +115 -0
- package/dist/core/egress/pool-state.d.ts +18 -0
- package/dist/core/egress/pool-state.js +5 -0
- package/dist/core/egress/redact.d.ts +10 -0
- package/dist/core/egress/redact.js +134 -0
- package/dist/core/egress/sealed-format.d.ts +101 -0
- package/dist/core/egress/sealed-format.js +174 -0
- package/dist/core/egress/sealed-source.d.ts +35 -0
- package/dist/core/egress/sealed-source.js +140 -0
- package/dist/core/egress/verified-keys.js +1 -1
- package/dist/core/egress/wire.d.ts +228 -0
- package/dist/core/egress/wire.js +49 -0
- package/dist/core/extensions/builtin/ask-user/escape-residue.d.ts +50 -0
- package/dist/core/extensions/builtin/ask-user/escape-residue.js +113 -0
- package/dist/core/extensions/builtin/ask-user/extension.js +7 -1
- package/dist/core/extensions/builtin/ask-user/resume.js +2 -1
- package/dist/core/extensions/builtin/ask-user/tool.d.ts +3 -0
- package/dist/core/extensions/builtin/ask-user/tool.js +8 -0
- package/dist/core/extensions/builtin/goal/index.js +46 -0
- package/dist/core/extensions/builtin/goal/stop-pause.d.ts +1 -0
- package/dist/core/extensions/builtin/goal/stop-pause.js +4 -2
- package/dist/core/extensions/builtin/monitor-state-event.d.ts +26 -0
- package/dist/core/extensions/builtin/monitor-state-event.js +2 -0
- package/dist/core/extensions/builtin/permission-system/index.js +10 -4
- package/dist/core/extensions/builtin/permission-system/preset-registry.d.ts +2 -0
- package/dist/core/extensions/builtin/permission-system/preset-registry.js +11 -0
- package/dist/core/extensions/builtin/permission-system/settings.d.ts +2 -0
- package/dist/core/extensions/builtin/permission-system/settings.js +10 -1
- package/dist/core/extensions/builtin/terminal/background-age.d.ts +25 -0
- package/dist/core/extensions/builtin/terminal/background-age.js +91 -0
- package/dist/core/extensions/builtin/terminal/extension-state.d.ts +1 -1
- package/dist/core/extensions/builtin/terminal/extension-state.js +21 -3
- package/dist/core/extensions/builtin/terminal/notify.d.ts +6 -0
- package/dist/core/extensions/builtin/terminal/notify.js +39 -5
- package/dist/core/extensions/builtin/terminal/session-bundle.d.ts +9 -2
- package/dist/core/extensions/builtin/terminal/session-bundle.js +36 -1
- package/dist/core/extensions/builtin/terminal/settings.d.ts +2 -0
- package/dist/core/extensions/builtin/terminal/settings.js +8 -0
- package/dist/core/extensions/builtin/terminal/tools/background-auto-reap.d.ts +15 -0
- package/dist/core/extensions/builtin/terminal/tools/background-auto-reap.js +87 -0
- package/dist/core/extensions/builtin/terminal/tools/bash.d.ts +3 -1
- package/dist/core/extensions/builtin/terminal/tools/bash.js +44 -15
- package/dist/core/extensions/builtin/terminal/tools/child-placement.d.ts +8 -0
- package/dist/core/extensions/builtin/terminal/tools/child-placement.js +43 -6
- package/dist/core/extensions/builtin/terminal/tools/context.d.ts +14 -2
- package/dist/core/extensions/bun-extension-importer.js +4 -3
- package/dist/core/extensions/bun-extension-load-turns.d.ts +4 -0
- package/dist/core/extensions/bun-extension-load-turns.js +45 -0
- package/dist/core/extensions/bun-extension-registry.d.ts +1 -0
- package/dist/core/extensions/bun-extension-registry.js +19 -1
- package/dist/core/extensions/loader.js +5 -0
- package/dist/core/extensions/session-control-types.d.ts +15 -0
- package/dist/core/extensions/session-control-types.js +11 -0
- package/dist/core/extensions/session-dialog-api.d.ts +5 -0
- package/dist/core/extensions/session-dialog-api.js +13 -0
- package/dist/core/extensions/types.d.ts +14 -1
- package/dist/core/external-admission.d.ts +16 -2
- package/dist/core/external-admission.js +22 -4
- package/dist/core/permission-decision.d.ts +22 -0
- package/dist/core/permission-decision.js +53 -0
- package/dist/core/permission-mode.d.ts +56 -0
- package/dist/core/permission-mode.js +133 -0
- package/dist/core/retry-fallback/controller-types.d.ts +6 -0
- package/dist/core/retry-fallback/controller.d.ts +9 -0
- package/dist/core/retry-fallback/controller.js +34 -3
- package/dist/core/retry-fallback/unusable.d.ts +25 -1
- package/dist/core/retry-fallback/unusable.js +87 -2
- package/dist/core/retry-fallback/usage-limit.d.ts +6 -1
- package/dist/core/retry-fallback/usage-limit.js +12 -4
- package/dist/core/sdk.d.ts +6 -1
- package/dist/core/sdk.js +3 -0
- package/dist/core/session-log.js +1 -1
- package/dist/core/stall-warning.d.ts +41 -0
- package/dist/core/stall-warning.js +72 -0
- package/dist/core/terminal-settings.d.ts +1 -0
- package/dist/core/turn-origin.d.ts +31 -0
- package/dist/core/turn-origin.js +64 -0
- package/dist/modes/interactive/components/remote-delivery-message.d.ts +2 -1
- package/dist/modes/interactive/components/remote-delivery-message.js +13 -5
- package/dist/modes/rpc/admit-external-message-command.d.ts +37 -0
- package/dist/modes/rpc/admit-external-message-command.js +61 -0
- package/dist/modes/rpc/admit-external-message-wire.d.ts +42 -0
- package/dist/modes/rpc/admit-external-message-wire.js +55 -0
- package/dist/modes/rpc/client-input-handler.d.ts +2 -0
- package/dist/modes/rpc/client-input-handler.js +2 -0
- package/dist/modes/rpc/connection-handler.js +30 -5
- package/dist/modes/rpc/connection-roles.d.ts +6 -0
- package/dist/modes/rpc/connection-roles.js +13 -0
- package/dist/modes/rpc/delegated-drive-origin.d.ts +9 -0
- package/dist/modes/rpc/delegated-drive-origin.js +16 -0
- package/dist/modes/rpc/effect-commands.d.ts +7 -1
- package/dist/modes/rpc/host-bare-endpoint-registration.d.ts +7 -0
- package/dist/modes/rpc/host-bare-endpoint-registration.js +35 -0
- package/dist/modes/rpc/host-capabilities.d.ts +2 -0
- package/dist/modes/rpc/host-capabilities.js +3 -0
- package/dist/modes/rpc/host-handover-parked.d.ts +11 -0
- package/dist/modes/rpc/host-handover-parked.js +17 -0
- package/dist/modes/rpc/host-handover-reopen.js +18 -6
- package/dist/modes/rpc/host-handover-resident-writer.d.ts +16 -0
- package/dist/modes/rpc/host-handover-resident-writer.js +57 -0
- package/dist/modes/rpc/host-idle-handover.js +1 -0
- package/dist/modes/rpc/host-warm.d.ts +16 -1
- package/dist/modes/rpc/host-warm.js +33 -6
- package/dist/modes/rpc/method-classes-schema-delivery.d.ts +32 -0
- package/dist/modes/rpc/method-classes-schema-delivery.js +22 -0
- package/dist/modes/rpc/method-classes-schema-session.d.ts +36 -0
- package/dist/modes/rpc/method-classes-schema-session.js +3 -0
- package/dist/modes/rpc/method-classes-schema.d.ts +36 -0
- package/dist/modes/rpc/method-classes.d.ts +2 -0
- package/dist/modes/rpc/method-classes.js +4 -0
- package/dist/modes/rpc/multi-session-host.js +6 -1
- package/dist/modes/rpc/permission-preset-command.d.ts +6 -0
- package/dist/modes/rpc/permission-preset-command.js +27 -0
- package/dist/modes/rpc/rpc-input-validation.js +4 -3
- package/dist/modes/rpc/rpc-mutation-response-types.d.ts +7 -0
- package/dist/modes/rpc/rpc-response-types.d.ts +2 -1
- package/dist/modes/rpc/rpc-session-command-types.d.ts +6 -1
- package/dist/modes/rpc/rpc-session-event-types.d.ts +5 -2
- package/dist/modes/rpc/rpc-session-state-types.d.ts +2 -1
- package/dist/modes/rpc/rpc-session-state.js +2 -0
- package/dist/modes/rpc/session-attachment-commands.js +3 -3
- package/dist/modes/rpc/session-event-writer-connections.js +1 -0
- package/dist/modes/rpc/session-event-writer.d.ts +1 -1
- package/dist/modes/rpc/session-registry-attach.d.ts +0 -9
- package/dist/modes/rpc/session-registry-attach.js +16 -3
- package/dist/modes/rpc/session-registry-types.d.ts +2 -0
- package/dist/modes/rpc/session-registry.d.ts +2 -0
- package/dist/modes/rpc/session-registry.js +16 -3
- package/dist/modes/rpc/session-router-close.js +43 -6
- package/dist/modes/rpc/session-router-context.js +2 -0
- package/dist/modes/rpc/session-router-occupancy.js +2 -11
- package/dist/modes/rpc/session-router-open-profile.js +4 -0
- package/dist/modes/rpc/session-router-open.d.ts +1 -1
- package/dist/modes/rpc/session-router-open.js +6 -17
- package/dist/modes/rpc/session-router-residency.d.ts +24 -0
- package/dist/modes/rpc/session-router-residency.js +90 -0
- package/dist/modes/rpc/session-router-routing.js +7 -1
- package/dist/modes/rpc/session-status.js +4 -1
- package/dist/modes/rpc/session-worker.js +4 -0
- package/dist/modes/rpc/tool-child/terminal-jobs.d.ts +1 -0
- package/dist/modes/rpc/tool-child/terminal-jobs.js +17 -1
- package/dist/modes/rpc/worker-session-registry.js +5 -2
- package/docs/engine-socket/fixtures/admission-routes/h-legacy.json +1 -1
- package/docs/engine-socket/fixtures/rpc-inbound-samples.json +29 -2
- package/docs/extensions.md +12 -0
- package/docs/rpc.md +129 -12
- package/docs/terminal-tools.md +25 -1
- package/native/socket-secret/prebuilds/win32-arm64/senpi_socket_secret.win32-arm64.node +0 -0
- package/native/socket-secret/prebuilds/win32-x64/senpi_socket_secret.win32-x64.node +0 -0
- package/package.json +6 -6
- package/dist/bundle/chunks/chunk-C7HEEBFH.js +0 -2
- package/dist/bundle/chunks/chunk-XCMII2VQ.js +0 -98
- package/dist/bundle/chunks/interactive-mode-B5SQDLH7.js +0 -2
- package/dist/bundle/chunks/main-UQFVFCNY.js +0 -2
- package/dist/bundle/chunks/rpc-mode-JYN3E7P7.js +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
|
|
2
|
-
import{AssistantMessageFrameEncoder,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,TOOL_RESULT_PLACEHOLDER,dropFailedAssistantTurns,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isRecoverableLength,reduceAssistantMessageFrames,require_dist,shouldRecoverTextToolCalls,validateToolArguments}from"./chunk-YUVC7SJB.js";import{supportsAllowedToolChoice}from"./chunk-COH5F7QV.js";import{uuidv7}from"./chunk-Y7QPP7BG.js";import{resolveToolNameMatch}from"./chunk-QTS2XGPQ.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{DEFAULT_MAX_AGENT_RETRY_DELAY_MS,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,OAUTH_REFRESH_UNAVAILABLE_DIAGNOSTIC,contentText,createInitialSystemMessage,getCurrentTools,getToolStateChanges,isOAuthRefreshUnavailableError,isRetryableAssistantError,normalizeContext,retryAssistantCall,retryDelayMs}from"./chunk-OKMHSVCA.js";import{readProviderDiagnostic,sanitizeProviderDiagnostic}from"./chunk-JGKH3D6W.js";import{EventStream,assistantEvents,assistantRecords,carryAssistantCapture,createAssistantMessageEventStream,getAssistantCapture,isAssistantProgress,pushAssistantProgress,sanitizeProviderErrorMessage,subscribeAssistantCapture}from"./chunk-NDNQ23SK.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{typebox_exports}from"./chunk-MIENF2YK.js";import{__commonJS,__export,__toESM}from"./chunk-IKOFCODM.js";var require_ignore=__commonJS({"node_modules/ignore/index.js"(exports,module){function makeArray(subject){return Array.isArray(subject)?subject:[subject]}var UNDEFINED=void 0,EMPTY="",SPACE=" ",ESCAPE="\\",REGEX_LITERAL_SPECIAL=/[.*+?()[\]{}^$|\\/]/,REGEX_TEST_BLANK_LINE=/^\uFEFF? *$/,REGEX_INVALID_TRAILING_BACKSLASH=/(?:[^\\]|^)\\$/,REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION=/^\\!/,REGEX_REPLACE_LEADING_EXCAPED_HASH=/^\\#/,REGEX_SPLITALL_CRLF=/\r?\n/g,DOUBLE_SLASH="//",SLASH_CODE=47,DOT_CODE=46,SLASH="/",TMP_KEY_IGNORE="node-ignore";typeof Symbol<"u"&&(TMP_KEY_IGNORE=Symbol.for("node-ignore"));var KEY_IGNORE=TMP_KEY_IGNORE,define=(object3,key,value2)=>(Object.defineProperty(object3,key,{value:value2}),value2),RETURN_FALSE=()=>!1,cleanRangeBackSlash=slashes=>{let{length}=slashes;return slashes.slice(0,length-length%2)},POSIX_CLASSES={alnum:"0-9A-Za-z",alpha:"A-Za-z",blank:" \\t",cntrl:"\\x00-\\x1f\\x7f",digit:"0-9",graph:"!-.0-~",lower:"a-z",print:" -.0-~",punct:"!-.:-@\\[-`{-~",space:" \\t\\n\\r",upper:"A-Z",xdigit:"0-9A-Fa-f"},CLASS_MEMBERS_TO_ESCAPE="\\]^-[",escapeMember=char=>CLASS_MEMBERS_TO_ESCAPE.indexOf(char)<0?char:ESCAPE+char,NON_SLASH="(?!\\/)",classSource=(negated,body)=>{if(negated)return`[^\\/${body}]`;let source=`[${body}]`;return new RegExp(source).test("/")?NON_SLASH+source:source},scanBracket=(pattern,start)=>{let{length}=pattern,index=start+1,negated=EMPTY,lead=pattern[index];(lead==="!"||lead==="^")&&(negated="^",index++);let body=EMPTY,prev=EMPTY;for(;;){let char=pattern[index];if(char===UNDEFINED)return null;if(char===ESCAPE){let escaped=pattern[index+1];if(escaped===UNDEFINED)return null;body+=escapeMember(escaped),prev=escaped,index++}else if(char==="-"&&prev&&index+1<length&&pattern[index+1]!=="]"){index++;let to=pattern[index];to===ESCAPE&&(to=pattern[index+=1]),prev<=to&&(body+=`-${escapeMember(to)}`),prev=EMPTY}else if(char==="["&&pattern[index+1]===":"){let nameStart=index+2,end=nameStart;for(;end<length&&pattern[end]!=="]";)end++;if(end===length)return null;if(end>nameStart&&pattern[end-1]===":"){let expanded=POSIX_CLASSES[pattern.slice(nameStart,end-1)];if(expanded===UNDEFINED)return null;body+=expanded,prev=EMPTY,index=end}else body+=escapeMember("["),prev="[",index=nameStart-2}else body+=escapeMember(char),prev=char;if(index++,pattern[index]==="]")return{end:index,source:classSource(negated,body)}}},NEVER_MATCH="[]",PLACEHOLDER="\0",REGEX_RESTORE_PLACEHOLDER=new RegExp(`${PLACEHOLDER}(\\d+)${PLACEHOLDER}`,"g"),TRAILING_WILDCARD="\uE000",extractBrackets=pattern=>{let sources=[],hold=source=>`${PLACEHOLDER}${sources.push(source)-1}${PLACEHOLDER}`,{length}=pattern,out=EMPTY,index=0;for(;index<length;){let char=pattern[index];if(char===ESCAPE){let escaped=pattern[index+1];escaped==="*"||escaped==="["||escaped===SPACE||escaped===ESCAPE?out+=pattern.slice(index,index+2):out+=hold(REGEX_LITERAL_SPECIAL.test(escaped)?ESCAPE+escaped:escaped),index+=2}else if(char===PLACEHOLDER)out+=hold(`[${PLACEHOLDER}]`),index++;else if(char==="["){let scanned=scanBracket(pattern,index);scanned===null?(out+=hold(NEVER_MATCH),index=length):(out+=hold(scanned.source),index=scanned.end+1)}else out+=char,index++}return{source:out,sources}},DIRECT=null,REGEX_INNER_SLASH=/\/(?!$)/,REPLACERS=[[/^\uFEFF/,()=>EMPTY,"\uFEFF"],[/[\r\n]+$/,()=>EMPTY],[/((?:\\\\)*?)(\\? +)$/,(_,m1,m2)=>m1+(m2.indexOf("\\")===0?SPACE:EMPTY)],[/(\\+?) /g,(_,m1)=>{let{length}=m1;return m1.slice(0,length-length%2)+SPACE}],[/[\\$.|*+(){^]/g,match=>`\\${match}`],[/(?!\\)\?/g,()=>"[^/]","?"],[/^\//,()=>"^",SLASH],[/\//g,()=>"\\/",SLASH],[/^\^*(?:\\\*\\\*\\\/)+/,()=>"^(?:.*\\/)?","*"],[DIRECT,(source,pattern)=>!source||source[0]==="^"?source:(REGEX_INNER_SLASH.test(pattern)?"^":"(?:^|\\/)")+source],[/\\\/\\\*\\\*(?=\\\/|$)/g,(_,index,str)=>index+6<str.length?str.slice(index+6)==="\\/"?"(?:\\/[^\\/]+)+":"(?:\\/[^\\/]+)*":"\\/.+","*"],[/(^|[^\\]+)(\\\*)+(?=.+)/g,(_,p1,p2)=>{let unescaped=p2.replace(/\\\*/g,"[^\\/]*");return p1+unescaped},"*"],[/(^|[^\\])((?:\\\\)*)\\\*$/,(match,p1,p2)=>p2.length/2%2===0?p1+p2+TRAILING_WILDCARD:match,"*"],[/\\\\\\(?=[$.|*+(){^])/g,()=>ESCAPE,ESCAPE+ESCAPE],[/\\\\/g,()=>ESCAPE,ESCAPE+ESCAPE],[/\\\[([^\]/]*?)(\\*)($|\])/g,(match,range,endEscape,close)=>`\\[${range}${cleanRangeBackSlash(endEscape)}${close}`,"["],[DIRECT,source=>{let last=source[source.length-1];return!last||last===TRAILING_WILDCARD?source:last===SLASH?`${source}$`:`${source}(?=$|\\/$)`}]],REGEX_REPLACE_TRAILING_WILDCARD=/(^|\\\/)?\uE000$/,MODE_IGNORE="regex",MODE_CHECK_IGNORE="checkRegex",UNDERSCORE="_",TRAILING_WILD_CARD_REPLACERS={[MODE_IGNORE](_,p1){return`${p1?`${p1}[^/]+`:"[^/]*"}(?=$|\\/$)`},[MODE_CHECK_IGNORE](_,p1){return`${p1?`${p1}[^/]*`:"[^/]*"}(?=$|\\/$)`}},WILDCARD="[^\\/]*",pinWildcards=source=>{if(source.indexOf(WILDCARD)<0)return source;let tokens=[],{length}=source,index=0;for(;index<length;){let char=source[index];if(source.startsWith(WILDCARD,index))tokens.push({wildcard:!0}),index+=WILDCARD.length;else if(char==="["){let end=index+1;for(source[end]==="^"&&end++,source[end]==="]"&&end++;end<length&&source[end]!=="]";)end+=source[end]===ESCAPE?2:1;end++,tokens.push({single:source.slice(index,end)}),index=end}else if(char===ESCAPE)tokens.push({single:source.slice(index,index+2)}),index+=2;else if(char==="("){let depth=0,end=index;do source[end]===ESCAPE?end++:source[end]==="("?depth++:source[end]===")"&&depth--,end++;while(end<length&&depth>0);"*+?".indexOf(source[end])>=0&&end++,tokens.push({boundary:source.slice(index,end)}),index=end}else char==="^"||char==="$"?(tokens.push({boundary:char}),index++):(tokens.push({single:char}),index++)}let out=EMPTY,run=[],flush=()=>{let lastWildcard;run.forEach((token,at)=>{token.wildcard&&(lastWildcard=at)}),run.forEach((token,at)=>{if(!token.wildcard){out+=token.single;return}out+=at===lastWildcard?WILDCARD:`(?:(?!${run[at+1].single})[^\\/])*`}),run=[]};return tokens.forEach(token=>{if(token.boundary===void 0){run.push(token);return}flush(),out+=token.boundary}),flush(),out},makeRegexPrefix=pattern=>{let{source,sources}=extractBrackets(pattern),replaced=REPLACERS.reduce((prev,[matcher,replacer,required])=>matcher===DIRECT?replacer(prev,pattern):required!==UNDEFINED&&prev.indexOf(required)<0?prev:matcher.test(prev)?prev.replace(matcher,replacer.bind(pattern)):prev,source);return sources.length?replaced.replace(REGEX_RESTORE_PLACEHOLDER,(match,index)=>sources[index]):replaced},matchesBasename=body=>{let index=body.indexOf(SLASH);return index<0||index===body.length-1},basenameOf=path=>{let end=path.length-1,index=path.lastIndexOf(SLASH,path[end]===SLASH?end-1:end);return index<0?path:path.slice(index+1)},parentOf=path=>{if(path.charCodeAt(0)===SLASH_CODE||path.indexOf(DOUBLE_SLASH)>=0){let slices=path.split(SLASH).filter(Boolean);return slices.pop(),slices.length?slices.join(SLASH)+SLASH:EMPTY}let end=path.length-1,cut=path.lastIndexOf(SLASH,path.charCodeAt(end)===SLASH_CODE?end-1:end);return cut<0?EMPTY:path.slice(0,cut+1)},isString2=subject=>typeof subject=="string",checkPattern=pattern=>pattern&&isString2(pattern)&&!REGEX_TEST_BLANK_LINE.test(pattern)&&!REGEX_INVALID_TRAILING_BACKSLASH.test(pattern)&&pattern.indexOf("#")!==0,splitPattern=pattern=>pattern.split(REGEX_SPLITALL_CRLF).filter(Boolean),IgnoreRule=class{constructor(pattern,mark,body,ignoreCase,negative,prefix){this.pattern=pattern,this.mark=mark,this.negative=negative,define(this,"body",body),define(this,"ignoreCase",ignoreCase),define(this,"regexPrefix",prefix)}get _basenameOnly(){return define(this,"_basenameOnly",matchesBasename(this.body))}get regex(){let key=UNDERSCORE+MODE_IGNORE;return this[key]?this[key]:this._make(MODE_IGNORE,key)}get checkRegex(){let key=UNDERSCORE+MODE_CHECK_IGNORE;return this[key]?this[key]:this._make(MODE_CHECK_IGNORE,key)}_make(mode,key){let str=pinWildcards(this.regexPrefix.replace(REGEX_REPLACE_TRAILING_WILDCARD,TRAILING_WILD_CARD_REPLACERS[mode])),regex=this.ignoreCase?new RegExp(str,"i"):new RegExp(str);return define(this,key,regex)}},createRule=({pattern,mark},ignoreCase)=>{let negative=!1,body=pattern;body.indexOf("!")===0&&(negative=!0,body=body.substr(1)),body=body.replace(REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION,"!").replace(REGEX_REPLACE_LEADING_EXCAPED_HASH,"#");let regexPrefix=makeRegexPrefix(body);return new IgnoreRule(pattern,mark,body,ignoreCase,negative,regexPrefix)},RuleManager=class{constructor(ignoreCase){this._ignoreCase=ignoreCase,this._rules=[],this._basenameCount=0}_add(pattern){if(pattern&&pattern[KEY_IGNORE]){this._rules=this._rules.concat(pattern._rules._rules),this._basenameCount+=pattern._rules._basenameCount,this._added=!0;return}if(isString2(pattern)&&(pattern={pattern}),checkPattern(pattern.pattern)){let rule=createRule(pattern,this._ignoreCase);this._added=!0,this._rules.push(rule),matchesBasename(rule.body)&&this._basenameCount++}}add(pattern){return this._added=!1,makeArray(isString2(pattern)?splitPattern(pattern):pattern).forEach(this._add,this),this._added}test(path,checkUnignored,mode){let ignored=!1,unignored=!1,matchedRule,rules=this._rules,{length}=rules,shortcut=this._basenameCount*2>=length,basename=shortcut?basenameOf(path):path;for(let index=0;index<length;index++){let rule=rules[index],{negative}=rule;!(unignored===negative&&ignored!==unignored||negative&&!ignored&&!unignored&&!checkUnignored)&&rule[mode].test(shortcut&&rule._basenameOnly?basename:path)&&(ignored=!negative,unignored=negative,matchedRule=negative?UNDEFINED:rule)}let ret={ignored,unignored};return matchedRule&&(ret.rule=matchedRule),ret}},throwError=(message,Ctor)=>{throw new Ctor(message)},checkPath=(path,originalPath,doThrow)=>isString2(path)?path?checkPath.isNotRelative(path)?doThrow(`path should be a \`path.relative()\`d string, but got "${originalPath}"`,RangeError):!0:doThrow("path must not be empty",TypeError):doThrow(`path must be a string, but got \`${originalPath}\``,TypeError),isNotRelative=path=>{let first=path.charCodeAt(0);if(first===SLASH_CODE)return!0;if(first!==DOT_CODE)return!1;if(path.length===1)return!0;let second=path.charCodeAt(1);return second===SLASH_CODE?!0:second!==DOT_CODE?!1:path.length===2||path.charCodeAt(2)===SLASH_CODE};checkPath.isNotRelative=isNotRelative;checkPath.convert=p=>p;var Ignore=class{constructor({ignorecase=!0,ignoreCase=ignorecase,allowRelativePaths=!1}={}){define(this,KEY_IGNORE,!0),this._rules=new RuleManager(ignoreCase),this._strictPathCheck=!allowRelativePaths,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}add(pattern){return this._rules.add(pattern)&&this._initCache(),this}addPattern(pattern){return this.add(pattern)}_test(originalPath,cache,checkUnignored){let path=originalPath&&checkPath.convert(originalPath);return checkPath(path,originalPath,this._strictPathCheck?throwError:RETURN_FALSE),this._t(path,cache,checkUnignored)}checkIgnore(path){if(path.charCodeAt(path.length-1)!==SLASH_CODE)return this.test(path);let parentPath=parentOf(path);if(parentPath){let parent=this._t(parentPath,this._testCache,!0);if(parent.ignored)return parent}return this._rules.test(path,!1,MODE_CHECK_IGNORE)}_t(path,cache,checkUnignored){if(path in cache)return cache[path];let parentPath=parentOf(path),parent=parentPath?this._t(parentPath,cache,checkUnignored):UNDEFINED;return cache[path]=parent&&parent.ignored?parent:this._rules.test(path,checkUnignored,MODE_IGNORE)}ignores(path){return this._test(path,this._ignoreCache,!1).ignored}createFilter(){return path=>!this.ignores(path)}filter(paths){return makeArray(paths).filter(this.createFilter())}test(path){return this._test(path,this._testCache,!0)}},factory=options=>new Ignore(options),isPathValid=path=>checkPath(path&&checkPath.convert(path),path,RETURN_FALSE),setupWindows=()=>{let makePosix=str=>/^\\\\\?\\/.test(str)||/["<>|\u0000-\u001F]+/u.test(str)?str:str.replace(/\\/g,"/");checkPath.convert=makePosix;let REGEX_TEST_WINDOWS_PATH_ABSOLUTE=/^[a-z]:\//i;checkPath.isNotRelative=path=>REGEX_TEST_WINDOWS_PATH_ABSOLUTE.test(path)||isNotRelative(path)};typeof process<"u"&&process.platform==="win32"&&setupWindows();module.exports=factory;factory.default=factory;module.exports.isPathValid=isPathValid;define(module.exports,Symbol.for("setupWindows"),setupWindows)}});var LOCAL_DEVICE_FILES=Symbol.for("senpi.device-files.local");function isLocalDeviceFiles(files){return files[LOCAL_DEVICE_FILES]===!0}var FILE_CHANNEL="file/1",FILE_CHANNEL_MAX_BYTES=8*1024*1024,DEVICE_FILE_OPS=["read","write","list","stat","rename","remove","mkdir","run"],RUN_CHANNEL="run/1",DeviceFileError=class extends Error{constructor(code,message,detail={}){super(`${code}: ${message}`),this.name="DeviceFileError",this.code=code,this.reason=detail.reason,this.uncertain=detail.uncertain??!1}},CODES=["not_found","not_a_file","exists","too_large","io","aborted","refused_by_grant","refused_by_policy","hand_unreachable","unsupported","interrupted","protocol"];function isDeviceFileErrorCode(value2){return typeof value2=="string"&&CODES.includes(value2)}var isRecord=value2=>typeof value2=="object"&&value2!==null;function decodeDeviceFileArgs(op,args){if(!isRecord(args)||typeof args.path!="string"||args.path.length===0)return;let path=args.path;switch(op){case"read":case"list":case"stat":case"remove":case"mkdir":return{op,path};case"write":return typeof args.data=="string"?{op,path,data:args.data,exclusive:args.exclusive===!0}:void 0;case"rename":return typeof args.to=="string"&&args.to.length>0?{op,path,to:args.to}:void 0;case"run":return decodeRunArgs(path,args);default:return}}function decodeRunArgs(path,args){let{exe,argv,env,stdin,timeoutMs,activityLock}=args;if(typeof exe!="string"||!Array.isArray(argv)||!argv.every(arg=>typeof arg=="string"))return;let environment=env??{};if(!(!isRecord(environment)||!Object.values(environment).every(value2=>typeof value2=="string"))&&!(stdin!==void 0&&typeof stdin!="string")&&!(timeoutMs!==void 0&&(typeof timeoutMs!="number"||!Number.isSafeInteger(timeoutMs)||timeoutMs<=0))&&!(activityLock!==void 0&&typeof activityLock!="boolean"))return{op:"run",path,exe,argv,env:environment,...stdin===void 0?{}:{stdin},...timeoutMs===void 0?{}:{timeoutMs},activityLock:activityLock===!0}}function encodeBase64(bytes){let binary="";for(let start=0;start<bytes.length;start+=32768)binary+=String.fromCharCode(...bytes.subarray(start,start+32768));return btoa(binary)}function decodeBase64(text){let binary=atob(text),bytes=new Uint8Array(binary.length);for(let index=0;index<binary.length;index++)bytes[index]=binary.charCodeAt(index);return bytes}function base64Length(text){let padding=text.endsWith("==")?2:text.endsWith("=")?1:0;return Math.floor(text.length*3/4)-padding}function fileOutcomeOf(details){if(!isRecord(details)||!isRecord(details.file))return;let file=details.file;if(file.ok===!0&&"value"in file)return{ok:!0,value:file.value};if(file.ok===!1&&isDeviceFileErrorCode(file.code)&&typeof file.message=="string")return{ok:!1,code:file.code,message:file.message}}var PlaneRefusedError=class extends Error{constructor(reason){super(`The brain refused this request: ${reason}`),this.name="PlaneRefusedError",this.reason=reason}},KINDS=["plane.request","plane.abort","plane.reply","plane.refused"],encoder=new TextEncoder,decoder=new TextDecoder;function encodePlaneMessage(message){return encoder.encode(JSON.stringify(message))}var isRecord2=value2=>typeof value2=="object"&&value2!==null,isId=value2=>typeof value2=="string"&&value2.length>0;function decodePlaneMessage(payload){let value2;try{value2=JSON.parse(decoder.decode(payload))}catch{return}if(!isRecord2(value2)||!KINDS.includes(value2.kind)||!isId(value2.parent)||!isId(value2.childRequestId))return;let address={parent:value2.parent,childRequestId:value2.childRequestId};switch(value2.kind){case"plane.request":return isId(value2.plane)&&"body"in value2?{kind:"plane.request",...address,plane:value2.plane,body:value2.body}:void 0;case"plane.abort":return{kind:"plane.abort",...address};case"plane.reply":return"body"in value2?{kind:"plane.reply",...address,body:value2.body}:void 0;default:return typeof value2.reason=="string"?{kind:"plane.refused",...address,reason:value2.reason}:void 0}}function createPlaneServer(options){let served=new Map,send=(lane,message)=>{options.transport.send(lane,encodePlaneMessage(message)).catch(()=>{})},serve=(lane,request)=>{let{parent,childRequestId}=request,refuse2=reason=>send(lane,{kind:"plane.refused",parent,childRequestId,reason}),parentLane=options.liveLane(parent,request.plane);if(parentLane===void 0)return refuse2("parent_terminal");if(parentLane!==lane)return refuse2("scope_lane_mismatch");let children=served.get(parent)??new Map;served.set(parent,children);let known=children.get(childRequestId);if(known!==void 0){known.answer!==void 0&&send(lane,known.answer);return}let handler=Object.hasOwn(options.planes,request.plane)?options.planes[request.plane]:void 0;if(handler===void 0)return refuse2("plane_unavailable");let entry2={controller:new AbortController};children.set(childRequestId,entry2),handler(request.body,entry2.controller.signal).then(body=>({kind:"plane.reply",parent,childRequestId,body}),error=>({kind:"plane.refused",parent,childRequestId,reason:`plane_failed: ${error instanceof Error?error.message:String(error)}`})).then(answer2=>{served.get(parent)?.get(childRequestId)===entry2&&(entry2.answer=answer2,send(lane,answer2))})};return{receive(lane,message){message.kind==="plane.request"?serve(lane,message):message.kind==="plane.abort"&&options.liveLane(message.parent)===lane&&served.get(message.parent)?.get(message.childRequestId)?.controller.abort()},parentEnded(executionId){let children=served.get(executionId);served.delete(executionId);for(let entry2 of children?.values()??[])entry2.controller.abort()}}}function createPlaneClient(options){let mintId=options.mintId??(()=>crypto.randomUUID()),waiting=new Map,live=new Set;return{requestFor(parent,lane,parentSignal){return live.add(parent),(plane,body,signal)=>new Promise((resolve,reject)=>{if(!live.has(parent)||parentSignal.aborted||signal?.aborted)return reject(new PlaneRefusedError("parent_terminal"));let childRequestId=mintId(),children=waiting.get(parent)??new Map;waiting.set(parent,children);let abort=()=>{children.delete(childRequestId)&&(options.transport.send(lane,encodePlaneMessage({kind:"plane.abort",parent,childRequestId})).catch(()=>{}),reject(new Error("Operation aborted")))},release=()=>{parentSignal.removeEventListener("abort",abort),signal?.removeEventListener("abort",abort)};children.set(childRequestId,{resolve:value2=>{release(),resolve(value2)},reject:error=>{release(),reject(error)}}),parentSignal.addEventListener("abort",abort,{once:!0}),signal?.addEventListener("abort",abort,{once:!0});let request={kind:"plane.request",parent,childRequestId,plane,body};options.transport.send(lane,encodePlaneMessage(request)).catch(error=>{children.delete(childRequestId)&&(release(),reject(new PlaneRefusedError(`brain_unreachable: ${error instanceof Error?error.message:String(error)}`)))})})},receive(message){if(message.kind!=="plane.reply"&&message.kind!=="plane.refused")return;let children=waiting.get(message.parent),waiter=children?.get(message.childRequestId);waiter!==void 0&&(children?.delete(message.childRequestId),message.kind==="plane.reply"?waiter.resolve(message.body):waiter.reject(new PlaneRefusedError(message.reason)))},parentEnded(parent){live.delete(parent);let children=waiting.get(parent);waiting.delete(parent);for(let waiter of children?.values()??[])waiter.reject(new PlaneRefusedError("parent_terminal"))}}}function fileCall(message){return{kind:"invoke",executionId:message.executionId,batchId:message.executionId,index:0,scope:message.scope,toolCallId:message.executionId,name:`file.${message.op}`,arguments:message.args,...message.epoch===void 0?{}:{epoch:message.epoch}}}function fileResult(outcome2){return{content:[],details:{file:outcome2},isError:!outcome2.ok}}function fileRefusal(code,message){return fileResult({ok:!1,code,message})}function fileStopped(granted){return granted?fileRefusal("aborted","the operation was aborted"):fileRefusal("refused_by_grant","the grant was revoked")}var HAND_CONTROL_LANE="hand.control",RemoteProtocolError=class extends Error{constructor(message){super(`remote_protocol: ${message}`),this.name="RemoteProtocolError"}},TERMINAL_REASONS=["cancelled","lease_expired","hand_restarted","uncertain"],EPOCH_REFUSALS=["peer_unauthorized","epoch_fenced","epoch_step_exceeded","epoch_unsupported"],encoder2=new TextEncoder,decoder2=new TextDecoder;function encodeRemoteMessage(message){return encoder2.encode(JSON.stringify(message))}var isRecord3=value2=>typeof value2=="object"&&value2!==null,isString=value2=>typeof value2=="string"&&value2.length>0,isEpoch=value2=>typeof value2=="number"&&Number.isSafeInteger(value2)&&value2>=1;function decodeFloorMessage(value2){switch(value2.kind){case"floor":if(!isEpoch(value2.epoch))throw new RemoteProtocolError("malformed floor");return{kind:"floor",epoch:value2.epoch};case"floor_ack":if(!isEpoch(value2.floor))throw new RemoteProtocolError("malformed floor ack");return{kind:"floor_ack",floor:value2.floor};case"floor_refused":if(!EPOCH_REFUSALS.includes(value2.reason))throw new RemoteProtocolError("malformed floor refusal");return{kind:"floor_refused",reason:value2.reason};default:return}}function decodeRemoteMessage(payload){let value2;try{value2=JSON.parse(decoder2.decode(payload))}catch{throw new RemoteProtocolError("payload is not JSON")}if(isRecord3(value2)&&value2.kind==="hello"){let{instance,durable,ops}=value2;if(!isString(instance))throw new RemoteProtocolError("malformed hello");if(durable!==void 0&&typeof durable!="boolean")throw new RemoteProtocolError("malformed hello");if(ops!==void 0&&(!Array.isArray(ops)||!ops.every(isString)))throw new RemoteProtocolError("malformed hello");return{kind:"hello",instance,durable:durable??!0,ops:ops??[]}}let floor=isRecord3(value2)?decodeFloorMessage(value2):void 0;if(floor!==void 0)return floor;if(!isRecord3(value2)||!isString(value2.executionId))throw new RemoteProtocolError("no execution ID");if(value2.epoch!==void 0&&!isEpoch(value2.epoch))throw new RemoteProtocolError("malformed epoch");switch(value2.kind){case"invoke":{let scope=value2.scope;if(!isString(value2.batchId)||typeof value2.index!="number"||!Number.isSafeInteger(value2.index)||value2.index<0||!isRecord3(scope)||!isString(scope.id)||typeof scope.root!="string"||!isString(value2.toolCallId)||!isString(value2.name)||value2.sessionRef!==void 0&&typeof value2.sessionRef!="string")throw new RemoteProtocolError("malformed invoke");return value2}case"file":{let scope=value2.scope;if(!isRecord3(scope)||!isString(scope.id)||typeof scope.root!="string"||!DEVICE_FILE_OPS.includes(value2.op)||!isRecord3(value2.args))throw new RemoteProtocolError("malformed file operation");return value2}case"abort":return value2;case"ack":return value2;case"terminal":if(!TERMINAL_REASONS.includes(value2.reason)||typeof value2.uncertain!="boolean"||typeof value2.hooksRan!="boolean")throw new RemoteProtocolError("malformed terminal outcome");return value2;case"settled":{let result=value2.result;if(!isRecord3(result)||!Array.isArray(result.content)||typeof result.isError!="boolean")throw new RemoteProtocolError("malformed result");return value2}case"refused":if(typeof value2.reason!="string")throw new RemoteProtocolError("malformed refusal");return value2;default:throw new RemoteProtocolError("unknown message kind")}}function asJson(value2){return value2===void 0?void 0:JSON.parse(JSON.stringify(value2))}function toRemoteToolResult(result){return{content:result.content??[],details:asJson(result.details),isError:result.isError===!0,...result.structuredContent===void 0?{}:{structuredContent:result.structuredContent},...result.terminate===void 0?{}:{terminate:result.terminate},...result.addedToolNames?.length?{addedToolNames:[...result.addedToolNames]}:{}}}var HAND_CAPABILITY="execute",DEFAULT_WORKSPACE="omo";function authorize(authority,scopeRoot){return authority.kind==="self"?{ok:!0,root:scopeRoot}:authority.verifier.verify(authority.peer,scopeRoot)}var SEPARATORS=/[\\/]+$/;function contains(root,child){let base=root.replace(SEPARATORS,"");if(child===base)return!0;if(!child.startsWith(base))return!1;let next=child.charAt(base.length);return next==="/"||next==="\\"}function createGrantVerifier(options){let{self,canonicalize}=options,now=options.now??Date.now,listeners=new Set,snapshot,canonical=path=>{try{return canonicalize(path)}catch{return}},workspaceOf=root=>{let best;for(let workspace of options.workspaces){let resolved=canonical(workspace.root);resolved===void 0||!contains(resolved,root)||(best===void 0||resolved.length>best.length)&&(best={label:workspace.label??"omo",length:resolved.length})}return best?.label};return{verify(peer,scopeRoot){let root=canonical(scopeRoot),workspace=root===void 0?void 0:workspaceOf(root);if(root===void 0||workspace===void 0)return{ok:!1,reason:"workspace_unknown"};if(peer===self)return{ok:!0,root};let current=snapshot;return current===void 0||now()>=current.expiresAt?{ok:!1,reason:"grant_expired"}:current.grants.some(row=>row.holder===peer&&row.target===self&&row.workspace===workspace&&row.capability===HAND_CAPABILITY)?{ok:!0,root}:{ok:!1,reason:"grant_missing"}},install(next){if(!Number.isFinite(next.rv)||!Number.isFinite(next.expiresAt))throw new Error("A grant snapshot needs a finite rv and expiresAt; the installed snapshot is kept");if(!(snapshot!==void 0&&next.rv<snapshot.rv)){snapshot=next;for(let listener of[...listeners])listener()}},onReplace(listener){return listeners.add(listener),()=>listeners.delete(listener)}}}var EPOCH_FLOOR_MAX_STEP=1,EPOCH_FLOOR_PREFIX="hand.epoch-floor:",HAND_SELF_SENDER="self";function decodeFloor(data){if(typeof data=="object"&&data!==null&&!Array.isArray(data)&&"epoch"in data&&"owner"in data){let{epoch,owner}=data;if(typeof epoch=="number"&&Number.isSafeInteger(epoch)&&epoch>=1&&typeof owner=="string")return{epoch,owner}}throw new Error("A stored epoch floor is malformed")}function createHandEpochFence(options){let{durable,ownerOf}=options,floors=new Map,ready=(async()=>{if(durable!==void 0)for(let document of await durable.store.scanDocuments(EPOCH_FLOOR_PREFIX))floors.set(document.key.slice(EPOCH_FLOOR_PREFIX.length),decodeFloor(document.data))})(),raiseNow=async(scope,epoch,sender)=>{if(ownerOf(scope)!==sender)return{kind:"refused",reason:"peer_unauthorized"};let current=floors.get(scope),floor=current?.epoch??0;if(epoch<floor)return{kind:"acked",floor};if(current!==void 0&&epoch===floor)return current.owner===sender?{kind:"acked",floor}:{kind:"refused",reason:"epoch_fenced"};if(epoch-floor>1)return{kind:"refused",reason:"epoch_step_exceeded"};let next={epoch,owner:sender};if(durable===void 0)floors.set(scope,next);else{let write={op:"put",key:`${EPOCH_FLOOR_PREFIX}${scope}`,data:{...next}};await durable.store.commit(durable.epoch,[write],()=>floors.set(scope,next))}return{kind:"acked",floor:epoch}};return{ready,async raise(scope,epoch,sender){await ready;let run=()=>raiseNow(scope,epoch,sender);return durable===void 0?run():durable.admission.admit(run)},admits(scope,epoch,sender){let floor=floors.get(scope);if(floor===void 0)return!0;let at=epoch??0;return at>floor.epoch||at===floor.epoch&&floor.owner===sender}}}async function answerFloor(fence,scope,epoch,sender){if(fence===void 0)return{kind:"floor_refused",reason:"epoch_unsupported"};let raised=await fence.raise(scope,epoch,sender);return raised.kind==="acked"?{kind:"floor_ack",floor:raised.floor}:{kind:"floor_refused",reason:raised.reason}}function createRemoteExecutor(options){let{transport,openScope,ledger,authority,fence}=options,sender=authority.kind==="peer"?authority.peer:HAND_SELF_SENDER,admits=(lane,epoch)=>fence===void 0||fence.admits(lane,epoch,sender),scopes=new Map,accepted=[],seen=new Set,running=new Map,planes=createPlaneClient({transport}),closed=!1,stopWatching=authority.kind==="peer"?authority.verifier.onReplace(()=>{for(let{controller,root}of running.values())authority.verifier.verify(authority.peer,root).ok||controller.abort()}):()=>{},reply=(lane,message)=>{transport.send(lane,encodeRemoteMessage(message)).catch(()=>{})},refuse2=(lane,executionId,reason)=>reply(lane,{kind:"refused",executionId,reason}),stateOf=scope=>{let known=scopes.get(scope.id);if(known!==void 0)return known.root===scope.root?known:"scope_binding_mismatch";let opened=openScope(scope);opened.catch(()=>{});let state={root:scope.root,opened,lastSequential:void 0,wave:[]};return scopes.set(scope.id,state),state},invoke=async(lane,call,file)=>{if(closed)return refuse2(lane,call.executionId,"hand_closed");if(lane!==call.scope.id)return refuse2(lane,call.executionId,"scope_lane_mismatch");let verdict=authorize(authority,call.scope.root);if(!verdict.ok)return refuse2(lane,call.executionId,verdict.reason);if(!admits(lane,call.epoch))return refuse2(lane,call.executionId,"epoch_fenced");if(ledger===void 0&&seen.has(call.executionId))return refuse2(lane,call.executionId,"duplicate_execution");seen.add(call.executionId);let state=stateOf({id:call.scope.id,root:verdict.root});if(typeof state=="string")return refuse2(lane,call.executionId,state);let scope;try{scope=await state.opened}catch(error){let reason=error instanceof Error?error.message:String(error);return refuse2(lane,call.executionId,`scope_unavailable: ${reason}`)}if(ledger!==void 0){let admission=await ledger.admit(call,()=>admits(lane,call.epoch));if(admission.kind==="reply")return reply(lane,admission.message);if(admission.kind==="in_flight")return}accepted.push(call.executionId);let controller=new AbortController;running.set(call.executionId,{controller,root:verdict.root});let sequential=file!==void 0||scope.isSequential(call.name),dependencies=sequential?[...state.lastSequential?[state.lastSequential]:[],...state.wave]:state.lastSequential?[state.lastSequential]:[],done=(async()=>{if(await Promise.allSettled(dependencies),ledger===void 0&&!admits(lane,call.epoch))return running.delete(call.executionId),refuse2(lane,call.executionId,"epoch_fenced");let result;try{if(controller.signal.aborted||!authorize(authority,call.scope.root).ok)throw new Error("The call's grant was revoked before it ran");result=file===void 0?await scope.run({toolCallId:call.toolCallId,name:call.name,arguments:call.arguments,signal:controller.signal,nested:planes.requestFor(call.executionId,lane,controller.signal)}):scope.file===void 0?fileRefusal("unsupported","this hand serves no file channel"):await scope.file(file.op,call.arguments,controller.signal,planes.requestFor(call.executionId,lane,controller.signal)),file!==void 0&&controller.signal.aborted&&(result=fileStopped(authorize(authority,call.scope.root).ok))}catch(error){if(file!==void 0){let granted=authorize(authority,call.scope.root).ok;result=controller.signal.aborted||!granted?fileStopped(granted):fileRefusal("io",error instanceof Error?error.message:String(error))}else result={content:[{type:"text",text:error instanceof Error?error.message:String(error)}],details:{},isError:!0}}finally{running.delete(call.executionId),planes.parentEnded(call.executionId)}let settled=toRemoteToolResult(result);reply(lane,ledger===void 0?{kind:"settled",executionId:call.executionId,result:settled}:await ledger.settle(call,settled))})();done.catch(error=>options.onFault(error)),sequential?(state.lastSequential=done,state.wave=[]):state.wave.push(done)},ready=(async()=>{if(await fence?.ready,ledger!==void 0)for(let{lane,message}of await ledger.recover())reply(lane,message);reply(HAND_CONTROL_LANE,{kind:"hello",instance:options.instance??crypto.randomUUID(),durable:ledger!==void 0,ops:options.fileChannel===!0?[FILE_CHANNEL,RUN_CHANNEL]:[]})})();return ready.catch(error=>options.onFault(error)),transport.onFrame(async frame=>{try{await ready}catch{return}let nested=decodePlaneMessage(frame.payload);if(nested!==void 0)return planes.receive(nested);let message;try{message=decodeRemoteMessage(frame.payload)}catch{return}try{if(message.kind==="invoke")await invoke(frame.lane,message);else if(message.kind==="floor")reply(frame.lane,await answerFloor(fence,frame.lane,message.epoch,sender));else{if((message.kind==="abort"||message.kind==="ack")&&!admits(frame.lane,message.epoch))return;message.kind==="file"?await invoke(frame.lane,fileCall(message),{op:message.op}):message.kind==="abort"?running.get(message.executionId)?.controller.abort():message.kind==="ack"&&await ledger?.ack(message.executionId,()=>admits(frame.lane,message.epoch))}}catch(error){options.onFault(error)}}),{accepted:()=>[...accepted],ready,async close(){closed=!0,stopWatching();for(let{controller}of running.values())controller.abort();let opened=await Promise.allSettled([...scopes.values()].map(state=>state.opened));scopes.clear(),await Promise.allSettled(opened.flatMap(outcome2=>outcome2.status==="fulfilled"?[outcome2.value.dispose()]:[])),transport.close()}}}var KINDS2=["hook.call","hook.hello","hook.started","hook.reply","hook.failed"],encoder3=new TextEncoder,decoder3=new TextDecoder;function encodeLoopHookMessage(message){return encoder3.encode(JSON.stringify(message))}var isRecord4=value2=>typeof value2=="object"&&value2!==null,isId2=value2=>typeof value2=="string"&&value2.length>0;function decodeLoopHookMessage(payload){let value2;try{value2=JSON.parse(decoder3.decode(payload))}catch{return}if(!(!isRecord4(value2)||!KINDS2.includes(value2.kind)))switch(value2.kind){case"hook.call":return isId2(value2.callId)&&isId2(value2.event)&&"payload"in value2?{kind:"hook.call",callId:value2.callId,event:value2.event,payload:value2.payload}:void 0;case"hook.hello":return isId2(value2.instance)?{kind:"hook.hello",instance:value2.instance}:void 0;case"hook.started":return isId2(value2.callId)&&isId2(value2.instance)?{kind:"hook.started",callId:value2.callId,instance:value2.instance}:void 0;case"hook.reply":return isId2(value2.callId)&&"result"in value2?{kind:"hook.reply",callId:value2.callId,result:value2.result}:void 0;default:return isId2(value2.callId)&&typeof value2.error=="string"?{kind:"hook.failed",callId:value2.callId,error:value2.error}:void 0}}function serveLoopHooks(options){let{transport,lane}=options,instance=options.instance??crypto.randomUUID(),answers=new Map,dead=!1,send=message=>transport.send(lane,encodeLoopHookMessage(message)),point=(at,callId)=>{if(dead)throw new Error("this hand process was stopped");try{options.onPoint?.(at,callId)}catch(error){throw dead=!0,error}},serve=async call=>{if(answers.has(call.callId)){let answer3=answers.get(call.callId);answer3!==void 0&&await send(answer3);return}point("received",call.callId),answers.set(call.callId,void 0),await send({kind:"hook.started",callId:call.callId,instance}),point("started",call.callId);let answer2;try{answer2={kind:"hook.reply",callId:call.callId,result:await options.run(call.event,call.payload)}}catch(error){answer2={kind:"hook.failed",callId:call.callId,error:error instanceof Error?error.message:String(error)}}point("ran",call.callId),answers.set(call.callId,answer2),await send(answer2),point("replied",call.callId)};return transport.onFrame(async frame=>{if(dead)return;let message=decodeLoopHookMessage(frame.payload);if(message?.kind==="hook.call")try{await serve(message)}catch(error){options.onFault?.(error)}}),{ready:send({kind:"hook.hello",instance}),close(){dead=!0}}}var TransportClosedError=class extends Error{constructor(){super("transport closed"),this.name="TransportClosedError"}};function isReferencePacket(message){if(typeof message!="object"||message===null)return!1;let{kind,lane,seq}=message;return typeof lane!="string"||typeof seq!="number"||!Number.isSafeInteger(seq)||seq<0?!1:kind==="ack"?!0:kind==="data"&&message.payload instanceof Uint8Array}function createReliableTransport(options){let window=options.window??32,retransmitMs=options.retransmitMs??1e3,outLanes=new Map,inLanes=new Map,order=[],ackDue=new Set,next=0,connection,writable=!1,closed=!1,handler,outLane=lane=>{let state=outLanes.get(lane);return state===void 0&&(state={nextSeq:1,acked:0,transmitted:0,outbox:new Map,waiters:[],cancelRetransmit:void 0},outLanes.set(lane,state),order.push(lane)),state},inLane=lane=>{let state=inLanes.get(lane);return state===void 0&&(state={received:0,delivered:0,busy:!1,inbox:[]},inLanes.set(lane,state)),state},admit=state=>{for(;state.nextSeq-1-state.acked<window;){let waiter=state.waiters.shift();if(waiter===void 0)return;state.outbox.set(state.nextSeq,waiter.payload),state.nextSeq+=1,waiter.resolve()}},emit=packet=>connection===void 0||!writable?!1:connection.send(packet)?!0:(writable=!1,!1),disarm=state=>{state.cancelRetransmit?.(),state.cancelRetransmit=void 0},disarmAll=()=>{for(let state of outLanes.values())disarm(state)},arm=()=>{if(connection!==void 0)for(let state of outLanes.values())state.cancelRetransmit!==void 0||state.outbox.size===0||(state.cancelRetransmit=options.clock.setTimer(()=>{state.cancelRetransmit=void 0,state.transmitted=state.acked,pump()},retransmitMs))};function pump(){if(!(connection===void 0||!writable)){for(let lane of[...ackDue]){if(!emit({kind:"ack",lane,seq:inLane(lane).delivered}))return;ackDue.delete(lane)}for(let idle=0;idle<order.length;){let lane=order[next%order.length];if(lane===void 0)return;let state=outLane(lane),seq=state.transmitted+1,payload=state.outbox.get(seq);if(payload===void 0){next+=1,idle+=1;continue}if(!emit({kind:"data",lane,seq,payload}))return;state.transmitted=seq,next+=1,idle=0}arm()}}async function deliver(state,lane){if(!(state.busy||handler===void 0)){state.busy=!0;try{for(let frame=state.inbox.shift();frame!==void 0&&!closed;frame=state.inbox.shift()){try{await handler(frame)}catch(error){options.onHandlerError(error,frame)}state.delivered+=1,ackDue.add(lane),pump()}}finally{state.busy=!1}}}let onData=packet=>{let state=inLane(packet.lane);packet.seq===state.received+1?(state.received=packet.seq,state.inbox.push({lane:packet.lane,payload:packet.payload}),deliver(state,packet.lane)):ackDue.add(packet.lane),pump()},onAck=packet=>{let state=outLanes.get(packet.lane);if(!(state===void 0||packet.seq<=state.acked||packet.seq>=state.nextSeq)){for(let seq=state.acked+1;seq<=packet.seq;seq++)state.outbox.delete(seq);state.acked=packet.seq,state.transmitted=Math.max(state.transmitted,state.acked),disarm(state),admit(state),pump()}};return{send(lane,payload){if(closed)return Promise.reject(new TransportClosedError);let state=outLane(lane);return new Promise((resolve,reject)=>{state.waiters.push({payload,resolve,reject}),admit(state),pump()})},onFrame(frameHandler){handler=frameHandler;for(let[lane,state]of inLanes)deliver(state,lane)},inFlight:lane=>{let state=outLanes.get(lane);return state===void 0?0:state.nextSeq-1-state.acked},close(){if(closed)return;closed=!0,disarmAll();for(let state of outLanes.values())for(let waiter of state.waiters.splice(0))waiter.reject(new TransportClosedError);let current=connection;connection=void 0,current?.close()},attached(newConnection){if(closed){newConnection.close();return}connection=newConnection,writable=!0;for(let state of outLanes.values())state.transmitted=state.acked;for(let[lane,state]of inLanes)state.delivered>0&&ackDue.add(lane);disarmAll(),pump()},message(message){isReferencePacket(message)&&(message.kind==="data"?onData(message):onAck(message))},writable(){connection!==void 0&&(writable=!0,pump())},detached(){connection=void 0,writable=!1,disarmAll()}}}var dist_exports={};__export(dist_exports,{AGENT_TELEMETRY_SCHEMAS:()=>AGENT_TELEMETRY_SCHEMAS,AI_TELEMETRY_SCHEMA:()=>AI_TELEMETRY_SCHEMA,Agent:()=>Agent2,AgentHarness:()=>AgentHarness,BACKGROUND_CONTEXT:()=>BACKGROUND_CONTEXT,BRANCH_SUMMARY_PREFIX:()=>BRANCH_SUMMARY_PREFIX,BRANCH_SUMMARY_SUFFIX:()=>BRANCH_SUMMARY_SUFFIX,BatchStoreMissingError:()=>BatchStoreMissingError,BranchSummaryError:()=>BranchSummaryError,CHAIN_COUNT_LIMIT:()=>CHAIN_COUNT_LIMIT,CHAIN_ORIGIN:()=>CHAIN_ORIGIN,COMPACTION_SUMMARY_PREFIX:()=>COMPACTION_SUMMARY_PREFIX,COMPACTION_SUMMARY_SUFFIX:()=>COMPACTION_SUMMARY_SUFFIX,ChainCountLimitError:()=>ChainCountLimitError,Closed:()=>Closed,CompactionError:()=>CompactionError,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES,DEFAULT_WORKSPACE:()=>DEFAULT_WORKSPACE,DEVICE_FILE_OPS:()=>DEVICE_FILE_OPS,DeviceFileError:()=>DeviceFileError,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC:()=>EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,EPOCH_FLOOR_MAX_STEP:()=>EPOCH_FLOOR_MAX_STEP,EPOCH_FRESHNESS_MS:()=>EPOCH_FRESHNESS_MS,ExecutionError:()=>ExecutionError,FILE_CHANNEL:()=>FILE_CHANNEL,FILE_CHANNEL_MAX_BYTES:()=>FILE_CHANNEL_MAX_BYTES,FileError:()=>FileError,GREP_MAX_LINE_LENGTH:()=>GREP_MAX_LINE_LENGTH,HAND_CAPABILITY:()=>HAND_CAPABILITY,HAND_CONTROL_LANE:()=>HAND_CONTROL_LANE,HAND_SELF_SENDER:()=>HAND_SELF_SENDER,HARNESS_TELEMETRY_SCHEMA:()=>HARNESS_TELEMETRY_SCHEMA,HELLO_WAIT_MS:()=>HELLO_WAIT_MS,HOSTED_REBUILD_DEADLINE_MS:()=>HOSTED_REBUILD_DEADLINE_MS,HarnessClosed:()=>HarnessClosed,HarnessFault:()=>HarnessFault,InMemoryTelemetryContext:()=>InMemoryTelemetryContext,InvalidLane:()=>InvalidLane,InvalidMessage:()=>InvalidMessage,InvalidNavigation:()=>InvalidNavigation,InvalidReadSegmentsError:()=>InvalidReadSegmentsError,JSONL_STORAGE_VERSION:()=>JSONL_STORAGE_VERSION,JsonlSessionRepo:()=>JsonlSessionRepo,LOCAL_DEVICE_FILES:()=>LOCAL_DEVICE_FILES,LaneBusy:()=>LaneBusy,LoopHookFailedError:()=>LoopHookFailedError,LoopHookRestartedError:()=>LoopHookRestartedError,MODEL_PLANE:()=>MODEL_PLANE,MOVE_SKEW_MS:()=>MOVE_SKEW_MS,MemorySessionRepo:()=>MemorySessionRepo,NOOP_TELEMETRY_CONTEXT:()=>NOOP_TELEMETRY_CONTEXT,NoActiveOperation:()=>NoActiveOperation,NoActiveRun:()=>NoActiveRun,NothingToCompact:()=>NothingToCompact,NothingToResume:()=>NothingToResume,OperationMismatch:()=>OperationMismatch,PlaneRefusedError:()=>PlaneRefusedError,PreflightCarryMissingError:()=>PreflightCarryMissingError,ProviderRetryWatchdogAbortError:()=>ProviderRetryWatchdogAbortError,READ_FOLDER_SELECTION:()=>READ_FOLDER_SELECTION,READ_FOLD_SETTINGS:()=>READ_FOLD_SETTINGS,RUN_CHANNEL:()=>RUN_CHANNEL,RemoteProtocolError:()=>RemoteProtocolError,Result:()=>Result,SESSION_PLANE:()=>SESSION_PLANE,STREAMED_DELTA_TYPES:()=>STREAMED_DELTA_TYPES,SessionBranchExistsError:()=>SessionBranchExistsError,SessionInvalidBranchError:()=>SessionInvalidBranchError,SessionInvariantError:()=>SessionInvariantError,SessionPendingAssistantMessageError:()=>SessionPendingAssistantMessageError,SessionStoreError:()=>SessionStoreError,SessionUnknownTargetError:()=>SessionUnknownTargetError,SliceNotImplemented:()=>SliceNotImplemented,StepCommitError:()=>StepCommitError,StorageBackedSession:()=>StorageBackedSession,StreamStartTimeoutError:()=>StreamStartTimeoutError,TODO_CONTEXT:()=>TODO_CONTEXT,TaggedError:()=>TaggedError,UnknownSkill:()=>UnknownSkill,UnknownTarget:()=>UnknownTarget,UnknownTemplate:()=>UnknownTemplate,admitChainCall:()=>admitChainCall,agentLoop:()=>agentLoop2,agentLoopContinue:()=>agentLoopContinue2,appendList:()=>appendList,appendRecordWrites:()=>appendRecordWrites,applyShellOutputUpdate:()=>applyShellOutputUpdate,authorize:()=>authorize,awaitWithContext:()=>awaitWithContext,base64Length:()=>base64Length,bashExecutionToText:()=>bashExecutionToText,branchTip:()=>branchTip,branchTipInventoryPrefix:()=>branchTipInventoryPrefix,buildProviderContext:()=>buildProviderContext,calculateContextTokens:()=>calculateContextTokens,canonicalJson:()=>canonicalJson,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary,commitWrite:()=>commitWrite,compact:()=>compact,convertToLlm:()=>convertToLlm,createAdmissionLine:()=>createAdmissionLine,createBashTool:()=>createBashTool,createBatchCoordinator:()=>createBatchCoordinator,createBranchSummaryMessage:()=>createBranchSummaryMessage,createCompactionSummaryMessage:()=>createCompactionSummaryMessage,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage,createDefaultReadSummary:()=>createDefaultReadSummary,createEditTool:()=>createEditTool,createErrorToolResult:()=>createErrorToolResult,createExecutionLedger:()=>createExecutionLedger,createForkSnapshot:()=>createForkSnapshot,createGrantVerifier:()=>createGrantVerifier,createHandEpochFence:()=>createHandEpochFence,createHandLedger:()=>createHandLedger,createInProcessNetwork:()=>createInProcessNetwork,createInternalAgentChannel:()=>createInternalAgentChannel,createLoopHookHost:()=>createLoopHookHost,createLoopToolHost:()=>createLoopToolHost,createMemoryStoreMedium:()=>createMemoryStoreMedium,createModelPlaneClient:()=>createModelPlaneClient,createPreparedToolHost:()=>createPreparedToolHost,createReadTool:()=>createReadTool,createReliableTransport:()=>createReliableTransport,createRemoteExecutor:()=>createRemoteExecutor,createRemoteToolHost:()=>createRemoteToolHost,createResponseTimingRecorder:()=>createResponseTimingRecorder,createSegmentedReadView:()=>createSegmentedReadView,createSessionPlaneClient:()=>createSessionPlaneClient,createSplitToolHost:()=>createSplitToolHost,createToolResultMessage:()=>createToolResultMessage,createTypedSpanStarter:()=>createTypedSpanStarter,createWriteTool:()=>createWriteTool,decodeBase64:()=>decodeBase64,decodeChainCount:()=>decodeChainCount,decodeDeviceFileArgs:()=>decodeDeviceFileArgs,decodeModelPlaneRequest:()=>decodeModelPlaneRequest,decodePlaneMessage:()=>decodePlaneMessage,decodeRemoteMessage:()=>decodeRemoteMessage,decodeSessionPlaneRequest:()=>decodeSessionPlaneRequest,defineTelemetrySchema:()=>defineTelemetrySchema,deleteList:()=>deleteList,deleteValue:()=>deleteValue,divergenceWrite:()=>divergenceWrite,emitToolExecutionEnd:()=>emitToolExecutionEnd,emitToolExecutionUpdate:()=>emitToolExecutionUpdate,emitToolResultMessage:()=>emitToolResultMessage,encodeBase64:()=>encodeBase64,encodePlaneMessage:()=>encodePlaneMessage,encodeRemoteMessage:()=>encodeRemoteMessage,entryLabel:()=>entryLabel,err:()=>err,estimateContextTokens:()=>estimateContextTokens,estimateTokens:()=>estimateTokens,executeShellWithCapture:()=>executeShellWithCapture,fileOutcomeOf:()=>fileOutcomeOf,fileRefusal:()=>fileRefusal,fileResult:()=>fileResult,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatPromptTemplateInvocation:()=>formatPromptTemplateInvocation,formatSize:()=>formatSize,formatSkillInvocation:()=>formatSkillInvocation,formatSkillsForSystemPrompt:()=>formatSkillsForSystemPrompt,generateBranchSummary:()=>generateBranchSummary,generateSummary:()=>generateSummary,generateSummaryWithUsage:()=>generateSummaryWithUsage,getLastAssistantUsage:()=>getLastAssistantUsage,getOrThrow:()=>getOrThrow,getOrUndefined:()=>getOrUndefined,getSessionCwd:()=>getSessionCwd,getTelemetryContext:()=>getTelemetryContext,insertEntry:()=>insertEntry,insertUsage:()=>insertUsage,isLocalDeviceFiles:()=>isLocalDeviceFiles,isReadSummaryPath:()=>isReadSummaryPath,isStepCommitError:()=>isStepCommitError,laneConfig:()=>laneConfig,laneState:()=>laneState,languageForPath:()=>languageForPath,list:()=>list,loadPromptTemplates:()=>loadPromptTemplates,loadSkills:()=>loadSkills,loadSourcedPromptTemplates:()=>loadSourcedPromptTemplates,loadSourcedSkills:()=>loadSourcedSkills,localEndpoint:()=>localEndpoint,loopSideToolNames:()=>loopSideToolNames,manifestWrite:()=>manifestWrite,matchError:()=>matchError,nextChainCount:()=>nextChainCount,noPreflightCarry:()=>noPreflightCarry,ok:()=>ok,openMemoryBatchStore:()=>openMemoryBatchStore,openMemoryStore:()=>openMemoryStore,openSessionStore:()=>openSessionStore,openSyncSessionStore:()=>openSyncSessionStore,operationMeta:()=>operationMeta,operationPreparation:()=>operationPreparation,operationPreparationPrefix:()=>operationPreparationPrefix,operationResult:()=>operationResult,operationScopeOf:()=>operationScopeOf,operationState:()=>operationState,operationToolArgs:()=>operationToolArgs,operationToolArgsPrefix:()=>operationToolArgsPrefix,operationToolMemo:()=>operationToolMemo,operationToolMemoPrefix:()=>operationToolMemoPrefix,parseCommandArgs:()=>parseCommandArgs,pendingAssistantFrames:()=>pendingAssistantFrames,pendingEntry:()=>pendingEntry,pendingToolOutput:()=>pendingToolOutput,pendingToolOutputPrefix:()=>pendingToolOutputPrefix,prepareAgentToolCall:()=>prepareAgentToolCall,prepareAgentToolCallArguments:()=>prepareAgentToolCallArguments,prepareBranchEntries:()=>prepareBranchEntries,prepareCompaction:()=>prepareCompaction,prepareReadFolder:()=>prepareReadFolder,prepareStorageCommit:()=>prepareStorageCommit,prepareToolArguments:()=>prepareToolArguments,projectForkCurrentStateWrite:()=>projectForkCurrentStateWrite,readSessionState:()=>readSessionState,readSummaryEngineForPath:()=>readSummaryEngineForPath,reasonedBeforeFirstDelta:()=>reasonedBeforeFirstDelta,reduceLaneSnapshot:()=>reduceLaneSnapshot,renderSegmentedReadView:()=>renderSegmentedReadView,resolveListReadOptions:()=>resolveListReadOptions,resolveToolNameAlias:()=>resolveToolNameAlias,rewriteRecordWrite:()=>rewriteRecordWrite,runAgentLoop:()=>runAgentLoop2,runAgentLoopContinue:()=>runAgentLoopContinue2,runToolCall:()=>runToolCall,sanitizeBinaryOutput:()=>sanitizeShellOutput,selectedReadFolder:()=>selectedReadFolder,serializeConversation:()=>serializeConversation,serveLoopHooks:()=>serveLoopHooks,serveModelPlane:()=>serveModelPlane,serveSessionPlane:()=>serveSessionPlane,sessionName:()=>sessionName,setDefaultStreamFn:()=>setDefaultStreamFn,setValue:()=>setValue,shouldCompact:()=>shouldCompact,shouldTerminateToolBatch:()=>shouldTerminateToolBatch,startAiSpan:()=>startAiSpan,startHarnessSpan:()=>startHarnessSpan,streamProxy:()=>streamProxy,substituteArgs:()=>substituteArgs,toError:()=>toError,toStoreValue:()=>toStoreValue,truncateHead:()=>truncateHead,truncateLine:()=>truncateLine,truncateTail:()=>truncateTail,utf8ByteLength:()=>utf8ByteLength,uuidv7:()=>uuidv7,validateCommittedWrites:()=>validateCommittedWrites,value:()=>value,withAbortSignal:()=>withAbortSignal,withCancel:()=>withCancel,withContextValue:()=>withContextValue,withSessionCwd:()=>withSessionCwd,withTelemetryContext:()=>withTelemetryContext,withToolNameCorrection:()=>withToolNameCorrection,withoutAbortSignal:()=>withoutAbortSignal});function startNoopSpan(_options,callback){try{return Promise.resolve(callback(noopTelemetrySpan))}catch(error){return Promise.reject(error)}}var noopTelemetrySpan={startSpan:startNoopSpan,addEvent:()=>{},setAttributes:()=>{},setStatus:()=>{}};Object.freeze(noopTelemetrySpan);var NOOP_TELEMETRY_CONTEXT=noopTelemetrySpan;function copyAttributeValue(value2){return Array.isArray(value2)?[...value2]:value2}function copyAttributes(attributes){let copy2={};if(!attributes)return copy2;for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(copy2[name]=copyAttributeValue(value2));return copy2}function mergeAttributes(current,attributes){let merged=copyAttributes(current);for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(merged[name]=copyAttributeValue(value2));return merged}function copyStatus(status){return status.status==="ok"?{status:"ok"}:status.error?{status:"error",error:{name:status.error.name,message:status.error.message}}:{status:"error"}}function automaticErrorStatus(error){try{if(error instanceof Error)return{status:"error",error:{name:error.name,message:error.message}}}catch{}return{status:"error"}}function settleSpan(state,span,failed,error){span.settled||(failed&&!span.explicitStatus&&(span.status=automaticErrorStatus(error)),span.settled=!0,span.endSequence=state.nextEndSequence++)}function createSpan(state,parent,options){let name=options.name,attributes=copyAttributes(options.attributes);return{id:state.nextSpanId++,parentId:parent?.id??null,name,attributes,events:[],status:{status:"ok"},explicitStatus:!1,settled:!1}}function startInMemorySpan(state,parent,options,callback){if(parent?.settled)return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback);let recordedSpan;try{recordedSpan=createSpan(state,parent,options),state.spans.push(recordedSpan)}catch{return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback)}let span={startSpan:(childOptions,childCallback)=>startInMemorySpan(state,recordedSpan,childOptions,childCallback),addEvent(name,attributes){if(!recordedSpan.settled)try{recordedSpan.events.push({name,attributes:copyAttributes(attributes)})}catch{}},setAttributes(attributes){if(!recordedSpan.settled)try{recordedSpan.attributes=mergeAttributes(recordedSpan.attributes,attributes)}catch{}},setStatus(status){if(!recordedSpan.settled)try{recordedSpan.status=copyStatus(status),recordedSpan.explicitStatus=!0}catch{}}},result;try{result=callback(span)}catch(error){return settleSpan(state,recordedSpan,!0,error),Promise.reject(error)}return Promise.resolve(result).then(value2=>(settleSpan(state,recordedSpan,!1),value2),error=>{throw settleSpan(state,recordedSpan,!0,error),error})}var InMemoryTelemetryContext=class{constructor(){this.state={spans:[],nextSpanId:1,nextEndSequence:1}}startSpan(options,callback){return startInMemorySpan(this.state,void 0,options,callback)}getSpans(){return this.state.spans.map(span=>({id:span.id,parentId:span.parentId,name:span.name,attributes:copyAttributes(span.attributes),events:span.events.map(event=>({name:event.name,attributes:copyAttributes(event.attributes)})),status:copyStatus(span.status),settled:span.settled,...span.endSequence===void 0?{}:{endSequence:span.endSequence}}))}};function defineTelemetrySchema(schema){return schema}function bindTypedSpanStarter(telemetryContext){return(name,attributes,callback)=>telemetryContext.startSpan({name,attributes},span=>callback(span,bindTypedSpanStarter(span)))}function createTypedSpanStarter(telemetryContext,_schemas){return bindTypedSpanStarter(telemetryContext)}var EMPTY_USAGE={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},ProviderRetryWatchdogAbortError=class extends Error{constructor(providerCause){super(providerCause),this.providerCause=providerCause,this.name="ProviderRetryWatchdogAbortError"}},EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC="empty_tool_use_terminal_state";function demoteToolUseWithoutToolCalls(message){return message.stopReason!=="toolUse"||message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"stop",diagnostics:[...message.diagnostics??[],{type:EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,timestamp:Date.now(),details:{}}]}}function promoteStopWithPendingToolCalls(message){return message.stopReason!=="stop"||!message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"toolUse"}}function settleStopReason(message){return demoteToolUseWithoutToolCalls(promoteStopWithPendingToolCalls(message))}function shouldTerminateAssistantTurn(message){return message.stopReason==="error"||message.stopReason==="aborted"||isClassifierRefusal(message)}function isStreamIdleTimeoutError(error){return error instanceof Error&&error.name==="StreamIdleTimeoutError"}function shouldFinalizeIdleAsStop(partialMessage,providerToolResults){if(!partialMessage)return!1;let toolCalls=partialMessage.content.filter(block=>block.type==="toolCall");return toolCalls.length===0?!1:providerToolResults.length>0?!0:toolCalls.every(block=>isCursorExecResolved(block))}function createTerminalFailureAssistantMessage(model,reason,error,partialMessage){let errorMessage2=error instanceof Error?error.message:String(error),providerDiagnostic=reason==="error"?readProviderDiagnostic(error):void 0,message={role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??model.api,provider:partialMessage?.provider??model.provider,model:partialMessage?.model??model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:reason==="error"&&isOAuthRefreshUnavailableError(error)?[...partialMessage?.diagnostics??[],{type:OAUTH_REFRESH_UNAVAILABLE_DIAGNOSTIC,timestamp:Date.now(),details:{provider:model.provider}}]:partialMessage?.diagnostics,usage:partialMessage?.usage??EMPTY_USAGE,stopReason:reason,errorMessage:errorMessage2||(reason==="aborted"?"Request was aborted":"Error"),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:partialMessage?.timestamp??Date.now()};return sanitizeProviderErrorMessage(message),message}function normalizeTerminalAssistantMessage(message,event){if(event.type==="done")return message;let errorMessage2=message.errorMessage??(event.reason==="aborted"?"Request was aborted":"Error");return message.stopReason===event.reason&&message.errorMessage===errorMessage2?message:{...message,stopReason:event.reason,errorMessage:errorMessage2}}var STREAMED_DELTA_TYPES=new Set(["text_delta","thinking_delta","toolcall_delta"]);function reasonedBeforeFirstDelta(message,thinkingStreamed){return(message.usage?.reasoning??0)>0?!0:thinkingStreamed?!1:message.content?.some(block=>block.type==="thinking")??!1}function createResponseTimingRecorder(){let requestedAt,startedMs,firstDeltaMs,lastDeltaMs,firstTokenAt,lastTokenAt,thinkingStreamed=!1;return{requested(){requestedAt=Date.now()},started(){startedMs??=performance.now()},observe(event){if(!STREAMED_DELTA_TYPES.has(event.type))return;let now=performance.now(),at=Date.now();event.type==="thinking_delta"&&(thinkingStreamed=!0),firstDeltaMs??=now,firstTokenAt??=at,lastDeltaMs=now,lastTokenAt=at},stamp(message){if(requestedAt===void 0)return;let windowStart=reasonedBeforeFirstDelta(message,thinkingStreamed)?startedMs:firstDeltaMs,generationMs=windowStart!==void 0&&lastDeltaMs!==void 0&&lastDeltaMs>windowStart?Math.round(lastDeltaMs-windowStart):void 0;message.timing={requestedAt,...firstTokenAt===void 0?{}:{firstTokenAt},...lastTokenAt===void 0?{}:{lastTokenAt},endedAt:Math.max(Date.now(),lastTokenAt??requestedAt),...generationMs===void 0?{}:{generationMs}}}}}var internalProgressSink=Symbol("internalProgressSink"),channels=new WeakMap;function createInternalAgentChannel(){let state={sequence:0,listeners:new Set},releaseCapture,channel=Object.freeze({subscribe(listener){return state.listeners.add(listener),releaseCapture??=subscribeAssistantCapture(),()=>{state.listeners.delete(listener),state.listeners.size===0&&(releaseCapture?.(),releaseCapture=void 0)}}});return channels.set(channel,state),channel}function internalLoopSink(channel){return!channel||!channels.get(channel)?.listeners.size?{}:{[internalProgressSink]:progress2=>dispatchInternalAgent(channel,{progress:progress2})}}function dispatchInternalAgent(channel,event){let state=channel&&channels.get(channel);if(!state?.listeners.size)return;let record2=Object.freeze({...event,sequence:++state.sequence});return(async()=>{for(let listener of state.listeners)await listener(record2)})()}function isEmptyStop(message){return message.stopReason==="stop"&&!hasVisibleAssistantContent(message)}function isEmptyToolUse(message){return message.stopReason==="toolUse"&&!message.content.some(block=>block.type==="toolCall")}function isMeaningfulContentEvent(event,policy){switch(event.type){case"toolcall_start":return!0;case"text_delta":return hasVisibleText(event.delta);case"text_end":return hasVisibleText(event.content);case"thinking_delta":return policy.thinkingCommits&&hasVisibleText(event.delta);case"thinking_end":return policy.thinkingCommits&&hasVisibleText(event.content);default:return!1}}function appendRetryDiagnostic(message,type="empty_assistant_response_recovery",details={retries:1}){return{...message,diagnostics:[...message.diagnostics??[],{type,timestamp:Date.now(),details}]}}function recoveryDiagnosticType(toolUse){return toolUse?"empty_tool_use_response_recovery":"empty_assistant_response_recovery"}function createEmptyResponseFailure(message,toolUse=!1){let errorMessage2=toolUse?EMPTY_TOOL_USE_ERROR:EMPTY_RESPONSE_ERROR;return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse)),content:[{type:"text",text:errorMessage2}],stopReason:"error",errorMessage:errorMessage2}}function createForwardedEmptyFailure(message,toolUse){return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse),{retries:0,forwarded:!0}),stopReason:"error",errorMessage:toolUse?FORWARDED_EMPTY_TOOL_USE_ERROR:FORWARDED_EMPTY_RESPONSE_ERROR}}function createRetryingStream(firstStream,createStream,policy){let outerStream=createAssistantMessageEventStream(),forward=entry2=>{"event"in entry2?outerStream.push(entry2.event):pushAssistantProgress(outerStream,entry2.progress)},replaced=(source,error)=>carryAssistantCapture(source,{type:"error",reason:"error",error},error);return(async()=>{try{let stream=firstStream,retrying=!1;for(;;){let buffered=[],forwarding=!1,retry=!1,events=assistantEvents(stream,progress2=>{forwarding?pushAssistantProgress(outerStream,progress2):buffered.push({progress:progress2})});for await(let event of events){if(event.type==="done"){let emptyToolUse=isEmptyToolUse(event.message);if(isEmptyStop(event.message)||emptyToolUse){if(forwarding){outerStream.push(replaced(event,createForwardedEmptyFailure(event.message,emptyToolUse))),outerStream.end();return}if(!retrying){retry=!0;break}outerStream.push(replaced(event,createEmptyResponseFailure(event.message,emptyToolUse))),outerStream.end();return}let message=retrying?appendRetryDiagnostic(event.message,recoveryDiagnosticType(isEmptyToolUse(event.message))):event.message,terminal2=retrying?carryAssistantCapture(event,{...event,message},message):event;if(!forwarding)for(let pending of buffered)forward(pending);outerStream.push(terminal2),outerStream.end();return}if(event.type==="error"){if(!forwarding)for(let pending of buffered)forward(pending);outerStream.push(event),outerStream.end();return}if(forwarding){outerStream.push(event);continue}if(buffered.push({event}),isMeaningfulContentEvent(event,policy)){for(let pending of buffered)forward(pending);forwarding=!0}}if(!retry){outerStream.end(retrying?appendRetryDiagnostic(await stream.result()):await stream.result());return}retrying=!0,stream=await createStream()}}catch(error){outerStream.fail(error)}})(),outerStream}function withEmptyAssistantRecovery(model,streamFunction){if(!shouldRecoverTextToolCalls(model)&&getToolCallFormat(model)===void 0)return streamFunction;let policy={thinkingCommits:!hasKimiTextToolCallRecovery(model)};return async(requestedModel,context,options)=>{let createStream=()=>streamFunction(requestedModel,context,options);return createRetryingStream(await createStream(),createStream,policy)}}var defaultStreamFn;function setDefaultStreamFn(streamFn){defaultStreamFn=streamFn}function getDefaultStreamFn(){if(!defaultStreamFn)throw new Error("No default stream function configured. Pass streamFn explicitly or call setDefaultStreamFn().");return defaultStreamFn}var StreamKeepAliveTimeoutError=class extends Error{constructor(timeoutMs){super(`Provider stream sent only keep-alives and timed out after ${timeoutMs}ms (raise streamKeepAliveTimeoutMs: retry.provider.keepAliveTimeoutMs in senpi settings; 0 disables)`),this.name="StreamKeepAliveTimeoutError"}};function createTransportLiveness(keepAliveTimeoutMs){let lastActivityAt,contentSilenceSince=Date.now();return{noteActivity:()=>{lastActivityAt=Date.now()},contentArrived:()=>{contentSilenceSince=Date.now()},onSilenceDeadline:windowMs=>{let now=Date.now();if(lastActivityAt===void 0||now-lastActivityAt>=windowMs)return{kind:"expire"};let delayMs=windowMs-(now-lastActivityAt);if(keepAliveTimeoutMs===void 0)return{kind:"extend",delayMs};let keepAliveLeftMs=keepAliveTimeoutMs-(now-contentSilenceSince);return keepAliveLeftMs<=0?{kind:"keep-alive-exhausted",error:new StreamKeepAliveTimeoutError(keepAliveTimeoutMs)}:{kind:"extend",delayMs:Math.max(1,Math.min(delayMs,keepAliveLeftMs))}}}}function prepareToolArguments(shim,args){return shim?shim(structuredClone(args)):args}function prepareAgentToolCallArguments(tool,toolCall){return tool.prepareArguments?{...toolCall,arguments:prepareToolArguments(tool.prepareArguments,toolCall.arguments)}:toolCall}function resolveToolNameAlias(requested,available){return resolveToolNameMatch(requested,available)}function toolNameCorrectionNotice(requested,resolved){return`[auto-corrected] no tool is named "${requested}"; ran "${resolved}". Call tools by their exact listed name.`}function withToolNameCorrection(result,requestedName,resolvedName){return{...result,content:[{type:"text",text:toolNameCorrectionNotice(requestedName,resolvedName),audience:"model"},...result.content??[]]}}function createErrorToolResult(message){return{content:[{type:"text",text:message}],details:{}}}function emitToolExecutionUpdate(toolCall,emit){return partialResult=>emit({type:"tool_execution_update",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments,partialResult})}async function emitToolExecutionEnd(finalized,emit){await emit({type:"tool_execution_end",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,result:finalized.result,isError:finalized.isError})}function createToolResultMessage(finalized){return{role:"toolResult",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,content:finalized.result.content??[],details:finalized.result.details,usage:finalized.result.usage,...finalized.result.addedToolNames?.length?{addedToolNames:finalized.result.addedToolNames}:{},isError:finalized.isError,timestamp:Date.now()}}async function emitToolResultMessage(toolResultMessage,emit){await emit({type:"message_start",message:toolResultMessage}),await emit({type:"message_end",message:toolResultMessage})}function shouldTerminateToolBatch(finalizedCalls){return finalizedCalls.length>0&&finalizedCalls.every(finalized=>finalized.result.terminate===!0)}function createAdmissionLine(){let tail=Promise.resolve();return{admit(mutation){let run=tail.then(()=>mutation());return tail=run.then(()=>{},()=>{}),run}}}function object(value2){return value2!==null&&typeof value2=="object"&&!Array.isArray(value2)}function strings(value2,keys){return keys.every(key=>typeof value2[key]=="string")}function numbers(value2,keys){return keys.every(key=>typeof value2[key]=="number"&&Number.isFinite(value2[key]))}function terminal(value2){return!object(value2)||typeof value2.hooksRan!="boolean"||typeof value2.uncertain!="boolean"?!1:value2.reason==="result"||value2.reason==="blocked"?value2.value!==void 0:["cancelled","lease_expired","hand_restarted","uncertain"].includes(String(value2.reason))}function manifestCall(value2){return object(value2)&&strings(value2,["executionId","executor","name","requestDigest"])&&numbers(value2,["sourceIndex","wave"])&&typeof value2.sequential=="boolean"&&value2.args!==void 0&&Array.isArray(value2.dependsOn)&&value2.dependsOn.every(dependency=>typeof dependency=="number")}function manifest(value2){return object(value2)&&strings(value2,["batchId","scope","workspace","issuer","manifestDigest"])&&numbers(value2,["generation","admittedAt","leaseUntil"])&&Array.isArray(value2.calls)&&value2.calls.every(manifestCall)}function prepareReply(value2){if(!object(value2))return!1;switch(value2.kind){case"prepared":case"prepared_awaiting_consent":return typeof value2.frozenDigest=="string";case"blocked":return value2.result!==void 0;case"batch_abort":return!0;case"settled":return terminal(value2.outcome);default:return!1}}function callOutcome(value2){if(!object(value2))return!1;switch(value2.kind){case"result":return value2.value!==void 0;case"blocked":return value2.result!==void 0;case"not_run":return value2.cause==="batch_abort"||value2.cause==="interrupted_preparation";case"interrupted":return typeof value2.reason=="string"&&typeof value2.uncertain=="boolean";default:return!1}}function consentRecord(value2){return object(value2)&&(value2.gate==="raw"||value2.gate==="frozen")&&typeof value2.digest=="string"&&(value2.answer==="approved"||value2.answer==="denied"||value2.answer==="expired")}function record(value2){if(!object(value2)||!manifest(value2.manifest))return!1;let size=value2.manifest.calls.length,{prepares,released,outcomes,decision,consents}=value2;return(consents===void 0||Array.isArray(consents)&&consents.length===size&&consents.every(entry2=>entry2===null||consentRecord(entry2)))&&(decision===null||decision==="RELEASE"||decision==="ABORT")&&Array.isArray(prepares)&&prepares.length===size&&prepares.every(reply=>reply===null||prepareReply(reply))&&Array.isArray(released)&&released.length===size&&released.every(mark=>typeof mark=="boolean")&&Array.isArray(outcomes)&&outcomes.length===size&&outcomes.every(outcome2=>outcome2===null||callOutcome(outcome2))}var BatchRecordCorruptError=class extends Error{constructor(){super("invalid durable batch record"),this.name="BatchRecordCorruptError"}};function decodeBatchRecord(value2){if(!record(value2))throw new BatchRecordCorruptError;return value2}var denied=(gate,answer2)=>({kind:"blocked",result:{reason:"consent_denied",gate,answer:answer2}}),lost={reason:"uncertain",hooksRan:!0,uncertain:!0},expired={reason:"lease_expired",hooksRan:!0,uncertain:!0};async function answer(step,gate,digest){let{recorded}=step;if(recorded!==null&&recorded.gate===gate&&recorded.digest===digest)return recorded.answer;let given=await step.consent.approve({...step.ref,gate,digest,name:step.call.name,leaseUntil:step.leaseUntil});return await step.record({gate,digest,answer:given}),given}async function gateRawCall(step){let{call}=step;if(!step.consent.needsConsent({name:call.name,args:call.args}))return{};let given=await answer(step,"raw",call.requestDigest);return given==="approved"?{authorizedDigest:call.requestDigest}:{blocked:denied("raw",given)}}async function resolveFrozenConsent(step,frozenDigest){let given=await answer(step,"frozen",frozenDigest);if(given==="denied")return await step.executor.abort(step.ref),denied("frozen",given);if(given==="expired")return{kind:"settled",outcome:expired};let reply=await consentOn(step.executor,step.ref,frozenDigest);return reply.kind==="prepared"?{kind:"prepared",frozenDigest}:reply.kind==="unknown_execution"?{kind:"settled",outcome:lost}:{kind:"settled",outcome:reply.outcome}}function consentOn(executor,ref,frozenDigest){if(executor.consent===void 0)throw new Error(`executor answered prepared_awaiting_consent for ${ref.executionId} but cannot take consent`);return executor.consent(ref,frozenDigest)}function canonicalJson(value2){return Array.isArray(value2)?`[${value2.map(canonicalJson).join(",")}]`:value2!==null&&typeof value2=="object"?`{${Object.entries(value2).sort(([a],[b])=>a<b?-1:a>b?1:0).map(([key,inner])=>`${JSON.stringify(key)}:${canonicalJson(inner)}`).join(",")}}`:JSON.stringify(value2)}async function canonicalDigest(value2){let bytes=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(canonicalJson(value2)));return Array.from(new Uint8Array(bytes),byte=>byte.toString(16).padStart(2,"0")).join("")}function batchDependencies(calls){let result=[],previousSequential,parallelSince=[];for(let[index,call]of calls.entries()){let anchor=previousSequential===void 0?[]:[previousSequential],dependsOn=call.sequential?[...anchor,...parallelSince]:anchor,wave=Math.max(-1,...dependsOn.map(dependency=>result[dependency]?.wave??-1))+1;result.push({dependsOn,wave}),call.sequential?(previousSequential=index,parallelSince=[]):parallelSince.push(index)}return result}async function buildBatchManifest(issuer,plan){let dependencies=batchDependencies(plan.calls),calls=[];for(let[sourceIndex,call]of plan.calls.entries()){let placement=dependencies[sourceIndex]??{dependsOn:[],wave:0};calls.push({...call,sourceIndex,dependsOn:placement.dependsOn,wave:placement.wave,requestDigest:await canonicalDigest({name:call.name,args:call.args})})}let{calls:_calls,...header}=plan;return{...header,issuer,calls,manifestDigest:await canonicalDigest({...header,issuer,calls})}}function abortCause(reply){if(reply.kind==="batch_abort")return"batch_abort";if(reply.kind==="settled"&&reply.outcome.reason!=="result")return"interrupted_preparation"}function finished(calls,outcomes,index){let done=new Map,visit=at=>{let known=done.get(at);if(known!==void 0)return known;let result=outcomes[at]!==null&&(calls[at]?.dependsOn??[]).every(dependency=>visit(dependency));return done.set(at,result),result};return visit(index)}function settledOutcome(reply){if(reply.kind==="unknown_execution")return{kind:"interrupted",reason:"unknown_execution",uncertain:!0};let{outcome:outcome2}=reply;switch(outcome2.reason){case"result":return{kind:"result",value:outcome2.value};case"blocked":return{kind:"blocked",result:outcome2.value};default:return{kind:"interrupted",reason:outcome2.reason,uncertain:outcome2.uncertain}}}var PREFIX="execution.batch:",keyOf=(issuer,batchId)=>`${PREFIX}${JSON.stringify([issuer,batchId])}`,BatchManifestConflictError=class extends Error{constructor(batchId){super(`batch ${batchId} already has a different durable manifest`),this.name="BatchManifestConflictError"}},replace=(items,index,value2)=>items.map((item,at)=>at===index?value2:item);function createBatchCoordinator(options){let{issuer,store,epoch,admission,executor,consent}=options,read=async batchId=>{let value2=await store.getDocument(keyOf(issuer,batchId));return value2===void 0?void 0:decodeBatchRecord(value2)};return{read,run:async plan=>{let manifest2=await buildBatchManifest(issuer,plan),key=keyOf(issuer,plan.batchId),record2=await read(plan.batchId),persist=async(next,step,call)=>{let data={batchId:plan.batchId,step,executionId:call?.executionId??null};await admission.admit(()=>store.commit(epoch,[{op:"append",id:store.mintId(),kind:"execution.batch",data},{op:"put",key,data:next}],()=>{})),record2=next},current=()=>{if(record2===void 0)throw new Error(`batch ${plan.batchId} has no durable record`);return record2},ref=call=>({issuer,executionId:call.executionId,generation:manifest2.generation}),settle2=async(call,outcome2)=>persist({...current(),outcomes:replace(current().outcomes,call.sourceIndex,outcome2)},"outcome",call);if(record2===void 0){let empty=manifest2.calls.map(()=>null);await persist({manifest:manifest2,prepares:empty,decision:null,released:manifest2.calls.map(()=>!1),outcomes:empty},"manifest")}else if(record2.manifest.manifestDigest!==manifest2.manifestDigest)throw new BatchManifestConflictError(plan.batchId);let consentStep=(gate,call)=>({consent:gate,executor:executor(call.executor),ref:ref(call),call,leaseUntil:manifest2.leaseUntil,recorded:current().consents?.[call.sourceIndex]??null,record:answered=>persist({...current(),consents:replace(current().consents??manifest2.calls.map(()=>null),call.sourceIndex,answered)},"consent",call)}),setPrepare=(call,reply)=>persist({...current(),prepares:replace(current().prepares,call.sourceIndex,reply)},"prepare",call);if(current().decision===null){for(let call of manifest2.calls){let reply=current().prepares[call.sourceIndex]??null,gate=reply===null&&consent!==void 0?await gateRawCall(consentStep(consent,call)):{};if(reply===null&&"blocked"in gate?(reply=gate.blocked,await setPrepare(call,reply)):reply===null&&(reply=await executor(call.executor).prepare({..."authorizedDigest"in gate&&gate.authorizedDigest!==void 0?{authorizedDigest:gate.authorizedDigest}:{},...ref(call),batchId:manifest2.batchId,manifestDigest:manifest2.manifestDigest,scope:manifest2.scope,workspace:manifest2.workspace,admittedAt:manifest2.admittedAt,leaseUntil:manifest2.leaseUntil,requestDigest:call.requestDigest,call:{name:call.name,args:call.args}}),await setPrepare(call,reply)),abortCause(reply)!==void 0)break}for(let call of manifest2.calls){if(current().prepares.some(reply2=>reply2!==null&&abortCause(reply2)!==void 0))break;let reply=current().prepares[call.sourceIndex]??null;if(reply?.kind==="prepared_awaiting_consent"){if(consent===void 0)throw new Error(`batch ${plan.batchId}: a call awaits consent but none is configured`);await setPrepare(call,await resolveFrozenConsent(consentStep(consent,call),reply.frozenDigest))}}let aborted=current().prepares.some(reply=>reply!==null&&abortCause(reply)!==void 0);await persist({...current(),decision:aborted?"ABORT":"RELEASE"},"decision")}let cause=current().prepares.map(reply=>reply===null?void 0:abortCause(reply)).find(found=>found!==void 0)??"batch_abort";for(let call of manifest2.calls){if(current().outcomes[call.sourceIndex]!==null)continue;let reply=current().prepares[call.sourceIndex]??null;reply?.kind==="settled"?await settle2(call,settledOutcome(reply)):reply?.kind==="blocked"?(await executor(call.executor).abort(ref(call)),await settle2(call,{kind:"blocked",result:reply.result})):current().decision==="ABORT"&&(reply!==null&&await executor(call.executor).abort(ref(call)),await settle2(call,{kind:"not_run",cause}))}let inflight=new Map;for(;;){for(let call2 of manifest2.calls){let index=call2.sourceIndex;if(!(current().outcomes[index]!==null||inflight.has(index))){if(!current().released[index]){if(!call2.dependsOn.every(dependency=>finished(manifest2.calls,current().outcomes,dependency)))continue;await persist({...current(),released:replace(current().released,index,!0)},"release",call2)}inflight.set(index,executor(call2.executor).release(ref(call2)).then(reply=>({index,ok:!0,reply}),error=>({index,ok:!1,error})))}}if(inflight.size===0)break;let settled=await Promise.race(inflight.values());if(inflight.delete(settled.index),!settled.ok)throw settled.error;let call=manifest2.calls[settled.index];call!==void 0&&await settle2(call,settledOutcome(settled.reply))}let{decision,outcomes}=current(),final=outcomes.filter(outcome2=>outcome2!==null);if(decision===null||final.length!==outcomes.length)throw new Error(`batch ${plan.batchId} ended with an unsettled call`);return{decision,outcomes:final}}}}function object2(value2){return value2!==null&&typeof value2=="object"&&!Array.isArray(value2)}function frozen(value2){return object2(value2)&&typeof value2.name=="string"&&typeof value2.digest=="string"&&value2.args!==void 0}function outcome(value2){if(!object2(value2)||typeof value2.hooksRan!="boolean"||typeof value2.uncertain!="boolean")return!1;switch(value2.reason){case"result":case"blocked":return value2.value!==void 0&&value2.uncertain===!1;case"cancelled":case"lease_expired":case"hand_restarted":case"uncertain":return!0;default:return!1}}function progress(value2){if(!object2(value2))return!1;switch(value2.state){case"admitted":case"preparing":case"acked":return!0;case"prepared":case"prepared_awaiting_consent":case"released":case"dispatched":return frozen(value2.call);case"reconciling":return frozen(value2.call)&&typeof value2.until=="number"&&Number.isFinite(value2.until);case"settled":return outcome(value2.outcome);default:return!1}}function entry(value2){return object2(value2)&&["issuer","commandId","executor","workspace","scope","requestDigest"].every(key=>typeof value2[key]=="string")&&["generation","admittedAt","leaseUntil","initialLeaseUntil","renewSeq"].every(key=>typeof value2[key]=="number"&&Number.isFinite(value2[key]))&&typeof value2.reconcilable=="boolean"&&typeof value2.effectPossible=="boolean"&&typeof value2.bodyDispatched=="boolean"&&progress(value2.progress)}var ExecutionLedgerCorruptError=class extends Error{constructor(){super("invalid durable execution ledger row"),this.name="ExecutionLedgerCorruptError"}};function decodeExecution(value2){if(!entry(value2))throw new ExecutionLedgerCorruptError;return value2}var refused=reason=>({status:"refused",reason}),replayed=entry2=>entry2.progress.state==="acked"?{status:"result_expired"}:{status:"replayed",entry:entry2},applied=entry2=>({status:"applied",entry:entry2});var advance=(entry2,progress2)=>applied({...entry2,progress:progress2}),settle=(entry2,reason)=>advance(entry2,{state:"settled",outcome:{reason,hooksRan:entry2.effectPossible,uncertain:entry2.effectPossible||entry2.bodyDispatched}});function authorized(entry2,{actor,event}){switch(event.kind){case"cancel":return actor.id===entry2.issuer||actor.approvedWorkspace===entry2.workspace;case"consent":case"release":case"abort":case"ack":case"renew":return actor.id===entry2.issuer;case"prepare":case"effect":case"freeze":case"block":case"dispatch":case"result":case"expire":case"restart":return actor.id===entry2.executor}}function recover(entry2,now){switch(entry2.progress.state){case"admitted":case"preparing":return settle(entry2,"hand_restarted");case"dispatched":return entry2.reconcilable?advance(entry2,{state:"reconciling",call:entry2.progress.call,until:Math.min(entry2.leaseUntil,now+3e4)}):settle(entry2,"hand_restarted");case"reconciling":return now>=entry2.progress.until?settle(entry2,"hand_restarted"):replayed(entry2);case"prepared":case"prepared_awaiting_consent":case"released":case"settled":case"acked":return replayed(entry2)}}function transitionExecution(entry2,command){let{event,now}=command;if(command.generation!==entry2.generation)return refused("stale_generation");if(!authorized(entry2,command))return refused("unauthorized");if(!Number.isFinite(now)||now<entry2.admittedAt)return refused("invalid_time");let progress2=entry2.progress;if(progress2.state==="acked")return event.kind==="ack"?{status:"replayed",entry:entry2}:{status:"result_expired"};if(progress2.state==="settled")switch(event.kind){case"ack":return advance(entry2,{state:"acked"});case"release":case"abort":case"consent":return refused("terminal");default:return replayed(entry2)}if(now>=entry2.leaseUntil)return settle(entry2,"lease_expired");if(progress2.state==="reconciling"&&now>=progress2.until)return settle(entry2,"hand_restarted");switch(event.kind){case"prepare":return progress2.state==="admitted"?advance(entry2,{state:"preparing"}):replayed(entry2);case"effect":return entry2.effectPossible?replayed(entry2):progress2.state==="preparing"?applied({...entry2,effectPossible:!0}):refused("invalid_transition");case"freeze":return progress2.state==="preparing"&&entry2.effectPossible?advance(entry2,{state:event.awaitingConsent?"prepared_awaiting_consent":"prepared",call:event.call}):"call"in progress2&&progress2.call.digest===event.call.digest?replayed(entry2):refused("invalid_transition");case"block":return progress2.state==="preparing"?advance(entry2,{state:"settled",outcome:{reason:"blocked",value:event.value,hooksRan:entry2.effectPossible,uncertain:!1}}):refused("invalid_transition");case"consent":return progress2.state==="prepared_awaiting_consent"?advance(entry2,{state:"prepared",call:progress2.call}):refused("invalid_transition");case"release":return progress2.state==="prepared"?advance(entry2,{state:"released",call:progress2.call}):progress2.state==="released"||entry2.bodyDispatched?replayed(entry2):refused("invalid_transition");case"dispatch":return entry2.bodyDispatched?replayed(entry2):progress2.state==="released"?applied({...entry2,bodyDispatched:!0,progress:{state:"dispatched",call:progress2.call}}):refused("invalid_transition");case"result":return progress2.state!=="dispatched"&&progress2.state!=="reconciling"?refused("invalid_transition"):advance(entry2,{state:"settled",outcome:{reason:"result",value:event.value,hooksRan:entry2.effectPossible,uncertain:!1}});case"cancel":return settle(entry2,"cancelled");case"abort":return entry2.bodyDispatched?refused("invalid_transition"):settle(entry2,"cancelled");case"ack":return refused("invalid_transition");case"renew":return event.seq<=entry2.renewSeq?replayed(entry2):!Number.isSafeInteger(event.seq)||!Number.isFinite(event.leaseUntil)||event.leaseUntil<=entry2.leaseUntil||event.leaseUntil>entry2.admittedAt+864e5?refused("invalid_renewal"):applied({...entry2,renewSeq:event.seq,leaseUntil:event.leaseUntil});case"expire":return replayed(entry2);case"restart":return recover(entry2,now)}}var PREFIX2="execution.ledger:",keyOf2=({issuer,commandId})=>`${PREFIX2}${JSON.stringify([issuer,commandId])}`;function createExecutionLedger(options){let{store,epoch,admission}=options,read=async key=>{let value2=await store.getDocument(keyOf2(key));return value2===void 0?void 0:decodeExecution(value2)},persist=async(entry2,event,audit=!1)=>{let writes=[{op:"append",id:store.mintId(),kind:audit?"execution.audit":"execution.transition",data:{issuer:entry2.issuer,commandId:entry2.commandId,generation:entry2.generation,event,state:entry2.progress.state}}];audit||writes.push({op:"put",key:keyOf2(entry2),data:entry2}),await store.commit(epoch,writes,()=>{})},apply=(command,guard)=>admission.admit(async()=>{let refusal2=guard?.();if(refusal2!==void 0)return refused(refusal2);let entry2=await read(command.key);if(entry2===void 0)return refused("not_found");let reply=transitionExecution(entry2,command);return reply.status==="applied"?await persist(reply.entry,command.event.kind):reply.status==="replayed"&&entry2.progress.state==="settled"&&(command.event.kind==="result"||command.event.kind==="cancel")&&await persist(entry2,command.event.kind,!0),reply});return{read,apply,admit:(input,guard)=>admission.admit(async()=>{let refusal2=guard?.();if(refusal2!==void 0)return refused(refusal2);let prior=await read(input);if(prior!==void 0)return prior.executor===input.executor&&prior.workspace===input.workspace&&prior.scope===input.scope&&prior.generation===input.generation&&prior.requestDigest===input.requestDigest&&prior.admittedAt===input.admittedAt&&prior.initialLeaseUntil===input.leaseUntil&&prior.reconcilable===input.reconcilable?replayed(prior):refused("identity_conflict");if(![input.issuer,input.commandId,input.executor,input.workspace,input.scope,input.requestDigest].every(Boolean)||!Number.isSafeInteger(input.generation)||input.generation<1||!Number.isFinite(input.admittedAt)||!Number.isFinite(input.leaseUntil)||input.leaseUntil<=input.admittedAt||input.leaseUntil>input.admittedAt+864e5)return refused("invalid_admission");let entry2={...input,initialLeaseUntil:input.leaseUntil,renewSeq:0,effectPossible:!1,bodyDispatched:!1,progress:{state:"admitted"}};return await persist(entry2,"admit"),applied(entry2)}),scan:async()=>(await store.scanDocuments(PREFIX2)).map(document=>decodeExecution(document.data)),recover:async now=>{for(let document of await store.scanDocuments(PREFIX2)){let entry2=decodeExecution(document.data);await apply({key:entry2,generation:entry2.generation,actor:{id:entry2.executor},now,event:{kind:"restart"}})}}}}function errorResult(message){return{content:[{type:"text",text:message}],details:{}}}function messageOf(error){return error instanceof Error?error.message:String(error)}var ABORTED=Symbol("aborted");async function runBody(body,signal,onUpdate){let updates=[],accepting=!0;try{let execution=body.tool.execute(body.toolCall.id,body.args,signal,partial=>{accepting&&updates.push(Promise.resolve(onUpdate(partial)))}),aborted=signal===void 0?void 0:new Promise(resolve=>{signal.aborted?resolve(ABORTED):signal.addEventListener("abort",()=>resolve(ABORTED),{once:!0})}),settled=aborted?await Promise.race([execution,aborted]):await execution;return accepting=!1,await Promise.all(updates),settled===ABORTED?(Promise.resolve(execution).catch(()=>{}),{result:errorResult("Tool execution aborted"),isError:!0}):{result:settled,isError:settled.isError===!0}}catch(error){return accepting=!1,await Promise.all(updates),{result:errorResult(messageOf(error)),isError:!0}}}async function finalizeBody(body,executed,pipeline,signal){let{result,isError}=executed;try{let after=await pipeline.afterToolCall({assistantMessage:body.assistantMessage,toolCall:body.toolCall,args:body.args,result,isError,context:body.context},signal);if(!after)return executed;let structuredContent=after.structuredContent??(after.content?void 0:result.structuredContent),merged={...result,content:after.content??result.content,details:after.details??result.details,usage:after.usage??result.usage,terminate:after.terminate??result.terminate};return structuredContent===void 0?delete merged.structuredContent:merged.structuredContent=structuredContent,{result:merged,isError:after.isError??isError}}catch(error){return{result:errorResult(messageOf(error)),isError:!0}}}function toStoreValue(value2){let json=JSON.stringify(value2);return json===void 0?null:JSON.parse(json)}async function freezeCall(name,args){let frozenArgs=toStoreValue(args);return{name,args:frozenArgs,digest:await canonicalDigest({name,args:frozenArgs})}}function resultValue(result,isError,requestedName){return toStoreValue({content:result.content??[],isError,requestedName})}function recordedResult(outcome2,requestedName){try{return{...outcome2,value:resultValue(outcome2.result,outcome2.isError,requestedName)}}catch(error){let result=errorResult(`Tool result content is not JSON: ${messageOf(error)}`);return{result,isError:!0,value:resultValue(result,!0,requestedName)}}}function stoppedValue(reply){let text=(reply.result.content??[]).map(part=>part.type==="text"?part.text:"").join(""),requestedName=reply.kind==="blocked"?reply.requestedName:void 0;return toStoreValue({kind:reply.kind,text,terminate:reply.result.terminate===!0,requestedName})}function isRecord5(value2){return value2!==null&&typeof value2=="object"&&!Array.isArray(value2)}function stoppedReply(value2){if(!isRecord5(value2))return;let{kind,text,terminate,requestedName}=value2;if(typeof text!="string"||typeof terminate!="boolean")return;let result=errorResult(text);if(terminate&&(result.terminate=!0),kind==="batch_abort")return{kind,result};if(kind==="blocked")return typeof requestedName=="string"?{kind,result,requestedName}:{kind,result}}var keyId=({issuer,commandId})=>JSON.stringify([issuer,commandId]),keyOf3=request=>({issuer:request.issuer,commandId:request.commandId??request.call.id});function refusal(reply){return{kind:"refused",reason:reply.status==="refused"?reply.reason:reply.status}}function incompleteMessage(name,errorMessage2){return errorMessage2!==void 0?`${errorMessage2}${errorMessage2.endsWith(".")?"":"."} Re-issue the tool call with complete arguments.`:`Tool call "${name}" was not executed: the response ended before the tool call was complete because it hit the output token limit. Re-issue the tool call with complete arguments.`}function fromRow(entry2){let progress2=entry2.progress;if(progress2.state==="prepared_awaiting_consent")return{kind:"prepared_awaiting_consent",call:progress2.call};if("call"in progress2)return{kind:"prepared",call:progress2.call};if(progress2.state!=="settled")return{kind:"refused",reason:progress2.state};let outcome2=progress2.outcome;return outcome2.reason!=="blocked"?{kind:"refused",reason:"terminal"}:stoppedReply(outcome2.value)??{kind:"refused",reason:"corrupt_blocked_outcome"}}function createPreparedExecutor(options){let{ledger,executor,pipeline}=options,clock=options.clock??Date.now,preparations=new Map,bodies=new Map,releases=new Map,step=(key,generation,event)=>ledger.apply({key,generation,actor:{id:executor},now:clock(),event});async function stop(key,generation,reply){let recorded=await step(key,generation,{kind:"block",value:stoppedValue(reply)});return recorded.status==="applied"?reply:recorded.status==="replayed"?fromRow(recorded.entry):refusal(recorded)}async function prepareOnce(request,requestDigest){let{call,generation,signal}=request,key=keyOf3(request),admitted=await ledger.admit({...key,executor,workspace:request.workspace,scope:request.scope,generation,requestDigest,admittedAt:request.admittedAt,leaseUntil:request.leaseUntil,reconcilable:request.reconcilable??!1});if(admitted.status==="replayed")return fromRow(admitted.entry);if(admitted.status!=="applied")return refusal(admitted);let preparing=await step(key,generation,{kind:"prepare"});if(preparing.status!=="applied")return refusal(preparing);if(call.incomplete===!0)return stop(key,generation,{kind:"blocked",result:errorResult(incompleteMessage(call.name,call.errorMessage))});let effect=await step(key,generation,{kind:"effect"});if(effect.status!=="applied")return refusal(effect);let tool;try{tool=await pipeline.resolve(call,request.context)}catch(error){return stop(key,generation,{kind:"blocked",result:errorResult(messageOf(error))})}if(!tool){let hint=pipeline.removedToolHint(call.name),text=hint===void 0?`Tool ${call.name} not found`:`Tool ${call.name} not found. ${hint}`;return stop(key,generation,{kind:"blocked",result:errorResult(text)})}let requestedName=tool.name===call.name?void 0:call.name,named=requestedName===void 0?{}:{requestedName};try{let prepared=prepareAgentToolCall(tool,requestedName===void 0?call:{...call,name:tool.name}),before=await pipeline.beforeToolCall({assistantMessage:request.assistantMessage,toolCall:prepared.toolCall,args:prepared.args,context:request.context},signal);if(signal?.aborted)return stop(key,generation,{kind:"batch_abort",result:errorResult("Operation aborted")});if(before?.block){let result=errorResult(before.reason||"Tool execution was blocked");return before.terminate===!0&&(result.terminate=!0),stop(key,generation,{kind:"blocked",result,...named})}let frozen2=await freezeCall(tool.name,prepared.args),covered=request.authorizedDigest===requestDigest&&(await freezeCall(call.name,toStoreValue(call.arguments))).digest===frozen2.digest,awaitingConsent=options.consent!==void 0&&!covered&&options.consent.needsConsent({name:frozen2.name,args:frozen2.args}),freeze=await step(key,generation,{kind:"freeze",call:frozen2,awaitingConsent});return freeze.status!=="applied"?refusal(freeze):(pipeline.afterFreeze(prepared.args,frozen2.args),bodies.set(keyId(key),{...named,tool,toolCall:prepared.toolCall,args:frozen2.args,assistantMessage:request.assistantMessage,context:request.context}),{kind:awaitingConsent?"prepared_awaiting_consent":"prepared",call:frozen2,...named})}catch(error){return stop(key,generation,{kind:"blocked",result:errorResult(messageOf(error)),...named})}}async function terminalRow(key){let entry2=await ledger.read(key);if(entry2===void 0)return{kind:"refused",reason:"not_found"};let progress2=entry2.progress;return progress2.state==="settled"&&progress2.outcome.reason==="blocked"?{kind:"refused",reason:"blocked"}:{kind:"replayed",entry:entry2}}async function runReleased(request,body){let{key,generation,signal}=request,dispatched=await step(key,generation,{kind:"dispatch"});if(dispatched.status==="replayed")return{kind:"replayed",entry:dispatched.entry};if(dispatched.status!=="applied"||dispatched.entry.progress.state!=="dispatched")return refusal(dispatched);let executed=await runBody(body,signal,request.onUpdateFor?.(body.toolCall)??request.onUpdate??(()=>{})),{result,isError,value:value2}=recordedResult(await finalizeBody(body,executed,pipeline,signal),body.requestedName),recorded=await step(key,generation,{kind:"result",value:value2});for(let memo of[bodies,preparations,releases])memo.delete(keyId(key));if(recorded.status==="replayed")return{kind:"replayed",entry:recorded.entry};if(recorded.status!=="applied")return refusal(recorded);let named=body.requestedName===void 0?{}:{requestedName:body.requestedName};return{kind:"settled",toolCall:body.toolCall,result,isError,...named}}async function release(request){let{key,generation}=request,released=await ledger.apply({key,generation,actor:request.actor,now:clock(),event:{kind:"release"}});if(released.status==="refused")return released.reason==="terminal"?terminalRow(key):refusal(released);if(released.status==="result_expired")return refusal(released);let id=keyId(key),pending=releases.get(id);if(pending!==void 0)return pending;let body=bodies.get(id);if(body===void 0)return{kind:"refused",reason:"not_prepared"};if(request.signal?.aborted)return{kind:"aborted",result:errorResult("Operation aborted")};let reply=runReleased(request,body);return releases.set(id,reply),reply.catch(()=>releases.get(id)===reply&&releases.delete(id)),reply}async function consent(request){let entry2=await ledger.read(request.key);if(entry2===void 0)return{kind:"refused",reason:"not_found"};if("call"in entry2.progress&&entry2.progress.call.digest!==request.frozenDigest)return{kind:"refused",reason:"frozen_digest_mismatch"};let reply=await ledger.apply({key:request.key,generation:request.generation,actor:request.actor,now:clock(),event:{kind:"consent"}});if(reply.status==="applied"&&reply.entry.progress.state==="prepared")return{kind:"prepared"};if(reply.status==="refused"&&reply.reason==="invalid_transition"&&entry2.progress.state==="prepared")return{kind:"prepared"};if(reply.status==="applied"||reply.status==="replayed")return{kind:"replayed",entry:reply.entry};if(reply.status==="refused"&&reply.reason==="terminal"){let terminal2=await ledger.read(request.key);return terminal2===void 0?{kind:"refused",reason:"not_found"}:{kind:"replayed",entry:terminal2}}return refusal(reply)}return{consent,prepare:async request=>{let{name,arguments:args,incomplete,errorMessage:errorMessage2}=request.call,requestDigest=await canonicalDigest(toStoreValue({name,args,incomplete,errorMessage:errorMessage2})),admission=JSON.stringify([request.generation,request.workspace,request.scope,requestDigest,request.admittedAt,request.leaseUntil,request.reconcilable??!1]),id=keyId(keyOf3(request)),pending=preparations.get(id);if(pending!==void 0&&pending.admission===admission)return pending.reply;if(pending!==void 0)return{kind:"refused",reason:"identity_conflict"};let reply=prepareOnce(request,requestDigest);preparations.set(id,{admission,reply});let forget=()=>preparations.get(id)?.reply===reply&&preparations.delete(id);return reply.then(settled=>settled.kind==="prepared"||settled.kind==="prepared_awaiting_consent"||forget(),forget),reply},release}}function agentPreparationPipeline(agent){return{resolve:async(call,context)=>{let tools=context.tools??[],exact=tools.find(tool=>tool.name===call.name);if(exact)return exact;let resolved=await agent.resolveUnknownToolCall?.(call.name,context);if(resolved)return resolved;let aliased=resolveToolNameAlias(call.name,tools.map(tool=>tool.name));return tools.find(tool=>tool.name===aliased)},beforeToolCall:async(context,signal)=>agent.beforeToolCall?.(context,signal),afterToolCall:async(context,signal)=>agent.afterToolCall?.(context,signal),removedToolHint:name=>agent.removedToolHints?.[name],afterFreeze:(prepared,frozen2)=>agent.afterToolFreeze(prepared,frozen2)}}var ISSUER="loop",EXECUTOR="local",LEASE_MS=1440*60*1e3,NO_WORKSPACE="in-process";function isSequential(context,name){let tools=context.tools??[],named=resolveToolNameAlias(name,tools.map(tool2=>tool2.name));return(tools.find(candidate=>candidate.name===name)??tools.find(candidate=>candidate.name===named))?.executionMode==="sequential"}async function runPreparedBatch(request){let{source,calls,context,assistantMessage,emit,signal}=request,store=request.openStore();await store.claim(0,1);let admission=createAdmissionLine(),base=agentPreparationPipeline(source),resolved=new Map,prepared=createPreparedExecutor({ledger:createExecutionLedger({store,epoch:1,admission}),executor:EXECUTOR,pipeline:{...base,resolve:async call=>resolved.get(call)}}),executionIdOf=index=>String(index),byExecution=new Map(calls.map((call,index)=>[executionIdOf(index),call])),renamed=new Map,named=(id,call)=>renamed.get(id)??call,callOf=id=>{let call=byExecution.get(id);if(call===void 0)throw new Error(`prepared pipeline: unknown execution ${id}`);return call},started=new Set,pending=new Map,finalized=new Map,finish=async(id,outcome2)=>{finalized.set(id,outcome2),await emitToolExecutionEnd(outcome2,emit)},aborted=call=>({toolCall:call,result:createErrorToolResult("Operation aborted"),isError:!0}),endpoint={prepare:async ref=>{let id=ref.executionId,call=callOf(id);if(signal?.aborted&&started.size>0)return{kind:"batch_abort"};let tool=call.incomplete===!0?void 0:await base.resolve(call,context);resolved.set(call,tool),tool!==void 0&&tool.name!==call.name&&renamed.set(id,{...call,name:tool.name}),await emit({type:"tool_execution_start",toolCallId:call.id,toolName:tool?.name??call.name,args:call.arguments}),started.add(id);let reply=await prepared.prepare({issuer:ISSUER,commandId:id,generation:ref.generation,workspace:ref.workspace,scope:ref.scope,call,assistantMessage,context,admittedAt:ref.admittedAt,leaseUntil:ref.leaseUntil,...signal===void 0?{}:{signal}});if(signal?.aborted)return pending.set(id,aborted(named(id,call))),{kind:"batch_abort"};if(reply.kind==="prepared")return{kind:"prepared",frozenDigest:reply.call.digest};if(reply.kind==="prepared_awaiting_consent")return{kind:"prepared_awaiting_consent",frozenDigest:reply.call.digest};if(reply.kind==="refused")throw new Error(`prepared pipeline refused call ${call.id} (execution ${id}): ${reply.reason}`);let result=reply.kind==="blocked"&&reply.requestedName!==void 0&&tool!==void 0?withToolNameCorrection(reply.result,reply.requestedName,tool.name):reply.result;pending.set(id,{toolCall:named(id,call),result,isError:!0});let value2=toStoreValue({content:result.content??[]});return reply.kind==="blocked"?{kind:"blocked",result:value2}:{kind:"batch_abort"}},release:async ref=>{let id=ref.executionId,call=callOf(id),reply=await prepared.release({key:{issuer:ISSUER,commandId:id},generation:ref.generation,actor:{id:ISSUER},onUpdateFor:toolCall=>emitToolExecutionUpdate(toolCall,emit),...signal===void 0?{}:{signal}});if(reply.kind==="settled"){let result=reply.requestedName===void 0?reply.result:withToolNameCorrection(reply.result,reply.requestedName,reply.toolCall.name);return await finish(id,{toolCall:reply.toolCall,result,isError:reply.isError}),{kind:"settled",outcome:{reason:"result",value:toStoreValue(result.content??[]),hooksRan:!0,uncertain:!1}}}if(reply.kind!=="aborted")throw new Error(`prepared pipeline: release ${reply.kind} for call ${call.id} (execution ${id})`);return await finish(id,signal?.aborted?aborted(named(id,call)):{toolCall:named(id,call),result:reply.result,isError:!0}),{kind:"settled",outcome:{reason:"cancelled",hooksRan:!0,uncertain:!1}}},abort:async ref=>{let id=ref.executionId,call=callOf(id);return started.has(id)&&await finish(id,signal?.aborted?aborted(named(id,call)):pending.get(id)??aborted(named(id,call))),{kind:"settled",outcome:{reason:"cancelled",hooksRan:!1,uncertain:!1}}}},now=Date.now(),plan={batchId:crypto.randomUUID(),scope:request.scope.id,workspace:request.scope.root===""?NO_WORKSPACE:request.scope.root,generation:1,admittedAt:now,leaseUntil:now+LEASE_MS,calls:calls.map((call,index)=>({executionId:executionIdOf(index),executor:EXECUTOR,name:call.name,args:toStoreValue(call.arguments),sequential:isSequential(context,call.name)}))};return await createBatchCoordinator({issuer:ISSUER,store,epoch:1,admission,executor:()=>endpoint}).run(plan),calls.flatMap((_call,index)=>{let id=executionIdOf(index),outcome2=finalized.get(id);return started.has(id)&&outcome2!==void 0?[outcome2]:[]})}function createPreparedToolHost(source,openStore){return{async execute(call,options){let{emit,signal,recordWitness,local:local2}=options;if(local2===void 0)throw new Error("the prepared pipeline runs only in the loop's own process");if(recordWitness)for(let raw of call.calls){let pending=recordWitness({pipeline:"prepared",toolCallId:raw.id});pending&&await pending}let batch=calls=>runPreparedBatch({source,openStore,calls,scope:call.scope,context:local2.context,assistantMessage:local2.assistantMessage,emit,...signal===void 0?{}:{signal}}),outcomes=[],messages=[],report=async finished2=>{for(let outcome2 of finished2){let message=createToolResultMessage(outcome2);await emitToolResultMessage(message,emit),outcomes.push(outcome2),messages.push(message)}};if(call.mode==="sequential"){for(let raw of call.calls)if(await report(await batch([raw])),signal?.aborted)break}else await report(await batch(call.calls));return{messages,terminate:shouldTerminateToolBatch(outcomes)}}}}var BatchStoreMissingError=class extends Error{constructor(){super("agent loop: no batchStoreFactory configured for the prepared pipeline; pass one (or a toolHost)"),this.code="batch_store_missing",this.name="BatchStoreMissingError"}},PreflightCarryMissingError=class extends Error{constructor(){super("agent loop: no afterToolFreeze configured for the prepared pipeline; pass one (or a toolHost)"),this.code="preflight_carry_missing",this.name="PreflightCarryMissingError"}};function noPreflightCarry(_prepared,_frozen){}function agentLoop(prompts,context,config,signal,streamFn){let stream=createAgentStream();return runAgentLoop(prompts,context,config,async event=>{stream.push(event)},signal,streamFn).then(messages=>{stream.end(messages)}),stream}function agentLoopContinue(context,config,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let stream=createAgentStream();return runAgentLoopContinue(context,config,async event=>{stream.push(event)},signal,streamFn).then(messages=>{stream.end(messages)}),stream}async function runAgentLoop(prompts,context,config,emit,signal,streamFn){let initialMessages=declareToolChanges(context,prompts,config.model),newMessages=[...initialMessages],currentContext={...context,messages:[...context.messages,...initialMessages]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let message of initialMessages)await emit({type:"message_start",message}),await emit({type:"message_end",message});return await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}async function runAgentLoopContinue(context,config,emit,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let newMessages=[],currentContext={...context};return await emit({type:"agent_start"}),await emit({type:"turn_start"}),await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}function createAgentStream(){return new EventStream(event=>event.type==="agent_end",event=>event.type==="agent_end"?event.messages:[])}var StreamIdleTimeoutError=class extends Error{constructor(timeoutMs){super(`Idle timeout waiting for provider stream after ${timeoutMs}ms`),this.name="StreamIdleTimeoutError"}},StreamStartTimeoutError=class extends Error{constructor(timeoutMs){super(`Provider stream start timed out after ${timeoutMs}ms (raise streamStartTimeoutMs: retry.provider.streamStartTimeoutMs in senpi settings; 0 disables)`),this.name="StreamStartTimeoutError"}};async function runLoop(initialContext,newMessages,initialConfig,signal,emit,streamFunction){let currentContext=initialContext,config={...initialConfig,executionScope:initialConfig.executionScope??{id:crypto.randomUUID(),root:""}},firstTurn=!0,firstProviderRequest=!0,drainedTerminatingQueue,turnStartAlreadyEmitted=!1,explicitContinuation=!1,preparedMessages=[],pendingSource="steering",drainSteering=async()=>(pendingSource="steering",await config.getSteeringMessages?.()||[]),drainFollowUp=async()=>(pendingSource="followUp",await config.getFollowUpMessages?.()||[]),refreshTerminatingQueueDrain=async()=>{!drainedTerminatingQueue||!config.restorePendingMessages||(await config.restorePendingMessages(drainedTerminatingQueue,pendingMessages),pendingMessages=await drainSteering(),drainedTerminatingQueue=pendingMessages.length>0?"steering":void 0,pendingMessages.length===0&&(pendingMessages=await drainFollowUp(),drainedTerminatingQueue=pendingMessages.length>0?"followUp":void 0))},pendingMessages=await drainSteering();for(;;){let hasMoreToolCalls=!0;for(;hasMoreToolCalls||pendingMessages.length>0;){if(turnStartAlreadyEmitted?turnStartAlreadyEmitted=!1:firstTurn?firstTurn=!1:await emit({type:"turn_start"}),drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}if(pendingMessages.length>0&&config.commitQueuedConsumption)try{await config.commitQueuedConsumption(pendingSource,pendingMessages)}catch(error){throw await config.restorePendingMessages?.(pendingSource,pendingMessages),error}for(let message2 of declareToolChanges(currentContext,[...preparedMessages,...pendingMessages],config.model))await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);preparedMessages=[],pendingMessages=[];let requestUpdate=await config.prepareRequest?.({context:currentContext,model:config.model,thinkingLevel:config.reasoning??"off"},signal);requestUpdate&&(currentContext=requestUpdate.context??currentContext,config=applyLoopUpdate(config,requestUpdate));let isInitialProviderRequest=firstProviderRequest;firstProviderRequest=!1;let requestConfig=isInitialProviderRequest?{...config,timeoutMs:config.initialRequestTimeoutMs??config.timeoutMs,streamStartTimeoutMs:config.initialRequestStreamStartTimeoutMs??config.streamStartTimeoutMs}:config,streamed=await streamAssistantResponse(currentContext,requestConfig,signal,emit,withEmptyAssistantRecovery(requestConfig.model,streamFunction),isInitialProviderRequest?config.timeoutMs:requestConfig.timeoutMs),message=streamed.message,providerToolResults=streamed.providerToolResults;newMessages.push(message);let toolResults=[];for(let result of providerToolResults)await emit({type:"message_start",message:result}),await emit({type:"message_end",message:result}),currentContext.messages.push(result),newMessages.push(result),toolResults.push(result);if(config.commitStep&&await config.commitStep({message,providerToolResults}),shouldTerminateAssistantTurn(message)){await config.finishTurn?.({message,toolResults,context:currentContext,newMessages},signal),await emit({type:"turn_end",message,toolResults}),await emit({type:"agent_end",messages:newMessages});return}let toolCalls=message.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));hasMoreToolCalls=!1;let toolBatchTerminated=!1;if(toolCalls.length>0){let executedToolBatch=message.stopReason==="length"?await failToolCallsFromTruncatedMessage(toolCalls,emit):await executeToolCalls(currentContext,message,config,signal,emit);toolResults.push(...executedToolBatch.messages),toolBatchTerminated=executedToolBatch.terminate,hasMoreToolCalls=!executedToolBatch.terminate;for(let result of executedToolBatch.messages)currentContext.messages.push(result),newMessages.push(result)}let nextTurnContext={message,toolResults,context:currentContext,newMessages},decision=await config.finishTurn?.(nextTurnContext,signal);if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}if(decision?.action==="end"){await emit({type:"agent_end",messages:newMessages});return}if(explicitContinuation=decision?.action==="continue",toolBatchTerminated){if(pendingMessages=await drainSteering(),pendingMessages.length>0&&(drainedTerminatingQueue="steering"),pendingMessages.length===0&&(pendingMessages=await drainFollowUp(),pendingMessages.length>0&&(drainedTerminatingQueue="followUp")),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}pendingMessages.length>0&&(await emit({type:"turn_start"}),turnStartAlreadyEmitted=!0)}let nextTurnSnapshot;try{nextTurnSnapshot=await config.prepareNextTurn?.(nextTurnContext)}catch(error){throw drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),error}if(nextTurnSnapshot&&(currentContext=nextTurnSnapshot.context??currentContext,preparedMessages=nextTurnSnapshot.messages??[],config=applyLoopUpdate(config,nextTurnSnapshot)),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await drainSteering()),(hasMoreToolCalls||pendingMessages.length>0)&&(explicitContinuation=!1)}let followUpMessages=await drainFollowUp();if(followUpMessages.length>0){explicitContinuation=!1,pendingMessages=followUpMessages;continue}if(explicitContinuation){explicitContinuation=!1;continue}break}await emit({type:"agent_end",messages:newMessages})}function applyLoopUpdate(config,update){return{...config,model:update.model??config.model,reasoning:update.thinkingLevel===void 0?config.reasoning:update.thinkingLevel==="off"?void 0:update.thinkingLevel,thinkingSelection:update.thinkingSelection===void 0?config.thinkingSelection:update.thinkingSelection??void 0,abortServerSideFallback:update.abortServerSideFallback??config.abortServerSideFallback}}function declareToolChanges(context,pendingMessages,model){let systemIndex=-1;for(let i=pendingMessages.length-1;i>=0;i--)if(pendingMessages[i].role==="system"){systemIndex=i;break}let pending=pendingMessages[systemIndex],baseline=pending?pendingMessages.map((message,index2)=>index2===systemIndex?withToolChanges(pending,NO_CHANGES):message):pendingMessages,declared=(providerTools(context,model).tools??[]).map(toProviderToolDeclaration),shorthand=createInitialSystemMessage(context.systemPrompt,declared),committed=shorthand?[shorthand,...context.messages,...baseline]:[...context.messages,...baseline],delta=getToolStateChanges(getCurrentTools(committed),declared),declaredByName=new Map(declared.map(tool=>[tool.name,tool])),changes={toolsAdded:delta.toolsAdded.map(tool=>declaredByName.get(tool.name)??tool),toolsRemoved:delta.toolsRemoved},unchanged=changes.toolsAdded.length===0&&changes.toolsRemoved.length===0;if(pending)return unchanged&&!pending.toolsAdded?.length&&!pending.toolsRemoved?.length?pendingMessages:baseline.map((message,index2)=>index2===systemIndex?withToolChanges(pending,changes):message);if(unchanged)return pendingMessages;let update=withToolChanges({role:"system",content:"",timestamp:Date.now()},changes),insertIndex=pendingMessages.findIndex(message=>message.role!=="system"),index=insertIndex===-1?pendingMessages.length:insertIndex;return[...pendingMessages.slice(0,index),update,...pendingMessages.slice(index)]}var NO_CHANGES={toolsAdded:[],toolsRemoved:[]};function toProviderToolDeclaration(tool){return{name:tool.name,description:tool.description,parameters:tool.parameters,...tool.freeform===void 0?{}:{freeform:tool.freeform},...tool.constrainedSampling===void 0?{}:{constrainedSampling:tool.constrainedSampling}}}function withToolChanges(message,{toolsAdded,toolsRemoved}){let{toolsAdded:_added,toolsRemoved:_removed,...rest}=message;return{...rest,...toolsAdded.length>0?{toolsAdded}:{},...toolsRemoved.length>0?{toolsRemoved}:{}}}function providerTools(context,model){let declaredTools=context.declaredTools;if(declaredTools===void 0||model===void 0||!supportsAllowedToolChoice(model))return{tools:context.tools};let activeTools=context.tools??[],declaredNames=new Set(declaredTools.map(tool=>tool.name));return{tools:[...declaredTools,...activeTools.filter(tool=>!declaredNames.has(tool.name))],activeToolNames:activeTools.map(tool=>tool.name)}}async function buildProviderContext(context,config,signal){let messages=context.messages;config.transformContext&&(messages=await config.transformContext(messages,signal));let{tools,activeToolNames}=providerTools(context,config.model);return normalizeContext({systemPrompt:context.systemPrompt,...context.systemPromptStablePrefix===void 0?{}:{systemPromptStablePrefix:context.systemPromptStablePrefix},messages:await config.convertToLlm(messages),...tools===void 0?{}:{tools:tools.map(toProviderToolDeclaration)},...activeToolNames===void 0?{}:{activeToolNames}})}async function streamAssistantResponse(context,config,signal,emit,streamFunction,streamIdleTimeoutMs){let partialMessage=null,addedPartial=!1,providerToolResults=[],thinkingTiming=new Map,responseTiming=createResponseTimingRecorder();function stampTiming(finalMessage){responseTiming.stamp(finalMessage);for(let timing of thinkingTiming.values())timing.endedAt===void 0&&(timing.endedAt=Date.now());for(let[contentIndex,timing]of thinkingTiming){let block=finalMessage.content[contentIndex];block?.type==="thinking"&&(block.startedAt=timing.startedAt,block.endedAt=timing.endedAt)}}let requestAbortController=new AbortController,liveness=createTransportLiveness(normalizeTimeoutMs(config.streamKeepAliveTimeoutMs)),detachCallerAbort;if(signal!==void 0)if(signal.aborted)requestAbortController.abort(signal.reason);else{let onCallerAbort=()=>requestAbortController.abort(signal.reason);signal.addEventListener("abort",onCallerAbort,{once:!0}),detachCallerAbort=()=>signal.removeEventListener("abort",onCallerAbort)}try{let preStream=createPreStreamBound(normalizeTimeoutMs(config.streamStartTimeoutMs),normalizeTimeoutMs(streamIdleTimeoutMs),requestAbortController),llmContext=await preStream.run(buildProviderContext(context,config,requestAbortController.signal)),resolvedApiKey=(config.getApiKey?await preStream.run(config.getApiKey(config.model.provider)):void 0)||config.apiKey;responseTiming.requested();let response=await preStream.run(streamFunction(config.model,llmContext,{...config,streamKind:"main",apiKey:resolvedApiKey,signal:requestAbortController.signal,onTransportActivity:()=>{liveness.noteActivity(),config.onTransportActivity?.()},...config.cursorExecHandlers?{execHandlers:typeof config.cursorExecHandlers=="function"?config.cursorExecHandlers(signal??requestAbortController.signal):config.cursorExecHandlers,onToolResult:result2=>{providerToolResults.push(result2)}}:{}}),late=>{typeof late?.[Symbol.asyncIterator]=="function"&&closeAssistantIterator(late[Symbol.asyncIterator]())}),result=async()=>Object.assign(await response.result(),{thinkingLevel:config.reasoning??"off"}),sink=config[internalProgressSink],iterator=(sink?assistantRecords(response):response)[Symbol.asyncIterator](),eventReader=createAssistantEventReader(iterator,streamIdleTimeoutMs,requestAbortController.signal,error=>requestAbortController.abort(error),preStream.remainingStartMs(),response,normalizeTimeoutMs(config.streamStartTimeoutMs),liveness);try{for(;;){let next=await eventReader.next();if(next.done)break;let event=next.value;if(isAssistantProgress(event)){await sink?.(event);continue}switch(event.type){case"start":responseTiming.started(),partialMessage=event.partial,context.messages.push(partialMessage),addedPartial=!0,await emit(carryAssistantCapture(event,{type:"message_start",message:{...partialMessage},streaming:!0}));break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":case"toolcall_end":if(partialMessage){partialMessage=event.partial,responseTiming.observe(event);let timingProgress;if(event.type==="thinking_start"||event.type==="thinking_delta"||event.type==="thinking_end"){let timing=thinkingTiming.get(event.contentIndex);event.type==="thinking_start"&&timing===void 0&&(timing={startedAt:Date.now()},thinkingTiming.set(event.contentIndex,timing)),event.type==="thinking_end"&&timing!==void 0&&(timing.endedAt=Date.now());let block=partialMessage.content[event.contentIndex];block?.type==="thinking"&&timing!==void 0&&(block.startedAt=timing.startedAt,timing.endedAt!==void 0&&(block.endedAt=timing.endedAt),getAssistantCapture(event)&&event.type!=="thinking_delta"&&(timingProgress=Object.freeze({type:"message_block_metadata",contentIndex:event.contentIndex,...timing})))}context.messages[context.messages.length-1]=partialMessage,await emit(carryAssistantCapture(event,{type:"message_update",assistantMessageEvent:event,message:{...partialMessage}})),timingProgress&&await sink?.(timingProgress)}break;case"done":case"error":{let finalMessage2=settleStopReason(normalizeTerminalAssistantMessage(await result(),event));return stampTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:context.messages.push(finalMessage2),addedPartial||await emit(carryAssistantCapture(event,{type:"message_start",message:{...finalMessage2}},finalMessage2)),await emit(carryAssistantCapture(event,{type:"message_end",message:finalMessage2},finalMessage2)),{message:finalMessage2,providerToolResults}}}}}finally{eventReader.dispose()}let finalMessage=settleStopReason(await result());return stampTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}catch(error){if(isStreamIdleTimeoutError(error)&&shouldFinalizeIdleAsStop(partialMessage,providerToolResults)){let finalMessage2=settleStopReason({role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??config.model.api,provider:partialMessage?.provider??config.model.provider,model:partialMessage?.model??config.model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.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:partialMessage?.timestamp??Date.now()});return stampTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:(context.messages.push(finalMessage2),await emit({type:"message_start",message:{...finalMessage2}})),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}let callerAbortedPastBound=signal?.aborted===!0&&(error instanceof StreamStartTimeoutError||error instanceof StreamKeepAliveTimeoutError||isStreamIdleTimeoutError(error)||error===signal.reason),finalMessage=createTerminalFailureAssistantMessage(config.model,signal?.aborted?"aborted":"error",callerAbortedPastBound?abortError(signal.reason):error,partialMessage);return stampTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}finally{requestAbortController.abort(),detachCallerAbort?.()}}var ABORTED2=Symbol("aborted"),MAX_ABORT_REASON_CHARS=500;function abortError(reason){if(reason instanceof Error)return reason;let text=abortReasonText(reason);if(text===void 0)return new Error("Request was aborted");let characters=Array.from(text);return new Error(characters.length>MAX_ABORT_REASON_CHARS?`${characters.slice(0,MAX_ABORT_REASON_CHARS).join("")}\u2026`:text)}function abortReasonText(reason){let text=typeof reason=="string"?reason:typeof reason=="object"&&reason!==null&&"message"in reason&&typeof reason.message=="string"?reason.message:void 0;return text!==void 0&&text.trim()!==""?text:void 0}function closeAssistantIterator(iterator){Promise.resolve(iterator.return?.()).catch(()=>{})}function createPreStreamBound(startTimeoutMs,idleTimeoutMs,request){let startedAt=Date.now(),remaining=()=>startTimeoutMs===void 0?idleTimeoutMs:Math.max(0,startTimeoutMs-(Date.now()-startedAt)),timeoutError=()=>startTimeoutMs===void 0?new StreamIdleTimeoutError(idleTimeoutMs??0):new StreamStartTimeoutError(startTimeoutMs);return{run(work,discardLate){let budget=remaining();return budget===void 0?Promise.resolve(work):new Promise((resolve,reject)=>{let timer,settled=!1,finish=complete=>{settled||(settled=!0,timer!==void 0&&clearTimeout(timer),complete())};Promise.resolve(work).then(value2=>{if(settled){try{discardLate?.(value2)}catch{}return}finish(()=>resolve(value2))},error=>finish(()=>reject(error))),timer=setTimeout(()=>{let error=timeoutError();finish(()=>reject(error)),request.abort(error)},budget)})},remainingStartMs:()=>startTimeoutMs===void 0?void 0:Math.max(1,remaining()??1)}}function normalizeTimeoutMs(timeoutMs){return typeof timeoutMs=="number"&&Number.isFinite(timeoutMs)&&timeoutMs>0?timeoutMs:void 0}function createAssistantEventReader(iterator,timeoutMs,signal,onIdleTimeout,streamStartTimeoutMs,stream,configuredStartTimeoutMs,liveness){let idleTimeoutMs=normalizeTimeoutMs(timeoutMs),startTimeoutMs=normalizeTimeoutMs(streamStartTimeoutMs),reportedStartTimeoutMs=configuredStartTimeoutMs??startTimeoutMs,sawFirstEvent=!1,silentMs=0,removeAbortListener,abortPromise;return signal!==void 0&&(signal.aborted?abortPromise=Promise.resolve(ABORTED2):abortPromise=new Promise(resolve=>{let abortHandler=()=>resolve(ABORTED2);signal.addEventListener("abort",abortHandler,{once:!0}),removeAbortListener=()=>signal.removeEventListener("abort",abortHandler)})),{next:async()=>{if(signal?.aborted)return closeAssistantIterator(iterator),Promise.reject(abortError(signal.reason));let useStartBound=!sawFirstEvent&&startTimeoutMs!==void 0,readTimeoutMs=useStartBound?startTimeoutMs:idleTimeoutMs,makeTimeoutError=useStartBound?ms=>new StreamStartTimeoutError(reportedStartTimeoutMs??ms):ms=>new StreamIdleTimeoutError(idleTimeoutMs??ms),readStartedAt=Date.now(),windowMs=useStartBound?reportedStartTimeoutMs??startTimeoutMs:idleTimeoutMs,result=await readNextAssistantEvent(iterator,readTimeoutMs===void 0?void 0:Math.max(1,readTimeoutMs-silentMs),makeTimeoutError,abortPromise,onIdleTimeout,stream,signal,liveness&&windowMs!==void 0?{liveness,windowMs}:void 0);return!result.done&&isAssistantProgress(result.value)?silentMs+=Date.now()-readStartedAt:(silentMs=0,result.done||(sawFirstEvent=!0,liveness?.contentArrived())),result},dispose:()=>removeAbortListener?.()}}async function readNextAssistantEvent(iterator,idleTimeoutMs,makeTimeoutError,abortPromise,onIdleTimeout,stream,signal,keepAlive){if(idleTimeoutMs===void 0&&abortPromise===void 0)return iterator.next();let timeout,settled=!1;return new Promise((resolve,reject)=>{let settle2=complete=>{settled||(settled=!0,timeout!==void 0&&clearTimeout(timeout),complete())};if(idleTimeoutMs!==void 0){let onIdleDeadline=()=>{if(stream?.hasPendingLocalWork?.()){timeout=setTimeout(onIdleDeadline,idleTimeoutMs);return}let verdict=keepAlive?.liveness.onSilenceDeadline(keepAlive.windowMs);if(verdict?.kind==="extend"){timeout=setTimeout(onIdleDeadline,verdict.delayMs);return}let error=verdict?.kind==="keep-alive-exhausted"?verdict.error:makeTimeoutError(idleTimeoutMs);closeAssistantIterator(iterator),settle2(()=>reject(error)),onIdleTimeout?.(error)};timeout=setTimeout(onIdleDeadline,idleTimeoutMs)}(abortPromise?Promise.race([iterator.next(),abortPromise]):iterator.next()).then(result=>{if(result===ABORTED2){closeAssistantIterator(iterator),settle2(()=>reject(abortError(signal?.reason)));return}settle2(()=>resolve(result))},error=>settle2(()=>reject(error)))})}function createIncompleteToolCallErrorMessage(toolName,errorMessage2){return errorMessage2!==void 0?`${errorMessage2}${errorMessage2.endsWith(".")?"":"."} Re-issue the tool call with complete arguments.`:`Tool call "${toolName}" was not executed: the response ended before the tool call was complete because it hit the output token limit. Re-issue the tool call with complete arguments.`}async function failToolCallsFromTruncatedMessage(toolCalls,emit){let messages=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let finalized={toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name)),isError:!0};await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:!1}}async function executeToolCalls(currentContext,assistantMessage,config,signal,emit){let toolCalls=assistantMessage.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));return(config.toolHost??defaultToolHost()).execute({scope:config.executionScope??{id:crypto.randomUUID(),root:""},calls:toolCalls,mode:config.toolExecution??"parallel"},{signal,emit,recordWitness:config.onExecutionPipeline,local:{context:currentContext,assistantMessage}});function defaultToolHost(){if(config.batchStoreFactory===void 0)throw new BatchStoreMissingError;let afterToolFreeze=config.afterToolFreeze;if(afterToolFreeze===void 0)throw new PreflightCarryMissingError;return createPreparedToolHost({...config,afterToolFreeze},config.batchStoreFactory)}}function prepareAgentToolCall(tool,toolCall){let preparedToolCall=prepareAgentToolCallArguments(tool,toolCall);return{toolCall:preparedToolCall,tool,args:validateToolArguments(tool,preparedToolCall)}}async function prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){if(toolCall.incomplete===!0)return{kind:"immediate",toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name,toolCall.errorMessage)),isError:!0};if(!tool){let hint=config.removedToolHints?.[toolCall.name];return{kind:"immediate",toolCall,result:createErrorToolResult(hint===void 0?`Tool ${toolCall.name} not found`:`Tool ${toolCall.name} not found. ${hint}`),isError:!0}}if(tool.name!==toolCall.name){let requestedName=toolCall.name,outcome2=await prepareResolvedToolCall(currentContext,assistantMessage,{...toolCall,name:tool.name},tool,config,signal);return outcome2.kind==="prepared"?{...outcome2,requestedName}:{...outcome2,result:withToolNameCorrection(outcome2.result,requestedName,tool.name)}}return prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal)}async function prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){try{let preparedToolCall=prepareAgentToolCall(tool,toolCall),validatedArgs=preparedToolCall.args;if(config.beforeToolCall){let beforeResult=await config.beforeToolCall({assistantMessage,toolCall:preparedToolCall.toolCall,args:validatedArgs,context:currentContext},signal);if(signal?.aborted)return{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0};if(beforeResult?.block){let result=createErrorToolResult(beforeResult.reason||"Tool execution was blocked");return beforeResult.terminate===!0&&(result.terminate=!0),{kind:"immediate",toolCall,result,isError:!0}}}return signal?.aborted?{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:{kind:"prepared",toolCall:preparedToolCall.toolCall,tool,args:validatedArgs}}catch(error){return{kind:"immediate",toolCall,result:createErrorToolResult(error instanceof Error?error.message:String(error)),isError:!0}}}function abortReleasePromise(signal){if(signal!==void 0)return signal.aborted?Promise.resolve(ABORTED2):new Promise(resolve=>{signal.addEventListener("abort",()=>resolve(ABORTED2),{once:!0})})}async function runToolCall(toolCall,options){let{assistantMessage,context,signal}=options,tool=options.tools.find(candidate=>candidate.name===toolCall.name),preparation=await prepareToolCall(context,assistantMessage,toolCall,tool,options,signal);if(preparation.kind==="immediate")return{toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,options.onUpdate??(()=>{}));return finalizeExecutedToolCall(context,assistantMessage,preparation,executed,options,signal)}async function executePreparedToolCall(prepared,signal,onUpdate){let updateEvents=[],acceptingUpdates=!0;try{let execution=prepared.tool.execute(prepared.toolCall.id,prepared.args,signal,partialResult=>{acceptingUpdates&&updateEvents.push(Promise.resolve(onUpdate(partialResult)))}),abortRelease=abortReleasePromise(signal),settled=abortRelease?await Promise.race([execution,abortRelease]):await execution;return settled===ABORTED2?(Promise.resolve(execution).catch(()=>{}),acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult("Tool execution aborted"),isError:!0}):(acceptingUpdates=!1,await Promise.all(updateEvents),{result:settled,isError:settled.isError===!0})}catch(error){return acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult(error instanceof Error?error.message:String(error)),isError:!0}}finally{acceptingUpdates=!1}}async function finalizeExecutedToolCall(currentContext,assistantMessage,prepared,executed,config,signal){let result=executed.result,isError=executed.isError;if(config.afterToolCall)try{let afterResult=await config.afterToolCall({assistantMessage,toolCall:prepared.toolCall,args:prepared.args,result,isError,context:currentContext},signal);if(afterResult){let structuredContent=afterResult.structuredContent??(afterResult.content?void 0:result.structuredContent);result={...result,content:afterResult.content??result.content,details:afterResult.details??result.details,usage:afterResult.usage??result.usage,terminate:afterResult.terminate??result.terminate},structuredContent===void 0?delete result.structuredContent:result.structuredContent=structuredContent,isError=afterResult.isError??isError}}catch(error){result=createErrorToolResult(error instanceof Error?error.message:String(error)),isError=!0}return prepared.requestedName!==void 0&&(result=withToolNameCorrection(result,prepared.requestedName,prepared.toolCall.name)),{toolCall:prepared.toolCall,result,isError}}var localFailures=new WeakSet;function isLocalFailure(error){return typeof error=="object"&&error!==null&&localFailures.has(error)}async function local(work){try{return await work()}catch(error){throw typeof error=="object"&&error!==null&&localFailures.add(error),error}}function localFailurePort(port){return{claim:(queue,drain)=>local(()=>port.claim(queue,drain)),release:(queue,messages,giveBack)=>local(()=>port.release(queue,messages,giveBack)),commitConsumption:(queue,messages)=>local(()=>port.commitConsumption(queue,messages))}}function defaultConvertToLlm(messages){return messages.filter(message=>message.role==="system"||message.role==="user"||message.role==="assistant"||message.role==="toolResult")}var EMPTY_USAGE2={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},DEFAULT_MODEL={id:"unknown",name:"unknown",api:"unknown",provider:"unknown",baseUrl:"",reasoning:!1,input:[],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:0,maxTokens:0};function createMutableAgentState(initialState){let tools=initialState?.tools?.slice()??[],messages=initialState?.messages?.slice()??[];return{systemPrompt:initialState?.systemPrompt??"",systemPromptStablePrefix:initialState?.systemPromptStablePrefix,model:initialState?.model??DEFAULT_MODEL,thinkingLevel:initialState?.thinkingLevel??"off",reasoningBaseline:initialState?.reasoningBaseline,get tools(){return tools},set tools(nextTools){tools=nextTools.slice()},get messages(){return messages},set messages(nextMessages){messages=nextMessages.slice()},declaredTools:initialState?.declaredTools?.slice(),isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0,providerDiagnostic:void 0}}var LLM_ROLES=new Set(["user","assistant","toolResult","system"]);function isBackgroundNotice(message){return!LLM_ROLES.has(message.role)}var PendingMessageQueue=class{constructor(mode){this.messages=[],this.clearGeneration=0,this.mode=mode}enqueue(message){this.messages.push(message)}hasItems(){return this.messages.length>0}getClearGeneration(){return this.clearGeneration}peek(){if(this.mode==="all")return this.messages.slice();let first=this.messages[0];if(!first)return[];if(!isBackgroundNotice(first))return[first];let end=1;for(;end<this.messages.length&&isBackgroundNotice(this.messages[end]);)end++;return this.messages.slice(0,end)}drain(){let drained=this.peek();return this.messages=this.messages.slice(drained.length),drained}prepend(messages){this.messages=[...messages,...this.messages]}remove(message){let index=this.messages.indexOf(message);return index===-1?!1:(this.messages.splice(index,1),!0)}replace(message,next){let index=this.messages.indexOf(message);return index===-1?!1:(this.messages[index]=next,!0)}clear(){this.messages=[],this.clearGeneration++}},Agent=class{#internalChannel;async buildProviderContext(context,signal){return buildProviderContext(context,{convertToLlm:this.convertToLlm,transformContext:this.transformContext,model:this._state.model},signal)}constructor(options){this.listeners=new Set;let runtimeOptions=options??{};this.#internalChannel=runtimeOptions.internalChannel,this._state=createMutableAgentState(runtimeOptions.initialState),this.convertToLlm=runtimeOptions.convertToLlm??defaultConvertToLlm,this.transformContext=runtimeOptions.transformContext,this.streamFunction=runtimeOptions.streamFn??getDefaultStreamFn(),this.getApiKey=runtimeOptions.getApiKey,this.onPayload=runtimeOptions.onPayload,this.onResponse=runtimeOptions.onResponse,this.onProviderStreamEvent=runtimeOptions.onProviderStreamEvent,this.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.finishTurn=runtimeOptions.finishTurn,this.queuedInputPort=runtimeOptions.queuedInputPort,this.prepareRequest=runtimeOptions.prepareRequest,this.prepareNextTurn=runtimeOptions.prepareNextTurn,this.prepareNextTurnWithContext=runtimeOptions.prepareNextTurnWithContext,this.steeringQueue=new PendingMessageQueue(runtimeOptions.steeringMode??"one-at-a-time"),this.followUpQueue=new PendingMessageQueue(runtimeOptions.followUpMode??"one-at-a-time"),this.sessionId=runtimeOptions.sessionId,this.thinkingBudgets=runtimeOptions.thinkingBudgets,this.transport=runtimeOptions.transport??"auto",this.timeoutMs=runtimeOptions.timeoutMs,this.streamStartTimeoutMs=runtimeOptions.streamStartTimeoutMs,this.streamKeepAliveTimeoutMs=runtimeOptions.streamKeepAliveTimeoutMs,this.maxRetryDelayMs=runtimeOptions.maxRetryDelayMs,this.toolExecution=runtimeOptions.toolExecution??"parallel",this.toolHost=runtimeOptions.toolHost,this.batchStoreFactory=runtimeOptions.batchStoreFactory,this.afterToolFreeze=runtimeOptions.afterToolFreeze,this.executionScope=runtimeOptions.executionScope??{id:crypto.randomUUID(),root:""},this.onExecutionPipeline=runtimeOptions.onExecutionPipeline,this.removedToolHints=runtimeOptions.removedToolHints??{},this.resolveUnknownToolCall=runtimeOptions.resolveUnknownToolCall,this.abortServerSideFallback=runtimeOptions.abortServerSideFallback,this.cursorExecHandlers=runtimeOptions.cursorExecHandlers}subscribe(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}get state(){return this._state}set steeringMode(mode){this.steeringQueue.mode=mode}get steeringMode(){return this.steeringQueue.mode}set followUpMode(mode){this.followUpQueue.mode=mode}get followUpMode(){return this.followUpQueue.mode}steer(message){this.steeringQueue.enqueue(message)}followUp(message){this.followUpQueue.enqueue(message)}removeQueuedMessage(message){return this.steeringQueue.remove(message)||this.followUpQueue.remove(message)}replaceQueuedMessage(message,next){return this.steeringQueue.replace(message,next)||this.followUpQueue.replace(message,next)}clearSteeringQueue(){this.steeringQueue.clear()}clearFollowUpQueue(){this.followUpQueue.clear()}clearAllQueues(){this.clearSteeringQueue(),this.clearFollowUpQueue()}hasQueuedMessages(){return this.steeringQueue.hasItems()||this.followUpQueue.hasItems()}peekQueuedMessages(options){let steering=this.steeringQueue.peek();return options?.all?[...steering,...this.followUpQueue.peek()]:steering.length>0?steering:this.followUpQueue.peek()}get signal(){return this.activeRun?.abortController.signal}abort(reason){this.activeRun?.abortController.abort(reason)}suppressQueuedMessageDrain(){this.activeRun&&(this.activeRun.suppressQueuedMessageDrain=!0)}waitForIdle(){return this.activeRun?.promise??Promise.resolve()}reset(){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before resetting.");this._state.messages=[],this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(input,images){if(this.activeRun)throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");let messages=this.normalizePromptInput(input,images);await this.runPromptMessages(messages)}async continueWithQueuedMessages(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");if(this._state.messages[this._state.messages.length-1]?.role==="assistant"){await this.continue(options);return}if(this.steeringQueue.hasItems()){await this.runQueuedMessages("steering",{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}if(this.followUpQueue.hasItems()){await this.runQueuedMessages("followUp",{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}await this.continue(options)}async continue(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");let lastMessage=this._state.messages[this._state.messages.length-1];if(!lastMessage||this._state.messages.every(message=>message.role==="system"))throw new Error("No messages to continue from");if(lastMessage.role==="assistant"){if(this.steeringQueue.hasItems()){await this.runQueuedMessages("steering",{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}if(this.followUpQueue.hasItems()){await this.runQueuedMessages("followUp",{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}throw new Error("Cannot continue from message role: assistant")}await this.runContinuation(options)}normalizePromptInput(input,images){if(Array.isArray(input))return input;if(typeof input!="string")return[input];let content=[{type:"text",text:input}];return images&&images.length>0&&content.push(...images),[{role:"user",content,timestamp:Date.now()}]}async runPromptMessages(messages,options={}){await this.runWithLifecycle(async signal=>{await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async runQueuedMessages(queue,options){let pendingQueue=queue==="steering"?this.steeringQueue:this.followUpQueue;if(!this.queuedInputPort){await this.runPromptMessages(pendingQueue.drain(),options);return}await this.runWithLifecycle(async signal=>{let messages=await this.takeQueuedMessages(queue);messages.length!==0&&await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async takeQueuedMessages(queue){let pendingQueue=queue==="steering"?this.steeringQueue:this.followUpQueue,port=this.queuedInputPort&&localFailurePort(this.queuedInputPort);if(!port)return pendingQueue.drain();let generation=pendingQueue.getClearGeneration(),messages=await port.claim(queue,()=>(generation=pendingQueue.getClearGeneration(),pendingQueue.drain()));if(messages.length===0)return messages;try{await port.commitConsumption(queue,messages)}catch(error){throw await port.release(queue,messages,this.giveBack(queue,messages,generation)),error}return messages}giveBack(queue,messages,generation){let pendingQueue=queue==="steering"?this.steeringQueue:this.followUpQueue,restorable=()=>pendingQueue.getClearGeneration()===generation;return{restorable,restore:()=>restorable()?(pendingQueue.prepend(messages),!0):!1}}async runContinuation(options={}){await this.runWithLifecycle(async signal=>{await runAgentLoopContinue(this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:options.deferQueuedMessages,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs}),event=>this.processEvents(event),signal,this.streamFunction)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,...this._state.systemPromptStablePrefix===void 0?{}:{systemPromptStablePrefix:this._state.systemPromptStablePrefix},messages:this._state.messages.slice(),tools:this._state.tools.slice(),...this._state.declaredTools?{declaredTools:this._state.declaredTools.slice()}:{}}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),finishTurn=this.finishTurn,queuedInputPort=this.queuedInputPort&&localFailurePort(this.queuedInputPort),giveBack=(queue,messages)=>this.giveBack(queue,messages,queue==="steering"?steeringQueueGeneration:followUpQueueGeneration),reasoning=this._state.reasoningBaseline??this._state.thinkingLevel;return{...internalLoopSink(this.#internalChannel),model:this._state.model,reasoning:reasoning==="off"?void 0:reasoning,thinkingSelection:this._state.thinkingSelection,sessionId:this.sessionId,onPayload:this.onPayload,onResponse:this.onResponse,onProviderStreamEvent:this.onProviderStreamEvent,transport:this.transport,thinkingBudgets:this.thinkingBudgets,timeoutMs:this.timeoutMs,streamStartTimeoutMs:this.streamStartTimeoutMs,streamKeepAliveTimeoutMs:this.streamKeepAliveTimeoutMs,initialRequestTimeoutMs:options.initialRequestTimeoutMs,initialRequestStreamStartTimeoutMs:options.initialRequestStreamStartTimeoutMs,maxRetryDelayMs:this.maxRetryDelayMs,abortServerSideFallback:this.abortServerSideFallback,cursorExecHandlers:this.cursorExecHandlers,toolExecution:this.toolExecution,toolHost:this.toolHost,batchStoreFactory:this.batchStoreFactory,afterToolFreeze:this.afterToolFreeze,executionScope:this.getExecutionScope?.()??this.executionScope,onExecutionPipeline:this.onExecutionPipeline,removedToolHints:this.removedToolHints,resolveUnknownToolCall:this.resolveUnknownToolCall,beforeToolCall:this.beforeToolCall,afterToolCall:this.afterToolCall,finishTurn:finishTurn?async(turn,signal)=>{let decision=await finishTurn(turn,signal)??void 0;return decision?.action==="end"&&this.suppressQueuedMessageDrain(),decision}:void 0,prepareRequest:this.prepareRequest,prepareNextTurn:this.prepareNextTurnWithContext||this.prepareNextTurn?async context=>this.prepareNextTurnWithContext?await this.prepareNextTurnWithContext(context,this.signal):await this.prepareNextTurn?.(this.signal):void 0,convertToLlm:this.convertToLlm,transformContext:this.transformContext,getApiKey:this.getApiKey,getSteeringMessages:async()=>{if(skipInitialSteeringPoll)return skipInitialSteeringPoll=!1,[];let drain=()=>(steeringQueueGeneration=this.steeringQueue.getClearGeneration(),this.steeringQueue.drain());return queuedInputPort?queuedInputPort.claim("steering",drain):drain()},getFollowUpMessages:async()=>{let drain=()=>(followUpQueueGeneration=this.followUpQueue.getClearGeneration(),this.followUpQueue.drain());return queuedInputPort?queuedInputPort.claim("followUp",drain):drain()},commitQueuedConsumption:queuedInputPort?(queue,messages)=>queuedInputPort.commitConsumption(queue,messages):void 0,restorePendingMessages:async(queue,messages)=>{queuedInputPort?await queuedInputPort.release(queue,messages,giveBack(queue,messages)):giveBack(queue,messages).restore()}}}async runWithLifecycle(executor){if(this.activeRun)throw new Error("Agent is already processing.");let abortController=new AbortController,resolvePromise=()=>{},promise=new Promise(resolve=>{resolvePromise=resolve});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0;try{for(await executor(abortController.signal);!abortController.signal.aborted&&!this.activeRun?.suppressQueuedMessageDrain&&this.canDrainQueuedMessagesAfterRun()&&this.hasQueuedMessages();)await this.runQueuedMessagesAfterAgentEnd(abortController.signal)}catch(error){await this.handleRunFailure(error,abortController.signal.aborted)}finally{this.finishRun()}}canDrainQueuedMessagesAfterRun(){let lastMessage=this._state.messages[this._state.messages.length-1];return lastMessage?.role!=="assistant"||lastMessage.stopReason!=="error"&&lastMessage.stopReason!=="aborted"}async runQueuedMessagesAfterAgentEnd(signal){let queuedSteering=this.steeringQueue.hasItems()?await this.takeQueuedMessages("steering"):[];if(queuedSteering.length>0){await runAgentLoop(queuedSteering,this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:!0}),event=>this.processEvents(event),signal,this.streamFunction);return}let queuedFollowUps=this.followUpQueue.hasItems()?await this.takeQueuedMessages("followUp"):[];queuedFollowUps.length!==0&&await runAgentLoop(queuedFollowUps,this.createContextSnapshot(),this.createLoopConfig(),event=>this.processEvents(event),signal,this.streamFunction)}async handleRunFailure(error,aborted){let providerDiagnostic=aborted?void 0:readProviderDiagnostic(error),failureMessage={role:"assistant",content:[{type:"text",text:""}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:EMPTY_USAGE2,stopReason:aborted?"aborted":"error",errorMessage:error instanceof Error?error.message:String(error),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},...!aborted&&isLocalFailure(error)?{failureSource:"local"}:{},timestamp:Date.now()};sanitizeProviderErrorMessage(failureMessage),await this.processEvents({type:"message_start",message:failureMessage}),await this.processEvents({type:"message_end",message:failureMessage}),await this.processEvents({type:"turn_end",message:failureMessage,toolResults:[]}),await this.processEvents({type:"agent_end",messages:[failureMessage]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(event){switch(event.type){case"message_start":this._state.streamingMessage=event.message;break;case"message_update":this._state.streamingMessage=event.message;break;case"message_end":this._state.streamingMessage=void 0,this._state.messages.push(event.message);break;case"tool_execution_start":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.add(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"tool_execution_end":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.delete(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"turn_end":event.message.role==="assistant"&&event.message.errorMessage&&(this._state.errorMessage=event.message.errorMessage,this._state.providerDiagnostic=sanitizeProviderDiagnostic(event.message.providerDiagnostic));break;case"agent_end":this._state.streamingMessage=void 0;break}let signal=this.activeRun?.abortController.signal;if(!signal)throw new Error("Agent listener invoked outside active run");let internal=dispatchInternalAgent(this.#internalChannel,{event});internal&&await internal;for(let listener of this.listeners)await listener(event,signal)}async emitExternalEvent(event,runSignal){let activeSignal=this.activeRun?.abortController.signal;!activeSignal||runSignal&&runSignal!==activeSignal||await this.processEvents(event)}};var HOSTED_REBUILD_DEADLINE_MS=5e3,EPOCH_FRESHNESS_MS=5e3,MOVE_SKEW_MS=2e3;var STEP_COMMIT_BRAND=Symbol.for("senpi.StepCommitError"),StepCommitError=class extends Error{constructor(stepId,code,options){super(`step commit failed: ${code}`,options),this.name="StepCommitError",this.stepId=stepId,this.code=code,Object.defineProperty(this,STEP_COMMIT_BRAND,{value:!0,enumerable:!1,writable:!1})}};function isStepCommitError(value2){return typeof value2=="object"&&value2!==null&&Reflect.get(value2,STEP_COMMIT_BRAND)===!0}var DurableStoreError=class extends Error{constructor(code,message){super(message),this.name="DurableStoreError",this.code=code}};function createMemoryStoreMedium(){return{current:{epoch:0,records:[],documents:new Map}}}var copy=value2=>structuredClone(value2),copyRecord=record2=>({...record2,data:copy(record2.data)}),isList=value2=>Array.isArray(value2);function sameValue(a,b){if(a===void 0||b===void 0||a===null||b===null||typeof a!="object"||typeof b!="object")return a===b;if(isList(a)||isList(b))return isList(a)&&isList(b)&&a.length===b.length&&a.every((item,index)=>sameValue(item,b[index]));let keys=Object.keys(a);return keys.length===Object.keys(b).length&&keys.every(key=>Object.hasOwn(b,key)&&sameValue(a[key],b[key]))}var sameRecord=(a,b)=>b!==void 0&&a.seq===b.seq&&a.id===b.id&&a.kind===b.kind&&sameValue(a.data,b.data);function requireOwner(state,epoch){if(state.epoch===0)throw new DurableStoreError("unclaimed","the store has no owner; claim it first");if(epoch!==state.epoch)throw new DurableStoreError("stale-epoch",`epoch ${epoch} is not the owner epoch ${state.epoch}`)}function importedTail(state,snapshot){let ids=new Set,wellFormed=snapshot.head===snapshot.records.length&&snapshot.records.every((record2,index)=>record2.seq===index+1&&!ids.has(record2.id)&&ids.add(record2.id)),extendsLog=state.records.length<=snapshot.records.length&&state.records.every((record2,index)=>sameRecord(record2,snapshot.records[index]));if(!wellFormed||!extendsLog)throw new DurableStoreError("import-conflict","the snapshot's log does not extend this store's log");return snapshot.records.slice(state.records.length)}function scan(records,query){let matching=records.filter(record2=>(query.fromSeq===void 0||record2.seq>=query.fromSeq)&&(query.toSeq===void 0||record2.seq<=query.toSeq)&&(query.kind===void 0||record2.kind===query.kind)),ordered=query.order==="desc"?matching.reverse():matching;return(query.limit===void 0?ordered:ordered.slice(0,query.limit)).map(copyRecord)}var documentsOf=(state,prefix)=>[...state.documents].filter(([key])=>key.startsWith(prefix)).sort(([a],[b])=>a<b?-1:a>b?1:0).map(([key,data])=>({key,data:copy(data)}));function openMemoryStore(medium,options={}){let point=at=>options.onWritePoint?.(at),commitSync=(epoch,writes,adopt)=>{point({op:"commit",at:"before"});let state=medium.current;requireOwner(state,epoch);let records=[...state.records],ids=new Set(records.map(record2=>record2.id)),documents=new Map(state.documents),seqs=[];writes.forEach((write,index)=>{switch(point({op:"commit",at:"write",index}),write.op){case"append":{if(ids.has(write.id))throw new DurableStoreError("duplicate-record-id",`record ${write.id} exists`);ids.add(write.id);let seq=records.length+1;records.push({seq,id:write.id,kind:write.kind,data:copy(write.data)}),seqs.push(seq);break}case"put":documents.set(write.key,copy(write.data));break;case"delete":documents.delete(write.key);break}}),medium.current={epoch:state.epoch,records,documents},point({op:"commit",at:"durable"});let result={seqs,head:records.length};return adopt(result),result};return{readEpoch:async()=>medium.current.epoch,readHead:async()=>medium.current.records.length,async claim(expectedEpoch,nextEpoch){point({op:"claim",at:"before"});let state=medium.current;if(!Number.isSafeInteger(nextEpoch)||nextEpoch!==expectedEpoch+1)throw new DurableStoreError("invalid-claim",`a claim must raise the epoch to exactly ${expectedEpoch+1}`);if(state.epoch!==expectedEpoch)throw new DurableStoreError("stale-epoch",`expected epoch ${expectedEpoch}, the owner epoch is ${state.epoch}`);medium.current={...state,epoch:nextEpoch},point({op:"claim",at:"durable"})},commit:async(epoch,writes,adopt)=>commitSync(epoch,writes,adopt),commitSync,mintId:()=>crypto.randomUUID(),scanRecords:async(query={})=>scan(medium.current.records,query),getDocument:async key=>{let data=medium.current.documents.get(key);return data===void 0?void 0:copy(data)},scanDocuments:async prefix=>documentsOf(medium.current,prefix),exportSnapshot:async()=>{let state=medium.current;return{epoch:state.epoch,head:state.records.length,records:state.records.map(copyRecord),documents:documentsOf(state,"")}},async importSnapshot(epoch,snapshot){point({op:"import",at:"before"});let state=medium.current;if(requireOwner(state,epoch),epoch<=snapshot.epoch)throw new DurableStoreError("invalid-claim",`epoch ${epoch} is not above the source epoch ${snapshot.epoch}`);let records=[...state.records],documents=new Map,index=0;for(let record2 of importedTail(state,snapshot))point({op:"import",at:"write",index:index++}),records.push(copyRecord(record2));for(let document of snapshot.documents)point({op:"import",at:"write",index:index++}),documents.set(document.key,copy(document.data));medium.current={epoch:state.epoch,records,documents},point({op:"import",at:"durable"})}}}var openMemoryBatchStore=()=>openMemoryStore(createMemoryStoreMedium());function withBatchStore(config){return{...config,batchStoreFactory:config.batchStoreFactory??openMemoryBatchStore,afterToolFreeze:config.afterToolFreeze??noPreflightCarry}}var Agent2=class extends Agent{constructor(options){super(withBatchStore(options))}},agentLoop2=(prompts,context,config,signal,streamFn)=>agentLoop(prompts,context,withBatchStore(config),signal,streamFn),agentLoopContinue2=(context,config,signal,streamFn)=>agentLoopContinue(context,withBatchStore(config),signal,streamFn),runAgentLoop2=(prompts,context,config,emit,signal,streamFn)=>runAgentLoop(prompts,context,withBatchStore(config),emit,signal,streamFn),runAgentLoopContinue2=(context,config,emit,signal,streamFn)=>runAgentLoopContinue(context,withBatchStore(config),emit,signal,streamFn);function outcomeOf(entry2){let executionId=entry2.commandId;if(entry2.progress.state==="acked")return{kind:"refused",executionId,reason:"result_expired"};if(entry2.progress.state!=="settled")return;let{outcome:outcome2}=entry2.progress;if(outcome2.reason==="result"){let result=JSON.parse(String(outcome2.value));return{kind:"settled",executionId,result}}return outcome2.reason==="blocked"?{kind:"refused",executionId,reason:"foreign_outcome"}:{kind:"terminal",executionId,reason:outcome2.reason,uncertain:outcome2.uncertain,hooksRan:outcome2.hooksRan}}function asStoreValue(value2){return value2===void 0?null:JSON.parse(JSON.stringify(value2))}function createHandLedger(options){let{ledger,executor,issuer,workspace,now,leaseMs}=options,keyOf4=executionId=>({issuer,commandId:executionId}),apply=(executionId,event,actor,guard)=>ledger.apply({key:keyOf4(executionId),generation:1,actor:{id:actor},now:now(),event},guard),recovered,fencedBy=admits=>admits===void 0?void 0:()=>admits()?void 0:"epoch_fenced",owned=new Set,replyFrom=(reply,executionId)=>reply.status==="refused"?{kind:"refused",executionId,reason:reply.reason}:reply.status==="result_expired"?{kind:"refused",executionId,reason:"result_expired"}:outcomeOf(reply.entry)??{kind:"refused",executionId,reason:"not_settled"},admitNew=(invoke,digest,guard)=>{let admittedAt=now();return ledger.admit({issuer,commandId:invoke.executionId,executor,workspace,scope:invoke.scope.id,generation:1,requestDigest:digest,admittedAt,leaseUntil:admittedAt+leaseMs,reconcilable:!1},guard)},fenced=async executionId=>(await ledger.read(keyOf4(executionId))!==void 0&&await apply(executionId,{kind:"cancel"},issuer),{kind:"reply",message:{kind:"refused",executionId,reason:"epoch_fenced"}}),advance2=async(invoke,guard)=>{let{executionId}=invoke,isFenced=reply=>reply.status==="refused"&&reply.reason==="epoch_fenced",args=asStoreValue(invoke.arguments),frozen2={name:invoke.name,args,digest:JSON.stringify([invoke.name,args])},prior=await ledger.read(keyOf4(executionId));if(prior!==void 0&&(prior.requestDigest!==frozen2.digest||prior.scope!==invoke.scope.id))return{kind:"reply",message:{kind:"refused",executionId,reason:"identity_conflict"}};let settled=prior===void 0?void 0:outcomeOf(prior);if(settled!==void 0)return{kind:"reply",message:settled};let fromStart=[()=>admitNew(invoke,frozen2.digest,guard),()=>apply(executionId,{kind:"prepare"},executor,guard),()=>apply(executionId,{kind:"effect"},executor,guard),()=>apply(executionId,{kind:"freeze",call:frozen2,awaitingConsent:!1},executor,guard)],state=prior?.progress.state,steps=state===void 0?fromStart:state==="prepared"||state==="released"?[]:void 0;if(steps===void 0)return{kind:"in_flight"};for(let step of[...steps,()=>apply(executionId,{kind:"release"},issuer,guard)]){let reply=await step();if(isFenced(reply))return fenced(executionId);if(!(reply.status==="replayed"&&reply.entry.progress.state!=="settled")&&(reply.status!=="applied"||reply.entry.progress.state==="settled"))return{kind:"reply",message:replyFrom(reply,executionId)}}let dispatched=await apply(executionId,{kind:"dispatch"},executor,guard);return isFenced(dispatched)?fenced(executionId):dispatched.status==="applied"&&dispatched.entry.progress.state==="dispatched"?{kind:"run"}:dispatched.status==="replayed"&&dispatched.entry.progress.state!=="settled"?{kind:"in_flight"}:{kind:"reply",message:replyFrom(dispatched,executionId)}};return{async admit(invoke,admits){let{executionId}=invoke;if(owned.has(executionId))return{kind:"in_flight"};owned.add(executionId);let admission=await advance2(invoke,fencedBy(admits)).catch(error=>{throw owned.delete(executionId),error});return admission.kind!=="run"&&owned.delete(executionId),admission},async settle(invoke,result){try{let reply=await apply(invoke.executionId,{kind:"result",value:JSON.stringify(result)},executor);return replyFrom(reply,invoke.executionId)}finally{owned.delete(invoke.executionId)}},async ack(executionId,admits){await apply(executionId,{kind:"ack"},issuer,fencedBy(admits))},async recover(){return recovered!==void 0?recovered.then(()=>[]):(recovered=ledger.recover(now()),await recovered,(await ledger.scan()).flatMap(entry2=>{let message=entry2.progress.state==="settled"?outcomeOf(entry2):void 0;return message===void 0?[]:[{lane:entry2.scope,message}]}))}}}var SessionStoreError=class extends Error{constructor(code,message){super(message),this.name="SessionStoreError",this.code=code}},SESSION="session-import/session/",DIVERGENCE="session-import/divergence/",sessionManifestKey=id=>SESSION+encodeURIComponent(id),divergenceKey=id=>DIVERGENCE+encodeURIComponent(id),sessionRecordKind=id=>`session/${encodeURIComponent(id)}`,isRecord6=value2=>typeof value2=="object"&&value2!==null&&!Array.isArray(value2);function readEntry(id,value2){if(isRecord6(value2)&&typeof value2.key=="string"&&typeof value2.line=="string")return{key:value2.key,line:value2.line};throw new SessionStoreError("corrupt-session",`session ${id} holds an unreadable entry record`)}async function readSessionState(store,id){let manifest2=await store.getDocument(sessionManifestKey(id));if(manifest2===void 0)return;if(!isRecord6(manifest2)||!isRecord6(manifest2.header))throw new SessionStoreError("corrupt-session",`session ${id} has no readable manifest`);if("entryIds"in manifest2)throw new SessionStoreError("corrupt-session",`session ${id} is stored in the layout before the record log; re-import it from its JSONL file`);let header=manifest2.header,entries=[],held=new Set,rewrites=0;for(let record2 of await store.scanRecords({kind:sessionRecordKind(id),order:"asc"})){let data=record2.data;if(isRecord6(data)&&data.op==="rewrite"&&isRecord6(data.header)&&Array.isArray(data.entries))header=data.header,entries=data.entries.map(entry2=>readEntry(id,entry2)),held=new Set(entries.map(entry2=>entry2.key)),rewrites++;else if(isRecord6(data)&&data.op==="append"){let entry2=readEntry(id,data);if(held.has(entry2.key))continue;held.add(entry2.key),entries.push(entry2)}else throw new SessionStoreError("corrupt-session",`session ${id} holds an unreadable record ${record2.seq}`)}let divergence=await store.getDocument(divergenceKey(id))??null;return{id,header,entries,divergence,rewrites}}var manifestWrite=(id,header)=>({op:"put",key:sessionManifestKey(id),data:{id,header}}),divergenceWrite=(id,divergence)=>({op:"put",key:divergenceKey(id),data:divergence}),appendRecordWrites=(id,rewrites,added)=>added.map(entry2=>({op:"append",id:`${sessionRecordKind(id)}/${rewrites}/${encodeURIComponent(entry2.key)}`,kind:sessionRecordKind(id),data:{op:"append",key:entry2.key,line:entry2.line}})),rewriteRecordWrite=(store,id,header,entries)=>({op:"append",id:store.mintId(),kind:sessionRecordKind(id),data:{op:"rewrite",header,entries:entries.map(entry2=>({key:entry2.key,line:entry2.line}))}});function refuseRepeats(id,entries,held,what){let seen=new Set(held);for(let entry2 of entries){if(seen.has(entry2.key))throw new SessionStoreError("duplicate-entry",`${what} ${id} repeats ${entry2.key}`);seen.add(entry2.key)}}function planAppend(state,held,added){refuseRepeats(state.id,added,state.entries.map(entry2=>entry2.key),"session");let next={...state,entries:[...state.entries,...added]};return{writes:[...held?[]:[manifestWrite(state.id,state.header)],...appendRecordWrites(state.id,state.rewrites,added)],next}}function planRewrite(store,state,held,header,entries){refuseRepeats(state.id,entries,[],"rewrite of");let next={...state,header,entries:[...entries],rewrites:state.rewrites+1};return{writes:[...held?[]:[manifestWrite(state.id,header)],rewriteRecordWrite(store,state.id,header,entries)],next}}function asDuplicateEntry(id,error){return error instanceof DurableStoreError&&error.code==="duplicate-record-id"?new SessionStoreError("duplicate-entry",`session ${id} already holds an entry this write repeats`):error}var stored=({id,header,entries})=>({id,header,entries});async function openState(store,id,header){let read=await readSessionState(store,id);return read===void 0?{state:{id,header,entries:[],divergence:null,rewrites:0},held:!1}:{state:read,held:!0}}function openSessionStore(store,epoch){return{load:async id=>{let state=await readSessionState(store,id);return state===void 0?void 0:stored(state)},open:async(id,header)=>{let{state,held}=await openState(store,id,header),tail=Promise.resolve(),enqueue=plan=>{let run=tail.then(async()=>{let next=plan();await store.commit(epoch,next.writes,()=>{}).catch(error=>{throw asDuplicateEntry(id,error)}),state=next.next,held=!0});return tail=run.catch(()=>{}),run};return{header:()=>state.header,entries:()=>state.entries,append:entries=>enqueue(()=>planAppend(state,held,entries)),rewrite:(header2,entries)=>enqueue(()=>planRewrite(store,state,held,header2,entries))}}}}function openSyncSessionStore(store,epoch){return{load:openSessionStore(store,epoch).load,open:async(id,header)=>{let{state,held}=await openState(store,id,header),commit=plan=>{try{store.commitSync(epoch,plan.writes,()=>{})}catch(error){throw asDuplicateEntry(id,error)}state=plan.next,held=!0};return{header:()=>state.header,entries:()=>state.entries,appendSync:entries=>commit(planAppend(state,held,entries)),rewriteSync:(header2,entries)=>commit(planRewrite(store,state,held,header2,entries))}}}}var HELLO_WAIT_MS=5e3,GRANT_REFUSALS=new Set(["grant_missing","grant_expired","workspace_unknown","capability_missing"]);function refusalError(reason){return GRANT_REFUSALS.has(reason)?new DeviceFileError("refused_by_grant",reason):reason==="epoch_fenced"?new DeviceFileError("refused_by_policy",reason):reason==="hand_closed"||reason.startsWith("scope_unavailable")?new DeviceFileError("hand_unreachable",reason):new DeviceFileError("protocol",reason)}function valueOf(reply){switch(reply.kind){case"settled":{let outcome2=fileOutcomeOf(reply.result.details);if(outcome2===void 0)throw new DeviceFileError("protocol","the hand sent no file outcome");if(!outcome2.ok)throw new DeviceFileError(outcome2.code,outcome2.message);return outcome2.value}case"terminal":{let{reason,uncertain}=reply.terminal;throw new DeviceFileError("interrupted",`the operation ended without an outcome (${reason})`,{reason,uncertain})}case"refused":throw refusalError(reply.reason);case"aborted":throw new DeviceFileError("aborted","the operation was aborted");case"unreachable":throw new DeviceFileError("hand_unreachable",reply.reason);case"closed":throw new DeviceFileError("hand_unreachable","the hand link was closed");case"epoch_refused":throw new DeviceFileError("refused_by_policy",`epoch: ${reply.reason}`)}}function createRemoteDeviceFiles(link,scope,mintId){let call=async(op,args,signal,channel=FILE_CHANNEL)=>{let hello=await link.hello(HELLO_WAIT_MS,signal);if(signal?.aborted)throw new DeviceFileError("aborted","the operation was aborted");if(hello===void 0||!hello.ops.includes(channel))throw new DeviceFileError("unsupported",`the hand serves no ${channel} channel`);return valueOf(await link.dispatch({kind:"file",executionId:mintId(),scope,op,args},signal))};return{read:async(path,options)=>{let value2=await call("read",{path},options?.signal);if(typeof value2!="string")throw new DeviceFileError("protocol","malformed read outcome");return decodeBase64(value2)},write:async(path,data,options)=>{if(data.byteLength>FILE_CHANNEL_MAX_BYTES)throw new DeviceFileError("too_large",path);let exclusive=options?.exclusive===!0;await call("write",{path,data:encodeBase64(data),exclusive},options?.signal)},list:async(path,options)=>{let value2=await call("list",{path},options?.signal);if(!Array.isArray(value2)||!value2.every(entry2=>typeof entry2=="string"))throw new DeviceFileError("protocol","malformed list outcome");return value2},stat:async(path,options)=>await call("stat",{path},options?.signal),rename:async(from,to,options)=>{await call("rename",{path:from,to},options?.signal)},remove:async(path,options)=>{await call("remove",{path},options?.signal)},mkdir:async(path,options)=>{await call("mkdir",{path},options?.signal)},run:async(request,options)=>{if(request.stdin!==void 0&&request.stdin.byteLength>FILE_CHANNEL_MAX_BYTES)throw new DeviceFileError("too_large","stdin");let args={path:request.cwd,exe:request.exe,argv:[...request.argv],env:{...request.env},...request.stdin===void 0?{}:{stdin:encodeBase64(request.stdin)},...request.timeoutMs===void 0?{}:{timeoutMs:request.timeoutMs},activityLock:request.activityLock===!0},value2=await call("run",args,options?.signal,RUN_CHANNEL);if(typeof value2!="object"||value2===null||Array.isArray(value2))throw new DeviceFileError("protocol","malformed run outcome");let{code,signal,stdout,stderr}=value2;if(typeof stdout!="string"||typeof stderr!="string")throw new DeviceFileError("protocol","malformed run outcome");return{code:typeof code=="number"?code:null,signal:typeof signal=="string"?signal:null,stdout:decodeBase64(stdout),stderr}}}}var MODEL_PLANE="model",REASONING=["minimal","low","medium","high","xhigh","max"],isRecord7=value2=>typeof value2=="object"&&value2!==null;function refuse(detail){throw new PlaneRefusedError(`malformed_request: ${detail}`)}function decodeModel(value2){if(value2!==void 0)return(!isRecord7(value2)||typeof value2.provider!="string"||typeof value2.id!="string")&&refuse("model"),{provider:value2.provider,id:value2.id}}function decodeContext(value2){return(!isRecord7(value2)||!Array.isArray(value2.messages))&&refuse("context"),value2.systemPrompt!==void 0&&typeof value2.systemPrompt!="string"&&refuse("systemPrompt"),value2.tools!==void 0&&!Array.isArray(value2.tools)&&refuse("tools"),{...value2.systemPrompt===void 0?{}:{systemPrompt:value2.systemPrompt},messages:value2.messages,...value2.tools===void 0?{}:{tools:value2.tools}}}function decodeOptions(value2){if(value2===void 0)return;isRecord7(value2)||refuse("options");let{maxTokens,temperature,reasoning}=value2;return maxTokens!==void 0&&(typeof maxTokens!="number"||!Number.isSafeInteger(maxTokens)||maxTokens<=0)&&refuse("maxTokens"),temperature!==void 0&&(typeof temperature!="number"||!Number.isFinite(temperature))&&refuse("temperature"),reasoning!==void 0&&!REASONING.includes(reasoning)&&refuse("reasoning"),{...maxTokens===void 0?{}:{maxTokens},...temperature===void 0?{}:{temperature},...reasoning===void 0?{}:{reasoning}}}function decodeModelPlaneRequest(body){isRecord7(body)||refuse("body");let model=decodeModel(body.model),options=decodeOptions(body.options);return{...model===void 0?{}:{model},context:decodeContext(body.context),...options===void 0?{}:{options}}}function serveModelPlane(complete){return async(body,signal)=>{let message=await complete(decodeModelPlaneRequest(body),signal);return JSON.parse(JSON.stringify(message))}}function createModelPlaneClient(nested){return{async complete(request,signal){let reply=await nested(MODEL_PLANE,JSON.parse(JSON.stringify(request)),signal);if(!isRecord7(reply)||reply.role!=="assistant"||!Array.isArray(reply.content))throw new PlaneRefusedError("malformed_reply");return reply}}}var SESSION_PLANE="session",isRecord8=value2=>typeof value2=="object"&&value2!==null&&!Array.isArray(value2);function decodeSessionPlaneRequest(body){if(!isRecord8(body)||typeof body.tool!="string"||body.tool.length===0)throw new PlaneRefusedError("malformed_request: tool");if(!isRecord8(body.arguments))throw new PlaneRefusedError("malformed_request: arguments");return{tool:body.tool,arguments:body.arguments}}function loopSideToolNames(tools){let names=new Set;for(let tool of tools)tool.runs==="brain"&&names.add(tool.name);return names}function serveSessionPlane(options){return async(body,signal)=>{let request=decodeSessionPlaneRequest(body);if(!options.loopSide.has(request.tool))throw new Error(`not_loop_side: ${request.tool}`);let result=await options.run(request,signal);return JSON.parse(JSON.stringify(result))}}function createSessionPlaneClient(nested){return{async call(request,signal){let reply=await nested(SESSION_PLANE,JSON.parse(JSON.stringify(request)),signal);if(!isRecord8(reply)||!Array.isArray(reply.content))throw new PlaneRefusedError("malformed_reply");return reply}}}function createLoopToolHost(agent){return{execute(call,options){let{batchStoreFactory,afterToolFreeze}=agent;if(batchStoreFactory===void 0)throw new BatchStoreMissingError;if(afterToolFreeze===void 0)throw new PreflightCarryMissingError;return createPreparedToolHost({...pick(agent),afterToolFreeze},batchStoreFactory).execute(call,options)}}}function pick(agent){return{resolveUnknownToolCall:agent.resolveUnknownToolCall,beforeToolCall:agent.beforeToolCall,afterToolCall:agent.afterToolCall,removedToolHints:agent.removedToolHints}}function stagesOf(calls,sideOf,isSequential2,parallel){let stages=[],segments=[],owner=[],open=!1;for(let call of calls){let side=sideOf(call),barrier=parallel&&isSequential2(call),stage=stages.at(-1);open&&!barrier&&stage!==void 0&&(parallel||stage[0]?.side===side)||stages.push([]);let current=stages.at(-1)??[],segment=current.find(entry2=>entry2.side===side);segment===void 0&&(segment={side,calls:[]},current.push(segment),segments.push(segment)),segment.calls.push(call),owner.push(segments.indexOf(segment)),open=!barrier}return{stages,segments,owner}}function queueBy(items,idOf){let queues=new Map;for(let item of items){let queue=queues.get(idOf(item))??[];queue.push(item),queues.set(idOf(item),queue)}return queues}function holdingResults(emit,held){return event=>{if(event.type!=="message_start"&&event.type!=="message_end"||event.message.role!=="toolResult")return emit(event);let{toolCallId}=event.message,open=event.type==="message_end"?held.findLast(entry2=>entry2.toolCallId===toolCallId):void 0;open!==void 0&&open.events.at(-1)?.type==="message_start"?open.events.push(event):held.push({toolCallId,events:[event]})}}function createSplitToolHost(options){let sideOf=call=>options.loopSide(call.name)?"loop":"hand",isSequential2=call=>options.isSequential(call.name),hostOf=side=>side==="loop"?options.loop:options.hand;return{async execute(call,hostOptions){let parallel=call.mode==="parallel",{stages,segments,owner}=stagesOf(call.calls,sideOf,isSequential2,parallel),[only]=segments;if(segments.every(segment=>segment.side===only?.side))return hostOf(only?.side??"hand").execute(call,hostOptions);let held=segments.map(()=>[]),run=async segment=>{let index=segments.indexOf(segment);results[index]=await hostOf(segment.side).execute({...call,calls:segment.calls},parallel?{...hostOptions,emit:holdingResults(hostOptions.emit,held[index]??[])}:hostOptions)},results=segments.map(()=>{});for(let stage of stages)if(await Promise.all(stage.map(run)),hostOptions.signal?.aborted)break;let messages=results.map(result=>queueBy(result?.messages??[],message=>message.toolCallId)),events=held.map(entries=>queueBy(entries,entry2=>entry2.toolCallId)),ordered=[];for(let[index,raw]of call.calls.entries()){let segment=owner[index]??-1;for(let event of events[segment]?.get(raw.id)?.shift()?.events??[])await hostOptions.emit(event);let message=messages[segment]?.get(raw.id)?.shift();message!==void 0&&ordered.push(message)}let ran=results.filter(result=>(result?.messages.length??0)>0);return{messages:ordered,terminate:ran.length>0&&ran.every(result=>result.terminate)}}}}var CHAIN_COUNT_LIMIT="chain_count_limit",CHAIN_ORIGIN=0,ChainCountLimitError=class extends Error{constructor(count,limit){super(`This thread call would be hop ${count} of its chain; your thread chain count limit is ${limit}.`),this.reason=CHAIN_COUNT_LIMIT,this.name="ChainCountLimitError",this.count=count,this.limit=limit}},isCount=value2=>typeof value2=="number"&&Number.isSafeInteger(value2)&&value2>=0;function nextChainCount(sessionCount){if(!isCount(sessionCount))throw new TypeError(`not a chain count: ${String(sessionCount)}`);return sessionCount+1}function decodeChainCount(value2){if(value2===void 0)return nextChainCount(0);if(!isCount(value2)||value2===0)throw new TypeError(`malformed chain count: ${JSON.stringify(value2)}`);return value2}function admitChainCall(count,readLimit){let limit=readLimit();if(limit!==void 0&&count>limit)throw new ChainCountLimitError(count,limit);return count}var LoopHookFailedError=class extends Error{constructor(message){super(message),this.name="LoopHookFailedError"}},LoopHookRestartedError=class extends Error{constructor(event){super(`The user's machine restarted while it ran the ${event} hooks; they were not run again and may have run.`),this.uncertain=!0,this.name="LoopHookRestartedError"}};function createLoopHookHost(options){let{transport,lane}=options,mintId=options.mintId??(()=>crypto.randomUUID()),pending=new Map,closed=!1,send=call=>{transport.send(lane,encodeLoopHookMessage(call)).catch(error=>{let reason=error instanceof Error?error.message:String(error);settle2(call.callId,waiter=>waiter.reject(new Error(`The link to the user's machine closed: ${reason}`)))})},settle2=(callId,finish)=>{let waiter=pending.get(callId);waiter!==void 0&&(pending.delete(callId),finish(waiter))};return transport.onFrame(frame=>{let message=decodeLoopHookMessage(frame.payload);if(message!==void 0)switch(message.kind){case"hook.started":{let waiter=pending.get(message.callId);waiter!==void 0&&(waiter.startedBy=message.instance);return}case"hook.reply":return settle2(message.callId,waiter=>waiter.resolve(message.result));case"hook.failed":return settle2(message.callId,waiter=>waiter.reject(new LoopHookFailedError(message.error)));case"hook.hello":for(let waiter of[...pending.values()])waiter.startedBy===void 0?send(waiter.call):waiter.startedBy!==message.instance&&settle2(waiter.call.callId,stale=>stale.reject(new LoopHookRestartedError(stale.call.event)));return;case"hook.call":return}}),{run(event,payload,signal){if(closed)return Promise.reject(new Error("The loop-hook link is closed"));if(signal?.aborted)return Promise.reject(new Error("Operation aborted"));let call={kind:"hook.call",callId:mintId(),event,payload},result=new Promise((resolve,reject)=>{pending.set(call.callId,{call,resolve,reject})}),onAbort=()=>settle2(call.callId,waiter=>waiter.reject(new Error("Operation aborted")));return signal?.addEventListener("abort",onAbort,{once:!0}),result.then(()=>signal?.removeEventListener("abort",onAbort),()=>signal?.removeEventListener("abort",onAbort)),send(call),result},waiting:()=>[...pending.keys()],close(){closed=!0;for(let callId of[...pending.keys()])settle2(callId,waiter=>waiter.reject(new Error("The loop-hook link was closed before the hooks ran")));transport.close()}}}function createEpochGate(epoch,send){let lanes=new Map,decide=(state,refusal2)=>{state.verdict={refusal:refusal2},state.decided.resolve(refusal2)},ask=(lane,state)=>{state.verdict!==void 0&&(state.verdict=void 0,state.decided=Promise.withResolvers());let asked=state.decided;send(lane,{kind:"floor",epoch}).catch(error=>{let reason=error instanceof Error?error.message:String(error);state.decided===asked&&state.verdict===void 0&&decide(state,`hand_unreachable: ${reason}`)})};return{open(lane){let known=lanes.get(lane);if(known!==void 0)return known.verdict===void 0?known.decided.promise:Promise.resolve(known.verdict.refusal);let state={decided:Promise.withResolvers(),verdict:void 0};return lanes.set(lane,state),ask(lane,state),state.decided.promise},answer(lane,message){let state=lanes.get(lane);if(!(state===void 0||state.verdict!==void 0)){if(message.kind==="floor_refused")return decide(state,message.reason);if(message.floor===epoch)return decide(state,void 0);decide(state,message.floor>epoch?"epoch_superseded":"epoch_floor_mismatch")}},resend(){for(let[lane,state]of lanes)state.verdict?.refusal===void 0&&ask(lane,state)}}}function createHandLink(transport,planeHandlers={},filePlanes=[],epoch){let pending=new Map,stamp=epoch===void 0?{}:{epoch},sent=new Set,planes=createPlaneServer({transport,planes:planeHandlers,liveLane:(executionId,plane)=>{let waiting=pending.get(executionId)?.message;if(waiting?.kind==="invoke"||waiting?.kind==="file"&&(plane===void 0||filePlanes.includes(plane)))return waiting.scope.id}}),announced,waitedOut=!1,helloWaiters=new Set,settle2=(executionId,reply)=>{let waiter=pending.get(executionId);waiter!==void 0&&(pending.delete(executionId),sent.delete(executionId),planes.parentEnded(executionId),waiter.resolve(reply))},send=(lane,message)=>transport.send(lane,encodeRemoteMessage(message)),gate=epoch===void 0?void 0:createEpochGate(epoch,(lane,floor)=>send(lane,floor)),whenOpen=(lane,executionId,go)=>{if(gate===void 0)return go();gate.open(lane).then(refusal2=>{if(pending.has(executionId)){if(refusal2===void 0)return go();settle2(executionId,{kind:"epoch_refused",reason:refusal2})}})};return transport.onFrame(frame=>{let nested=decodePlaneMessage(frame.payload);if(nested!==void 0)return planes.receive(frame.lane,nested);let message;try{message=decodeRemoteMessage(frame.payload)}catch{return}let ack=executionId=>{send(frame.lane,{kind:"ack",executionId,...stamp}).catch(()=>{})};if(message.kind==="hello"){announced=message;for(let waiter of[...helloWaiters])waiter(message);if(gate?.resend(),message.durable)for(let{message:waiting}of pending.values())sent.has(waiting.executionId)&&whenOpen(waiting.scope.id,waiting.executionId,()=>{send(waiting.scope.id,waiting).catch(()=>{})});return}if(message.kind==="floor_ack"||message.kind==="floor_refused")return gate?.answer(frame.lane,message);message.kind==="settled"?(settle2(message.executionId,{kind:"settled",result:message.result}),ack(message.executionId)):message.kind==="terminal"?(settle2(message.executionId,{kind:"terminal",terminal:message}),ack(message.executionId)):message.kind==="refused"&&settle2(message.executionId,{kind:"refused",reason:message.reason})}),{dispatch(unstamped,signal){let message={...unstamped,...stamp},{executionId}=message,replied=new Promise(resolve=>{pending.set(executionId,{message,resolve})});if(signal?.aborted)return settle2(executionId,{kind:"aborted",sent:!1}),replied;let onAbort=()=>{if(!pending.has(executionId))return;let reached=sent.has(executionId);reached&&send(message.scope.id,{kind:"abort",executionId,...stamp}).catch(()=>{}),settle2(executionId,{kind:"aborted",sent:reached})};return signal?.addEventListener("abort",onAbort,{once:!0}),replied.then(()=>signal?.removeEventListener("abort",onAbort)),whenOpen(message.scope.id,executionId,()=>{sent.add(executionId),send(message.scope.id,message).catch(error=>{settle2(executionId,{kind:"unreachable",reason:error instanceof Error?error.message:String(error)})})}),replied},hello(ms,signal){return announced!==void 0||waitedOut||signal?.aborted?Promise.resolve(announced):new Promise(resolve=>{let done=hello=>{clearTimeout(timer),helloWaiters.delete(done),signal?.removeEventListener("abort",onAbort),resolve(hello)},onAbort=()=>done(void 0),timer=setTimeout(()=>{waitedOut=!0,done(void 0)},ms);helloWaiters.add(done),signal?.addEventListener("abort",onAbort,{once:!0})})},close(){for(let executionId of[...pending.keys()])settle2(executionId,{kind:"closed"});transport.close()}}}function errorResult2(text){return{content:[{type:"text",text}],details:{},isError:!0}}function terminalResult(placement,terminal2){if(placement==="split-local")return{content:[{type:"text",text:TOOL_RESULT_PLACEHOLDER}],details:{},isError:!1};let{reason,uncertain,hooksRan}=terminal2;return{content:[{type:"text",text:`The tool call ended without a result (${reason}) and was not run again. ${uncertain?"Its effects are uncertain.":"It had no effect."}`}],details:{outcome:reason,uncertain,hooksRan},isError:!0}}function createRemoteToolHost(options){let mintId=options.mintId??(()=>crypto.randomUUID()),link=createHandLink(options.transport,options.planes??{},options.filePlanes??[],options.epoch),resultOf=reply=>{switch(reply.kind){case"settled":return reply.result;case"terminal":return terminalResult(options.placement,reply.terminal);case"refused":return errorResult2(`The hand refused this tool call: ${reply.reason}`);case"aborted":return errorResult2(reply.sent?"Tool execution aborted":"Operation aborted");case"unreachable":return errorResult2(`The hand is unreachable: ${reply.reason}`);case"closed":return errorResult2("The hand link was closed before the call settled");case"epoch_refused":return errorResult2(`The hand refused this session's epoch: ${reply.reason}`)}},dispatch=(invoke,signal)=>({settled:link.dispatch(invoke,signal).then(resultOf)});return{async execute(call,hostOptions){let{emit,signal}=hostOptions,batchId=mintId(),invokeOf=(raw,index)=>({kind:"invoke",executionId:mintId(),batchId,index,scope:call.scope,toolCallId:raw.id,name:raw.name,arguments:raw.arguments,...options.sessionRef===void 0?{}:{sessionRef:options.sessionRef}}),finish=async(raw,result)=>(await emit({type:"tool_execution_end",toolCallId:raw.id,toolName:raw.name,result,isError:result.isError}),result),outcomes=[];for(let[index,raw]of call.calls.entries()){await emit({type:"tool_execution_start",toolCallId:raw.id,toolName:raw.name,args:raw.arguments});let outcome2=dispatch(invokeOf(raw,index),signal).settled.then(result=>finish(raw,result));if(outcomes.push(outcome2),call.mode==="sequential"&&(await outcome2,signal?.aborted))break}let results=await Promise.all(outcomes),messages=[];for(let[index,result]of results.entries()){let raw=call.calls[index];if(raw===void 0)continue;let message={role:"toolResult",toolCallId:raw.id,toolName:raw.name,content:result.content,details:result.details,...result.addedToolNames?.length?{addedToolNames:[...result.addedToolNames]}:{},isError:result.isError,timestamp:Date.now()};await emit({type:"message_start",message}),await emit({type:"message_end",message}),messages.push(message)}return{messages,terminate:results.length>0&&results.every(result=>result.terminate===!0)}},deviceFiles:scope=>createRemoteDeviceFiles(link,scope,mintId),close:()=>link.close()}}var PIPE_PREFIX="\\\\.\\pipe\\";function localEndpoint(platform,name,socketDir){if(name.length===0||/[\\/]/.test(name))throw new RangeError(`local endpoint: a name must be non-empty with no path separator, got ${JSON.stringify(name)}`);if(platform==="win32"){let address=`${PIPE_PREFIX}${name}`;if(address.length>256)throw new RangeError("local endpoint: a pipe name is at most 256 characters");return{kind:"named-pipe",address}}return{kind:"unix-socket",address:`${socketDir.replace(/\/+$/,"")}/${name}.sock`,mode:384}}function endpointKey(endpoint){return endpoint.kind==="named-pipe"?endpoint.address.toUpperCase():endpoint.address}function createLink(a,b,schedule){let generation=0,up=!1,drop=()=>{up&&(up=!1,generation+=1,a.detached(),b.detached())},half=(to,at)=>({send:message=>(schedule(()=>{up&&generation===at&&to.message(message)}),!0),close:()=>{generation===at&&drop()}});return{connect(){up||(up=!0,generation+=1,a.attached(half(b,generation)),b.attached(half(a,generation)))},drop,get connected(){return up}}}function createInProcessNetwork(options={}){let schedule=options.schedule??queueMicrotask,listeners=new Map;return{listen(endpoint,side){let key=endpointKey(endpoint);if(listeners.has(key))throw new Error(`in-process carrier: ${endpoint.address} already has a listener`);return listeners.set(key,{side,dialed:!1}),()=>{listeners.delete(key)}},dial(endpoint,side){let listener=listeners.get(endpointKey(endpoint));if(listener===void 0)throw new Error(`in-process carrier: no listener at ${endpoint.address}`);if(listener.dialed)throw new Error(`in-process carrier: ${endpoint.address} is already dialed`);return listener.dialed=!0,createLink(side,listener.side,schedule)}}}var Result={ok(value2){return{ok:!0,value:value2}},err(error){return{ok:!1,error}},isOk(result){return result.ok},isErr(result){return!result.ok}};function TaggedError(tag){class TaggedErrorClass extends Error{constructor(props){super(props.message),this._tag=tag,this.name=tag,Object.assign(this,props)}toJSON(){let payload={};for(let key of Object.keys(this))key!=="_tag"&&(payload[key]=this[key]);return{_tag:tag,message:this.message,...payload}}static is(value2){return value2 instanceof TaggedErrorClass}}return TaggedErrorClass}var LaneBusy=class extends TaggedError("LaneBusy"){},OperationMismatch=class extends TaggedError("OperationMismatch"){},NoActiveRun=class extends TaggedError("NoActiveRun"){},NoActiveOperation=class extends TaggedError("NoActiveOperation"){},NothingToResume=class extends TaggedError("NothingToResume"){},NothingToCompact=class extends TaggedError("NothingToCompact"){},InvalidMessage=class extends TaggedError("InvalidMessage"){},InvalidNavigation=class extends TaggedError("InvalidNavigation"){},UnknownSkill=class extends TaggedError("UnknownSkill"){},UnknownTemplate=class extends TaggedError("UnknownTemplate"){},UnknownTarget=class extends TaggedError("UnknownTarget"){},InvalidLane=class extends TaggedError("InvalidLane"){},Closed=class extends TaggedError("Closed"){},HarnessFault=class extends Error{constructor(message,cause){super(message),this.name="HarnessFault",this.cause=cause}},HarnessClosed=class extends Error{constructor(){super("AgentHarness was closed while the operation was active"),this.name="HarnessClosed"}};function matchError(error,matchers){let matcher=matchers[error._tag];return matcher(error)}import{awaitWithContext,BACKGROUND_CONTEXT,createContextKey,TODO_CONTEXT,withAbortSignal,withCancel,withContextValue,withoutAbortSignal}from"@earendil-works/chord/context";var TELEMETRY_CONTEXT_KEY=createContextKey("pi.telemetryContext"),SESSION_CWD_CONTEXT_KEY=createContextKey("pi.sessionCwd");function getSessionCwd(context){return context.value(SESSION_CWD_CONTEXT_KEY)}function withSessionCwd(cwd,context){return cwd===void 0?context:withContextValue(SESSION_CWD_CONTEXT_KEY,cwd,context)}function getTelemetryContext(context){return context.value(TELEMETRY_CONTEXT_KEY)??NOOP_TELEMETRY_CONTEXT}function withTelemetryContext(telemetryContext,context){return withContextValue(TELEMETRY_CONTEXT_KEY,telemetryContext,context)}var AbortRequested=class extends Error{constructor(cancellation){super("Abort requested"),this.name="AbortRequested",this.cancellation=cancellation}};function createGate(){let state={status:"open"},controller=new AbortController,check=()=>{if(state.status==="aborting")throw new AbortRequested(state.cancellation);if(state.status==="closed")throw state.error};return{gate:{admit(invoke){return check(),invoke()},signal:controller.signal},control:{beginAbort(cancellation){state.status==="open"&&(state={status:"aborting",cancellation})},signalAbort(){state.status!=="aborting"||controller.signal.aborted||controller.abort(new AbortRequested(state.cancellation))},close(error){state.status!=="closed"&&(state={status:"closed",error},controller.signal.aborted||controller.abort(error))}}}}var SliceNotImplemented=class extends Error{constructor(operation){super(`${operation} is not implemented until its later AgentHarness slice`),this.name="SliceNotImplemented"}},Drive=class{constructor(options,context){this.operationId=options.operationId,this.context=withoutAbortSignal(context),this.waitForRetry=options.waitForRetry??!1,this.deferredPermits=options.pollDeferred===!0?1:0;let resolveCompletion,rejectCompletion;this.completion=new Promise((resolve,reject)=>{resolveCompletion=resolve,rejectCompletion=reject}),this.resolveCompletion=resolveCompletion,this.rejectCompletion=rejectCompletion,this.completion.catch(()=>{});let{gate,control}=createGate();this.gate=gate,this.control=control,this.closeController=new AbortController,this.closeSignal=this.closeController.signal}settle(outcome2){this.resolveCompletion(outcome2)}fail(error){this.rejectCompletion(error)}beginAbort(cancellation){this.control.beginAbort(cancellation)}signalAbort(){this.control.signalAbort()}closeGate(error){this.control.close(error),this.closeSignal.aborted||this.closeController.abort(error),this.rejectCompletion(error)}};var COMPACTION_SUMMARY_PREFIX=`The conversation history before this point was compacted into the following summary:
|
|
2
|
+
import{AssistantMessageFrameEncoder,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,TOOL_RESULT_PLACEHOLDER,dropFailedAssistantTurns,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isRecoverableLength,reduceAssistantMessageFrames,require_dist,shouldRecoverTextToolCalls,validateToolArguments}from"./chunk-YUVC7SJB.js";import{supportsAllowedToolChoice}from"./chunk-COH5F7QV.js";import{uuidv7}from"./chunk-Y7QPP7BG.js";import{resolveToolNameMatch}from"./chunk-QTS2XGPQ.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{DEFAULT_MAX_AGENT_RETRY_DELAY_MS,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,OAUTH_REFRESH_UNAVAILABLE_DIAGNOSTIC,contentText,createInitialSystemMessage,getCurrentTools,getToolStateChanges,isOAuthRefreshUnavailableError,isRetryableAssistantError,normalizeContext,retryAssistantCall,retryDelayMs}from"./chunk-OKMHSVCA.js";import{readProviderDiagnostic,sanitizeProviderDiagnostic}from"./chunk-JGKH3D6W.js";import{EventStream,assistantEvents,assistantRecords,carryAssistantCapture,createAssistantMessageEventStream,getAssistantCapture,isAssistantProgress,pushAssistantProgress,sanitizeProviderErrorMessage,subscribeAssistantCapture}from"./chunk-NDNQ23SK.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{typebox_exports}from"./chunk-MIENF2YK.js";import{__commonJS,__export,__toESM}from"./chunk-IKOFCODM.js";var require_ignore=__commonJS({"node_modules/ignore/index.js"(exports,module){function makeArray(subject){return Array.isArray(subject)?subject:[subject]}var UNDEFINED=void 0,EMPTY="",SPACE=" ",ESCAPE="\\",REGEX_LITERAL_SPECIAL=/[.*+?()[\]{}^$|\\/]/,REGEX_TEST_BLANK_LINE=/^\uFEFF? *$/,REGEX_INVALID_TRAILING_BACKSLASH=/(?:[^\\]|^)\\$/,REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION=/^\\!/,REGEX_REPLACE_LEADING_EXCAPED_HASH=/^\\#/,REGEX_SPLITALL_CRLF=/\r?\n/g,DOUBLE_SLASH="//",SLASH_CODE=47,DOT_CODE=46,SLASH="/",TMP_KEY_IGNORE="node-ignore";typeof Symbol<"u"&&(TMP_KEY_IGNORE=Symbol.for("node-ignore"));var KEY_IGNORE=TMP_KEY_IGNORE,define=(object3,key,value2)=>(Object.defineProperty(object3,key,{value:value2}),value2),RETURN_FALSE=()=>!1,cleanRangeBackSlash=slashes=>{let{length}=slashes;return slashes.slice(0,length-length%2)},POSIX_CLASSES={alnum:"0-9A-Za-z",alpha:"A-Za-z",blank:" \\t",cntrl:"\\x00-\\x1f\\x7f",digit:"0-9",graph:"!-.0-~",lower:"a-z",print:" -.0-~",punct:"!-.:-@\\[-`{-~",space:" \\t\\n\\r",upper:"A-Z",xdigit:"0-9A-Fa-f"},CLASS_MEMBERS_TO_ESCAPE="\\]^-[",escapeMember=char=>CLASS_MEMBERS_TO_ESCAPE.indexOf(char)<0?char:ESCAPE+char,NON_SLASH="(?!\\/)",classSource=(negated,body)=>{if(negated)return`[^\\/${body}]`;let source=`[${body}]`;return new RegExp(source).test("/")?NON_SLASH+source:source},scanBracket=(pattern,start)=>{let{length}=pattern,index=start+1,negated=EMPTY,lead=pattern[index];(lead==="!"||lead==="^")&&(negated="^",index++);let body=EMPTY,prev=EMPTY;for(;;){let char=pattern[index];if(char===UNDEFINED)return null;if(char===ESCAPE){let escaped=pattern[index+1];if(escaped===UNDEFINED)return null;body+=escapeMember(escaped),prev=escaped,index++}else if(char==="-"&&prev&&index+1<length&&pattern[index+1]!=="]"){index++;let to=pattern[index];to===ESCAPE&&(to=pattern[index+=1]),prev<=to&&(body+=`-${escapeMember(to)}`),prev=EMPTY}else if(char==="["&&pattern[index+1]===":"){let nameStart=index+2,end=nameStart;for(;end<length&&pattern[end]!=="]";)end++;if(end===length)return null;if(end>nameStart&&pattern[end-1]===":"){let expanded=POSIX_CLASSES[pattern.slice(nameStart,end-1)];if(expanded===UNDEFINED)return null;body+=expanded,prev=EMPTY,index=end}else body+=escapeMember("["),prev="[",index=nameStart-2}else body+=escapeMember(char),prev=char;if(index++,pattern[index]==="]")return{end:index,source:classSource(negated,body)}}},NEVER_MATCH="[]",PLACEHOLDER="\0",REGEX_RESTORE_PLACEHOLDER=new RegExp(`${PLACEHOLDER}(\\d+)${PLACEHOLDER}`,"g"),TRAILING_WILDCARD="\uE000",extractBrackets=pattern=>{let sources=[],hold=source=>`${PLACEHOLDER}${sources.push(source)-1}${PLACEHOLDER}`,{length}=pattern,out=EMPTY,index=0;for(;index<length;){let char=pattern[index];if(char===ESCAPE){let escaped=pattern[index+1];escaped==="*"||escaped==="["||escaped===SPACE||escaped===ESCAPE?out+=pattern.slice(index,index+2):out+=hold(REGEX_LITERAL_SPECIAL.test(escaped)?ESCAPE+escaped:escaped),index+=2}else if(char===PLACEHOLDER)out+=hold(`[${PLACEHOLDER}]`),index++;else if(char==="["){let scanned=scanBracket(pattern,index);scanned===null?(out+=hold(NEVER_MATCH),index=length):(out+=hold(scanned.source),index=scanned.end+1)}else out+=char,index++}return{source:out,sources}},DIRECT=null,REGEX_INNER_SLASH=/\/(?!$)/,REPLACERS=[[/^\uFEFF/,()=>EMPTY,"\uFEFF"],[/[\r\n]+$/,()=>EMPTY],[/((?:\\\\)*?)(\\? +)$/,(_,m1,m2)=>m1+(m2.indexOf("\\")===0?SPACE:EMPTY)],[/(\\+?) /g,(_,m1)=>{let{length}=m1;return m1.slice(0,length-length%2)+SPACE}],[/[\\$.|*+(){^]/g,match=>`\\${match}`],[/(?!\\)\?/g,()=>"[^/]","?"],[/^\//,()=>"^",SLASH],[/\//g,()=>"\\/",SLASH],[/^\^*(?:\\\*\\\*\\\/)+/,()=>"^(?:.*\\/)?","*"],[DIRECT,(source,pattern)=>!source||source[0]==="^"?source:(REGEX_INNER_SLASH.test(pattern)?"^":"(?:^|\\/)")+source],[/\\\/\\\*\\\*(?=\\\/|$)/g,(_,index,str)=>index+6<str.length?str.slice(index+6)==="\\/"?"(?:\\/[^\\/]+)+":"(?:\\/[^\\/]+)*":"\\/.+","*"],[/(^|[^\\]+)(\\\*)+(?=.+)/g,(_,p1,p2)=>{let unescaped=p2.replace(/\\\*/g,"[^\\/]*");return p1+unescaped},"*"],[/(^|[^\\])((?:\\\\)*)\\\*$/,(match,p1,p2)=>p2.length/2%2===0?p1+p2+TRAILING_WILDCARD:match,"*"],[/\\\\\\(?=[$.|*+(){^])/g,()=>ESCAPE,ESCAPE+ESCAPE],[/\\\\/g,()=>ESCAPE,ESCAPE+ESCAPE],[/\\\[([^\]/]*?)(\\*)($|\])/g,(match,range,endEscape,close)=>`\\[${range}${cleanRangeBackSlash(endEscape)}${close}`,"["],[DIRECT,source=>{let last=source[source.length-1];return!last||last===TRAILING_WILDCARD?source:last===SLASH?`${source}$`:`${source}(?=$|\\/$)`}]],REGEX_REPLACE_TRAILING_WILDCARD=/(^|\\\/)?\uE000$/,MODE_IGNORE="regex",MODE_CHECK_IGNORE="checkRegex",UNDERSCORE="_",TRAILING_WILD_CARD_REPLACERS={[MODE_IGNORE](_,p1){return`${p1?`${p1}[^/]+`:"[^/]*"}(?=$|\\/$)`},[MODE_CHECK_IGNORE](_,p1){return`${p1?`${p1}[^/]*`:"[^/]*"}(?=$|\\/$)`}},WILDCARD="[^\\/]*",pinWildcards=source=>{if(source.indexOf(WILDCARD)<0)return source;let tokens=[],{length}=source,index=0;for(;index<length;){let char=source[index];if(source.startsWith(WILDCARD,index))tokens.push({wildcard:!0}),index+=WILDCARD.length;else if(char==="["){let end=index+1;for(source[end]==="^"&&end++,source[end]==="]"&&end++;end<length&&source[end]!=="]";)end+=source[end]===ESCAPE?2:1;end++,tokens.push({single:source.slice(index,end)}),index=end}else if(char===ESCAPE)tokens.push({single:source.slice(index,index+2)}),index+=2;else if(char==="("){let depth=0,end=index;do source[end]===ESCAPE?end++:source[end]==="("?depth++:source[end]===")"&&depth--,end++;while(end<length&&depth>0);"*+?".indexOf(source[end])>=0&&end++,tokens.push({boundary:source.slice(index,end)}),index=end}else char==="^"||char==="$"?(tokens.push({boundary:char}),index++):(tokens.push({single:char}),index++)}let out=EMPTY,run=[],flush=()=>{let lastWildcard;run.forEach((token,at)=>{token.wildcard&&(lastWildcard=at)}),run.forEach((token,at)=>{if(!token.wildcard){out+=token.single;return}out+=at===lastWildcard?WILDCARD:`(?:(?!${run[at+1].single})[^\\/])*`}),run=[]};return tokens.forEach(token=>{if(token.boundary===void 0){run.push(token);return}flush(),out+=token.boundary}),flush(),out},makeRegexPrefix=pattern=>{let{source,sources}=extractBrackets(pattern),replaced=REPLACERS.reduce((prev,[matcher,replacer,required])=>matcher===DIRECT?replacer(prev,pattern):required!==UNDEFINED&&prev.indexOf(required)<0?prev:matcher.test(prev)?prev.replace(matcher,replacer.bind(pattern)):prev,source);return sources.length?replaced.replace(REGEX_RESTORE_PLACEHOLDER,(match,index)=>sources[index]):replaced},matchesBasename=body=>{let index=body.indexOf(SLASH);return index<0||index===body.length-1},basenameOf=path=>{let end=path.length-1,index=path.lastIndexOf(SLASH,path[end]===SLASH?end-1:end);return index<0?path:path.slice(index+1)},parentOf=path=>{if(path.charCodeAt(0)===SLASH_CODE||path.indexOf(DOUBLE_SLASH)>=0){let slices=path.split(SLASH).filter(Boolean);return slices.pop(),slices.length?slices.join(SLASH)+SLASH:EMPTY}let end=path.length-1,cut=path.lastIndexOf(SLASH,path.charCodeAt(end)===SLASH_CODE?end-1:end);return cut<0?EMPTY:path.slice(0,cut+1)},isString2=subject=>typeof subject=="string",checkPattern=pattern=>pattern&&isString2(pattern)&&!REGEX_TEST_BLANK_LINE.test(pattern)&&!REGEX_INVALID_TRAILING_BACKSLASH.test(pattern)&&pattern.indexOf("#")!==0,splitPattern=pattern=>pattern.split(REGEX_SPLITALL_CRLF).filter(Boolean),IgnoreRule=class{constructor(pattern,mark,body,ignoreCase,negative,prefix){this.pattern=pattern,this.mark=mark,this.negative=negative,define(this,"body",body),define(this,"ignoreCase",ignoreCase),define(this,"regexPrefix",prefix)}get _basenameOnly(){return define(this,"_basenameOnly",matchesBasename(this.body))}get regex(){let key=UNDERSCORE+MODE_IGNORE;return this[key]?this[key]:this._make(MODE_IGNORE,key)}get checkRegex(){let key=UNDERSCORE+MODE_CHECK_IGNORE;return this[key]?this[key]:this._make(MODE_CHECK_IGNORE,key)}_make(mode,key){let str=pinWildcards(this.regexPrefix.replace(REGEX_REPLACE_TRAILING_WILDCARD,TRAILING_WILD_CARD_REPLACERS[mode])),regex=this.ignoreCase?new RegExp(str,"i"):new RegExp(str);return define(this,key,regex)}},createRule=({pattern,mark},ignoreCase)=>{let negative=!1,body=pattern;body.indexOf("!")===0&&(negative=!0,body=body.substr(1)),body=body.replace(REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION,"!").replace(REGEX_REPLACE_LEADING_EXCAPED_HASH,"#");let regexPrefix=makeRegexPrefix(body);return new IgnoreRule(pattern,mark,body,ignoreCase,negative,regexPrefix)},RuleManager=class{constructor(ignoreCase){this._ignoreCase=ignoreCase,this._rules=[],this._basenameCount=0}_add(pattern){if(pattern&&pattern[KEY_IGNORE]){this._rules=this._rules.concat(pattern._rules._rules),this._basenameCount+=pattern._rules._basenameCount,this._added=!0;return}if(isString2(pattern)&&(pattern={pattern}),checkPattern(pattern.pattern)){let rule=createRule(pattern,this._ignoreCase);this._added=!0,this._rules.push(rule),matchesBasename(rule.body)&&this._basenameCount++}}add(pattern){return this._added=!1,makeArray(isString2(pattern)?splitPattern(pattern):pattern).forEach(this._add,this),this._added}test(path,checkUnignored,mode){let ignored=!1,unignored=!1,matchedRule,rules=this._rules,{length}=rules,shortcut=this._basenameCount*2>=length,basename=shortcut?basenameOf(path):path;for(let index=0;index<length;index++){let rule=rules[index],{negative}=rule;!(unignored===negative&&ignored!==unignored||negative&&!ignored&&!unignored&&!checkUnignored)&&rule[mode].test(shortcut&&rule._basenameOnly?basename:path)&&(ignored=!negative,unignored=negative,matchedRule=negative?UNDEFINED:rule)}let ret={ignored,unignored};return matchedRule&&(ret.rule=matchedRule),ret}},throwError=(message,Ctor)=>{throw new Ctor(message)},checkPath=(path,originalPath,doThrow)=>isString2(path)?path?checkPath.isNotRelative(path)?doThrow(`path should be a \`path.relative()\`d string, but got "${originalPath}"`,RangeError):!0:doThrow("path must not be empty",TypeError):doThrow(`path must be a string, but got \`${originalPath}\``,TypeError),isNotRelative=path=>{let first=path.charCodeAt(0);if(first===SLASH_CODE)return!0;if(first!==DOT_CODE)return!1;if(path.length===1)return!0;let second=path.charCodeAt(1);return second===SLASH_CODE?!0:second!==DOT_CODE?!1:path.length===2||path.charCodeAt(2)===SLASH_CODE};checkPath.isNotRelative=isNotRelative;checkPath.convert=p=>p;var Ignore=class{constructor({ignorecase=!0,ignoreCase=ignorecase,allowRelativePaths=!1}={}){define(this,KEY_IGNORE,!0),this._rules=new RuleManager(ignoreCase),this._strictPathCheck=!allowRelativePaths,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}add(pattern){return this._rules.add(pattern)&&this._initCache(),this}addPattern(pattern){return this.add(pattern)}_test(originalPath,cache,checkUnignored){let path=originalPath&&checkPath.convert(originalPath);return checkPath(path,originalPath,this._strictPathCheck?throwError:RETURN_FALSE),this._t(path,cache,checkUnignored)}checkIgnore(path){if(path.charCodeAt(path.length-1)!==SLASH_CODE)return this.test(path);let parentPath=parentOf(path);if(parentPath){let parent=this._t(parentPath,this._testCache,!0);if(parent.ignored)return parent}return this._rules.test(path,!1,MODE_CHECK_IGNORE)}_t(path,cache,checkUnignored){if(path in cache)return cache[path];let parentPath=parentOf(path),parent=parentPath?this._t(parentPath,cache,checkUnignored):UNDEFINED;return cache[path]=parent&&parent.ignored?parent:this._rules.test(path,checkUnignored,MODE_IGNORE)}ignores(path){return this._test(path,this._ignoreCache,!1).ignored}createFilter(){return path=>!this.ignores(path)}filter(paths){return makeArray(paths).filter(this.createFilter())}test(path){return this._test(path,this._testCache,!0)}},factory=options=>new Ignore(options),isPathValid=path=>checkPath(path&&checkPath.convert(path),path,RETURN_FALSE),setupWindows=()=>{let makePosix=str=>/^\\\\\?\\/.test(str)||/["<>|\u0000-\u001F]+/u.test(str)?str:str.replace(/\\/g,"/");checkPath.convert=makePosix;let REGEX_TEST_WINDOWS_PATH_ABSOLUTE=/^[a-z]:\//i;checkPath.isNotRelative=path=>REGEX_TEST_WINDOWS_PATH_ABSOLUTE.test(path)||isNotRelative(path)};typeof process<"u"&&process.platform==="win32"&&setupWindows();module.exports=factory;factory.default=factory;module.exports.isPathValid=isPathValid;define(module.exports,Symbol.for("setupWindows"),setupWindows)}});var LOCAL_DEVICE_FILES=Symbol.for("senpi.device-files.local");function isLocalDeviceFiles(files){return files[LOCAL_DEVICE_FILES]===!0}var FILE_CHANNEL="file/1",FILE_CHANNEL_MAX_BYTES=8*1024*1024,DEVICE_FILE_OPS=["read","write","list","stat","rename","remove","mkdir","run"],RUN_CHANNEL="run/1",DeviceFileError=class extends Error{constructor(code,message,detail={}){super(`${code}: ${message}`),this.name="DeviceFileError",this.code=code,this.reason=detail.reason,this.uncertain=detail.uncertain??!1}},CODES=["not_found","not_a_file","exists","too_large","io","aborted","refused_by_grant","refused_by_policy","hand_unreachable","unsupported","interrupted","protocol"];function isDeviceFileErrorCode(value2){return typeof value2=="string"&&CODES.includes(value2)}var isRecord=value2=>typeof value2=="object"&&value2!==null;function decodeDeviceFileArgs(op,args){if(!isRecord(args)||typeof args.path!="string"||args.path.length===0)return;let path=args.path;switch(op){case"read":case"list":case"stat":case"remove":case"mkdir":return{op,path};case"write":return typeof args.data=="string"?{op,path,data:args.data,exclusive:args.exclusive===!0}:void 0;case"rename":return typeof args.to=="string"&&args.to.length>0?{op,path,to:args.to}:void 0;case"run":return decodeRunArgs(path,args);default:return}}function decodeRunArgs(path,args){let{exe,argv,env,stdin,timeoutMs,activityLock}=args;if(typeof exe!="string"||!Array.isArray(argv)||!argv.every(arg=>typeof arg=="string"))return;let environment=env??{};if(!(!isRecord(environment)||!Object.values(environment).every(value2=>typeof value2=="string"))&&!(stdin!==void 0&&typeof stdin!="string")&&!(timeoutMs!==void 0&&(typeof timeoutMs!="number"||!Number.isSafeInteger(timeoutMs)||timeoutMs<=0))&&!(activityLock!==void 0&&typeof activityLock!="boolean"))return{op:"run",path,exe,argv,env:environment,...stdin===void 0?{}:{stdin},...timeoutMs===void 0?{}:{timeoutMs},activityLock:activityLock===!0}}function encodeBase64(bytes){let binary="";for(let start=0;start<bytes.length;start+=32768)binary+=String.fromCharCode(...bytes.subarray(start,start+32768));return btoa(binary)}function decodeBase64(text){let binary=atob(text),bytes=new Uint8Array(binary.length);for(let index=0;index<binary.length;index++)bytes[index]=binary.charCodeAt(index);return bytes}function base64Length(text){let padding=text.endsWith("==")?2:text.endsWith("=")?1:0;return Math.floor(text.length*3/4)-padding}function fileOutcomeOf(details){if(!isRecord(details)||!isRecord(details.file))return;let file=details.file;if(file.ok===!0&&"value"in file)return{ok:!0,value:file.value};if(file.ok===!1&&isDeviceFileErrorCode(file.code)&&typeof file.message=="string")return{ok:!1,code:file.code,message:file.message}}var PlaneRefusedError=class extends Error{constructor(reason){super(`The brain refused this request: ${reason}`),this.name="PlaneRefusedError",this.reason=reason}},KINDS=["plane.request","plane.abort","plane.reply","plane.refused"],encoder=new TextEncoder,decoder=new TextDecoder;function encodePlaneMessage(message){return encoder.encode(JSON.stringify(message))}var isRecord2=value2=>typeof value2=="object"&&value2!==null,isId=value2=>typeof value2=="string"&&value2.length>0;function decodePlaneMessage(payload){let value2;try{value2=JSON.parse(decoder.decode(payload))}catch{return}if(!isRecord2(value2)||!KINDS.includes(value2.kind)||!isId(value2.parent)||!isId(value2.childRequestId))return;let address={parent:value2.parent,childRequestId:value2.childRequestId};switch(value2.kind){case"plane.request":return isId(value2.plane)&&"body"in value2?{kind:"plane.request",...address,plane:value2.plane,body:value2.body}:void 0;case"plane.abort":return{kind:"plane.abort",...address};case"plane.reply":return"body"in value2?{kind:"plane.reply",...address,body:value2.body}:void 0;default:return typeof value2.reason=="string"?{kind:"plane.refused",...address,reason:value2.reason}:void 0}}function createPlaneServer(options){let served=new Map,send=(lane,message)=>{options.transport.send(lane,encodePlaneMessage(message)).catch(()=>{})},serve=(lane,request)=>{let{parent,childRequestId}=request,refuse2=reason=>send(lane,{kind:"plane.refused",parent,childRequestId,reason}),parentLane=options.liveLane(parent,request.plane);if(parentLane===void 0)return refuse2("parent_terminal");if(parentLane!==lane)return refuse2("scope_lane_mismatch");let children=served.get(parent)??new Map;served.set(parent,children);let known=children.get(childRequestId);if(known!==void 0){known.answer!==void 0&&send(lane,known.answer);return}let handler=Object.hasOwn(options.planes,request.plane)?options.planes[request.plane]:void 0;if(handler===void 0)return refuse2("plane_unavailable");let entry2={controller:new AbortController};children.set(childRequestId,entry2),handler(request.body,entry2.controller.signal).then(body=>({kind:"plane.reply",parent,childRequestId,body}),error=>({kind:"plane.refused",parent,childRequestId,reason:`plane_failed: ${error instanceof Error?error.message:String(error)}`})).then(answer2=>{served.get(parent)?.get(childRequestId)===entry2&&(entry2.answer=answer2,send(lane,answer2))})};return{receive(lane,message){message.kind==="plane.request"?serve(lane,message):message.kind==="plane.abort"&&options.liveLane(message.parent)===lane&&served.get(message.parent)?.get(message.childRequestId)?.controller.abort()},parentEnded(executionId){let children=served.get(executionId);served.delete(executionId);for(let entry2 of children?.values()??[])entry2.controller.abort()}}}function createPlaneClient(options){let mintId=options.mintId??(()=>crypto.randomUUID()),waiting=new Map,live=new Set;return{requestFor(parent,lane,parentSignal){return live.add(parent),(plane,body,signal)=>new Promise((resolve,reject)=>{if(!live.has(parent)||parentSignal.aborted||signal?.aborted)return reject(new PlaneRefusedError("parent_terminal"));let childRequestId=mintId(),children=waiting.get(parent)??new Map;waiting.set(parent,children);let abort=()=>{children.delete(childRequestId)&&(options.transport.send(lane,encodePlaneMessage({kind:"plane.abort",parent,childRequestId})).catch(()=>{}),reject(new Error("Operation aborted")))},release=()=>{parentSignal.removeEventListener("abort",abort),signal?.removeEventListener("abort",abort)};children.set(childRequestId,{resolve:value2=>{release(),resolve(value2)},reject:error=>{release(),reject(error)}}),parentSignal.addEventListener("abort",abort,{once:!0}),signal?.addEventListener("abort",abort,{once:!0});let request={kind:"plane.request",parent,childRequestId,plane,body};options.transport.send(lane,encodePlaneMessage(request)).catch(error=>{children.delete(childRequestId)&&(release(),reject(new PlaneRefusedError(`brain_unreachable: ${error instanceof Error?error.message:String(error)}`)))})})},receive(message){if(message.kind!=="plane.reply"&&message.kind!=="plane.refused")return;let children=waiting.get(message.parent),waiter=children?.get(message.childRequestId);waiter!==void 0&&(children?.delete(message.childRequestId),message.kind==="plane.reply"?waiter.resolve(message.body):waiter.reject(new PlaneRefusedError(message.reason)))},parentEnded(parent){live.delete(parent);let children=waiting.get(parent);waiting.delete(parent);for(let waiter of children?.values()??[])waiter.reject(new PlaneRefusedError("parent_terminal"))}}}function fileCall(message){return{kind:"invoke",executionId:message.executionId,batchId:message.executionId,index:0,scope:message.scope,toolCallId:message.executionId,name:`file.${message.op}`,arguments:message.args,...message.epoch===void 0?{}:{epoch:message.epoch}}}function fileResult(outcome2){return{content:[],details:{file:outcome2},isError:!outcome2.ok}}function fileRefusal(code,message){return fileResult({ok:!1,code,message})}function fileStopped(granted){return granted?fileRefusal("aborted","the operation was aborted"):fileRefusal("refused_by_grant","the grant was revoked")}var HAND_CONTROL_LANE="hand.control",RemoteProtocolError=class extends Error{constructor(message){super(`remote_protocol: ${message}`),this.name="RemoteProtocolError"}},TERMINAL_REASONS=["cancelled","lease_expired","hand_restarted","uncertain"],EPOCH_REFUSALS=["peer_unauthorized","epoch_fenced","epoch_step_exceeded","epoch_unsupported"],encoder2=new TextEncoder,decoder2=new TextDecoder;function encodeRemoteMessage(message){return encoder2.encode(JSON.stringify(message))}var isRecord3=value2=>typeof value2=="object"&&value2!==null,isString=value2=>typeof value2=="string"&&value2.length>0,isEpoch=value2=>typeof value2=="number"&&Number.isSafeInteger(value2)&&value2>=1;function decodeFloorMessage(value2){switch(value2.kind){case"floor":if(!isEpoch(value2.epoch))throw new RemoteProtocolError("malformed floor");return{kind:"floor",epoch:value2.epoch};case"floor_ack":if(!isEpoch(value2.floor))throw new RemoteProtocolError("malformed floor ack");return{kind:"floor_ack",floor:value2.floor};case"floor_refused":if(!EPOCH_REFUSALS.includes(value2.reason))throw new RemoteProtocolError("malformed floor refusal");return{kind:"floor_refused",reason:value2.reason};default:return}}function decodeRemoteMessage(payload){let value2;try{value2=JSON.parse(decoder2.decode(payload))}catch{throw new RemoteProtocolError("payload is not JSON")}if(isRecord3(value2)&&value2.kind==="hello"){let{instance,durable,ops}=value2;if(!isString(instance))throw new RemoteProtocolError("malformed hello");if(durable!==void 0&&typeof durable!="boolean")throw new RemoteProtocolError("malformed hello");if(ops!==void 0&&(!Array.isArray(ops)||!ops.every(isString)))throw new RemoteProtocolError("malformed hello");return{kind:"hello",instance,durable:durable??!0,ops:ops??[]}}let floor=isRecord3(value2)?decodeFloorMessage(value2):void 0;if(floor!==void 0)return floor;if(!isRecord3(value2)||!isString(value2.executionId))throw new RemoteProtocolError("no execution ID");if(value2.epoch!==void 0&&!isEpoch(value2.epoch))throw new RemoteProtocolError("malformed epoch");switch(value2.kind){case"invoke":{let scope=value2.scope;if(!isString(value2.batchId)||typeof value2.index!="number"||!Number.isSafeInteger(value2.index)||value2.index<0||!isRecord3(scope)||!isString(scope.id)||typeof scope.root!="string"||!isString(value2.toolCallId)||!isString(value2.name)||value2.sessionRef!==void 0&&typeof value2.sessionRef!="string")throw new RemoteProtocolError("malformed invoke");return value2}case"file":{let scope=value2.scope;if(!isRecord3(scope)||!isString(scope.id)||typeof scope.root!="string"||!DEVICE_FILE_OPS.includes(value2.op)||!isRecord3(value2.args))throw new RemoteProtocolError("malformed file operation");return value2}case"abort":return value2;case"ack":return value2;case"terminal":if(!TERMINAL_REASONS.includes(value2.reason)||typeof value2.uncertain!="boolean"||typeof value2.hooksRan!="boolean")throw new RemoteProtocolError("malformed terminal outcome");return value2;case"settled":{let result=value2.result;if(!isRecord3(result)||!Array.isArray(result.content)||typeof result.isError!="boolean")throw new RemoteProtocolError("malformed result");return value2}case"refused":if(typeof value2.reason!="string")throw new RemoteProtocolError("malformed refusal");return value2;default:throw new RemoteProtocolError("unknown message kind")}}function asJson(value2){return value2===void 0?void 0:JSON.parse(JSON.stringify(value2))}function toRemoteToolResult(result){return{content:result.content??[],details:asJson(result.details),isError:result.isError===!0,...result.structuredContent===void 0?{}:{structuredContent:result.structuredContent},...result.terminate===void 0?{}:{terminate:result.terminate},...result.addedToolNames?.length?{addedToolNames:[...result.addedToolNames]}:{}}}var HAND_CAPABILITY="execute",DEFAULT_WORKSPACE="omo";function authorize(authority,scopeRoot){return authority.kind==="self"?{ok:!0,root:scopeRoot}:authority.verifier.verify(authority.peer,scopeRoot)}var SEPARATORS=/[\\/]+$/;function contains(root,child){let base=root.replace(SEPARATORS,"");if(child===base)return!0;if(!child.startsWith(base))return!1;let next=child.charAt(base.length);return next==="/"||next==="\\"}function createGrantVerifier(options){let{self,canonicalize}=options,now=options.now??Date.now,listeners=new Set,snapshot,canonical=path=>{try{return canonicalize(path)}catch{return}},workspaceOf=root=>{let best;for(let workspace of options.workspaces){let resolved=canonical(workspace.root);resolved===void 0||!contains(resolved,root)||(best===void 0||resolved.length>best.length)&&(best={label:workspace.label??"omo",length:resolved.length})}return best?.label};return{verify(peer,scopeRoot){let root=canonical(scopeRoot),workspace=root===void 0?void 0:workspaceOf(root);if(root===void 0||workspace===void 0)return{ok:!1,reason:"workspace_unknown"};if(peer===self)return{ok:!0,root};let current=snapshot;return current===void 0||now()>=current.expiresAt?{ok:!1,reason:"grant_expired"}:current.grants.some(row=>row.holder===peer&&row.target===self&&row.workspace===workspace&&row.capability===HAND_CAPABILITY)?{ok:!0,root}:{ok:!1,reason:"grant_missing"}},install(next){if(!Number.isFinite(next.rv)||!Number.isFinite(next.expiresAt))throw new Error("A grant snapshot needs a finite rv and expiresAt; the installed snapshot is kept");if(!(snapshot!==void 0&&next.rv<snapshot.rv)){snapshot=next;for(let listener of[...listeners])listener()}},onReplace(listener){return listeners.add(listener),()=>listeners.delete(listener)}}}var EPOCH_FLOOR_MAX_STEP=1,EPOCH_FLOOR_PREFIX="hand.epoch-floor:",HAND_SELF_SENDER="self";function decodeFloor(data){if(typeof data=="object"&&data!==null&&!Array.isArray(data)&&"epoch"in data&&"owner"in data){let{epoch,owner}=data;if(typeof epoch=="number"&&Number.isSafeInteger(epoch)&&epoch>=1&&typeof owner=="string")return{epoch,owner}}throw new Error("A stored epoch floor is malformed")}function createHandEpochFence(options){let{durable,ownerOf}=options,floors=new Map,ready=(async()=>{if(durable!==void 0)for(let document of await durable.store.scanDocuments(EPOCH_FLOOR_PREFIX))floors.set(document.key.slice(EPOCH_FLOOR_PREFIX.length),decodeFloor(document.data))})(),raiseNow=async(scope,epoch,sender)=>{if(ownerOf(scope)!==sender)return{kind:"refused",reason:"peer_unauthorized"};let current=floors.get(scope),floor=current?.epoch??0;if(epoch<floor)return{kind:"acked",floor};if(current!==void 0&&epoch===floor)return current.owner===sender?{kind:"acked",floor}:{kind:"refused",reason:"epoch_fenced"};if(epoch-floor>1)return{kind:"refused",reason:"epoch_step_exceeded"};let next={epoch,owner:sender};if(durable===void 0)floors.set(scope,next);else{let write={op:"put",key:`${EPOCH_FLOOR_PREFIX}${scope}`,data:{...next}};await durable.store.commit(durable.epoch,[write],()=>floors.set(scope,next))}return{kind:"acked",floor:epoch}};return{ready,async raise(scope,epoch,sender){await ready;let run=()=>raiseNow(scope,epoch,sender);return durable===void 0?run():durable.admission.admit(run)},admits(scope,epoch,sender){let floor=floors.get(scope);if(floor===void 0)return!0;let at=epoch??0;return at>floor.epoch||at===floor.epoch&&floor.owner===sender}}}async function answerFloor(fence,scope,epoch,sender){if(fence===void 0)return{kind:"floor_refused",reason:"epoch_unsupported"};let raised=await fence.raise(scope,epoch,sender);return raised.kind==="acked"?{kind:"floor_ack",floor:raised.floor}:{kind:"floor_refused",reason:raised.reason}}function createRemoteExecutor(options){let{transport,openScope,ledger,authority,fence}=options,sender=authority.kind==="peer"?authority.peer:HAND_SELF_SENDER,admits=(lane,epoch)=>fence===void 0||fence.admits(lane,epoch,sender),scopes=new Map,accepted=[],seen=new Set,running=new Map,planes=createPlaneClient({transport}),closed=!1,stopWatching=authority.kind==="peer"?authority.verifier.onReplace(()=>{for(let{controller,root}of running.values())authority.verifier.verify(authority.peer,root).ok||controller.abort()}):()=>{},reply=(lane,message)=>{transport.send(lane,encodeRemoteMessage(message)).catch(()=>{})},refuse2=(lane,executionId,reason)=>reply(lane,{kind:"refused",executionId,reason}),stateOf=scope=>{let known=scopes.get(scope.id);if(known!==void 0)return known.root===scope.root?known:"scope_binding_mismatch";let opened=openScope(scope);opened.catch(()=>{});let state={root:scope.root,opened,lastSequential:void 0,wave:[]};return scopes.set(scope.id,state),state},invoke=async(lane,call,file)=>{if(closed)return refuse2(lane,call.executionId,"hand_closed");if(lane!==call.scope.id)return refuse2(lane,call.executionId,"scope_lane_mismatch");let verdict=authorize(authority,call.scope.root);if(!verdict.ok)return refuse2(lane,call.executionId,verdict.reason);if(!admits(lane,call.epoch))return refuse2(lane,call.executionId,"epoch_fenced");if(ledger===void 0&&seen.has(call.executionId))return refuse2(lane,call.executionId,"duplicate_execution");seen.add(call.executionId);let state=stateOf({id:call.scope.id,root:verdict.root});if(typeof state=="string")return refuse2(lane,call.executionId,state);let scope;try{scope=await state.opened}catch(error){let reason=error instanceof Error?error.message:String(error);return refuse2(lane,call.executionId,`scope_unavailable: ${reason}`)}if(ledger!==void 0){let admission=await ledger.admit(call,()=>admits(lane,call.epoch));if(admission.kind==="reply")return reply(lane,admission.message);if(admission.kind==="in_flight")return}accepted.push(call.executionId);let controller=new AbortController;running.set(call.executionId,{controller,root:verdict.root});let sequential=file!==void 0||scope.isSequential(call.name),dependencies=sequential?[...state.lastSequential?[state.lastSequential]:[],...state.wave]:state.lastSequential?[state.lastSequential]:[],done=(async()=>{if(await Promise.allSettled(dependencies),ledger===void 0&&!admits(lane,call.epoch))return running.delete(call.executionId),refuse2(lane,call.executionId,"epoch_fenced");let result;try{if(controller.signal.aborted||!authorize(authority,call.scope.root).ok)throw new Error("The call's grant was revoked before it ran");result=file===void 0?await scope.run({toolCallId:call.toolCallId,name:call.name,arguments:call.arguments,signal:controller.signal,nested:planes.requestFor(call.executionId,lane,controller.signal)}):scope.file===void 0?fileRefusal("unsupported","this hand serves no file channel"):await scope.file(file.op,call.arguments,controller.signal,planes.requestFor(call.executionId,lane,controller.signal)),file!==void 0&&controller.signal.aborted&&(result=fileStopped(authorize(authority,call.scope.root).ok))}catch(error){if(file!==void 0){let granted=authorize(authority,call.scope.root).ok;result=controller.signal.aborted||!granted?fileStopped(granted):fileRefusal("io",error instanceof Error?error.message:String(error))}else result={content:[{type:"text",text:error instanceof Error?error.message:String(error)}],details:{},isError:!0}}finally{running.delete(call.executionId),planes.parentEnded(call.executionId)}let settled=toRemoteToolResult(result);reply(lane,ledger===void 0?{kind:"settled",executionId:call.executionId,result:settled}:await ledger.settle(call,settled))})();done.catch(error=>options.onFault(error)),sequential?(state.lastSequential=done,state.wave=[]):state.wave.push(done)},ready=(async()=>{if(await fence?.ready,ledger!==void 0)for(let{lane,message}of await ledger.recover())reply(lane,message);reply(HAND_CONTROL_LANE,{kind:"hello",instance:options.instance??crypto.randomUUID(),durable:ledger!==void 0,ops:options.fileChannel===!0?[FILE_CHANNEL,RUN_CHANNEL]:[]})})();return ready.catch(error=>options.onFault(error)),transport.onFrame(async frame=>{try{await ready}catch{return}let nested=decodePlaneMessage(frame.payload);if(nested!==void 0)return planes.receive(nested);let message;try{message=decodeRemoteMessage(frame.payload)}catch{return}try{if(message.kind==="invoke")await invoke(frame.lane,message);else if(message.kind==="floor")reply(frame.lane,await answerFloor(fence,frame.lane,message.epoch,sender));else{if((message.kind==="abort"||message.kind==="ack")&&!admits(frame.lane,message.epoch))return;message.kind==="file"?await invoke(frame.lane,fileCall(message),{op:message.op}):message.kind==="abort"?running.get(message.executionId)?.controller.abort():message.kind==="ack"&&await ledger?.ack(message.executionId,()=>admits(frame.lane,message.epoch))}}catch(error){options.onFault(error)}}),{accepted:()=>[...accepted],ready,async close(){closed=!0,stopWatching();for(let{controller}of running.values())controller.abort();let opened=await Promise.allSettled([...scopes.values()].map(state=>state.opened));scopes.clear(),await Promise.allSettled(opened.flatMap(outcome2=>outcome2.status==="fulfilled"?[outcome2.value.dispose()]:[])),transport.close()}}}var KINDS2=["hook.call","hook.hello","hook.started","hook.reply","hook.failed"],encoder3=new TextEncoder,decoder3=new TextDecoder;function encodeLoopHookMessage(message){return encoder3.encode(JSON.stringify(message))}var isRecord4=value2=>typeof value2=="object"&&value2!==null,isId2=value2=>typeof value2=="string"&&value2.length>0;function decodeLoopHookMessage(payload){let value2;try{value2=JSON.parse(decoder3.decode(payload))}catch{return}if(!(!isRecord4(value2)||!KINDS2.includes(value2.kind)))switch(value2.kind){case"hook.call":return isId2(value2.callId)&&isId2(value2.event)&&"payload"in value2?{kind:"hook.call",callId:value2.callId,event:value2.event,payload:value2.payload}:void 0;case"hook.hello":return isId2(value2.instance)?{kind:"hook.hello",instance:value2.instance}:void 0;case"hook.started":return isId2(value2.callId)&&isId2(value2.instance)?{kind:"hook.started",callId:value2.callId,instance:value2.instance}:void 0;case"hook.reply":return isId2(value2.callId)&&"result"in value2?{kind:"hook.reply",callId:value2.callId,result:value2.result}:void 0;default:return isId2(value2.callId)&&typeof value2.error=="string"?{kind:"hook.failed",callId:value2.callId,error:value2.error}:void 0}}function serveLoopHooks(options){let{transport,lane}=options,instance=options.instance??crypto.randomUUID(),answers=new Map,dead=!1,send=message=>transport.send(lane,encodeLoopHookMessage(message)),point=(at,callId)=>{if(dead)throw new Error("this hand process was stopped");try{options.onPoint?.(at,callId)}catch(error){throw dead=!0,error}},serve=async call=>{if(answers.has(call.callId)){let answer3=answers.get(call.callId);answer3!==void 0&&await send(answer3);return}point("received",call.callId),answers.set(call.callId,void 0),await send({kind:"hook.started",callId:call.callId,instance}),point("started",call.callId);let answer2;try{answer2={kind:"hook.reply",callId:call.callId,result:await options.run(call.event,call.payload)}}catch(error){answer2={kind:"hook.failed",callId:call.callId,error:error instanceof Error?error.message:String(error)}}point("ran",call.callId),answers.set(call.callId,answer2),await send(answer2),point("replied",call.callId)};return transport.onFrame(async frame=>{if(dead)return;let message=decodeLoopHookMessage(frame.payload);if(message?.kind==="hook.call")try{await serve(message)}catch(error){options.onFault?.(error)}}),{ready:send({kind:"hook.hello",instance}),close(){dead=!0}}}var TransportClosedError=class extends Error{constructor(){super("transport closed"),this.name="TransportClosedError"}};function isReferencePacket(message){if(typeof message!="object"||message===null)return!1;let{kind,lane,seq}=message;return typeof lane!="string"||typeof seq!="number"||!Number.isSafeInteger(seq)||seq<0?!1:kind==="ack"?!0:kind==="data"&&message.payload instanceof Uint8Array}function createReliableTransport(options){let window=options.window??32,retransmitMs=options.retransmitMs??1e3,outLanes=new Map,inLanes=new Map,order=[],ackDue=new Set,next=0,connection,writable=!1,closed=!1,handler,outLane=lane=>{let state=outLanes.get(lane);return state===void 0&&(state={nextSeq:1,acked:0,transmitted:0,outbox:new Map,waiters:[],cancelRetransmit:void 0},outLanes.set(lane,state),order.push(lane)),state},inLane=lane=>{let state=inLanes.get(lane);return state===void 0&&(state={received:0,delivered:0,busy:!1,inbox:[]},inLanes.set(lane,state)),state},admit=state=>{for(;state.nextSeq-1-state.acked<window;){let waiter=state.waiters.shift();if(waiter===void 0)return;state.outbox.set(state.nextSeq,waiter.payload),state.nextSeq+=1,waiter.resolve()}},emit=packet=>connection===void 0||!writable?!1:connection.send(packet)?!0:(writable=!1,!1),disarm=state=>{state.cancelRetransmit?.(),state.cancelRetransmit=void 0},disarmAll=()=>{for(let state of outLanes.values())disarm(state)},arm=()=>{if(connection!==void 0)for(let state of outLanes.values())state.cancelRetransmit!==void 0||state.outbox.size===0||(state.cancelRetransmit=options.clock.setTimer(()=>{state.cancelRetransmit=void 0,state.transmitted=state.acked,pump()},retransmitMs))};function pump(){if(!(connection===void 0||!writable)){for(let lane of[...ackDue]){if(!emit({kind:"ack",lane,seq:inLane(lane).delivered}))return;ackDue.delete(lane)}for(let idle=0;idle<order.length;){let lane=order[next%order.length];if(lane===void 0)return;let state=outLane(lane),seq=state.transmitted+1,payload=state.outbox.get(seq);if(payload===void 0){next+=1,idle+=1;continue}if(!emit({kind:"data",lane,seq,payload}))return;state.transmitted=seq,next+=1,idle=0}arm()}}async function deliver(state,lane){if(!(state.busy||handler===void 0)){state.busy=!0;try{for(let frame=state.inbox.shift();frame!==void 0&&!closed;frame=state.inbox.shift()){try{await handler(frame)}catch(error){options.onHandlerError(error,frame)}state.delivered+=1,ackDue.add(lane),pump()}}finally{state.busy=!1}}}let onData=packet=>{let state=inLane(packet.lane);packet.seq===state.received+1?(state.received=packet.seq,state.inbox.push({lane:packet.lane,payload:packet.payload}),deliver(state,packet.lane)):ackDue.add(packet.lane),pump()},onAck=packet=>{let state=outLanes.get(packet.lane);if(!(state===void 0||packet.seq<=state.acked||packet.seq>=state.nextSeq)){for(let seq=state.acked+1;seq<=packet.seq;seq++)state.outbox.delete(seq);state.acked=packet.seq,state.transmitted=Math.max(state.transmitted,state.acked),disarm(state),admit(state),pump()}};return{send(lane,payload){if(closed)return Promise.reject(new TransportClosedError);let state=outLane(lane);return new Promise((resolve,reject)=>{state.waiters.push({payload,resolve,reject}),admit(state),pump()})},onFrame(frameHandler){handler=frameHandler;for(let[lane,state]of inLanes)deliver(state,lane)},inFlight:lane=>{let state=outLanes.get(lane);return state===void 0?0:state.nextSeq-1-state.acked},close(){if(closed)return;closed=!0,disarmAll();for(let state of outLanes.values())for(let waiter of state.waiters.splice(0))waiter.reject(new TransportClosedError);let current=connection;connection=void 0,current?.close()},attached(newConnection){if(closed){newConnection.close();return}connection=newConnection,writable=!0;for(let state of outLanes.values())state.transmitted=state.acked;for(let[lane,state]of inLanes)state.delivered>0&&ackDue.add(lane);disarmAll(),pump()},message(message){isReferencePacket(message)&&(message.kind==="data"?onData(message):onAck(message))},writable(){connection!==void 0&&(writable=!0,pump())},detached(){connection=void 0,writable=!1,disarmAll()}}}var dist_exports={};__export(dist_exports,{AGENT_TELEMETRY_SCHEMAS:()=>AGENT_TELEMETRY_SCHEMAS,AI_TELEMETRY_SCHEMA:()=>AI_TELEMETRY_SCHEMA,Agent:()=>Agent2,AgentHarness:()=>AgentHarness,BACKGROUND_CONTEXT:()=>BACKGROUND_CONTEXT,BRANCH_SUMMARY_PREFIX:()=>BRANCH_SUMMARY_PREFIX,BRANCH_SUMMARY_SUFFIX:()=>BRANCH_SUMMARY_SUFFIX,BatchStoreMissingError:()=>BatchStoreMissingError,BranchSummaryError:()=>BranchSummaryError,CHAIN_COUNT_LIMIT:()=>CHAIN_COUNT_LIMIT,CHAIN_ORIGIN:()=>CHAIN_ORIGIN,COMPACTION_SUMMARY_PREFIX:()=>COMPACTION_SUMMARY_PREFIX,COMPACTION_SUMMARY_SUFFIX:()=>COMPACTION_SUMMARY_SUFFIX,ChainCountLimitError:()=>ChainCountLimitError,Closed:()=>Closed,CompactionError:()=>CompactionError,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES,DEFAULT_WORKSPACE:()=>DEFAULT_WORKSPACE,DEVICE_FILE_OPS:()=>DEVICE_FILE_OPS,DeviceFileError:()=>DeviceFileError,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC:()=>EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,EPOCH_FLOOR_MAX_STEP:()=>EPOCH_FLOOR_MAX_STEP,EPOCH_FRESHNESS_MS:()=>EPOCH_FRESHNESS_MS,ExecutionError:()=>ExecutionError,FILE_CHANNEL:()=>FILE_CHANNEL,FILE_CHANNEL_MAX_BYTES:()=>FILE_CHANNEL_MAX_BYTES,FileError:()=>FileError,GREP_MAX_LINE_LENGTH:()=>GREP_MAX_LINE_LENGTH,HAND_CAPABILITY:()=>HAND_CAPABILITY,HAND_CONTROL_LANE:()=>HAND_CONTROL_LANE,HAND_SELF_SENDER:()=>HAND_SELF_SENDER,HARNESS_TELEMETRY_SCHEMA:()=>HARNESS_TELEMETRY_SCHEMA,HELLO_WAIT_MS:()=>HELLO_WAIT_MS,HOSTED_REBUILD_DEADLINE_MS:()=>HOSTED_REBUILD_DEADLINE_MS,HarnessClosed:()=>HarnessClosed,HarnessFault:()=>HarnessFault,InMemoryTelemetryContext:()=>InMemoryTelemetryContext,InvalidLane:()=>InvalidLane,InvalidMessage:()=>InvalidMessage,InvalidNavigation:()=>InvalidNavigation,InvalidReadSegmentsError:()=>InvalidReadSegmentsError,JSONL_STORAGE_VERSION:()=>JSONL_STORAGE_VERSION,JsonlSessionRepo:()=>JsonlSessionRepo,LOCAL_DEVICE_FILES:()=>LOCAL_DEVICE_FILES,LaneBusy:()=>LaneBusy,LoopHookFailedError:()=>LoopHookFailedError,LoopHookRestartedError:()=>LoopHookRestartedError,MODEL_PLANE:()=>MODEL_PLANE,MOVE_SKEW_MS:()=>MOVE_SKEW_MS,MemorySessionRepo:()=>MemorySessionRepo,NOOP_TELEMETRY_CONTEXT:()=>NOOP_TELEMETRY_CONTEXT,NoActiveOperation:()=>NoActiveOperation,NoActiveRun:()=>NoActiveRun,NothingToCompact:()=>NothingToCompact,NothingToResume:()=>NothingToResume,OperationMismatch:()=>OperationMismatch,PlaneRefusedError:()=>PlaneRefusedError,PreflightCarryMissingError:()=>PreflightCarryMissingError,ProviderRetryWatchdogAbortError:()=>ProviderRetryWatchdogAbortError,READ_FOLDER_SELECTION:()=>READ_FOLDER_SELECTION,READ_FOLD_SETTINGS:()=>READ_FOLD_SETTINGS,RUN_CHANNEL:()=>RUN_CHANNEL,RemoteProtocolError:()=>RemoteProtocolError,Result:()=>Result,SESSION_PLANE:()=>SESSION_PLANE,STREAMED_DELTA_TYPES:()=>STREAMED_DELTA_TYPES,SessionBranchExistsError:()=>SessionBranchExistsError,SessionInvalidBranchError:()=>SessionInvalidBranchError,SessionInvariantError:()=>SessionInvariantError,SessionPendingAssistantMessageError:()=>SessionPendingAssistantMessageError,SessionStoreError:()=>SessionStoreError,SessionUnknownTargetError:()=>SessionUnknownTargetError,SliceNotImplemented:()=>SliceNotImplemented,StepCommitError:()=>StepCommitError,StorageBackedSession:()=>StorageBackedSession,StreamStartTimeoutError:()=>StreamStartTimeoutError,TODO_CONTEXT:()=>TODO_CONTEXT,TaggedError:()=>TaggedError,UnknownSkill:()=>UnknownSkill,UnknownTarget:()=>UnknownTarget,UnknownTemplate:()=>UnknownTemplate,admitChainCall:()=>admitChainCall,agentLoop:()=>agentLoop2,agentLoopContinue:()=>agentLoopContinue2,appendList:()=>appendList,appendRecordWrites:()=>appendRecordWrites,applyShellOutputUpdate:()=>applyShellOutputUpdate,authorize:()=>authorize,awaitWithContext:()=>awaitWithContext,base64Length:()=>base64Length,bashExecutionToText:()=>bashExecutionToText,branchTip:()=>branchTip,branchTipInventoryPrefix:()=>branchTipInventoryPrefix,buildProviderContext:()=>buildProviderContext,calculateContextTokens:()=>calculateContextTokens,canonicalJson:()=>canonicalJson,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary,commitWrite:()=>commitWrite,compact:()=>compact,convertToLlm:()=>convertToLlm,createAdmissionLine:()=>createAdmissionLine,createBashTool:()=>createBashTool,createBatchCoordinator:()=>createBatchCoordinator,createBranchSummaryMessage:()=>createBranchSummaryMessage,createCompactionSummaryMessage:()=>createCompactionSummaryMessage,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage,createDefaultReadSummary:()=>createDefaultReadSummary,createEditTool:()=>createEditTool,createErrorToolResult:()=>createErrorToolResult,createExecutionLedger:()=>createExecutionLedger,createForkSnapshot:()=>createForkSnapshot,createGrantVerifier:()=>createGrantVerifier,createHandEpochFence:()=>createHandEpochFence,createHandLedger:()=>createHandLedger,createInProcessNetwork:()=>createInProcessNetwork,createInternalAgentChannel:()=>createInternalAgentChannel,createLoopHookHost:()=>createLoopHookHost,createLoopToolHost:()=>createLoopToolHost,createMemoryStoreMedium:()=>createMemoryStoreMedium,createModelPlaneClient:()=>createModelPlaneClient,createPreparedToolHost:()=>createPreparedToolHost,createReadTool:()=>createReadTool,createReliableTransport:()=>createReliableTransport,createRemoteExecutor:()=>createRemoteExecutor,createRemoteToolHost:()=>createRemoteToolHost,createResponseTimingRecorder:()=>createResponseTimingRecorder,createSegmentedReadView:()=>createSegmentedReadView,createSessionPlaneClient:()=>createSessionPlaneClient,createSplitToolHost:()=>createSplitToolHost,createToolResultMessage:()=>createToolResultMessage,createTypedSpanStarter:()=>createTypedSpanStarter,createWriteTool:()=>createWriteTool,decodeBase64:()=>decodeBase64,decodeChainCount:()=>decodeChainCount,decodeDeviceFileArgs:()=>decodeDeviceFileArgs,decodeModelPlaneRequest:()=>decodeModelPlaneRequest,decodePlaneMessage:()=>decodePlaneMessage,decodeRemoteMessage:()=>decodeRemoteMessage,decodeSessionPlaneRequest:()=>decodeSessionPlaneRequest,defineTelemetrySchema:()=>defineTelemetrySchema,deleteList:()=>deleteList,deleteValue:()=>deleteValue,divergenceWrite:()=>divergenceWrite,emitToolExecutionEnd:()=>emitToolExecutionEnd,emitToolExecutionUpdate:()=>emitToolExecutionUpdate,emitToolResultMessage:()=>emitToolResultMessage,encodeBase64:()=>encodeBase64,encodePlaneMessage:()=>encodePlaneMessage,encodeRemoteMessage:()=>encodeRemoteMessage,entryLabel:()=>entryLabel,err:()=>err,estimateContextTokens:()=>estimateContextTokens,estimateTokens:()=>estimateTokens,executeShellWithCapture:()=>executeShellWithCapture,fileOutcomeOf:()=>fileOutcomeOf,fileRefusal:()=>fileRefusal,fileResult:()=>fileResult,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatPromptTemplateInvocation:()=>formatPromptTemplateInvocation,formatSize:()=>formatSize,formatSkillInvocation:()=>formatSkillInvocation,formatSkillsForSystemPrompt:()=>formatSkillsForSystemPrompt,generateBranchSummary:()=>generateBranchSummary,generateSummary:()=>generateSummary,generateSummaryWithUsage:()=>generateSummaryWithUsage,getLastAssistantUsage:()=>getLastAssistantUsage,getOrThrow:()=>getOrThrow,getOrUndefined:()=>getOrUndefined,getSessionCwd:()=>getSessionCwd,getTelemetryContext:()=>getTelemetryContext,insertEntry:()=>insertEntry,insertUsage:()=>insertUsage,isLocalDeviceFiles:()=>isLocalDeviceFiles,isReadSummaryPath:()=>isReadSummaryPath,isStepCommitError:()=>isStepCommitError,laneConfig:()=>laneConfig,laneState:()=>laneState,languageForPath:()=>languageForPath,list:()=>list,loadPromptTemplates:()=>loadPromptTemplates,loadSkills:()=>loadSkills,loadSourcedPromptTemplates:()=>loadSourcedPromptTemplates,loadSourcedSkills:()=>loadSourcedSkills,localEndpoint:()=>localEndpoint,loopSideToolNames:()=>loopSideToolNames,manifestWrite:()=>manifestWrite,matchError:()=>matchError,nextChainCount:()=>nextChainCount,noPreflightCarry:()=>noPreflightCarry,ok:()=>ok,openMemoryBatchStore:()=>openMemoryBatchStore,openMemoryStore:()=>openMemoryStore,openSessionStore:()=>openSessionStore,openSyncSessionStore:()=>openSyncSessionStore,operationMeta:()=>operationMeta,operationPreparation:()=>operationPreparation,operationPreparationPrefix:()=>operationPreparationPrefix,operationResult:()=>operationResult,operationScopeOf:()=>operationScopeOf,operationState:()=>operationState,operationToolArgs:()=>operationToolArgs,operationToolArgsPrefix:()=>operationToolArgsPrefix,operationToolMemo:()=>operationToolMemo,operationToolMemoPrefix:()=>operationToolMemoPrefix,parseCommandArgs:()=>parseCommandArgs,pendingAssistantFrames:()=>pendingAssistantFrames,pendingEntry:()=>pendingEntry,pendingToolOutput:()=>pendingToolOutput,pendingToolOutputPrefix:()=>pendingToolOutputPrefix,prepareAgentToolCall:()=>prepareAgentToolCall,prepareAgentToolCallArguments:()=>prepareAgentToolCallArguments,prepareBranchEntries:()=>prepareBranchEntries,prepareCompaction:()=>prepareCompaction,prepareReadFolder:()=>prepareReadFolder,prepareStorageCommit:()=>prepareStorageCommit,prepareToolArguments:()=>prepareToolArguments,projectForkCurrentStateWrite:()=>projectForkCurrentStateWrite,readSessionState:()=>readSessionState,readSummaryEngineForPath:()=>readSummaryEngineForPath,reasonedBeforeFirstDelta:()=>reasonedBeforeFirstDelta,reduceLaneSnapshot:()=>reduceLaneSnapshot,renderSegmentedReadView:()=>renderSegmentedReadView,resolveListReadOptions:()=>resolveListReadOptions,resolveToolNameAlias:()=>resolveToolNameAlias,rewriteRecordWrite:()=>rewriteRecordWrite,runAgentLoop:()=>runAgentLoop2,runAgentLoopContinue:()=>runAgentLoopContinue2,runToolCall:()=>runToolCall,sanitizeBinaryOutput:()=>sanitizeShellOutput,selectedReadFolder:()=>selectedReadFolder,serializeConversation:()=>serializeConversation,serveLoopHooks:()=>serveLoopHooks,serveModelPlane:()=>serveModelPlane,serveSessionPlane:()=>serveSessionPlane,sessionName:()=>sessionName,setDefaultStreamFn:()=>setDefaultStreamFn,setValue:()=>setValue,shouldCompact:()=>shouldCompact,shouldTerminateToolBatch:()=>shouldTerminateToolBatch,startAiSpan:()=>startAiSpan,startHarnessSpan:()=>startHarnessSpan,streamProxy:()=>streamProxy,substituteArgs:()=>substituteArgs,toError:()=>toError,toStoreValue:()=>toStoreValue,truncateHead:()=>truncateHead,truncateLine:()=>truncateLine,truncateTail:()=>truncateTail,utf8ByteLength:()=>utf8ByteLength,uuidv7:()=>uuidv7,validateCommittedWrites:()=>validateCommittedWrites,value:()=>value,withAbortSignal:()=>withAbortSignal,withCancel:()=>withCancel,withContextValue:()=>withContextValue,withSessionCwd:()=>withSessionCwd,withTelemetryContext:()=>withTelemetryContext,withToolNameCorrection:()=>withToolNameCorrection,withoutAbortSignal:()=>withoutAbortSignal});function startNoopSpan(_options,callback){try{return Promise.resolve(callback(noopTelemetrySpan))}catch(error){return Promise.reject(error)}}var noopTelemetrySpan={startSpan:startNoopSpan,addEvent:()=>{},setAttributes:()=>{},setStatus:()=>{}};Object.freeze(noopTelemetrySpan);var NOOP_TELEMETRY_CONTEXT=noopTelemetrySpan;function copyAttributeValue(value2){return Array.isArray(value2)?[...value2]:value2}function copyAttributes(attributes){let copy2={};if(!attributes)return copy2;for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(copy2[name]=copyAttributeValue(value2));return copy2}function mergeAttributes(current,attributes){let merged=copyAttributes(current);for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(merged[name]=copyAttributeValue(value2));return merged}function copyStatus(status){return status.status==="ok"?{status:"ok"}:status.error?{status:"error",error:{name:status.error.name,message:status.error.message}}:{status:"error"}}function automaticErrorStatus(error){try{if(error instanceof Error)return{status:"error",error:{name:error.name,message:error.message}}}catch{}return{status:"error"}}function settleSpan(state,span,failed,error){span.settled||(failed&&!span.explicitStatus&&(span.status=automaticErrorStatus(error)),span.settled=!0,span.endSequence=state.nextEndSequence++)}function createSpan(state,parent,options){let name=options.name,attributes=copyAttributes(options.attributes);return{id:state.nextSpanId++,parentId:parent?.id??null,name,attributes,events:[],status:{status:"ok"},explicitStatus:!1,settled:!1}}function startInMemorySpan(state,parent,options,callback){if(parent?.settled)return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback);let recordedSpan;try{recordedSpan=createSpan(state,parent,options),state.spans.push(recordedSpan)}catch{return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback)}let span={startSpan:(childOptions,childCallback)=>startInMemorySpan(state,recordedSpan,childOptions,childCallback),addEvent(name,attributes){if(!recordedSpan.settled)try{recordedSpan.events.push({name,attributes:copyAttributes(attributes)})}catch{}},setAttributes(attributes){if(!recordedSpan.settled)try{recordedSpan.attributes=mergeAttributes(recordedSpan.attributes,attributes)}catch{}},setStatus(status){if(!recordedSpan.settled)try{recordedSpan.status=copyStatus(status),recordedSpan.explicitStatus=!0}catch{}}},result;try{result=callback(span)}catch(error){return settleSpan(state,recordedSpan,!0,error),Promise.reject(error)}return Promise.resolve(result).then(value2=>(settleSpan(state,recordedSpan,!1),value2),error=>{throw settleSpan(state,recordedSpan,!0,error),error})}var InMemoryTelemetryContext=class{constructor(){this.state={spans:[],nextSpanId:1,nextEndSequence:1}}startSpan(options,callback){return startInMemorySpan(this.state,void 0,options,callback)}getSpans(){return this.state.spans.map(span=>({id:span.id,parentId:span.parentId,name:span.name,attributes:copyAttributes(span.attributes),events:span.events.map(event=>({name:event.name,attributes:copyAttributes(event.attributes)})),status:copyStatus(span.status),settled:span.settled,...span.endSequence===void 0?{}:{endSequence:span.endSequence}}))}};function defineTelemetrySchema(schema){return schema}function bindTypedSpanStarter(telemetryContext){return(name,attributes,callback)=>telemetryContext.startSpan({name,attributes},span=>callback(span,bindTypedSpanStarter(span)))}function createTypedSpanStarter(telemetryContext,_schemas){return bindTypedSpanStarter(telemetryContext)}var EMPTY_USAGE={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},ProviderRetryWatchdogAbortError=class extends Error{constructor(providerCause){super(providerCause),this.providerCause=providerCause,this.name="ProviderRetryWatchdogAbortError"}},EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC="empty_tool_use_terminal_state";function demoteToolUseWithoutToolCalls(message){return message.stopReason!=="toolUse"||message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"stop",diagnostics:[...message.diagnostics??[],{type:EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,timestamp:Date.now(),details:{}}]}}function promoteStopWithPendingToolCalls(message){return message.stopReason!=="stop"||!message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"toolUse"}}function settleStopReason(message){return demoteToolUseWithoutToolCalls(promoteStopWithPendingToolCalls(message))}function shouldTerminateAssistantTurn(message){return message.stopReason==="error"||message.stopReason==="aborted"||isClassifierRefusal(message)}function isStreamIdleTimeoutError(error){return error instanceof Error&&error.name==="StreamIdleTimeoutError"}function shouldFinalizeIdleAsStop(partialMessage,providerToolResults){if(!partialMessage)return!1;let toolCalls=partialMessage.content.filter(block=>block.type==="toolCall");return toolCalls.length===0?!1:providerToolResults.length>0?!0:toolCalls.every(block=>isCursorExecResolved(block))}function createTerminalFailureAssistantMessage(model,reason,error,partialMessage){let errorMessage2=error instanceof Error?error.message:String(error),providerDiagnostic=reason==="error"?readProviderDiagnostic(error):void 0,message={role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??model.api,provider:partialMessage?.provider??model.provider,model:partialMessage?.model??model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:reason==="error"&&isOAuthRefreshUnavailableError(error)?[...partialMessage?.diagnostics??[],{type:OAUTH_REFRESH_UNAVAILABLE_DIAGNOSTIC,timestamp:Date.now(),details:{provider:model.provider}}]:partialMessage?.diagnostics,usage:partialMessage?.usage??EMPTY_USAGE,stopReason:reason,errorMessage:errorMessage2||(reason==="aborted"?"Request was aborted":"Error"),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:partialMessage?.timestamp??Date.now()};return sanitizeProviderErrorMessage(message),message}function normalizeTerminalAssistantMessage(message,event){if(event.type==="done")return message;let errorMessage2=message.errorMessage??(event.reason==="aborted"?"Request was aborted":"Error");return message.stopReason===event.reason&&message.errorMessage===errorMessage2?message:{...message,stopReason:event.reason,errorMessage:errorMessage2}}var STREAMED_DELTA_TYPES=new Set(["text_delta","thinking_delta","toolcall_delta"]);function reasonedBeforeFirstDelta(message,thinkingStreamed){return(message.usage?.reasoning??0)>0?!0:thinkingStreamed?!1:message.content?.some(block=>block.type==="thinking")??!1}function createResponseTimingRecorder(){let requestedAt,startedMs,firstDeltaMs,lastDeltaMs,firstTokenAt,lastTokenAt,thinkingStreamed=!1;return{requested(){requestedAt=Date.now()},started(){startedMs??=performance.now()},observe(event){if(!STREAMED_DELTA_TYPES.has(event.type))return;let now=performance.now(),at=Date.now();event.type==="thinking_delta"&&(thinkingStreamed=!0),firstDeltaMs??=now,firstTokenAt??=at,lastDeltaMs=now,lastTokenAt=at},stamp(message){if(requestedAt===void 0)return;let windowStart=reasonedBeforeFirstDelta(message,thinkingStreamed)?startedMs:firstDeltaMs,generationMs=windowStart!==void 0&&lastDeltaMs!==void 0&&lastDeltaMs>windowStart?Math.round(lastDeltaMs-windowStart):void 0;message.timing={requestedAt,...firstTokenAt===void 0?{}:{firstTokenAt},...lastTokenAt===void 0?{}:{lastTokenAt},endedAt:Math.max(Date.now(),lastTokenAt??requestedAt),...generationMs===void 0?{}:{generationMs}}}}}var internalProgressSink=Symbol("internalProgressSink"),channels=new WeakMap;function createInternalAgentChannel(){let state={sequence:0,listeners:new Set},releaseCapture,channel=Object.freeze({subscribe(listener){return state.listeners.add(listener),releaseCapture??=subscribeAssistantCapture(),()=>{state.listeners.delete(listener),state.listeners.size===0&&(releaseCapture?.(),releaseCapture=void 0)}}});return channels.set(channel,state),channel}function internalLoopSink(channel){return!channel||!channels.get(channel)?.listeners.size?{}:{[internalProgressSink]:progress2=>dispatchInternalAgent(channel,{progress:progress2})}}function dispatchInternalAgent(channel,event){let state=channel&&channels.get(channel);if(!state?.listeners.size)return;let record2=Object.freeze({...event,sequence:++state.sequence});return(async()=>{for(let listener of state.listeners)await listener(record2)})()}function isEmptyStop(message){return message.stopReason==="stop"&&!hasVisibleAssistantContent(message)}function isEmptyToolUse(message){return message.stopReason==="toolUse"&&!message.content.some(block=>block.type==="toolCall")}function isMeaningfulContentEvent(event,policy){switch(event.type){case"toolcall_start":return!0;case"text_delta":return hasVisibleText(event.delta);case"text_end":return hasVisibleText(event.content);case"thinking_delta":return policy.thinkingCommits&&hasVisibleText(event.delta);case"thinking_end":return policy.thinkingCommits&&hasVisibleText(event.content);default:return!1}}function appendRetryDiagnostic(message,type="empty_assistant_response_recovery",details={retries:1}){return{...message,diagnostics:[...message.diagnostics??[],{type,timestamp:Date.now(),details}]}}function recoveryDiagnosticType(toolUse){return toolUse?"empty_tool_use_response_recovery":"empty_assistant_response_recovery"}function createEmptyResponseFailure(message,toolUse=!1){let errorMessage2=toolUse?EMPTY_TOOL_USE_ERROR:EMPTY_RESPONSE_ERROR;return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse)),content:[{type:"text",text:errorMessage2}],stopReason:"error",errorMessage:errorMessage2}}function createForwardedEmptyFailure(message,toolUse){return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse),{retries:0,forwarded:!0}),stopReason:"error",errorMessage:toolUse?FORWARDED_EMPTY_TOOL_USE_ERROR:FORWARDED_EMPTY_RESPONSE_ERROR}}function createRetryingStream(firstStream,createStream,policy){let outerStream=createAssistantMessageEventStream(),forward=entry2=>{"event"in entry2?outerStream.push(entry2.event):pushAssistantProgress(outerStream,entry2.progress)},replaced=(source,error)=>carryAssistantCapture(source,{type:"error",reason:"error",error},error);return(async()=>{try{let stream=firstStream,retrying=!1;for(;;){let buffered=[],forwarding=!1,retry=!1,events=assistantEvents(stream,progress2=>{forwarding?pushAssistantProgress(outerStream,progress2):buffered.push({progress:progress2})});for await(let event of events){if(event.type==="done"){let emptyToolUse=isEmptyToolUse(event.message);if(isEmptyStop(event.message)||emptyToolUse){if(forwarding){outerStream.push(replaced(event,createForwardedEmptyFailure(event.message,emptyToolUse))),outerStream.end();return}if(!retrying){retry=!0;break}outerStream.push(replaced(event,createEmptyResponseFailure(event.message,emptyToolUse))),outerStream.end();return}let message=retrying?appendRetryDiagnostic(event.message,recoveryDiagnosticType(isEmptyToolUse(event.message))):event.message,terminal2=retrying?carryAssistantCapture(event,{...event,message},message):event;if(!forwarding)for(let pending of buffered)forward(pending);outerStream.push(terminal2),outerStream.end();return}if(event.type==="error"){if(!forwarding)for(let pending of buffered)forward(pending);outerStream.push(event),outerStream.end();return}if(forwarding){outerStream.push(event);continue}if(buffered.push({event}),isMeaningfulContentEvent(event,policy)){for(let pending of buffered)forward(pending);forwarding=!0}}if(!retry){outerStream.end(retrying?appendRetryDiagnostic(await stream.result()):await stream.result());return}retrying=!0,stream=await createStream()}}catch(error){outerStream.fail(error)}})(),outerStream}function withEmptyAssistantRecovery(model,streamFunction){if(!shouldRecoverTextToolCalls(model)&&getToolCallFormat(model)===void 0)return streamFunction;let policy={thinkingCommits:!hasKimiTextToolCallRecovery(model)};return async(requestedModel,context,options)=>{let createStream=()=>streamFunction(requestedModel,context,options);return createRetryingStream(await createStream(),createStream,policy)}}var defaultStreamFn;function setDefaultStreamFn(streamFn){defaultStreamFn=streamFn}function getDefaultStreamFn(){if(!defaultStreamFn)throw new Error("No default stream function configured. Pass streamFn explicitly or call setDefaultStreamFn().");return defaultStreamFn}var StreamKeepAliveTimeoutError=class extends Error{constructor(timeoutMs){super(`Provider stream sent only keep-alives and timed out after ${timeoutMs}ms (raise streamKeepAliveTimeoutMs: retry.provider.keepAliveTimeoutMs in senpi settings; 0 disables)`),this.name="StreamKeepAliveTimeoutError"}};function createTransportLiveness(keepAliveTimeoutMs){let lastActivityAt,contentSilenceSince=Date.now();return{noteActivity:()=>{lastActivityAt=Date.now()},contentArrived:()=>{contentSilenceSince=Date.now()},onSilenceDeadline:windowMs=>{let now=Date.now();if(lastActivityAt===void 0||now-lastActivityAt>=windowMs)return{kind:"expire"};let delayMs=windowMs-(now-lastActivityAt);if(keepAliveTimeoutMs===void 0)return{kind:"extend",delayMs};let keepAliveLeftMs=keepAliveTimeoutMs-(now-contentSilenceSince);return keepAliveLeftMs<=0?{kind:"keep-alive-exhausted",error:new StreamKeepAliveTimeoutError(keepAliveTimeoutMs)}:{kind:"extend",delayMs:Math.max(1,Math.min(delayMs,keepAliveLeftMs))}}}}function prepareToolArguments(shim,args){return shim?shim(structuredClone(args)):args}function prepareAgentToolCallArguments(tool,toolCall){return tool.prepareArguments?{...toolCall,arguments:prepareToolArguments(tool.prepareArguments,toolCall.arguments)}:toolCall}function resolveToolNameAlias(requested,available){return resolveToolNameMatch(requested,available)}function toolNameCorrectionNotice(requested,resolved){return`[auto-corrected] no tool is named "${requested}"; ran "${resolved}". Call tools by their exact listed name.`}function withToolNameCorrection(result,requestedName,resolvedName){return{...result,content:[{type:"text",text:toolNameCorrectionNotice(requestedName,resolvedName),audience:"model"},...result.content??[]]}}function createErrorToolResult(message){return{content:[{type:"text",text:message}],details:{}}}function emitToolExecutionUpdate(toolCall,emit){return partialResult=>emit({type:"tool_execution_update",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments,partialResult})}async function emitToolExecutionEnd(finalized,emit){await emit({type:"tool_execution_end",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,result:finalized.result,isError:finalized.isError})}function createToolResultMessage(finalized){return{role:"toolResult",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,content:finalized.result.content??[],details:finalized.result.details,usage:finalized.result.usage,...finalized.result.addedToolNames?.length?{addedToolNames:finalized.result.addedToolNames}:{},isError:finalized.isError,timestamp:Date.now()}}async function emitToolResultMessage(toolResultMessage,emit){await emit({type:"message_start",message:toolResultMessage}),await emit({type:"message_end",message:toolResultMessage})}function shouldTerminateToolBatch(finalizedCalls){return finalizedCalls.length>0&&finalizedCalls.every(finalized=>finalized.result.terminate===!0)}function createAdmissionLine(){let tail=Promise.resolve();return{admit(mutation){let run=tail.then(()=>mutation());return tail=run.then(()=>{},()=>{}),run}}}function object(value2){return value2!==null&&typeof value2=="object"&&!Array.isArray(value2)}function strings(value2,keys){return keys.every(key=>typeof value2[key]=="string")}function numbers(value2,keys){return keys.every(key=>typeof value2[key]=="number"&&Number.isFinite(value2[key]))}function terminal(value2){return!object(value2)||typeof value2.hooksRan!="boolean"||typeof value2.uncertain!="boolean"?!1:value2.reason==="result"||value2.reason==="blocked"?value2.value!==void 0:["cancelled","lease_expired","hand_restarted","uncertain"].includes(String(value2.reason))}function manifestCall(value2){return object(value2)&&strings(value2,["executionId","executor","name","requestDigest"])&&numbers(value2,["sourceIndex","wave"])&&typeof value2.sequential=="boolean"&&value2.args!==void 0&&Array.isArray(value2.dependsOn)&&value2.dependsOn.every(dependency=>typeof dependency=="number")}function manifest(value2){return object(value2)&&strings(value2,["batchId","scope","workspace","issuer","manifestDigest"])&&numbers(value2,["generation","admittedAt","leaseUntil"])&&Array.isArray(value2.calls)&&value2.calls.every(manifestCall)}function prepareReply(value2){if(!object(value2))return!1;switch(value2.kind){case"prepared":case"prepared_awaiting_consent":return typeof value2.frozenDigest=="string";case"blocked":return value2.result!==void 0;case"batch_abort":return!0;case"settled":return terminal(value2.outcome);default:return!1}}function callOutcome(value2){if(!object(value2))return!1;switch(value2.kind){case"result":return value2.value!==void 0;case"blocked":return value2.result!==void 0;case"not_run":return value2.cause==="batch_abort"||value2.cause==="interrupted_preparation";case"interrupted":return typeof value2.reason=="string"&&typeof value2.uncertain=="boolean";default:return!1}}function consentRecord(value2){return object(value2)&&(value2.gate==="raw"||value2.gate==="frozen")&&typeof value2.digest=="string"&&(value2.answer==="approved"||value2.answer==="denied"||value2.answer==="expired")}function record(value2){if(!object(value2)||!manifest(value2.manifest))return!1;let size=value2.manifest.calls.length,{prepares,released,outcomes,decision,consents}=value2;return(consents===void 0||Array.isArray(consents)&&consents.length===size&&consents.every(entry2=>entry2===null||consentRecord(entry2)))&&(decision===null||decision==="RELEASE"||decision==="ABORT")&&Array.isArray(prepares)&&prepares.length===size&&prepares.every(reply=>reply===null||prepareReply(reply))&&Array.isArray(released)&&released.length===size&&released.every(mark=>typeof mark=="boolean")&&Array.isArray(outcomes)&&outcomes.length===size&&outcomes.every(outcome2=>outcome2===null||callOutcome(outcome2))}var BatchRecordCorruptError=class extends Error{constructor(){super("invalid durable batch record"),this.name="BatchRecordCorruptError"}};function decodeBatchRecord(value2){if(!record(value2))throw new BatchRecordCorruptError;return value2}var denied=(gate,answer2)=>({kind:"blocked",result:{reason:"consent_denied",gate,answer:answer2}}),lost={reason:"uncertain",hooksRan:!0,uncertain:!0},expired={reason:"lease_expired",hooksRan:!0,uncertain:!0};async function answer(step,gate,digest){let{recorded}=step;if(recorded!==null&&recorded.gate===gate&&recorded.digest===digest)return recorded.answer;let given=await step.consent.approve({...step.ref,gate,digest,name:step.call.name,leaseUntil:step.leaseUntil});return await step.record({gate,digest,answer:given}),given}async function gateRawCall(step){let{call}=step;if(!step.consent.needsConsent({name:call.name,args:call.args}))return{};let given=await answer(step,"raw",call.requestDigest);return given==="approved"?{authorizedDigest:call.requestDigest}:{blocked:denied("raw",given)}}async function resolveFrozenConsent(step,frozenDigest){let given=await answer(step,"frozen",frozenDigest);if(given==="denied")return await step.executor.abort(step.ref),denied("frozen",given);if(given==="expired")return{kind:"settled",outcome:expired};let reply=await consentOn(step.executor,step.ref,frozenDigest);return reply.kind==="prepared"?{kind:"prepared",frozenDigest}:reply.kind==="unknown_execution"?{kind:"settled",outcome:lost}:{kind:"settled",outcome:reply.outcome}}function consentOn(executor,ref,frozenDigest){if(executor.consent===void 0)throw new Error(`executor answered prepared_awaiting_consent for ${ref.executionId} but cannot take consent`);return executor.consent(ref,frozenDigest)}function canonicalJson(value2){return Array.isArray(value2)?`[${value2.map(canonicalJson).join(",")}]`:value2!==null&&typeof value2=="object"?`{${Object.entries(value2).sort(([a],[b])=>a<b?-1:a>b?1:0).map(([key,inner])=>`${JSON.stringify(key)}:${canonicalJson(inner)}`).join(",")}}`:JSON.stringify(value2)}async function canonicalDigest(value2){let bytes=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(canonicalJson(value2)));return Array.from(new Uint8Array(bytes),byte=>byte.toString(16).padStart(2,"0")).join("")}function batchDependencies(calls){let result=[],previousSequential,parallelSince=[];for(let[index,call]of calls.entries()){let anchor=previousSequential===void 0?[]:[previousSequential],dependsOn=call.sequential?[...anchor,...parallelSince]:anchor,wave=Math.max(-1,...dependsOn.map(dependency=>result[dependency]?.wave??-1))+1;result.push({dependsOn,wave}),call.sequential?(previousSequential=index,parallelSince=[]):parallelSince.push(index)}return result}async function buildBatchManifest(issuer,plan){let dependencies=batchDependencies(plan.calls),calls=[];for(let[sourceIndex,call]of plan.calls.entries()){let placement=dependencies[sourceIndex]??{dependsOn:[],wave:0};calls.push({...call,sourceIndex,dependsOn:placement.dependsOn,wave:placement.wave,requestDigest:await canonicalDigest({name:call.name,args:call.args})})}let{calls:_calls,...header}=plan;return{...header,issuer,calls,manifestDigest:await canonicalDigest({...header,issuer,calls})}}function abortCause(reply){if(reply.kind==="batch_abort")return"batch_abort";if(reply.kind==="settled"&&reply.outcome.reason!=="result")return"interrupted_preparation"}function finished(calls,outcomes,index){let done=new Map,visit=at=>{let known=done.get(at);if(known!==void 0)return known;let result=outcomes[at]!==null&&(calls[at]?.dependsOn??[]).every(dependency=>visit(dependency));return done.set(at,result),result};return visit(index)}function settledOutcome(reply){if(reply.kind==="unknown_execution")return{kind:"interrupted",reason:"unknown_execution",uncertain:!0};let{outcome:outcome2}=reply;switch(outcome2.reason){case"result":return{kind:"result",value:outcome2.value};case"blocked":return{kind:"blocked",result:outcome2.value};default:return{kind:"interrupted",reason:outcome2.reason,uncertain:outcome2.uncertain}}}var PREFIX="execution.batch:",keyOf=(issuer,batchId)=>`${PREFIX}${JSON.stringify([issuer,batchId])}`,BatchManifestConflictError=class extends Error{constructor(batchId){super(`batch ${batchId} already has a different durable manifest`),this.name="BatchManifestConflictError"}},replace=(items,index,value2)=>items.map((item,at)=>at===index?value2:item);function createBatchCoordinator(options){let{issuer,store,epoch,admission,executor,consent}=options,read=async batchId=>{let value2=await store.getDocument(keyOf(issuer,batchId));return value2===void 0?void 0:decodeBatchRecord(value2)};return{read,run:async plan=>{let manifest2=await buildBatchManifest(issuer,plan),key=keyOf(issuer,plan.batchId),record2=await read(plan.batchId),persist=async(next,step,call)=>{let data={batchId:plan.batchId,step,executionId:call?.executionId??null};await admission.admit(()=>store.commit(epoch,[{op:"append",id:store.mintId(),kind:"execution.batch",data},{op:"put",key,data:next}],()=>{})),record2=next},current=()=>{if(record2===void 0)throw new Error(`batch ${plan.batchId} has no durable record`);return record2},ref=call=>({issuer,executionId:call.executionId,generation:manifest2.generation}),settle2=async(call,outcome2)=>persist({...current(),outcomes:replace(current().outcomes,call.sourceIndex,outcome2)},"outcome",call);if(record2===void 0){let empty=manifest2.calls.map(()=>null);await persist({manifest:manifest2,prepares:empty,decision:null,released:manifest2.calls.map(()=>!1),outcomes:empty},"manifest")}else if(record2.manifest.manifestDigest!==manifest2.manifestDigest)throw new BatchManifestConflictError(plan.batchId);let consentStep=(gate,call)=>({consent:gate,executor:executor(call.executor),ref:ref(call),call,leaseUntil:manifest2.leaseUntil,recorded:current().consents?.[call.sourceIndex]??null,record:answered=>persist({...current(),consents:replace(current().consents??manifest2.calls.map(()=>null),call.sourceIndex,answered)},"consent",call)}),setPrepare=(call,reply)=>persist({...current(),prepares:replace(current().prepares,call.sourceIndex,reply)},"prepare",call);if(current().decision===null){for(let call of manifest2.calls){let reply=current().prepares[call.sourceIndex]??null,gate=reply===null&&consent!==void 0?await gateRawCall(consentStep(consent,call)):{};if(reply===null&&"blocked"in gate?(reply=gate.blocked,await setPrepare(call,reply)):reply===null&&(reply=await executor(call.executor).prepare({..."authorizedDigest"in gate&&gate.authorizedDigest!==void 0?{authorizedDigest:gate.authorizedDigest}:{},...ref(call),batchId:manifest2.batchId,manifestDigest:manifest2.manifestDigest,scope:manifest2.scope,workspace:manifest2.workspace,admittedAt:manifest2.admittedAt,leaseUntil:manifest2.leaseUntil,requestDigest:call.requestDigest,call:{name:call.name,args:call.args}}),await setPrepare(call,reply)),abortCause(reply)!==void 0)break}for(let call of manifest2.calls){if(current().prepares.some(reply2=>reply2!==null&&abortCause(reply2)!==void 0))break;let reply=current().prepares[call.sourceIndex]??null;if(reply?.kind==="prepared_awaiting_consent"){if(consent===void 0)throw new Error(`batch ${plan.batchId}: a call awaits consent but none is configured`);await setPrepare(call,await resolveFrozenConsent(consentStep(consent,call),reply.frozenDigest))}}let aborted=current().prepares.some(reply=>reply!==null&&abortCause(reply)!==void 0);await persist({...current(),decision:aborted?"ABORT":"RELEASE"},"decision")}let cause=current().prepares.map(reply=>reply===null?void 0:abortCause(reply)).find(found=>found!==void 0)??"batch_abort";for(let call of manifest2.calls){if(current().outcomes[call.sourceIndex]!==null)continue;let reply=current().prepares[call.sourceIndex]??null;reply?.kind==="settled"?await settle2(call,settledOutcome(reply)):reply?.kind==="blocked"?(await executor(call.executor).abort(ref(call)),await settle2(call,{kind:"blocked",result:reply.result})):current().decision==="ABORT"&&(reply!==null&&await executor(call.executor).abort(ref(call)),await settle2(call,{kind:"not_run",cause}))}let inflight=new Map;for(;;){for(let call2 of manifest2.calls){let index=call2.sourceIndex;if(!(current().outcomes[index]!==null||inflight.has(index))){if(!current().released[index]){if(!call2.dependsOn.every(dependency=>finished(manifest2.calls,current().outcomes,dependency)))continue;await persist({...current(),released:replace(current().released,index,!0)},"release",call2)}inflight.set(index,executor(call2.executor).release(ref(call2)).then(reply=>({index,ok:!0,reply}),error=>({index,ok:!1,error})))}}if(inflight.size===0)break;let settled=await Promise.race(inflight.values());if(inflight.delete(settled.index),!settled.ok)throw settled.error;let call=manifest2.calls[settled.index];call!==void 0&&await settle2(call,settledOutcome(settled.reply))}let{decision,outcomes}=current(),final=outcomes.filter(outcome2=>outcome2!==null);if(decision===null||final.length!==outcomes.length)throw new Error(`batch ${plan.batchId} ended with an unsettled call`);return{decision,outcomes:final}}}}function object2(value2){return value2!==null&&typeof value2=="object"&&!Array.isArray(value2)}function frozen(value2){return object2(value2)&&typeof value2.name=="string"&&typeof value2.digest=="string"&&value2.args!==void 0}function outcome(value2){if(!object2(value2)||typeof value2.hooksRan!="boolean"||typeof value2.uncertain!="boolean")return!1;switch(value2.reason){case"result":case"blocked":return value2.value!==void 0&&value2.uncertain===!1;case"cancelled":case"lease_expired":case"hand_restarted":case"uncertain":return!0;default:return!1}}function progress(value2){if(!object2(value2))return!1;switch(value2.state){case"admitted":case"preparing":case"acked":return!0;case"prepared":case"prepared_awaiting_consent":case"released":case"dispatched":return frozen(value2.call);case"reconciling":return frozen(value2.call)&&typeof value2.until=="number"&&Number.isFinite(value2.until);case"settled":return outcome(value2.outcome);default:return!1}}function entry(value2){return object2(value2)&&["issuer","commandId","executor","workspace","scope","requestDigest"].every(key=>typeof value2[key]=="string")&&["generation","admittedAt","leaseUntil","initialLeaseUntil","renewSeq"].every(key=>typeof value2[key]=="number"&&Number.isFinite(value2[key]))&&typeof value2.reconcilable=="boolean"&&typeof value2.effectPossible=="boolean"&&typeof value2.bodyDispatched=="boolean"&&progress(value2.progress)}var ExecutionLedgerCorruptError=class extends Error{constructor(){super("invalid durable execution ledger row"),this.name="ExecutionLedgerCorruptError"}};function decodeExecution(value2){if(!entry(value2))throw new ExecutionLedgerCorruptError;return value2}var refused=reason=>({status:"refused",reason}),replayed=entry2=>entry2.progress.state==="acked"?{status:"result_expired"}:{status:"replayed",entry:entry2},applied=entry2=>({status:"applied",entry:entry2});var advance=(entry2,progress2)=>applied({...entry2,progress:progress2}),settle=(entry2,reason)=>advance(entry2,{state:"settled",outcome:{reason,hooksRan:entry2.effectPossible,uncertain:entry2.effectPossible||entry2.bodyDispatched}});function authorized(entry2,{actor,event}){switch(event.kind){case"cancel":return actor.id===entry2.issuer||actor.approvedWorkspace===entry2.workspace;case"consent":case"release":case"abort":case"ack":case"renew":return actor.id===entry2.issuer;case"prepare":case"effect":case"freeze":case"block":case"dispatch":case"result":case"expire":case"restart":return actor.id===entry2.executor}}function recover(entry2,now){switch(entry2.progress.state){case"admitted":case"preparing":return settle(entry2,"hand_restarted");case"dispatched":return entry2.reconcilable?advance(entry2,{state:"reconciling",call:entry2.progress.call,until:Math.min(entry2.leaseUntil,now+3e4)}):settle(entry2,"hand_restarted");case"reconciling":return now>=entry2.progress.until?settle(entry2,"hand_restarted"):replayed(entry2);case"prepared":case"prepared_awaiting_consent":case"released":case"settled":case"acked":return replayed(entry2)}}function transitionExecution(entry2,command){let{event,now}=command;if(command.generation!==entry2.generation)return refused("stale_generation");if(!authorized(entry2,command))return refused("unauthorized");if(!Number.isFinite(now)||now<entry2.admittedAt)return refused("invalid_time");let progress2=entry2.progress;if(progress2.state==="acked")return event.kind==="ack"?{status:"replayed",entry:entry2}:{status:"result_expired"};if(progress2.state==="settled")switch(event.kind){case"ack":return advance(entry2,{state:"acked"});case"release":case"abort":case"consent":return refused("terminal");default:return replayed(entry2)}if(now>=entry2.leaseUntil)return settle(entry2,"lease_expired");if(progress2.state==="reconciling"&&now>=progress2.until)return settle(entry2,"hand_restarted");switch(event.kind){case"prepare":return progress2.state==="admitted"?advance(entry2,{state:"preparing"}):replayed(entry2);case"effect":return entry2.effectPossible?replayed(entry2):progress2.state==="preparing"?applied({...entry2,effectPossible:!0}):refused("invalid_transition");case"freeze":return progress2.state==="preparing"&&entry2.effectPossible?advance(entry2,{state:event.awaitingConsent?"prepared_awaiting_consent":"prepared",call:event.call}):"call"in progress2&&progress2.call.digest===event.call.digest?replayed(entry2):refused("invalid_transition");case"block":return progress2.state==="preparing"?advance(entry2,{state:"settled",outcome:{reason:"blocked",value:event.value,hooksRan:entry2.effectPossible,uncertain:!1}}):refused("invalid_transition");case"consent":return progress2.state==="prepared_awaiting_consent"?advance(entry2,{state:"prepared",call:progress2.call}):refused("invalid_transition");case"release":return progress2.state==="prepared"?advance(entry2,{state:"released",call:progress2.call}):progress2.state==="released"||entry2.bodyDispatched?replayed(entry2):refused("invalid_transition");case"dispatch":return entry2.bodyDispatched?replayed(entry2):progress2.state==="released"?applied({...entry2,bodyDispatched:!0,progress:{state:"dispatched",call:progress2.call}}):refused("invalid_transition");case"result":return progress2.state!=="dispatched"&&progress2.state!=="reconciling"?refused("invalid_transition"):advance(entry2,{state:"settled",outcome:{reason:"result",value:event.value,hooksRan:entry2.effectPossible,uncertain:!1}});case"cancel":return settle(entry2,"cancelled");case"abort":return entry2.bodyDispatched?refused("invalid_transition"):settle(entry2,"cancelled");case"ack":return refused("invalid_transition");case"renew":return event.seq<=entry2.renewSeq?replayed(entry2):!Number.isSafeInteger(event.seq)||!Number.isFinite(event.leaseUntil)||event.leaseUntil<=entry2.leaseUntil||event.leaseUntil>entry2.admittedAt+864e5?refused("invalid_renewal"):applied({...entry2,renewSeq:event.seq,leaseUntil:event.leaseUntil});case"expire":return replayed(entry2);case"restart":return recover(entry2,now)}}var PREFIX2="execution.ledger:",keyOf2=({issuer,commandId})=>`${PREFIX2}${JSON.stringify([issuer,commandId])}`;function createExecutionLedger(options){let{store,epoch,admission}=options,read=async key=>{let value2=await store.getDocument(keyOf2(key));return value2===void 0?void 0:decodeExecution(value2)},persist=async(entry2,event,audit=!1)=>{let writes=[{op:"append",id:store.mintId(),kind:audit?"execution.audit":"execution.transition",data:{issuer:entry2.issuer,commandId:entry2.commandId,generation:entry2.generation,event,state:entry2.progress.state}}];audit||writes.push({op:"put",key:keyOf2(entry2),data:entry2}),await store.commit(epoch,writes,()=>{})},apply=(command,guard)=>admission.admit(async()=>{let refusal2=guard?.();if(refusal2!==void 0)return refused(refusal2);let entry2=await read(command.key);if(entry2===void 0)return refused("not_found");let reply=transitionExecution(entry2,command);return reply.status==="applied"?await persist(reply.entry,command.event.kind):reply.status==="replayed"&&entry2.progress.state==="settled"&&(command.event.kind==="result"||command.event.kind==="cancel")&&await persist(entry2,command.event.kind,!0),reply});return{read,apply,admit:(input,guard)=>admission.admit(async()=>{let refusal2=guard?.();if(refusal2!==void 0)return refused(refusal2);let prior=await read(input);if(prior!==void 0)return prior.executor===input.executor&&prior.workspace===input.workspace&&prior.scope===input.scope&&prior.generation===input.generation&&prior.requestDigest===input.requestDigest&&prior.admittedAt===input.admittedAt&&prior.initialLeaseUntil===input.leaseUntil&&prior.reconcilable===input.reconcilable?replayed(prior):refused("identity_conflict");if(![input.issuer,input.commandId,input.executor,input.workspace,input.scope,input.requestDigest].every(Boolean)||!Number.isSafeInteger(input.generation)||input.generation<1||!Number.isFinite(input.admittedAt)||!Number.isFinite(input.leaseUntil)||input.leaseUntil<=input.admittedAt||input.leaseUntil>input.admittedAt+864e5)return refused("invalid_admission");let entry2={...input,initialLeaseUntil:input.leaseUntil,renewSeq:0,effectPossible:!1,bodyDispatched:!1,progress:{state:"admitted"}};return await persist(entry2,"admit"),applied(entry2)}),scan:async()=>(await store.scanDocuments(PREFIX2)).map(document=>decodeExecution(document.data)),recover:async now=>{for(let document of await store.scanDocuments(PREFIX2)){let entry2=decodeExecution(document.data);await apply({key:entry2,generation:entry2.generation,actor:{id:entry2.executor},now,event:{kind:"restart"}})}}}}function errorResult(message){return{content:[{type:"text",text:message}],details:{}}}function messageOf(error){return error instanceof Error?error.message:String(error)}var ABORTED=Symbol("aborted");async function runBody(body,signal,onUpdate){let updates=[],accepting=!0;try{let execution=body.tool.execute(body.toolCall.id,body.args,signal,partial=>{accepting&&updates.push(Promise.resolve(onUpdate(partial)))}),aborted=signal===void 0?void 0:new Promise(resolve=>{signal.aborted?resolve(ABORTED):signal.addEventListener("abort",()=>resolve(ABORTED),{once:!0})}),settled=aborted?await Promise.race([execution,aborted]):await execution;return accepting=!1,await Promise.all(updates),settled===ABORTED?(Promise.resolve(execution).catch(()=>{}),{result:errorResult("Tool execution aborted"),isError:!0}):{result:settled,isError:settled.isError===!0}}catch(error){return accepting=!1,await Promise.all(updates),{result:errorResult(messageOf(error)),isError:!0}}}async function finalizeBody(body,executed,pipeline,signal){let{result,isError}=executed;try{let after=await pipeline.afterToolCall({assistantMessage:body.assistantMessage,toolCall:body.toolCall,args:body.args,result,isError,context:body.context},signal);if(!after)return executed;let structuredContent=after.structuredContent??(after.content?void 0:result.structuredContent),merged={...result,content:after.content??result.content,details:after.details??result.details,usage:after.usage??result.usage,terminate:after.terminate??result.terminate};return structuredContent===void 0?delete merged.structuredContent:merged.structuredContent=structuredContent,{result:merged,isError:after.isError??isError}}catch(error){return{result:errorResult(messageOf(error)),isError:!0}}}function toStoreValue(value2){let json=JSON.stringify(value2);return json===void 0?null:JSON.parse(json)}async function freezeCall(name,args){let frozenArgs=toStoreValue(args);return{name,args:frozenArgs,digest:await canonicalDigest({name,args:frozenArgs})}}function resultValue(result,isError,requestedName){return toStoreValue({content:result.content??[],isError,requestedName})}function recordedResult(outcome2,requestedName){try{return{...outcome2,value:resultValue(outcome2.result,outcome2.isError,requestedName)}}catch(error){let result=errorResult(`Tool result content is not JSON: ${messageOf(error)}`);return{result,isError:!0,value:resultValue(result,!0,requestedName)}}}function stoppedValue(reply){let text=(reply.result.content??[]).map(part=>part.type==="text"?part.text:"").join(""),requestedName=reply.kind==="blocked"?reply.requestedName:void 0;return toStoreValue({kind:reply.kind,text,terminate:reply.result.terminate===!0,requestedName})}function isRecord5(value2){return value2!==null&&typeof value2=="object"&&!Array.isArray(value2)}function stoppedReply(value2){if(!isRecord5(value2))return;let{kind,text,terminate,requestedName}=value2;if(typeof text!="string"||typeof terminate!="boolean")return;let result=errorResult(text);if(terminate&&(result.terminate=!0),kind==="batch_abort")return{kind,result};if(kind==="blocked")return typeof requestedName=="string"?{kind,result,requestedName}:{kind,result}}var keyId=({issuer,commandId})=>JSON.stringify([issuer,commandId]),keyOf3=request=>({issuer:request.issuer,commandId:request.commandId??request.call.id});function refusal(reply){return{kind:"refused",reason:reply.status==="refused"?reply.reason:reply.status}}function incompleteMessage(name,errorMessage2){return errorMessage2!==void 0?`${errorMessage2}${errorMessage2.endsWith(".")?"":"."} Re-issue the tool call with complete arguments.`:`Tool call "${name}" was not executed: the response ended before the tool call was complete because it hit the output token limit. Re-issue the tool call with complete arguments.`}function fromRow(entry2){let progress2=entry2.progress;if(progress2.state==="prepared_awaiting_consent")return{kind:"prepared_awaiting_consent",call:progress2.call};if("call"in progress2)return{kind:"prepared",call:progress2.call};if(progress2.state!=="settled")return{kind:"refused",reason:progress2.state};let outcome2=progress2.outcome;return outcome2.reason!=="blocked"?{kind:"refused",reason:"terminal"}:stoppedReply(outcome2.value)??{kind:"refused",reason:"corrupt_blocked_outcome"}}function createPreparedExecutor(options){let{ledger,executor,pipeline}=options,clock=options.clock??Date.now,preparations=new Map,bodies=new Map,releases=new Map,step=(key,generation,event)=>ledger.apply({key,generation,actor:{id:executor},now:clock(),event});async function stop(key,generation,reply){let recorded=await step(key,generation,{kind:"block",value:stoppedValue(reply)});return recorded.status==="applied"?reply:recorded.status==="replayed"?fromRow(recorded.entry):refusal(recorded)}async function prepareOnce(request,requestDigest){let{call,generation,signal}=request,key=keyOf3(request),admitted=await ledger.admit({...key,executor,workspace:request.workspace,scope:request.scope,generation,requestDigest,admittedAt:request.admittedAt,leaseUntil:request.leaseUntil,reconcilable:request.reconcilable??!1});if(admitted.status==="replayed")return fromRow(admitted.entry);if(admitted.status!=="applied")return refusal(admitted);let preparing=await step(key,generation,{kind:"prepare"});if(preparing.status!=="applied")return refusal(preparing);if(call.incomplete===!0)return stop(key,generation,{kind:"blocked",result:errorResult(incompleteMessage(call.name,call.errorMessage))});let effect=await step(key,generation,{kind:"effect"});if(effect.status!=="applied")return refusal(effect);let tool;try{tool=await pipeline.resolve(call,request.context)}catch(error){return stop(key,generation,{kind:"blocked",result:errorResult(messageOf(error))})}if(!tool){let hint=pipeline.removedToolHint(call.name),text=hint===void 0?`Tool ${call.name} not found`:`Tool ${call.name} not found. ${hint}`;return stop(key,generation,{kind:"blocked",result:errorResult(text)})}let requestedName=tool.name===call.name?void 0:call.name,named=requestedName===void 0?{}:{requestedName};try{let prepared=prepareAgentToolCall(tool,requestedName===void 0?call:{...call,name:tool.name}),before=await pipeline.beforeToolCall({assistantMessage:request.assistantMessage,toolCall:prepared.toolCall,args:prepared.args,context:request.context},signal);if(signal?.aborted)return stop(key,generation,{kind:"batch_abort",result:errorResult("Operation aborted")});if(before?.block){let result=errorResult(before.reason||"Tool execution was blocked");return before.terminate===!0&&(result.terminate=!0),stop(key,generation,{kind:"blocked",result,...named})}let frozen2=await freezeCall(tool.name,prepared.args),covered=request.authorizedDigest===requestDigest&&(await freezeCall(call.name,toStoreValue(call.arguments))).digest===frozen2.digest,awaitingConsent=options.consent!==void 0&&!covered&&options.consent.needsConsent({name:frozen2.name,args:frozen2.args}),freeze=await step(key,generation,{kind:"freeze",call:frozen2,awaitingConsent});return freeze.status!=="applied"?refusal(freeze):(pipeline.afterFreeze(prepared.args,frozen2.args),bodies.set(keyId(key),{...named,tool,toolCall:prepared.toolCall,args:frozen2.args,assistantMessage:request.assistantMessage,context:request.context}),{kind:awaitingConsent?"prepared_awaiting_consent":"prepared",call:frozen2,...named})}catch(error){return stop(key,generation,{kind:"blocked",result:errorResult(messageOf(error)),...named})}}async function terminalRow(key){let entry2=await ledger.read(key);if(entry2===void 0)return{kind:"refused",reason:"not_found"};let progress2=entry2.progress;return progress2.state==="settled"&&progress2.outcome.reason==="blocked"?{kind:"refused",reason:"blocked"}:{kind:"replayed",entry:entry2}}async function runReleased(request,body){let{key,generation,signal}=request,dispatched=await step(key,generation,{kind:"dispatch"});if(dispatched.status==="replayed")return{kind:"replayed",entry:dispatched.entry};if(dispatched.status!=="applied"||dispatched.entry.progress.state!=="dispatched")return refusal(dispatched);let executed=await runBody(body,signal,request.onUpdateFor?.(body.toolCall)??request.onUpdate??(()=>{})),{result,isError,value:value2}=recordedResult(await finalizeBody(body,executed,pipeline,signal),body.requestedName),recorded=await step(key,generation,{kind:"result",value:value2});for(let memo of[bodies,preparations,releases])memo.delete(keyId(key));if(recorded.status==="replayed")return{kind:"replayed",entry:recorded.entry};if(recorded.status!=="applied")return refusal(recorded);let named=body.requestedName===void 0?{}:{requestedName:body.requestedName};return{kind:"settled",toolCall:body.toolCall,result,isError,...named}}async function release(request){let{key,generation}=request,released=await ledger.apply({key,generation,actor:request.actor,now:clock(),event:{kind:"release"}});if(released.status==="refused")return released.reason==="terminal"?terminalRow(key):refusal(released);if(released.status==="result_expired")return refusal(released);let id=keyId(key),pending=releases.get(id);if(pending!==void 0)return pending;let body=bodies.get(id);if(body===void 0)return{kind:"refused",reason:"not_prepared"};if(request.signal?.aborted)return{kind:"aborted",result:errorResult("Operation aborted")};let reply=runReleased(request,body);return releases.set(id,reply),reply.catch(()=>releases.get(id)===reply&&releases.delete(id)),reply}async function consent(request){let entry2=await ledger.read(request.key);if(entry2===void 0)return{kind:"refused",reason:"not_found"};if("call"in entry2.progress&&entry2.progress.call.digest!==request.frozenDigest)return{kind:"refused",reason:"frozen_digest_mismatch"};let reply=await ledger.apply({key:request.key,generation:request.generation,actor:request.actor,now:clock(),event:{kind:"consent"}});if(reply.status==="applied"&&reply.entry.progress.state==="prepared")return{kind:"prepared"};if(reply.status==="refused"&&reply.reason==="invalid_transition"&&entry2.progress.state==="prepared")return{kind:"prepared"};if(reply.status==="applied"||reply.status==="replayed")return{kind:"replayed",entry:reply.entry};if(reply.status==="refused"&&reply.reason==="terminal"){let terminal2=await ledger.read(request.key);return terminal2===void 0?{kind:"refused",reason:"not_found"}:{kind:"replayed",entry:terminal2}}return refusal(reply)}return{consent,prepare:async request=>{let{name,arguments:args,incomplete,errorMessage:errorMessage2}=request.call,requestDigest=await canonicalDigest(toStoreValue({name,args,incomplete,errorMessage:errorMessage2})),admission=JSON.stringify([request.generation,request.workspace,request.scope,requestDigest,request.admittedAt,request.leaseUntil,request.reconcilable??!1]),id=keyId(keyOf3(request)),pending=preparations.get(id);if(pending!==void 0&&pending.admission===admission)return pending.reply;if(pending!==void 0)return{kind:"refused",reason:"identity_conflict"};let reply=prepareOnce(request,requestDigest);preparations.set(id,{admission,reply});let forget=()=>preparations.get(id)?.reply===reply&&preparations.delete(id);return reply.then(settled=>settled.kind==="prepared"||settled.kind==="prepared_awaiting_consent"||forget(),forget),reply},release}}function agentPreparationPipeline(agent){return{resolve:async(call,context)=>{let tools=context.tools??[],exact=tools.find(tool=>tool.name===call.name);if(exact)return exact;let resolved=await agent.resolveUnknownToolCall?.(call.name,context);if(resolved)return resolved;let aliased=resolveToolNameAlias(call.name,tools.map(tool=>tool.name));return tools.find(tool=>tool.name===aliased)},beforeToolCall:async(context,signal)=>agent.beforeToolCall?.(context,signal),afterToolCall:async(context,signal)=>agent.afterToolCall?.(context,signal),removedToolHint:name=>agent.removedToolHints?.[name],afterFreeze:(prepared,frozen2)=>agent.afterToolFreeze(prepared,frozen2)}}var ISSUER="loop",EXECUTOR="local",LEASE_MS=1440*60*1e3,NO_WORKSPACE="in-process";function isSequential(context,name){let tools=context.tools??[],named=resolveToolNameAlias(name,tools.map(tool2=>tool2.name));return(tools.find(candidate=>candidate.name===name)??tools.find(candidate=>candidate.name===named))?.executionMode==="sequential"}async function runPreparedBatch(request){let{source,calls,context,assistantMessage,emit,signal}=request,store=request.openStore();await store.claim(0,1);let admission=createAdmissionLine(),base=agentPreparationPipeline(source),resolved=new Map,prepared=createPreparedExecutor({ledger:createExecutionLedger({store,epoch:1,admission}),executor:EXECUTOR,pipeline:{...base,resolve:async call=>resolved.get(call)}}),executionIdOf=index=>String(index),byExecution=new Map(calls.map((call,index)=>[executionIdOf(index),call])),renamed=new Map,named=(id,call)=>renamed.get(id)??call,callOf=id=>{let call=byExecution.get(id);if(call===void 0)throw new Error(`prepared pipeline: unknown execution ${id}`);return call},started=new Set,pending=new Map,finalized=new Map,finish=async(id,outcome2)=>{finalized.set(id,outcome2),await emitToolExecutionEnd(outcome2,emit)},aborted=call=>({toolCall:call,result:createErrorToolResult("Operation aborted"),isError:!0}),endpoint={prepare:async ref=>{let id=ref.executionId,call=callOf(id);if(signal?.aborted&&started.size>0)return{kind:"batch_abort"};let tool=call.incomplete===!0?void 0:await base.resolve(call,context);resolved.set(call,tool),tool!==void 0&&tool.name!==call.name&&renamed.set(id,{...call,name:tool.name}),await emit({type:"tool_execution_start",toolCallId:call.id,toolName:tool?.name??call.name,args:call.arguments}),started.add(id);let reply=await prepared.prepare({issuer:ISSUER,commandId:id,generation:ref.generation,workspace:ref.workspace,scope:ref.scope,call,assistantMessage,context,admittedAt:ref.admittedAt,leaseUntil:ref.leaseUntil,...signal===void 0?{}:{signal}});if(signal?.aborted)return pending.set(id,aborted(named(id,call))),{kind:"batch_abort"};if(reply.kind==="prepared")return{kind:"prepared",frozenDigest:reply.call.digest};if(reply.kind==="prepared_awaiting_consent")return{kind:"prepared_awaiting_consent",frozenDigest:reply.call.digest};if(reply.kind==="refused")throw new Error(`prepared pipeline refused call ${call.id} (execution ${id}): ${reply.reason}`);let result=reply.kind==="blocked"&&reply.requestedName!==void 0&&tool!==void 0?withToolNameCorrection(reply.result,reply.requestedName,tool.name):reply.result;pending.set(id,{toolCall:named(id,call),result,isError:!0});let value2=toStoreValue({content:result.content??[]});return reply.kind==="blocked"?{kind:"blocked",result:value2}:{kind:"batch_abort"}},release:async ref=>{let id=ref.executionId,call=callOf(id),reply=await prepared.release({key:{issuer:ISSUER,commandId:id},generation:ref.generation,actor:{id:ISSUER},onUpdateFor:toolCall=>emitToolExecutionUpdate(toolCall,emit),...signal===void 0?{}:{signal}});if(reply.kind==="settled"){let result=reply.requestedName===void 0?reply.result:withToolNameCorrection(reply.result,reply.requestedName,reply.toolCall.name);return await finish(id,{toolCall:reply.toolCall,result,isError:reply.isError}),{kind:"settled",outcome:{reason:"result",value:toStoreValue(result.content??[]),hooksRan:!0,uncertain:!1}}}if(reply.kind!=="aborted")throw new Error(`prepared pipeline: release ${reply.kind} for call ${call.id} (execution ${id})`);return await finish(id,signal?.aborted?aborted(named(id,call)):{toolCall:named(id,call),result:reply.result,isError:!0}),{kind:"settled",outcome:{reason:"cancelled",hooksRan:!0,uncertain:!1}}},abort:async ref=>{let id=ref.executionId,call=callOf(id);return started.has(id)&&await finish(id,signal?.aborted?aborted(named(id,call)):pending.get(id)??aborted(named(id,call))),{kind:"settled",outcome:{reason:"cancelled",hooksRan:!1,uncertain:!1}}}},now=Date.now(),plan={batchId:crypto.randomUUID(),scope:request.scope.id,workspace:request.scope.root===""?NO_WORKSPACE:request.scope.root,generation:1,admittedAt:now,leaseUntil:now+LEASE_MS,calls:calls.map((call,index)=>({executionId:executionIdOf(index),executor:EXECUTOR,name:call.name,args:toStoreValue(call.arguments),sequential:isSequential(context,call.name)}))};return await createBatchCoordinator({issuer:ISSUER,store,epoch:1,admission,executor:()=>endpoint}).run(plan),calls.flatMap((_call,index)=>{let id=executionIdOf(index),outcome2=finalized.get(id);return started.has(id)&&outcome2!==void 0?[outcome2]:[]})}function createPreparedToolHost(source,openStore){return{async execute(call,options){let{emit,signal,recordWitness,local:local2}=options;if(local2===void 0)throw new Error("the prepared pipeline runs only in the loop's own process");if(recordWitness)for(let raw of call.calls){let pending=recordWitness({pipeline:"prepared",toolCallId:raw.id});pending&&await pending}let batch=calls=>runPreparedBatch({source,openStore,calls,scope:call.scope,context:local2.context,assistantMessage:local2.assistantMessage,emit,...signal===void 0?{}:{signal}}),outcomes=[],messages=[],report=async finished2=>{for(let outcome2 of finished2){let message=createToolResultMessage(outcome2);await emitToolResultMessage(message,emit),outcomes.push(outcome2),messages.push(message)}};if(call.mode==="sequential"){for(let raw of call.calls)if(await report(await batch([raw])),signal?.aborted)break}else await report(await batch(call.calls));return{messages,terminate:shouldTerminateToolBatch(outcomes)}}}}var BatchStoreMissingError=class extends Error{constructor(){super("agent loop: no batchStoreFactory configured for the prepared pipeline; pass one (or a toolHost)"),this.code="batch_store_missing",this.name="BatchStoreMissingError"}},PreflightCarryMissingError=class extends Error{constructor(){super("agent loop: no afterToolFreeze configured for the prepared pipeline; pass one (or a toolHost)"),this.code="preflight_carry_missing",this.name="PreflightCarryMissingError"}};function noPreflightCarry(_prepared,_frozen){}function agentLoop(prompts,context,config,signal,streamFn){let stream=createAgentStream();return runAgentLoop(prompts,context,config,async event=>{stream.push(event)},signal,streamFn).then(messages=>{stream.end(messages)}),stream}function agentLoopContinue(context,config,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let stream=createAgentStream();return runAgentLoopContinue(context,config,async event=>{stream.push(event)},signal,streamFn).then(messages=>{stream.end(messages)}),stream}async function runAgentLoop(prompts,context,config,emit,signal,streamFn){let initialMessages=declareToolChanges(context,prompts,config.model),newMessages=[...initialMessages],currentContext={...context,messages:[...context.messages,...initialMessages]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let message of initialMessages)await emit({type:"message_start",message}),await emit({type:"message_end",message});return await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}async function runAgentLoopContinue(context,config,emit,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let newMessages=[],currentContext={...context};return await emit({type:"agent_start"}),await emit({type:"turn_start"}),await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}function createAgentStream(){return new EventStream(event=>event.type==="agent_end",event=>event.type==="agent_end"?event.messages:[])}var StreamIdleTimeoutError=class extends Error{constructor(timeoutMs){super(`Idle timeout waiting for provider stream after ${timeoutMs}ms`),this.name="StreamIdleTimeoutError"}},StreamStartTimeoutError=class extends Error{constructor(timeoutMs){super(`Provider stream start timed out after ${timeoutMs}ms (raise streamStartTimeoutMs: retry.provider.streamStartTimeoutMs in senpi settings; 0 disables)`),this.name="StreamStartTimeoutError"}};async function runLoop(initialContext,newMessages,initialConfig,signal,emit,streamFunction){let currentContext=initialContext,config={...initialConfig,executionScope:initialConfig.executionScope??{id:crypto.randomUUID(),root:""}},firstTurn=!0,firstProviderRequest=!0,drainedTerminatingQueue,turnStartAlreadyEmitted=!1,explicitContinuation=!1,preparedMessages=[],pendingSource="steering",drainSteering=async()=>(pendingSource="steering",await config.getSteeringMessages?.()||[]),drainFollowUp=async()=>(pendingSource="followUp",await config.getFollowUpMessages?.()||[]),refreshTerminatingQueueDrain=async()=>{!drainedTerminatingQueue||!config.restorePendingMessages||(await config.restorePendingMessages(drainedTerminatingQueue,pendingMessages),pendingMessages=await drainSteering(),drainedTerminatingQueue=pendingMessages.length>0?"steering":void 0,pendingMessages.length===0&&(pendingMessages=await drainFollowUp(),drainedTerminatingQueue=pendingMessages.length>0?"followUp":void 0))},pendingMessages=await drainSteering();for(;;){let hasMoreToolCalls=!0;for(;hasMoreToolCalls||pendingMessages.length>0;){if(turnStartAlreadyEmitted?turnStartAlreadyEmitted=!1:firstTurn?firstTurn=!1:await emit({type:"turn_start"}),drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}if(pendingMessages.length>0&&config.commitQueuedConsumption)try{await config.commitQueuedConsumption(pendingSource,pendingMessages)}catch(error){throw await config.restorePendingMessages?.(pendingSource,pendingMessages),error}for(let message2 of declareToolChanges(currentContext,[...preparedMessages,...pendingMessages],config.model))await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);preparedMessages=[],pendingMessages=[];let requestUpdate=await config.prepareRequest?.({context:currentContext,model:config.model,thinkingLevel:config.reasoning??"off"},signal);requestUpdate&&(currentContext=requestUpdate.context??currentContext,config=applyLoopUpdate(config,requestUpdate));let isInitialProviderRequest=firstProviderRequest;firstProviderRequest=!1;let requestConfig=isInitialProviderRequest?{...config,timeoutMs:config.initialRequestTimeoutMs??config.timeoutMs,streamStartTimeoutMs:config.initialRequestStreamStartTimeoutMs??config.streamStartTimeoutMs}:config,streamed=await streamAssistantResponse(currentContext,requestConfig,signal,emit,withEmptyAssistantRecovery(requestConfig.model,streamFunction),isInitialProviderRequest?config.timeoutMs:requestConfig.timeoutMs),message=streamed.message,providerToolResults=streamed.providerToolResults;newMessages.push(message);let toolResults=[];for(let result of providerToolResults)await emit({type:"message_start",message:result}),await emit({type:"message_end",message:result}),currentContext.messages.push(result),newMessages.push(result),toolResults.push(result);if(config.commitStep&&await config.commitStep({message,providerToolResults}),shouldTerminateAssistantTurn(message)){await config.finishTurn?.({message,toolResults,context:currentContext,newMessages},signal),await emit({type:"turn_end",message,toolResults}),await emit({type:"agent_end",messages:newMessages});return}let toolCalls=message.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));hasMoreToolCalls=!1;let toolBatchTerminated=!1;if(toolCalls.length>0){let executedToolBatch=message.stopReason==="length"?await failToolCallsFromTruncatedMessage(toolCalls,emit):await executeToolCalls(currentContext,message,config,signal,emit);toolResults.push(...executedToolBatch.messages),toolBatchTerminated=executedToolBatch.terminate,hasMoreToolCalls=!executedToolBatch.terminate;for(let result of executedToolBatch.messages)currentContext.messages.push(result),newMessages.push(result)}let nextTurnContext={message,toolResults,context:currentContext,newMessages},decision=await config.finishTurn?.(nextTurnContext,signal);if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}if(decision?.action==="end"){await emit({type:"agent_end",messages:newMessages});return}if(explicitContinuation=decision?.action==="continue",toolBatchTerminated){if(pendingMessages=await drainSteering(),pendingMessages.length>0&&(drainedTerminatingQueue="steering"),pendingMessages.length===0&&(pendingMessages=await drainFollowUp(),pendingMessages.length>0&&(drainedTerminatingQueue="followUp")),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}pendingMessages.length>0&&(await emit({type:"turn_start"}),turnStartAlreadyEmitted=!0)}let nextTurnSnapshot;try{nextTurnSnapshot=await config.prepareNextTurn?.(nextTurnContext)}catch(error){throw drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),error}if(nextTurnSnapshot&&(currentContext=nextTurnSnapshot.context??currentContext,preparedMessages=nextTurnSnapshot.messages??[],config=applyLoopUpdate(config,nextTurnSnapshot)),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await drainSteering()),(hasMoreToolCalls||pendingMessages.length>0)&&(explicitContinuation=!1)}let followUpMessages=await drainFollowUp();if(followUpMessages.length>0){explicitContinuation=!1,pendingMessages=followUpMessages;continue}if(explicitContinuation){explicitContinuation=!1;continue}break}await emit({type:"agent_end",messages:newMessages})}function applyLoopUpdate(config,update){return{...config,model:update.model??config.model,reasoning:update.thinkingLevel===void 0?config.reasoning:update.thinkingLevel==="off"?void 0:update.thinkingLevel,thinkingSelection:update.thinkingSelection===void 0?config.thinkingSelection:update.thinkingSelection??void 0,abortServerSideFallback:update.abortServerSideFallback??config.abortServerSideFallback}}function declareToolChanges(context,pendingMessages,model){let systemIndex=-1;for(let i=pendingMessages.length-1;i>=0;i--)if(pendingMessages[i].role==="system"){systemIndex=i;break}let pending=pendingMessages[systemIndex],baseline=pending?pendingMessages.map((message,index2)=>index2===systemIndex?withToolChanges(pending,NO_CHANGES):message):pendingMessages,declared=(providerTools(context,model).tools??[]).map(toProviderToolDeclaration),shorthand=createInitialSystemMessage(context.systemPrompt,declared),committed=shorthand?[shorthand,...context.messages,...baseline]:[...context.messages,...baseline],delta=getToolStateChanges(getCurrentTools(committed),declared),declaredByName=new Map(declared.map(tool=>[tool.name,tool])),changes={toolsAdded:delta.toolsAdded.map(tool=>declaredByName.get(tool.name)??tool),toolsRemoved:delta.toolsRemoved},unchanged=changes.toolsAdded.length===0&&changes.toolsRemoved.length===0;if(pending)return unchanged&&!pending.toolsAdded?.length&&!pending.toolsRemoved?.length?pendingMessages:baseline.map((message,index2)=>index2===systemIndex?withToolChanges(pending,changes):message);if(unchanged)return pendingMessages;let update=withToolChanges({role:"system",content:"",timestamp:Date.now()},changes),insertIndex=pendingMessages.findIndex(message=>message.role!=="system"),index=insertIndex===-1?pendingMessages.length:insertIndex;return[...pendingMessages.slice(0,index),update,...pendingMessages.slice(index)]}var NO_CHANGES={toolsAdded:[],toolsRemoved:[]};function toProviderToolDeclaration(tool){return{name:tool.name,description:tool.description,parameters:tool.parameters,...tool.freeform===void 0?{}:{freeform:tool.freeform},...tool.constrainedSampling===void 0?{}:{constrainedSampling:tool.constrainedSampling}}}function withToolChanges(message,{toolsAdded,toolsRemoved}){let{toolsAdded:_added,toolsRemoved:_removed,...rest}=message;return{...rest,...toolsAdded.length>0?{toolsAdded}:{},...toolsRemoved.length>0?{toolsRemoved}:{}}}function providerTools(context,model){let declaredTools=context.declaredTools;if(declaredTools===void 0||model===void 0||!supportsAllowedToolChoice(model))return{tools:context.tools};let activeTools=context.tools??[],declaredNames=new Set(declaredTools.map(tool=>tool.name));return{tools:[...declaredTools,...activeTools.filter(tool=>!declaredNames.has(tool.name))],activeToolNames:activeTools.map(tool=>tool.name)}}async function buildProviderContext(context,config,signal){let messages=context.messages;config.transformContext&&(messages=await config.transformContext(messages,signal));let{tools,activeToolNames}=providerTools(context,config.model);return normalizeContext({systemPrompt:context.systemPrompt,...context.systemPromptStablePrefix===void 0?{}:{systemPromptStablePrefix:context.systemPromptStablePrefix},messages:await config.convertToLlm(messages),...tools===void 0?{}:{tools:tools.map(toProviderToolDeclaration)},...activeToolNames===void 0?{}:{activeToolNames}})}async function streamAssistantResponse(context,config,signal,emit,streamFunction,streamIdleTimeoutMs){let partialMessage=null,addedPartial=!1,providerToolResults=[],thinkingTiming=new Map,responseTiming=createResponseTimingRecorder();function stampTiming(finalMessage){responseTiming.stamp(finalMessage);for(let timing of thinkingTiming.values())timing.endedAt===void 0&&(timing.endedAt=Date.now());for(let[contentIndex,timing]of thinkingTiming){let block=finalMessage.content[contentIndex];block?.type==="thinking"&&(block.startedAt=timing.startedAt,block.endedAt=timing.endedAt)}}let requestAbortController=new AbortController,liveness=createTransportLiveness(normalizeTimeoutMs(config.streamKeepAliveTimeoutMs)),detachCallerAbort;if(signal!==void 0)if(signal.aborted)requestAbortController.abort(signal.reason);else{let onCallerAbort=()=>requestAbortController.abort(signal.reason);signal.addEventListener("abort",onCallerAbort,{once:!0}),detachCallerAbort=()=>signal.removeEventListener("abort",onCallerAbort)}try{let preStream=createPreStreamBound(normalizeTimeoutMs(config.streamStartTimeoutMs),normalizeTimeoutMs(streamIdleTimeoutMs),requestAbortController),llmContext=await preStream.run(buildProviderContext(context,config,requestAbortController.signal)),resolvedApiKey=(config.getApiKey?await preStream.run(config.getApiKey(config.model.provider)):void 0)||config.apiKey;responseTiming.requested();let response=await preStream.run(streamFunction(config.model,llmContext,{...config,streamKind:"main",apiKey:resolvedApiKey,signal:requestAbortController.signal,onTransportActivity:()=>{liveness.noteActivity(),config.onTransportActivity?.()},...config.cursorExecHandlers?{execHandlers:typeof config.cursorExecHandlers=="function"?config.cursorExecHandlers(signal??requestAbortController.signal):config.cursorExecHandlers,onToolResult:result2=>{providerToolResults.push(result2)}}:{}}),late=>{typeof late?.[Symbol.asyncIterator]=="function"&&closeAssistantIterator(late[Symbol.asyncIterator]())}),result=async()=>Object.assign(await response.result(),{thinkingLevel:config.reasoning??"off"}),sink=config[internalProgressSink],iterator=(sink?assistantRecords(response):response)[Symbol.asyncIterator](),eventReader=createAssistantEventReader(iterator,streamIdleTimeoutMs,requestAbortController.signal,error=>requestAbortController.abort(error),preStream.remainingStartMs(),response,normalizeTimeoutMs(config.streamStartTimeoutMs),liveness);try{for(;;){let next=await eventReader.next();if(next.done)break;let event=next.value;if(isAssistantProgress(event)){await sink?.(event);continue}switch(event.type){case"start":responseTiming.started(),partialMessage=event.partial,context.messages.push(partialMessage),addedPartial=!0,await emit(carryAssistantCapture(event,{type:"message_start",message:{...partialMessage},streaming:!0}));break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":case"toolcall_end":if(partialMessage){partialMessage=event.partial,responseTiming.observe(event);let timingProgress;if(event.type==="thinking_start"||event.type==="thinking_delta"||event.type==="thinking_end"){let timing=thinkingTiming.get(event.contentIndex);event.type==="thinking_start"&&timing===void 0&&(timing={startedAt:Date.now()},thinkingTiming.set(event.contentIndex,timing)),event.type==="thinking_end"&&timing!==void 0&&(timing.endedAt=Date.now());let block=partialMessage.content[event.contentIndex];block?.type==="thinking"&&timing!==void 0&&(block.startedAt=timing.startedAt,timing.endedAt!==void 0&&(block.endedAt=timing.endedAt),getAssistantCapture(event)&&event.type!=="thinking_delta"&&(timingProgress=Object.freeze({type:"message_block_metadata",contentIndex:event.contentIndex,...timing})))}context.messages[context.messages.length-1]=partialMessage,await emit(carryAssistantCapture(event,{type:"message_update",assistantMessageEvent:event,message:{...partialMessage}})),timingProgress&&await sink?.(timingProgress)}break;case"done":case"error":{let finalMessage2=settleStopReason(normalizeTerminalAssistantMessage(await result(),event));return stampTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:context.messages.push(finalMessage2),addedPartial||await emit(carryAssistantCapture(event,{type:"message_start",message:{...finalMessage2}},finalMessage2)),await emit(carryAssistantCapture(event,{type:"message_end",message:finalMessage2},finalMessage2)),{message:finalMessage2,providerToolResults}}}}}finally{eventReader.dispose()}let finalMessage=settleStopReason(await result());return stampTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}catch(error){if(isStreamIdleTimeoutError(error)&&shouldFinalizeIdleAsStop(partialMessage,providerToolResults)){let finalMessage2=settleStopReason({role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??config.model.api,provider:partialMessage?.provider??config.model.provider,model:partialMessage?.model??config.model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.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:partialMessage?.timestamp??Date.now()});return stampTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:(context.messages.push(finalMessage2),await emit({type:"message_start",message:{...finalMessage2}})),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}let callerAbortedPastBound=signal?.aborted===!0&&(error instanceof StreamStartTimeoutError||error instanceof StreamKeepAliveTimeoutError||isStreamIdleTimeoutError(error)||error===signal.reason),finalMessage=createTerminalFailureAssistantMessage(config.model,signal?.aborted?"aborted":"error",callerAbortedPastBound?abortError(signal.reason):error,partialMessage);return stampTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}finally{requestAbortController.abort(),detachCallerAbort?.()}}var ABORTED2=Symbol("aborted"),MAX_ABORT_REASON_CHARS=500;function abortError(reason){if(reason instanceof Error)return reason;let text=abortReasonText(reason);if(text===void 0)return new Error("Request was aborted");let characters=Array.from(text);return new Error(characters.length>MAX_ABORT_REASON_CHARS?`${characters.slice(0,MAX_ABORT_REASON_CHARS).join("")}\u2026`:text)}function abortReasonText(reason){let text=typeof reason=="string"?reason:typeof reason=="object"&&reason!==null&&"message"in reason&&typeof reason.message=="string"?reason.message:void 0;return text!==void 0&&text.trim()!==""?text:void 0}function closeAssistantIterator(iterator){Promise.resolve(iterator.return?.()).catch(()=>{})}function createPreStreamBound(startTimeoutMs,idleTimeoutMs,request){let startedAt=Date.now(),remaining=()=>startTimeoutMs===void 0?idleTimeoutMs:Math.max(0,startTimeoutMs-(Date.now()-startedAt)),timeoutError=()=>startTimeoutMs===void 0?new StreamIdleTimeoutError(idleTimeoutMs??0):new StreamStartTimeoutError(startTimeoutMs);return{run(work,discardLate){let budget=remaining();return budget===void 0?Promise.resolve(work):new Promise((resolve,reject)=>{let timer,settled=!1,finish=complete=>{settled||(settled=!0,timer!==void 0&&clearTimeout(timer),complete())};Promise.resolve(work).then(value2=>{if(settled){try{discardLate?.(value2)}catch{}return}finish(()=>resolve(value2))},error=>finish(()=>reject(error))),timer=setTimeout(()=>{let error=timeoutError();finish(()=>reject(error)),request.abort(error)},budget)})},remainingStartMs:()=>startTimeoutMs===void 0?void 0:Math.max(1,remaining()??1)}}function normalizeTimeoutMs(timeoutMs){return typeof timeoutMs=="number"&&Number.isFinite(timeoutMs)&&timeoutMs>0?timeoutMs:void 0}function createAssistantEventReader(iterator,timeoutMs,signal,onIdleTimeout,streamStartTimeoutMs,stream,configuredStartTimeoutMs,liveness){let idleTimeoutMs=normalizeTimeoutMs(timeoutMs),startTimeoutMs=normalizeTimeoutMs(streamStartTimeoutMs),reportedStartTimeoutMs=configuredStartTimeoutMs??startTimeoutMs,sawFirstEvent=!1,silentMs=0,removeAbortListener,abortPromise;return signal!==void 0&&(signal.aborted?abortPromise=Promise.resolve(ABORTED2):abortPromise=new Promise(resolve=>{let abortHandler=()=>resolve(ABORTED2);signal.addEventListener("abort",abortHandler,{once:!0}),removeAbortListener=()=>signal.removeEventListener("abort",abortHandler)})),{next:async()=>{if(signal?.aborted)return closeAssistantIterator(iterator),Promise.reject(abortError(signal.reason));let useStartBound=!sawFirstEvent&&startTimeoutMs!==void 0,readTimeoutMs=useStartBound?startTimeoutMs:idleTimeoutMs,makeTimeoutError=useStartBound?ms=>new StreamStartTimeoutError(reportedStartTimeoutMs??ms):ms=>new StreamIdleTimeoutError(idleTimeoutMs??ms),readStartedAt=Date.now(),windowMs=useStartBound?reportedStartTimeoutMs??startTimeoutMs:idleTimeoutMs,result=await readNextAssistantEvent(iterator,readTimeoutMs===void 0?void 0:Math.max(1,readTimeoutMs-silentMs),makeTimeoutError,abortPromise,onIdleTimeout,stream,signal,liveness&&windowMs!==void 0?{liveness,windowMs}:void 0);return!result.done&&isAssistantProgress(result.value)?silentMs+=Date.now()-readStartedAt:(silentMs=0,result.done||(sawFirstEvent=!0,liveness?.contentArrived())),result},dispose:()=>removeAbortListener?.()}}async function readNextAssistantEvent(iterator,idleTimeoutMs,makeTimeoutError,abortPromise,onIdleTimeout,stream,signal,keepAlive){if(idleTimeoutMs===void 0&&abortPromise===void 0)return iterator.next();let timeout,settled=!1;return new Promise((resolve,reject)=>{let settle2=complete=>{settled||(settled=!0,timeout!==void 0&&clearTimeout(timeout),complete())};if(idleTimeoutMs!==void 0){let onIdleDeadline=()=>{if(stream?.hasPendingLocalWork?.()){timeout=setTimeout(onIdleDeadline,idleTimeoutMs);return}let verdict=keepAlive?.liveness.onSilenceDeadline(keepAlive.windowMs);if(verdict?.kind==="extend"){timeout=setTimeout(onIdleDeadline,verdict.delayMs);return}let error=verdict?.kind==="keep-alive-exhausted"?verdict.error:makeTimeoutError(idleTimeoutMs);closeAssistantIterator(iterator),settle2(()=>reject(error)),onIdleTimeout?.(error)};timeout=setTimeout(onIdleDeadline,idleTimeoutMs)}(abortPromise?Promise.race([iterator.next(),abortPromise]):iterator.next()).then(result=>{if(result===ABORTED2){closeAssistantIterator(iterator),settle2(()=>reject(abortError(signal?.reason)));return}settle2(()=>resolve(result))},error=>settle2(()=>reject(error)))})}function createIncompleteToolCallErrorMessage(toolName,errorMessage2){return errorMessage2!==void 0?`${errorMessage2}${errorMessage2.endsWith(".")?"":"."} Re-issue the tool call with complete arguments.`:`Tool call "${toolName}" was not executed: the response ended before the tool call was complete because it hit the output token limit. Re-issue the tool call with complete arguments.`}async function failToolCallsFromTruncatedMessage(toolCalls,emit){let messages=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let finalized={toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name)),isError:!0};await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:!1}}async function executeToolCalls(currentContext,assistantMessage,config,signal,emit){let toolCalls=assistantMessage.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));return(config.toolHost??defaultToolHost()).execute({scope:config.executionScope??{id:crypto.randomUUID(),root:""},calls:toolCalls,mode:config.toolExecution??"parallel"},{signal,emit,recordWitness:config.onExecutionPipeline,local:{context:currentContext,assistantMessage}});function defaultToolHost(){if(config.batchStoreFactory===void 0)throw new BatchStoreMissingError;let afterToolFreeze=config.afterToolFreeze;if(afterToolFreeze===void 0)throw new PreflightCarryMissingError;return createPreparedToolHost({...config,afterToolFreeze},config.batchStoreFactory)}}function prepareAgentToolCall(tool,toolCall){let preparedToolCall=prepareAgentToolCallArguments(tool,toolCall);return{toolCall:preparedToolCall,tool,args:validateToolArguments(tool,preparedToolCall)}}async function prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){if(toolCall.incomplete===!0)return{kind:"immediate",toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name,toolCall.errorMessage)),isError:!0};if(!tool){let hint=config.removedToolHints?.[toolCall.name];return{kind:"immediate",toolCall,result:createErrorToolResult(hint===void 0?`Tool ${toolCall.name} not found`:`Tool ${toolCall.name} not found. ${hint}`),isError:!0}}if(tool.name!==toolCall.name){let requestedName=toolCall.name,outcome2=await prepareResolvedToolCall(currentContext,assistantMessage,{...toolCall,name:tool.name},tool,config,signal);return outcome2.kind==="prepared"?{...outcome2,requestedName}:{...outcome2,result:withToolNameCorrection(outcome2.result,requestedName,tool.name)}}return prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal)}async function prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){try{let preparedToolCall=prepareAgentToolCall(tool,toolCall),validatedArgs=preparedToolCall.args;if(config.beforeToolCall){let beforeResult=await config.beforeToolCall({assistantMessage,toolCall:preparedToolCall.toolCall,args:validatedArgs,context:currentContext},signal);if(signal?.aborted)return{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0};if(beforeResult?.block){let result=createErrorToolResult(beforeResult.reason||"Tool execution was blocked");return beforeResult.terminate===!0&&(result.terminate=!0),{kind:"immediate",toolCall,result,isError:!0}}}return signal?.aborted?{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:{kind:"prepared",toolCall:preparedToolCall.toolCall,tool,args:validatedArgs}}catch(error){return{kind:"immediate",toolCall,result:createErrorToolResult(error instanceof Error?error.message:String(error)),isError:!0}}}function abortReleasePromise(signal){if(signal!==void 0)return signal.aborted?Promise.resolve(ABORTED2):new Promise(resolve=>{signal.addEventListener("abort",()=>resolve(ABORTED2),{once:!0})})}async function runToolCall(toolCall,options){let{assistantMessage,context,signal}=options,tool=options.tools.find(candidate=>candidate.name===toolCall.name),preparation=await prepareToolCall(context,assistantMessage,toolCall,tool,options,signal);if(preparation.kind==="immediate")return{toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,options.onUpdate??(()=>{}));return finalizeExecutedToolCall(context,assistantMessage,preparation,executed,options,signal)}async function executePreparedToolCall(prepared,signal,onUpdate){let updateEvents=[],acceptingUpdates=!0;try{let execution=prepared.tool.execute(prepared.toolCall.id,prepared.args,signal,partialResult=>{acceptingUpdates&&updateEvents.push(Promise.resolve(onUpdate(partialResult)))}),abortRelease=abortReleasePromise(signal),settled=abortRelease?await Promise.race([execution,abortRelease]):await execution;return settled===ABORTED2?(Promise.resolve(execution).catch(()=>{}),acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult("Tool execution aborted"),isError:!0}):(acceptingUpdates=!1,await Promise.all(updateEvents),{result:settled,isError:settled.isError===!0})}catch(error){return acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult(error instanceof Error?error.message:String(error)),isError:!0}}finally{acceptingUpdates=!1}}async function finalizeExecutedToolCall(currentContext,assistantMessage,prepared,executed,config,signal){let result=executed.result,isError=executed.isError;if(config.afterToolCall)try{let afterResult=await config.afterToolCall({assistantMessage,toolCall:prepared.toolCall,args:prepared.args,result,isError,context:currentContext},signal);if(afterResult){let structuredContent=afterResult.structuredContent??(afterResult.content?void 0:result.structuredContent);result={...result,content:afterResult.content??result.content,details:afterResult.details??result.details,usage:afterResult.usage??result.usage,terminate:afterResult.terminate??result.terminate},structuredContent===void 0?delete result.structuredContent:result.structuredContent=structuredContent,isError=afterResult.isError??isError}}catch(error){result=createErrorToolResult(error instanceof Error?error.message:String(error)),isError=!0}return prepared.requestedName!==void 0&&(result=withToolNameCorrection(result,prepared.requestedName,prepared.toolCall.name)),{toolCall:prepared.toolCall,result,isError}}var localFailures=new WeakSet;function isLocalFailure(error){return typeof error=="object"&&error!==null&&localFailures.has(error)}async function local(work){try{return await work()}catch(error){throw typeof error=="object"&&error!==null&&localFailures.add(error),error}}function localFailurePort(port){return{claim:(queue,drain)=>local(()=>port.claim(queue,drain)),release:(queue,messages,giveBack)=>local(()=>port.release(queue,messages,giveBack)),commitConsumption:(queue,messages)=>local(()=>port.commitConsumption(queue,messages))}}function defaultConvertToLlm(messages){return messages.filter(message=>message.role==="system"||message.role==="user"||message.role==="assistant"||message.role==="toolResult")}var EMPTY_USAGE2={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},DEFAULT_MODEL={id:"unknown",name:"unknown",api:"unknown",provider:"unknown",baseUrl:"",reasoning:!1,input:[],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:0,maxTokens:0};function createMutableAgentState(initialState){let tools=initialState?.tools?.slice()??[],messages=initialState?.messages?.slice()??[];return{systemPrompt:initialState?.systemPrompt??"",systemPromptStablePrefix:initialState?.systemPromptStablePrefix,model:initialState?.model??DEFAULT_MODEL,thinkingLevel:initialState?.thinkingLevel??"off",reasoningBaseline:initialState?.reasoningBaseline,get tools(){return tools},set tools(nextTools){tools=nextTools.slice()},get messages(){return messages},set messages(nextMessages){messages=nextMessages.slice()},declaredTools:initialState?.declaredTools?.slice(),isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0,providerDiagnostic:void 0}}var LLM_ROLES=new Set(["user","assistant","toolResult","system"]);function isBackgroundNotice(message){return!LLM_ROLES.has(message.role)}var PendingMessageQueue=class{constructor(mode){this.messages=[],this.clearGeneration=0,this.mode=mode}enqueue(message){this.messages.push(message)}hasItems(){return this.messages.length>0}getClearGeneration(){return this.clearGeneration}peek(){if(this.mode==="all")return this.messages.slice();let first=this.messages[0];if(!first)return[];if(!isBackgroundNotice(first))return[first];let end=1;for(;end<this.messages.length&&isBackgroundNotice(this.messages[end]);)end++;return this.messages.slice(0,end)}drain(){let drained=this.peek();return this.messages=this.messages.slice(drained.length),drained}prepend(messages){this.messages=[...messages,...this.messages]}remove(message){let index=this.messages.indexOf(message);return index===-1?!1:(this.messages.splice(index,1),!0)}replace(message,next){let index=this.messages.indexOf(message);return index===-1?!1:(this.messages[index]=next,!0)}clear(){this.messages=[],this.clearGeneration++}},Agent=class{#internalChannel;async buildProviderContext(context,signal){return buildProviderContext(context,{convertToLlm:this.convertToLlm,transformContext:this.transformContext,model:this._state.model},signal)}constructor(options){this.listeners=new Set;let runtimeOptions=options??{};this.#internalChannel=runtimeOptions.internalChannel,this._state=createMutableAgentState(runtimeOptions.initialState),this.convertToLlm=runtimeOptions.convertToLlm??defaultConvertToLlm,this.transformContext=runtimeOptions.transformContext,this.streamFunction=runtimeOptions.streamFn??getDefaultStreamFn(),this.getApiKey=runtimeOptions.getApiKey,this.onPayload=runtimeOptions.onPayload,this.onResponse=runtimeOptions.onResponse,this.onProviderStreamEvent=runtimeOptions.onProviderStreamEvent,this.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.finishTurn=runtimeOptions.finishTurn,this.queuedInputPort=runtimeOptions.queuedInputPort,this.prepareRequest=runtimeOptions.prepareRequest,this.prepareNextTurn=runtimeOptions.prepareNextTurn,this.prepareNextTurnWithContext=runtimeOptions.prepareNextTurnWithContext,this.steeringQueue=new PendingMessageQueue(runtimeOptions.steeringMode??"one-at-a-time"),this.followUpQueue=new PendingMessageQueue(runtimeOptions.followUpMode??"one-at-a-time"),this.sessionId=runtimeOptions.sessionId,this.thinkingBudgets=runtimeOptions.thinkingBudgets,this.transport=runtimeOptions.transport??"auto",this.timeoutMs=runtimeOptions.timeoutMs,this.streamStartTimeoutMs=runtimeOptions.streamStartTimeoutMs,this.streamKeepAliveTimeoutMs=runtimeOptions.streamKeepAliveTimeoutMs,this.maxRetryDelayMs=runtimeOptions.maxRetryDelayMs,this.toolExecution=runtimeOptions.toolExecution??"parallel",this.toolHost=runtimeOptions.toolHost,this.batchStoreFactory=runtimeOptions.batchStoreFactory,this.afterToolFreeze=runtimeOptions.afterToolFreeze,this.executionScope=runtimeOptions.executionScope??{id:crypto.randomUUID(),root:""},this.commitStep=runtimeOptions.commitStep,this.onExecutionPipeline=runtimeOptions.onExecutionPipeline,this.removedToolHints=runtimeOptions.removedToolHints??{},this.resolveUnknownToolCall=runtimeOptions.resolveUnknownToolCall,this.abortServerSideFallback=runtimeOptions.abortServerSideFallback,this.cursorExecHandlers=runtimeOptions.cursorExecHandlers}subscribe(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}get state(){return this._state}set steeringMode(mode){this.steeringQueue.mode=mode}get steeringMode(){return this.steeringQueue.mode}set followUpMode(mode){this.followUpQueue.mode=mode}get followUpMode(){return this.followUpQueue.mode}steer(message){this.steeringQueue.enqueue(message)}followUp(message){this.followUpQueue.enqueue(message)}removeQueuedMessage(message){return this.steeringQueue.remove(message)||this.followUpQueue.remove(message)}replaceQueuedMessage(message,next){return this.steeringQueue.replace(message,next)||this.followUpQueue.replace(message,next)}clearSteeringQueue(){this.steeringQueue.clear()}clearFollowUpQueue(){this.followUpQueue.clear()}clearAllQueues(){this.clearSteeringQueue(),this.clearFollowUpQueue()}hasQueuedMessages(){return this.steeringQueue.hasItems()||this.followUpQueue.hasItems()}peekQueuedMessages(options){let steering=this.steeringQueue.peek();return options?.all?[...steering,...this.followUpQueue.peek()]:steering.length>0?steering:this.followUpQueue.peek()}get signal(){return this.activeRun?.abortController.signal}abort(reason){this.activeRun?.abortController.abort(reason)}suppressQueuedMessageDrain(){this.activeRun&&(this.activeRun.suppressQueuedMessageDrain=!0)}waitForIdle(){return this.activeRun?.promise??Promise.resolve()}reset(){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before resetting.");this._state.messages=[],this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(input,images){if(this.activeRun)throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");let messages=this.normalizePromptInput(input,images);await this.runPromptMessages(messages)}async continueWithQueuedMessages(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");if(this._state.messages[this._state.messages.length-1]?.role==="assistant"){await this.continue(options);return}if(this.steeringQueue.hasItems()){await this.runQueuedMessages("steering",{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}if(this.followUpQueue.hasItems()){await this.runQueuedMessages("followUp",{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}await this.continue(options)}async continue(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");let lastMessage=this._state.messages[this._state.messages.length-1];if(!lastMessage||this._state.messages.every(message=>message.role==="system"))throw new Error("No messages to continue from");if(lastMessage.role==="assistant"){if(this.steeringQueue.hasItems()){await this.runQueuedMessages("steering",{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}if(this.followUpQueue.hasItems()){await this.runQueuedMessages("followUp",{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}throw new Error("Cannot continue from message role: assistant")}await this.runContinuation(options)}normalizePromptInput(input,images){if(Array.isArray(input))return input;if(typeof input!="string")return[input];let content=[{type:"text",text:input}];return images&&images.length>0&&content.push(...images),[{role:"user",content,timestamp:Date.now()}]}async runPromptMessages(messages,options={}){await this.runWithLifecycle(async signal=>{await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async runQueuedMessages(queue,options){let pendingQueue=queue==="steering"?this.steeringQueue:this.followUpQueue;if(!this.queuedInputPort){await this.runPromptMessages(pendingQueue.drain(),options);return}await this.runWithLifecycle(async signal=>{let messages=await this.takeQueuedMessages(queue);messages.length!==0&&await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async takeQueuedMessages(queue){let pendingQueue=queue==="steering"?this.steeringQueue:this.followUpQueue,port=this.queuedInputPort&&localFailurePort(this.queuedInputPort);if(!port)return pendingQueue.drain();let generation=pendingQueue.getClearGeneration(),messages=await port.claim(queue,()=>(generation=pendingQueue.getClearGeneration(),pendingQueue.drain()));if(messages.length===0)return messages;try{await port.commitConsumption(queue,messages)}catch(error){throw await port.release(queue,messages,this.giveBack(queue,messages,generation)),error}return messages}giveBack(queue,messages,generation){let pendingQueue=queue==="steering"?this.steeringQueue:this.followUpQueue,restorable=()=>pendingQueue.getClearGeneration()===generation;return{restorable,restore:()=>restorable()?(pendingQueue.prepend(messages),!0):!1}}async runContinuation(options={}){await this.runWithLifecycle(async signal=>{await runAgentLoopContinue(this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:options.deferQueuedMessages,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs}),event=>this.processEvents(event),signal,this.streamFunction)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,...this._state.systemPromptStablePrefix===void 0?{}:{systemPromptStablePrefix:this._state.systemPromptStablePrefix},messages:this._state.messages.slice(),tools:this._state.tools.slice(),...this._state.declaredTools?{declaredTools:this._state.declaredTools.slice()}:{}}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),finishTurn=this.finishTurn,queuedInputPort=this.queuedInputPort&&localFailurePort(this.queuedInputPort),giveBack=(queue,messages)=>this.giveBack(queue,messages,queue==="steering"?steeringQueueGeneration:followUpQueueGeneration),reasoning=this._state.reasoningBaseline??this._state.thinkingLevel;return{...internalLoopSink(this.#internalChannel),model:this._state.model,reasoning:reasoning==="off"?void 0:reasoning,thinkingSelection:this._state.thinkingSelection,sessionId:this.sessionId,onPayload:this.onPayload,onResponse:this.onResponse,onProviderStreamEvent:this.onProviderStreamEvent,transport:this.transport,thinkingBudgets:this.thinkingBudgets,timeoutMs:this.timeoutMs,streamStartTimeoutMs:this.streamStartTimeoutMs,streamKeepAliveTimeoutMs:this.streamKeepAliveTimeoutMs,initialRequestTimeoutMs:options.initialRequestTimeoutMs,initialRequestStreamStartTimeoutMs:options.initialRequestStreamStartTimeoutMs,maxRetryDelayMs:this.maxRetryDelayMs,abortServerSideFallback:this.abortServerSideFallback,cursorExecHandlers:this.cursorExecHandlers,toolExecution:this.toolExecution,toolHost:this.toolHost,batchStoreFactory:this.batchStoreFactory,afterToolFreeze:this.afterToolFreeze,executionScope:this.getExecutionScope?.()??this.executionScope,...this.commitStep?{commitStep:this.commitStep}:{},onExecutionPipeline:this.onExecutionPipeline,removedToolHints:this.removedToolHints,resolveUnknownToolCall:this.resolveUnknownToolCall,beforeToolCall:this.beforeToolCall,afterToolCall:this.afterToolCall,finishTurn:finishTurn?async(turn,signal)=>{let decision=await finishTurn(turn,signal)??void 0;return decision?.action==="end"&&this.suppressQueuedMessageDrain(),decision}:void 0,prepareRequest:this.prepareRequest,prepareNextTurn:this.prepareNextTurnWithContext||this.prepareNextTurn?async context=>this.prepareNextTurnWithContext?await this.prepareNextTurnWithContext(context,this.signal):await this.prepareNextTurn?.(this.signal):void 0,convertToLlm:this.convertToLlm,transformContext:this.transformContext,getApiKey:this.getApiKey,getSteeringMessages:async()=>{if(skipInitialSteeringPoll)return skipInitialSteeringPoll=!1,[];let drain=()=>(steeringQueueGeneration=this.steeringQueue.getClearGeneration(),this.steeringQueue.drain());return queuedInputPort?queuedInputPort.claim("steering",drain):drain()},getFollowUpMessages:async()=>{let drain=()=>(followUpQueueGeneration=this.followUpQueue.getClearGeneration(),this.followUpQueue.drain());return queuedInputPort?queuedInputPort.claim("followUp",drain):drain()},commitQueuedConsumption:queuedInputPort?(queue,messages)=>queuedInputPort.commitConsumption(queue,messages):void 0,restorePendingMessages:async(queue,messages)=>{queuedInputPort?await queuedInputPort.release(queue,messages,giveBack(queue,messages)):giveBack(queue,messages).restore()}}}async runWithLifecycle(executor){if(this.activeRun)throw new Error("Agent is already processing.");let abortController=new AbortController,resolvePromise=()=>{},promise=new Promise(resolve=>{resolvePromise=resolve});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0;try{for(await executor(abortController.signal);!abortController.signal.aborted&&!this.activeRun?.suppressQueuedMessageDrain&&this.canDrainQueuedMessagesAfterRun()&&this.hasQueuedMessages();)await this.runQueuedMessagesAfterAgentEnd(abortController.signal)}catch(error){await this.handleRunFailure(error,abortController.signal.aborted)}finally{this.finishRun()}}canDrainQueuedMessagesAfterRun(){let lastMessage=this._state.messages[this._state.messages.length-1];return lastMessage?.role!=="assistant"||lastMessage.stopReason!=="error"&&lastMessage.stopReason!=="aborted"}async runQueuedMessagesAfterAgentEnd(signal){let queuedSteering=this.steeringQueue.hasItems()?await this.takeQueuedMessages("steering"):[];if(queuedSteering.length>0){await runAgentLoop(queuedSteering,this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:!0}),event=>this.processEvents(event),signal,this.streamFunction);return}let queuedFollowUps=this.followUpQueue.hasItems()?await this.takeQueuedMessages("followUp"):[];queuedFollowUps.length!==0&&await runAgentLoop(queuedFollowUps,this.createContextSnapshot(),this.createLoopConfig(),event=>this.processEvents(event),signal,this.streamFunction)}async handleRunFailure(error,aborted){let providerDiagnostic=aborted?void 0:readProviderDiagnostic(error),failureMessage={role:"assistant",content:[{type:"text",text:""}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:EMPTY_USAGE2,stopReason:aborted?"aborted":"error",errorMessage:error instanceof Error?error.message:String(error),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},...!aborted&&isLocalFailure(error)?{failureSource:"local"}:{},timestamp:Date.now()};sanitizeProviderErrorMessage(failureMessage),await this.processEvents({type:"message_start",message:failureMessage}),await this.processEvents({type:"message_end",message:failureMessage}),await this.processEvents({type:"turn_end",message:failureMessage,toolResults:[]}),await this.processEvents({type:"agent_end",messages:[failureMessage]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(event){switch(event.type){case"message_start":this._state.streamingMessage=event.message;break;case"message_update":this._state.streamingMessage=event.message;break;case"message_end":this._state.streamingMessage=void 0,this._state.messages.push(event.message);break;case"tool_execution_start":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.add(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"tool_execution_end":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.delete(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"turn_end":event.message.role==="assistant"&&event.message.errorMessage&&(this._state.errorMessage=event.message.errorMessage,this._state.providerDiagnostic=sanitizeProviderDiagnostic(event.message.providerDiagnostic));break;case"agent_end":this._state.streamingMessage=void 0;break}let signal=this.activeRun?.abortController.signal;if(!signal)throw new Error("Agent listener invoked outside active run");let internal=dispatchInternalAgent(this.#internalChannel,{event});internal&&await internal;for(let listener of this.listeners)await listener(event,signal)}async emitExternalEvent(event,runSignal){let activeSignal=this.activeRun?.abortController.signal;!activeSignal||runSignal&&runSignal!==activeSignal||await this.processEvents(event)}};var HOSTED_REBUILD_DEADLINE_MS=5e3,EPOCH_FRESHNESS_MS=5e3,MOVE_SKEW_MS=2e3;var STEP_COMMIT_BRAND=Symbol.for("senpi.StepCommitError"),StepCommitError=class extends Error{constructor(stepId,code,options){super(`step commit failed: ${code}`,options),this.name="StepCommitError",this.stepId=stepId,this.code=code,Object.defineProperty(this,STEP_COMMIT_BRAND,{value:!0,enumerable:!1,writable:!1})}};function isStepCommitError(value2){return typeof value2=="object"&&value2!==null&&Reflect.get(value2,STEP_COMMIT_BRAND)===!0}var DurableStoreError=class extends Error{constructor(code,message){super(message),this.name="DurableStoreError",this.code=code}};function createMemoryStoreMedium(){return{current:{epoch:0,records:[],documents:new Map}}}var copy=value2=>structuredClone(value2),copyRecord=record2=>({...record2,data:copy(record2.data)}),isList=value2=>Array.isArray(value2);function sameValue(a,b){if(a===void 0||b===void 0||a===null||b===null||typeof a!="object"||typeof b!="object")return a===b;if(isList(a)||isList(b))return isList(a)&&isList(b)&&a.length===b.length&&a.every((item,index)=>sameValue(item,b[index]));let keys=Object.keys(a);return keys.length===Object.keys(b).length&&keys.every(key=>Object.hasOwn(b,key)&&sameValue(a[key],b[key]))}var sameRecord=(a,b)=>b!==void 0&&a.seq===b.seq&&a.id===b.id&&a.kind===b.kind&&sameValue(a.data,b.data);function requireOwner(state,epoch){if(state.epoch===0)throw new DurableStoreError("unclaimed","the store has no owner; claim it first");if(epoch!==state.epoch)throw new DurableStoreError("stale-epoch",`epoch ${epoch} is not the owner epoch ${state.epoch}`)}function importedTail(state,snapshot){let ids=new Set,wellFormed=snapshot.head===snapshot.records.length&&snapshot.records.every((record2,index)=>record2.seq===index+1&&!ids.has(record2.id)&&ids.add(record2.id)),extendsLog=state.records.length<=snapshot.records.length&&state.records.every((record2,index)=>sameRecord(record2,snapshot.records[index]));if(!wellFormed||!extendsLog)throw new DurableStoreError("import-conflict","the snapshot's log does not extend this store's log");return snapshot.records.slice(state.records.length)}function scan(records,query){let matching=records.filter(record2=>(query.fromSeq===void 0||record2.seq>=query.fromSeq)&&(query.toSeq===void 0||record2.seq<=query.toSeq)&&(query.kind===void 0||record2.kind===query.kind)),ordered=query.order==="desc"?matching.reverse():matching;return(query.limit===void 0?ordered:ordered.slice(0,query.limit)).map(copyRecord)}var documentsOf=(state,prefix)=>[...state.documents].filter(([key])=>key.startsWith(prefix)).sort(([a],[b])=>a<b?-1:a>b?1:0).map(([key,data])=>({key,data:copy(data)}));function openMemoryStore(medium,options={}){let point=at=>options.onWritePoint?.(at),commitSync=(epoch,writes,adopt)=>{point({op:"commit",at:"before"});let state=medium.current;requireOwner(state,epoch);let records=[...state.records],ids=new Set(records.map(record2=>record2.id)),documents=new Map(state.documents),seqs=[];writes.forEach((write,index)=>{switch(point({op:"commit",at:"write",index}),write.op){case"append":{if(ids.has(write.id))throw new DurableStoreError("duplicate-record-id",`record ${write.id} exists`);ids.add(write.id);let seq=records.length+1;records.push({seq,id:write.id,kind:write.kind,data:copy(write.data)}),seqs.push(seq);break}case"put":documents.set(write.key,copy(write.data));break;case"delete":documents.delete(write.key);break}}),medium.current={epoch:state.epoch,records,documents},point({op:"commit",at:"durable"});let result={seqs,head:records.length};return adopt(result),result};return{readEpoch:async()=>medium.current.epoch,readHead:async()=>medium.current.records.length,async claim(expectedEpoch,nextEpoch){point({op:"claim",at:"before"});let state=medium.current;if(!Number.isSafeInteger(nextEpoch)||nextEpoch!==expectedEpoch+1)throw new DurableStoreError("invalid-claim",`a claim must raise the epoch to exactly ${expectedEpoch+1}`);if(state.epoch!==expectedEpoch)throw new DurableStoreError("stale-epoch",`expected epoch ${expectedEpoch}, the owner epoch is ${state.epoch}`);medium.current={...state,epoch:nextEpoch},point({op:"claim",at:"durable"})},commit:async(epoch,writes,adopt)=>commitSync(epoch,writes,adopt),commitSync,mintId:()=>crypto.randomUUID(),scanRecords:async(query={})=>scan(medium.current.records,query),getDocument:async key=>{let data=medium.current.documents.get(key);return data===void 0?void 0:copy(data)},scanDocuments:async prefix=>documentsOf(medium.current,prefix),exportSnapshot:async()=>{let state=medium.current;return{epoch:state.epoch,head:state.records.length,records:state.records.map(copyRecord),documents:documentsOf(state,"")}},async importSnapshot(epoch,snapshot){point({op:"import",at:"before"});let state=medium.current;if(requireOwner(state,epoch),epoch<=snapshot.epoch)throw new DurableStoreError("invalid-claim",`epoch ${epoch} is not above the source epoch ${snapshot.epoch}`);let records=[...state.records],documents=new Map,index=0;for(let record2 of importedTail(state,snapshot))point({op:"import",at:"write",index:index++}),records.push(copyRecord(record2));for(let document of snapshot.documents)point({op:"import",at:"write",index:index++}),documents.set(document.key,copy(document.data));medium.current={epoch:state.epoch,records,documents},point({op:"import",at:"durable"})}}}var openMemoryBatchStore=()=>openMemoryStore(createMemoryStoreMedium());function withBatchStore(config){return{...config,batchStoreFactory:config.batchStoreFactory??openMemoryBatchStore,afterToolFreeze:config.afterToolFreeze??noPreflightCarry}}var Agent2=class extends Agent{constructor(options){super(withBatchStore(options))}},agentLoop2=(prompts,context,config,signal,streamFn)=>agentLoop(prompts,context,withBatchStore(config),signal,streamFn),agentLoopContinue2=(context,config,signal,streamFn)=>agentLoopContinue(context,withBatchStore(config),signal,streamFn),runAgentLoop2=(prompts,context,config,emit,signal,streamFn)=>runAgentLoop(prompts,context,withBatchStore(config),emit,signal,streamFn),runAgentLoopContinue2=(context,config,emit,signal,streamFn)=>runAgentLoopContinue(context,withBatchStore(config),emit,signal,streamFn);function outcomeOf(entry2){let executionId=entry2.commandId;if(entry2.progress.state==="acked")return{kind:"refused",executionId,reason:"result_expired"};if(entry2.progress.state!=="settled")return;let{outcome:outcome2}=entry2.progress;if(outcome2.reason==="result"){let result=JSON.parse(String(outcome2.value));return{kind:"settled",executionId,result}}return outcome2.reason==="blocked"?{kind:"refused",executionId,reason:"foreign_outcome"}:{kind:"terminal",executionId,reason:outcome2.reason,uncertain:outcome2.uncertain,hooksRan:outcome2.hooksRan}}function asStoreValue(value2){return value2===void 0?null:JSON.parse(JSON.stringify(value2))}function createHandLedger(options){let{ledger,executor,issuer,workspace,now,leaseMs}=options,keyOf4=executionId=>({issuer,commandId:executionId}),apply=(executionId,event,actor,guard)=>ledger.apply({key:keyOf4(executionId),generation:1,actor:{id:actor},now:now(),event},guard),recovered,fencedBy=admits=>admits===void 0?void 0:()=>admits()?void 0:"epoch_fenced",owned=new Set,replyFrom=(reply,executionId)=>reply.status==="refused"?{kind:"refused",executionId,reason:reply.reason}:reply.status==="result_expired"?{kind:"refused",executionId,reason:"result_expired"}:outcomeOf(reply.entry)??{kind:"refused",executionId,reason:"not_settled"},admitNew=(invoke,digest,guard)=>{let admittedAt=now();return ledger.admit({issuer,commandId:invoke.executionId,executor,workspace,scope:invoke.scope.id,generation:1,requestDigest:digest,admittedAt,leaseUntil:admittedAt+leaseMs,reconcilable:!1},guard)},fenced=async executionId=>(await ledger.read(keyOf4(executionId))!==void 0&&await apply(executionId,{kind:"cancel"},issuer),{kind:"reply",message:{kind:"refused",executionId,reason:"epoch_fenced"}}),advance2=async(invoke,guard)=>{let{executionId}=invoke,isFenced=reply=>reply.status==="refused"&&reply.reason==="epoch_fenced",args=asStoreValue(invoke.arguments),frozen2={name:invoke.name,args,digest:JSON.stringify([invoke.name,args])},prior=await ledger.read(keyOf4(executionId));if(prior!==void 0&&(prior.requestDigest!==frozen2.digest||prior.scope!==invoke.scope.id))return{kind:"reply",message:{kind:"refused",executionId,reason:"identity_conflict"}};let settled=prior===void 0?void 0:outcomeOf(prior);if(settled!==void 0)return{kind:"reply",message:settled};let fromStart=[()=>admitNew(invoke,frozen2.digest,guard),()=>apply(executionId,{kind:"prepare"},executor,guard),()=>apply(executionId,{kind:"effect"},executor,guard),()=>apply(executionId,{kind:"freeze",call:frozen2,awaitingConsent:!1},executor,guard)],state=prior?.progress.state,steps=state===void 0?fromStart:state==="prepared"||state==="released"?[]:void 0;if(steps===void 0)return{kind:"in_flight"};for(let step of[...steps,()=>apply(executionId,{kind:"release"},issuer,guard)]){let reply=await step();if(isFenced(reply))return fenced(executionId);if(!(reply.status==="replayed"&&reply.entry.progress.state!=="settled")&&(reply.status!=="applied"||reply.entry.progress.state==="settled"))return{kind:"reply",message:replyFrom(reply,executionId)}}let dispatched=await apply(executionId,{kind:"dispatch"},executor,guard);return isFenced(dispatched)?fenced(executionId):dispatched.status==="applied"&&dispatched.entry.progress.state==="dispatched"?{kind:"run"}:dispatched.status==="replayed"&&dispatched.entry.progress.state!=="settled"?{kind:"in_flight"}:{kind:"reply",message:replyFrom(dispatched,executionId)}};return{async admit(invoke,admits){let{executionId}=invoke;if(owned.has(executionId))return{kind:"in_flight"};owned.add(executionId);let admission=await advance2(invoke,fencedBy(admits)).catch(error=>{throw owned.delete(executionId),error});return admission.kind!=="run"&&owned.delete(executionId),admission},async settle(invoke,result){try{let reply=await apply(invoke.executionId,{kind:"result",value:JSON.stringify(result)},executor);return replyFrom(reply,invoke.executionId)}finally{owned.delete(invoke.executionId)}},async ack(executionId,admits){await apply(executionId,{kind:"ack"},issuer,fencedBy(admits))},async recover(){return recovered!==void 0?recovered.then(()=>[]):(recovered=ledger.recover(now()),await recovered,(await ledger.scan()).flatMap(entry2=>{let message=entry2.progress.state==="settled"?outcomeOf(entry2):void 0;return message===void 0?[]:[{lane:entry2.scope,message}]}))}}}var SessionStoreError=class extends Error{constructor(code,message){super(message),this.name="SessionStoreError",this.code=code}},SESSION="session-import/session/",DIVERGENCE="session-import/divergence/",sessionManifestKey=id=>SESSION+encodeURIComponent(id),divergenceKey=id=>DIVERGENCE+encodeURIComponent(id),sessionRecordKind=id=>`session/${encodeURIComponent(id)}`,isRecord6=value2=>typeof value2=="object"&&value2!==null&&!Array.isArray(value2);function readEntry(id,value2){if(isRecord6(value2)&&typeof value2.key=="string"&&typeof value2.line=="string")return{key:value2.key,line:value2.line};throw new SessionStoreError("corrupt-session",`session ${id} holds an unreadable entry record`)}async function readSessionState(store,id){let manifest2=await store.getDocument(sessionManifestKey(id));if(manifest2===void 0)return;if(!isRecord6(manifest2)||!isRecord6(manifest2.header))throw new SessionStoreError("corrupt-session",`session ${id} has no readable manifest`);if("entryIds"in manifest2)throw new SessionStoreError("corrupt-session",`session ${id} is stored in the layout before the record log; re-import it from its JSONL file`);let header=manifest2.header,entries=[],held=new Set,rewrites=0;for(let record2 of await store.scanRecords({kind:sessionRecordKind(id),order:"asc"})){let data=record2.data;if(isRecord6(data)&&data.op==="rewrite"&&isRecord6(data.header)&&Array.isArray(data.entries))header=data.header,entries=data.entries.map(entry2=>readEntry(id,entry2)),held=new Set(entries.map(entry2=>entry2.key)),rewrites++;else if(isRecord6(data)&&data.op==="append"){let entry2=readEntry(id,data);if(held.has(entry2.key))continue;held.add(entry2.key),entries.push(entry2)}else throw new SessionStoreError("corrupt-session",`session ${id} holds an unreadable record ${record2.seq}`)}let divergence=await store.getDocument(divergenceKey(id))??null;return{id,header,entries,divergence,rewrites}}var manifestWrite=(id,header)=>({op:"put",key:sessionManifestKey(id),data:{id,header}}),divergenceWrite=(id,divergence)=>({op:"put",key:divergenceKey(id),data:divergence}),appendRecordWrites=(id,rewrites,added)=>added.map(entry2=>({op:"append",id:`${sessionRecordKind(id)}/${rewrites}/${encodeURIComponent(entry2.key)}`,kind:sessionRecordKind(id),data:{op:"append",key:entry2.key,line:entry2.line}})),rewriteRecordWrite=(store,id,header,entries)=>({op:"append",id:store.mintId(),kind:sessionRecordKind(id),data:{op:"rewrite",header,entries:entries.map(entry2=>({key:entry2.key,line:entry2.line}))}});function refuseRepeats(id,entries,held,what){let seen=new Set(held);for(let entry2 of entries){if(seen.has(entry2.key))throw new SessionStoreError("duplicate-entry",`${what} ${id} repeats ${entry2.key}`);seen.add(entry2.key)}}function planAppend(state,held,added){refuseRepeats(state.id,added,state.entries.map(entry2=>entry2.key),"session");let next={...state,entries:[...state.entries,...added]};return{writes:[...held?[]:[manifestWrite(state.id,state.header)],...appendRecordWrites(state.id,state.rewrites,added)],next}}function planRewrite(store,state,held,header,entries){refuseRepeats(state.id,entries,[],"rewrite of");let next={...state,header,entries:[...entries],rewrites:state.rewrites+1};return{writes:[...held?[]:[manifestWrite(state.id,header)],rewriteRecordWrite(store,state.id,header,entries)],next}}function asDuplicateEntry(id,error){return error instanceof DurableStoreError&&error.code==="duplicate-record-id"?new SessionStoreError("duplicate-entry",`session ${id} already holds an entry this write repeats`):error}var stored=({id,header,entries})=>({id,header,entries});async function openState(store,id,header){let read=await readSessionState(store,id);return read===void 0?{state:{id,header,entries:[],divergence:null,rewrites:0},held:!1}:{state:read,held:!0}}function openSessionStore(store,epoch){return{load:async id=>{let state=await readSessionState(store,id);return state===void 0?void 0:stored(state)},open:async(id,header)=>{let{state,held}=await openState(store,id,header),tail=Promise.resolve(),enqueue=plan=>{let run=tail.then(async()=>{let next=plan();await store.commit(epoch,next.writes,()=>{}).catch(error=>{throw asDuplicateEntry(id,error)}),state=next.next,held=!0});return tail=run.catch(()=>{}),run};return{header:()=>state.header,entries:()=>state.entries,append:entries=>enqueue(()=>planAppend(state,held,entries)),rewrite:(header2,entries)=>enqueue(()=>planRewrite(store,state,held,header2,entries))}}}}function openSyncSessionStore(store,epoch){return{load:openSessionStore(store,epoch).load,open:async(id,header)=>{let{state,held}=await openState(store,id,header),commit=plan=>{try{store.commitSync(epoch,plan.writes,()=>{})}catch(error){throw asDuplicateEntry(id,error)}state=plan.next,held=!0};return{header:()=>state.header,entries:()=>state.entries,appendSync:entries=>commit(planAppend(state,held,entries)),rewriteSync:(header2,entries)=>commit(planRewrite(store,state,held,header2,entries))}}}}var HELLO_WAIT_MS=5e3,GRANT_REFUSALS=new Set(["grant_missing","grant_expired","workspace_unknown","capability_missing"]);function refusalError(reason){return GRANT_REFUSALS.has(reason)?new DeviceFileError("refused_by_grant",reason):reason==="epoch_fenced"?new DeviceFileError("refused_by_policy",reason):reason==="hand_closed"||reason.startsWith("scope_unavailable")?new DeviceFileError("hand_unreachable",reason):new DeviceFileError("protocol",reason)}function valueOf(reply){switch(reply.kind){case"settled":{let outcome2=fileOutcomeOf(reply.result.details);if(outcome2===void 0)throw new DeviceFileError("protocol","the hand sent no file outcome");if(!outcome2.ok)throw new DeviceFileError(outcome2.code,outcome2.message);return outcome2.value}case"terminal":{let{reason,uncertain}=reply.terminal;throw new DeviceFileError("interrupted",`the operation ended without an outcome (${reason})`,{reason,uncertain})}case"refused":throw refusalError(reply.reason);case"aborted":throw new DeviceFileError("aborted","the operation was aborted");case"unreachable":throw new DeviceFileError("hand_unreachable",reply.reason);case"closed":throw new DeviceFileError("hand_unreachable","the hand link was closed");case"epoch_refused":throw new DeviceFileError("refused_by_policy",`epoch: ${reply.reason}`)}}function createRemoteDeviceFiles(link,scope,mintId){let call=async(op,args,signal,channel=FILE_CHANNEL)=>{let hello=await link.hello(HELLO_WAIT_MS,signal);if(signal?.aborted)throw new DeviceFileError("aborted","the operation was aborted");if(hello===void 0||!hello.ops.includes(channel))throw new DeviceFileError("unsupported",`the hand serves no ${channel} channel`);return valueOf(await link.dispatch({kind:"file",executionId:mintId(),scope,op,args},signal))};return{read:async(path,options)=>{let value2=await call("read",{path},options?.signal);if(typeof value2!="string")throw new DeviceFileError("protocol","malformed read outcome");return decodeBase64(value2)},write:async(path,data,options)=>{if(data.byteLength>FILE_CHANNEL_MAX_BYTES)throw new DeviceFileError("too_large",path);let exclusive=options?.exclusive===!0;await call("write",{path,data:encodeBase64(data),exclusive},options?.signal)},list:async(path,options)=>{let value2=await call("list",{path},options?.signal);if(!Array.isArray(value2)||!value2.every(entry2=>typeof entry2=="string"))throw new DeviceFileError("protocol","malformed list outcome");return value2},stat:async(path,options)=>await call("stat",{path},options?.signal),rename:async(from,to,options)=>{await call("rename",{path:from,to},options?.signal)},remove:async(path,options)=>{await call("remove",{path},options?.signal)},mkdir:async(path,options)=>{await call("mkdir",{path},options?.signal)},run:async(request,options)=>{if(request.stdin!==void 0&&request.stdin.byteLength>FILE_CHANNEL_MAX_BYTES)throw new DeviceFileError("too_large","stdin");let args={path:request.cwd,exe:request.exe,argv:[...request.argv],env:{...request.env},...request.stdin===void 0?{}:{stdin:encodeBase64(request.stdin)},...request.timeoutMs===void 0?{}:{timeoutMs:request.timeoutMs},activityLock:request.activityLock===!0},value2=await call("run",args,options?.signal,RUN_CHANNEL);if(typeof value2!="object"||value2===null||Array.isArray(value2))throw new DeviceFileError("protocol","malformed run outcome");let{code,signal,stdout,stderr}=value2;if(typeof stdout!="string"||typeof stderr!="string")throw new DeviceFileError("protocol","malformed run outcome");return{code:typeof code=="number"?code:null,signal:typeof signal=="string"?signal:null,stdout:decodeBase64(stdout),stderr}}}}var MODEL_PLANE="model",REASONING=["minimal","low","medium","high","xhigh","max"],isRecord7=value2=>typeof value2=="object"&&value2!==null;function refuse(detail){throw new PlaneRefusedError(`malformed_request: ${detail}`)}function decodeModel(value2){if(value2!==void 0)return(!isRecord7(value2)||typeof value2.provider!="string"||typeof value2.id!="string")&&refuse("model"),{provider:value2.provider,id:value2.id}}function decodeContext(value2){return(!isRecord7(value2)||!Array.isArray(value2.messages))&&refuse("context"),value2.systemPrompt!==void 0&&typeof value2.systemPrompt!="string"&&refuse("systemPrompt"),value2.tools!==void 0&&!Array.isArray(value2.tools)&&refuse("tools"),{...value2.systemPrompt===void 0?{}:{systemPrompt:value2.systemPrompt},messages:value2.messages,...value2.tools===void 0?{}:{tools:value2.tools}}}function decodeOptions(value2){if(value2===void 0)return;isRecord7(value2)||refuse("options");let{maxTokens,temperature,reasoning}=value2;return maxTokens!==void 0&&(typeof maxTokens!="number"||!Number.isSafeInteger(maxTokens)||maxTokens<=0)&&refuse("maxTokens"),temperature!==void 0&&(typeof temperature!="number"||!Number.isFinite(temperature))&&refuse("temperature"),reasoning!==void 0&&!REASONING.includes(reasoning)&&refuse("reasoning"),{...maxTokens===void 0?{}:{maxTokens},...temperature===void 0?{}:{temperature},...reasoning===void 0?{}:{reasoning}}}function decodeModelPlaneRequest(body){isRecord7(body)||refuse("body");let model=decodeModel(body.model),options=decodeOptions(body.options);return{...model===void 0?{}:{model},context:decodeContext(body.context),...options===void 0?{}:{options}}}function serveModelPlane(complete){return async(body,signal)=>{let message=await complete(decodeModelPlaneRequest(body),signal);return JSON.parse(JSON.stringify(message))}}function createModelPlaneClient(nested){return{async complete(request,signal){let reply=await nested(MODEL_PLANE,JSON.parse(JSON.stringify(request)),signal);if(!isRecord7(reply)||reply.role!=="assistant"||!Array.isArray(reply.content))throw new PlaneRefusedError("malformed_reply");return reply}}}var SESSION_PLANE="session",isRecord8=value2=>typeof value2=="object"&&value2!==null&&!Array.isArray(value2);function decodeSessionPlaneRequest(body){if(!isRecord8(body)||typeof body.tool!="string"||body.tool.length===0)throw new PlaneRefusedError("malformed_request: tool");if(!isRecord8(body.arguments))throw new PlaneRefusedError("malformed_request: arguments");return{tool:body.tool,arguments:body.arguments}}function loopSideToolNames(tools){let names=new Set;for(let tool of tools)tool.runs==="brain"&&names.add(tool.name);return names}function serveSessionPlane(options){return async(body,signal)=>{let request=decodeSessionPlaneRequest(body);if(!options.loopSide.has(request.tool))throw new Error(`not_loop_side: ${request.tool}`);let result=await options.run(request,signal);return JSON.parse(JSON.stringify(result))}}function createSessionPlaneClient(nested){return{async call(request,signal){let reply=await nested(SESSION_PLANE,JSON.parse(JSON.stringify(request)),signal);if(!isRecord8(reply)||!Array.isArray(reply.content))throw new PlaneRefusedError("malformed_reply");return reply}}}function createLoopToolHost(agent){return{execute(call,options){let{batchStoreFactory,afterToolFreeze}=agent;if(batchStoreFactory===void 0)throw new BatchStoreMissingError;if(afterToolFreeze===void 0)throw new PreflightCarryMissingError;return createPreparedToolHost({...pick(agent),afterToolFreeze},batchStoreFactory).execute(call,options)}}}function pick(agent){return{resolveUnknownToolCall:agent.resolveUnknownToolCall,beforeToolCall:agent.beforeToolCall,afterToolCall:agent.afterToolCall,removedToolHints:agent.removedToolHints}}function stagesOf(calls,sideOf,isSequential2,parallel){let stages=[],segments=[],owner=[],open=!1;for(let call of calls){let side=sideOf(call),barrier=parallel&&isSequential2(call),stage=stages.at(-1);open&&!barrier&&stage!==void 0&&(parallel||stage[0]?.side===side)||stages.push([]);let current=stages.at(-1)??[],segment=current.find(entry2=>entry2.side===side);segment===void 0&&(segment={side,calls:[]},current.push(segment),segments.push(segment)),segment.calls.push(call),owner.push(segments.indexOf(segment)),open=!barrier}return{stages,segments,owner}}function queueBy(items,idOf){let queues=new Map;for(let item of items){let queue=queues.get(idOf(item))??[];queue.push(item),queues.set(idOf(item),queue)}return queues}function holdingResults(emit,held){return event=>{if(event.type!=="message_start"&&event.type!=="message_end"||event.message.role!=="toolResult")return emit(event);let{toolCallId}=event.message,open=event.type==="message_end"?held.findLast(entry2=>entry2.toolCallId===toolCallId):void 0;open!==void 0&&open.events.at(-1)?.type==="message_start"?open.events.push(event):held.push({toolCallId,events:[event]})}}function createSplitToolHost(options){let sideOf=call=>options.loopSide(call.name)?"loop":"hand",isSequential2=call=>options.isSequential(call.name),hostOf=side=>side==="loop"?options.loop:options.hand;return{async execute(call,hostOptions){let parallel=call.mode==="parallel",{stages,segments,owner}=stagesOf(call.calls,sideOf,isSequential2,parallel),[only]=segments;if(segments.every(segment=>segment.side===only?.side))return hostOf(only?.side??"hand").execute(call,hostOptions);let held=segments.map(()=>[]),run=async segment=>{let index=segments.indexOf(segment);results[index]=await hostOf(segment.side).execute({...call,calls:segment.calls},parallel?{...hostOptions,emit:holdingResults(hostOptions.emit,held[index]??[])}:hostOptions)},results=segments.map(()=>{});for(let stage of stages)if(await Promise.all(stage.map(run)),hostOptions.signal?.aborted)break;let messages=results.map(result=>queueBy(result?.messages??[],message=>message.toolCallId)),events=held.map(entries=>queueBy(entries,entry2=>entry2.toolCallId)),ordered=[];for(let[index,raw]of call.calls.entries()){let segment=owner[index]??-1;for(let event of events[segment]?.get(raw.id)?.shift()?.events??[])await hostOptions.emit(event);let message=messages[segment]?.get(raw.id)?.shift();message!==void 0&&ordered.push(message)}let ran=results.filter(result=>(result?.messages.length??0)>0);return{messages:ordered,terminate:ran.length>0&&ran.every(result=>result.terminate)}}}}var CHAIN_COUNT_LIMIT="chain_count_limit",CHAIN_ORIGIN=0,ChainCountLimitError=class extends Error{constructor(count,limit){super(`This thread call would be hop ${count} of its chain; your thread chain count limit is ${limit}.`),this.reason=CHAIN_COUNT_LIMIT,this.name="ChainCountLimitError",this.count=count,this.limit=limit}},isCount=value2=>typeof value2=="number"&&Number.isSafeInteger(value2)&&value2>=0;function nextChainCount(sessionCount){if(!isCount(sessionCount))throw new TypeError(`not a chain count: ${String(sessionCount)}`);return sessionCount+1}function decodeChainCount(value2){if(value2===void 0)return nextChainCount(0);if(!isCount(value2)||value2===0)throw new TypeError(`malformed chain count: ${JSON.stringify(value2)}`);return value2}function admitChainCall(count,readLimit){let limit=readLimit();if(limit!==void 0&&count>limit)throw new ChainCountLimitError(count,limit);return count}var LoopHookFailedError=class extends Error{constructor(message){super(message),this.name="LoopHookFailedError"}},LoopHookRestartedError=class extends Error{constructor(event){super(`The user's machine restarted while it ran the ${event} hooks; they were not run again and may have run.`),this.uncertain=!0,this.name="LoopHookRestartedError"}};function createLoopHookHost(options){let{transport,lane}=options,mintId=options.mintId??(()=>crypto.randomUUID()),pending=new Map,closed=!1,send=call=>{transport.send(lane,encodeLoopHookMessage(call)).catch(error=>{let reason=error instanceof Error?error.message:String(error);settle2(call.callId,waiter=>waiter.reject(new Error(`The link to the user's machine closed: ${reason}`)))})},settle2=(callId,finish)=>{let waiter=pending.get(callId);waiter!==void 0&&(pending.delete(callId),finish(waiter))};return transport.onFrame(frame=>{let message=decodeLoopHookMessage(frame.payload);if(message!==void 0)switch(message.kind){case"hook.started":{let waiter=pending.get(message.callId);waiter!==void 0&&(waiter.startedBy=message.instance);return}case"hook.reply":return settle2(message.callId,waiter=>waiter.resolve(message.result));case"hook.failed":return settle2(message.callId,waiter=>waiter.reject(new LoopHookFailedError(message.error)));case"hook.hello":for(let waiter of[...pending.values()])waiter.startedBy===void 0?send(waiter.call):waiter.startedBy!==message.instance&&settle2(waiter.call.callId,stale=>stale.reject(new LoopHookRestartedError(stale.call.event)));return;case"hook.call":return}}),{run(event,payload,signal){if(closed)return Promise.reject(new Error("The loop-hook link is closed"));if(signal?.aborted)return Promise.reject(new Error("Operation aborted"));let call={kind:"hook.call",callId:mintId(),event,payload},result=new Promise((resolve,reject)=>{pending.set(call.callId,{call,resolve,reject})}),onAbort=()=>settle2(call.callId,waiter=>waiter.reject(new Error("Operation aborted")));return signal?.addEventListener("abort",onAbort,{once:!0}),result.then(()=>signal?.removeEventListener("abort",onAbort),()=>signal?.removeEventListener("abort",onAbort)),send(call),result},waiting:()=>[...pending.keys()],close(){closed=!0;for(let callId of[...pending.keys()])settle2(callId,waiter=>waiter.reject(new Error("The loop-hook link was closed before the hooks ran")));transport.close()}}}function createEpochGate(epoch,send){let lanes=new Map,decide=(state,refusal2)=>{state.verdict={refusal:refusal2},state.decided.resolve(refusal2)},ask=(lane,state)=>{state.verdict!==void 0&&(state.verdict=void 0,state.decided=Promise.withResolvers());let asked=state.decided;send(lane,{kind:"floor",epoch}).catch(error=>{let reason=error instanceof Error?error.message:String(error);state.decided===asked&&state.verdict===void 0&&decide(state,`hand_unreachable: ${reason}`)})};return{open(lane){let known=lanes.get(lane);if(known!==void 0)return known.verdict===void 0?known.decided.promise:Promise.resolve(known.verdict.refusal);let state={decided:Promise.withResolvers(),verdict:void 0};return lanes.set(lane,state),ask(lane,state),state.decided.promise},answer(lane,message){let state=lanes.get(lane);if(!(state===void 0||state.verdict!==void 0)){if(message.kind==="floor_refused")return decide(state,message.reason);if(message.floor===epoch)return decide(state,void 0);decide(state,message.floor>epoch?"epoch_superseded":"epoch_floor_mismatch")}},resend(){for(let[lane,state]of lanes)state.verdict?.refusal===void 0&&ask(lane,state)}}}function createHandLink(transport,planeHandlers={},filePlanes=[],epoch){let pending=new Map,stamp=epoch===void 0?{}:{epoch},sent=new Set,planes=createPlaneServer({transport,planes:planeHandlers,liveLane:(executionId,plane)=>{let waiting=pending.get(executionId)?.message;if(waiting?.kind==="invoke"||waiting?.kind==="file"&&(plane===void 0||filePlanes.includes(plane)))return waiting.scope.id}}),announced,waitedOut=!1,helloWaiters=new Set,settle2=(executionId,reply)=>{let waiter=pending.get(executionId);waiter!==void 0&&(pending.delete(executionId),sent.delete(executionId),planes.parentEnded(executionId),waiter.resolve(reply))},send=(lane,message)=>transport.send(lane,encodeRemoteMessage(message)),gate=epoch===void 0?void 0:createEpochGate(epoch,(lane,floor)=>send(lane,floor)),whenOpen=(lane,executionId,go)=>{if(gate===void 0)return go();gate.open(lane).then(refusal2=>{if(pending.has(executionId)){if(refusal2===void 0)return go();settle2(executionId,{kind:"epoch_refused",reason:refusal2})}})};return transport.onFrame(frame=>{let nested=decodePlaneMessage(frame.payload);if(nested!==void 0)return planes.receive(frame.lane,nested);let message;try{message=decodeRemoteMessage(frame.payload)}catch{return}let ack=executionId=>{send(frame.lane,{kind:"ack",executionId,...stamp}).catch(()=>{})};if(message.kind==="hello"){announced=message;for(let waiter of[...helloWaiters])waiter(message);if(gate?.resend(),message.durable)for(let{message:waiting}of pending.values())sent.has(waiting.executionId)&&whenOpen(waiting.scope.id,waiting.executionId,()=>{send(waiting.scope.id,waiting).catch(()=>{})});return}if(message.kind==="floor_ack"||message.kind==="floor_refused")return gate?.answer(frame.lane,message);message.kind==="settled"?(settle2(message.executionId,{kind:"settled",result:message.result}),ack(message.executionId)):message.kind==="terminal"?(settle2(message.executionId,{kind:"terminal",terminal:message}),ack(message.executionId)):message.kind==="refused"&&settle2(message.executionId,{kind:"refused",reason:message.reason})}),{dispatch(unstamped,signal){let message={...unstamped,...stamp},{executionId}=message,replied=new Promise(resolve=>{pending.set(executionId,{message,resolve})});if(signal?.aborted)return settle2(executionId,{kind:"aborted",sent:!1}),replied;let onAbort=()=>{if(!pending.has(executionId))return;let reached=sent.has(executionId);reached&&send(message.scope.id,{kind:"abort",executionId,...stamp}).catch(()=>{}),settle2(executionId,{kind:"aborted",sent:reached})};return signal?.addEventListener("abort",onAbort,{once:!0}),replied.then(()=>signal?.removeEventListener("abort",onAbort)),whenOpen(message.scope.id,executionId,()=>{sent.add(executionId),send(message.scope.id,message).catch(error=>{settle2(executionId,{kind:"unreachable",reason:error instanceof Error?error.message:String(error)})})}),replied},hello(ms,signal){return announced!==void 0||waitedOut||signal?.aborted?Promise.resolve(announced):new Promise(resolve=>{let done=hello=>{clearTimeout(timer),helloWaiters.delete(done),signal?.removeEventListener("abort",onAbort),resolve(hello)},onAbort=()=>done(void 0),timer=setTimeout(()=>{waitedOut=!0,done(void 0)},ms);helloWaiters.add(done),signal?.addEventListener("abort",onAbort,{once:!0})})},close(){for(let executionId of[...pending.keys()])settle2(executionId,{kind:"closed"});transport.close()}}}function errorResult2(text){return{content:[{type:"text",text}],details:{},isError:!0}}function terminalResult(placement,terminal2){if(placement==="split-local")return{content:[{type:"text",text:TOOL_RESULT_PLACEHOLDER}],details:{},isError:!1};let{reason,uncertain,hooksRan}=terminal2;return{content:[{type:"text",text:`The tool call ended without a result (${reason}) and was not run again. ${uncertain?"Its effects are uncertain.":"It had no effect."}`}],details:{outcome:reason,uncertain,hooksRan},isError:!0}}function createRemoteToolHost(options){let mintId=options.mintId??(()=>crypto.randomUUID()),link=createHandLink(options.transport,options.planes??{},options.filePlanes??[],options.epoch),resultOf=reply=>{switch(reply.kind){case"settled":return reply.result;case"terminal":return terminalResult(options.placement,reply.terminal);case"refused":return errorResult2(`The hand refused this tool call: ${reply.reason}`);case"aborted":return errorResult2(reply.sent?"Tool execution aborted":"Operation aborted");case"unreachable":return errorResult2(`The hand is unreachable: ${reply.reason}`);case"closed":return errorResult2("The hand link was closed before the call settled");case"epoch_refused":return errorResult2(`The hand refused this session's epoch: ${reply.reason}`)}},dispatch=(invoke,signal)=>({settled:link.dispatch(invoke,signal).then(resultOf)});return{async execute(call,hostOptions){let{emit,signal}=hostOptions,batchId=mintId(),invokeOf=(raw,index)=>({kind:"invoke",executionId:mintId(),batchId,index,scope:call.scope,toolCallId:raw.id,name:raw.name,arguments:raw.arguments,...options.sessionRef===void 0?{}:{sessionRef:options.sessionRef}}),finish=async(raw,result)=>(await emit({type:"tool_execution_end",toolCallId:raw.id,toolName:raw.name,result,isError:result.isError}),result),outcomes=[];for(let[index,raw]of call.calls.entries()){await emit({type:"tool_execution_start",toolCallId:raw.id,toolName:raw.name,args:raw.arguments});let outcome2=dispatch(invokeOf(raw,index),signal).settled.then(result=>finish(raw,result));if(outcomes.push(outcome2),call.mode==="sequential"&&(await outcome2,signal?.aborted))break}let results=await Promise.all(outcomes),messages=[];for(let[index,result]of results.entries()){let raw=call.calls[index];if(raw===void 0)continue;let message={role:"toolResult",toolCallId:raw.id,toolName:raw.name,content:result.content,details:result.details,...result.addedToolNames?.length?{addedToolNames:[...result.addedToolNames]}:{},isError:result.isError,timestamp:Date.now()};await emit({type:"message_start",message}),await emit({type:"message_end",message}),messages.push(message)}return{messages,terminate:results.length>0&&results.every(result=>result.terminate===!0)}},deviceFiles:scope=>createRemoteDeviceFiles(link,scope,mintId),close:()=>link.close()}}var PIPE_PREFIX="\\\\.\\pipe\\";function localEndpoint(platform,name,socketDir){if(name.length===0||/[\\/]/.test(name))throw new RangeError(`local endpoint: a name must be non-empty with no path separator, got ${JSON.stringify(name)}`);if(platform==="win32"){let address=`${PIPE_PREFIX}${name}`;if(address.length>256)throw new RangeError("local endpoint: a pipe name is at most 256 characters");return{kind:"named-pipe",address}}return{kind:"unix-socket",address:`${socketDir.replace(/\/+$/,"")}/${name}.sock`,mode:384}}function endpointKey(endpoint){return endpoint.kind==="named-pipe"?endpoint.address.toUpperCase():endpoint.address}function createLink(a,b,schedule){let generation=0,up=!1,drop=()=>{up&&(up=!1,generation+=1,a.detached(),b.detached())},half=(to,at)=>({send:message=>(schedule(()=>{up&&generation===at&&to.message(message)}),!0),close:()=>{generation===at&&drop()}});return{connect(){up||(up=!0,generation+=1,a.attached(half(b,generation)),b.attached(half(a,generation)))},drop,get connected(){return up}}}function createInProcessNetwork(options={}){let schedule=options.schedule??queueMicrotask,listeners=new Map;return{listen(endpoint,side){let key=endpointKey(endpoint);if(listeners.has(key))throw new Error(`in-process carrier: ${endpoint.address} already has a listener`);return listeners.set(key,{side,dialed:!1}),()=>{listeners.delete(key)}},dial(endpoint,side){let listener=listeners.get(endpointKey(endpoint));if(listener===void 0)throw new Error(`in-process carrier: no listener at ${endpoint.address}`);if(listener.dialed)throw new Error(`in-process carrier: ${endpoint.address} is already dialed`);return listener.dialed=!0,createLink(side,listener.side,schedule)}}}var Result={ok(value2){return{ok:!0,value:value2}},err(error){return{ok:!1,error}},isOk(result){return result.ok},isErr(result){return!result.ok}};function TaggedError(tag){class TaggedErrorClass extends Error{constructor(props){super(props.message),this._tag=tag,this.name=tag,Object.assign(this,props)}toJSON(){let payload={};for(let key of Object.keys(this))key!=="_tag"&&(payload[key]=this[key]);return{_tag:tag,message:this.message,...payload}}static is(value2){return value2 instanceof TaggedErrorClass}}return TaggedErrorClass}var LaneBusy=class extends TaggedError("LaneBusy"){},OperationMismatch=class extends TaggedError("OperationMismatch"){},NoActiveRun=class extends TaggedError("NoActiveRun"){},NoActiveOperation=class extends TaggedError("NoActiveOperation"){},NothingToResume=class extends TaggedError("NothingToResume"){},NothingToCompact=class extends TaggedError("NothingToCompact"){},InvalidMessage=class extends TaggedError("InvalidMessage"){},InvalidNavigation=class extends TaggedError("InvalidNavigation"){},UnknownSkill=class extends TaggedError("UnknownSkill"){},UnknownTemplate=class extends TaggedError("UnknownTemplate"){},UnknownTarget=class extends TaggedError("UnknownTarget"){},InvalidLane=class extends TaggedError("InvalidLane"){},Closed=class extends TaggedError("Closed"){},HarnessFault=class extends Error{constructor(message,cause){super(message),this.name="HarnessFault",this.cause=cause}},HarnessClosed=class extends Error{constructor(){super("AgentHarness was closed while the operation was active"),this.name="HarnessClosed"}};function matchError(error,matchers){let matcher=matchers[error._tag];return matcher(error)}import{awaitWithContext,BACKGROUND_CONTEXT,createContextKey,TODO_CONTEXT,withAbortSignal,withCancel,withContextValue,withoutAbortSignal}from"@earendil-works/chord/context";var TELEMETRY_CONTEXT_KEY=createContextKey("pi.telemetryContext"),SESSION_CWD_CONTEXT_KEY=createContextKey("pi.sessionCwd");function getSessionCwd(context){return context.value(SESSION_CWD_CONTEXT_KEY)}function withSessionCwd(cwd,context){return cwd===void 0?context:withContextValue(SESSION_CWD_CONTEXT_KEY,cwd,context)}function getTelemetryContext(context){return context.value(TELEMETRY_CONTEXT_KEY)??NOOP_TELEMETRY_CONTEXT}function withTelemetryContext(telemetryContext,context){return withContextValue(TELEMETRY_CONTEXT_KEY,telemetryContext,context)}var AbortRequested=class extends Error{constructor(cancellation){super("Abort requested"),this.name="AbortRequested",this.cancellation=cancellation}};function createGate(){let state={status:"open"},controller=new AbortController,check=()=>{if(state.status==="aborting")throw new AbortRequested(state.cancellation);if(state.status==="closed")throw state.error};return{gate:{admit(invoke){return check(),invoke()},signal:controller.signal},control:{beginAbort(cancellation){state.status==="open"&&(state={status:"aborting",cancellation})},signalAbort(){state.status!=="aborting"||controller.signal.aborted||controller.abort(new AbortRequested(state.cancellation))},close(error){state.status!=="closed"&&(state={status:"closed",error},controller.signal.aborted||controller.abort(error))}}}}var SliceNotImplemented=class extends Error{constructor(operation){super(`${operation} is not implemented until its later AgentHarness slice`),this.name="SliceNotImplemented"}},Drive=class{constructor(options,context){this.operationId=options.operationId,this.context=withoutAbortSignal(context),this.waitForRetry=options.waitForRetry??!1,this.deferredPermits=options.pollDeferred===!0?1:0;let resolveCompletion,rejectCompletion;this.completion=new Promise((resolve,reject)=>{resolveCompletion=resolve,rejectCompletion=reject}),this.resolveCompletion=resolveCompletion,this.rejectCompletion=rejectCompletion,this.completion.catch(()=>{});let{gate,control}=createGate();this.gate=gate,this.control=control,this.closeController=new AbortController,this.closeSignal=this.closeController.signal}settle(outcome2){this.resolveCompletion(outcome2)}fail(error){this.rejectCompletion(error)}beginAbort(cancellation){this.control.beginAbort(cancellation)}signalAbort(){this.control.signalAbort()}closeGate(error){this.control.close(error),this.closeSignal.aborted||this.closeController.abort(error),this.rejectCompletion(error)}};var COMPACTION_SUMMARY_PREFIX=`The conversation history before this point was compacted into the following summary:
|
|
3
3
|
|
|
4
4
|
<summary>
|
|
5
5
|
`,COMPACTION_SUMMARY_SUFFIX=`
|