@code-yeongyu/senpi 2026.11.10-3 → 2026.11.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/bundle/chunks/{chunk-Z2C5N2LM.js → chunk-5F2XC6UC.js} +2 -2
  3. package/dist/bundle/chunks/{chunk-H3VJVKUK.js → chunk-5PIZWSNG.js} +2 -2
  4. package/dist/bundle/chunks/{chunk-DEQLHN2J.js → chunk-BPEA5SWW.js} +1 -1
  5. package/dist/bundle/chunks/{chunk-DIHIEJFV.js → chunk-BUDJLVMF.js} +1 -1
  6. package/dist/bundle/chunks/{chunk-47T6YMI2.js → chunk-IBDAV2AL.js} +1 -1
  7. package/dist/bundle/chunks/{chunk-O5WJVIEU.js → chunk-J4ADZ2OK.js} +1 -1
  8. package/dist/bundle/chunks/{chunk-T2SMQPRE.js → chunk-K3GAGIPX.js} +1 -1
  9. package/dist/bundle/chunks/{chunk-HZDKQOWB.js → chunk-L6DF5G6K.js} +1 -1
  10. package/dist/bundle/chunks/{chunk-E266ORGA.js → chunk-LJFQYCFH.js} +1 -1
  11. package/dist/bundle/chunks/{chunk-DHAAWL2H.js → chunk-NRZAJUUO.js} +1 -1
  12. package/dist/bundle/chunks/{chunk-R2Z7CX77.js → chunk-OSNR3IRD.js} +1 -1
  13. package/dist/bundle/chunks/{chunk-AC6MDRAE.js → chunk-PUZDKFRT.js} +81 -81
  14. package/dist/bundle/chunks/{chunk-6Q7Y2G5A.js → chunk-SANWO37B.js} +1 -1
  15. package/dist/bundle/chunks/{chunk-NN7NESW2.js → chunk-SS5VTBAV.js} +1 -1
  16. package/dist/bundle/chunks/{chunk-JSD6O3RJ.js → chunk-XUDKT4UH.js} +1 -1
  17. package/dist/bundle/chunks/{cli-main-ZTT3N4DO.js → cli-main-7II7GCIR.js} +1 -1
  18. package/dist/bundle/chunks/{credential-accounts-5KHVGSCY.js → credential-accounts-N3B5YJS7.js} +1 -1
  19. package/dist/bundle/chunks/github-copilot.js +1 -1
  20. package/dist/bundle/chunks/{hand-entry-UV5XPMBF.js → hand-entry-ONOLRMVB.js} +1 -1
  21. package/dist/bundle/chunks/{host-command-BZN7WYYV.js → host-command-KWMJLPBS.js} +1 -1
  22. package/dist/bundle/chunks/{host-lifecycle-TNHASSFJ.js → host-lifecycle-4WQDCN3Y.js} +1 -1
  23. package/dist/bundle/chunks/host-lifecycle.js +4 -4
  24. package/dist/bundle/chunks/{host-session-command-O5WYHZXH.js → host-session-command-ZDYEKCUB.js} +1 -1
  25. package/dist/bundle/chunks/{interactive-mode-OCU4NDPC.js → interactive-mode-EPE4M32G.js} +1 -1
  26. package/dist/bundle/chunks/{main-CNDP6HCF.js → main-OM7BKVZG.js} +1 -1
  27. package/dist/bundle/chunks/{multi-session-host-ODGJAGJP.js → multi-session-host-DB6XMY53.js} +2 -2
  28. package/dist/bundle/chunks/{package-manager-cli-HSPUG4RJ.js → package-manager-cli-GLU5Q2KV.js} +1 -1
  29. package/dist/bundle/chunks/{rpc-mode-KOZPXU3U.js → rpc-mode-SDJVBT36.js} +1 -1
  30. package/dist/bundle/chunks/{schedule-command-SG44FE23.js → schedule-command-5SQD7M5N.js} +1 -1
  31. package/dist/bundle/chunks/{session-control-endpoint-5A24JYPE.js → session-control-endpoint-R25A2QGS.js} +1 -1
  32. package/dist/bundle/chunks/{session-picker-73YRS3GE.js → session-picker-GZM5CVQL.js} +1 -1
  33. package/dist/bundle/chunks/session-worker.js +88 -88
  34. package/dist/bundle/cli.js +2 -2
  35. package/dist/bundle/host-supervisor.js +4 -4
  36. package/dist/bundle/index.js +1 -1
  37. package/dist/bundle/rpc-entry.js +1 -1
  38. package/dist/bundle/runtime-manifest.json +1 -1
  39. package/dist/core/agent-session.d.ts +2 -0
  40. package/dist/core/credential-accounts.d.ts +2 -0
  41. package/dist/core/credential-accounts.js +10 -1
  42. package/dist/core/dynamic-prompt/intent-gate.js +2 -2
  43. package/dist/core/dynamic-prompt/style.js +2 -2
  44. package/dist/core/dynamic-prompt/verification.js +2 -2
  45. package/dist/core/extensions/builtin/anthropic-subscription/accounts.d.ts +3 -0
  46. package/dist/core/extensions/builtin/anthropic-subscription/claude-cli-account-test.js +3 -1
  47. package/dist/core/extensions/builtin/anthropic-subscription/claude-cli-connection-test.d.ts +3 -1
  48. package/dist/core/extensions/builtin/anthropic-subscription/claude-cli-connection-test.js +47 -16
  49. package/dist/core/extensions/builtin/anthropic-subscription/claude-cli-login-slots.d.ts +1 -1
  50. package/dist/core/extensions/builtin/anthropic-subscription/claude-cli-login-slots.js +4 -2
  51. package/dist/core/extensions/builtin/anthropic-subscription/errors.d.ts +1 -0
  52. package/dist/core/extensions/builtin/anthropic-subscription/errors.js +14 -5
  53. package/dist/core/extensions/builtin/anthropic-subscription/oauth-login.js +3 -3
  54. package/dist/core/extensions/builtin/goal/continuation.d.ts +6 -0
  55. package/dist/core/extensions/builtin/goal/continuation.js +3 -2
  56. package/dist/core/extensions/builtin/goal/index.js +10 -26
  57. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts +0 -6
  58. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +3 -37
  59. package/dist/core/extensions/builtin/goal/monitor-continuation.js +66 -7
  60. package/dist/core/extensions/builtin/goal/provider-retry.d.ts +9 -0
  61. package/dist/core/extensions/builtin/goal/provider-retry.js +16 -0
  62. package/dist/core/extensions/builtin/goal/reload-reengagement.d.ts +3 -2
  63. package/dist/core/extensions/builtin/goal/reload-reengagement.js +4 -4
  64. package/dist/core/extensions/builtin/goal/session-start-continuation.d.ts +28 -0
  65. package/dist/core/extensions/builtin/goal/session-start-continuation.js +75 -0
  66. package/dist/core/extensions/builtin/goal/store.d.ts +1 -0
  67. package/dist/core/extensions/builtin/goal/store.js +1 -1
  68. package/dist/core/extensions/builtin/handoff-hint/index.js +15 -11
  69. package/dist/core/extensions/builtin/handoff-hint/replacement-relay.d.ts +16 -0
  70. package/dist/core/extensions/builtin/handoff-hint/replacement-relay.js +17 -0
  71. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js +3 -3
  72. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-2.js +5 -4
  73. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +3 -3
  74. package/dist/core/extensions/builtin/prompt-preset/claude-haiku-5-5.js +3 -3
  75. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5-5.js +3 -3
  76. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js +4 -4
  77. package/dist/core/extensions/builtin/prompt-preset/claude-sonnet-5-5.js +3 -3
  78. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-1-flash.js +3 -3
  79. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js +3 -3
  80. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +2 -2
  81. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +3 -3
  82. package/dist/core/extensions/builtin/prompt-preset/grok-4.5.js +1 -1
  83. package/dist/core/extensions/builtin/prompt-preset/grok-4.6.js +4 -4
  84. package/dist/core/extensions/builtin/prompt-preset/grok-4.7.js +5 -5
  85. package/dist/core/extensions/builtin/prompt-preset/kimi-k3-1.js +4 -4
  86. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +7 -6
  87. package/dist/core/resource-loader.js +19 -3
  88. package/dist/core/retry-fallback/controller-types.d.ts +2 -0
  89. package/dist/core/retry-fallback/controller.js +9 -2
  90. package/dist/core/retry-fallback/cooldown.d.ts +7 -0
  91. package/dist/core/retry-fallback/cooldown.js +13 -1
  92. package/dist/core/retry-fallback/credential-recovery.d.ts +7 -0
  93. package/dist/core/retry-fallback/credential-recovery.js +24 -0
  94. package/dist/core/retry-fallback/settings.d.ts +8 -5
  95. package/dist/core/retry-fallback/settings.js +9 -6
  96. package/dist/modes/rpc/delegation-declaration.js +1 -1
  97. package/dist/modes/rpc/host-gc-evidence.d.ts +1 -1
  98. package/dist/modes/rpc/host-gc-evidence.js +9 -3
  99. package/dist/modes/rpc/host-gc.js +4 -1
  100. package/dist/modes/rpc/rpc-session-state-types.d.ts +2 -0
  101. package/dist/modes/rpc/session-attachment-gate.js +3 -0
  102. package/dist/private-fd-startup-fillers.d.ts +2 -2
  103. package/dist/private-fd-startup-fillers.js +34 -4
  104. package/docs/rpc.md +2 -1
  105. package/docs/settings.md +1 -1
  106. package/native/socket-secret/prebuilds/win32-arm64/senpi_socket_secret.win32-arm64.node +0 -0
  107. package/native/socket-secret/prebuilds/win32-x64/senpi_socket_secret.win32-x64.node +0 -0
  108. package/package.json +6 -6
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{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-3IYEGHBI.js";import{carryExecutionCallKey,compactUpdatesEnabled}from"./chunk-J2I56WLK.js";import{ProjectTrustStore}from"./chunk-VD7AKTGP.js";import{isAbortGraceInRange}from"./chunk-TQHNFP77.js";import{SecretInputUnavailableError,armSecretInputDeadline,describeUsageLimitEntry,isSecretInputValue,resolveSecretInputTimeout,watchWithErrorHandler}from"./chunk-HKCFMDJN.js";import{isRecord,queuedForm,validMcpFormContent,validateMrtrForm}from"./chunk-MOVB6H22.js";import{COMPACT_EVENTS_CAPABILITY,INTERACTIVE_USER_CAPABILITY,TASK_PARENT_CAPABILITY,hostInstanceId}from"./chunk-Z2C5N2LM.js";import{serializeJsonLine}from"./chunk-SF4MQDKZ.js";import{external_exports}from"./chunk-KUPQO7MC.js";import{CHAIN_COUNT_LIMIT,ChainCountLimitError,admitChainCall}from"./chunk-COKX65TE.js";import{modelSupportsAssistantPrefill}from"./chunk-QX7WD3IM.js";import{getSupportedThinkingLevels,supportsMax,supportsXhigh}from"./chunk-OH5TKHW7.js";import{sanitizeProviderDiagnostic}from"./chunk-JGKH3D6W.js";import{acquireOwnershipSafeLock}from"./chunk-HW6AAS3R.js";import{CONFIG_DIR_NAME,getAgentDir}from"./chunk-SODMQEHO.js";import{processIsLive,processStartTimeMs,readProcessIdentity}from"./chunk-O5RYI3IW.js";var RELOCATION_TOOL_NAMES=["list_relocation_targets","relocate_session"],RELOCATION_NOT_OFFERED={status:"unavailable",reason:"not_offered",detail:"no app connected to this session offers moving it to another computer"};var SESSION_CONTROL_DELIVERY_TYPE="session_control_delivery";function sessionControlRemoteOriginOf(details){if(!isSessionControlDeliveryDetails(details)||typeof details.remote_origin!="object")return;let origin={...details.remote_origin};if(!(typeof origin.deviceId!="string"||origin.deviceId===""))return typeof origin.deviceName=="string"&&origin.deviceName!==""?{deviceId:origin.deviceId,deviceName:origin.deviceName}:{deviceId:origin.deviceId}}function sessionControlSenderOf(details){if(!isSessionControlDeliveryDetails(details)||typeof details.sender!="object"||details.sender===null)return;let sender={...details.sender},optional=key=>typeof sender[key]=="string"?{[key]:sender[key]}:{};if(sender.kind==="agent"&&typeof sender.session_id=="string")return{kind:"agent",session_id:sender.session_id,...optional("name")};if(sender.kind==="command_line")return{kind:"command_line",...optional("user")};if(sender.kind==="external"&&typeof sender.platform=="string")return{kind:"external",platform:sender.platform,...optional("author")}}function isSessionControlDeliveryDetails(value){return typeof value!="object"||value===null||!("delivery_id"in value)||typeof value.delivery_id!="string"||!("source"in value)||value.source!=="session_control"?!1:"deliverAs"in value&&(value.deliverAs==="steer"||value.deliverAs==="followUp")}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(resolve2=>{cancel=()=>{abort.abort(),resolve2(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","peer_agent"];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&7;return{epoch:word>>>4,retired:(word&8)!==0,mask,roles:rolesOfMask(mask)}}function packWord(epoch,retired,mask){if(!Number.isSafeInteger(epoch)||epoch<1||epoch>=268435456)throw new Error("authority_epoch_exhausted");return epoch<<4|(retired?8: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&7),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:resolve2}=Promise.withResolvers(),gate=current2??{opened:promise,open:resolve2},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 SENDER_FIELDS={agent:{required:["session_id"],optional:["name"]},command_line:{required:[],optional:["user"]},external:{required:["platform"],optional:["author"]}},SENDER_SHAPE='sender must be { kind: "agent", session_id, name? }, { kind: "command_line", user? } or { kind: "external", platform, author? }, each value a non-empty string of at most 256 characters.';function boundedId(value){return typeof value=="string"&&value.length>0&&value.length<=256}function isDeliverySender(value){if(typeof value!="object"||value===null||Array.isArray(value))return!1;let kind=Reflect.get(value,"kind");if(typeof kind!="string"||!Object.hasOwn(SENDER_FIELDS,kind))return!1;let{required,optional}=SENDER_FIELDS[kind],allowed=new Set(["kind",...required,...optional]);return Object.keys(value).every(key=>allowed.has(key))&&required.every(key=>boundedId(Reflect.get(value,key)))&&optional.every(key=>Reflect.get(value,key)===void 0||boundedId(Reflect.get(value,key)))}function fieldProblem(value,maxTextCharacters){if(!boundedId(value.deliveryId))return"needs deliveryId, a non-empty string of at most 256 characters.";if(typeof value.text!="string"||value.text.trim()===""||value.text.length>maxTextCharacters)return`needs text, a non-empty string of at most ${maxTextCharacters} characters.`;if(value.deliverAs!=="steer"&&value.deliverAs!=="followUp")return'deliverAs must be "steer" or "followUp".';if(value.displayText!==void 0&&(typeof value.displayText!="string"||value.displayText.length>maxTextCharacters))return`displayText must be a string of at most ${maxTextCharacters} characters.`;if(value.expectedTurnId!==void 0&&!boundedId(value.expectedTurnId))return"expectedTurnId must be a non-empty string of at most 256 characters; read it from get_state.currentTurnId.";if(value.chainCount!==void 0&&!(Number.isSafeInteger(value.chainCount)&&value.chainCount>=1))return"chainCount must be a positive integer (1 for a chain's first hop).";if(Object.hasOwn(value,"remote_origin")||Object.hasOwn(value,"remoteOrigin"))return"must not name remote_origin: the engine stamps the device the connection speaks for.";if(value.whenIdle!==void 0&&value.whenIdle!=="start"&&value.whenIdle!=="queue")return'whenIdle must be "start" or "queue"; omit it to start a turn on an idle session.';if(value.sender!==void 0&&!isDeliverySender(value.sender))return SENDER_SHAPE}function admitExternalMessageFieldError(value,maxTextCharacters){if(value.type!=="admit_external_message")return;let problem=fieldProblem(value,maxTextCharacters);return problem===void 0?void 0:`admit_external_message ${problem}`}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 fieldError=validatePauseCommand(value)??admitExternalMessageFieldError(value,MAX_RPC_MESSAGE_CHARACTERS);if(fieldError!==void 0)return fieldError;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=`
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-3IYEGHBI.js";import{carryExecutionCallKey,compactUpdatesEnabled}from"./chunk-J2I56WLK.js";import{ProjectTrustStore}from"./chunk-VD7AKTGP.js";import{isAbortGraceInRange}from"./chunk-TQHNFP77.js";import{SecretInputUnavailableError,armSecretInputDeadline,describeUsageLimitEntry,isSecretInputValue,resolveSecretInputTimeout,watchWithErrorHandler}from"./chunk-HKCFMDJN.js";import{isRecord,queuedForm,validMcpFormContent,validateMrtrForm}from"./chunk-MOVB6H22.js";import{COMPACT_EVENTS_CAPABILITY,INTERACTIVE_USER_CAPABILITY,TASK_PARENT_CAPABILITY,hostInstanceId}from"./chunk-5F2XC6UC.js";import{serializeJsonLine}from"./chunk-SF4MQDKZ.js";import{external_exports}from"./chunk-KUPQO7MC.js";import{CHAIN_COUNT_LIMIT,ChainCountLimitError,admitChainCall}from"./chunk-COKX65TE.js";import{modelSupportsAssistantPrefill}from"./chunk-QX7WD3IM.js";import{getSupportedThinkingLevels,supportsMax,supportsXhigh}from"./chunk-OH5TKHW7.js";import{sanitizeProviderDiagnostic}from"./chunk-JGKH3D6W.js";import{acquireOwnershipSafeLock}from"./chunk-HW6AAS3R.js";import{CONFIG_DIR_NAME,getAgentDir}from"./chunk-SODMQEHO.js";import{processIsLive,processStartTimeMs,readProcessIdentity}from"./chunk-O5RYI3IW.js";var RELOCATION_TOOL_NAMES=["list_relocation_targets","relocate_session"],RELOCATION_NOT_OFFERED={status:"unavailable",reason:"not_offered",detail:"no app connected to this session offers moving it to another computer"};var SESSION_CONTROL_DELIVERY_TYPE="session_control_delivery";function sessionControlRemoteOriginOf(details){if(!isSessionControlDeliveryDetails(details)||typeof details.remote_origin!="object")return;let origin={...details.remote_origin};if(!(typeof origin.deviceId!="string"||origin.deviceId===""))return typeof origin.deviceName=="string"&&origin.deviceName!==""?{deviceId:origin.deviceId,deviceName:origin.deviceName}:{deviceId:origin.deviceId}}function sessionControlSenderOf(details){if(!isSessionControlDeliveryDetails(details)||typeof details.sender!="object"||details.sender===null)return;let sender={...details.sender},optional=key=>typeof sender[key]=="string"?{[key]:sender[key]}:{};if(sender.kind==="agent"&&typeof sender.session_id=="string")return{kind:"agent",session_id:sender.session_id,...optional("name")};if(sender.kind==="command_line")return{kind:"command_line",...optional("user")};if(sender.kind==="external"&&typeof sender.platform=="string")return{kind:"external",platform:sender.platform,...optional("author")}}function isSessionControlDeliveryDetails(value){return typeof value!="object"||value===null||!("delivery_id"in value)||typeof value.delivery_id!="string"||!("source"in value)||value.source!=="session_control"?!1:"deliverAs"in value&&(value.deliverAs==="steer"||value.deliverAs==="followUp")}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(resolve2=>{cancel=()=>{abort.abort(),resolve2(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","peer_agent"];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&7;return{epoch:word>>>4,retired:(word&8)!==0,mask,roles:rolesOfMask(mask)}}function packWord(epoch,retired,mask){if(!Number.isSafeInteger(epoch)||epoch<1||epoch>=268435456)throw new Error("authority_epoch_exhausted");return epoch<<4|(retired?8: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&7),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:resolve2}=Promise.withResolvers(),gate=current2??{opened:promise,open:resolve2},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 SENDER_FIELDS={agent:{required:["session_id"],optional:["name"]},command_line:{required:[],optional:["user"]},external:{required:["platform"],optional:["author"]}},SENDER_SHAPE='sender must be { kind: "agent", session_id, name? }, { kind: "command_line", user? } or { kind: "external", platform, author? }, each value a non-empty string of at most 256 characters.';function boundedId(value){return typeof value=="string"&&value.length>0&&value.length<=256}function isDeliverySender(value){if(typeof value!="object"||value===null||Array.isArray(value))return!1;let kind=Reflect.get(value,"kind");if(typeof kind!="string"||!Object.hasOwn(SENDER_FIELDS,kind))return!1;let{required,optional}=SENDER_FIELDS[kind],allowed=new Set(["kind",...required,...optional]);return Object.keys(value).every(key=>allowed.has(key))&&required.every(key=>boundedId(Reflect.get(value,key)))&&optional.every(key=>Reflect.get(value,key)===void 0||boundedId(Reflect.get(value,key)))}function fieldProblem(value,maxTextCharacters){if(!boundedId(value.deliveryId))return"needs deliveryId, a non-empty string of at most 256 characters.";if(typeof value.text!="string"||value.text.trim()===""||value.text.length>maxTextCharacters)return`needs text, a non-empty string of at most ${maxTextCharacters} characters.`;if(value.deliverAs!=="steer"&&value.deliverAs!=="followUp")return'deliverAs must be "steer" or "followUp".';if(value.displayText!==void 0&&(typeof value.displayText!="string"||value.displayText.length>maxTextCharacters))return`displayText must be a string of at most ${maxTextCharacters} characters.`;if(value.expectedTurnId!==void 0&&!boundedId(value.expectedTurnId))return"expectedTurnId must be a non-empty string of at most 256 characters; read it from get_state.currentTurnId.";if(value.chainCount!==void 0&&!(Number.isSafeInteger(value.chainCount)&&value.chainCount>=1))return"chainCount must be a positive integer (1 for a chain's first hop).";if(Object.hasOwn(value,"remote_origin")||Object.hasOwn(value,"remoteOrigin"))return"must not name remote_origin: the engine stamps the device the connection speaks for.";if(value.whenIdle!==void 0&&value.whenIdle!=="start"&&value.whenIdle!=="queue")return'whenIdle must be "start" or "queue"; omit it to start a turn on an idle session.';if(value.sender!==void 0&&!isDeliverySender(value.sender))return SENDER_SHAPE}function admitExternalMessageFieldError(value,maxTextCharacters){if(value.type!=="admit_external_message")return;let problem=fieldProblem(value,maxTextCharacters);return problem===void 0?void 0:`admit_external_message ${problem}`}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 fieldError=validatePauseCommand(value)??admitExternalMessageFieldError(value,MAX_RPC_MESSAGE_CHARACTERS);if(fieldError!==void 0)return fieldError;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
3
  const { watch } = require("node:fs");
4
4
  const { parentPort } = require("node:worker_threads");
5
5
 
@@ -101,6 +101,6 @@ ${JSON.stringify(binding)}`}function generateSecretRequestKey(){return new Promi
101
101
  `);fs.writeFileSync(storePath,lines?`${lines}
102
102
  `:"",{flag:"w"}),fs.writeFileSync(migratedMarker,""),imported.length===legacyLines&&fs.rmSync(legacyPath,{force:!0})}catch(error){fs.rmSync(storePath,{force:!0}),fs.rmSync(migratedMarker,{force:!0}),console.error(`permission: importing the legacy approvals file failed; retrying on the next load (${String(error)})`)}return imported}return readRules(storePath)}function approvedFileVersion(agentDir,projectDir){let filePath=approvedStorePath(agentDir,projectDir);try{let stat=fs.statSync(filePath);return`${stat.mtimeMs}:${stat.size}`}catch{return}}function appendApproved(agentDir,projectDir,rules){if(rules.length===0)return;let filePath=approvedStorePath(agentDir,projectDir),dir=path.dirname(filePath);if(fs.existsSync(dir)||fs.mkdirSync(dir,{recursive:!0}),fs.existsSync(filePath)&&fs.lstatSync(filePath).isSymbolicLink())return;let lines=`${rules.map(rule=>JSON.stringify({...rule,source:USER_ANSWER_SOURCE})).join(`
103
103
  `)}
104
- `;fs.appendFileSync(filePath,lines,{flag:"a"})}function loadPermissionSettings(settingsManager,cliOverride,projectDir,cliPresetOverride,agentDir){let globalSettings=settingsManager.getGlobalSettings(),globalPreset=parseSettingsPreset(globalSettings.permissionPreset,"global"),globalPresetRuleset=globalPreset?rulesForPreset(globalPreset):[],globalRuleset=globalSettings.permission?fromConfig(globalSettings.permission):[],projectSettings=settingsManager.getProjectSettings(),projectPreset=parseSettingsPreset(projectSettings.permissionPreset,"project"),projectPresetRuleset=projectPreset?rulesForPreset(projectPreset):[],projectRuleset=projectSettings.permission?fromConfig(projectSettings.permission):[],cliPresetRuleset=cliPresetOverride&&cliPresetOverride!==DEFAULT_PERMISSION_PRESET?rulesForPreset(cliPresetOverride):[],staticRuleset=merge(rulesForPreset(DEFAULT_PERMISSION_PRESET),globalPresetRuleset,globalRuleset,projectPresetRuleset,projectRuleset,cliPresetRuleset,cliOverride),approved=agentDir===void 0?[]:loadApproved(agentDir,projectDir),preset=pickPermissionPreset(cliPresetOverride,projectPreset,globalPreset);return{staticRuleset,approved,preset}}function pickPermissionPreset(cliPreset,projectPreset,globalPreset){return cliPreset??projectPreset??globalPreset??DEFAULT_PERMISSION_PRESET}function resolvePermissionPreset(settingsManager,cliPresetOverride){let globalSettings=settingsManager.getGlobalSettings(),projectSettings=settingsManager.getProjectSettings();return pickPermissionPreset(cliPresetOverride,parseSettingsPreset(projectSettings.permissionPreset,"project"),parseSettingsPreset(globalSettings.permissionPreset,"global"))}function parseSettingsPreset(value,scope){if(value===void 0)return;if(typeof value!="string")throw new Error(`Invalid ${scope} permissionPreset ${JSON.stringify(value)}. Expected a string.`);let preset=parsePermissionPresetName(value);if(!preset)throw new Error(`Invalid ${scope} permissionPreset "${value}". Expected one of: ${PERMISSION_PRESET_NAMES.join(", ")}.`);return preset}var PERMISSION_PRESET_FLAG="permission-preset",PERMISSION_PRESET_CHANGED_CHANNEL="permission_preset_changed",PERMISSION_MODE_ENTRY="permission_mode",clientPresets=new WeakMap,hostDefaultFlagSessions=new WeakSet;function markHostDefaultPresetFlag(session,profile){profile?.permissionPresetSource==="host_default"?hostDefaultFlagSessions.add(session):hostDefaultFlagSessions.delete(session)}function markClientPermissionPreset(session,preset){preset===void 0?clientPresets.delete(session):clientPresets.set(session,preset)}function permissionModeOf(session){let named=clientPresets.get(session),namedPreset=named===void 0?void 0:parsePermissionPresetName(named);if(namedPreset!==void 0)return clientMode(namedPreset,readPermissionPreset(session.sessionManager));let hostFlag=named===void 0?session.extensionRunner.getFlagValues().get(PERMISSION_PRESET_FLAG):named,hostPreset=typeof hostFlag=="string"?parsePermissionPresetName(hostFlag):void 0;if(typeof hostFlag=="string"&&hostPreset===void 0)return invalidMode(hostFlag);let preset;try{preset=resolvePermissionPreset(session.settingsManager,hostPreset)}catch{return invalidMode(typeof hostFlag=="string"?hostFlag:"")}return{permissionPreset:preset,permissionPresetSource:"host_default",permissionPresetStatus:"applied",effectivePermissionPreset:readPermissionPreset(session.sessionManager)??preset}}function clientMode(preset,enforced){return{permissionPreset:preset,permissionPresetSource:"client",permissionPresetStatus:"applied",effectivePermissionPreset:enforced??preset}}function invalidMode(preset){return{permissionPreset:preset,permissionPresetSource:"host_default",permissionPresetStatus:"invalid",effectivePermissionPreset:null}}function clientNamedPreset(profile){return profile?.permissionPresetSource==="host_default"?void 0:profile?.permissionPreset}function withClientPreset(profile,preset){let{permissionPresetSource:_hostDefault,...rest}=profile;return Object.freeze({...rest,permissionPreset:preset})}function permissionModeReply(mode){return{permissionPreset:mode.permissionPreset,permissionPresetSource:mode.permissionPresetSource,permissionPresetStatus:mode.permissionPresetStatus}}function persistedClientPreset(sessionManager){let entries=sessionManager.getEntries();for(let index=entries.length-1;index>=0;index--){let entry=entries[index];if(entry?.type!=="custom"||entry.customType!==PERMISSION_MODE_ENTRY)continue;let data=entry.data;return typeof data!="object"||data===null||!("preset"in data)?void 0:typeof data.preset=="string"&&parsePermissionPresetName(data.preset)?data.preset:void 0}}function openReplyPermissionMode(state){let{permissionPreset,permissionPresetSource,permissionPresetStatus}=state;return permissionPreset===void 0||permissionPresetSource===void 0||permissionPresetStatus===void 0?{}:{permissionPreset,permissionPresetSource,permissionPresetStatus}}function bindPermissionDecision(session){bindDecisionPreset({sessionManager:session.sessionManager,namedPreset:()=>clientPresets.get(session),launchFlagNamed:()=>!hostDefaultFlagSessions.has(session)&&typeof session.extensionRunner.getFlagValues().get(PERMISSION_PRESET_FLAG)=="string",recordedPreset:()=>persistedClientPreset(session.sessionManager)})}function applyClientPermissionMode(session,preset,options){markClientPermissionPreset(session,preset),persistClientPreset(session.sessionManager,preset),bindPermissionDecision(session),options.announce&&session.extensionRunner.emitBusEvent(PERMISSION_PRESET_CHANGED_CHANNEL,permissionModeOf(session))}function persistClientPreset(sessionManager,preset){preset===void 0||parsePermissionPresetName(preset)===void 0||persistedClientPreset(sessionManager)!==preset&&sessionManager.appendCustomEntry(PERMISSION_MODE_ENTRY,{preset,source:"client"},{startupBookkeeping:!0})}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"||record.command==="claim_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 AsyncLocalStorage3}from"node:async_hooks";var clientInputContext=new AsyncLocalStorage3;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","peer_agent"]);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 sameAccount=Reflect.get(principal,"sameAccount");if(sameAccount!==void 0&&sameAccount!==!0)return"principal.sameAccount must be true when present";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},...sameAccount===!0?{sameAccount:!0}:{}},granted:classes}}function samePrincipal(a,b){return a.deviceId===b.deviceId&&a.deviceName===b.deviceName&&a.conn===b.conn&&a.sameAccount===b.sameAccount}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,this.carried=new Set}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)}sameAccount(connectionId){return this.viewOf(roleConnection(connectionId))?.descriptor.principal.sameAccount===!0}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}}isDelegated(connectionId){let key=roleConnection(connectionId);return this.viewOf(key)!==void 0||this.carried.has(key)}grantedByForwarder(connectionId,role){let descriptor=this.viewOf(roleConnection(connectionId))?.descriptor;if(descriptor?.mode!=="host"||descriptor.authority===void 0)return!1;let state=readAuthority(descriptor.authority);return!state.retired&&state.roles.includes(role)}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),this.carried.delete(connectionId)}noteCarriedDelegation(connectionId){this.carried.add(connectionId)}clear(){this.claims.clear(),this.origins.clear(),this.retained.clear(),this.carried.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)}}var INVALID_CHAIN_COUNT="invalid_chain_count";function admitInputChain(chainCount,settings){if(chainCount===void 0)return{kind:"admitted"};if(typeof chainCount!="number"||!Number.isSafeInteger(chainCount)||chainCount<1)return{kind:"refused",refusal:{message:`chainCount must be a positive integer (1 for a chain's first hop), not ${JSON.stringify(chainCount)}`,errorCode:INVALID_CHAIN_COUNT,errorData:{chainCount}}};try{return{kind:"admitted",chainCount:admitChainCall(chainCount,()=>settings.getThreadChainCountLimit())}}catch(error){if(!(error instanceof ChainCountLimitError))throw error;return{kind:"refused",refusal:{message:error.message,errorCode:CHAIN_COUNT_LIMIT,errorData:{count:error.count,limit:error.limit}}}}}var SENDER_NOT_ALLOWED="sender_not_allowed",DELEGATED_ORIGIN_UNKNOWN="delegated_origin_unknown",CANONICAL_TURN_ID=/^(0|[1-9]\d{0,15})$/;function ledgerId(deliveryId,origin){return origin===void 0?`rpc:local/${deliveryId}`:`device:${encodeURIComponent(origin.deviceId)}/${deliveryId}`}function deliveryTurnMark(command,peer){return command.deliverAs==="steer"?"join":peer.turnOrigin??peer.connectionOrigin}function admitExternalMessage(session,command,peer){let chain=admitInputChain(command.chainCount,session.settingsManager);if(chain.kind==="refused")return{ok:!1,refusal:chain.refusal};let{origin}=peer;if(peer.connectionOrigin==="delegated"&&origin===void 0)return{ok:!1,refusal:{message:`${DELEGATED_ORIGIN_UNKNOWN}: a delegated connection that names no remote device cannot admit a delivery`,errorCode:DELEGATED_ORIGIN_UNKNOWN}};if(origin!==void 0&&command.sender?.kind==="command_line")return{ok:!1,refusal:{message:`${SENDER_NOT_ALLOWED}: a remote device cannot send as this machine's command line`,errorCode:SENDER_NOT_ALLOWED}};let admission=session.externalAdmission,answer=(kind,epoch)=>({ok:!0,data:{kind,turnId:String(epoch)}}),id=ledgerId(command.deliveryId,origin);if(session.sessionManager.reduceHistory(writtenDeliveryIds).has(id))return answer("already_admitted",admission.turnEpoch);let expected=command.expectedTurnId;if(expected!==void 0&&!CANONICAL_TURN_ID.test(expected))return answer("turn_conflict",admission.turnEpoch);let displayText=command.displayText??(origin===void 0?void 0:command.text),result=admission.admit({delivery_id:id,text:command.text,deliverAs:command.deliverAs,...command.sender===void 0?{}:{sender:command.sender},...displayText===void 0?{}:{display_text:displayText},...expected===void 0?{}:{expected_turn_id:Number(expected)},...command.whenIdle===void 0?{}:{whenIdle:command.whenIdle}},{...origin===void 0?{}:{remoteOrigin:origin},...chain.chainCount===void 0?{}:{chainCount:chain.chainCount},turnMark:deliveryTurnMark(command,peer)});return answer(result.kind,result.turn_epoch)}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(path2,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=path2,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(path2,effectId){let handle;try{handle=await open(path2,"r")}catch(cause){throw new TranscriptUnreadable(path2,cause)}try{let size=(await handle.stat()).size,durableSessionId=await readHeaderId(handle,path2,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(path2,cause)}finally{await handle.close()}}async function readHeaderId(handle,path2,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(path2,new Error("the file has no session header"));return header.data.id}function newestInLines(text,effectId,durableSessionId){let lines=text.split(`
104
+ `;fs.appendFileSync(filePath,lines,{flag:"a"})}function loadPermissionSettings(settingsManager,cliOverride,projectDir,cliPresetOverride,agentDir){let globalSettings=settingsManager.getGlobalSettings(),globalPreset=parseSettingsPreset(globalSettings.permissionPreset,"global"),globalPresetRuleset=globalPreset?rulesForPreset(globalPreset):[],globalRuleset=globalSettings.permission?fromConfig(globalSettings.permission):[],projectSettings=settingsManager.getProjectSettings(),projectPreset=parseSettingsPreset(projectSettings.permissionPreset,"project"),projectPresetRuleset=projectPreset?rulesForPreset(projectPreset):[],projectRuleset=projectSettings.permission?fromConfig(projectSettings.permission):[],cliPresetRuleset=cliPresetOverride&&cliPresetOverride!==DEFAULT_PERMISSION_PRESET?rulesForPreset(cliPresetOverride):[],staticRuleset=merge(rulesForPreset(DEFAULT_PERMISSION_PRESET),globalPresetRuleset,globalRuleset,projectPresetRuleset,projectRuleset,cliPresetRuleset,cliOverride),approved=agentDir===void 0?[]:loadApproved(agentDir,projectDir),preset=pickPermissionPreset(cliPresetOverride,projectPreset,globalPreset);return{staticRuleset,approved,preset}}function pickPermissionPreset(cliPreset,projectPreset,globalPreset){return cliPreset??projectPreset??globalPreset??DEFAULT_PERMISSION_PRESET}function resolvePermissionPreset(settingsManager,cliPresetOverride){let globalSettings=settingsManager.getGlobalSettings(),projectSettings=settingsManager.getProjectSettings();return pickPermissionPreset(cliPresetOverride,parseSettingsPreset(projectSettings.permissionPreset,"project"),parseSettingsPreset(globalSettings.permissionPreset,"global"))}function parseSettingsPreset(value,scope){if(value===void 0)return;if(typeof value!="string")throw new Error(`Invalid ${scope} permissionPreset ${JSON.stringify(value)}. Expected a string.`);let preset=parsePermissionPresetName(value);if(!preset)throw new Error(`Invalid ${scope} permissionPreset "${value}". Expected one of: ${PERMISSION_PRESET_NAMES.join(", ")}.`);return preset}var PERMISSION_PRESET_FLAG="permission-preset",PERMISSION_PRESET_CHANGED_CHANNEL="permission_preset_changed",PERMISSION_MODE_ENTRY="permission_mode",clientPresets=new WeakMap,hostDefaultFlagSessions=new WeakSet;function markHostDefaultPresetFlag(session,profile){profile?.permissionPresetSource==="host_default"?hostDefaultFlagSessions.add(session):hostDefaultFlagSessions.delete(session)}function markClientPermissionPreset(session,preset){preset===void 0?clientPresets.delete(session):clientPresets.set(session,preset)}function permissionModeOf(session){let named=clientPresets.get(session),namedPreset=named===void 0?void 0:parsePermissionPresetName(named);if(namedPreset!==void 0)return clientMode(namedPreset,readPermissionPreset(session.sessionManager));let hostFlag=named===void 0?session.extensionRunner.getFlagValues().get(PERMISSION_PRESET_FLAG):named,hostPreset=typeof hostFlag=="string"?parsePermissionPresetName(hostFlag):void 0;if(typeof hostFlag=="string"&&hostPreset===void 0)return invalidMode(hostFlag);let preset;try{preset=resolvePermissionPreset(session.settingsManager,hostPreset)}catch{return invalidMode(typeof hostFlag=="string"?hostFlag:"")}return{permissionPreset:preset,permissionPresetSource:"host_default",permissionPresetStatus:"applied",effectivePermissionPreset:readPermissionPreset(session.sessionManager)??preset}}function clientMode(preset,enforced){return{permissionPreset:preset,permissionPresetSource:"client",permissionPresetStatus:"applied",effectivePermissionPreset:enforced??preset}}function invalidMode(preset){return{permissionPreset:preset,permissionPresetSource:"host_default",permissionPresetStatus:"invalid",effectivePermissionPreset:null}}function clientNamedPreset(profile){return profile?.permissionPresetSource==="host_default"?void 0:profile?.permissionPreset}function withClientPreset(profile,preset){let{permissionPresetSource:_hostDefault,...rest}=profile;return Object.freeze({...rest,permissionPreset:preset})}function permissionModeReply(mode){return{permissionPreset:mode.permissionPreset,permissionPresetSource:mode.permissionPresetSource,permissionPresetStatus:mode.permissionPresetStatus}}function persistedClientPreset(sessionManager){let entries=sessionManager.getEntries();for(let index=entries.length-1;index>=0;index--){let entry=entries[index];if(entry?.type!=="custom"||entry.customType!==PERMISSION_MODE_ENTRY)continue;let data=entry.data;return typeof data!="object"||data===null||!("preset"in data)?void 0:typeof data.preset=="string"&&parsePermissionPresetName(data.preset)?data.preset:void 0}}function openReplyPermissionMode(state){let{permissionPreset,permissionPresetSource,permissionPresetStatus}=state;return permissionPreset===void 0||permissionPresetSource===void 0||permissionPresetStatus===void 0?{}:{permissionPreset,permissionPresetSource,permissionPresetStatus}}function bindPermissionDecision(session){bindDecisionPreset({sessionManager:session.sessionManager,namedPreset:()=>clientPresets.get(session),launchFlagNamed:()=>!hostDefaultFlagSessions.has(session)&&typeof session.extensionRunner.getFlagValues().get(PERMISSION_PRESET_FLAG)=="string",recordedPreset:()=>persistedClientPreset(session.sessionManager)})}function applyClientPermissionMode(session,preset,options){markClientPermissionPreset(session,preset),persistClientPreset(session.sessionManager,preset),bindPermissionDecision(session),options.announce&&session.extensionRunner.emitBusEvent(PERMISSION_PRESET_CHANGED_CHANNEL,permissionModeOf(session))}function persistClientPreset(sessionManager,preset){preset===void 0||parsePermissionPresetName(preset)===void 0||persistedClientPreset(sessionManager)!==preset&&sessionManager.appendCustomEntry(PERMISSION_MODE_ENTRY,{preset,source:"client"},{startupBookkeeping:!0})}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"||record.command==="claim_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 AsyncLocalStorage3}from"node:async_hooks";var clientInputContext=new AsyncLocalStorage3;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","peer_agent"]);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 sameAccount=Reflect.get(principal,"sameAccount");if(sameAccount!==void 0&&sameAccount!==!0)return"principal.sameAccount must be true when present";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},...sameAccount===!0?{sameAccount:!0}:{}},granted:classes}}function samePrincipal(a,b){return a.deviceId===b.deviceId&&a.deviceName===b.deviceName&&a.conn===b.conn&&a.sameAccount===b.sameAccount}function parseRoles(value){if(value===void 0)return;let invalid="roles holds each of interactive_user, task_parent, peer_agent 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,this.carried=new Set}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)}sameAccount(connectionId){return this.viewOf(roleConnection(connectionId))?.descriptor.principal.sameAccount===!0}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}}isDelegated(connectionId){let key=roleConnection(connectionId);return this.viewOf(key)!==void 0||this.carried.has(key)}grantedByForwarder(connectionId,role){let descriptor=this.viewOf(roleConnection(connectionId))?.descriptor;if(descriptor?.mode!=="host"||descriptor.authority===void 0)return!1;let state=readAuthority(descriptor.authority);return!state.retired&&state.roles.includes(role)}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),this.carried.delete(connectionId)}noteCarriedDelegation(connectionId){this.carried.add(connectionId)}clear(){this.claims.clear(),this.origins.clear(),this.retained.clear(),this.carried.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)}}var INVALID_CHAIN_COUNT="invalid_chain_count";function admitInputChain(chainCount,settings){if(chainCount===void 0)return{kind:"admitted"};if(typeof chainCount!="number"||!Number.isSafeInteger(chainCount)||chainCount<1)return{kind:"refused",refusal:{message:`chainCount must be a positive integer (1 for a chain's first hop), not ${JSON.stringify(chainCount)}`,errorCode:INVALID_CHAIN_COUNT,errorData:{chainCount}}};try{return{kind:"admitted",chainCount:admitChainCall(chainCount,()=>settings.getThreadChainCountLimit())}}catch(error){if(!(error instanceof ChainCountLimitError))throw error;return{kind:"refused",refusal:{message:error.message,errorCode:CHAIN_COUNT_LIMIT,errorData:{count:error.count,limit:error.limit}}}}}var SENDER_NOT_ALLOWED="sender_not_allowed",DELEGATED_ORIGIN_UNKNOWN="delegated_origin_unknown",CANONICAL_TURN_ID=/^(0|[1-9]\d{0,15})$/;function ledgerId(deliveryId,origin){return origin===void 0?`rpc:local/${deliveryId}`:`device:${encodeURIComponent(origin.deviceId)}/${deliveryId}`}function deliveryTurnMark(command,peer){return command.deliverAs==="steer"?"join":peer.turnOrigin??peer.connectionOrigin}function admitExternalMessage(session,command,peer){let chain=admitInputChain(command.chainCount,session.settingsManager);if(chain.kind==="refused")return{ok:!1,refusal:chain.refusal};let{origin}=peer;if(peer.connectionOrigin==="delegated"&&origin===void 0)return{ok:!1,refusal:{message:`${DELEGATED_ORIGIN_UNKNOWN}: a delegated connection that names no remote device cannot admit a delivery`,errorCode:DELEGATED_ORIGIN_UNKNOWN}};if(origin!==void 0&&command.sender?.kind==="command_line")return{ok:!1,refusal:{message:`${SENDER_NOT_ALLOWED}: a remote device cannot send as this machine's command line`,errorCode:SENDER_NOT_ALLOWED}};let admission=session.externalAdmission,answer=(kind,epoch)=>({ok:!0,data:{kind,turnId:String(epoch)}}),id=ledgerId(command.deliveryId,origin);if(session.sessionManager.reduceHistory(writtenDeliveryIds).has(id))return answer("already_admitted",admission.turnEpoch);let expected=command.expectedTurnId;if(expected!==void 0&&!CANONICAL_TURN_ID.test(expected))return answer("turn_conflict",admission.turnEpoch);let displayText=command.displayText??(origin===void 0?void 0:command.text),result=admission.admit({delivery_id:id,text:command.text,deliverAs:command.deliverAs,...command.sender===void 0?{}:{sender:command.sender},...displayText===void 0?{}:{display_text:displayText},...expected===void 0?{}:{expected_turn_id:Number(expected)},...command.whenIdle===void 0?{}:{whenIdle:command.whenIdle}},{...origin===void 0?{}:{remoteOrigin:origin},...chain.chainCount===void 0?{}:{chainCount:chain.chainCount},turnMark:deliveryTurnMark(command,peer)});return answer(result.kind,result.turn_epoch)}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(path2,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=path2,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(path2,effectId){let handle;try{handle=await open(path2,"r")}catch(cause){throw new TranscriptUnreadable(path2,cause)}try{let size=(await handle.stat()).size,durableSessionId=await readHeaderId(handle,path2,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(path2,cause)}finally{await handle.close()}}async function readHeaderId(handle,path2,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(path2,new Error("the file has no session header"));return header.data.id}function newestInLines(text,effectId,durableSessionId){let lines=text.split(`
105
105
  `),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(resolve2=>{timer=setTimeout(()=>resolve2(!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"&&current2!==void 0?{text:current2.text,revision:current2.revision}:status==="conflict"&&current2!==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,path2,effectId){try{return respond(id,{command:"get_effect_status",data:await lookupEffectInTranscript(path2,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 as existsSync2}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()??[],...permissionModeOf(session),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&&!existsSync2(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(resolve2=>{this.resolve=resolve2})}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 join4}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 join3}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 path2=join3(dir,ROOT_MARKER),entry=await lstat(path2);if(!entry.isFile()||entry.isSymbolicLink())return;let handle=await open2(path2,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=join4(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(join4(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(join4(this.dir,"revision.lock")),temporary=join4(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,join4(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:(path2,data)=>writeFile2(path2,data,{flag:"wx",mode:384}),readFile:async(path2,range)=>{if(!range)return readFile2(path2);let handle=await open4(path2,"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:path2=>unlink(path2)};function describeCause(cause){try{return cause instanceof Error?cause.message:String(cause)}catch{return"unprintable failure cause"}}var CompactStorageReadError=class extends Error{constructor(operation,path2,cause){super(`compact storage ${operation} failed for ${path2}: ${describeCause(cause)}`,{cause}),this.name="CompactStorageReadError",this.operation=operation,this.path=path2}};import{dirname as dirname3,join as join6}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 as dirname2,join as join5}from"node:path";var MARKER=ROOT_MARKER,CompactSpoolRefusedError=class extends Error{constructor(reason,path2,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}): ${path2}${detail}${kept}`,{cause}),this.name="CompactSpoolRefusedError",this.reason=reason,this.path=path2}};async function createSpoolDir(dir){await mkdir3(dirname2(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=join5(dir,`${MARKER}.${token}.tmp`);try{await writeFile3(temporary,JSON.stringify({kind:"scratch",token,owner:await currentRootOwner()}),{flag:"wx",mode:384}),await rename2(temporary,join5(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(join5(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=join5(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 path2=join6(dirname3(this.dir),`.senpi-repair-${randomUUID13()}`);try{let file=await open5(path2,"wx",384);try{await file.writeFile("repair"),await file.sync()}finally{await file.close()}}finally{await rm4(path2,{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(path2,bytes,operation,range){let done=this.beginRead();try{let result=await this.readCommittedFile(path2,bytes,operation,range);return this.assertReadable(),result}finally{done()}}async readCommittedFile(path2,bytes,operation,range){let data;try{data=await this.io.readFile(path2,range)}catch(cause){throw this.readFailure(operation,path2,cause)}if(data.byteLength!==bytes)throw this.readFailure(operation,path2,new Error(`expected ${bytes} bytes, found ${data.byteLength}`));return data}async writeFile(data,operation,retainedInMemoryBytes){let path2=await this.ensureDir(retainedInMemoryBytes);if(path2===void 0)return;let file=join6(path2,`${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(path2,bytes){this.retired||(this.reclaimDebtBytes+=bytes,this.enqueue("reclaim",()=>this.reclaim(path2,bytes,0)))}async reclaim(path2,bytes,attempt){try{await this.io.unlink(path2)}catch(cause){if(cause.code!=="ENOENT"){this.fail("reclaim",path2,cause,0);let delay2=RECLAIM_RETRY_DELAYS_MS[attempt];delay2!==void 0&&setTimeout(()=>{this.retired||this.enqueue("reclaim",()=>this.reclaim(path2,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,path2,cause){return this.fail(operation,path2,cause,0),new CompactStorageReadError(operation,path2,cause)}fail(operation,path2,cause,retained){(HALTING.has(operation)||operation==="page_write")&&this.health.unavailable(),HALTING.has(operation)&&(this.halted=!0),this.record({operation,path:path2,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"),path2=await this.writeFile(data,operation,data.byteLength);if(path2!==void 0)return{path:path2,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(path2,bytes){let id=this.createLeaf("",!0),leaf=this.leaves.get(id);if(!leaf)throw new CompactReadError("ownership");return leaf.file={path:path2,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 createHash5}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=createHash5("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}
106
106
  `)}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&&current2.clientMessageId===next.clientMessageId&&current2.clientTurnId===next.clientTurnId&&(currentMessages===nextMessages||Array.isArray(currentMessages)&&Array.isArray(nextMessages)&&currentMessages.length===nextMessages.length&&currentMessages.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,RELOCATION_TOOL_NAMES,RELOCATION_NOT_OFFERED,SESSION_CONTROL_DELIVERY_TYPE,sessionControlRemoteOriginOf,sessionControlSenderOf,isSessionControlDeliveryDetails,inputTurnMark,markInputTurnOrigin,copyInputTurnMark,hasInputTurnMark,runInRecordScope,recordIsDelegated,noteRunStart,noteTurnContinuation,endTurnContinuation,noteUserMessageStart,ExternalAdmission,deliveryIdOf,parsePermissionFlag,parsePermissionPresetFlag,PERMISSION_PRESET_NAMES,parsePermissionPresetName,registerPermissionPresetReader,readPermissionPreset,readDecisionPresetOverride,releaseDecisionPreset,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,Wildcard,ACCEPT_EDITS_PERMISSION_PRESET_CAPABILITY,AUTO_PERMISSION_PRESET_CAPABILITY,fromConfig,isPresetRule,disabled,approvedStoreRealPath,loadApproved,approvedFileVersion,appendApproved,loadPermissionSettings,markHostDefaultPresetFlag,permissionModeOf,clientNamedPreset,withClientPreset,permissionModeReply,openReplyPermissionMode,bindPermissionDecision,applyClientPermissionMode,maskOfRoles,rolesOfMask,createAuthority,readAuthority,storeNarrowed,storeRetired,nextIncarnation,CommandAuthority,commandAuthority,outsideCommand,withReceipt,takeRelayExec,admitExternalMessageFieldError,MAX_RPC_MESSAGE_CHARACTERS,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,admitInputChain,admitExternalMessage,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};