@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,98 +0,0 @@
|
|
|
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{RPC_ERROR_EFFECT_ID_CONFLICT,RPC_ERROR_ENTRY_NOT_FOUND,RPC_ERROR_INVALID_ARGUMENT,RPC_ERROR_RESPONSE_TOO_LARGE,RPC_ERROR_TRANSCRIPT_UNREADABLE,clientMessageIdentity,clientMessageIdentitySchema,readClientMessageIdentity}from"./chunk-SJI6UB23.js";import{carryExecutionCallKey,compactUpdatesEnabled}from"./chunk-J2I56WLK.js";import{isAbortGraceInRange}from"./chunk-TQHNFP77.js";import{SecretInputUnavailableError,armSecretInputDeadline,describeUsageLimitEntry,isSecretInputValue,resolveSecretInputTimeout,watchWithErrorHandler}from"./chunk-C7HEEBFH.js";import{isRecord,queuedForm,validMcpFormContent,validateMrtrForm}from"./chunk-MOVB6H22.js";import{ProjectTrustStore}from"./chunk-VD7AKTGP.js";import{COMPACT_EVENTS_CAPABILITY,INTERACTIVE_USER_CAPABILITY,TASK_PARENT_CAPABILITY,hostInstanceId}from"./chunk-HLM46XEB.js";import{serializeJsonLine}from"./chunk-SF4MQDKZ.js";import{external_exports}from"./chunk-KUPQO7MC.js";import{modelSupportsAssistantPrefill}from"./chunk-YUVC7SJB.js";import{getSupportedThinkingLevels,supportsMax,supportsXhigh}from"./chunk-OKMHSVCA.js";import{sanitizeProviderDiagnostic}from"./chunk-JGKH3D6W.js";import{acquireOwnershipSafeLock}from"./chunk-HW6AAS3R.js";import{getAgentDir}from"./chunk-SODMQEHO.js";import{processIsLive,processStartTimeMs,readProcessIdentity}from"./chunk-O5RYI3IW.js";var presentations=new Map;function attachMcpGrantPresentation(sessionId,select){let attached=presentations.get(sessionId)??new Set;presentations.set(sessionId,attached);let abort=new AbortController,entry={abort,select:(title,choices,opts)=>select(title,choices,{...opts,signal:opts?.signal===void 0?abort.signal:AbortSignal.any([opts.signal,abort.signal])})};return attached.add(entry),()=>{abort.abort(),attached.delete(entry),attached.size===0&&presentations.delete(sessionId)}}function getMcpGrantPresentation(sessionId){return sessionId===void 0?void 0:presentations.get(sessionId)?.values().next().value?.select}function clearMcpGrantPresentations(sessionId){for(let entry of presentations.get(sessionId)??[])entry.abort.abort();presentations.delete(sessionId)}async function selectMcpGrant(select,title,signal){if(select===void 0||signal?.aborted)return!1;let abort=new AbortController,timeout,cancel=()=>{},stopped=new Promise(resolve=>{cancel=()=>{abort.abort(),resolve(void 0)},signal?.addEventListener("abort",cancel,{once:!0}),timeout=setTimeout(cancel,12e4)});try{return await Promise.race([select(title,["Grant and save permanently","Start without them"],{timeout:12e4,signal:abort.signal}),stopped])==="Grant and save permanently"&&!abort.signal.aborted}catch{return!1}finally{clearTimeout(timeout),signal?.removeEventListener("abort",cancel),abort.abort()}}function supportsXhigh2(model){return supportsXhigh(model)}function supportsMax2(model){return supportsMax(model)}function getSupportedThinkingLevels2(model){let supportedLevels=getSupportedThinkingLevels(model);return supportedLevels.length>0?supportedLevels:["off"]}function clampThinkingSelection(selection,requested,level,model){if(selection===void 0)return;let{requested:_staleRequested,clampReason:_staleReason,...base}=selection;return requested===level||model===void 0?{...base,level}:{...base,level,requested,clampReason:model.reasoning?"level-unsupported":"model-not-reasoning"}}function getThinkingClampNotice(selection,model){let clamped=selection;if(!(model===void 0||clamped?.requested===void 0||clamped.clampReason===void 0))return{provider:model.provider,modelId:model.id,requestedLevel:clamped.requested,appliedLevel:clamped.level,reason:clamped.clampReason}}function formatThinkingClampWarning(notice){let model=`${notice.provider}/${notice.modelId}`;return notice.reason==="model-not-reasoning"?`Thinking level "${notice.requestedLevel}" was requested, but ${model} is not marked as a reasoning model, so thinking is "${notice.appliedLevel}". If the model supports reasoning, set "reasoning": true for it in models.json.`:`Thinking level "${notice.requestedLevel}" is not available on ${model}; using "${notice.appliedLevel}".`}function classifyReasoningCapability(model){if(!model.reasoning)return{kind:"none",levels:["off"],nonOffLevels:[]};let levels=getSupportedThinkingLevels2(model),nonOffLevels=levels.filter(level=>level!=="off");return levels.includes("off")?nonOffLevels.length===1?{kind:"on-off",levels,nonOffLevels}:nonOffLevels.length===0?{kind:"none",levels,nonOffLevels}:{kind:"graded",levels,nonOffLevels}:{kind:"always-on",levels,nonOffLevels}}import{AsyncLocalStorage}from"node:async_hooks";var WORD_ROLES=["interactive_user","task_parent"];function maskOfRoles(roles){let mask=0;for(let role of roles){let bit=WORD_ROLES.indexOf(role);bit>=0&&(mask|=1<<bit)}return mask}function rolesOfMask(mask){return WORD_ROLES.filter((_role,bit)=>(mask&1<<bit)!==0)}function decodeWord(word){let mask=word&3;return{epoch:word>>>3,retired:(word&4)!==0,mask,roles:rolesOfMask(mask)}}function packWord(epoch,retired,mask){if(!Number.isSafeInteger(epoch)||epoch<1||epoch>=536870912)throw new Error("authority_epoch_exhausted");return epoch<<3|(retired?4:0)|mask}function createAuthority(incarnation,mask){if(!Number.isSafeInteger(incarnation)||incarnation<1||incarnation>2147483647)throw new Error("authority_incarnation_invalid");let buffer=new SharedArrayBuffer(8),view=new Int32Array(buffer);return view[0]=packWord(1,!1,mask&3),view[1]=incarnation,buffer}function readAuthority(buffer){return decodeWord(Atomics.load(new Int32Array(buffer),0))}function incarnationOf(buffer){return Atomics.load(new Int32Array(buffer),1)}function store(view,word){Atomics.store(view,0,word),Atomics.notify(view,0)}function storeNarrowed(buffer,roles){let view=new Int32Array(buffer),current2=decodeWord(Atomics.load(view,0)),mask=current2.mask&maskOfRoles(roles);return mask===current2.mask?!1:(store(view,packWord(current2.epoch+1,current2.retired,mask)),!0)}function storeRetired(buffer){let view=new Int32Array(buffer),current2=decodeWord(Atomics.load(view,0));return current2.retired?!1:(store(view,packWord(current2.epoch+1,!0,current2.mask)),!0)}function nextIncarnation(k,max=2147483647){return Number.isSafeInteger(k)&&k>=1&&k<max?k+1:void 0}function effectiveRoles(claim,state){return state.retired||claim===void 0?[]:claim.filter(role=>state.roles.includes(role))}var CommandAuthority=class{constructor(connection,descriptor,exec,stale=!1){this.connection=connection,this.descriptor=descriptor,this.exec=exec,this.stale=stale}get incarnation(){return this.descriptor?.incarnation}state(){let buffer=this.descriptor?.mode==="host"?this.descriptor.authority:void 0;if(buffer!==void 0)return this.snapshot??=decodeWord(Atomics.load(new Int32Array(buffer),0)),this.stale?{...this.snapshot,retired:!0}:this.snapshot}has(role,claim){let state=this.state();if(state===void 0)return claim?.includes(role)??!1;let effective=effectiveRoles(claim,state);return this.consulted=effective,effective.includes(role)}receipt(){if(this.exec===void 0)return;let buffer=this.descriptor?.authority,state=this.snapshot??(buffer===void 0?void 0:decodeWord(Atomics.load(new Int32Array(buffer),0)));return{exec:this.exec,incarnation:this.descriptor?.incarnation??null,epoch:state?.epoch??null,roles:this.consulted===void 0?null:[...this.consulted]}}},commandAuthority=new AsyncLocalStorage;function outsideCommand(create){return commandAuthority.exit(create)}function withReceipt(record,target){if(Reflect.get(record,"type")!=="response"||Object.hasOwn(record,"authority"))return record;let store2=commandAuthority.getStore();if(store2===void 0||store2.connection!==target)return record;let authority=store2.receipt();return authority===void 0?record:{...record,authority}}function takeRelayExec(record){if(typeof record!="object"||record===null||!Object.hasOwn(record,"relayExec"))return;let exec=Reflect.get(record,"relayExec");return Reflect.deleteProperty(record,"relayExec"),typeof exec=="number"&&Number.isSafeInteger(exec)&&exec>=1?exec:"malformed"}var BROWSER_ENGINES=["connected","builtin","none"];function isBrowserEngine(value){return BROWSER_ENGINES.some(engine=>engine===value)}function toolBarrierSpecError(value){if(typeof value!="object"||value===null||Array.isArray(value))return"toolBarrier must be an object { id, deadlineMs }.";let{id,deadlineMs}=value;if(typeof id!="string"||id.length===0||id.length>256)return"toolBarrier.id must be a non-empty string of at most 256 characters.";if(typeof deadlineMs!="number"||!Number.isSafeInteger(deadlineMs)||deadlineMs<1||deadlineMs>6e5)return"toolBarrier.deadlineMs must be a whole number of milliseconds in 1..600000."}var ToolBarrier=class{#armed;#onExpired;constructor(onExpired){this.#onExpired=onExpired}arm(spec){let current2=this.#armed;current2&&clearTimeout(current2.timer);let{promise,resolve}=Promise.withResolvers(),gate=current2??{opened:promise,open:resolve},timer=setTimeout(()=>this.#expire(spec.id),spec.deadlineMs);timer.unref?.(),this.#armed={spec:{id:spec.id,deadlineMs:spec.deadlineMs},timer,opened:gate.opened,open:gate.open}}release(id){return this.#armed?.spec.id!==id?!1:(this.#open(),!0)}clear(){this.#armed&&this.#open()}wait(signal){let armed=this.#armed;if(!armed)return;if(!signal)return{id:armed.spec.id,done:armed.opened};if(signal.aborted)return{id:armed.spec.id,done:Promise.resolve()};let aborted=Promise.withResolvers(),onAbort=()=>aborted.resolve();signal.addEventListener("abort",onAbort,{once:!0});let done=Promise.race([armed.opened,aborted.promise]).finally(()=>signal.removeEventListener("abort",onAbort));return{id:armed.spec.id,done}}#expire(id){let armed=this.#armed;armed?.spec.id===id&&(this.#open(),this.#onExpired(armed.spec))}#open(){let armed=this.#armed;armed&&(this.#armed=void 0,clearTimeout(armed.timer),armed.open())}};var nonEmpty=(value,max=256)=>typeof value=="string"&&value.length>0&&value.length<=max,seq=value=>typeof value=="number"&&Number.isInteger(value)&&value>=0,RUN_REF_KINDS=new Set(["dag","task","workpool","team"]);function validRunRef(value){if(typeof value!="object"||value===null)return!1;let ref=value;return typeof ref.kind=="string"&&RUN_REF_KINDS.has(ref.kind)&&nonEmpty(ref.id)}function validatePauseCommand(value){if((value.type==="abort"||value.type==="interrupt")&&value.intent!==void 0&&value.intent!=="stop"&&value.intent!=="abort")return'intent must be "stop" or "abort".';if(value.type==="resume_session"){if(value.expectedSeq!==void 0&&!seq(value.expectedSeq))return"expectedSeq must be a non-negative integer.";if(value.mode!==void 0&&value.mode!=="continue"&&value.mode!=="release")return'mode must be "continue" or "release".';if(value.message!==void 0&&typeof value.message!="string")return"message must be a string.";if(value.effectId!==void 0&&!nonEmpty(value.effectId))return"effectId must be 1-256 characters."}if(value.type==="hold_input"){if(!nonEmpty(value.inputId)||!seq(value.revision)||typeof value.text!="string")return"hold_input needs inputId (1-256 chars), a non-negative integer revision, and text.";if(value.parentSessionId!==void 0&&!nonEmpty(value.parentSessionId))return"parentSessionId must be 1-256 characters.";if(value.origin!==void 0&&value.origin!=="human")return'origin must be "human".'}if(value.type==="withdraw_held_input"&&!nonEmpty(value.inputId))return"withdraw_held_input needs inputId.";if(value.type==="pause_for_run"&&(!nonEmpty(value.parentSessionId)||!seq(value.parentPauseSeq)||!validRunRef(value.runRef)))return"pause_for_run needs parentSessionId, a non-negative integer parentPauseSeq, and runRef { kind, id }.";if(value.type==="resume_for_run"&&(!nonEmpty(value.parentSessionId)||!seq(value.parentPauseSeq)||!nonEmpty(value.resumeId)||!seq(value.childSeqCutoff)))return"resume_for_run needs parentSessionId, parentPauseSeq, resumeId, and childSeqCutoff."}var MAX_RPC_MESSAGE_CHARACTERS=1e6,SESSION_CONTEXT_LIMITS={keys:32,valueBytes:16*1024,totalBytes:32*1024},SESSION_CONTEXT_KEY_PATTERN=/^[a-z][a-z0-9_]*$/;function validContent(content){return typeof content=="string"?!0:Array.isArray(content)&&content.every(item=>{if(typeof item!="object"||item===null)return!1;let value=item;return value.type==="text"?typeof value.text=="string":value.type==="image"&&typeof value.data=="string"&&typeof value.mimeType=="string"})}function validBaseEntry(entry){return typeof entry.id=="string"&&(entry.parentId===null||typeof entry.parentId=="string")&&typeof entry.timestamp=="string"}function validSessionEntry(entry){if(typeof entry!="object"||entry===null||Array.isArray(entry))return!1;let value=entry;if(!validBaseEntry(value))return!1;switch(value.type){case"message":{let message=value.message;if(typeof message!="object"||message===null)return!1;let item=message;return["user","assistant","tool"].includes(item.role)&&validContent(item.content)}case"thinking_level_change":return typeof value.thinkingLevel=="string";case"model_change":return typeof value.provider=="string"&&typeof value.modelId=="string";case"model_change_rejected":return typeof value.provider=="string"&&typeof value.modelId=="string"&&typeof value.detail=="string";case"compaction":return typeof value.summary=="string"&&typeof value.firstKeptEntryId=="string"&&typeof value.tokensBefore=="number";case"branch_summary":return typeof value.fromId=="string"&&typeof value.summary=="string";case"custom":return typeof value.customType=="string";case"custom_message":return typeof value.customType=="string"&&validContent(value.content)&&typeof value.display=="boolean";case"label":return typeof value.targetId=="string"&&(value.label===void 0||typeof value.label=="string");case"session_info":return value.name===void 0||typeof value.name=="string";default:return!1}}function rpcCommandPayloadError(command){if(rpcCommandShapeError(command))return;let value=command;if((value.type==="prompt"||value.type==="steer"||value.type==="follow_up")&&!clientMessageIdentitySchema.safeParse(value).success)return"clientMessageId and clientTurnId must be non-empty strings of at most 256 characters.";if((value.type==="prompt"||value.type==="steer"||value.type==="follow_up")&&value.expectedTurnId!==void 0){if(!(typeof value.expectedTurnId=="string"&&value.expectedTurnId.length>0&&value.expectedTurnId.length<=256))return"expectedTurnId must be a non-empty string of at most 256 characters; read it from get_state.currentTurnId.";if(value.type==="prompt"&&value.streamingBehavior===void 0)return'expectedTurnId on a prompt needs streamingBehavior "steer" or "followUp".'}if(value.type==="prompt"&&value.toolBarrier!==void 0){let barrierError=toolBarrierSpecError(value.toolBarrier);if(barrierError!==void 0)return barrierError}if(value.type==="release_tool_barrier"&&!(typeof value.barrierId=="string"&&value.barrierId.length>0&&value.barrierId.length<=256))return`barrierId must be a non-empty string of at most ${256} characters.`;if((value.type==="dequeue_message"||value.type==="edit_queued_message")&&!(typeof value.queuedId=="string"&&value.queuedId.length>0&&value.queuedId.length<=256))return"queuedId must be a non-empty string of at most 256 characters; read it from get_state or queue_update.";if(value.type==="edit_queued_message"&&!(typeof value.text=="string"&&value.text.length>0&&value.text.length<=MAX_RPC_MESSAGE_CHARACTERS))return`text must be a non-empty string of at most ${MAX_RPC_MESSAGE_CHARACTERS} characters; dequeue_message removes an input.`;if((value.type==="dequeue_message"||value.type==="edit_queued_message")&&value.expectedRevision!==void 0&&!(Number.isSafeInteger(value.expectedRevision)&&value.expectedRevision>=1))return"expectedRevision must be a whole number of at least 1; read it from the input's revision in get_state or queue_update.";if(value.type==="resolve_path"&&!(typeof value.path=="string"&&value.path.trim().length>0&&value.path.length<=4096))return"path must be a non-empty string of at most 4096 characters.";if(value.type==="unload_session"){if(value.children!==void 0&&value.children!=="refuse"&&value.children!=="detach")return'children must be "refuse" or "detach".';for(let flag of["interrupt","clearQueue","force"])if(value[flag]!==void 0&&typeof value[flag]!="boolean")return`${flag} must be a boolean.`}if((value.type==="steer"||value.type==="follow_up")&&value.enqueueOrder!==void 0&&!(typeof value.enqueueOrder=="number"&&Number.isFinite(value.enqueueOrder)))return"enqueueOrder must be a finite number.";if((value.type==="steer"||value.type==="follow_up")&&value.whenIdle!==void 0&&value.whenIdle!=="queue"&&value.whenIdle!=="start")return'whenIdle must be "queue" or "start"; omit it to queue on an idle session.';if((value.type==="abort"||value.type==="set_model"||value.type==="set_thinking_level"||value.type==="get_effect_status")&&(value.effectId!==void 0||value.type==="get_effect_status")&&!(typeof value.effectId=="string"&&value.effectId.length>0&&value.effectId.length<=256))return"effectId must be a non-empty string of at most 256 characters.";let pauseFieldError=validatePauseCommand(value);if(pauseFieldError!==void 0)return pauseFieldError;if(value.type==="get_pending_inputs"&&value.knownClientMessageIds!==void 0){let ids=value.knownClientMessageIds;if(!Array.isArray(ids)||ids.length>64||!ids.every(id=>typeof id=="string"&&id.length>0&&id.length<=256))return"knownClientMessageIds must be an array of at most 64 non-empty strings of at most 256 characters."}if(value.type==="get_effect_status"&&value.sessionPath!==void 0&&typeof value.sessionPath!="string")return"sessionPath must be a string.";if(value.type==="append_user_message"&&!validContent(value.content))return"append_user_message content must be a string or text/image content array.";if(value.type==="append_session_entry"&&!validSessionEntry(value.entry))return"append_session_entry entry is malformed.";if((value.type==="prompt"||value.type==="steer"||value.type==="follow_up")&&typeof value.message!="string")return"message must be a string."}function sessionContextError(context){if(context===void 0)return;if(typeof context!="object"||context===null||Array.isArray(context))return"context must be an object of string values.";let entries=Object.entries(context);if(entries.length>SESSION_CONTEXT_LIMITS.keys)return`context has ${entries.length} keys, at most ${SESSION_CONTEXT_LIMITS.keys} are accepted.`;for(let[key,value]of entries){if(!SESSION_CONTEXT_KEY_PATTERN.test(key))return`context key "${key}" must match ${SESSION_CONTEXT_KEY_PATTERN.source}.`;if(typeof value!="string")return`context value for key "${key}" must be a string.`;let valueBytes=Buffer.byteLength(value);if(valueBytes>SESSION_CONTEXT_LIMITS.valueBytes)return`context value for key "${key}" is ${valueBytes} bytes, at most ${SESSION_CONTEXT_LIMITS.valueBytes} bytes are accepted.`}let totalBytes=Buffer.byteLength(JSON.stringify(context));if(totalBytes>SESSION_CONTEXT_LIMITS.totalBytes)return`context is ${totalBytes} bytes of JSON, at most ${SESSION_CONTEXT_LIMITS.totalBytes} bytes are accepted.`}function sessionKindError(kind){if(!(kind===void 0||kind==="interactive"||kind==="worker"))return'kind must be "interactive" or "worker".'}function sessionAutoTitleError(value){if(!(value===void 0||typeof value=="boolean"))return"auto_title must be a boolean."}function sessionPromptSurfaceError(value){if(!(value===void 0||value==="terminal"||value==="app"||value==="chat"))return'promptSurface must be "terminal", "app" or "chat".'}function sessionBrowserEngineError(value){if(!(value===void 0||isBrowserEngine(value)))return'browserEngine must be "connected", "builtin" or "none".'}var MAX_RETRY_FALLBACK_CHAINS=32,MAX_RETRY_FALLBACK_ENTRIES=32,MAX_RETRY_FALLBACK_SELECTOR_LENGTH=512;function sessionRetryFallbackError(value){if(value===void 0)return;let shape="retryFallback must be { modelFallback: boolean, fallbackChains: Record<string, string[]> }.";if(typeof value!="object"||value===null||Array.isArray(value))return shape;let record=value;if(typeof record.modelFallback!="boolean")return shape;let chains=record.fallbackChains;if(typeof chains!="object"||chains===null||Array.isArray(chains))return shape;let entries=Object.entries(chains);if(entries.length>MAX_RETRY_FALLBACK_CHAINS)return`retryFallback allows at most ${MAX_RETRY_FALLBACK_CHAINS} chains.`;for(let[key,selectors]of entries){if(!isSelector(key)||!Array.isArray(selectors)||!selectors.every(isSelector))return shape;if(selectors.length>MAX_RETRY_FALLBACK_ENTRIES)return`retryFallback allows at most ${MAX_RETRY_FALLBACK_ENTRIES} entries per chain.`}}function isSelector(value){return typeof value=="string"&&value.trim().length>0&&value.length<=MAX_RETRY_FALLBACK_SELECTOR_LENGTH}function rpcCommandShapeError(command){if(typeof command!="object"||command===null||Array.isArray(command))return"RPC command must be a JSON object."}function rpcMessageLengthError(command){if(rpcCommandShapeError(command))return;let input=command;if(!(input.type!=="prompt"&&input.type!=="steer"&&input.type!=="follow_up")&&!(typeof input.message!="string"||input.message.length<=MAX_RPC_MESSAGE_CHARACTERS))return`RPC ${input.type} message exceeds ${MAX_RPC_MESSAGE_CHARACTERS} characters.`}import{createHash as createHash2}from"node:crypto";import{createHash}from"node:crypto";var RPC_EFFECT_ENTRY="rpc_effect",EFFECT_LEDGER_CAPABILITY="effect_ledger",actorSchema=external_exports.object({connectionId:external_exports.string()}),effectOutcomeSchema=external_exports.object({kind:external_exports.enum(["completed","aborted","error","deadline","interrupted_by_reopen","dropped_by_replace","unknown_model","provider_unavailable","unsupported_thinking_level","superseded","context_budget","cleared","cleared_by_abort","already_delivered","not_found","conflict","refused"]),reason:external_exports.string().optional(),detail:external_exports.string().optional(),action:external_exports.string().optional(),abortSource:external_exports.string().optional(),abortedBy:actorSchema.optional()}),rpcEffectRecordSchema=external_exports.object({effectId:external_exports.string().min(1).max(256),kind:external_exports.enum(["abort","unload","set_model","set_thinking_level","dequeue","edit_queued"]),state:external_exports.enum(["accepted","applied","done","failed"]),disposition:external_exports.string().optional(),outcome:effectOutcomeSchema.optional(),answer:external_exports.object({text:external_exports.string().optional(),revision:external_exports.number().int().positive().optional(),currentRevision:external_exports.number().int().positive().optional()}).optional(),by:actorSchema,acceptedAt:external_exports.string(),updatedAt:external_exports.string(),durableSessionId:external_exports.string(),fingerprint:external_exports.string()});function isTerminalEffectState(state){return state==="done"||state==="failed"}var EffectIdConflict=class extends Error{constructor(effectId){super(`effect_id_conflict: effectId ${effectId} was already used for a different request`),this.code="effect_id_conflict",this.reason="effect_id_conflict: this effectId was already used for a different request",this.action="send the request again with a new effectId",this.name="EffectIdConflict",this.effectId=effectId}},SEMANTIC_FIELDS={abort:["awaitIdle","clearQueue","graceMs"],set_model:["provider","modelId","thinkingLevel","scope"],set_thinking_level:["level","scope"],unload:["interrupt","clearQueue","children","force"],dequeue:["queuedId","expectedRevision"],edit_queued:["queuedId","text","expectedRevision"]};function effectFingerprint(command,payload){let semantic={kind:command};for(let field3 of SEMANTIC_FIELDS[command]){let value=Reflect.get(payload,field3);value!==void 0&&(semantic[field3]=value)}return createHash("sha256").update(JSON.stringify(semantic)).digest("hex")}var CLIENT_ADMISSION_ENTRY="rpc_client_message_admission",HOST_MINTED_ID_PREFIX="host:";function isHostMintedId(id){return id?.startsWith(HOST_MINTED_ID_PREFIX)===!0}function clientFacingIdentity(value){if(!isHostMintedId(value.clientMessageId))return value;let{clientMessageId:_minted,...rest}=value;return rest}var DURABLE_CLIENT_MESSAGE_ID_CAPABILITY="durable_client_message_id",admissionIdentitySchema=clientMessageIdentitySchema.extend({clientMessageId:external_exports.string().min(1).max(256),durableSessionId:external_exports.string(),fingerprint:external_exports.string(),disposition:external_exports.enum(["queued","started","handled"]),turnId:external_exports.string().optional(),hostMinted:external_exports.literal(!0).optional()}),preparedInputSchema=clientMessageIdentitySchema.extend({text:external_exports.string(),images:external_exports.array(external_exports.object({type:external_exports.literal("image"),data:external_exports.string(),mimeType:external_exports.string()})).optional(),mode:external_exports.enum(["steer","followUp"]),enqueueOrder:external_exports.number(),source:external_exports.enum(["interactive","rpc","extension"]).optional()}),clientAdmissionRecordSchema=external_exports.discriminatedUnion("state",[admissionIdentitySchema.extend({state:external_exports.literal("queued"),prepared:preparedInputSchema}),admissionIdentitySchema.extend({state:external_exports.literal("running"),prepared:external_exports.undefined().optional()}),admissionIdentitySchema.extend({state:external_exports.literal("completed"),prepared:external_exports.undefined().optional(),outcome:effectOutcomeSchema.optional()})]);function admissionSnapshot(record){let{fingerprint:_fingerprint,prepared:_prepared,...snapshot}=record;return snapshot}var ClientMessageIdConflict=class extends Error{constructor(clientMessageId){super(`client_message_id_conflict: ${clientMessageId}`),this.code="client_message_id_conflict",this.name="ClientMessageIdConflict",this.clientMessageId=clientMessageId}};function clientInputFingerprint(command){let payload={type:command.type,message:command.message,images:command.images?.map(({type,data,mimeType})=>({type,data,mimeType}))??[],clientTurnId:command.clientTurnId,...command.type==="prompt"?{streamingBehavior:command.streamingBehavior,thinkingLevel:command.thinkingLevel,sessionTitlePrompt:command.sessionTitlePrompt,expandPromptTemplates:command.expandPromptTemplates??!0,unknownCommandAsText:command.unknownCommandAsText??!1}:{}};return createHash2("sha256").update(JSON.stringify(payload)).digest("hex")}import{randomUUID}from"node:crypto";async function admitClientInput(command,invoke){await this.ready,this.hasIdentities||=command.clientMessageId!==void 0||command.clientTurnId!==void 0;let hostMinted=command.clientMessageId===void 0&&command.type!=="prompt";if(command.clientMessageId===void 0&&!hostMinted){await invoke({identity:{},queued:()=>{},accepted:()=>{}});return}let clientMessageId=command.clientMessageId??`${HOST_MINTED_ID_PREFIX}${this.session.sessionManager.getSessionId()}:${randomUUID()}`,fingerprint=clientInputFingerprint(command),pending2=this.pending.get(clientMessageId),existing=this.records.get(clientMessageId);if((pending2??existing)?.fingerprint!==void 0&&(pending2??existing)?.fingerprint!==fingerprint)throw new ClientMessageIdConflict(clientMessageId);if(pending2)return pending2.result;if(existing)return admissionSnapshot(existing);let result=Promise.withResolvers();this.pending.set(clientMessageId,{fingerprint,result:result.promise}),result.promise.catch(()=>{});try{await this.session.sessionManager.persistHeaderNow();let base={...clientMessageIdentity(command),clientMessageId,durableSessionId:this.session.sessionManager.getSessionId(),fingerprint,...hostMinted?{hostMinted:!0}:{}},disposition=await invoke({identity:{...clientMessageIdentity(command),clientMessageId},queued:prepared=>this.save({...base,state:"queued",disposition:"queued",prepared}),accepted:(accepted,turnId)=>{let record2=this.records.get(clientMessageId)??{...base,state:accepted==="handled"?"completed":"running",disposition:accepted,...turnId===void 0?{}:{turnId}};return this.records.has(clientMessageId)||this.save(record2),admissionSnapshot(record2)}}),record=this.records.get(clientMessageId);if(!record)throw new Error(`RPC input was ${disposition} without a durable admission`);let snapshot=admissionSnapshot(record);return result.resolve(snapshot),hostMinted?void 0:snapshot}catch(error){throw result.reject(error),error}finally{this.pending.delete(clientMessageId)}}var EFFECT_OUTCOMES={inputInterruptedByReopen:{kind:"interrupted_by_reopen",reason:"interrupted_by_reopen",detail:"the session was reopened while this input's turn was running, so that turn never finished",action:"read the transcript for what the turn produced, then send the input again with a new clientMessageId"},inputCleared:{kind:"cleared",reason:"cleared",detail:"the queue was cleared (clear_queue, or abort or unload_session with clearQueue) before this queued input was delivered",action:"send the input again with a new clientMessageId if it is still needed"},queuedInputAlreadyDelivered:{kind:"already_delivered",reason:"already_delivered",detail:"the queued message had already been handed to the agent, so it can no longer be removed or edited",action:"send a follow-up message to correct it, or abort the turn"},queuedInputNotFound:{kind:"not_found",reason:"not_found",detail:"no queued message has this queuedId in this session",action:"read queuedId values from get_state or queue_update and retry with one that is still queued"},queuedInputConflict:{kind:"conflict",reason:"conflict",detail:"the queued message was changed after the revision this request was based on, so nothing was changed",action:"read the input's current text and revision from get_state or queue_update, then retry with that expectedRevision if the change still applies"},inputDroppedByReplace:{kind:"dropped_by_replace",reason:"dropped_by_replace",detail:"the session was replaced (new_session, switch_session or fork) before this queued input was delivered",action:"send the input again with a new clientMessageId on the current session"},abortInterruptedByReopen:{kind:"interrupted_by_reopen",reason:"interrupted_by_reopen",detail:"the session was reopened, so the turn this abort targeted is no longer running"},setModelInterruptedByReopen:{kind:"interrupted_by_reopen",reason:"interrupted_by_reopen",detail:"the host restarted before the model switch was applied",action:"send set_model again with a new effectId"},setModelSuperseded:{kind:"superseded",reason:"superseded",detail:"a newer model selection replaced this switch before it was applied",action:"read the current model, then send set_model with a new effectId if you still want this model"},setModelDroppedByReplace:{kind:"dropped_by_replace",reason:"dropped_by_replace",detail:"the session was replaced (new_session, switch_session or fork) before this model switch was applied",action:"read the current model, then send set_model with a new effectId on the current session"},setThinkingInterruptedByReopen:{kind:"interrupted_by_reopen",reason:"interrupted_by_reopen",detail:"the host restarted before the thinking level was applied",action:"send set_thinking_level again with a new effectId"},dequeueInterruptedByReopen:{kind:"interrupted_by_reopen",reason:"interrupted_by_reopen",detail:"the session was reopened before the queued input was removed",action:"re-read queue_update.ordered and retry with a new effectId"},editQueuedInterruptedByReopen:{kind:"interrupted_by_reopen",reason:"interrupted_by_reopen",detail:"the session was reopened before the queued input was edited",action:"re-read queue_update.ordered and retry with a new effectId"}};function unknownModelOutcome(provider,modelId){return{kind:"unknown_model",reason:"unknown_model",detail:`no available model is named ${provider}/${modelId}`,action:"pick a model from get_available_models and send set_model again with a new effectId"}}function providerUnavailableOutcome(detail){return{kind:"provider_unavailable",reason:"provider_unavailable",detail,action:"sign in to the provider or pick another model, then send set_model again with a new effectId"}}function contextBudgetOutcome(detail){return{kind:"context_budget",reason:"context_budget",detail,action:"compact the session or pick a model with a larger context window, then send set_model with a new effectId"}}function modelSwitchErrorOutcome(detail){return{kind:"error",reason:"error",detail,action:"read the error, then send set_model again with a new effectId after correcting its cause"}}function unsupportedThinkingLevelOutcome(detail){return{kind:"unsupported_thinking_level",reason:"unsupported_thinking_level",detail,action:"pick a level from get_available_thinking_levels and send it again with a new effectId"}}function turnErrorOutcome(detail){return{kind:"error",reason:"error",detail:detail??"the turn ended with a provider error",action:"read the error in the transcript, then retry the turn"}}var ADMISSION_STATES={queued:"accepted",running:"applied",completed:"done"};function projectAdmission(record,sessionId){let outcome=record.state==="completed"?record.outcome:void 0;return{effectId:record.clientMessageId,kind:"input",state:outcome?.kind==="dropped_by_replace"||outcome?.kind==="cleared"||outcome?.kind==="cleared_by_abort"?"failed":ADMISSION_STATES[record.state],disposition:record.disposition,...outcome===void 0?{}:{outcome},...sessionId===void 0?{}:{sessionId},durableSessionId:record.durableSessionId}}function projectEffect(record,sessionId){let{fingerprint:_fingerprint,...status}=record;return sessionId===void 0?status:{...status,sessionId}}function effectStatusRecord(subscription,sessionId,status,at){return{type:"effect_status",subscriptionId:subscription.id,seq:subscription.seq,sessionId,effectId:status.effectId,kind:status.kind,state:status.state,...status.disposition===void 0?{}:{disposition:status.disposition},...status.outcome===void 0?{}:{outcome:status.outcome},...status.by===void 0?{}:{by:status.by},at,...subscription.options?.admissionId!==void 0?{admissionId:subscription.options.admissionId,generation:0}:{}}}var sinks=new Set,pending=new WeakMap,dirty=new Map,scheduled=!1;function noteSessionEffect(session,status){let owner;for(let sink of sinks)if(sink.owns(session)){owner=sink;break}if(owner===void 0)return;let list=pending.get(session)??[];list.push(status),pending.set(session,list),dirty.set(session,owner),scheduled||(scheduled=!0,queueMicrotask(flushDirty))}function drainSessionEffects(session){let list=pending.get(session)??[];return list.length>0&&pending.set(session,[]),list}function flushDirty(){scheduled=!1;for(let[session,sink]of[...dirty]){dirty.delete(session);let drained=drainSessionEffects(session);drained.length>0&&sinks.has(sink)&&sink.flush(session,drained)}}function installSessionEffectSink(sink){return sinks.add(sink),()=>{sinks.delete(sink);for(let[session,owner]of[...dirty])owner===sink&&(dirty.delete(session),drainSessionEffects(session))}}var sessions=new WeakMap,ClientAdmissions=class _ClientAdmissions{constructor(session){this.records=new Map,this.pending=new Map,this.restoring=!0,this.hasIdentities=!1,this.session=session;let durableSessionId=session.sessionManager.getSessionId();this.durableSessionId=durableSessionId;for(let entry of session.sessionManager.getEntries()){if(entry.type!=="custom"||entry.customType!==CLIENT_ADMISSION_ENTRY)continue;let parsed=clientAdmissionRecordSchema.safeParse(entry.data);parsed.success&&parsed.data.durableSessionId===durableSessionId&&this.records.set(parsed.data.clientMessageId,parsed.data)}this.hasIdentities=[...this.records.values()].some(record=>record.hostMinted!==!0);for(let record of[...this.records.values()])record.state==="running"&&this.save({...record,state:"completed",outcome:EFFECT_OUTCOMES.inputInterruptedByReopen});this.unsubscribeAgent=session.agent.subscribe(event=>{if(this.durableSessionId!==session.sessionManager.getSessionId()||event.type!=="message_start"||event.message.role!=="user")return;let identity=readClientMessageIdentity(event.message),record=identity.clientMessageId?this.records.get(identity.clientMessageId):void 0;record?.state==="queued"&&this.save({...record,state:"running",prepared:void 0})}),this.unsubscribeSession=session.subscribe(event=>{if(!(this.restoring||this.durableSessionId!==session.sessionManager.getSessionId())){if(event.type==="agent_start")this.lastAbort=void 0;else if(event.type==="agent_end")event.willRetry||(this.turnOutcome=this.endOutcome(event.messages));else if(event.type==="agent_idle"){let outcome=this.turnOutcome??{kind:"completed"};this.turnOutcome=void 0,this.turnAbortedBy=void 0,this.lastAbort=void 0;for(let record of this.records.values())record.state==="running"&&this.save({...record,state:"completed",outcome})}else if(event.type==="queue_update"){let queuedIds=new Set(event.ordered.map(input=>input.clientMessageId)),consumingId=readClientMessageIdentity(session.agent.state.streamingMessage).clientMessageId;for(let record of this.records.values())record.state==="queued"&&!queuedIds.has(record.clientMessageId)&&this.save({...record,state:consumingId===record.clientMessageId?"running":"completed",prepared:void 0})}}}),this.ready=Promise.resolve().then(()=>this.restore())}static clearQueuedFor(session){sessions.get(session)?.clearQueued()}static sealQueuedOnReplace(runtime){return runtime.onBeforeSessionReplace(()=>sessions.get(runtime.session)?.dropQueuedByReplace())}static forSession(session){let admissions=sessions.get(session);return admissions&&admissions.durableSessionId!==session.sessionManager.getSessionId()&&(admissions.unsubscribeAgent(),admissions.unsubscribeSession(),admissions=void 0),admissions||(admissions=new _ClientAdmissions(session),sessions.set(session,admissions)),admissions}record(clientMessageId){return this.records.get(clientMessageId)}editQueuedText(clientMessageId,text){let record=this.records.get(clientMessageId);record?.state==="queued"&&this.save({...record,prepared:{...record.prepared,text}})}noteAbort(by,effectId){this.session.isStreaming&&(this.turnAbortedBy=by);let abort={connectionId:by.connectionId,...effectId===void 0?{}:{effectId}};return this.lastAbort=abort,abort}get abortedBy(){return this.lastAbort}forgetAbort(abort){this.lastAbort===abort&&(this.lastAbort=void 0)}clearQueued(){if(this.durableSessionId===this.session.sessionManager.getSessionId())for(let record of[...this.records.values()])record.state==="queued"&&this.save({...record,state:"completed",prepared:void 0,outcome:EFFECT_OUTCOMES.inputCleared})}dropQueuedByReplace(){if(this.durableSessionId===this.session.sessionManager.getSessionId())for(let record of[...this.records.values()])record.state==="queued"&&this.save({...record,state:"completed",prepared:void 0,outcome:EFFECT_OUTCOMES.inputDroppedByReplace})}endOutcome(messages){let abortSource=this.session.currentAbortSource;if(abortSource!==void 0)return{kind:"aborted",reason:"aborted",detail:"the turn was aborted before it finished",abortSource,...this.turnAbortedBy===void 0?{}:{abortedBy:this.turnAbortedBy}};let last=messages.at(-1);return last?.role==="assistant"&&last.stopReason==="error"?turnErrorOutcome(last.errorMessage):{kind:"completed"}}async restore(){try{let queued=[...this.records.values()].filter(record=>record.state==="queued").sort((left,right)=>left.prepared.enqueueOrder-right.prepared.enqueueOrder);for(let record of queued)await this.session.restoreQueuedInput(record.prepared)}finally{this.restoring=!1}}save(record){this.session.sessionManager.appendCustomEntry(CLIENT_ADMISSION_ENTRY,record),this.records.set(record.clientMessageId,record),noteSessionEffect(this.session,projectAdmission(record))}async admit(command,invoke){let ledger=this;return admitClientInput.call({ready:this.ready,get hasIdentities(){return ledger.hasIdentities},set hasIdentities(value){ledger.hasIdentities=value},session:this.session,records:this.records,pending:this.pending,save:record=>this.save(record)},command,invoke)}};var EFFECT_CRASH_ENV="SENPI_TEST_RPC_EFFECT_CRASH";function effectCrashPoint(phase,kind,state){process.env[EFFECT_CRASH_ENV]===`${phase}:${kind}:${state}`&&process.kill(process.pid,"SIGKILL")}var ledgers=new WeakMap,latestCache=new WeakMap;function latestSessionEffect(session){let entries=session.sessionManager.getEntries(),cached=latestCache.get(session);if(cached?.entries===entries.length)return cached.latest;let latest;for(let index=entries.length-1;index>=0;index--){let entry=entries[index];if(entry?.type==="custom"){if(entry.customType===RPC_EFFECT_ENTRY){let parsed=rpcEffectRecordSchema.safeParse(entry.data);if(parsed.success){latest=projectEffect(parsed.data);break}}else if(entry.customType===CLIENT_ADMISSION_ENTRY){let parsed=clientAdmissionRecordSchema.safeParse(entry.data);if(parsed.success){latest=projectAdmission(parsed.data);break}}}}return latestCache.set(session,{entries:entries.length,latest}),latest}var EffectLedger=class _EffectLedger{constructor(session){this.records=new Map,this.session=session,this.admissions=ClientAdmissions.forSession(session),this.durableSessionId=session.sessionManager.getSessionId();let switchedBy=new Set,thinkingBy=new Set;for(let entry of session.sessionManager.getEntries()){if(entry.type==="model_change"&&entry.effectId!==void 0&&switchedBy.add(entry.effectId),entry.type==="thinking_level_change"&&entry.effectId!==void 0&&thinkingBy.add(entry.effectId),entry.type!=="custom"||entry.customType!==RPC_EFFECT_ENTRY)continue;let parsed=rpcEffectRecordSchema.safeParse(entry.data);parsed.success&&parsed.data.durableSessionId===this.durableSessionId&&this.records.set(parsed.data.effectId,parsed.data)}this.sealOnReopen(switchedBy,thinkingBy),this.unsubscribe=session.subscribe(event=>{if(this.durableSessionId===session.sessionManager.getSessionId()){if(event.type==="model_changed"&&event.origin.effectId!==void 0){let record=this.records.get(event.origin.effectId);record?.kind==="set_model"&&!isTerminalEffectState(record.state)&&this.transition(record.effectId,"done",{disposition:"applied"})}else if(event.type==="model_change_cancelled"&&event.origin.effectId!==void 0){let record=this.records.get(event.origin.effectId);record?.kind==="set_model"&&!isTerminalEffectState(record.state)&&this.transition(record.effectId,"failed",{outcome:event.reason==="context-budget"?contextBudgetOutcome(event.detail??"the target model cannot hold the repaired context"):event.reason==="error"?modelSwitchErrorOutcome(event.detail??"the model switch failed"):EFFECT_OUTCOMES.setModelSuperseded})}else if(event.type==="agent_idle")for(let record of[...this.records.values()])record.kind==="abort"&&record.state==="applied"&&this.transition(record.effectId,"done")}})}static sealOnReplace(runtime){return runtime.onBeforeSessionReplace(()=>{let ledger=ledgers.get(runtime.session);if(!(!ledger||ledger.durableSessionId!==runtime.session.sessionManager.getSessionId()))for(let record of[...ledger.records.values()])record.kind==="set_model"&&!isTerminalEffectState(record.state)&&ledger.transition(record.effectId,"failed",{outcome:EFFECT_OUTCOMES.setModelDroppedByReplace})})}static forSession(session){let ledger=ledgers.get(session);return ledger&&ledger.durableSessionId!==session.sessionManager.getSessionId()&&(ledger.unsubscribe(),ledger=void 0),ledger||(ledger=new _EffectLedger(session),ledgers.set(session,ledger)),ledger}sealOnReopen(switchedBy,thinkingBy){for(let record of[...this.records.values()])if(!isTerminalEffectState(record.state))switch(record.kind){case"abort":this.transition(record.effectId,"done",{disposition:"no_active_turn",outcome:EFFECT_OUTCOMES.abortInterruptedByReopen});break;case"set_model":switchedBy.has(record.effectId)?this.transition(record.effectId,"done",{disposition:"applied"}):this.transition(record.effectId,"failed",{outcome:EFFECT_OUTCOMES.setModelInterruptedByReopen});break;case"unload":this.transition(record.effectId,"done");break;case"set_thinking_level":thinkingBy.has(record.effectId)?this.transition(record.effectId,"done",{disposition:"applied"}):this.transition(record.effectId,"failed",{outcome:EFFECT_OUTCOMES.setThinkingInterruptedByReopen});break;case"dequeue":this.transition(record.effectId,"failed",{outcome:EFFECT_OUTCOMES.dequeueInterruptedByReopen});break;case"edit_queued":this.transition(record.effectId,"failed",{outcome:EFFECT_OUTCOMES.editQueuedInterruptedByReopen});break;default:{let unsealed=record.kind;throw new Error(`no reopen seal for effect kind ${unsealed}`)}}}async begin(command,effectId,payload,by){await this.session.sessionManager.persistHeaderNow();let fingerprint=effectFingerprint(command,payload),existing=this.records.get(effectId);if(existing){if(existing.fingerprint!==fingerprint)throw new EffectIdConflict(effectId);return{replay:projectEffect(existing)}}let now=new Date().toISOString(),record={effectId,kind:command,state:"accepted",by,acceptedAt:now,updatedAt:now,durableSessionId:this.durableSessionId,fingerprint};return this.append(record),{record}}transition(effectId,state,patch={}){let current2=this.records.get(effectId);if(!current2)throw new Error(`No effect ${effectId} in session ${this.durableSessionId}`);return this.append({...current2,...patch,state,updatedAt:new Date().toISOString()}),this.statusOf(effectId)}status(effectId,sessionId){let record=this.records.get(effectId);if(record)return projectEffect(record,sessionId);let admission=this.admissions.record(effectId);return admission===void 0?void 0:projectAdmission(admission,sessionId)}statusOf(effectId){let status=this.status(effectId);if(!status)throw new Error(`No effect ${effectId} in session ${this.durableSessionId}`);return status}append(record){effectCrashPoint("before",record.kind,record.state),this.session.sessionManager.appendCustomEntry(RPC_EFFECT_ENTRY,record),this.records.set(record.effectId,record),noteSessionEffect(this.session,projectEffect(record)),effectCrashPoint("after",record.kind,record.state)}};import{randomUUID as randomUUID2}from"node:crypto";import{mkdir,rm,writeFile}from"node:fs/promises";import{join}from"node:path";import{setTimeout as delay}from"node:timers/promises";import{Worker}from"node:worker_threads";var RECURSIVE_WATCH_WORKER_SOURCE=`
|
|
3
|
-
const { watch } = require("node:fs");
|
|
4
|
-
const { parentPort } = require("node:worker_threads");
|
|
5
|
-
|
|
6
|
-
if (!parentPort) throw new Error("Recursive watch worker requires a parent port");
|
|
7
|
-
|
|
8
|
-
const watchers = new Map();
|
|
9
|
-
const cancelled = new Set();
|
|
10
|
-
const isCancelled = (message) =>
|
|
11
|
-
cancelled.has(message.id) || (message.active !== undefined && Atomics.load(message.active, 0) === 0);
|
|
12
|
-
// senpi#4999: one batch per subscription is in flight until the main thread acks it; events
|
|
13
|
-
// arriving meanwhile are deduplicated here, so a busy main thread never builds a backlog.
|
|
14
|
-
const MAX_PENDING_EVENTS = 256;
|
|
15
|
-
const outboxes = new Map();
|
|
16
|
-
const deliver = (id, eventType, filename) => {
|
|
17
|
-
let outbox = outboxes.get(id);
|
|
18
|
-
if (!outbox) {
|
|
19
|
-
outbox = { inFlight: false, overflow: false, pending: new Map() };
|
|
20
|
-
outboxes.set(id, outbox);
|
|
21
|
-
}
|
|
22
|
-
if (!outbox.inFlight) {
|
|
23
|
-
outbox.inFlight = true;
|
|
24
|
-
parentPort.postMessage({ kind: "events", id, events: [{ eventType, filename }] });
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
if (outbox.overflow) return;
|
|
28
|
-
outbox.pending.set(JSON.stringify([eventType, filename]), { eventType, filename });
|
|
29
|
-
if (outbox.pending.size > MAX_PENDING_EVENTS) {
|
|
30
|
-
outbox.overflow = true;
|
|
31
|
-
outbox.pending.clear();
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
const flush = (id) => {
|
|
35
|
-
const outbox = outboxes.get(id);
|
|
36
|
-
if (!outbox) return;
|
|
37
|
-
if (outbox.overflow) {
|
|
38
|
-
outbox.overflow = false;
|
|
39
|
-
parentPort.postMessage({ kind: "events", id, events: [{ eventType: "rename", filename: null }] });
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
if (outbox.pending.size === 0) {
|
|
43
|
-
outbox.inFlight = false;
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
const events = [...outbox.pending.values()];
|
|
47
|
-
outbox.pending.clear();
|
|
48
|
-
parentPort.postMessage({ kind: "events", id, events });
|
|
49
|
-
};
|
|
50
|
-
parentPort.on("message", (message) => {
|
|
51
|
-
if (message.kind === "ack") {
|
|
52
|
-
flush(message.id);
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
if (message.kind === "unwatch") {
|
|
56
|
-
cancelled.add(message.id);
|
|
57
|
-
outboxes.delete(message.id);
|
|
58
|
-
watchers.get(message.id)?.close();
|
|
59
|
-
watchers.delete(message.id);
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
if (message.kind !== "watch") return;
|
|
63
|
-
if (isCancelled(message)) return;
|
|
64
|
-
try {
|
|
65
|
-
const watcher = watch(
|
|
66
|
-
message.path,
|
|
67
|
-
{ recursive: message.recursive !== false, encoding: "utf8" },
|
|
68
|
-
(eventType, filename) => {
|
|
69
|
-
if (isCancelled(message)) return;
|
|
70
|
-
deliver(message.id, eventType, typeof filename === "string" ? filename : null);
|
|
71
|
-
},
|
|
72
|
-
);
|
|
73
|
-
if (isCancelled(message)) {
|
|
74
|
-
watcher.close();
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
watcher.on("error", (error) => {
|
|
78
|
-
parentPort.postMessage({
|
|
79
|
-
kind: "error",
|
|
80
|
-
id: message.id,
|
|
81
|
-
message: error instanceof Error ? error.message : String(error),
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
watchers.set(message.id, watcher);
|
|
85
|
-
} catch (error) {
|
|
86
|
-
parentPort.postMessage({
|
|
87
|
-
kind: "error",
|
|
88
|
-
id: message.id,
|
|
89
|
-
message: error instanceof Error ? error.message : String(error),
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
`;function createRecursiveWatchWorker(){return new Worker(RECURSIVE_WATCH_WORKER_SOURCE,{eval:!0})}var recursiveWorkerStates=new Map;function isRecursiveWatchMessage(message){return typeof message!="object"||message===null||!("kind"in message)||!("id"in message)||typeof message.id!="number"?!1:message.kind==="error"?"message"in message&&typeof message.message=="string":message.kind==="events"?"events"in message&&Array.isArray(message.events):message.kind==="event"&&"eventType"in message&&typeof message.eventType=="string"&&"filename"in message&&(message.filename===null||typeof message.filename=="string")}var WORKER_OFFLOADED_WATCH_PLATFORMS=new Set(["linux","darwin"]);function createFsWatchEventSource(onError=()=>{},options={}){let createWorker=options.createRecursiveWorker??createRecursiveWatchWorker,state=recursiveWorkerStates.get(createWorker);state||(state={subscriptions:new Map,nextSubscriptionId:1},recursiveWorkerStates.set(createWorker,state));let recursiveSubscriptions=state.subscriptions,ensureRecursiveWorker=()=>{if(state.worker)return state.worker;let worker=createWorker();return worker.on("message",message=>{if(!isRecursiveWatchMessage(message))return;if(message.kind==="events"){try{let subscription2=recursiveSubscriptions.get(message.id);if(subscription2)for(let event of message.events)subscription2.listener(event.eventType,event.filename)}finally{state.worker===worker&&worker.postMessage({kind:"ack",id:message.id})}return}let subscription=recursiveSubscriptions.get(message.id);if(subscription){if(message.kind==="event"){subscription.listener(message.eventType,message.filename);return}subscription.onError(new Error(message.message),subscription.path)}}),worker.on("error",error=>{for(let subscription of recursiveSubscriptions.values())subscription.onError(error,subscription.path);if(state.worker!==worker||(state.worker=void 0,recursiveSubscriptions.size===0))return;let replacement=ensureRecursiveWorker();for(let[id,subscription]of recursiveSubscriptions)replacement.postMessage({kind:"watch",id,path:subscription.path,recursive:subscription.recursive,active:subscription.active})}),state.worker=worker,worker};return(path,listener,watchOptions)=>{if(WORKER_OFFLOADED_WATCH_PLATFORMS.has(options.platform??process.platform)){let id=state.nextSubscriptionId++,recursive=watchOptions?.recursive??!1,active=new Int32Array(new SharedArrayBuffer(4));Atomics.store(active,0,1),ensureRecursiveWorker().postMessage({kind:"watch",id,path,recursive,active}),recursiveSubscriptions.set(id,{path,listener,recursive,active,onError});let closing;return()=>{if(!recursiveSubscriptions.delete(id))return closing;Atomics.store(active,0,0);let worker=state.worker;if(!worker)return closing;if(worker.postMessage({kind:"unwatch",id}),!(recursiveSubscriptions.size>0))return state.worker=void 0,worker.unref?.(),closing=worker.terminate().then(()=>{},error=>{throw onError(error,path),error}),closing}}let watcher=watchWithErrorHandler(path,listener,()=>onError(new Error(`fs.watch failed for ${path}`),path),{recursive:watchOptions?.recursive??!1});return()=>watcher?.close()}}var REASON_PRIORITY=["submission","draft_cleared","idle","continue","command","emitted","inbox"],EMPTY_RESULT={admitted:[]},WakeScheduler=class{constructor(pass,onError){this.running=!1,this.disposed=!1,this.pass=pass,this.onError=onError}request(reason,deliveryIds){if(this.disposed)return Promise.resolve(EMPTY_RESULT);this.next??={reasons:new Set,deliveryIds:new Set,waiters:[]};let batch=this.next;batch.reasons.add(reason);for(let id of deliveryIds??[])batch.deliveryIds.add(id);let settled=new Promise(resolve=>batch.waiters.push(resolve));return this.running||this.run(),settled}dispose(){this.disposed=!0;let batch=this.next;this.next=void 0;for(let waiter of batch?.waiters??[])waiter(EMPTY_RESULT)}async run(){this.running=!0;try{for(let batch=this.next;batch!==void 0&&!this.disposed;batch=this.next){this.next=void 0;let result=EMPTY_RESULT;try{result=await this.pass(wakeEvent(batch))}catch(error){this.onError(error)}for(let waiter of batch.waiters)waiter(result)}}finally{this.running=!1}}};function wakeEvent(batch){let reasons=REASON_PRIORITY.filter(reason2=>batch.reasons.has(reason2)),reason=reasons[0]??"inbox",ids=[...batch.deliveryIds];return{type:"session_control_wake",reason,reasons,...ids.length>0?{delivery_ids:ids}:{}}}var INBOX_ENGINE_ENTRY_PREFIX=".senpi-",INBOX_ARM_ATTEMPTS=25,INBOX_ARM_ATTEMPT_MS=200;async function watchInbox(inboxDir,onChange,onError){await mkdir(inboxDir,{recursive:!0,mode:448});let sentinel=`${INBOX_ENGINE_ENTRY_PREFIX}armed-${randomUUID2()}`,confirmation=Promise.withResolvers(),stopped=!1,unsubscribe=createFsWatchEventSource(error=>onError(error))(inboxDir,(_eventType,filename)=>{filename===sentinel?confirmation.resolve(!0):filename?.startsWith(INBOX_ENGINE_ENTRY_PREFIX)||onChange()},{recursive:!1}),arming=confirmArm(join(inboxDir,sentinel),confirmation.promise,()=>stopped).then(confirmed=>{!confirmed&&!stopped&&onError(new Error(`inbox watch on ${inboxDir} was not confirmed`))},error=>{stopped||onError(error)});return{armed:Promise.race([confirmation.promise.then(confirmed=>confirmed?void 0:arming),arming]),stop:()=>{stopped=!0,confirmation.resolve(!1),Promise.resolve(unsubscribe()).catch(onError)}}}async function confirmArm(sentinelPath,confirmed,stopped){let seen=!1;try{for(let attempt=0;attempt<INBOX_ARM_ATTEMPTS&&!seen&&!stopped();attempt++)await writeFile(sentinelPath,String(attempt),{mode:384}),seen=await Promise.race([confirmed,delay(INBOX_ARM_ATTEMPT_MS,!1)])}finally{await rm(sentinelPath,{force:!0})}return seen}function onProcessContinue(listener){let handler=()=>{setImmediate(listener)};return process.on("SIGCONT",handler),()=>{process.removeListener("SIGCONT",handler)}}import{randomUUID as randomUUID3}from"node:crypto";import{createPublicKey,verify}from"node:crypto";var P=(1n<<255n)-19n,L=(1n<<252n)+27742317777372353535851937790883648493n;function mod(value){let r=value%P;return r<0n?r+P:r}function pow(base,exponent){let result=1n,b=mod(base);for(let e=exponent;e>0n;e>>=1n)e&1n&&(result=mod(result*b)),b=mod(b*b);return result}var D=mod(-121665n*pow(121666n,P-2n)),I=pow(2n,(P-1n)/4n),IDENTITY={x:0n,y:1n,z:1n,t:0n};function add(p,q){let a=mod((p.y-p.x)*(q.y-q.x)),b=mod((p.y+p.x)*(q.y+q.x)),c=mod(2n*D*p.t*q.t),d=mod(2n*p.z*q.z),e=b-a,f=d-c,g=d+c,h=b+a;return{x:mod(e*f),y:mod(g*h),z:mod(f*g),t:mod(e*h)}}function times(point,scalar2){let result=IDENTITY,addend=point;for(let s=scalar2;s>0n;s>>=1n)s&1n&&(result=add(result,addend)),addend=add(addend,addend);return result}function isIdentity(p){return mod(p.x)===0n&&mod(p.y-p.z)===0n}function littleEndian(bytes){let value=0n;for(let i=bytes.length-1;i>=0;i--)value=value<<8n|BigInt(bytes[i]??0);return value}function decodePoint(bytes){if(bytes.length!==32)return;let sign=(bytes[31]??0)>>7&1,y=littleEndian(bytes)&(1n<<255n)-1n;if(y>=P)return;let u=mod(y*y-1n),v=mod(D*y*y+1n),x=mod(u*pow(v,3n)*pow(mod(u*pow(v,7n)),(P-5n)/8n)),vx2=mod(v*x*x);if(vx2===mod(-u))x=mod(x*I);else if(vx2!==u)return;if(!(x===0n&&sign===1))return Number(x&1n)!==sign&&(x=mod(-x)),{x,y,z:1n,t:mod(x*y)}}function smallOrder(p){return isIdentity(times(p,8n))}function strictEd25519Refusal(publicKey,signature){if(publicKey.length!==32||signature.length!==64)return"length";let a=decodePoint(publicKey),r=decodePoint(signature.subarray(0,32));if(!a||!r)return"encoding";if(smallOrder(a)||smallOrder(r))return"small_order";if(!isIdentity(times(a,L)))return"not_prime_order";if(littleEndian(signature.subarray(32))>=L)return"scalar"}function strictEd25519Verify(publicKey,message,signature){if(strictEd25519Refusal(publicKey,signature)!==void 0)return!1;let key=createPublicKey({key:{kty:"OKP",crv:"Ed25519",x:Buffer.from(publicKey).toString("base64url")},format:"jwk"});return verify(null,message,key,signature)}import{createDecipheriv,createHmac,createPublicKey as createPublicKey2,diffieHellman}from"node:crypto";var KEM_SUITE=Buffer.from([75,69,77,0,32]),HPKE_SUITE=Buffer.from([72,80,75,69,0,32,0,1,0,2]),VERSION=Buffer.from("HPKE-v1"),P2=(1n<<255n)-19n,LOW_ORDER_U=new Set([0n,1n,325606250916557431795983626356110631294008115727848805560023387167927233504n,39382357235489614581723060781553021112529911719440698176882885853963445705823n,P2-1n]);function extract(salt,ikm){return createHmac("sha256",salt.length===0?Buffer.alloc(32):salt).update(ikm).digest()}function expand(prk,info,length){let blocks=[],previous=Buffer.alloc(0);for(let i=1;Buffer.concat(blocks).length<length;i++)previous=createHmac("sha256",prk).update(Buffer.concat([previous,info,Buffer.from([i])])).digest(),blocks.push(previous);return Buffer.concat(blocks).subarray(0,length)}function labeledExtract(suite,salt,label,ikm){return extract(salt,Buffer.concat([VERSION,suite,Buffer.from(label),ikm]))}function labeledExpand(suite,prk,label,info,length){let prefix=Buffer.from([length>>8,length&255]);return expand(prk,Buffer.concat([prefix,VERSION,suite,Buffer.from(label),info]),length)}function strictX25519(raw){if(raw.length!==32||((raw[31]??0)&128)!==0)return!1;let u=0n;for(let i=31;i>=0;i--)u=u<<8n|BigInt(raw[i]??0);return u<P2&&!LOW_ORDER_U.has(u)}function x25519Key(raw){return createPublicKey2({key:{kty:"OKP",crv:"X25519",x:Buffer.from(raw).toString("base64url")},format:"jwk"})}function openSecretAnswer(input){if(!strictX25519(input.enc)||!strictX25519(input.recipientPublicKey)||input.ct.length<16)return;let dh=diffieHellman({privateKey:input.privateKey,publicKey:x25519Key(input.enc)});if(dh.length!==32||dh.every(byte=>byte===0))return;let kemContext=Buffer.concat([input.enc,input.recipientPublicKey]),eaePrk=labeledExtract(KEM_SUITE,Buffer.alloc(0),"eae_prk",dh),sharedSecret=labeledExpand(KEM_SUITE,eaePrk,"shared_secret",kemContext,32),pskIdHash=labeledExtract(HPKE_SUITE,Buffer.alloc(0),"psk_id_hash",Buffer.alloc(0)),infoHash=labeledExtract(HPKE_SUITE,Buffer.alloc(0),"info_hash",Buffer.from(input.info)),context=Buffer.concat([Buffer.from([0]),pskIdHash,infoHash]),secret=labeledExtract(HPKE_SUITE,sharedSecret,"secret",Buffer.alloc(0)),key=labeledExpand(HPKE_SUITE,secret,"key",context,32),nonce=labeledExpand(HPKE_SUITE,secret,"base_nonce",context,12),tag=input.ct.subarray(input.ct.length-16),plaintext;try{let decipher=createDecipheriv("aes-256-gcm",key,nonce).setAAD(input.aad);return decipher.setAuthTag(tag),plaintext=decipher.update(input.ct.subarray(0,input.ct.length-16)),decipher.final(),plaintext}catch{plaintext?.fill(0);return}finally{key.fill(0),sharedSecret.fill(0),secret.fill(0),dh.fill(0)}}import{createHash as createHash3,generateKeyPair}from"node:crypto";function b64url(bytes){return Buffer.from(bytes).toString("base64url")}function sha256b64url(text){return createHash3("sha256").update(text,"utf8").digest("base64url")}function is32ByteB64url(value){return/^[A-Za-z0-9_-]{43}$/.test(value)&&Buffer.from(value,"base64url").length===32}function secretDisplayHash(title,placeholder){return sha256b64url(JSON.stringify([title,placeholder??null]))}function secretBinding(input){let displayHash=secretDisplayHash(input.title,input.placeholder);if(!Number.isSafeInteger(input.deadlineAtMs)||![input.hostJkt,input.hpkePk].every(is32ByteB64url))throw new Error("secret_binding_malformed");return["omo-secret-binding-v1",input.hostInstance,input.hostJkt,input.durableSessionId,input.uiRequestId,input.deadlineAtMs,input.hpkePk,displayHash]}function secretRequestHash(binding){return sha256b64url(JSON.stringify(binding))}function secretAnswerInfo(req){return Buffer.concat([Buffer.from("omo-secret-answer-v1"),Buffer.from([0]),Buffer.from(req,"base64url")])}function secretAnswerAad(req,principalId,grantId,answerId,jti){return Buffer.from(JSON.stringify(["omo-secret-answer-aad-v1",req,principalId,grantId,answerId,jti]))}function secretAnswerTranscript(ids,jti,enc,ct){let sealed=createHash3("sha256").update(enc).update(ct).digest("base64url");return`omo-secret-answer-v1
|
|
94
|
-
${JSON.stringify([ids.req,ids.principalId,ids.grantId,ids.answerId,jti,sealed])}`}function secretCancelTranscript(ids){return`omo-secret-answer-v1
|
|
95
|
-
${JSON.stringify([ids.req,ids.principalId,ids.grantId,ids.answerId,"cancel"])}`}function unpadSecretValue(plaintext){if(plaintext.length<256||plaintext.length>65536)return;let bytes=Buffer.from(plaintext.buffer,plaintext.byteOffset,plaintext.byteLength),length=bytes.readUInt32BE(0),size=256;for(;size<4+length;)size*=2;if(!(size!==bytes.length||bytes.subarray(4+length).some(byte=>byte!==0)))try{return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(bytes.subarray(4,4+length))}catch{return}}function secretRequestTranscript(binding){return`omo-secret-request-v1
|
|
96
|
-
${JSON.stringify(binding)}`}function generateSecretRequestKey(){return new Promise((resolve,reject)=>{generateKeyPair("x25519",(error,publicKey,privateKey)=>{if(error)return reject(error);let{x}=publicKey.export({format:"jwk"});if(typeof x!="string")return reject(new Error("secret_request_key_unavailable"));resolve({hpkePk:b64url(Buffer.from(x,"base64url")),privateKey})})})}var LINE_ID_MAX=128,CT_MIN=272,CT_MAX=65552,VALUE_KEYS=["type","id","v","grantId","uiRequestId","answerId","stepup","enc","ct","sig"],CANCEL_KEYS=["type","id","v","grantId","uiRequestId","answerId","cancelled","sig"];function bounded(value,max){return typeof value=="string"&&value.length>=1&&value.length<=max}function base64url(value,min,max){if(typeof value!="string"||!/^[A-Za-z0-9_-]+$/.test(value))return;let bytes=Buffer.from(value,"base64url");return bytes.length>=min&&bytes.length<=max&&bytes.toString("base64url")===value?bytes:void 0}function parseSealedAnswer(value){if(!isRecord(value)||value.type!=="mcp_presenter_secret_answer"||value.v!==1)return;let keys=Object.keys(value).sort(),cancel=value.cancelled===!0;if(keys.join()!==[...cancel?CANCEL_KEYS:VALUE_KEYS].sort().join())return;let{id,grantId,uiRequestId,answerId,sig}=value;if(!bounded(id,LINE_ID_MAX)||!bounded(grantId,256)||!bounded(uiRequestId,256)||!bounded(answerId,256)||typeof sig!="string"||!/^[0-9a-f]{128}$/.test(sig))return;let frame={id,grantId,uiRequestId,answerId,sig:Buffer.from(sig,"hex")};if(cancel)return frame;let enc=base64url(value.enc,32,32),ct=base64url(value.ct,CT_MIN,CT_MAX);if(!(!enc||!ct||!bounded(value.stepup,8192)))return{...frame,value:{stepup:value.stepup,enc,ct}}}function jtiOf(token){try{let claims=JSON.parse(Buffer.from(token.split(".")[1]??"","base64url").toString("utf8"));return isRecord(claims)&&bounded(claims.jti,256)?claims.jti:void 0}catch{return}}function rawKey(key){let{x}=key.export({format:"jwk"});return Buffer.from(typeof x=="string"?x:"","base64url")}async function checkSealedAnswer(context){let{frame,principal,req}=context,ids={req,principalId:principal.id,grantId:frame.grantId,answerId:frame.answerId},jti=frame.value?jtiOf(frame.value.stepup):void 0;if(frame.value&&jti===void 0)return{ok:!1,error:"invalid_secret_response"};let transcript=frame.value&&jti!==void 0?secretAnswerTranscript(ids,jti,frame.value.enc,frame.value.ct):secretCancelTranscript(ids);if(!strictEd25519Verify(rawKey(principal.key),Buffer.from(transcript),frame.sig))return{ok:!1,error:"invalid_secret_response"};if(!frame.value)return{ok:!0};let verify2=context.account.verifySecretAnswer;if(!verify2)return{ok:!1,error:"secret_stepup_refused"};let result;try{let spki=principal.key.export({type:"spki",format:"der"});result=await verify2.call(context.account,frame.value.stepup,spki,req,Math.floor(Date.now()/1e3))}catch{return{ok:!1,error:"secret_stepup_refused"}}if(!result.ok)return{ok:!1,error:"secret_stepup_refused"};let{stepUp}=result,host=context.account.hostAccount();return stepUp.jti!==jti||host===void 0||stepUp.acc!==host||stepUp.acc!==principal.acc||stepUp.dev!==principal.dev||context.hostToken===void 0||stepUp.hdev!==context.hostToken.dev||!Number.isSafeInteger(stepUp.exp)||stepUp.exp*1e3>context.deadlineAtMs?{ok:!1,error:"secret_stepup_refused"}:{ok:!0,jti,exp:stepUp.exp}}function openSealedValue(answer,key,hpkePk){if(!answer.value)return;let{req,principal,grantId,answerId}=answer,plaintext=openSecretAnswer({privateKey:key,recipientPublicKey:Buffer.from(hpkePk,"base64url"),enc:Buffer.from(answer.value.enc,"base64url"),ct:Buffer.from(answer.value.ct,"base64url"),info:secretAnswerInfo(req),aad:secretAnswerAad(req,principal,grantId,answerId,answer.value.jti)});if(!plaintext)return;let value=unpadSecretValue(plaintext);return plaintext.fill(0),value}function isGrantSelectRequest(record){return"type"in record&&record.type==="extension_ui_request"&&"method"in record&&record.method==="select"&&"grantSelect"in record&&record.grantSelect===!0&&"id"in record&&typeof record.id=="string"}function answeredUiRequestId(frame){return typeof frame.uiRequestId=="string"?frame.uiRequestId:typeof frame.id=="string"?frame.id:void 0}function settledQuestionStatus(answers,comment){return comment?.trim()?"comment-submitted":Object.keys(answers).length>0?"answered":void 0}function unansweredQuestionIds(questions,answers){return questions.filter(question=>!answers[question.id]?.selected.length&&!answers[question.id]?.text?.trim()).map(question=>question.id)}function settleExtensionUiResponse(response,targets){if(response.answerId!==void 0&&(typeof response.answerId!="string"||response.answerId.length<1||response.answerId.length>256))return refusedExtensionUiResponse(response.id,"invalid_answer_id");let requestId=answeredUiRequestId(response)??response.id,receipt=response.answerId===void 0?void 0:targets.ledger?.lookup(requestId,response.answerId);if(receipt==="replay")return{...reply(response.id),success:!0,disposition:"replay"};if(receipt==="already_answered")return{...reply(response.id),success:!1,error:"already_answered",disposition:receipt};let answer=requestId===response.id?response:{...response,id:requestId},question=targets.questions.respond(answer,targets.beforeAnswer);return typeof question=="string"?refusedExtensionUiResponse(response.id,response.answerId!==void 0&&question==="question_already_resolved"?"unknown_extension_ui_request":question):question||targets.dialogs.resolve(answer,targets.beforeAnswer)?(targets.ledger?.record(requestId,response.answerId),{...reply(response.id),success:!0,disposition:"applied"}):targets.routed||response.answerId!==void 0?refusedExtensionUiResponse(response.id,"unknown_extension_ui_request"):void 0}function reply(id){return{id,type:"response",command:"extension_ui_response"}}function extensionUiProgressReply(id,outcome){let head={id,type:"response",command:"extension_ui_progress"};return outcome==="applied"?{...head,success:!0}:{...head,success:!1,error:outcome}}function refusedExtensionUiResponse(id,error){let disposition=error==="question_already_resolved"?"already_answered":error==="unknown_extension_ui_request"?"unknown":void 0;return{...reply(id),success:!1,error,...disposition===void 0?{}:{disposition}}}var SecretInputRequests=class{constructor(route,admit){this.pending=new Map,this.receipts=new Map,this.route=route,this.admit=admit,route.bindSealedResponder?.({settled:(id,answerId,principal)=>this.pending.has(id)?void 0:this.receipt(id,answerId,principal),respond:(answer,claim)=>this.respondSealed(answer,claim)})}input(title,placeholder,opts,created){if(opts?.signal?.aborted)return Promise.resolve(void 0);let timeout=resolveSecretInputTimeout(opts),id=randomUUID3(),refused2=this.route.select(id,()=>this.pending.get(id)?.finish("unavailable"));return refused2?Promise.reject(new SecretInputUnavailableError(refused2)):new Promise(resolve=>{let deadline2=Date.now()+timeout,disarm,onAbort=()=>finish("cancelled"),finish=(outcome,value,winnerGrant)=>{this.pending.delete(id)&&(disarm?.(),opts?.signal?.removeEventListener("abort",onAbort),this.remember(id),this.route.send(id,{type:"secret_input_settled",id,outcome}),this.route.sealedOutcome?.(id,outcome,winnerGrant),this.route.settled(id),resolve(value))},sealed=this.route.sealed?.(id)===!0;if(this.pending.set(id,{deadline:deadline2,finish}),opts?.signal?.addEventListener("abort",onAbort,{once:!0}),disarm=armSecretInputDeadline(deadline2,()=>finish("timed_out")),created?.(id),opts?.signal?.aborted)return finish("cancelled");this.route.send(id,{type:"extension_ui_request",id,method:"input",secret:!0,title,...placeholder===void 0?{}:{placeholder},timeout,deadlineAtMs:deadline2,...opts?.toolCallId===void 0?{}:{toolCallId:opts.toolCallId},...opts?.parentToolCallId===void 0?{}:{parentToolCallId:opts.parentToolCallId}}),sealed&&this.offerSealed(id,{title,placeholder,deadlineAtMs:deadline2})})}offerSealed(id,offer){generateSecretRequestKey().then(key=>{let pending2=this.pending.get(id);pending2&&(pending2.key=key.privateKey,pending2.hpkePk=key.hpkePk,this.route.offerSealed?.(id,{hpkePk:key.hpkePk,...offer}))},()=>this.pending.get(id)?.finish("unavailable"))}has(id){return this.pending.has(id)||this.receipts.has(id)}answered(){return[...this.receipts].filter(entry=>entry[1]!==void 0&&entry[1].principal===void 0&&this.route.accepts(entry[0])).slice(-64).map(([uiRequestId,receipt])=>({uiRequestId,answerId:receipt.answerId}))}respond(frame){let id=typeof frame.id=="string"?frame.id:"",requestId=answeredUiRequestId(frame);if(!requestId||!this.route.accepts(requestId))return refusedExtensionUiResponse(id,"secret_answer_refused");if(!this.has(requestId))return refusedExtensionUiResponse(id,"unknown_extension_ui_request");let allowed=new Set(["type","id","uiRequestId","answerId","sessionId","secret","value","cancelled"]);if(frame.secret!==!0||typeof frame.id!="string"||typeof frame.answerId!="string"||frame.answerId.length<1||frame.answerId.length>256||Object.keys(frame).some(key=>!allowed.has(key))||!("value"in frame?!("cancelled"in frame)&&typeof frame.value=="string"&&isSecretInputValue(frame.value):frame.cancelled===!0))return refusedExtensionUiResponse(id,"invalid_secret_response");let pending2=this.pending.get(requestId),reply2={type:"response",command:"extension_ui_response",id};if(!pending2){let receipt=this.receipts.get(requestId);return receipt?.answerId===frame.answerId&&receipt.principal===void 0?{...reply2,success:!0,disposition:"replay"}:receipt===void 0?refusedExtensionUiResponse(id,"unknown_extension_ui_request"):{...reply2,success:!1,error:"already_answered",disposition:"already_answered"}}return Date.now()>=pending2.deadline?(pending2.finish("timed_out"),refusedExtensionUiResponse(id,"unknown_extension_ui_request")):(this.admit(),pending2.finish(frame.cancelled===!0?"cancelled":"answered",typeof frame.value=="string"?frame.value:void 0),this.receipts.set(requestId,{answerId:frame.answerId}),{...reply2,success:!0,disposition:"applied"})}respondSealed(answer,claim){let id=answer.uiRequestId,pending2=this.pending.get(id);if(!pending2)return this.receipt(id,answer.answerId,answer.principal);if(answer.value&&!claim.admitJti(answer.value.jti,answer.value.exp))return{error:"secret_stepup_refused"};if(Date.now()>=pending2.deadline)return pending2.finish("timed_out"),{error:"unknown_extension_ui_request"};if(!claim.current())return{error:"secret_answer_refused"};let value;if(answer.value){if(!pending2.key||pending2.hpkePk===void 0)return{error:"invalid_secret_response"};try{value=openSealedValue(answer,pending2.key,pending2.hpkePk)}catch{value=void 0}if(value===void 0||!isSecretInputValue(value))return{error:"invalid_secret_response"}}return this.admit(),pending2.finish(answer.value?"answered":"cancelled",value,answer.grantId),this.receipts.set(id,{answerId:answer.answerId,principal:answer.principal}),{disposition:"applied"}}receipt(id,answerId,principal){let receipt=this.receipts.get(id);return receipt===void 0?{error:"unknown_extension_ui_request"}:receipt.answerId===answerId&&receipt.principal===principal?{disposition:"replay"}:{error:"already_answered"}}answerLocal(id,value){let pending2=this.pending.get(id);pending2&&(pending2.finish(value===void 0?"cancelled":"answered",value),this.receipts.set(id,{answerId:"terminal"}))}cancelAll(outcome="cancelled"){for(let pending2 of[...this.pending.values()])pending2.finish(outcome)}recheck(){for(let[id,pending2]of this.pending)this.route.available(id)||pending2.finish("unavailable")}dispose(){this.close(),this.route.bindSealedResponder?.(void 0)}close(){this.cancelAll();for(let id of this.receipts.keys())this.route.forget(id);this.receipts.clear()}remember(id){if(this.receipts.set(id,void 0),this.receipts.size>1024){let oldest=this.receipts.keys().next().value;oldest!==void 0&&(this.receipts.delete(oldest),this.route.forget(oldest))}}};async function answerSealedFrame(connection,value,source,target){let frame=parseSealedAnswer(value);if(!frame)return{error:"invalid_secret_response"};let found=target(frame.uiRequestId),holder=found&&source?[...found.sealed].find(grant=>grant.id===frame.grantId&&source.connectionOf(grant)===connection):void 0,latch=found?.latch;if(!source||!holder||!latch||!source.eligible(holder))return{error:"secret_answer_refused"};let principal=source.principalOf(holder),settled=principal===void 0?void 0:latch.settled(frame.uiRequestId,frame.answerId,principal);if(settled)return settled;let checked=await source.answer(holder,frame);return"error"in checked||"disposition"in checked?checked:latch.respond(checked,{current:()=>source.eligible(holder),admitJti:(jti,exp)=>source.admitJti(jti,exp)})}var TerminalSealedSecrets=class{constructor(source,sessionId,admit){this.owners=new Map,this.source=source,this.sessionId=sessionId,this.requests=new SecretInputRequests(this.route(),admit),this.unsubscribe=source.onChange(()=>this.requests.recheck())}open(title,placeholder,opts){let id,result=this.requests.input(title,placeholder,opts,created=>{id=created});if(id===void 0){result.catch(()=>{});return}return{id,result}}receive(connection,frame){return answerSealedFrame(connection,frame,this.source,id=>{let sealed=this.owners.get(id);return sealed&&{sealed,latch:this.latch}})}dispose(){this.unsubscribe(),this.requests.close()}route(){return{select:id=>{let holders2=this.source.holders(this.sessionId);if(holders2.size===0)return"no_presenter";this.owners.set(id,holders2)},accepts:()=>!1,available:()=>!0,presenter:()=>{},send:()=>{},sealed:id=>this.owners.has(id),raiser:()=>!1,offerSealed:(id,offer)=>{let holders2=this.owners.get(id);holders2&&this.source.offer(this.sessionId,holders2,{uiRequestId:id,...offer})},sealedOutcome:(id,outcome,winnerGrant)=>{let holders2=this.owners.get(id);holders2&&this.source.settle(holders2,id,outcome,winnerGrant)},bindSealedResponder:latch=>{this.latch=latch},settled:id=>this.source.retire(id),forget:id=>{this.owners.delete(id),this.source.withdraw(id)}}}};function raceTerminalSecretInput(sealed,local,title,placeholder,opts){let dismiss=new AbortController,signal=opts?.signal?AbortSignal.any([opts.signal,dismiss.signal]):dismiss.signal,opened=opts?.secret?sealed?.open(title,placeholder,{...opts,signal}):void 0;return!sealed||!opened?local(opts):(local({...opts,signal}).then(value=>sealed.requests.answerLocal(opened.id,value),()=>dismiss.abort()),opened.result.finally(()=>dismiss.abort()))}import{randomUUID as randomUUID4}from"node:crypto";var carriers=new WeakMap,producers=new WeakMap;function setSessionRecoveryEpoch(session,epoch){producers.get(session)?.reset(epoch)}function recoveryCarrier(record){return carriers.get(record)}function carryRecovery(from,to){let carrier=carriers.get(from);return carrier!==void 0&&from!==to&&carriers.set(to,carrier),carryExecutionCallKey(from,to),to}var SessionRecoveryIdentity=class{constructor(epoch=randomUUID4(),owner){this.byMessage=new WeakMap,this.epoch=epoch,owner&&producers.set(owner,this)}reset(epoch){epoch!==this.epoch&&(this.epoch=epoch,this.openAssistant=void 0,this.byMessage=new WeakMap)}hint(event,durableEntryId){let carrier=carriers.get(event);carrier&&durableEntryId&&carriers.set(event,{...carrier,durableEntryId})}own(control){this.openAssistant!==void 0&&carriers.set(control,{messageId:this.openAssistant,epoch:this.epoch})}observe(event){let message=event.message;if(message===void 0||carriers.has(event)||event.type!=="message_start"&&event.type!=="message_update"&&event.type!=="message_end")return;let assistant=message.role==="assistant",known=assistant?this.openAssistant:this.byMessage.get(message),messageId=event.type==="message_start"?randomUUID4():known??(event.type==="message_end"?randomUUID4():void 0);if(messageId===void 0)return;assistant&&(this.openAssistant=event.type==="message_end"?void 0:messageId),this.byMessage.set(message,messageId);let carrier={messageId,epoch:this.epoch};carriers.set(event,carrier),carriers.set(message,carrier)}};var REMOTE_ORIGIN_INVALID="remote_origin_invalid: remoteOrigin must be { deviceId: non-empty string, deviceName?: non-empty string }",REMOTE_ORIGIN_FIXED="remote_origin_fixed: a connection's remoteOrigin cannot change after it is declared";function boundedText(value,max){return typeof value=="string"&&value.length>0&&value.length<=max}function parseRemoteOrigin(value){if(value===void 0)return;if(typeof value!="object"||value===null||Array.isArray(value))return"invalid";let deviceId=Reflect.get(value,"deviceId"),deviceName=Reflect.get(value,"deviceName");return Object.keys(value).some(key=>key!=="deviceId"&&key!=="deviceName")||!boundedText(deviceId,256)?"invalid":deviceName===void 0?{deviceId}:boundedText(deviceName,256)?{deviceId,deviceName}:"invalid"}function remoteOriginDeclaration(value,accepts){let origin=parseRemoteOrigin(value);return origin==="invalid"?{refusal:REMOTE_ORIGIN_INVALID}:origin!==void 0&&!accepts(origin)?{refusal:REMOTE_ORIGIN_FIXED}:{origin}}function sameRemoteOrigin(a,b){return a.deviceId===b.deviceId&&a.deviceName===b.deviceName}function remoteOriginField(origin){return origin===void 0?{}:{remoteOrigin:origin}}function originField(origin){return origin===void 0?{}:{origin}}var sessionQuestionBridges=new WeakMap,ConnectionQuestionBridge=class{constructor(output,changed,raiser=()=>{},origin=()=>{}){this.pending=new Map,this.resolved=new Set,this.output=output,this.changed=changed,this.raiser=raiser,this.origin=origin}pendingQuestions(){return[...this.pending.values()].map(({frame})=>({...frame,remainingMs:Math.max(0,frame.deadlineAtMs-Date.now())}))}ask(request,opts){let id=crypto.randomUUID(),askedAtMs=Date.now(),timeout=opts?.timeout??request.timeoutMs,frame={type:"extension_ui_request",method:"question",id,requestId:request.requestId,toolCallId:request.requestId,waitForAnswer:request.waitForAnswer,questions:request.questions,raisedBy:this.raiser()??"agent",...remoteOriginField(this.origin()),timeout,askedAtMs,deadlineAtMs:askedAtMs+timeout,remainingMs:timeout};return new Promise(resolve=>{let answers={},comment,timer,finished=!1,claimed=!1,unanswered=()=>unansweredQuestionIds(request.questions,answers),finish=(status,resolvedBy,cancelOrigin)=>{if(finished)return;finished=!0,clearTimeout(timer),opts?.signal?.removeEventListener("abort",cancel),this.pending.delete(id),this.changed?.({type:"ui_request_settled",uiRequestId:id,disposition:status==="answered"||status==="comment-submitted"?"answered":"cancelled"}),this.resolved.add(id);let result={status,...resolvedBy!==void 0?{resolvedBy}:{},answers,comment,unanswered:unanswered(),...status==="timed_out"?{autoResolvedAfterMs:Date.now()-askedAtMs}:{},...cancelOrigin!==void 0?{cancelOrigin}:{}};this.output({type:"question_resolved",id,requestId:frame.requestId,toolCallId:frame.toolCallId,outcome:status,...result.resolvedBy!==void 0?{resolvedBy:result.resolvedBy}:{},answers,comment,unanswered:result.unanswered,deadlineAtMs:frame.deadlineAtMs}),resolve(result)},cancel=()=>{let reason=opts?.signal?.reason;finish(reason==="timed_out"?"timed_out":"cancelled")},arm=()=>{clearTimeout(timer),frame.deadlineAtMs=Date.now()+timeout,timer=setTimeout(()=>finish("timed_out"),timeout)};this.pending.set(id,{frame,cancel,progress:draft=>claimed?"question_already_resolved":(draft.answers!==void 0&&(answers=draft.answers),draft.comment!==void 0&&(comment=draft.comment),arm(),opts?.onProgress?.({answers,comment}),finished||this.output({type:"question_updated",id,deadlineAtMs:frame.deadlineAtMs,remainingMs:Math.max(0,frame.deadlineAtMs-Date.now())}),"applied"),respond:(response,beforeAnswer)=>{if(claimed)return"question_already_resolved";if("cancelled"in response)return finish("cancelled",void 0,"user"),!0;if(!("answers"in response))return!1;answers=response.answers,comment=response.comment;let status=settledQuestionStatus(answers,comment);if(status===void 0)return!1;if(request.waitForAnswer&&opts?.deliver!=="user-message"){claimed=!0;try{beforeAnswer?.()}finally{claimed=!1}if(finished)return"question_already_resolved"}return finish(status,"rpc_connection"),!0}}),arm(),this.changed?.({type:"ui_request_pending",uiRequestId:id,method:"question",request:frame}),this.output(frame),opts?.signal?.addEventListener("abort",cancel,{once:!0}),opts?.signal?.aborted&&cancel()})}respond(response,beforeAnswer){let pending2=this.pending.get(response.id);if(pending2){let result=pending2.respond(response,beforeAnswer);return result===!1?"question_incomplete":result}return this.resolved.has(response.id)?"question_already_resolved":!1}progress(draft){let pending2=this.pending.get(draft.id);return pending2?pending2.progress(draft):this.resolved.has(draft.id)?"question_already_resolved":"unknown_extension_ui_request"}cancelAll(){for(let pending2 of this.pending.values())pending2.cancel()}};async function degradeQuestion(ui,request,opts){let askedAtMs=Date.now(),answers={},other="Other (type an answer)";for(let question of request.questions){if(opts?.signal?.aborted)break;let selected=await ui.select(question.question,[...question.options.map(option=>option.label),other],opts);if(opts?.signal?.aborted)break;if(selected===other){let text=await ui.input(question.question,void 0,opts);text?.trim()&&(answers[question.id]={selected:[],text})}else selected!==void 0&&(answers[question.id]={selected:[selected]});answers[question.id]!==void 0&&opts?.onProgress?.({answers:{...answers}})}let unanswered=unansweredQuestionIds(request.questions,answers);if(opts?.signal?.aborted){let timedOut=opts.signal.reason==="timed_out";return{status:timedOut?"timed_out":"cancelled",answers,unanswered,...timedOut?{autoResolvedAfterMs:Date.now()-askedAtMs}:{}}}let status=settledQuestionStatus(answers,void 0);return{status:status??"cancelled",...status!==void 0?{resolvedBy:"rpc_connection"}:{},answers,unanswered}}var sessionDialogRequests=new WeakMap,SessionExtensionUiRequests=class{constructor(changed){this.pending=new Map,this.claimed=new Set,this.changed=changed}set(id,request){this.pending.set(id,request),this.changed?.(request.frame?{type:"ui_request_pending",uiRequestId:id,method:request.frame.method,request:request.frame}:void 0)}delete(id){this.pending.delete(id)&&this.changed?.({type:"ui_request_settled",uiRequestId:id,disposition:"cancelled"})}snapshot(){return[...this.pending.values()].flatMap(request=>request.frame?[request.frame]:[])}resolve(response,beforeAnswer){let request=this.pending.get(response.id);if(!request||this.claimed.has(response.id))return!1;this.claimed.add(response.id);try{beforeAnswer?.()}finally{this.claimed.delete(response.id)}return this.pending.get(response.id)!==request?!1:(this.pending.delete(response.id),this.changed?.({type:"ui_request_settled",uiRequestId:response.id,disposition:"cancelled"in response?"cancelled":"answered"}),request.resolve(response),!0)}cancelAll(){for(let[id,request]of this.pending)this.delete(id),request.resolve({type:"extension_ui_response",id,cancelled:!0})}close(){for(let[id,request]of this.pending)this.delete(id),request.reject(new Error("Extension UI request cancelled: session closed"))}};var SESSION_CONTEXT_PATCH_LIMITS={keyPattern:/^[a-z][a-z0-9_]{0,63}$/,valueChars:256,overlayBytes:4096},RESERVED_SESSION_CONTEXT_KEYS=new Set(["host_socket","host_instance","shard_key","tree_key","parent_session_id","root_session_id"]);function refuse(reason,action){return{refusal:{reason,action}}}function applyContextPatch(overlay,patch){let shape='send patch as an object of lowercase keys to string, number, boolean or null values, e.g. { "task_status": "running" }';if(typeof patch!="object"||patch===null||Array.isArray(patch))return refuse("patch must be an object",shape);let entries=Object.entries(patch);if(entries.length===0)return refuse("patch has no keys",shape);let merged={...overlay};for(let[key,value]of entries){if(!SESSION_CONTEXT_PATCH_LIMITS.keyPattern.test(key))return refuse(`key "${key}" must match ${SESSION_CONTEXT_PATCH_LIMITS.keyPattern.source}`,"rename the key to lowercase letters, digits and underscores");if(RESERVED_SESSION_CONTEXT_KEYS.has(key))return refuse(`key "${key}" is set by the host and cannot be patched`,"drop that key from the patch; the host keeps it current");if(typeof value=="string"&&value.length>SESSION_CONTEXT_PATCH_LIMITS.valueChars)return refuse(`value for "${key}" is ${value.length} characters, at most ${SESSION_CONTEXT_PATCH_LIMITS.valueChars} are accepted`,"shorten the value or store it elsewhere and publish a reference");if(typeof value=="number"&&!Number.isFinite(value))return refuse(`value for "${key}" must be a finite number`,shape);if(value!==null&&typeof value!="string"&&typeof value!="number"&&typeof value!="boolean")return refuse(`value for "${key}" must be a string, number, boolean or null`,shape);merged[key]=value}let bytes=Buffer.byteLength(JSON.stringify(merged));return bytes>SESSION_CONTEXT_PATCH_LIMITS.overlayBytes?refuse(`patched context would be ${bytes} bytes, at most ${SESSION_CONTEXT_PATCH_LIMITS.overlayBytes} are accepted`,"remove keys with null or shorten values before adding more"):{overlay:merged}}function publishedSessionContext(base,overlay){if(overlay===void 0)return base;let published={...base};for(let[key,value]of Object.entries(overlay))value===null?delete published[key]:published[key]=value;return published}function observeLifecycle(lifecycle){return{...lifecycle,observedAt:new Date(Date.now()).toISOString()}}function observeLifecycleDelivery(record){if(!("type"in record))return record;if(record.type==="session_lifecycle")return observeState(record);if(record.type!=="response"||!("command"in record)||!("data"in record))return record;let data=record.data;return typeof data!="object"||data===null?record:record.command==="get_state"?{...record,data:observeState(data)}:record.command==="open_session"&&"state"in data&&typeof data.state=="object"&&data.state!==null?{...record,data:{...data,state:observeState(data.state)}}:record}function observeState(state){return!("lifecycle"in state)||typeof state.lifecycle!="object"||state.lifecycle===null?state:{...state,lifecycle:observeLifecycle(state.lifecycle)}}import{AsyncLocalStorage as AsyncLocalStorage2}from"node:async_hooks";var clientInputContext=new AsyncLocalStorage2;function correlatedRecord(record){let type="type"in record?record.type:void 0;if(type==="entry_appended"){let entry="entry"in record?record.entry:void 0;return typeof entry=="object"&&entry!==null&&"type"in entry&&entry.type==="message"}return typeof type=="string"&&(type==="turn_start"||type==="turn_end"||type.startsWith("message_")||type.startsWith("tool_execution_")||type==="session_abort"||type==="agent_end")}var ClientMessageEvents=class{constructor(emit,enabled){this.inputs=[],this.active=[],this.sawUser=!1,this.emit=emit,this.enabled=enabled}accept(event){if(!this.enabled()){this.emit(event);return}if(event.type==="skill_invocation"||event.type==="command_invocation"){this.emit({...event,...clientInputContext.getStore()});return}if(event.type==="turn_start"&&(this.flush(),this.prefix=[],this.inputs=[],this.sawUser=!1),event.type==="message_start"&&event.message.role==="custom"&&!this.sawUser&&(this.active=[]),event.type==="message_start"&&event.message.role==="user"){this.sawUser||(this.active=[]),this.sawUser=!0;let identity=clientFacingIdentity(readClientMessageIdentity(event.message));(identity.clientMessageId!==void 0||identity.clientTurnId!==void 0)&&this.inputs.push(identity),this.active=this.inputs,this.flush()}(event.type==="message_start"&&event.message.role==="assistant"||event.type==="agent_end"||event.type==="agent_idle")&&this.flush(),this.prefix?this.prefix.push(event):this.output(event)}flush(){if(!this.prefix)return;this.sawUser&&(this.active=this.inputs);let prefix=this.prefix;this.prefix=void 0;for(let event of prefix)this.output(event)}output(event){let identity="message"in event&&event.message.role==="user"?clientFacingIdentity(readClientMessageIdentity(event.message)):this.active.at(-1);this.emit(correlatedRecord(event)&&identity?carryRecovery(event,{...event,...identity,...this.active.length>1?{clientMessages:this.active}:{}}):event)}};function subscribeSessionRecords(session,output,onAbortSource=()=>{},source=listener=>session.subscribe(listener)){let correlatedEvents=new ClientMessageEvents(output,()=>ClientAdmissions.forSession(session).hasIdentities);return source(event=>{if(event.type==="session_lifecycle"){let{sessionId:_sessionId,...record}=event;output({...record,lifecycle:observeLifecycle(event.lifecycle)});return}if(event.type==="skill_invocation"){correlatedEvents.accept(event);return}if(event.type==="command_invocation"){correlatedEvents.accept(event);return}if(event.type==="queue_update"){correlatedEvents.accept({...event,ordered:event.ordered.map(clientFacingIdentity)});return}if(event.type==="thinking_level_changed"||event.type==="model_changed"){let thinkingSelection=session.thinkingSelection;output(thinkingSelection===void 0?event:{...event,thinkingSelection});return}if(event.type==="agent_end"){let abortSource=session.currentAbortSource;abortSource!==void 0&&onAbortSource(abortSource);let deadline2=session.currentDeadline,abortedBy=abortSource===void 0?void 0:ClientAdmissions.forSession(session).abortedBy;correlatedEvents.accept({...event,...abortSource===void 0?{}:{aborted:!0,abortSource},...abortedBy===void 0?{}:{abortedBy},...deadline2===void 0?{}:{deadline:deadline2}});return}if(event.type==="session_abort"){let abortedBy=ClientAdmissions.forSession(session).abortedBy;correlatedEvents.accept(abortedBy===void 0?event:{...event,abortedBy});return}correlatedEvents.accept(event)})}var FORWARDABLE_CLASSES=new Set(["observe","drive","answer","thread","device_admin"]),MAX_PRINCIPAL_FIELD=256,MAX_CONN_FIELD=64,DECLARABLE_ROLES=new Set(["interactive_user","task_parent"]);function parseDeclaration(record){let principal=Reflect.get(record,"principal");if(typeof principal!="object"||principal===null||Array.isArray(principal))return"principal must be an object";let deviceId=Reflect.get(principal,"deviceId"),deviceName=Reflect.get(principal,"deviceName"),conn=Reflect.get(principal,"conn");if(!boundedString(deviceId,MAX_PRINCIPAL_FIELD))return"principal.deviceId must be 1-256 characters";if(deviceName!==void 0&&!boundedString(deviceName,MAX_PRINCIPAL_FIELD))return"principal.deviceName must be 1-256 characters";if(conn!==void 0&&!boundedString(conn,MAX_CONN_FIELD))return"principal.conn must be 1-64 characters";let granted=Reflect.get(record,"granted");if(!Array.isArray(granted))return"granted must be an array of method classes";let classes=new Set;for(let entry of granted){if(typeof entry!="string"||!FORWARDABLE_CLASSES.has(entry)||classes.has(entry))return"granted holds each of observe, drive, answer, thread, device_admin at most once";classes.add(entry)}let roles=parseRoles(Reflect.get(record,"roles"));return typeof roles=="string"?roles:{...roles===void 0?{}:{roles},principal:{deviceId,...deviceName===void 0?{}:{deviceName},...conn===void 0?{}:{conn}},granted:classes}}function samePrincipal(a,b){return a.deviceId===b.deviceId&&a.deviceName===b.deviceName&&a.conn===b.conn}function parseRoles(value){if(value===void 0)return;let invalid="roles holds each of interactive_user, task_parent at most once";if(!Array.isArray(value))return invalid;let roles=new Set;for(let entry of value){if(typeof entry!="string"||!DECLARABLE_ROLES.has(entry)||roles.has(entry))return invalid;roles.add(entry)}return roles}function boundedString(value,max){return typeof value=="string"&&value.length>=1&&value.length<=max}function resolveDelegation(retained,wire){if(retained!==void 0&&(retained.mode!==wire.mode||!samePrincipal(retained.principal,wire.principal)))return{resolution:{kind:"conflict"}};if(wire.mode==="legacy")return{resolution:{kind:"use",descriptor:retained??wire}};let incarnation=wire.incarnation;if(incarnation===void 0||wire.authority===void 0||incarnationOf(wire.authority)!==incarnation)return{resolution:{kind:"conflict"}};if(retained===void 0)return{resolution:{kind:"use",descriptor:wire},retain:wire};let kept=retained.incarnation??0;return incarnation===kept?{resolution:{kind:"use",descriptor:retained}}:incarnation<kept?{resolution:{kind:"stale",descriptor:wire}}:retained.authority===void 0||!readAuthority(retained.authority).retired?{resolution:{kind:"conflict"}}:{resolution:{kind:"use",descriptor:wire},retain:wire}}var CONNECTION_ROLE_CAPABILITIES=[INTERACTIVE_USER_CAPABILITY,TASK_PARENT_CAPABILITY],SOLE_CONNECTION="sole-connection";function roleConnection(connectionId){return connectionId??SOLE_CONNECTION}var CONNECTION_ROLE_FIXED="connection_role_fixed: interactive_user and task_parent cannot change after they are declared",DELEGATION_INCARNATION_STALE="delegation_incarnation_stale: this declaration was made before detach_connection; declare again",UNTAGGED=0,ConnectionRoles=class{constructor(){this.claims=new Map,this.origins=new Map,this.retained=new Map}useDelegations(source){this.source=source}viewOf(connectionId){if(this.source)return this.source(connectionId);let descriptor=this.retained.get(connectionId);return descriptor===void 0?void 0:{descriptor,closed:!1}}isStale(connectionId,incarnation){let view=this.viewOf(connectionId);if(view?.descriptor.mode!=="host")return incarnation!==void 0;let current2=view.descriptor.incarnation;return this.source===void 0?incarnation===void 0||incarnation<(current2??0):view.closed||incarnation!==current2}declare(connectionId,capabilities,incarnation){if(this.isStale(connectionId,incarnation))return"stale";let roles=CONNECTION_ROLE_CAPABILITIES.filter(role=>capabilities.includes(role)),key=incarnation??UNTAGGED,prior=this.claims.get(connectionId)?.get(key);return prior!==void 0?prior.length===roles.length&&prior.every(role=>roles.includes(role))?"declared":"fixed":(this.claimsOf(connectionId).set(key,roles),"declared")}claimsOf(connectionId){let claims=this.claims.get(connectionId);return claims===void 0&&(claims=new Map,this.claims.set(connectionId,claims)),claims}rolesOf(connectionId,incarnation){return this.claims.get(roleConnection(connectionId))?.get(incarnation??UNTAGGED)}adopt(connectionId,roles,incarnation){let claims=this.claimsOf(connectionId),key=incarnation??UNTAGGED;for(let older of claims.keys())older<key&&claims.delete(older);claims.has(key)||claims.set(key,[...roles])}retain(connectionId,wire){let{resolution,retain}=resolveDelegation(this.retained.get(connectionId),wire);return retain!==void 0&&this.retained.set(connectionId,retain),resolution}acceptsOrigin(connectionId,origin){if(this.viewOf(connectionId)!==void 0)return!0;let prior=this.origins.get(connectionId);return prior===void 0||sameRemoteOrigin(prior,origin)}declareOrigin(connectionId,origin){this.viewOf(connectionId)===void 0&&this.acceptsOrigin(connectionId,origin)&&this.origins.set(connectionId,origin)}originOf(connectionId){let key=roleConnection(connectionId),principal=this.viewOf(key)?.descriptor.principal;return principal===void 0?this.origins.get(key):principal.deviceName===void 0?{deviceId:principal.deviceId}:{deviceId:principal.deviceId,deviceName:principal.deviceName}}has(connectionId,role){let key=roleConnection(connectionId),store2=commandAuthority.getStore();if(store2!==void 0&&roleConnection(store2.connection)===key)return store2.has(role,this.rolesOf(key,store2.incarnation));let descriptor=this.viewOf(key)?.descriptor,claim=this.rolesOf(key,descriptor?.incarnation);return descriptor?.mode!=="host"||descriptor.authority===void 0?claim?.includes(role)??!1:effectiveRoles(claim,readAuthority(descriptor.authority)).includes(role)}release(connectionId){let descriptor=this.viewOf(connectionId)?.descriptor;if(descriptor?.mode!=="host"){this.claims.delete(connectionId),this.origins.delete(connectionId);return}let claims=this.claims.get(connectionId),current2=descriptor.incarnation??UNTAGGED;for(let key of claims?.keys()??[])key<current2&&claims?.delete(key)}forget(connectionId){this.claims.delete(connectionId),this.origins.delete(connectionId),this.retained.delete(connectionId)}clear(){this.claims.clear(),this.origins.clear(),this.retained.clear()}};var EVENT_RESYNC_CAPABILITY="event_resync";function isCorrelatedReply(value){return typeof value=="object"&&value!==null&&"type"in value&&value.type==="response"&&"id"in value&&typeof value.id=="string"}var SocketPeerLivenessError=class extends Error{constructor(){super("socket peer missed its liveness ping"),this.name="SocketPeerLivenessError"}},SocketPeerRecovery=class{constructor(write){this.awaitingPing=!1,this.pingBuffered=!1,this.replyLost=!1,this.write=write,this.pingBuffered=!0,this.write(serializeJsonLine({type:"rpc_ping"}))}get pending(){return this.reason!==void 0}shed(reason){this.reason??=reason}acknowledge(){this.awaitingPing=!1}loseReply(){this.replyLost=!0}ping(){if(this.awaitingPing)throw new SocketPeerLivenessError;this.awaitingPing=!0,this.pingBuffered||(this.pingBuffered=!0,this.write(serializeJsonLine({type:"rpc_ping"})))}takeGap(){let reason=this.reason;this.reason=void 0,this.awaitingPing=!1,this.pingBuffered=!1;let replyLost=this.replyLost;return this.replyLost=!1,serializeJsonLine({type:"resync_required",reason,replyLost})}};var COMPACT_UPDATES_CAPABILITY="compact_message_updates_v1",COMPACT_PAIR=[COMPACT_UPDATES_CAPABILITY,EVENT_RESYNC_CAPABILITY],CompactSelection=class{constructor(){this.capabilities=[],this.selected=!1,this.admitted=!1,this.refused=!1}declare(next,supported,roles){if(this.refused)return"compact_selection_refused";let caps=next??this.capabilities,compact=compactUpdatesEnabled()&&caps.includes(COMPACT_UPDATES_CAPABILITY),pair=compact&&caps.includes(EVENT_RESYNC_CAPABILITY),refusal=compact&&!pair?"compact_pair_required":compact&&!supported?"compact_endpoint_unsupported":this.selected&&!pair||this.admitted&&pair!==this.selected?"compact_selection_fixed":void 0;if(refusal)return!this.selected&&compact&&!this.admitted&&(this.refused=!0),refusal;if(next!==void 0&&!roles(caps))return compact&&!this.selected&&!this.admitted&&(this.refused=!0),"connection_role_fixed";this.capabilities=caps.filter(cap=>cap!==COMPACT_EVENTS_CAPABILITY&&(compactUpdatesEnabled()||cap!==COMPACT_UPDATES_CAPABILITY)),this.selected=pair}wireCapabilities(caps,enabled){return enabled?this.selected?[...caps,COMPACT_EVENTS_CAPABILITY]:caps:caps.filter(cap=>cap!==COMPACT_EVENTS_CAPABILITY)}ack(){return this.selected?{capabilities:[...COMPACT_PAIR]}:void 0}};function advertisedCompactCapabilities(caps,supported){if(!compactUpdatesEnabled())return[...caps];let legacy=caps.filter(cap=>cap!==COMPACT_UPDATES_CAPABILITY&&cap!==COMPACT_EVENTS_CAPABILITY);return supported?[...new Set([...legacy,...COMPACT_PAIR])]:legacy}function declarationReply(record,selection){let response=record;return response.type!=="response"||response.command!=="set_client_info"?record:response.id===void 0?compactUpdatesEnabled()?void 0:record:response.success&&selection?.selected?{...record,data:selection.ack()}:record}function sessionDeclaration(options,command,current2,declare,replace,incarnation){let caps=command.capabilities;if(caps!==void 0){if(!options.clientInfo&&compactUpdatesEnabled()&&caps.includes(COMPACT_UPDATES_CAPABILITY))return{capabilities:current2,refusal:"compact_endpoint_unsupported"};let verdict=declare(caps,incarnation);if(verdict==="stale")return{capabilities:current2,refusal:DELEGATION_INCARNATION_STALE};if(verdict==="fixed")return{capabilities:current2,refusal:CONNECTION_ROLE_FIXED};if(!options.clientInfo)replace(caps);else if(options.clientInfo.setCapabilities(options.clientInfo.connectionId(),caps,incarnation)==="stale")return{capabilities:current2,refusal:DELEGATION_INCARNATION_STALE}}return{capabilities:caps??current2,refusal:void 0,grantChanged:current2?.includes("grant_select")===!0!=((caps??current2)?.includes("grant_select")===!0)}}async function availableModelsData(session){let registry=session.modelRegistry;return{models:(await registry.modelRuntime.getAvailable()).map(model=>{let serviceTier=registry.getServiceTier(model),upstreamModelId=registry.getUpstreamModelId(model);return{...model,...serviceTier===void 0?{}:{serviceTier},...upstreamModelId===void 0?{}:{upstreamModelId},supportedThinkingLevels:getSupportedThinkingLevels2(model),supportsAssistantPrefill:modelSupportsAssistantPrefill(model,{thinkingEnabled:session.thinkingLevel!=="off"})}})}}function unsupportedThinkingLevel(level){return`Thinking level ${String(level)} is not supported by the active model.`}async function interruptRunningTurn(session,requestedTurnId,stop){if(!session.isStreaming&&session.retryAttempt===0)return{interrupted:!1};let turnId=String(session.externalAdmission.turnEpoch);return typeof requestedTurnId=="string"&&requestedTurnId!==turnId?{interrupted:!1,turnId}:(await stop(),{interrupted:!0,turnId})}import{open}from"node:fs/promises";var EFFECT_LOOKUP_CHUNK_BYTES=4*1024*1024,TranscriptUnreadable=class extends Error{constructor(path,cause){let reason=`transcript_unreadable: ${cause instanceof Error?cause.message:String(cause)}`;super(reason),this.code="transcript_unreadable",this.action="check the sessionPath, or query the loaded session by sessionId; do not treat this as not found",this.name="TranscriptUnreadable",this.path=path,this.reason=reason}},headerSchema=external_exports.object({type:external_exports.literal("session"),id:external_exports.string()}),customEntrySchema=external_exports.object({type:external_exports.literal("custom"),customType:external_exports.string(),data:external_exports.unknown()}),NEWLINE=10;async function lookupEffectInTranscript(path,effectId){let handle;try{handle=await open(path,"r")}catch(cause){throw new TranscriptUnreadable(path,cause)}try{let size=(await handle.stat()).size,durableSessionId=await readHeaderId(handle,path,size),end=size,carry=Buffer.alloc(0);for(;end>0;){let start=Math.max(0,end-EFFECT_LOOKUP_CHUNK_BYTES),chunk=Buffer.alloc(end-start);await handle.read(chunk,0,chunk.length,start);let data=Buffer.concat([chunk,carry]);end=start;let firstNewline=start===0?-1:data.indexOf(NEWLINE);if(start>0&&firstNewline===-1){carry=data;continue}carry=start===0?Buffer.alloc(0):data.subarray(0,firstNewline);let effect=newestInLines(data.subarray(firstNewline+1).toString("utf8"),effectId,durableSessionId);if(effect)return{found:!0,effect}}return{found:!1,searched:"complete"}}catch(cause){throw cause instanceof TranscriptUnreadable?cause:new TranscriptUnreadable(path,cause)}finally{await handle.close()}}async function readHeaderId(handle,path,size){let head=Buffer.alloc(Math.min(size,65536));await handle.read(head,0,head.length,0);let newline=head.indexOf(NEWLINE),line=head.subarray(0,newline===-1?head.length:newline).toString("utf8"),header=headerSchema.safeParse(parseJson(line));if(!header.success)throw new TranscriptUnreadable(path,new Error("the file has no session header"));return header.data.id}function newestInLines(text,effectId,durableSessionId){let lines=text.split(`
|
|
97
|
-
`),encodedId=JSON.stringify(effectId).slice(1,-1);for(let index=lines.length-1;index>=0;index--){let line=lines[index];if(!line?.includes(encodedId))continue;let entry=customEntrySchema.safeParse(parseJson(line));if(entry.success){if(entry.data.customType===RPC_EFFECT_ENTRY){let record=rpcEffectRecordSchema.safeParse(entry.data.data);if(record.success&&record.data.effectId===effectId&&record.data.durableSessionId===durableSessionId)return projectEffect(record.data)}else if(entry.data.customType===CLIENT_ADMISSION_ENTRY){let record=clientAdmissionRecordSchema.safeParse(entry.data.data);if(record.success&&record.data.clientMessageId===effectId&&record.data.durableSessionId===durableSessionId)return projectAdmission(record.data)}}}}function parseJson(line){try{return JSON.parse(line)}catch{return}}function respond(id,response){return{...response,id,type:"response",success:!0}}function refuse2(id,command,message,errorCode,errorData){return{id,type:"response",command,success:!1,error:message,...errorCode===void 0?{}:{errorCode},...errorData===void 0?{}:{errorData}}}function effectAnswer(status,sessionId,replayed=!1){let effect=sessionId===void 0?status:{...status,sessionId};return{effectId:status.effectId,state:status.state,effect,...replayed?{replayed:!0}:{}}}async function beginEffect(ctx,kind,command){try{return await EffectLedger.forSession(ctx.session).begin(kind,command.effectId,command,ctx.by)}catch(cause){if(!(cause instanceof EffectIdConflict))throw cause;return refuse2(command.id,command.type,cause.message,RPC_ERROR_EFFECT_ID_CONFLICT,{effectId:cause.effectId,reason:cause.reason,action:cause.action})}}function isResponse(value){return"type"in value}function isEffectBegin(value){return!isResponse(value)}function invalidGrace(command){let{graceMs}=command;if(graceMs===void 0||isAbortGraceInRange(graceMs))return;let reason="invalid_grace_ms",action=`send graceMs as a whole number of milliseconds from 0 to ${6e4}`;return refuse2(command.id,"abort",`graceMs must be an integer from 0 to ${6e4}`,RPC_ERROR_INVALID_ARGUMENT,{reason,action})}async function quiesce(session,aborting,graceMs){let timer,expired=new Promise(resolve=>{timer=setTimeout(()=>resolve(!1),graceMs)});try{return await Promise.race([aborting.then(()=>!session.isStreaming),expired])}finally{clearTimeout(timer)}}async function runAbort(ctx,command,dispatch){let invalid=invalidGrace(command);if(invalid!==void 0)return invalid;let{effectId}=command,quiesced=command.awaitIdle===!0||command.clearQueue===!0,begun=effectId===void 0?void 0:await beginEffect(ctx,"abort",{...command,effectId});if(begun!==void 0&&isResponse(begun))return begun;if(begun!==void 0&&"replay"in begun)return respond(command.id,{command:"abort",data:effectAnswer(begun.replay,ctx.sessionId,!0)});let admissions=ClientAdmissions.forSession(ctx.session),streaming=ctx.session.isStreaming,cleared=0;if(command.clearQueue===!0){admissions.clearQueued();let drained=ctx.session.clearQueue({abortWillFollow:!0});cleared=drained.steering.length+drained.followUp.length}let noted=admissions.noteAbort(ctx.by,effectId),aborting=dispatch();streaming||aborting.finally(()=>admissions.forgetAbort(noted));let ledger=effectId===void 0?void 0:EffectLedger.forSession(ctx.session),status=effectId===void 0?void 0:streaming?ledger?.transition(effectId,"applied"):ledger?.transition(effectId,"done",{disposition:"no_active_turn"});if(!quiesced)return respond(command.id,{command:"abort",...status===void 0?{}:{data:effectAnswer(status,ctx.sessionId)}});let idle=command.awaitIdle===!0?await quiesce(ctx.session,aborting,command.graceMs??1e4):!streaming;return effectId!==void 0&&(status=ledger?.status(effectId)??status),respond(command.id,{command:"abort",data:{...status===void 0?{}:effectAnswer(status,ctx.sessionId),stopped:idle,idle,cleared}})}async function runQueuedInputChange(ctx,command){let kind=command.type==="dequeue_message"?"dequeue":"edit_queued",{effectId,queuedId}=command,begun=effectId===void 0?void 0:await beginEffect(ctx,kind,{...command,effectId});if(begun!==void 0&&isResponse(begun))return begun;if(begun!==void 0&&"replay"in begun)return respond(command.id,{command:command.type,data:{queuedId,status:replayedStatus(begun.replay,command.type),...begun.replay.answer,...begun.replay.outcome===void 0?{}:{reason:begun.replay.outcome.reason,action:begun.replay.outcome.action},...effectAnswer(begun.replay,ctx.sessionId,!0)}});let clientMessageId=ctx.session.getQueuedInputs().find(input=>input.queuedId===queuedId)?.clientMessageId,expected=command.expectedRevision===void 0?void 0:{expectedRevision:command.expectedRevision},status=await ctx.session.changeQueuedInput(queuedId,command.type==="dequeue_message"?void 0:command.text,{...expected,...effectId===void 0?{}:{effectId}}),current2=ctx.session.getQueuedInputs().find(input=>input.queuedId===queuedId);status==="edited"&&clientMessageId!==void 0&&command.type==="edit_queued_message"&&ClientAdmissions.forSession(ctx.session).editQueuedText(clientMessageId,command.text);let outcome=status==="already_delivered"?EFFECT_OUTCOMES.queuedInputAlreadyDelivered:status==="not_found"?EFFECT_OUTCOMES.queuedInputNotFound:status==="conflict"?EFFECT_OUTCOMES.queuedInputConflict:void 0,answer=status==="edited"&¤t2!==void 0?{text:current2.text,revision:current2.revision}:status==="conflict"&¤t2!==void 0?{currentRevision:current2.revision}:void 0,stored=answer===void 0?{}:{answer},ledger=effectId===void 0?void 0:EffectLedger.forSession(ctx.session),recorded=effectId===void 0||ledger===void 0?void 0:outcome===void 0?ledger.transition(effectId,"done",{disposition:status,...stored}):ledger.transition(effectId,"failed",{outcome,...stored});return respond(command.id,{command:command.type,data:{queuedId,status,...answer,...outcome===void 0?{}:{reason:outcome.reason,action:outcome.action},...recorded===void 0?{}:effectAnswer(recorded,ctx.sessionId)}})}function replayedStatus(status,command){return status.outcome?.kind==="already_delivered"||status.outcome?.kind==="not_found"||status.outcome?.kind==="conflict"?status.outcome.kind:command==="dequeue_message"?"removed":"edited"}async function runSetThinkingLevel(ctx,command){let{effectId}=command,begun=effectId===void 0?void 0:await beginEffect(ctx,"set_thinking_level",{...command,effectId});if(begun!==void 0&&isResponse(begun))return begun;if(begun!==void 0&&"replay"in begun)return respond(command.id,{command:"set_thinking_level",data:effectAnswer(begun.replay,ctx.sessionId,!0)});let ledger=effectId===void 0?void 0:EffectLedger.forSession(ctx.session);if(command.scope==="turn"){if(!ctx.session.getAvailableThinkingLevels().includes(command.level)){let message=unsupportedThinkingLevel(command.level),failed=effectId===void 0?void 0:ledger?.transition(effectId,"failed",{outcome:unsupportedThinkingLevelOutcome(message)});return refuse2(command.id,"set_thinking_level",message,void 0,failed&&effectAnswer(failed,ctx.sessionId))}ctx.session.setSessionThinkingLevel(command.level,{source:"rpc",effectId})}else ctx.session.setThinkingLevel(command.level,{source:"rpc",effectId});if(effectId===void 0||ledger===void 0)return respond(command.id,{command:"set_thinking_level"});let done=ledger.transition(effectId,"done",{disposition:"applied"});return respond(command.id,{command:"set_thinking_level",data:effectAnswer(done,ctx.sessionId)})}async function runGetEffectStatus(ctx,command){if(command.sessionPath!==void 0&&command.sessionPath!==ctx.session.sessionFile)return answerEffectFromTranscript(command.id,command.sessionPath,command.effectId);let status=EffectLedger.forSession(ctx.session).status(command.effectId,ctx.sessionId);return respond(command.id,{command:"get_effect_status",data:status===void 0?{found:!1,searched:"complete"}:{found:!0,effect:status}})}async function answerEffectFromTranscript(id,path,effectId){try{return respond(id,{command:"get_effect_status",data:await lookupEffectInTranscript(path,effectId)})}catch(cause){if(!(cause instanceof TranscriptUnreadable))throw cause;return refuse2(id,"get_effect_status",cause.message,RPC_ERROR_TRANSCRIPT_UNREADABLE,{path:cause.path,reason:cause.reason,action:cause.action})}}var responseByteBudget=50331648;function currentResponseByteBudget(){return responseByteBudget}function entryPageBounds(request){let{limit,tail,maxBytes}=request;return limit!==void 0&&!(Number.isInteger(limit)&&limit>0)?{ok:!1,message:"limit must be a positive integer"}:tail!==void 0&&!(Number.isInteger(tail)&&tail>0)?{ok:!1,message:"tail must be a positive integer"}:limit!==void 0&&tail!==void 0?{ok:!1,message:"limit and tail cannot be combined: limit pages forward, tail backward"}:maxBytes!==void 0&&!(Number.isInteger(maxBytes)&&maxBytes>0)?{ok:!1,message:"maxBytes must be a positive integer"}:limit===void 0&&tail===void 0&&maxBytes===void 0?{ok:!0,paged:!1,maxBytes:responseByteBudget}:{ok:!0,paged:!0,...limit===void 0?{}:{limit},...tail===void 0?{}:{tail},maxBytes:Math.min(maxBytes??8388608,responseByteBudget)}}function pageEntries(entries,project,bounds){let page=[],bytes=0,taken=0,firstEntryBytes=0;for(let entry of entries){if(bounds.limit!==void 0&&taken>=bounds.limit)break;let projected=project(entry),size=Buffer.byteLength(JSON.stringify(projected))+1;if(taken>0&&bytes+size>bounds.maxBytes)break;taken===0&&(firstEntryBytes=size),page.push(projected),bytes+=size,taken++}let last=entries[taken-1],hasMore=taken<entries.length;return{entries:page,hasMore,...hasMore&&last!==void 0?{nextSince:last.id}:{},firstEntryBytes}}function pageEntriesFromEnd(entries,project,bounds){let page=[],bytes=0,firstEntryBytes=0,index=entries.length-1;for(;index>=0&&!(bounds.tail!==void 0&&page.length>=bounds.tail);index--){let entry=entries[index];if(entry===void 0)break;let projected=project(entry),size=Buffer.byteLength(JSON.stringify(projected))+1;if(page.length>0&&bytes+size>bounds.maxBytes)break;page.length===0&&(firstEntryBytes=size),page.push(projected),bytes+=size}page.reverse();let oldest=entries[index+1],hasMore=index>=0;return{entries:page,hasMore,...hasMore&&oldest!==void 0?{nextBefore:oldest.id}:{},firstEntryBytes}}var heldWalks=new WeakMap;function holdEntryWalk(owner,release){endEntryWalk(owner);let timer=setTimeout(()=>{heldWalks.delete(owner),release()},3e4);timer.unref?.(),heldWalks.set(owner,timer)}function endEntryWalk(owner){let timer=heldWalks.get(owner);timer!==void 0&&(clearTimeout(timer),heldWalks.delete(owner))}function refuse3(id,message,errorCode){return{id,type:"response",command:"get_entries",success:!1,error:message,errorCode}}function answerGetEntries(session,command){let{id}=command,sessionManager=session.sessionManager,entries=sessionManager.getEntries();if(command.before!==void 0){let beforeIndex=entries.findIndex(e=>e.id===command.before);if(beforeIndex===-1)return refuse3(id,`Entry not found: ${command.before}`,RPC_ERROR_ENTRY_NOT_FOUND);entries=entries.slice(0,beforeIndex)}if(command.since!==void 0){let sinceIndex=sessionManager.getEntries().findIndex(e=>e.id===command.since);if(sinceIndex===-1)return refuse3(id,`Entry not found: ${command.since}`,RPC_ERROR_ENTRY_NOT_FOUND);entries=entries.slice(sinceIndex+1)}let bounds=entryPageBounds(command);if(!bounds.ok)return refuse3(id,bounds.message,RPC_ERROR_INVALID_ARGUMENT);let backward=bounds.tail!==void 0,page=backward?pageEntriesFromEnd(entries,describeUsageLimitEntry,bounds):pageEntries(entries,describeUsageLimitEntry,bounds);bounds.paged&&page.hasMore?holdEntryWalk(session,()=>session.releaseFullHistoryView()):(endEntryWalk(session),session.releaseFullHistoryView());let budget=currentResponseByteBudget();if(page.firstEntryBytes>budget){let entry=backward?entries.at(-1):entries[0];return refuse3(id,`Entry ${entry?.id??""} alone is larger than one answer can carry (${budget} bytes), so it cannot be sent over RPC.`,RPC_ERROR_RESPONSE_TOO_LARGE)}return!bounds.paged&&page.hasMore?refuse3(id,`The session history is larger than one answer can carry (${budget} bytes). Read it in pages: pass limit or maxBytes, then since: nextSince until hasMore is false.`,RPC_ERROR_RESPONSE_TOO_LARGE):{id,type:"response",command:"get_entries",success:!0,data:{entries:page.entries,leafId:sessionManager.getLeafId(),...bounds.paged?{hasMore:page.hasMore}:{},..."nextSince"in page&&page.nextSince!==void 0?{nextSince:page.nextSince}:{},..."nextBefore"in page&&page.nextBefore!==void 0?{next_before:page.nextBefore}:{}}}}var UiAnswerLedger=class{constructor(){this.answers=new Map}lookup(uiRequestId,answerId){let receipt=this.answers.get(uiRequestId);if(receipt)return answerId!==void 0&&answerId===receipt.answerId?"replay":"already_answered"}record(uiRequestId,answerId){if(!this.answers.has(uiRequestId)&&(this.answers.set(uiRequestId,{uiRequestId,...answerId===void 0?{}:{answerId}}),this.answers.size>1024)){let oldest=this.answers.keys().next();oldest.done||this.answers.delete(oldest.value)}}snapshot(){return[...this.answers.values()].slice(-64).map(receipt=>({...receipt}))}},ledgers2=new WeakMap;function sessionUiAnswerLedger(session){let ledger=ledgers2.get(session);return ledger||(ledger=new UiAnswerLedger,ledgers2.set(session,ledger)),ledger}import{existsSync}from"node:fs";function buildRpcSessionState(session,lastAbortSource){let cwd=session.sessionManager.getCwd();if(!session.agentDir)throw new Error("RPC session invariant violated: agentDir is required");let projectTrusted=new ProjectTrustStore(session.agentDir).get(cwd)===!0,lastProviderDiagnostic=sanitizeProviderDiagnostic(session.agent.state.providerDiagnostic);return{answeredUiRequests:sessionUiAnswerLedger(session).snapshot(),paused:session.paused??!1,pausedNoticeCount:session.pausedNoticeCount??0,holds:session.holds??[],lifecycle:observeLifecycle(session.lifecycle),pendingQuestions:sessionQuestionBridges.get(session)?.pendingQuestions(),pendingDialogs:sessionDialogRequests.get(session)?.snapshot()??[],model:session.model,pendingModelSwitch:session.pendingModelSwitch?{provider:session.pendingModelSwitch.model.provider,id:session.pendingModelSwitch.model.id}:null,thinkingLevel:session.thinkingLevel,...session.thinkingSelection?{thinkingSelection:session.thinkingSelection}:{},...session.thinkingLevelSource===void 0?{}:{thinkingLevelSource:session.thinkingLevelSource},...typeof session.getSessionModelThinkingLevels=="function"?{sessionModelThinkingLevels:session.getSessionModelThinkingLevels()}:{},...session.currentTurnId===void 0?{}:{currentTurnId:session.currentTurnId},...lastAbortSource?{lastAbortSource}:{},...lastProviderDiagnostic?{lastProviderDiagnostic}:{},serviceTier:session.effectiveServiceTier,fastMode:session.isFastModeActive(),isStreaming:session.isStreaming,pausedHeldInputCount:session.pausedHeldInputCount,runPaused:session.runPaused,pause:session.pauseView,isCompacting:session.isCompacting,retryAttempt:session.retryAttempt,isBashRunning:session.isBashRunning,steeringMode:session.steeringMode,followUpMode:session.followUpMode,sessionFile:session.sessionFile,sessionId:session.sessionId,sessionName:session.sessionName,cwd,projectTrusted,...session.sessionFile&&!existsSync(session.sessionFile)&&session.sessionManager.getEntries().some(entry=>entry.type!=="model_change"&&entry.type!=="model_change_rejected"&&entry.type!=="thinking_level_change")?{entries:session.sessionManager.getEntries()}:{},steering:typeof session.getSteeringMessages=="function"?[...session.getSteeringMessages()]:[],followUp:typeof session.getFollowUpMessages=="function"?[...session.getFollowUpMessages()]:[],ordered:typeof session.getQueuedInputs=="function"?session.getQueuedInputs().map(clientFacingIdentity):[],autoCompactionEnabled:session.autoCompactionEnabled,messageCount:session.messages.length,pendingMessageCount:session.pendingMessageCount,usageTotals:session.sessionManager.getUsageTotals(),contextUsage:typeof session.getContextUsage=="function"?session.getContextUsage():void 0,favoriteModels:session.favoriteModels?.map(entry=>({...entry}))??[],scopedModels:session.scopedModels?.map(entry=>({...entry}))??[]}}import{randomUUID as randomUUID5}from"node:crypto";function getSnapshot(session,request,cursor){let tail=request.tail===void 0?100:request.tail,maxBytes=request.maxBytes===void 0?8388608:request.maxBytes;if(typeof tail!="number"||!Number.isSafeInteger(tail)||tail<0)return{error:"tail must be a non-negative integer"};if(typeof maxBytes!="number"||!Number.isSafeInteger(maxBytes)||maxBytes<=0)return{error:"maxBytes must be a positive integer"};let state=buildRpcSessionState(session,cursor.lastAbortSource),history=session.sessionManager.getEntries(),entries=[],bytes=2;for(let i=history.length-1;i>=0&&entries.length<tail;i--){let entry=history[i];if(entry===void 0)break;let projected=describeUsageLimitEntry(entry),size=Buffer.byteLength(JSON.stringify(projected))+(entries.length>0?1:0);if(bytes+size>Math.min(maxBytes,currentResponseByteBudget()))break;entries.push(projected),bytes+=size}entries.reverse();let history_truncated=entries.length<history.length,markerId=randomUUID5(),data=structuredClone({state,entries,history_truncated,next_before:history_truncated?entries[0]?.id??null:null,markerId});return session.releaseFullHistoryView(),cursor.enqueue(markerId),{data}}import{randomBytes,timingSafeEqual}from"node:crypto";var mcpFormClock={now:()=>performance.now(),schedule:(callback,delay2)=>setTimeout(callback,delay2),cancel:timer=>{"close"in timer&&typeof timer.close=="function"&&timer.close()}},McpFormDialog=class{constructor(group,holder){this.delivered=!1,this.presentedHere=!1,this.token=randomBytes(32),this.group=group,this.holder=holder,this.request={...holder.envelope,type:"mcp_form_request",dialogToken:this.token.toString("hex"),server:structuredClone(group.input.server),message:group.input.message,schema:structuredClone(group.input.schema),deadlineAtMs:Date.now()+Math.max(0,group.input.deadlineMs)}}deliver(){let request=this.request;request&&(this.delivered=!0,(!this.holder.current()||!this.holder.send(request))&&this.revoked())}sync(){if(this.live())return this.request===void 0?void 0:structuredClone(this.request)}matches(token,revision){return this.request?.formRevision===revision&&/^[a-f0-9]{64}$/.test(token)&&timingSafeEqual(this.token,Buffer.from(token,"hex"))}presented(){return this.live()?(this.presentedHere=!0,this.group.markPresented(),{ok:!0}):{error:"form_expired"}}respond(action,content){if(!this.live())return{error:"form_expired"};if(!this.presentedHere||!this.request)return{error:"invalid_form_response"};let result;switch(action){case"accept":if(!validMcpFormContent(this.request.schema,content)||Buffer.byteLength(JSON.stringify(content))>1024*1024)return{error:"invalid_form_response"};result={action,content:structuredClone(content)};break;case"decline":case"cancel":if(content!==void 0)return{error:"invalid_form_response"};result={action};break;default:return{error:"invalid_form_response"}}return this.live()?(this.group.settle({kind:"result",result,source:"presenter_action",humanAdmission:!0},this),{ok:!0}):{error:"form_expired"}}revoked(operation=!1){if(operation){this.group.terminate("operation_aborted");return}this.close(),this.group.leave(this)}close(){this.request=void 0,this.token.fill(0),this.holder.remove()}resolved(reason,elsewhere){if(!this.delivered||!this.holder.current())return;let{sessionId,grantId,dialogId}=this.holder.envelope;this.holder.send({type:"mcp_form_resolved",sessionId,grantId,dialogId,reason,...elsewhere&&this.holder.negotiated?{elsewhere:!0}:{}})}settled(record){this.delivered&&this.holder.negotiated&&this.holder.current()&&this.holder.send(record)}live(){return this.group.live()?this.holder.current()?!0:(this.revoked(),!1):!1}};import{randomUUID as randomUUID9}from"node:crypto";import{randomUUID as randomUUID8}from"node:crypto";import{randomUUID as randomUUID6}from"node:crypto";function reasonOf(outcome){if(outcome.kind!=="result")return outcome.kind==="operation_aborted"?"operation_aborted":"processing_failed";let action=outcome.result.action;return action==="accept"?"answered":action==="decline"?"declined":"cancelled"}var McpFormGroup=class{constructor(input,context){this.id=randomUUID6(),this.settled=!1,this.presented=!1,this.members=new Set,this.cleanups=[],this.resolve=()=>{},this.input=input,this.context=context,this.deadline=context.clock.now()+Math.max(0,input.deadlineMs),this.result=new Promise(resolve=>{this.resolve=resolve})}join(holder){let dialog=new McpFormDialog(this,holder);return this.members.add(dialog),dialog}start(){let timer=this.context.clock.schedule(()=>this.terminate("presentation_timeout"),this.input.deadlineMs);this.cleanups.push(()=>this.context.clock.cancel(timer));let watch=(signal,cause)=>{let stop=()=>this.terminate(cause);signal.addEventListener("abort",stop,{once:!0}),this.cleanups.push(()=>signal.removeEventListener("abort",stop)),signal.aborted&&stop()};watch(this.input.operationSignal,"operation_aborted"),watch(this.input.presentationSignal,"presentation_lost");for(let dialog of[...this.members])dialog.deliver()}live(){return this.input.operationSignal.aborted||this.input.operationCurrent?.()===!1?(this.terminate("operation_aborted"),!1):this.context.clock.now()>=this.deadline?(this.terminate("presentation_timeout"),!1):!0}markPresented(){this.presented=!0}leave(dialog){this.members.delete(dialog),this.members.size===0&&this.terminate("presentation_lost")}terminate(cause){let provenance={source:"host_termination",humanAdmission:!1};cause==="operation_aborted"||this.input.operationSignal.aborted||this.input.operationCurrent?.()===!1?this.settle({kind:"operation_aborted",...provenance}):this.presented?this.settle({kind:"result",result:{action:"cancel"},...provenance}):this.settle({kind:"processing_failure",...provenance})}settle(outcome,winner){if(this.settled)return;this.settled=!0;let members=[...this.members];this.members.clear();for(let member of members)member.close();for(let cleanup of this.cleanups.splice(0))cleanup();outcome.humanAdmission&&this.context.admit(),this.resolve(outcome);let reason=reasonOf(outcome);for(let member of members)member.resolved(reason,winner!==void 0&&member!==winner);let record={type:"mcp_form_settled",sessionId:this.context.sessionId,groupId:this.id,outcome:reason,...winner?{answeredBy:winner.holder.answeredBy}:{}};for(let member of members)member.settled(record)}};import{randomUUID as randomUUID7}from"node:crypto";var ELSEWHERE_FEATURE="elsewhere_v1",SECRET_INPUT_FEATURE="secret_input_v1";function features(value){return Array.isArray(value)&&value.length<=16&&value.every(name=>typeof name=="string"&&name.length>0&&name.length<=64)}function holds(binding,principal,connection){return[...binding.grants].some(grant=>grant.registration.principal===principal&&grant.registration.connection===connection)}function enroll(state,principal=randomUUID7(),identity={principalKind:"inherited"}){let generation=randomUUID7();return{register:(handle,sender,options)=>{let binding=[...state.bindings.values()].find(value=>value===handle),connection=state.connections.get(sender);if(!binding||!connection?.attachments.has(binding)||holds(binding,principal,connection))throw new Error("presenter_not_authorized");let registration={id:randomUUID7(),principal,generation,binding,connection,kind:options.kind,elsewhere:options.features?.includes(ELSEWHERE_FEATURE)===!0,secretInput:options.features?.includes(SECRET_INPUT_FEATURE)===!0,active:!0};return state.registrations.set(registration,registration),registration},acquire:handle=>{let registration=state.registrations.get(handle);if(!registration||registration.principal!==principal||!registration.active)throw new Error("presenter_not_authorized");let{binding,connection}=registration,attachment=connection.attachments.get(binding);if(!attachment||binding.lifetime.signal.aborted||holds(binding,principal,connection))throw new Error("presenter_not_authorized");let scope={hostInstance:state.instance,durableSessionId:binding.durableId,bindingEpoch:binding.epoch,attachmentId:attachment.id,attachmentEpoch:attachment.epoch,connectionId:connection.id,connectionEpoch:connection.epoch,presenterPrincipalId:principal,presenterGeneration:generation,presentationBindingId:registration.id,presenterKind:registration.kind,purpose:"mcp_form"},grant={id:randomUUID7(),registration,scope,answeredBy:{...identity,presenterKind:registration.kind},lifetime:new AbortController,dialogs:new Map};binding.grants.add(grant),binding.presence??={id:randomUUID7(),lifetime:new AbortController};for(let listener of binding.listeners)listener();return{grantId:grant.id,scope}},revoke:handle=>{let registration=state.registrations.get(handle);registration?.principal===principal&&revoke(state,registration)}}}function current(state,grant){let{registration,scope}=grant,{binding,connection}=registration;return registration.active&&!binding.lifetime.signal.aborted&&!grant.lifetime.signal.aborted&&state.bindings.get(binding.sessionId)===binding&&binding.grants.has(grant)&&state.connections.get(connection)===connection&&connection.attachments.get(binding)?.epoch===scope.attachmentEpoch}function holders(state,binding){return[...binding.grants].filter(grant=>current(state,grant))}function secretInputHeld(state,handle){return secretCandidates(state,handle).length>0}function secretCandidates(state,handle){let binding=[...state.bindings.values()].find(value=>value===handle);return binding===void 0?[]:holders(state,binding).filter(grant=>grant.registration.secretInput&&grant.answeredBy.principalKind==="account")}function revoke(state,registration,operation=!1){registration.active=!1,state.registrations.delete(registration);let binding=registration.binding,grant=[...binding.grants].find(value=>value.registration===registration);if(grant){binding.grants.delete(grant);for(let dialog of[...grant.dialogs.values()])dialog.revoked(operation);binding.grants.size===0&&(binding.presence?.lifetime.abort(),binding.presence=void 0);for(let listener of binding.listeners)listener();grant.lifetime.abort()}}function receive(state,sender,value){let connection=state.connections.get(sender);if(!isRecord(value)||typeof value.sessionId!="string")return{error:"presenter_not_authorized"};let binding=state.bindings.get(value.sessionId),held=binding?holders(state,binding).filter(grant2=>grant2.registration.connection===connection):[];if(!connection||held.length===0)return{error:"presenter_not_authorized"};let grant=held.find(candidate=>candidate.id===value.grantId);if(!grant||value.bindingEpoch!==grant.scope.bindingEpoch||value.attachmentEpoch!==grant.scope.attachmentEpoch)return{error:"presenter_not_authorized"};let allowed=["type","id","sessionId","bindingEpoch","attachmentEpoch","grantId","dialogId","dialogToken","formRevision"];if(value.type==="mcp_form_response"&&allowed.push("action","content"),Object.keys(value).some(key=>!allowed.includes(key)))return{error:"invalid_form_response"};if(value.type==="mcp_form_sync"){let form=grant.dialogs.values().next().value?.sync();return form===void 0?{ok:!0}:{ok:!0,form}}if(typeof value.dialogId!="string"||typeof value.dialogToken!="string"||typeof value.formRevision!="string")return{error:"invalid_form_response"};let dialog=grant.dialogs.get(value.dialogId);if(!dialog)return{error:"form_stale"};if(!dialog.matches(value.dialogToken,value.formRevision))return{error:"invalid_form_response"};switch(value.type){case"mcp_form_presented":return dialog.presented();case"mcp_form_response":return typeof value.action=="string"?dialog.respond(value.action,value.content):{error:"invalid_form_response"};default:return{error:"invalid_form_response"}}}function presentation(state,binding,presence){let ready=()=>binding.presence===presence&&holders(state,binding).length>0;return{signal:presence.lifetime.signal,ready,present:input=>present(state,binding,presence.lifetime.signal,ready,input)}}function present(state,binding,lifetime,ready,input){let{clock}=state,unavailable={kind:"processing_failure",source:"host_termination",humanAdmission:!1};if(!ready()||!validateMrtrForm(input.schema)||Object.keys(input.schema.properties).length>64||Buffer.byteLength(JSON.stringify({message:input.message,schema:input.schema}))>512*1024)return Promise.resolve(unavailable);let deadline2=clock.now()+input.deadlineMs,expired=new AbortController,timer=clock.schedule(()=>expired.abort(),Math.max(0,input.deadlineMs)),signal=AbortSignal.any([input.operationSignal,input.presentationSignal,lifetime,expired.signal]);return queuedForm(binding.queue,signal,()=>{clock.cancel(timer);let snapshot=ready()?holders(state,binding):[];if(snapshot.length===0)return Promise.resolve(unavailable);let group=new McpFormGroup({...input,presentationSignal:signal,deadlineMs:Math.max(0,deadline2-clock.now())},{clock,sessionId:binding.sessionId,admit:binding.admit});for(let grant of snapshot){let dialogId=randomUUID8(),dialog=group.join({envelope:{sessionId:binding.sessionId,bindingEpoch:binding.epoch,attachmentEpoch:grant.scope.attachmentEpoch,grantId:grant.id,dialogId,formRevision:randomUUID8()},current:()=>current(state,grant),remove:()=>{grant.dialogs.delete(dialogId)},send:grant.registration.connection.send,negotiated:grant.registration.elsewhere,answeredBy:grant.answeredBy});grant.dialogs.set(dialogId,dialog)}return group.start(),group.result}).catch(()=>({...unavailable,kind:input.operationSignal.aborted||binding.signal.aborted||input.operationCurrent?.()===!1?"operation_aborted":"processing_failure"})).finally(()=>clock.cancel(timer))}function dispose(state){for(let binding of[...state.bindings.values()])binding.dispose();state.connections.clear(),state.registrations.clear()}function connect(state,id,send){let connection={id,send,epoch:randomUUID9(),nonce:randomUUID9(),attachments:new Map};return state.connections.set(connection,connection),connection}function attach(state,sender,handle){let connection=state.connections.get(sender),binding=[...state.bindings.values()].find(value=>value===handle);connection&&binding&&!connection.attachments.has(binding)&&connection.attachments.set(binding,{id:randomUUID9(),epoch:randomUUID9()})}function connectionContext(state,sender,sessionId){let connection=state.connections.get(sender),binding=state.bindings.get(sessionId),attachment=binding&&connection?.attachments.get(binding);if(!(!connection||!binding||!attachment))return{hostInstance:state.instance,connectionNonce:connection.nonce,bindingEpoch:binding.epoch,attachmentId:attachment.id,attachmentEpoch:attachment.epoch}}function detach(state,sender,handle){let connection=state.connections.get(sender);if(connection){for(let binding of connection.attachments.keys())handle!==void 0&&handle!==binding||(connection.attachments.delete(binding),revokeHeld(state,binding,connection));handle===void 0&&state.connections.delete(sender)}}function withdraw(state,sender){let connection=state.connections.get(sender);if(connection)for(let binding of connection.attachments.keys())revokeHeld(state,binding,connection)}function revokeHeld(state,binding,connection){for(let grant of[...binding.grants])grant.registration.connection===connection&&revoke(state,grant.registration)}function bind(state,sessionId,durableId,admit){state.bindings.get(sessionId)?.dispose();let lifetime=new AbortController,binding={sessionId,durableId,admit,epoch:randomUUID9(),lifetime,signal:lifetime.signal,listeners:new Set,grants:new Set,queue:{},version:()=>holders(state,binding).length>0?binding.presence?.id:void 0,subscribe:listener=>(binding.listeners.add(listener),()=>{binding.listeners.delete(listener)}),capture:()=>{let presence=binding.presence;return presence&&holders(state,binding).length>0?presentation(state,binding,presence):void 0},dispose:()=>{binding.lifetime.abort();for(let grant of[...binding.grants])revoke(state,grant.registration,!0);state.bindings.get(sessionId)===binding&&state.bindings.delete(sessionId);for(let connection of state.connections.values())connection.attachments.delete(binding);binding.listeners.clear()}};return state.bindings.set(sessionId,binding),binding}var McpPresenterAuthority=class{constructor(options={}){this.instance=hostInstanceId(),this.state={instance:this.instance,clock:options.clock??mcpFormClock,connections:new Map,bindings:new Map,registrations:new Map}}dispose(){dispose(this.state)}connect(id,send){return connect(this.state,id,send)}attach(sender,handle){attach(this.state,sender,handle)}connectionContext(sender,sessionId){return connectionContext(this.state,sender,sessionId)}detach(sender,handle){detach(this.state,sender,handle)}withdraw(sender){withdraw(this.state,sender)}bind(sessionId,durableId,admit){return bind(this.state,sessionId,durableId,admit)}enroll(principal,identity){return enroll(this.state,principal,identity)}secretInputHeld(handle){return secretInputHeld(this.state,handle)}secretCandidates(handle){return secretCandidates(this.state,handle)}isCurrent(grant){return current(this.state,grant)}receive(sender,value){return receive(this.state,sender,value)}};import{randomUUID as randomUUID10}from"node:crypto";import{constants as constants2}from"node:fs";import{lstat as lstat2,mkdir as mkdir2,open as open3,rename,rm as rm2}from"node:fs/promises";import{join as join3}from"node:path";import{execFile}from"node:child_process";import{constants}from"node:fs";import{lstat,open as open2,readFile}from"node:fs/promises";import{join as join2}from"node:path";import{promisify}from"node:util";var ROOT_MARKER=".compact-spool-owner",Owner=external_exports.object({bootNonce:external_exports.string().min(1),pid:external_exports.number().int().positive(),startTime:external_exports.string().min(1).refine(value=>processStartTimeMs(value)!==void 0)}),Marker=external_exports.object({kind:external_exports.enum(["scratch","live"]),token:external_exports.string().min(1),owner:Owner.nullable()}),boot,self;function bootNonce(){return boot??=(async()=>{switch(process.platform){case"darwin":return(await promisify(execFile)("/usr/sbin/sysctl",["-n","kern.bootsessionuuid"],{timeout:2e3})).stdout.trim()||null;case"linux":return(await readFile("/proc/sys/kernel/random/boot_id","utf8")).trim()||null;default:return null}})().catch(cause=>{if(cause instanceof Error)return null;throw cause}),boot}function currentRootOwner(){return self??=(async()=>{let bootNonceValue=await bootNonce();if(!bootNonceValue)return null;let start=await rootProcessIdentity(process.pid);return start.kind==="present"?{bootNonce:bootNonceValue,pid:process.pid,startTime:start.identity}:null})(),self}async function rootProcessIdentity(pid){try{return await readProcessIdentity(pid,process.platform,2e3,processIsLive,"UTC")}catch(cause){if(cause instanceof Error&&"syscall"in cause&&typeof cause.syscall=="string"&&/^spawn(?: |$)/.test(cause.syscall))return{kind:"error",error:cause};throw cause}}async function rootOwnerState(owner){let currentBoot=await bootNonce();if(!owner||!currentBoot)return"unknown";if(owner.bootNonce!==currentBoot)return"dead";let start=await rootProcessIdentity(owner.pid);switch(start.kind){case"absent":return processIsLive(owner.pid)?"unknown":"dead";case"present":return start.identity===owner.startTime?"alive":"dead";case"error":return"unknown"}}function privateRootStat(stat){return stat.isDirectory()&&!stat.isSymbolicLink()&&(process.getuid===void 0||stat.uid===process.getuid()&&(stat.mode&63)===0)}async function readRootMarker(dir){try{let path=join2(dir,ROOT_MARKER),entry=await lstat(path);if(!entry.isFile()||entry.isSymbolicLink())return;let handle=await open2(path,constants.O_RDONLY|(constants.O_NOFOLLOW??0));try{let stat=await handle.stat();if(!stat.isFile()||stat.size>8192||process.getuid!==void 0&&(stat.uid!==process.getuid()||(stat.mode&63)!==0))return;let parsed=Marker.safeParse(JSON.parse(await handle.readFile("utf8")));return parsed.success?parsed.data:void 0}finally{await handle.close()}}catch(cause){if(cause instanceof Error)return;throw cause}}var CompactReadError=class extends Error{constructor(reason){super(`compact read refused (${reason})`),this.name="CompactReadError",this.reason=reason}},CompactReadLease=class{constructor(dispose2,valid=()=>{}){this.released=!1,this.operations=0,this.dispose=dispose2,this.valid=valid}assert(){if(this.released)throw new CompactReadError("released");this.valid()}async run(read){return this.assert(),this.hold(async()=>{let result=await read();return this.assert(),result})}async hold(read){if(this.released)throw new CompactReadError("released");this.operations++;try{return await read()}finally{--this.operations===0&&this.released&&this.dispose()}}retain(){if(this.released)throw new CompactReadError("released");this.operations++;let ended=!1;return()=>{ended||(ended=!0,--this.operations===0&&this.released&&this.dispose())}}release(){return this.released?!1:(this.released=!0,this.operations===0&&this.dispose(),!0)}};var recoveryAgentDir=getAgentDir(),RecoveryStorageHealth=class{constructor(base){this.failures=0,this.cleared=0,this.dir=join3(base,`.senpi-recovery-health-${process.getuid?.()??"user"}`)}ensureDir(){return this.setup??=(async()=>{if(await mkdir2(this.dir,{mode:448,recursive:!0}),!privateRootStat(await lstat2(this.dir)))throw new CompactReadError("ownership")})().catch(cause=>{throw this.setup=void 0,cause}),this.setup}get needsRecovery(){return this.failures>this.cleared}unavailable(){this.failures+=1}async revision(){return await this.ensureDir(),await this.readRevision()??this.advance()}async readRevision(){try{let handle=await open3(join3(this.dir,"revision"),constants2.O_RDONLY|(constants2.O_NOFOLLOW??0));try{let stat=await handle.stat();if(!stat.isFile()||stat.size>128)return;let text=(await handle.readFile("utf8")).trim();return/^(0|[1-9]\d*)$/.test(text)?text:void 0}finally{await handle.close()}}catch(cause){if(cause instanceof Error&&"code"in cause&&cause.code==="ENOENT")return"0";if(cause instanceof Error&&"code"in cause&&cause.code==="ELOOP")return;throw cause}}async recover(operation){await this.ensureDir();let through=this.failures;if(await operation(),through<=this.cleared)return this.revision();if(this.pending&&await this.pending,through<=this.cleared)return this.revision();this.pending=this.advance().then(revision=>(this.cleared=through,revision));try{return await this.pending}finally{this.pending=void 0}}async advance(){await this.ensureDir();let release=await acquireOwnershipSafeLock(join3(this.dir,"revision.lock")),temporary=join3(this.dir,`${randomUUID10()}.tmp`);try{let next=String(BigInt(await this.readRevision()??"0")+1n),file=await open3(temporary,constants2.O_WRONLY|constants2.O_CREAT|constants2.O_EXCL|(constants2.O_NOFOLLOW??0),384);try{await file.writeFile(next),await file.sync()}finally{await file.close()}await rename(temporary,join3(this.dir,"revision"));let directory=await open3(this.dir,"r");try{await directory.sync()}finally{await directory.close()}return next}finally{try{await rm2(temporary,{force:!0})}finally{await release()}}}};var FRESH_CALL={owningMessageId:null,contentIndex:null,parentKey:null,join:"pending",startSequence:null,startedAtMs:null,requestedName:null,resolvedName:null,seed:null,raw:null,input:{announced:null,started:null,prepared:null},correlation:null,hook:null,progress:null,result:null,outcome:null},TERMINAL_PHASE="completed-awaiting-entry",CALL_RECORDS=new Set(["tool_execution_start","tool_execution_update","tool_execution_end","tool_hook_status","turn_end","agent_settled","message_end"]),CALL_ONLY_RECORDS=new Set(["tool_execution_update","tool_execution_end","tool_hook_status","agent_settled"]);function runtimeItemKey(scope,creationSequence,k){return`${scope.sessionEpoch}:${creationSequence}.${k}`}var CALL_UNKNOWN=Object.freeze({callUnknown:!0});function callIdentity(call){return call?{runtimeItemKey:call.runtimeItemKey}:CALL_UNKNOWN}function callOrder(creationSequence,k){return`${String(creationSequence).padStart(16,"0")}.${String(k).padStart(4,"0")}`}function callLeaves(call){return[call.hook?.owner??0,call.progress?.owner??0,call.result?.owner??0,...call.raw?.kind==="owned"?[call.raw.root,call.raw.tailRoot]:[]]}function terminal(call){return call.phase===TERMINAL_PHASE}var CALL_NAMED_RECORDS=new Set(["tool_execution_start","tool_execution_update","tool_execution_end","tool_hook_status"]),streamEvent=record=>Object(Reflect.get(record,"assistantMessageEvent"));function streamsCall(record){let kind=Reflect.get(streamEvent(record),"type");return Reflect.get(record,"type")==="message_update"&&typeof kind=="string"&&kind.startsWith("toolcall_")}function toolcallIndex(record){let index=Reflect.get(streamEvent(record),"contentIndex");return streamsCall(record)&&typeof index=="number"?index:void 0}function unvouchedCall(record){return CALL_NAMED_RECORDS.has(String(Reflect.get(record,"type")))||streamsCall(record)?CALL_UNKNOWN:void 0}import{randomUUID as randomUUID11}from"node:crypto";function carriesExtensionOwner(command){let type="type"in command?String(command.type):"";return type==="extension_request"||type.startsWith("eval_cells.")}var ExtensionOwner=class{constructor(wire){this.cancellation=new AbortController,this.wire=wire,this.state=new Int32Array(wire.retirement),this.context=Object.freeze({ownerId:wire.ownerId,disconnectSignal:this.cancellation.signal,admit:dispatch=>{if(Atomics.load(this.state,0)!==0)throw new DOMException("RPC owner retired","AbortError");return dispatch()}})}get retired(){return Atomics.load(this.state,0)!==0}retire(){Atomics.store(this.state,0,1),this.cancellation.abort()}},ExtensionTransportOwner=class{constructor(){this.ownerId=randomUUID11(),this.bindings=new Map,this.closed=!1}get retired(){return this.closed}capture(bindingGeneration){if(this.closed)throw new DOMException("RPC transport retired","AbortError");let existing=this.bindings.get(bindingGeneration);if(existing)return existing;let owner=new ExtensionOwner({ownerId:this.ownerId,bindingGeneration,retirement:new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT)});return this.bindings.set(bindingGeneration,owner),owner}peek(bindingGeneration){return this.closed?void 0:this.bindings.get(bindingGeneration)}retireBinding(bindingGeneration){this.bindings.get(bindingGeneration)?.retire()}retire(){this.closed=!0;for(let owner of this.bindings.values())owner.retire();this.bindings.clear()}};var BOUNDED_ID=/^[A-Za-z0-9][A-Za-z0-9:_-]*$/,CONTENT_DIGEST=/^[0-9a-f]{64}$/,CONTENT_REF=/^c-[0-9]{16}(?::[0-9]{3})*$/,BASE_REF=/^c-[0-9]{16}:base$/,RESERVED_STEP=/:base(?::|$)/,refused=reason=>({ok:!1,reason});function parseBoundedId(value){return value.length===0?refused("empty"):Buffer.byteLength(value)>128?refused("overlong"):BOUNDED_ID.test(value)?{ok:!0,value}:refused("forbidden_character")}function parseContentDigest(value){return value.length===0?refused("empty"):CONTENT_DIGEST.test(value)?{ok:!0,value}:refused("malformed")}function parseContentRef(value){let bounded2=parseBoundedId(value);return bounded2.ok?RESERVED_STEP.test(value)?refused("reserved"):CONTENT_REF.test(value)?(value.length-18)/4>8?refused("too_deep"):{ok:!0,value}:refused("malformed"):bounded2}function parseBaseRef(value){let bounded2=parseBoundedId(value);return bounded2.ok?BASE_REF.test(value)?{ok:!0,value}:refused("malformed"):bounded2}function parsePageRef(value){let base=parseBaseRef(value);if(base.ok)return{ok:!0,value:{kind:"base",ref:base.value}};let content=parseContentRef(value);return content.ok?{ok:!0,value:{kind:"catalog",ref:content.value}}:content}function protocolId(value){let parsed=parseBoundedId(value);if(!parsed.ok)throw new RangeError(`not a bounded protocol id (${parsed.reason}): ${value.length} chars`);return parsed.value}function fixed(value,digits,bound,what){if(!Number.isSafeInteger(value)||value<0||value>=bound)throw new RangeError(`${what} out of range: ${value}`);return String(value).padStart(digits,"0")}function minted(value){let parsed=parseContentRef(value);if(!parsed.ok)throw new RangeError(`catalog ref ${parsed.reason}`);return parsed.value}var catalogRootRef=counter=>minted(`c-${fixed(counter,16,10**16,"catalog counter")}`),childRef=(parent,index)=>minted(`${parent}:${fixed(index,3,128,"catalog child index")}`);function baseRef(root){let parsed=parseBaseRef(`${root}:base`);if(!parsed.ok)throw new RangeError(`base ref ${parsed.reason}`);return parsed.value}var refSteps=ref=>ref.split(":").slice(1).map(Number);import{open as open4,readFile as readFile2,unlink,writeFile as writeFile2}from"node:fs/promises";var nodeCompactStorageIo={writeFile:(path,data)=>writeFile2(path,data,{flag:"wx",mode:384}),readFile:async(path,range)=>{if(!range)return readFile2(path);let handle=await open4(path,"r");try{let{buffer,bytesRead}=await handle.read(Buffer.alloc(range.length),0,range.length,range.offset);return buffer.subarray(0,bytesRead)}finally{await handle.close()}},unlink:path=>unlink(path)};function describeCause(cause){try{return cause instanceof Error?cause.message:String(cause)}catch{return"unprintable failure cause"}}var CompactStorageReadError=class extends Error{constructor(operation,path,cause){super(`compact storage ${operation} failed for ${path}: ${describeCause(cause)}`,{cause}),this.name="CompactStorageReadError",this.operation=operation,this.path=path}};import{dirname as dirname2,join as join5}from"node:path";import{open as open5,rm as rm4}from"node:fs/promises";import{randomUUID as randomUUID13}from"node:crypto";import{randomUUID as randomUUID12}from"node:crypto";import{lstat as lstat3,mkdir as mkdir3,rename as rename2,rm as rm3,rmdir,writeFile as writeFile3}from"node:fs/promises";import{dirname,join as join4}from"node:path";var MARKER=ROOT_MARKER,CompactSpoolRefusedError=class extends Error{constructor(reason,path,cause,cleanupFailure){let detail=cause===void 0?"":`: ${describeCause(cause)}`,kept=cleanupFailure===void 0?"":`; removing the directory failed: ${describeCause(cleanupFailure)}`;super(`compact spool directory refused (${reason}): ${path}${detail}${kept}`,{cause}),this.name="CompactSpoolRefusedError",this.reason=reason,this.path=path}};async function createSpoolDir(dir){await mkdir3(dirname(dir),{recursive:!0,mode:448});try{await mkdir3(dir,{mode:448})}catch(cause){throw cause.code==="EEXIST"?new CompactSpoolRefusedError("pre_existing",dir):cause}let token=randomUUID12(),temporary=join4(dir,`${MARKER}.${token}.tmp`);try{await writeFile3(temporary,JSON.stringify({kind:"scratch",token,owner:await currentRootOwner()}),{flag:"wx",mode:384}),await rename2(temporary,join4(dir,MARKER))}catch(cause){throw await abandonSpoolDir(dir,cause,temporary)}return token}async function abandonSpoolDir(dir,cause,temporary){try{return await rm3(temporary,{force:!0}),cause.code!=="EEXIST"&&await rm3(join4(dir,MARKER),{force:!0}),await rmdir(dir),new CompactSpoolRefusedError("marker_write_failed",dir,cause)}catch(cleanupFailure){return new CompactSpoolRefusedError("marker_write_failed",dir,cause,cleanupFailure)}}async function removeSpoolDir(dir,token){let owned=await lstat3(dir).catch(cause=>{if(cause.code!=="ENOENT")throw cause});if(owned===void 0)return;let refusal=await refusalFor(dir,owned,token);if(refusal)throw new CompactSpoolRefusedError(refusal,dir);await rm3(dir,{recursive:!0,force:!0})}async function refusalFor(dir,owned,token){if(owned.isSymbolicLink())return"symlink";if(!owned.isDirectory())return"not_directory";let markerPath=join4(dir,MARKER),marker=await lstat3(markerPath).catch(()=>{});if(!marker?.isFile()||(await readRootMarker(dir))?.token!==token)return"marker_missing";let uid=process.getuid?.();if(uid!==void 0){if(owned.uid!==uid||marker.uid!==uid)return"foreign_owner";if(((owned.mode|marker.mode)&63)!==0)return"wide_mode"}}var RECLAIM_WORK_ALLOWANCE_BYTES=1024*1024,RECLAIM_RETRY_DELAYS_MS=[100,400,1600,6400,25600],FAILURE_HISTORY=32,FILE_PREFIX={spill_write:"leaf",value_write:"value",node_write:"node"},HALTING=new Set(["spill_write","value_write","node_write","spool_create"]),CompactSpoolStorage=class{assertReadable(){if(this.retired)throw new CompactReadError("retired")}beginRead(){this.assertReadable(),this.reads++,this.reading??=Promise.withResolvers();let done=!1;return()=>{done||(done=!0,--this.reads===0&&(this.reading?.resolve(),this.reading=void 0))}}constructor(dir,io,health=new RecoveryStorageHealth(recoveryAgentDir)){this.failures=[],this.nextFile=1,this.chain=Promise.resolve(),this.queued=0,this.spillQueued=!1,this.halted=!1,this.retired=!1,this.pendingIoCopyBytes=0,this.spillBytesWritten=0,this.reclaimDebtBytes=0,this.reads=0,this.dir=dir,this.io=io,this.health=health}async repair(){let revision=await this.health.recover(async()=>{let path=join5(dirname2(this.dir),`.senpi-repair-${randomUUID13()}`);try{let file=await open5(path,"wx",384);try{await file.writeFile("repair"),await file.sync()}finally{await file.close()}}finally{await rm4(path,{force:!0})}});return this.halted=!1,this.spoolToken===void 0&&(this.dirReady=void 0),this.scheduleSpill(),await this.idle(),revision}async idle(){for(;this.queued>0;)await this.chain}async retire(){this.retired=!0,await this.reading?.promise,await this.idle();let token=this.spoolToken;if(token!==void 0){try{await removeSpoolDir(this.dir,token)}catch(cause){throw this.fail("reclaim",this.dir,cause,0),cause}this.spoolToken=void 0,this.reclaimDebtBytes=0}}async readFile(path,bytes,operation,range){let done=this.beginRead();try{let result=await this.readCommittedFile(path,bytes,operation,range);return this.assertReadable(),result}finally{done()}}async readCommittedFile(path,bytes,operation,range){let data;try{data=await this.io.readFile(path,range)}catch(cause){throw this.readFailure(operation,path,cause)}if(data.byteLength!==bytes)throw this.readFailure(operation,path,new Error(`expected ${bytes} bytes, found ${data.byteLength}`));return data}async writeFile(data,operation,retainedInMemoryBytes){let path=await this.ensureDir(retainedInMemoryBytes);if(path===void 0)return;let file=join5(path,`${FILE_PREFIX[operation]??"page"}-${this.nextFile++}.bin`);this.pendingIoCopyBytes+=data.byteLength;try{return this.health.needsRecovery?await this.health.recover(()=>this.io.writeFile(file,data)):await this.io.writeFile(file,data),this.spillBytesWritten+=data.byteLength,file}catch(cause){try{this.fail(operation,file,cause,retainedInMemoryBytes)}finally{this.discard(file,data.byteLength)}return}finally{this.pendingIoCopyBytes-=data.byteLength}}discard(path,bytes){this.retired||(this.reclaimDebtBytes+=bytes,this.enqueue("reclaim",()=>this.reclaim(path,bytes,0)))}async reclaim(path,bytes,attempt){try{await this.io.unlink(path)}catch(cause){if(cause.code!=="ENOENT"){this.fail("reclaim",path,cause,0);let delay2=RECLAIM_RETRY_DELAYS_MS[attempt];delay2!==void 0&&setTimeout(()=>{this.retired||this.enqueue("reclaim",()=>this.reclaim(path,bytes,attempt+1))},delay2).unref?.();return}}this.reclaimDebtBytes-=bytes,this.scheduleSpill()}get spillAllowed(){return!this.halted&&!this.retired}get spillStopped(){return this.halted||this.reclaimDebtBytes>RECLAIM_WORK_ALLOWANCE_BYTES}enqueue(operation,job){this.queued++,this.chain=this.chain.then(job).catch(cause=>{operation==="spill_write"&&(this.spillQueued=!1),!(this.retired&&cause instanceof CompactReadError&&cause.reason==="retired")&&this.fail(operation,this.dir,cause,0)}).finally(()=>{this.queued--})}ensureDir(retained){return this.dirReady??=createSpoolDir(this.dir).then(token=>(this.spoolToken=token,this.dir),cause=>{this.fail("spool_create",this.dir,cause,retained)}),this.dirReady}readFailure(operation,path,cause){return this.fail(operation,path,cause,0),new CompactStorageReadError(operation,path,cause)}fail(operation,path,cause,retained){(HALTING.has(operation)||operation==="page_write")&&this.health.unavailable(),HALTING.has(operation)&&(this.halted=!0),this.record({operation,path,cause:describeCause(cause),retainedInMemoryBytes:retained})}record(failure){this.failures.push(failure),this.failures.length>FAILURE_HISTORY&&this.failures.shift()}};var COMPACT_SEGMENT_BYTES=65536,CompactSegmentStorage=class extends CompactSpoolStorage{async writeSegment(texts,operation){let data=Buffer.from(texts.join(""),"utf16le"),path=await this.writeFile(data,operation,data.byteLength);if(path!==void 0)return{path,bytes:data.byteLength,operation,live:new Map,liveBytes:0,readers:0,rewritten:!1}}segmentRuns(entries){let runs=[],bytes=0;for(let[entry,size]of entries){let run=runs.at(-1);run&&bytes+size<=COMPACT_SEGMENT_BYTES?(run.push(entry),bytes+=size):(runs.push([entry]),bytes=size)}return runs}async writeSegments(texts,operation){let placements=[],written=[],complete=!1;try{for(let run of this.segmentRuns(texts.map((text,n)=>[n,text.length*2]))){let segment=await this.writeSegment(run.map(n=>texts[n]),operation);if(!segment)return;written.push(segment);let offset=0;for(let n of run)placements[n]=[segment,offset],offset+=texts[n].length*2}return complete=!0,placements}finally{if(!complete)for(let stray of written)this.discard(stray.path,stray.bytes)}}place(segment,id,offset,bytes){let slot={segment,offset,bytes};return segment.live.set(id,slot),segment.liveBytes+=bytes,slot}leave(id,slot){let segment=slot.segment;segment.live.delete(id),segment.liveBytes-=slot.bytes,this.settle(segment)}async readSlot(slot){let{segment,offset,bytes}=slot;segment.readers++;try{return await this.readFile(segment.path,bytes,"leaf_read",{offset,length:bytes})}finally{segment.readers--,this.settle(segment)}}settle(segment){segment.live.size?!segment.rewritten&&segment.liveBytes*2<segment.bytes&&(segment.rewritten=!0,this.enqueue("reclaim",()=>this.rewrite(segment))):segment.readers||this.discard(segment.path,segment.bytes)}async rewrite(segment){if(!this.spillAllowed||!segment.live.size)return;segment.readers++;let next,copied=0;try{let moving=[...segment.live].sort(([,a],[,b])=>a.offset-b.offset),texts=[];for(let n=0;n<moving.length;){let start=moving[n][1].offset,end=start,run=[];for(;n<moving.length&&moving[n][1].offset===end;n++)run.push(moving[n][1]),end+=moving[n][1].bytes;let data=await this.readFile(segment.path,end-start,"leaf_read",{offset:start,length:end-start});this.pendingIoCopyBytes+=data.byteLength,copied+=data.byteLength;for(let slot of run)texts.push(data.toString("utf16le",slot.offset-start,slot.offset-start+slot.bytes))}next=await this.writeSegment(texts,segment.operation);let offset=0;for(let[id,slot]of moving)next&&segment.live.delete(id)&&(segment.liveBytes-=slot.bytes,next.live.set(id,slot),next.liveBytes+=slot.bytes,slot.segment=next,slot.offset=offset),offset+=slot.bytes}catch(error){if(!(error instanceof CompactReadError&&error.reason==="retired"))throw error}finally{this.pendingIoCopyBytes-=copied,segment.readers--,this.settle(segment),next&&this.settle(next)}}};var CompactCommitDependencies=class{constructor(store2,ready){this.pending=new Map,this.dependants=new Map,this.store=store2,store2.subscribeCommitted(id=>{let keys=this.dependants.get(id);this.dependants.delete(id);for(let key of keys??[]){let pending2=this.pending.get(key);pending2?.delete(id),pending2?.size===0&&(this.pending.delete(key),ready(key))}})}get size(){return this.pending.size}has(key){return this.pending.has(key)}set(key,refs){this.delete(key);let pending2=new Set(refs.filter(id=>!this.store.isCommitted(id)));if(pending2.size!==0){this.pending.set(key,pending2);for(let id of pending2){let keys=this.dependants.get(id)??new Set;keys.add(key),this.dependants.set(id,keys)}}}delete(key){for(let id of this.pending.get(key)??[]){let keys=this.dependants.get(id);keys?.delete(key),keys?.size===0&&this.dependants.delete(id)}this.pending.delete(key)}};var CompactTextRoots=class{constructor(store2){this.nodes=new Map,this.next=-1,this.store=store2,this.pending=new CompactCommitDependencies(store2,id=>store2.committed(id))}get residentNodes(){return this.nodes.size}own(refs){if(refs.length===0)return 0;if(refs.length===1){let[ref]=refs;return this.store.adjust(ref,1,0),ref}let middle=Math.floor(refs.length/2),left=this.own(refs.slice(0,middle)),right=this.own(refs.slice(middle));if(left===0)return right;if(right===0)return left;let root=this.join(left,right);return this.store.adjust(left,-1,0),this.store.adjust(right,-1,0),root}units(id){return id===0?0:id>0?this.store.leafUnits(id):this.node(id).units}isCommitted(id){return this.nodes.has(id)&&!this.pending.has(id)}append(root,text,structured=!1){this.units(root);let leaf=this.store.createLeaf(text,structured);if(root===0)return leaf;let result=this.appendLeaf(root,leaf);return this.store.adjust(root,-1,0),this.store.adjust(leaf,-1,0),result}adjust(id,live,pins){let work=[[id,live,pins]];for(let next=work.pop();next;next=work.pop()){let[id2,live2,pins2]=next;if(id2>=0){this.store.adjust(id2,live2,pins2);continue}let node=this.node(id2),beforeLive=+(node.live>0),beforePin=+(node.live===0&&node.pins>0);if(node.live+live2<0||node.pins+pins2<0)throw new CompactReadError("ownership");node.live+=live2,node.pins+=pins2;let liveChange=+(node.live>0)-beforeLive,pinChange=+(node.live===0&&node.pins>0)-beforePin;(liveChange||pinChange)&&work.push([node.right,liveChange,pinChange],[node.left,liveChange,pinChange]),node.live===0&&node.pins===0&&(this.pending.delete(id2),this.nodes.delete(id2))}}async read(root,tail,offset,units,maxLeaves=2,valid=()=>this.store.assertReadable()){this.store.assertReadable(),valid();let length=this.units(root);if(!Number.isSafeInteger(offset)||!Number.isSafeInteger(units)||offset<0||units<0||offset+units>length+tail.length)throw new CompactReadError("range");if(units>COMPACT_LEAF_CODE_UNITS)throw new CompactReadError("size_limit");if(!Number.isSafeInteger(maxLeaves)||maxLeaves<1||maxLeaves>2)throw new CompactReadError("count_limit");let selected=[],visit=(id,start,end)=>{if(!(start>=end||id===0))if(id>0){if(selected.length===maxLeaves)throw new CompactReadError("count_limit");selected.push({id,offset:start,units:end-start})}else{let node=this.node(id),leftUnits=this.units(node.left);visit(node.left,start,Math.min(end,leftUnits)),visit(node.right,Math.max(0,start-leftUnits),end-leftUnits)}};visit(root,offset,Math.min(length,offset+units));let tailUnits=units===0?0:Math.max(0,offset+units-Math.max(offset,length));if(selected.length+ +(tailUnits>0)>maxLeaves)throw new CompactReadError("count_limit");this.store.adjust(root,0,1);let done=this.store.beginRead();try{let result="";for(let part of selected){let text=await this.store.readLeaf(part.id);valid(),result+=text.slice(part.offset,part.offset+part.units)}return valid(),result+tail.slice(Math.max(0,offset-length),Math.max(0,offset-length)+tailUnits)}finally{this.store.adjust(root,0,-1),done()}}node(id){let node=this.nodes.get(id);if(!node)throw new CompactReadError("ownership");return node}async*chunks(root,valid){if(valid(),root!==0)if(root>0){let text=await this.read(root,"",0,this.units(root),1,valid);valid(),yield text}else{let node=this.node(root);yield*this.chunks(node.left,valid),yield*this.chunks(node.right,valid)}}appendLeaf(root,leaf){let node=this.nodes.get(root);if(!node||node.full)return this.join(root,leaf);let right=this.appendLeaf(node.right,leaf),result=this.join(node.left,right);return this.store.adjust(right,-1,0),result}height(id){return id>0?0:this.node(id).height}join(left,right){let id=this.next--;return this.nodes.set(id,{left,right,units:this.units(left)+this.units(right),height:1+Math.max(this.height(left),this.height(right)),full:this.height(left)===this.height(right)&&(this.nodes.get(left)?.full??!0)&&(this.nodes.get(right)?.full??!0),live:1,pins:0}),this.store.adjust(left,1,0),this.store.adjust(right,1,0),this.pending.set(id,[left,right]),id}};var COMPACT_LEAF_CODE_UNITS=32768,VALUE_FLUSH_BATCH=128,CompactWriteError=class extends Error{constructor(reason,limit){super(`compact write refused (${reason}${limit===void 0?"":`: depth above ${limit}`})`),this.name="CompactWriteError",this.reason=reason,this.limit=limit}},CompactContentStore=class extends CompactSegmentStorage{subscribeCommitted(listener){this.subscribers.add(listener)}committed(id){for(let listener of this.subscribers)listener(id)}leafUnits(id){let leaf=this.leaves.get(id);if(!leaf)throw new CompactReadError("ownership");return leaf.units}constructor(options){super(options.dir,options.io??nodeCompactStorageIo,options.health),this.leaves=new Map,this.ramLeaves=new Set,this.ramValues=new Set,this.valueQueued=!1,this.structuredBytes={resident:0,spilled:0,pinned:0},this.nextLeafId=1,this.residentPayloadBytes=0,this.pinnedOnlyBytes=0,this.spilledLiveBytes=0,this.subscribers=new Set,this.text=new CompactTextRoots(this),this.spillAboveBytes=options.spillAboveBytes??4*1024*1024,this.spillTargetBytes=options.spillTargetBytes??2*1024*1024}createLeaf(text,value=!1){if(this.assertReadable(),text.length>COMPACT_LEAF_CODE_UNITS)throw new CompactWriteError("size_limit");let id=this.nextLeafId++;return this.leaves.set(id,{text,units:text.length,value,live:1,pins:0,state:"ram"}),(value?this.ramValues:this.ramLeaves).add(id),value?this.structuredBytes.resident+=text.length*2:this.residentPayloadBytes+=text.length*2,this.scheduleSpill(),id}ownFile(path,bytes){let id=this.createLeaf("",!0),leaf=this.leaves.get(id);if(!leaf)throw new CompactReadError("ownership");return leaf.file={path,bytes},id}adjust(id,live,pins){if(id===0)return;if(id<0)return this.text.adjust(id,live,pins);let leaf=this.leaves.get(id);if(!leaf||leaf.live+live<0||leaf.pins+pins<0)throw new CompactReadError("ownership");let pinnedOnly=leaf.live===0&&leaf.pins>0;if(leaf.live+=live,leaf.pins+=pins,pinnedOnly!==(leaf.live===0&&leaf.pins>0)){let bytes=(pinnedOnly?-2:2)*leaf.units;leaf.value?this.structuredBytes.pinned+=bytes:this.pinnedOnlyBytes+=bytes}if(!(leaf.live>0||leaf.pins>0)){if(this.leaves.delete(id),leaf.file&&this.discard(leaf.file.path,leaf.file.bytes),(leaf.value?this.ramValues:this.ramLeaves).delete(id),leaf.state==="committed"&&leaf.slot){leaf.value?this.structuredBytes.spilled-=leaf.units*2:this.spilledLiveBytes-=leaf.units*2,this.leave(id,leaf.slot);return}leaf.value?this.structuredBytes.resident-=leaf.units*2:this.residentPayloadBytes-=leaf.units*2}}isCommitted(id){return id<=0?id===0||this.text.isCommitted(id):this.leaves.get(id)?.state==="committed"}async readLeaf(id){this.assertReadable();let leaf=this.leaves.get(id);if(!leaf)throw new CompactReadError("ownership");this.adjust(id,0,1);try{if(leaf.text!==void 0)return leaf.text;if(!leaf.slot)throw new CompactReadError("ownership");return(await this.readSlot(leaf.slot)).toString("utf16le")}finally{this.adjust(id,0,-1)}}status(){return{structuredBytes:{...this.structuredBytes},residentPayloadBytes:this.residentPayloadBytes,pendingIoCopyBytes:this.pendingIoCopyBytes,pinnedOnlyBytes:this.pinnedOnlyBytes,spilledLiveBytes:this.spilledLiveBytes,spillBytesWritten:this.spillBytesWritten,reclaimDebtBytes:this.reclaimDebtBytes,spillFailureRetainedBytes:this.spillStopped?Math.max(0,this.residentPayloadBytes-this.spillTargetBytes):0,spillHalted:this.spillStopped,failures:[...this.failures]}}scheduleSpill(){!this.valueQueued&&this.spillAllowed&&this.ramValues.size&&this.reclaimDebtBytes<=RECLAIM_WORK_ALLOWANCE_BYTES&&(this.valueQueued=!0,this.enqueue("value_write",async()=>{try{await this.flushValues()}finally{this.valueQueued=!1}this.scheduleSpill()})),!(this.spillQueued||!this.spillAllowed||this.residentPayloadBytes<=this.spillAboveBytes)&&(this.reclaimDebtBytes>RECLAIM_WORK_ALLOWANCE_BYTES||(this.spillQueued=!0,this.enqueue("spill_write",()=>this.spillNext())))}async spillNext(){let[id]=this.ramLeaves;id!==void 0&&await this.flushLeaf(id),this.spillQueued=!1,this.residentPayloadBytes>this.spillTargetBytes&&(this.spillQueued=this.spillAllowed&&this.ramLeaves.size>0,this.spillQueued&&this.enqueue("spill_write",()=>this.spillNext()))}async flushValues(){if(this.spillStopped)return;let batch=[];for(let id of this.ramValues)if(batch.push([id,this.leafUnits(id)*2]),batch.length===VALUE_FLUSH_BATCH)break;await this.flushLeaves(this.segmentRuns(batch)[0]??[])}flushLeaf(id){return this.flushLeaves([id])}async flushLeaves(ids,operation){if(!this.spillAllowed)return;let batch=[];for(let id of ids){let leaf=this.leaves.get(id);leaf?.state!=="ram"||leaf.text===void 0||(leaf.state="pending",(leaf.value?this.ramValues:this.ramLeaves).delete(id),batch.push([id,leaf,leaf.text]))}if(!batch.length)return;let placements;try{let texts=batch.map(([,,text])=>text);placements=await this.writeSegments(texts,operation??(batch[0][1].value?"value_write":"spill_write"))}finally{for(let[id,leaf]of placements?[]:batch)leaf.state="ram",this.leaves.get(id)===leaf&&(leaf.value?this.ramValues:this.ramLeaves).add(id)}if(!placements)return;let placed=[];for(let[n,[id,leaf]]of batch.entries()){let[segment,offset]=placements[n],bytes=leaf.units*2;this.leaves.get(id)===leaf&&!this.retired&&(leaf.state="committed",leaf.text=void 0,leaf.slot=this.place(segment,id,offset,bytes),leaf.value?(this.structuredBytes.resident-=bytes,this.structuredBytes.spilled+=bytes):(this.residentPayloadBytes-=bytes,this.spilledLiveBytes+=bytes),placed.push(id))}for(let segment of new Set(placements.map(([segment2])=>segment2)))this.settle(segment);for(let id of placed)this.committed(id)}};import{createHash as createHash4}from"node:crypto";var CATALOG_FORMAT="senpi-recovery-catalog",CATALOG_VERSION=1,CATALOG_ENCODING="utf16le",CATALOG_NODE_MAX_UNITS=COMPACT_LEAF_CODE_UNITS,storedBytes=text=>Buffer.from(text,CATALOG_ENCODING);function catalogDigester(domain,length){let tag=Buffer.from(`${CATALOG_FORMAT}/${CATALOG_VERSION}/${CATALOG_ENCODING}/${domain}`,"ascii"),prefix=Buffer.alloc(1+tag.length+8);prefix.writeUInt8(tag.length,0),tag.copy(prefix,1),prefix.writeBigUInt64BE(BigInt(length),1+tag.length);let hash=createHash4("sha256").update(prefix),fed=0;return{update:bytes=>{fed+=bytes.length,hash.update(bytes)},finish:()=>{if(fed!==length)throw new RangeError(`catalog digest fed ${fed} of ${length} bytes`);let parsed=parseContentDigest(hash.digest("hex"));if(!parsed.ok)throw new RangeError("sha256 produced a malformed digest");return parsed.value}}}function catalogDigest(domain,bytes){let digester=catalogDigester(domain,bytes.length);return digester.update(bytes),digester.finish()}var HEAD=`{"format":"${CATALOG_FORMAT}","version":${CATALOG_VERSION},"entries":[`,TAIL="]}",encodeEntry=entry=>`{"kind":"${entry.kind}","id":"${entry.id}","length":${entry.length},"digest":"${entry.digest}"}`,CatalogNodeWriter=class{constructor(){this.parts=[],this.units=HEAD.length+TAIL.length}get count(){return this.parts.length}push(entry){if(!Number.isSafeInteger(entry.length)||entry.length<0)throw new RangeError("catalog entry length");let part=encodeEntry(entry),units=this.units+part.length+ +(this.parts.length>0);return this.parts.length===128||units>CATALOG_NODE_MAX_UNITS?!1:(this.parts.push(part),this.units=units,!0)}encode(){return`${HEAD}${this.parts.join(",")}${TAIL}`}},CatalogNodeSchema=external_exports.object({format:external_exports.literal(CATALOG_FORMAT),version:external_exports.literal(CATALOG_VERSION),entries:external_exports.array(external_exports.object({kind:external_exports.string(),id:external_exports.string(),length:external_exports.number().int().nonnegative(),digest:external_exports.string()}).strict()).max(128)}).strict();function decodeCatalogNode(text){let json;try{json=JSON.parse(text)}catch(cause){if(cause instanceof SyntaxError)return{ok:!1,reason:"schema"};throw cause}let parsed=CatalogNodeSchema.safeParse(json);if(!parsed.success)return{ok:!1,reason:"schema"};let entries=[];for(let raw of parsed.data.entries){let kind=parseBoundedId(raw.kind),id=parseBoundedId(raw.id),digest=parseContentDigest(raw.digest);if(!kind.ok||!id.ok||!digest.ok)return{ok:!1,reason:"schema"};entries.push({kind:kind.value,id:id.value,length:raw.length,digest:digest.value})}return{ok:!0,entries}}var FRAGMENT_MAX_BYTES=131072,FRAGMENT_ENVELOPE_MAX_BYTES=Math.ceil(FRAGMENT_MAX_BYTES/3)*4,isIndex=value=>Number.isSafeInteger(value)&&value>=0;function assertRange(offset,length,total){if(!isIndex(offset)||!isIndex(length))throw new CompactReadError("range");if(length>FRAGMENT_MAX_BYTES)throw new CompactReadError("size_limit");if(offset+length>total)throw new CompactReadError("range")}function startAtOrBefore(starts,count,offset){let low=0,high=count-1;for(;low<high;){let middle=low+high+1>>1;(starts[middle]??Number.POSITIVE_INFINITY)<=offset?low=middle:high=middle-1}return low}var FrozenLeafBytes=class{constructor(digest,leaves,starts,read){this.peakResidentLeaves=0,this.resident=0,this.length=starts[leaves.length]??0,this.digest=digest,this.leaves=leaves,this.starts=starts,this.read=read}async range(offset,length,valid){assertRange(offset,length,this.length);let out=Buffer.allocUnsafe(length),written=0;for(let index=startAtOrBefore(this.starts,this.leaves.length,offset);written<length;index++){let leaf=this.leaves[index],start=this.starts[index];if(leaf===void 0||start===void 0)throw new CompactReadError("integrity");this.peakResidentLeaves=Math.max(this.peakResidentLeaves,++this.resident);try{let stored=storedBytes(await this.read(leaf));valid?.();let from=Math.max(0,offset-start);written+=stored.copy(out,written,from,Math.min(stored.length,from+length-written))}finally{this.resident-=1}}return out}};async function openFrozenBytes(entry,leaves,read,valid,signal){let digester=catalogDigester("leaf",entry.length),starts=[0],fed=0;for(let leaf of leaves){if(signal?.aborted)throw new CompactReadError("aborted");let stored=storedBytes(await read(leaf));if(valid(),fed+=stored.length,fed>entry.length)throw new CompactReadError("integrity");digester.update(stored),starts.push(fed)}if(fed!==entry.length||digester.finish()!==entry.digest)throw new CompactReadError("integrity");return new FrozenLeafBytes(entry.digest,leaves,starts,read)}async function producePage(bytes,offset,valid){if(!isIndex(offset)||offset>=bytes.length&&bytes.length>0)throw new CompactReadError("range");let length=Math.min(FRAGMENT_MAX_BYTES,bytes.length-offset),page=await bytes.range(offset,length,valid),next=offset+length;return{offset,length,bytes:page,digest:catalogDigest("fragment",page),next:next<bytes.length?next:null,complete:next===bytes.length}}var TRANSFER_STAGING_MAX_BYTES=64*1024*1024,FRAGMENT_MAX_UNITS=FRAGMENT_MAX_BYTES/2,TransferStagingError=class extends Error{constructor(reason){super(`transfer staging refused (${reason})`),this.name="TransferStagingError",this.reason=reason}},StagedReadError=class extends Error{constructor(reason,options){super(`staged read refused (${reason})`,options),this.name="StagedReadError",this.reason=reason}},StagedTransfer=class{constructor(store2,entry,settle){this.leaves=[],this.leafDigests=[],this.fed=0,this.open=!0,this.store=store2,this.entry=entry,this.settle=settle,this.digester=catalogDigester("leaf",entry.length)}append(text){this.assertOpen();let bytes=text.length*2;bytes>FRAGMENT_MAX_BYTES&&this.refuse("fragment_over_limit"),this.fed+bytes>this.entry.length&&this.refuse("length_mismatch");try{for(let at=0;at<text.length;at+=COMPACT_LEAF_CODE_UNITS){let piece=text.slice(at,at+COMPACT_LEAF_CODE_UNITS);this.leaves.push(this.store.createLeaf(piece)),this.leafDigests.push(catalogDigest("leaf",storedBytes(piece)))}}catch(cause){throw this.abort(),cause}this.digester.update(storedBytes(text)),this.fed+=bytes}commit(){this.assertOpen(),this.fed!==this.entry.length&&this.refuse("length_mismatch"),this.open=!1;let content={ref:{variant:"staged",entry:{...this.entry,digest:this.digester.finish()}},leaves:[...this.leaves],leafDigests:[...this.leafDigests]};return this.settle(content),content}abort(){if(this.open){this.open=!1;for(let leaf of this.leaves)this.store.adjust(leaf,-1,0);this.settle(void 0)}}assertOpen(){if(!this.open)throw new TransferStagingError("staging_closed")}refuse(reason){throw this.abort(),new TransferStagingError(reason)}},TransferStaging=class{constructor(store2,maxBytes=TRANSFER_STAGING_MAX_BYTES){this.transfers=new Set,this.staged=new Map,this.reserved=0,this.closed=!1,this.store=store2,this.maxBytes=maxBytes}get stagedBytes(){return this.reserved}get residentBytes(){return this.store.status().residentPayloadBytes}begin(kind,id,length){if(this.closed)throw new TransferStagingError("staging_closed");if(!Number.isSafeInteger(length)||length<0||length%2!==0)throw new TransferStagingError("length_mismatch");if(this.reserved+length>this.maxBytes)throw new TransferStagingError("staging_over_byte_limit");this.reserved+=length;let transfer=new StagedTransfer(this.store,{kind,id,length},content=>{this.transfers.delete(transfer),content?this.staged.set(content,length):this.reserved-=length});return this.transfers.add(transfer),transfer}stage(kind,id,text){let transfer=this.begin(kind,id,text.length*2);try{for(let at=0;at<text.length;at+=FRAGMENT_MAX_UNITS)transfer.append(text.slice(at,at+FRAGMENT_MAX_UNITS));return transfer.commit()}catch(cause){throw transfer.abort(),cause}}adopt(content){let bytes=this.staged.get(content);if(bytes===void 0)throw new CompactReadError("ownership");this.staged.delete(content),this.reserved-=bytes}release(content){let bytes=this.staged.get(content);bytes!==void 0&&(this.staged.delete(content),this.reserved-=bytes);for(let leaf of content.leaves)this.store.adjust(leaf,-1,0)}abandon(content){this.staged.has(content)&&this.release(content)}pin(content,pins){for(let leaf of content.leaves)this.store.adjust(leaf,0,pins)}open(content,valid=()=>{}){return openFrozenBytes(content.ref.entry,content.leaves,leaf=>this.store.readLeaf(leaf),valid)}async*chunks(content,valid=()=>{}){let length=0;for(let[index,leaf]of content.leaves.entries()){let text;try{text=await this.store.readLeaf(leaf)}catch(cause){throw cause instanceof CompactStorageReadError||cause instanceof CompactReadError?new StagedReadError("segment_missing",{cause}):cause}if(valid(),catalogDigest("leaf",storedBytes(text))!==content.leafDigests[index])throw new StagedReadError("segment_mismatch");length+=text.length*2,yield text}if(length!==content.ref.entry.length)throw new StagedReadError("segment_mismatch")}spill(content){for(let leaf of content.leaves)this.store.enqueue("spill_write",()=>this.store.flushLeaf(leaf))}status(){return{...this.store.status(),stagedBytes:this.reserved,openTransfers:this.transfers.size}}idle(){return this.store.idle()}close(){this.closed=!0;for(let transfer of[...this.transfers])transfer.abort();for(let content of[...this.staged.keys()])this.release(content);return this.store.retire()}};var DEFAULT_TRANSCRIPT_TAIL_BYTES=256*1024*1024,TRANSCRIPT_TAIL_RESIDENT_BYTES=32*1024*1024,TAIL_KIND=protocolId("transcript-tail"),TailBudget=class{constructor(max=DEFAULT_TRANSCRIPT_TAIL_BYTES){this.held=0,this.max=max}};function stageTailEntry(staging,budget,index,text){let bytes=text.length*2;if(!(budget.held+staging.stagedBytes+bytes>budget.max)&&!(staging.residentBytes+bytes>TRANSCRIPT_TAIL_RESIDENT_BYTES))try{return staging.stage(TAIL_KIND,protocolId(`entry-${index}`),text)}catch(cause){if(cause instanceof TransferStagingError)return;throw cause}}function stageBootstrap(staging,transitions){let staged=new Map,index=0;try{for(let transition of transitions){if(transition.kind==="replace"&&(index=0),transition.kind!=="append")continue;let text=transition.entry,content=text===void 0?null:stageTailEntry(staging,new TailBudget,index,text);if(index+=1,content===void 0)throw new TransferStagingError("staging_over_byte_limit");content&&staged.set(transition,content)}return staged}catch(cause){for(let content of staged.values())staging.release(content);if(cause instanceof TransferStagingError)return;throw cause}}var TranscriptTail=class{#staging;#budget;#cuts;#superseded;constructor(staging,persistence,budget=new TailBudget){this.entries=new Map,this.kept=new Map,this.retainedBytes=0,this.#cuts=new Map,this.#superseded=!1,this.#staging=staging,this.persistence=persistence,this.#budget=budget}stage(index,text){return stageTailEntry(this.#staging,this.#budget,index,text)}adopt(index,content){this.#staging.adopt(content),this.entries.set(index,content),this.retainedBytes+=content.ref.entry.length,this.#budget.held+=content.ref.entry.length}retainCut(count){this.#cuts.set(count,(this.#cuts.get(count)??0)+1)}supersede(){if(this.#superseded=!0,this.#cuts.size===0)return this.releaseAll();for(let content of this.entries.values())this.#staging.spill(content)}releaseCut(count){let left=(this.#cuts.get(count)??0)-1;if(left>0?this.#cuts.set(count,left):this.#cuts.delete(count),this.#superseded&&this.#cuts.size===0)return this.releaseAll();let reach=this.reach();for(let[index,content]of this.kept)index<reach||(this.kept.delete(index),this.free(content))}persisted(persistence,baseCount){this.persistence=persistence;let reach=this.reach();for(let[index,content]of this.entries){if(index+baseCount>=persistence.count)break;if(this.entries.delete(index),this.retainedBytes-=content.ref.entry.length,index>=reach){this.free(content);continue}this.kept.set(index,content),this.#staging.spill(content)}}releaseAll(){for(let content of[...this.entries.values(),...this.kept.values()])this.free(content);this.entries.clear(),this.kept.clear(),this.retainedBytes=0}hold(count,baseCount){let staging=this.#staging,own=index=>this.entries.get(index)??this.kept.get(index),fileCount=Math.min(count,Math.max(0,(this.persistence?.count??0)-baseCount));for(;fileCount>0&&own(fileCount-1);)fileCount-=1;let held=new Map;for(let index=fileCount;index<count;index++){let content=own(index);content&&held.set(index,content)}for(let content of held.values())staging.pin(content,1);let released=!1;return{fileCount,persistence:this.persistence,has:index=>held.has(index),chunks:(index,valid)=>{let content=held.get(index);if(!content)throw new RangeError(`transcript tail entry ${index} is not held`);return staging.chunks(content,valid)},release:()=>{if(!released){released=!0;for(let content of held.values())staging.pin(content,-1)}}}}free(content){this.#budget.held-=content.ref.entry.length,this.#staging.release(content)}reach(){let reach=0;for(let count of this.#cuts.keys())reach=Math.max(reach,count);return reach}};var DEFAULT_TRANSCRIPT_ANCESTRY_BYTES=8*1024*1024,ANCESTRY_RECORD_BYTES=40,KIND_NAME_BYTES=64,stringBytes=value=>value===""?0:Math.ceil((16+(Buffer.byteLength(value)===value.length?value.length:2*value.length))/8)*8,AcceptedEntries=class{constructor(ids,kinds,parents,count){this.ids=ids,this.kinds=kinds,this.parents=parents,this.count=count}idsBefore(end){return this.ids.slice(0,Math.min(end,this.count))}*[Symbol.iterator](){for(let index=0;index<this.count;index++)yield{index,id:this.ids[index],kind:this.kinds[index],parentId:this.parents[index]}}},AcceptedTranscript=class{constructor(staging){this.version=0,this.leafId=null,this.base=null,this.entryIds=[],this.kinds=[],this.parents=[],this.kindNames=new Map,this.ancestryBytes=0,this.budget=new TailBudget,this.unavailable=null,this.staging=staging,this.tail=new TranscriptTail(staging,null,this.budget)}get historyVersion(){return this.version}get available(){return this.unavailable===null}bootstrap(transitions){let staged=stageBootstrap(this.staging,transitions);if(!staged)return this.markUnavailable("transcript_tail_over_byte_limit");try{for(let transition of transitions)this.apply(transition,staged.get(transition))}finally{for(let content of staged.values())this.staging.abandon(content)}}apply(transition,staged){if(this.version+=1,transition.kind==="replace"){this.tail.supersede(),this.base=transition.base,this.entryIds=[],this.kinds=[],this.parents=[],this.kindNames=new Map,this.ancestryBytes=0,this.tail=new TranscriptTail(this.staging,transition.base,this.budget),this.unavailable=null,this.missingFrom=void 0;return}if(transition.kind==="unavailable"){this.markUnavailable(transition.reason);return}if(transition.kind==="persisted"){this.persisted(transition.persistence);return}if(!(this.unavailable!==null&&this.missingFrom===void 0))if(transition.kind==="append"){let index=this.entryIds.length;if(!this.retainAncestry(transition.id,transition.type,transition.parentId))return;transition.persistence&&this.persisted(transition.persistence);let unpersisted=index+(this.base?.count??0)>=(this.tail.persistence?.count??0);if(this.missingFrom===void 0&&unpersisted&&transition.entry!==void 0){let content=staged??this.tail.stage(index,transition.entry);content?this.tail.adopt(index,content):this.markUnavailable("transcript_tail_over_byte_limit",index)}this.leafId=transition.id}else this.leafId=transition.leafId}retainAncestry(id,type,parentId){let previous=this.entryIds.at(-1),shared=previous!==void 0&&previous===parentId,kind=this.kindNames.get(type),bytes=ANCESTRY_RECORD_BYTES+stringBytes(id)+(kind===void 0?KIND_NAME_BYTES+stringBytes(type):0)+(shared?0:stringBytes(parentId??""));return this.ancestryBytes+bytes>DEFAULT_TRANSCRIPT_ANCESTRY_BYTES?(this.markUnavailable("transcript_ancestry_over_byte_limit"),!1):(kind===void 0&&this.kindNames.set(type,type),this.entryIds.push(id),this.kinds.push(kind??type),this.parents.push(shared?previous:parentId),this.ancestryBytes+=bytes,!0)}markUnavailable(reason,missingFrom){this.missingFrom=this.unavailable===null?missingFrom:void 0,this.unavailable??=reason,process.stderr.write(`senpi rpc acceptance: transcript component unavailable: ${reason}
|
|
98
|
-
`)}freeze(){return Object.freeze({historyVersion:this.version,leafId:this.leafId,base:this.base,accepted:new AcceptedEntries(this.entryIds,this.kinds,this.parents,this.entryIds.length),ancestryBytes:this.ancestryBytes,tail:this.tail,count:this.entryIds.length,unavailable:this.unavailable})}persisted(persistence){this.tail.persisted(persistence,this.base?.count??0),this.missingFrom!==void 0&&persistence.count-(this.base?.count??0)>=this.entryIds.length&&(this.missingFrom=void 0,this.unavailable=null)}release(){this.tail.releaseAll()}};import{randomUUID as randomUUID14}from"node:crypto";var CompactIndexTree=class{constructor(retain){this.residentNodes=0,this.allocatedNodes=0,this.retain=retain}get(root,key){let node=root;for(;node;){if(key===node.key)return node.value;node=key<node.key?node.left:node.right}}adjust(root,live,pins){if(!root)return;let wasLive=+(root.live>0),wasPinned=+(root.live===0&&root.pins>0);if(root.live+live<0||root.pins+pins<0)throw new CompactReadError("ownership");root.live+=live,root.pins+=pins;let l=+(root.live>0)-wasLive,p=+(root.live===0&&root.pins>0)-wasPinned;(l||p)&&(this.retain(root.value,l,p),this.adjust(root.left,l,p),this.adjust(root.right,l,p)),root.live===0&&root.pins===0&&this.residentNodes--}set(root,key,value){if(!root)return value===void 0?void 0:this.make(key,value,void 0,void 0);if(key===root.key){if(value!==void 0)return this.make(key,value,root.left,root.right);if(!root.left||!root.right){let child2=root.left??root.right;return this.adjust(child2,1,0),child2}let next=root.right;for(;next.left;)next=next.left;let right=this.set(root.right,next.key,void 0),result2=this.balance(next.key,next.value,root.left,right);return this.adjust(right,-1,0),result2}let leftward=key<root.key,child=this.set(leftward?root.left:root.right,key,value),result=this.balance(root.key,root.value,leftward?child:root.left,leftward?root.right:child);return this.adjust(child,-1,0),result}*entries(root,after){root&&((after===void 0||root.key>after)&&(yield*this.entries(root.left,after),yield[root.key,root.value]),yield*this.entries(root.right,after))}make(key,value,left,right){return this.adjust(left,1,0),this.adjust(right,1,0),this.retain(value,1,0),this.residentNodes++,this.allocatedNodes++,{key,value,left,right,live:1,pins:0,height:1+Math.max(left?.height??0,right?.height??0),size:1+(left?.size??0)+(right?.size??0)}}balance(key,value,left,right){if(left&&left.height>(right?.height??0)+1){let middle=left.right;if(middle&&middle.height>(left.left?.height??0)){let a=this.make(left.key,left.value,left.left,middle.left),b2=this.make(key,value,middle.right,right),result2=this.make(middle.key,middle.value,a,b2);return this.adjust(a,-1,0),this.adjust(b2,-1,0),result2}let b=this.make(key,value,left.right,right),result=this.make(left.key,left.value,left.left,b);return this.adjust(b,-1,0),result}if(right&&right.height>(left?.height??0)+1){let middle=right.left;if(middle&&middle.height>(right.right?.height??0)){let a2=this.make(key,value,left,middle.left),b=this.make(right.key,right.value,middle.right,right.right),result2=this.make(middle.key,middle.value,a2,b);return this.adjust(a2,-1,0),this.adjust(b,-1,0),result2}let a=this.make(key,value,left,right.left),result=this.make(right.key,right.value,a,right.right);return this.adjust(a,-1,0),result}return this.make(key,value,left,right)}};var VALUE_PAGE_ITEMS=128,VALUE_PAGE_CODE_UNITS=4096,INLINE_JSON_LENGTH=64,scalar=value=>value===null||typeof value=="boolean"||typeof value=="number"&&Number.isFinite(value),plain=value=>typeof value=="object"&&value!==null&&(Array.isArray(value)||Object.getPrototypeOf(value)===Object.prototype||Object.getPrototypeOf(value)===null);function ownValue(store2,make,value){let owned=new Set,ancestors=new Set,stack=[],take=(page,children)=>{let ref=make(page);owned.add(ref.owner);for(let child of children)store2.adjust(child.owner,-1,0),owned.delete(child.owner);return ref},ownString=text=>{let next;for(let end=text.length;end>0;end=Math.max(0,end-VALUE_PAGE_CODE_UNITS))next=take({kind:"string",text:text.slice(Math.max(0,end-VALUE_PAGE_CODE_UNITS),end),next},next?[next]:[]);if(!next)throw new CompactWriteError("unsupported_value");return next},open6=object=>{if(ancestors.has(object))throw new CompactWriteError("cycle");ancestors.add(object);let array=Array.isArray(object),entries=array?object:Object.entries(object);stack.push({object,array,entries,end:entries.length,children:[],index:0,refs:[],next:void 0}),slice(stack[stack.length-1])},slice=frame=>{let part=frame.entries.slice(Math.max(0,frame.end-VALUE_PAGE_ITEMS),frame.end);frame.children=frame.array?part:part.flat(),frame.index=0,frame.refs=[]},close=frame=>{let refs=frame.refs,items=frame.array?{kind:"array",items:refs,next:frame.next}:{kind:"object",items:pairs(refs),next:frame.next};if(frame.next=take(items,frame.next?[...refs,frame.next]:refs),frame.end>VALUE_PAGE_ITEMS){frame.end-=VALUE_PAGE_ITEMS,slice(frame);return}return stack.pop(),ancestors.delete(frame.object),frame.next};try{let pending2={value},done;for(;;){if(pending2){let current2=pending2.value;if(pending2=void 0,scalar(current2)||typeof current2=="string"&&JSON.stringify(current2).length<=INLINE_JSON_LENGTH)done={node:0,owner:0,value:current2};else if(typeof current2=="string")done=ownString(current2);else if(plain(current2))open6(current2);else throw new CompactWriteError("unsupported_value")}let frame=stack[stack.length-1];if(done){if(!frame)return done;frame.refs.push(done),done=void 0}if(!frame)throw new CompactWriteError("unsupported_value");frame.index<frame.children.length?pending2={value:frame.children[frame.index++]}:done=close(frame)}}catch(error){for(let owner of owned)store2.adjust(owner,-1,0);throw error}}function pairs(refs){let fields=[];for(let index=0;index+1<refs.length;index+=2)fields.push([refs[index],refs[index+1]]);return fields}var __addDisposableResource=function(env,value,async){if(value!=null){if(typeof value!="object"&&typeof value!="function")throw new TypeError("Object expected.");var dispose2,inner;if(async){if(!Symbol.asyncDispose)throw new TypeError("Symbol.asyncDispose is not defined.");dispose2=value[Symbol.asyncDispose]}if(dispose2===void 0){if(!Symbol.dispose)throw new TypeError("Symbol.dispose is not defined.");dispose2=value[Symbol.dispose],async&&(inner=dispose2)}if(typeof dispose2!="function")throw new TypeError("Object not disposable.");inner&&(dispose2=function(){try{inner.call(this)}catch(e){return Promise.reject(e)}}),env.stack.push({value,dispose:dispose2,async})}else async&&env.stack.push({async:!0});return value},__disposeResources=(function(SuppressedError2){return function(env){function fail(e){env.error=env.hasError?new SuppressedError2(e,env.error,"An error was suppressed during disposal."):e,env.hasError=!0}var r,s=0;function next(){for(;r=env.stack.pop();)try{if(!r.async&&s===1)return s=0,env.stack.push(r),Promise.resolve().then(next);if(r.dispose){var result=r.dispose.call(r.value);if(r.async)return s|=2,Promise.resolve(result).then(next,function(e){return fail(e),next()})}else s|=1}catch(e){fail(e)}if(s===1)return env.hasError?Promise.reject(env.error):Promise.resolve();if(env.hasError)throw env.error}return next()}})(typeof SuppressedError=="function"?SuppressedError:function(error,suppressed,message){var e=new Error(message);return e.name="SuppressedError",e.error=error,e.suppressed=suppressed,e}),CompactValues=class{constructor(store2){this.residentPages=0,this.peakResidentPages=0,this.store=store2}record(fields){let entries=[...fields],next;for(let end=entries.length;end>0||!next;end=Math.max(0,end-128)){let items=entries.slice(Math.max(0,end-128),end).map(([key,value])=>[this.own(key),value]),ref=this.make({kind:"object",items,next});for(let[key]of items)this.store.adjust(key.owner,-1,0);if(next&&this.store.adjust(next.owner,-1,0),next=ref,end<=128)break}return next}own(value){return ownValue(this.store,page=>this.make(page),value)}async page(ref){this.residentPages++,this.peakResidentPages=Math.max(this.peakResidentPages,this.residentPages);try{let text=await this.store.readLeaf(ref.node);if(Buffer.byteLength(text)>65536)throw new CompactReadError("size_limit");let page=JSON.parse(text);if((page.kind==="object"||page.kind==="array")&&page.items.length>128)throw new CompactReadError("count_limit");return{value:page,[Symbol.dispose]:()=>{this.residentPages--}}}catch(error){throw this.residentPages--,error}}async*walk(ref,valid){let stack=[],pending2=ref,chunked=!1;for(;;){if(pending2){let env_1={stack:[],error:void 0,hasError:!1};try{if("value"in pending2){yield typeof pending2.value=="string"?{kind:"string",text:pending2.value,more:!1}:{kind:"scalar",value:pending2.value},pending2=void 0;continue}let held=__addDisposableResource(env_1,await this.page(pending2),!1);valid?.();let page=held.value;if(chunked&&page.kind!=="string")throw new CompactReadError("ownership");page.kind==="scalar"?(yield{kind:"scalar",value:page.value},pending2=void 0):page.kind==="string"?(yield{kind:"string",text:page.text,more:page.next!==void 0},chunked=page.next!==void 0,pending2=page.next):(yield{kind:"open",container:page.kind},stack.push({kind:page.kind,items:page.items.flat(),index:0,next:page.next}),pending2=void 0);continue}catch(e_1){env_1.error=e_1,env_1.hasError=!0}finally{__disposeResources(env_1)}}let frame=stack[stack.length-1];if(!frame)return;if(frame.index<frame.items.length)pending2=frame.items[frame.index++];else if(frame.next){let env_2={stack:[],error:void 0,hasError:!1};try{let held=__addDisposableResource(env_2,await this.page(frame.next),!1);valid?.();let page=held.value;if(page.kind!==frame.kind)throw new CompactReadError("ownership");frame.items=page.items.flat(),frame.index=0,frame.next=page.next}catch(e_2){env_2.error=e_2,env_2.hasError=!0}finally{__disposeResources(env_2)}}else stack.pop(),yield{kind:"close"}}}async read(ref,valid){if("value"in ref)return ref.value;let stack=[],text,settle=value=>{let parent=stack[stack.length-1];if(!parent)return value;if(Array.isArray(parent.value))parent.value.push(value);else if(parent.key===void 0){if(typeof value!="string")throw new CompactReadError("ownership");parent.key=value}else Object.defineProperty(parent.value,parent.key,{value,enumerable:!0,configurable:!0,writable:!0}),parent.key=void 0},result;for await(let step of this.walk(ref,valid))if(step.kind==="open")stack.push({value:step.container==="array"?[]:{},key:void 0});else if(step.kind==="close"){let frame=stack.pop();if(!frame)throw new CompactReadError("ownership");result=settle(frame.value)}else step.kind==="scalar"?result=settle(step.value):step.more?text=(text??"")+step.text:(result=settle((text??"")+step.text),text=void 0);return result}async*fields(ref,names,valid){let next=ref;for(;next;){let page=await this.objectPage(next,valid);for(let[key,value]of page.items)yield[await this.matchKey(key,names,valid),value,key];next=page.next}}async objectPage(ref,valid){let env_3={stack:[],error:void 0,hasError:!1};try{let held=__addDisposableResource(env_3,await this.page(ref),!1);if(valid?.(),held.value.kind!=="object")throw new CompactReadError("ownership");return held.value}catch(e_3){env_3.error=e_3,env_3.hasError=!0}finally{__disposeResources(env_3)}}async matchKey(key,names,valid){let candidates=[...names],read=0;for await(let step of this.walk(key,valid)){if(step.kind!=="string")throw new CompactReadError("ownership");if(candidates=candidates.filter(name=>name.startsWith(step.text,read)),read+=step.text.length,!step.more)return candidates.find(name=>name.length===read);if(candidates.length===0)return}throw new CompactReadError("ownership")}async merge(base,patch){let reversed,result,buffer=[],seen=new Set,flush=async()=>{let ref=this.make({kind:"object",items:buffer,next:reversed});if(reversed&&this.store.adjust(reversed.owner,-1,0),reversed=ref,buffer=[],await this.store.flushLeaf(ref.node),!this.store.isCommitted(ref.node))throw new CompactWriteError("storage_unavailable")};try{for await(let[name,value,key]of this.fields(base,new Set(patch.keys())))name!==void 0&&seen.add(name),buffer.push([key,name===void 0?value:patch.get(name)??value]),buffer.length===128&&await flush();for(let[name,value]of patch){if(seen.has(name))continue;let key=this.own(name);buffer.push([key,value]);try{await flush()}finally{this.store.adjust(key.owner,-1,0)}}for((buffer.length||!reversed)&&await flush();reversed;){let env_4={stack:[],error:void 0,hasError:!1};try{let page=__addDisposableResource(env_4,await this.page(reversed),!1).value;if(page.kind!=="object")throw new CompactReadError("ownership");let ref=this.make({kind:"object",items:page.items,next:result});if(result&&this.store.adjust(result.owner,-1,0),result=ref,await this.store.flushLeaf(ref.node),!this.store.isCommitted(ref.node))throw new CompactWriteError("storage_unavailable");let next=page.next;next&&this.store.adjust(next.owner,1,0),this.store.adjust(reversed.owner,-1,0),reversed=next}catch(e_4){env_4.error=e_4,env_4.hasError=!0}finally{__disposeResources(env_4)}}if(!result)throw new CompactReadError("ownership");return result}catch(error){throw reversed&&this.store.adjust(reversed.owner,-1,0),result&&this.store.adjust(result.owner,-1,0),error}}make(page){let children=page.kind==="object"?page.items.flat():page.kind==="array"?[...page.items]:[];page.kind!=="scalar"&&page.next&&children.push(page.next);let node=this.store.createLeaf(JSON.stringify(page),!0),owner=this.store.text.own([node,...children.map(ref=>ref.owner)]);return this.store.adjust(node,-1,0),{node,owner}}};var CompactComponentRoots=class{constructor(store2,leavesOf){this.refs=new WeakMap,this.store=store2,this.values=new CompactValues(store2),this.leavesOf=leavesOf,this.tree=new CompactIndexTree((value,live,pins)=>store2.adjust(value.owner,live,pins))}get residentNodes(){return this.tree.residentNodes}set(root,key,value){let ref=value&&this.values.own(value),owner=ref&&value?this.store.text.own([ref.owner,...this.leavesOf(value)]):0,header=this.tree.set(root.header,key,value&&ref?{value,ref,owner}:void 0);ref&&this.store.adjust(ref.owner,-1,0),this.store.adjust(owner,-1,0);let created=[],next=header?this.project(header,created):void 0;next&&this.store.adjust(next.owner,1,0);for(let ref2 of created)this.store.adjust(ref2.owner,-1,0);return this.tree.adjust(root.header,-1,0),root.ref&&this.store.adjust(root.ref.owner,-1,0),{header,ref:next}}release(root){this.store.enqueue("reclaim",async()=>{this.tree.adjust(root.header,-1,0),root.ref&&this.store.adjust(root.ref.owner,-1,0)})}async*rows(ref,valid){if(!ref)return;valid();let page=JSON.parse(await this.store.readLeaf(ref.node));valid(),yield*this.rows(page.left,valid);let key=await this.values.read(page.key,valid);if(typeof key!="string")throw new CompactReadError("ownership");yield[key,page.value],yield*this.rows(page.right,valid)}async*entries(ref,valid){for await(let[key,value]of this.rows(ref,valid)){let row=await this.values.read(value,valid);valid(),yield[key,row]}}project(node,created){let known=this.refs.get(node);if(known)return known;let left=node.left&&this.project(node.left,created),right=node.right&&this.project(node.right,created),key={node:0,owner:0,value:node.key},page=this.store.createLeaf(JSON.stringify({key,value:node.value.ref,left,right}),!0),owner=this.store.text.own([page,key.owner,node.value.owner,left?.owner??0,right?.owner??0]);this.store.adjust(page,-1,0);let ref={node:page,owner};return this.refs.set(node,ref),created.push(ref),ref}};var COMPONENT_RECORDS=new Set(["agent_start","agent_end","session_lifecycle","extension_ui_request","question_updated","question_resolved","ui_request_settled"]),TARGETED=new Set(["select","confirm","input","editor"]),field=(record,key)=>Reflect.get(record,key),deadline=record=>{let value=field(record,"deadlineAtMs");return typeof value=="number"?{deadlineAtMs:value}:{}},CompactCurrentComponents=class{constructor(store2){this.runState="idle",this.dialogs={header:void 0,ref:void 0},this.open=new Map,this.opened=0,this.store=store2,this.values=new CompactValues(store2),this.dialogRoots=new CompactComponentRoots(store2,()=>[])}get openBroadcast(){let count=0;for(let{dialog}of this.open.values())dialog.audience==="broadcast"&&count++;return count}apply(record){switch(field(record,"type")){case"agent_start":case"agent_end":this.runState=field(record,"type")==="agent_start"?"running":"idle";return;case"session_lifecycle":{let next=this.values.own(record);this.lifecycle&&this.store.adjust(this.lifecycle.owner,-1,0),this.lifecycle=next;return}case"extension_ui_request":{let id=field(record,"id"),method=String(field(record,"method"));if(typeof id!="string"||method!=="question"&&!TARGETED.has(method)||this.open.has(id))return;let broadcast=method==="question",dialog={id,audience:broadcast?"broadcast":"targeted",method,...deadline(record),...broadcast?{request:record}:{}};return this.put(id,String(this.opened++).padStart(16,"0"),dialog)}case"question_updated":{let id=String(field(record,"id")),open6=this.open.get(id);open6&&this.put(id,open6.order,{...open6.dialog,...deadline(record)});return}default:{let id=String(field(record,"id")??field(record,"uiRequestId")),open6=this.open.get(id);if(!open6)return;this.dialogs=this.dialogRoots.set(this.dialogs,open6.order,void 0),this.open.delete(id)}}}freeze(){for(let ref of[this.lifecycle,this.dialogs.ref])ref&&this.store.adjust(ref.owner,0,1);let broadcast=this.openBroadcast;return{runState:this.runState,lifecycle:this.lifecycle,dialogs:this.dialogs.ref,dialogCounts:{broadcast,targeted:this.open.size-broadcast}}}release(frozen){for(let ref of[frozen.lifecycle,frozen.dialogs])ref&&this.store.adjust(ref.owner,0,-1)}async read(frozen,valid){let lifecycle=frozen.lifecycle?await this.values.read(frozen.lifecycle,valid):null;valid();let dialogs=[];for await(let[,dialog]of this.dialogRoots.entries(frozen.dialogs,valid))dialogs.push(dialog);return{runState:frozen.runState,lifecycle,dialogs,dialogCounts:frozen.dialogCounts}}put(id,order,dialog){this.dialogs=this.dialogRoots.set(this.dialogs,order,dialog),this.open.set(id,{order,dialog})}};var SEQUENCED=new Set(["agent_start","agent_end","turn_start","turn_end","message_start","message_update","message_end","tool_execution_start","tool_execution_update","tool_execution_end","entry_appended","session_abort","transcript_write_failed",...COMPONENT_RECORDS,...CALL_RECORDS]);function field2(record,key){return key in record?Reflect.get(record,key):void 0}function turnScoped(type,record){if(type==="turn_end"||type.startsWith("tool_execution_"))return!0;if(!type.startsWith("message_"))return!1;let role=field2(Object(field2(record,"message")),"role");return role==="assistant"||role==="toolResult"}function admitRecord(current2,record,type,at,folds=!0,callKey){let turnId=type==="turn_start"||at.turnId===null&&turnScoped(type,record)?randomUUID14():at.turnId,next=at.sequence+1,call=folds&&CALL_RECORDS.has(type)?current2.foldCall(record,next,turnId,callKey):void 0;if(!(call&&!call.changed&&CALL_ONLY_RECORDS.has(type)))return{sequence:next,turnId,call}}function correlationChange(standing,turnId,record){let identified="clientMessageId"in record||"clientTurnId"in record;if(!identified&&(standing===null||!correlatedRecord(record))||!identified&&turnId!==null&&field2(record,"type")!=="turn_start")return;let next={clientMessageId:field2(record,"clientMessageId"),clientTurnId:field2(record,"clientTurnId"),clientMessages:field2(record,"clientMessages")},current2=standing,currentMessages=current2?.clientMessages,nextMessages=next.clientMessages;if(!(current2!==null&¤t2.clientMessageId===next.clientMessageId&¤t2.clientTurnId===next.clientTurnId&&(currentMessages===nextMessages||Array.isArray(currentMessages)&&Array.isArray(nextMessages)&¤tMessages.length===nextMessages.length&¤tMessages.every((identity,index)=>field2(Object(identity),"clientMessageId")===field2(Object(nextMessages[index]),"clientMessageId")&&field2(Object(identity),"clientTurnId")===field2(Object(nextMessages[index]),"clientTurnId")))))return next}export{setSessionRecoveryEpoch,recoveryCarrier,carryRecovery,SessionRecoveryIdentity,isGrantSelectRequest,answeredUiRequestId,settledQuestionStatus,unansweredQuestionIds,settleExtensionUiResponse,extensionUiProgressReply,refusedExtensionUiResponse,remoteOriginDeclaration,remoteOriginField,originField,sessionQuestionBridges,ConnectionQuestionBridge,degradeQuestion,sessionDialogRequests,SessionExtensionUiRequests,attachMcpGrantPresentation,getMcpGrantPresentation,clearMcpGrantPresentations,selectMcpGrant,supportsXhigh2 as supportsXhigh,supportsMax2 as supportsMax,getSupportedThinkingLevels2 as getSupportedThinkingLevels,clampThinkingSelection,getThinkingClampNotice,formatThinkingClampWarning,classifyReasoningCapability,toolBarrierSpecError,ToolBarrier,createFsWatchEventSource,maskOfRoles,rolesOfMask,createAuthority,readAuthority,storeNarrowed,storeRetired,nextIncarnation,CommandAuthority,commandAuthority,outsideCommand,withReceipt,takeRelayExec,rpcCommandPayloadError,sessionContextError,sessionKindError,sessionAutoTitleError,sessionPromptSurfaceError,sessionBrowserEngineError,sessionRetryFallbackError,rpcCommandShapeError,rpcMessageLengthError,applyContextPatch,publishedSessionContext,EFFECT_LEDGER_CAPABILITY,clientFacingIdentity,DURABLE_CLIENT_MESSAGE_ID_CAPABILITY,ClientMessageIdConflict,unknownModelOutcome,providerUnavailableOutcome,contextBudgetOutcome,modelSwitchErrorOutcome,effectStatusRecord,drainSessionEffects,installSessionEffectSink,ClientAdmissions,latestSessionEffect,EffectLedger,parseBoundedId,parseContentDigest,parseContentRef,parsePageRef,protocolId,catalogRootRef,childRef,baseRef,refSteps,CompactReadError,CompactReadLease,rootOwnerState,privateRootStat,readRootMarker,recoveryAgentDir,RecoveryStorageHealth,CompactStorageReadError,CompactCommitDependencies,COMPACT_LEAF_CODE_UNITS,CompactWriteError,CompactContentStore,storedBytes,catalogDigester,catalogDigest,CatalogNodeWriter,decodeCatalogNode,FRAGMENT_MAX_BYTES,FRAGMENT_ENVELOPE_MAX_BYTES,assertRange,startAtOrBefore,openFrozenBytes,producePage,TRANSFER_STAGING_MAX_BYTES,TransferStagingError,StagedReadError,TransferStaging,DEFAULT_TRANSCRIPT_ANCESTRY_BYTES,AcceptedTranscript,CompactIndexTree,CompactValues,clientInputContext,FRESH_CALL,TERMINAL_PHASE,CALL_RECORDS,runtimeItemKey,CALL_UNKNOWN,callIdentity,callOrder,callLeaves,terminal,CompactComponentRoots,COMPONENT_RECORDS,CompactCurrentComponents,SEQUENCED,field2 as field,admitRecord,correlationChange,CALL_NAMED_RECORDS,toolcallIndex,unvouchedCall,observeLifecycleDelivery,subscribeSessionRecords,parseDeclaration,samePrincipal,roleConnection,CONNECTION_ROLE_FIXED,DELEGATION_INCARNATION_STALE,ConnectionRoles,EVENT_RESYNC_CAPABILITY,isCorrelatedReply,SocketPeerRecovery,CompactSelection,advertisedCompactCapabilities,declarationReply,sessionDeclaration,carriesExtensionOwner,ExtensionTransportOwner,availableModelsData,unsupportedThinkingLevel,interruptRunningTurn,respond,refuse2 as refuse,effectAnswer,beginEffect,isEffectBegin,runAbort,runQueuedInputChange,runSetThinkingLevel,runGetEffectStatus,answerEffectFromTranscript,secretBinding,secretRequestHash,secretRequestTranscript,checkSealedAnswer,SecretInputRequests,answerGetEntries,WakeScheduler,watchInbox,onProcessContinue,sessionUiAnswerLedger,buildRpcSessionState,getSnapshot,answerSealedFrame,SECRET_INPUT_FEATURE,features,McpPresenterAuthority,TerminalSealedSecrets,raceTerminalSecretInput};
|