@code-yeongyu/senpi 2026.11.13 → 2026.11.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/dist/bundle/chunks/{args-H56W53X6.js → args-JWBI5LNO.js} +1 -1
- package/dist/bundle/chunks/{azure-openai-responses-MNN2TINI.js → azure-openai-responses-PEMLRPJ5.js} +1 -1
- package/dist/bundle/chunks/{chunk-HZQHA4PA.js → chunk-3RILB2OD.js} +1 -1
- package/dist/bundle/chunks/{chunk-Y4PFEXFN.js → chunk-5IXYN6DK.js} +1 -1
- package/dist/bundle/chunks/{chunk-BKDXY6EM.js → chunk-5NECOJNK.js} +1 -1
- package/dist/bundle/chunks/{chunk-NI2AOYP6.js → chunk-6MRUNB3Z.js} +1 -1
- package/dist/bundle/chunks/chunk-6QQL3SKM.js +2 -0
- package/dist/bundle/chunks/{chunk-I4N2OIY4.js → chunk-6QXAYNO7.js} +17 -17
- package/dist/bundle/chunks/{chunk-7T2LAWZ4.js → chunk-73HGQTJN.js} +1 -1
- package/dist/bundle/chunks/chunk-75O3CWR5.js +2 -0
- package/dist/bundle/chunks/{chunk-AZ27TE3H.js → chunk-7BX3JQ7F.js} +1 -1
- package/dist/bundle/chunks/{chunk-NDI6N4NJ.js → chunk-7CXLNKEH.js} +1 -1
- package/dist/bundle/chunks/{chunk-E6ZBTSC6.js → chunk-A3LGSX7Z.js} +1 -1
- package/dist/bundle/chunks/{chunk-7GD2EO6T.js → chunk-FYVQEZYN.js} +1 -1
- package/dist/bundle/chunks/{chunk-U4FAWC6C.js → chunk-GXPH7RN6.js} +1 -1
- package/dist/bundle/chunks/{chunk-SFACYIB6.js → chunk-IK3S2NDB.js} +1 -1
- package/dist/bundle/chunks/{chunk-V4VDIV3U.js → chunk-PWA75RQU.js} +1 -1
- package/dist/bundle/chunks/{chunk-IREUIMFE.js → chunk-PWTXZXHH.js} +1 -1
- package/dist/bundle/chunks/{chunk-KKB3K5CV.js → chunk-Q4RJ4WLE.js} +1 -1
- package/dist/bundle/chunks/chunk-QVG5SUSV.js +2 -0
- package/dist/bundle/chunks/chunk-RLIY3AUC.js +2 -0
- package/dist/bundle/chunks/{chunk-EQT4WNCW.js → chunk-TACOXP5H.js} +1 -1
- package/dist/bundle/chunks/{chunk-NXGSYUMV.js → chunk-TB6LIKVR.js} +2 -2
- package/dist/bundle/chunks/{chunk-JLCZIEBC.js → chunk-THYIV26N.js} +1 -1
- package/dist/bundle/chunks/{chunk-6FE42M54.js → chunk-VGHGM5PR.js} +1 -1
- package/dist/bundle/chunks/{chunk-CU6HUYL7.js → chunk-WAGFTIT4.js} +1 -1
- package/dist/bundle/chunks/{chunk-UYPH6RHY.js → chunk-Z4PN2MDA.js} +2 -2
- package/dist/bundle/chunks/{chunk-JJYN347Z.js → chunk-ZJUL5ODW.js} +1 -1
- package/dist/bundle/chunks/{cli-main-MY53RXU3.js → cli-main-MM2XCVYE.js} +1 -1
- package/dist/bundle/chunks/credential-accounts-RXZIUKFM.js +2 -0
- package/dist/bundle/chunks/github-copilot.js +1 -1
- package/dist/bundle/chunks/{hand-entry-AXTVMVJK.js → hand-entry-MBOPYO6I.js} +1 -1
- package/dist/bundle/chunks/{headless-host-SU5O2KZ2.js → headless-host-OEK6W65T.js} +1 -1
- package/dist/bundle/chunks/{health-write-TN7EXGLI.js → health-write-44JERGEJ.js} +1 -1
- package/dist/bundle/chunks/{help-fast-path-TFQ4HJNO.js → help-fast-path-JWHUCE4E.js} +1 -1
- package/dist/bundle/chunks/{host-command-FG56Y53E.js → host-command-O2K2WIPO.js} +1 -1
- package/dist/bundle/chunks/{host-session-command-UFEOW7EP.js → host-session-command-EWA6N4JJ.js} +1 -1
- package/dist/bundle/chunks/interactive-mode-VSZYRVYY.js +2 -0
- package/dist/bundle/chunks/{login-health-XBTIORM4.js → login-health-V4B6LSCP.js} +1 -1
- package/dist/bundle/chunks/main-VEWKRBTD.js +2 -0
- package/dist/bundle/chunks/{multi-session-host-Q6SHI22A.js → multi-session-host-HC6NR5N2.js} +1 -1
- package/dist/bundle/chunks/{openai-codex-responses-VRGOAFEG.js → openai-codex-responses-IFPWK7NG.js} +1 -1
- package/dist/bundle/chunks/openai-responses-2BTL5MA2.js +5 -0
- package/dist/bundle/chunks/{package-manager-cli-LILAWI3Q.js → package-manager-cli-OZ6DK6GI.js} +3 -3
- package/dist/bundle/chunks/{role-KODRTWH5.js → role-BTH5PVME.js} +1 -1
- package/dist/bundle/chunks/{rotation-stream-2KNROTYB.js → rotation-stream-ZGPXLY62.js} +1 -1
- package/dist/bundle/chunks/rpc-mode-WPF3NVBL.js +2 -0
- package/dist/bundle/chunks/{run-attached-tui-OEFHV5CZ.js → run-attached-tui-RVVYEINN.js} +1 -1
- package/dist/bundle/chunks/{schedule-command-VO4RP2KX.js → schedule-command-6TAAG2KU.js} +1 -1
- package/dist/bundle/chunks/{session-control-endpoint-CCVRJHSC.js → session-control-endpoint-3FNVOKKT.js} +1 -1
- package/dist/bundle/chunks/{session-picker-VN5I2ZDI.js → session-picker-YDXDCBRL.js} +1 -1
- package/dist/bundle/chunks/session-slot-N4E4OSCX.js +2 -0
- package/dist/bundle/chunks/session-worker.js +22 -21
- package/dist/bundle/chunks/{state-store-7RVODZJU.js → state-store-I6MUHET3.js} +1 -1
- package/dist/bundle/cli.js +2 -2
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/bundle/runtime-manifest.json +1 -1
- package/dist/core/agent-session.d.ts +5 -3
- package/dist/core/agent-session.js +16 -6
- package/dist/core/credential-accounts.d.ts +5 -3
- package/dist/core/credential-accounts.js +8 -6
- package/dist/core/credential-pool/classify.js +5 -1
- package/dist/core/extensions/builtin/anthropic-subscription/content-blocks.d.ts +6 -0
- package/dist/core/extensions/builtin/anthropic-subscription/content-blocks.js +14 -0
- package/dist/core/extensions/builtin/anthropic-subscription/prompt-bridge.js +3 -1
- package/dist/core/extensions/builtin/anthropic-subscription/session-sync.js +4 -1
- package/dist/core/extensions/builtin/permission-system/index.js +5 -1
- package/dist/core/reasoning-baseline.d.ts +8 -1
- package/dist/core/reasoning-baseline.js +24 -0
- package/dist/modes/rpc/connection-handler.js +4 -0
- package/dist/modes/rpc/method-classes-schema-session.d.ts +3 -0
- package/dist/modes/rpc/method-classes-schema-session.js +6 -2
- package/dist/modes/rpc/method-classes-schema.d.ts +3 -0
- package/dist/modes/rpc/project-expected-cwd.d.ts +29 -0
- package/dist/modes/rpc/project-expected-cwd.js +45 -0
- package/dist/modes/rpc/rpc-error-types.d.ts +7 -1
- package/dist/modes/rpc/rpc-error-types.js +6 -0
- package/dist/modes/rpc/rpc-session-command-types.d.ts +3 -0
- package/dist/package-manager-cli.d.ts +14 -0
- package/dist/package-manager-cli.js +20 -4
- package/dist/utils/version-check.d.ts +10 -7
- package/dist/utils/version-check.js +24 -5
- package/docs/rpc.md +20 -7
- package/package.json +7 -7
- package/dist/bundle/chunks/chunk-GLTOBXZY.js +0 -2
- package/dist/bundle/chunks/chunk-PBUV2Z3R.js +0 -2
- package/dist/bundle/chunks/chunk-WRBOKYPS.js +0 -2
- package/dist/bundle/chunks/credential-accounts-ZB5IXHIG.js +0 -2
- package/dist/bundle/chunks/interactive-mode-PHES47E3.js +0 -2
- package/dist/bundle/chunks/main-PR4FI6HQ.js +0 -2
- package/dist/bundle/chunks/openai-responses-I7PXRWCM.js +0 -4
- package/dist/bundle/chunks/rpc-mode-CGVK4SSA.js +0 -2
- package/dist/bundle/chunks/session-slot-GHJVOSG7.js +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
|
|
2
|
-
import{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-WRBOKYPS.js";import{carryExecutionCallKey,compactUpdatesEnabled}from"./chunk-WMDJMN5W.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-IJXKHJYR.js";import{serializeJsonLine}from"./chunk-SF4MQDKZ.js";import{external_exports}from"./chunk-36BLGKRO.js";import{CHAIN_COUNT_LIMIT,ChainCountLimitError,admitChainCall}from"./chunk-NDI6N4NJ.js";import{modelSupportsAssistantPrefill}from"./chunk-SFACYIB6.js";import{hasFunctions,realmRegistry}from"./chunk-XDEZA6U6.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-75O3CWR5.js";import{carryExecutionCallKey,compactUpdatesEnabled}from"./chunk-WMDJMN5W.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-IJXKHJYR.js";import{serializeJsonLine}from"./chunk-SF4MQDKZ.js";import{external_exports}from"./chunk-36BLGKRO.js";import{CHAIN_COUNT_LIMIT,ChainCountLimitError,admitChainCall}from"./chunk-7CXLNKEH.js";import{modelSupportsAssistantPrefill}from"./chunk-IK3S2NDB.js";import{hasFunctions,realmRegistry}from"./chunk-XDEZA6U6.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
|
|
|
@@ -0,0 +1,2 @@
|
|
|
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{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{APP_NAME,BRAND,DISPLAY_VERSION,PACKAGE_NAME,brandProfile,detectInstallMethod,envValue}from"./chunk-SODMQEHO.js";import{__toESM}from"./chunk-IKOFCODM.js";import{spawnSync}from"node:child_process";import{homedir as osHomedir}from"node:os";import{posix,win32}from"node:path";var RUNTIME_ENV_VAR="SENPI_RUNTIME",MIN_BUN_VERSION="1.4.0";function normalize(path){return path.replaceAll("\\","/")}function paths(options){return options.platform==="win32"?win32:posix}function bunRoot(options){let configured=options.env.BUN_INSTALL;return configured!==void 0&&configured.trim()!==""?configured:paths(options).join(options.homedir,".bun")}function resolveOrSelf(path,options){try{return options.realpath(path)}catch{return path}}function isUnderBunGlobalTree(scriptRealPath,options){let globalRoot=paths(options).join(bunRoot(options),"install","global"),script=normalize(scriptRealPath);for(let candidate of new Set([globalRoot,resolveOrSelf(globalRoot,options)]))if(script.startsWith(`${normalize(candidate)}/`))return!0;return!1}function isInstalledPackageScript(scriptRealPath){return normalize(scriptRealPath).includes("/node_modules/")}function bunVersionSatisfies(version){let actual=/^v?(\d+)\.(\d+)\.(\d+)/.exec(version?.trim()??""),minimum=/^(\d+)\.(\d+)\.(\d+)/.exec(MIN_BUN_VERSION);if(!actual||!minimum)return!1;for(let index=1;index<=3;index++){let difference=Number(actual[index])-Number(minimum[index]);if(difference!==0)return difference>0}return!0}function bunExecutableName(options){return options.platform==="win32"?"bun.exe":"bun"}function pathCandidateNames(options){if(options.platform!=="win32")return["bun"];let extensions=(options.env.PATHEXT??".COM;.EXE;.BAT;.CMD").split(";").map(extension=>extension.trim()).filter(extension=>extension.length>0);return extensions.length>0?extensions.map(extension=>`bun${extension}`):["bun.exe"]}function findBunBinary(options){let path=paths(options),executable=bunExecutableName(options),rootCandidates=[path.join(bunRoot(options),"bin",executable),path.join(options.homedir,".bun","bin",executable)];for(let candidate of rootCandidates)if(options.exists(candidate))return candidate;let pathValue=options.env.PATH??options.env.Path;if(pathValue===void 0||pathValue==="")return;let names=pathCandidateNames(options);for(let directory of pathValue.split(path.delimiter))if(directory!=="")for(let name of names){let candidate=path.join(directory,name);if(options.exists(candidate))return candidate}}function readRuntimePin(options){let value=options.env[RUNTIME_ENV_VAR];if(value==="node"||value==="bun")return value}function resolveBunReexec(input){if(input.versions.bun!==void 0)return{action:"stay",reason:"already-bun"};let pinned=readRuntimePin(input.options);if(pinned==="node")return{action:"stay",reason:"runtime-pinned-node"};if(input.hasInheritedInspectorOption)return{action:"stay",reason:"inspector"};let trustsInstalledBun=pinned==="bun"||isUnderBunGlobalTree(input.scriptRealPath,input.options);if(!trustsInstalledBun&&!isInstalledPackageScript(input.scriptRealPath))return{action:"stay",reason:"not-bun-install"};let bunPath=findBunBinary(input.options);return bunPath===void 0?{action:"stay",reason:"bun-not-found"}:!trustsInstalledBun&&!bunVersionSatisfies(input.options.bunVersion(bunPath))?{action:"stay",reason:"bun-too-old"}:{action:"reexec",bunPath}}function readBunVersion(bunPath){try{let result=spawnSync(bunPath,["--version"],{encoding:"utf8",timeout:5e3,windowsHide:!0});if(result.status!==0)return;let version=result.stdout.trim();return version===""?void 0:version}catch{return}}function processBunRuntimeOptions(exists,realpath){return{env:process.env,homedir:osHomedir(),platform:process.platform,exists,realpath,bunVersion:readBunVersion}}function getPiUserAgent(version=DISPLAY_VERSION){let runtime=process.versions.bun?`bun/${process.versions.bun}`:`node/${process.version}`;return`${BRAND?.userAgent??APP_NAME}/${version} (${process.platform}; ${runtime}; ${process.arch})`}var import_semver=__toESM(require_semver(),1);var REGISTRY_BASE_URL="https://registry.npmjs.org",LATEST_VERSION_URL=`${REGISTRY_BASE_URL}/${encodeURIComponent(PACKAGE_NAME)}/latest`;function latestVersionUrl(channel){return channel?`${REGISTRY_BASE_URL}/-/package/${encodeURIComponent(channel.packageName)}/dist-tags`:LATEST_VERSION_URL}var LATEST_RELEASE_URL="https://api.github.com/repos/code-yeongyu/senpi/releases/latest";function readLatestReleaseVersion(payload){if(typeof payload!="object"||payload===null)return;let release=payload;if(release.draft===!0||release.prerelease===!0)return;let tag=typeof release.tag_name=="string"?release.tag_name.trim():"";return(tag.startsWith("v")?tag.slice(1):tag)||void 0}function readAvailableVersion(payload,channel){if(typeof payload!="object"||payload===null)return;let source=payload,raw=channel?source[channel.distTag]:source.version;return typeof raw=="string"&&raw.trim()?raw.trim():void 0}var DEFAULT_VERSION_CHECK_TIMEOUT_MS=1e4,RELEASE_CHANGELOG_BASE_URL="https://github.com/code-yeongyu/senpi/blob",RELEASE_CHANGELOG_PATH="packages/coding-agent/CHANGELOG.md",SENPI_CALVER_PATTERN=/^(\d{4})\.(\d{1,2})\.(\d{1,2})(?:-([1-9]\d*))?$/;function parseSenpiCalVer(version){let match=SENPI_CALVER_PATTERN.exec(version);if(match)return[Number(match[1]),Number(match[2]),Number(match[3]),Number(match[4]??1)]}function canonicalCalVer([year,month,day,revision]){return revision>1?`${year}.${month}.${day}-${revision}`:`${year}.${month}.${day}`}function formatVersionCheckError(error){let rootMessage=error instanceof Error&&error.message?error.message:String(error),cause=error instanceof Error?error.cause:void 0,causes=cause instanceof AggregateError?cause.errors:cause===void 0?[]:[cause],codes=causes.map(value=>typeof value=="object"&&value!==null&&"code"in value&&typeof value.code=="string"?value.code:void 0).filter(code=>code!==void 0);if(codes.length>0)return`${rootMessage} (${[...new Set(codes)].join(", ")})`;let causeMessage=causes.find(value=>value instanceof Error&&!!value.message)?.message;return causeMessage?`${rootMessage} (cause: ${causeMessage})`:rootMessage}function comparePackageVersions(leftVersion,rightVersion){let leftTrimmed=leftVersion.trim(),rightTrimmed=rightVersion.trim(),leftCalVer=parseSenpiCalVer(leftTrimmed),rightCalVer=parseSenpiCalVer(rightTrimmed);if(leftCalVer&&rightCalVer){for(let index=0;index<leftCalVer.length;index++)if(leftCalVer[index]!==rightCalVer[index])return leftCalVer[index]<rightCalVer[index]?-1:1;return 0}let left=(0,import_semver.valid)(leftCalVer?canonicalCalVer(leftCalVer):leftTrimmed),right=(0,import_semver.valid)(rightCalVer?canonicalCalVer(rightCalVer):rightTrimmed);if(!(!left||!right))return(0,import_semver.compare)(left,right)}function isNewerPackageVersion(candidateVersion,currentVersion){let comparison=comparePackageVersions(candidateVersion,currentVersion);return comparison!==void 0&&comparison>0}function getReleaseChangelogUrl(version){let trimmedVersion=version.trim(),channel=brandProfile()?.update;if(channel?.changelogUrl)return channel.changelogUrl.replace("{version}",trimmedVersion);let tag=trimmedVersion.startsWith("v")?trimmedVersion:`v${trimmedVersion}`;return`${RELEASE_CHANGELOG_BASE_URL}/${tag}/${RELEASE_CHANGELOG_PATH}`}async function getLatestPiRelease(currentVersion,options={}){if(envValue("OFFLINE"))return;let brand=brandProfile(),channel=brand?.update;if(brand&&!channel)return;let fromRelease=!channel&&(options.installMethod??detectInstallMethod())==="bun-binary",response=await fetchWithRetry(fromRelease?LATEST_RELEASE_URL:latestVersionUrl(channel),{headers:{"User-Agent":getPiUserAgent(currentVersion),accept:fromRelease?"application/vnd.github+json":"application/json"}},{maxRetries:options.retry?2:0,timeoutMs:options.timeoutMs??DEFAULT_VERSION_CHECK_TIMEOUT_MS});if(!response.ok)return;if(fromRelease){let releaseVersion=readLatestReleaseVersion(await response.json());return releaseVersion?{version:releaseVersion}:void 0}let data=await response.json(),availableVersion=readAvailableVersion(data,channel);if(!availableVersion)return;if(channel)return{version:availableVersion,packageName:channel.packageName};let packageName=typeof data.packageName=="string"&&data.packageName.trim()?data.packageName.trim():void 0,note=typeof data.note=="string"&&data.note.trim()?data.note.trim():void 0;return{version:availableVersion,packageName,note}}async function checkForNewPiVersion(currentVersion,options={}){if(!envValue("SKIP_VERSION_CHECK"))try{let latestRelease=await getLatestPiRelease(currentVersion,options);return latestRelease&&isNewerPackageVersion(latestRelease.version,currentVersion)?latestRelease:void 0}catch{return}}export{RUNTIME_ENV_VAR,MIN_BUN_VERSION,bunVersionSatisfies,findBunBinary,resolveBunReexec,processBunRuntimeOptions,getPiUserAgent,formatVersionCheckError,isNewerPackageVersion,getReleaseChangelogUrl,getLatestPiRelease,checkForNewPiVersion};
|
|
@@ -0,0 +1,2 @@
|
|
|
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{usageLimitResetMs}from"./chunk-WB4BUHOH.js";import{rateLimitModelFamily}from"./chunk-NJ43NBSP.js";import{isSiwcMissingResponsesScope}from"./chunk-6QQL3SKM.js";import{normalizeProviderError}from"./chunk-AC72EWI5.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-RQFD6LG2.js";import{getOverflowPatterns}from"./chunk-IK3S2NDB.js";import{ModelsError,OAuthTokenEndpointError,PROVIDER_NOT_CONFIGURED_PREFIX,USAGE_LIMIT_EXHAUSTION,isOAuthRefreshUnavailableError}from"./chunk-OH5TKHW7.js";import{credentialPoolBlockedDiagnostic,readProviderDiagnostic}from"./chunk-JGKH3D6W.js";import{attachProviderDiagnostic,siwcRecoveryFromDiagnostic}from"./chunk-3SASTB6Y.js";function rendezvousOrder(key,slots,hasher){return[...slots].map(slot=>({slot,score:hasher(`${key}\0${slot.name}`)})).sort((left,right)=>right.score>left.score?1:right.score<left.score?-1:0).map(({slot})=>slot)}function applyAccountOrder(order,ranked){if(order===void 0||order.length===0)return[...ranked];let byName=new Map(ranked.map(slot=>[slot.name,slot])),front=[];for(let name of order){let slot=byName.get(name);slot!==void 0&&!front.includes(slot)&&front.push(slot)}return[...front,...ranked.filter(slot=>!front.includes(slot))]}function withoutOrderedAccount(credential,name){if(credential.order===void 0||!credential.order.includes(name))return credential;let order=credential.order.filter(entry=>entry!==name),next={...credential};return order.length===0?delete next.order:next.order=order,next}function isSlotBlocked(slot,now){return slot.blockReason==="auth_error"||slot.blockedUntil!==void 0&&slot.blockedUntil>now}var DEFAULT_SLOT_BLOCK_MS=6e4,MAX_SLOT_BLOCK_MS=2880*60*1e3;function escapeRegExp(text){return text.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var ACCOUNT_USAGE_LIMIT_TEXT=new RegExp([...USAGE_LIMIT_EXHAUSTION.markers.map(escapeRegExp),String.raw`\b(?:hit|reached)\s+your\b[^.]*?\blimit\b`,String.raw`\busage\s+limit\s+reached\b`,String.raw`\b(?:Go|Free)UsageLimitError\b`,String.raw`\bblocking_limit\b`,String.raw`\brapid_refill_breaker\b`,String.raw`\bquota\s+exceeded\b`].join("|"),"i");function isAccountUsageLimitText(text){return ACCOUNT_USAGE_LIMIT_TEXT.test(text)}var COOLDOWN_BASE_MS=DEFAULT_SLOT_BLOCK_MS,COOLDOWN_CAP_MS=MAX_SLOT_BLOCK_MS,GUESSED_BACKOFF_CAP_MS=1800*1e3,RETRY_SAME_MAX_ATTEMPTS=2,ACCOUNT_POOL_REFUSAL_NOTE="No request was sent: the account pool refused it locally.";function rateLimitCooldown(failureCount,serverHintMs,policy={}){let cap=policy.capMs??COOLDOWN_CAP_MS,base=policy.baseMs??COOLDOWN_BASE_MS,backoff=Math.min(cap,GUESSED_BACKOFF_CAP_MS,base*2**Math.max(0,failureCount)),floored=serverHintMs===void 0?backoff:Math.max(backoff,serverHintMs);return{cooldownMs:Math.min(cap,floored),retryAfterWasCapped:floored>cap}}function usageLimitCooldown(resetMs,policy={}){let cap=policy.capMs??COOLDOWN_CAP_MS;return{cooldownMs:Math.min(cap,resetMs),retryAfterWasCapped:resetMs>cap}}var INVALID_KEY_TEXT=/invalid[ _-]?(?:api[ _-]?)?key|authentication[_ ]?error|invalid x-api-key|unauthorized/i,REVOKED_TOKEN_TEXT=/invalidated (?:oauth )?token|(?<!\b(?:session|csrf|xsrf|page|pagination|continuation|cursor|sync|stream|upload|idempotency|request|nonce|state)[ _-])token(?:[ _-](?:invalidated|revoked)|\s(?:has been|was) (?:invalidated|revoked))/i,REFUSED_GRANT_CODES=new Set(["invalid_grant","refresh_token_expired","refresh_token_invalidated","refresh_token_reused","token_revoked"]),REFUSED_GRANT_TOKEN=/(?<![a-z_])(invalid_grant|refresh_token_(?:expired|invalidated|reused)|token_revoked)(?![a-z_])/,CLIENT_FAULT_CODES=new Set(["invalid_client","invalid_request","invalid_scope","unauthorized_client","unsupported_grant_type"]),NETWORK_FAULT_CODES=new Set(["ECONNRESET","ECONNREFUSED","ECONNABORTED","ETIMEDOUT","EHOSTUNREACH","EHOSTDOWN","ENETUNREACH","ENETDOWN","ENETRESET","ENOTFOUND","EAI_AGAIN","EPIPE","EADDRNOTAVAIL","ERR_SOCKET_CONNECTION_TIMEOUT","UND_ERR_CONNECT_TIMEOUT","UND_ERR_HEADERS_TIMEOUT","UND_ERR_BODY_TIMEOUT","UND_ERR_SOCKET","UND_ERR_CLOSED","ConnectionRefused","ConnectionClosed","FailedToOpenSocket"]),AUTH_ERROR_CODES=new Set(["authentication_error","invalid_api_key","token_invalidated",...REFUSED_GRANT_CODES]),MAX_CAUSE_LINKS=16,ACCOUNT_SCOPED_403_TEXT=/account|credential|token|api[ _-]?key|organization|subscription/i,MODEL_SCOPED_REFUSAL_TEXT=[/(?:does not include(?: access to)?|not entitled to(?: use)?|no access to)[^.]{0,60}?\bmodel\b/i,/\bmodel\b.{0,80}?\b(?:is not|not|no)\b.{0,40}?\b(?:available|included|entitled|enabled|accessible)\b.{0,40}?\b(?:plan|subscription)\b/i,/(?:plan|subscription)[^.]{0,30}?\bdoes not\b[^.]{0,20}?\binclude access to\b/i],RATE_LIMIT_TEXT=/rate[ _-]?limit|too many requests|resource_exhausted/i,BILLING_TEXT=/billing|credits?[ _-]?(?:required|exhausted|balance)|insufficient[ _-]?(?:funds|quota|credit)|payment[ _-]?required|quota[ _-]?exhausted/i,OVERLOAD_TEXT=/overloaded/i,NETWORK_TEXT=/econnreset|econnrefused|etimedout|enotfound|socket hang up|fetch failed|network error|request timed out/i,WEBSOCKET_REQUEST_FAULT_TEXT=/websocket closed 100[89]\b/i,WEBSOCKET_TRANSPORT_FAULT_TEXT=/websocket (?:closed|error|connect timeout|liveness timeout)/i,FAIL_FAST_TEXT=/context[ _-]?(?:length|window)|maximum context|invalid[ _-]?model|model[ _-]?not[ _-]?found|malformed[ _-]?stream|premature[ _-]?(?:close|stream)/i,ABORT_TEXT=/\baborted?\b/i,TEMPORARY_FAULT_TEXT=/time[ds]?[ _-]?out|timed out|disconnect|reset before|connection reset|gateway|temporarily|unavailable/i;function limitFromProviderCode(error){let diagnostic=readProviderDiagnostic(error);if(diagnostic?.evidence==="structured_code")switch(diagnostic.code){case"rate_limit_exceeded":return{kind:"throttle"};case"usage_limit_reached":case"usage_not_included":return diagnostic.resetsAt===void 0?{kind:"spent"}:{kind:"spent",resetsAt:diagnostic.resetsAt};default:return}}function isAbort(error,message){return error instanceof Error&&error.name==="AbortError"?!0:ABORT_TEXT.test(message)}function failedRefresh(error){let seen=new Set;for(;typeof error=="object"&&error!==null&&!seen.has(error)&&seen.size<MAX_CAUSE_LINKS;){if(seen.add(error),error instanceof ModelsError)return error.code==="oauth"?error:void 0;error=Reflect.get(error,"cause")}}function oauthBodyErrorCode(message){let start=message.indexOf("{"),end=message.lastIndexOf("}");if(!(start<0||end<=start))try{let body=JSON.parse(message.slice(start,end+1));if(typeof body!="object"||body===null)return;let field=Reflect.get(body,"error");if(typeof field=="string")return field;if(typeof field=="object"&&field!==null){let code=Reflect.get(field,"code");return typeof code=="string"?code:void 0}return}catch{return}}function isRefusedGrant(refresh){let cause=refresh.cause;if(!(cause instanceof OAuthTokenEndpointError))return!1;let code=cause.oauthError??oauthBodyErrorCode(cause.message);return code!==void 0&&CLIENT_FAULT_CODES.has(code)?!1:cause.credentialRefused||cause.status===401?!0:code!==void 0&&REFUSED_GRANT_CODES.has(code)?[400,403,404].includes(cause.status):cause.status===400&&REFUSED_GRANT_TOKEN.test(cause.message)}function isRefreshNetworkFault(refresh,text){let seen=new Set,error=refresh.cause;for(;typeof error=="object"&&error!==null&&!seen.has(error)&&seen.size<MAX_CAUSE_LINKS;){if(seen.add(error),error instanceof OAuthTokenEndpointError)return!1;let code=Reflect.get(error,"code");if(typeof code=="string")return NETWORK_FAULT_CODES.has(code);error=Reflect.get(error,"cause")}return NETWORK_TEXT.test(text)}function hasAuthDiagnostic(error){let diagnostic=readProviderDiagnostic(error);return diagnostic===void 0?!1:diagnostic.category==="auth"||diagnostic.code!==void 0&&AUTH_ERROR_CODES.has(diagnostic.code)}function isOverflowText(text){return getOverflowPatterns().some(pattern=>pattern.test(text))}var JSON_BODY=/\{\s*"[^"]+"\s*:/;function rateLimitHint(codedThrottle,codedReset,text,status,usageLimit,diagnosticRetryAfterMs,nowMs){let sourced=(hint,source)=>hint===void 0?{hint,resetSource:"default_backoff"}:{hint,resetSource:source};if(codedThrottle)return sourced(parseRetryAfterMsMarker(text),"retry_after");if(codedReset!==void 0)return sourced(codedReset,"reset_field");let retryAfter=extract429RetryAfterMs({status:status??429,bodyText:text},nowMs);return retryAfter!==void 0?parseRetryAfterMsMarker(text)!==void 0?sourced(retryAfter,"retry_after"):sourced(retryAfter,JSON_BODY.test(text)?"reset_field":"reset_prose"):usageLimit?diagnosticRetryAfterMs!==void 0?sourced(diagnosticRetryAfterMs,"reset_field"):sourced(usageLimitResetMs(text,nowMs),JSON_BODY.test(text)?"reset_field":"reset_prose"):sourced(void 0,"default_backoff")}function credentialFailureText(error){let normalized=normalizeProviderError(error);return normalized.messageCarriesBody?normalized.message:`${normalized.message} ${normalized.body??""}`}function classifyCredentialFailure(error,context={}){if(isOAuthRefreshUnavailableError(error))return{kind:"retry_same",maxAttempts:RETRY_SAME_MAX_ATTEMPTS};let normalized=normalizeProviderError(error),text=normalized.messageCarriesBody?normalized.message:`${normalized.message} ${normalized.body??""}`,status=normalized.status,failureCount=context.failureCount??0;if(error instanceof Error&&error.name==="AbortError")return{kind:"fail_request"};switch(siwcRecoveryFromDiagnostic(readProviderDiagnostic(error))){case"usage_limit":return{kind:"failover",block:{reason:"rate_limit",usageLimit:!0,...rateLimitCooldown(failureCount,void 0,{baseMs:context.cooldownBaseMs,capMs:Math.min(context.cooldownCapMs??COOLDOWN_CAP_MS,30*6e4)})}};case"account_disabled":return{kind:"failover",block:{reason:"account_disabled"}};case"auth":return isSiwcMissingResponsesScope(text)?{kind:"fail_request"}:{kind:"failover",block:{reason:"auth_error"}};case"request":return{kind:"fail_request"};case"transient":return{kind:"retry_same",maxAttempts:RETRY_SAME_MAX_ATTEMPTS};case void 0:break}if(isAbort(error,text))return{kind:"fail_request"};if(text.includes(ACCOUNT_POOL_REFUSAL_NOTE))return{kind:"fail_request"};let providerFault=status===408||status!==void 0&&status>=500&&status<600||status===void 0&&(TEMPORARY_FAULT_TEXT.test(text)||NETWORK_TEXT.test(text)||OVERLOAD_TEXT.test(text)),codedLimit=limitFromProviderCode(error),usageLimit=codedLimit!==void 0?codedLimit.kind==="spent":isAccountUsageLimitText(text)&&!isOverflowText(text),limitText=codedLimit!==void 0||RATE_LIMIT_TEXT.test(text)||usageLimit;if(text.includes(PROVIDER_NOT_CONFIGURED_PREFIX))return{kind:"failover",block:{reason:"auth_error"}};let statusFault=status===408||status===429||status!==void 0&&status>=500&&status<600,refresh=failedRefresh(error);if(refresh!==void 0)return!statusFault&&isRefusedGrant(refresh)?{kind:"failover",block:{reason:"auth_error"}}:isRefreshNetworkFault(refresh,text)?{kind:"retry_same",maxAttempts:RETRY_SAME_MAX_ATTEMPTS}:{kind:"fail_request"};if(!providerFault&&status!==429&&hasAuthDiagnostic(error))return{kind:"failover",block:{reason:"auth_error"}};if(status===401||!providerFault&&status!==429&&(INVALID_KEY_TEXT.test(text)||REVOKED_TOKEN_TEXT.test(text)))return{kind:"failover",block:{reason:"auth_error"}};if(status===403&&!limitText)return MODEL_SCOPED_REFUSAL_TEXT.some(pattern=>pattern.test(text))?{kind:"fail_request"}:ACCOUNT_SCOPED_403_TEXT.test(text)?{kind:"failover",block:{reason:"auth_error"}}:{kind:"fail_request"};if(status===402||!providerFault&&BILLING_TEXT.test(text))return{kind:"failover",block:{reason:"account_disabled"}};if(status===429||limitText){if(codedLimit===void 0&&MODEL_SCOPED_REFUSAL_TEXT.some(pattern=>pattern.test(text)))return{kind:"fail_request"};let nowMs=context.nowMs??Date.now(),codedResetMs=codedLimit?.kind==="spent"&&codedLimit.resetsAt!==void 0?codedLimit.resetsAt-nowMs:void 0,codedReset=codedResetMs!==void 0&&codedResetMs>0?codedResetMs:void 0,{hint,resetSource}=rateLimitHint(codedLimit?.kind==="throttle",codedReset,text,status,usageLimit,normalized.retryAfterMs,nowMs),modelFamily=rateLimitModelFamily(text),policy={baseMs:context.cooldownBaseMs,capMs:context.cooldownCapMs};return{kind:"failover",block:{reason:"rate_limit",...usageLimit&&hint!==void 0&&hint>0?usageLimitCooldown(hint,policy):rateLimitCooldown(failureCount,hint,policy),resetSource,...modelFamily===void 0?{}:{modelFamily}}}}return isOverflowText(text)||status===400||status===404||FAIL_FAST_TEXT.test(text)?{kind:"fail_request"}:WEBSOCKET_REQUEST_FAULT_TEXT.test(text)?{kind:"fail_request"}:WEBSOCKET_TRANSPORT_FAULT_TEXT.test(text)?{kind:"retry_same",maxAttempts:RETRY_SAME_MAX_ATTEMPTS}:status===529||OVERLOAD_TEXT.test(text)||status!==void 0&&status>=500&&status<600?{kind:"retry_same",maxAttempts:RETRY_SAME_MAX_ATTEMPTS}:status===408||NETWORK_TEXT.test(text)?{kind:"retry_same",maxAttempts:RETRY_SAME_MAX_ATTEMPTS}:{kind:"fail_request"}}var CredentialFailoverError=class extends Error{constructor(action,original,options={}){let detail=original instanceof Error?original.message:String(original);super(detail,{cause:original}),this.name="CredentialFailoverError",this.action=action,this.original=original,this.retryAt=options.retryAt}};function isAvailable(slot,now){return!(slot.blockReason==="account_disabled"||slot.blockedUntil!==void 0&&slot.blockedUntil>now)}function coolingProbe(slots,attempted){if(attempted.size>0)return[];let soonest=slots.filter(slot=>slot.blockReason==="rate_limit"&&slot.blockedUntil!==void 0).reduce((best,slot)=>best===void 0||(slot.blockedUntil??0)<(best.blockedUntil??0)?slot:best,void 0);return soonest===void 0?[]:[soonest]}function attemptCandidates(slots,attempted,now){let available=slots.filter(slot=>!attempted.has(slot.name)&&isAvailable(slot,now));return available.length>0?available:coolingProbe(slots,attempted)}function noSlotsError(slots,now){let retryAt=soonestRetryAt(slots,now);return new CredentialFailoverError({kind:"fail_request"},new Error(noSlotsMessage(slots,now)),retryAt===void 0?{}:{retryAt})}function dueBack(epochMs){return`${localTime(epochMs)} (${new Date(epochMs).toISOString()})`}function localTime(epochMs){return new Date(epochMs).toLocaleString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"numeric",minute:"2-digit",timeZoneName:"short"})}function noSlotsMessage(slots,now){let blocked=slots.map(slot=>{let reason=slot.blockReason??"blocked";return slot.blockedUntil!==void 0&&slot.blockedUntil>now?`${slot.name} (${reason} until ${dueBack(slot.blockedUntil)})`:reason==="account_disabled"?`${slot.name} (account_disabled until re-login)`:`${slot.name} (${reason})`}),firstBack=soonestRetryAt(slots,now),step=firstBack===void 0?"Sign in again or add a new API key for this provider, or choose another model.":`Wait until ${localTime(firstBack)}, or choose another model.`;return blocked.length===0?`No credential slots available. ${step}`:`No credential slots available: ${blocked.join(", ")}. ${step}`}function isRateLimitBlock(action){return action.kind==="failover"&&action.block.reason==="rate_limit"}var OUT_OF_POOL_REASONS=new Set(["auth_error","account_disabled"]);function limitedUntil(slots,now){let resets=[];for(let slot of slots)if(!OUT_OF_POOL_REASONS.has(slot.blockReason??"")){if(slot.blockReason!=="rate_limit"||slot.blockedUntil===void 0||slot.blockedUntil<=now)return;resets.push(slot.blockedUntil)}return resets.length===0?void 0:Math.min(...resets)}function soonestRetryAt(slots,now){let deadlines=slots.map(slot=>slot.blockedUntil).filter(value=>value!==void 0&&value>now);return deadlines.length===0?void 0:Math.min(...deadlines)}async function settle(stream){let iterator=stream[Symbol.asyncIterator]();try{await iterator.return?.(void 0)}catch{}}async function*runCredentialFailover(options){let now=options.now??Date.now,classify=options.classify??classifyCredentialFailure,attempted=new Set,retriesBySlot=new Map,lastError,lastOriginal,lastTerminalEvent,startAnnounced=!1,unsettled;try{for(;;){let slots=await options.listSlots(),candidates=attemptCandidates(slots,attempted,now());if(candidates.length===0){let limitedRetryAt=lastError===void 0||isRateLimitBlock(lastError.action)?limitedUntil(slots,now()):void 0;if(lastTerminalEvent!==void 0){yield limitedRetryAt===void 0||options.withPoolRetryAt===void 0?lastTerminalEvent:options.withPoolRetryAt(lastTerminalEvent,limitedRetryAt);return}let retryAt=soonestRetryAt(slots,now()),refusal=lastError===void 0||lastOriginal===void 0?noSlotsError(slots,now()):new CredentialFailoverError(lastError.action,lastOriginal,retryAt===void 0?{}:{retryAt});throw limitedRetryAt===void 0?refusal:attachProviderDiagnostic(refusal,credentialPoolBlockedDiagnostic(limitedRetryAt))}let slot=options.select(candidates);unsettled=slot;let committedOutput=!1,terminalEvent,attemptStream;try{attemptStream=await options.runAttempt(slot);for await(let event of attemptStream){let failure=options.errorFromEvent?.(event);if(failure!==void 0)throw terminalEvent=event,failure;if(options.isStreamStart?.(event)){if(startAnnounced)continue;startAnnounced=!0}committedOutput||=options.isCommittedOutput(event),yield event}unsettled=void 0,await options.onSuccess?.(slot);return}catch(error){attemptStream&&await settle(attemptStream);let failureCount=(slot.failureCount??0)+(retriesBySlot.get(slot.name)??0),action=classify(error,{failureCount});if(lastOriginal=error,lastTerminalEvent=terminalEvent,action.kind==="retry_same"&&!committedOutput){let used=(retriesBySlot.get(slot.name)??0)+1;if(retriesBySlot.set(slot.name,used),used<action.maxAttempts){unsettled=void 0,await options.releaseSlot?.(slot);continue}if(terminalEvent!==void 0){yield terminalEvent;return}throw new CredentialFailoverError(action,error)}if(action.kind!=="failover"){if(terminalEvent!==void 0){yield terminalEvent;return}throw new CredentialFailoverError(action,error)}unsettled=void 0,await options.persistBlock(slot,action.block,error),attempted.add(slot.name);let failure=new CredentialFailoverError(action,error);if(lastError=failure,await options.onRotate?.({slot,block:action.block,attempt:attempted.size,committedOutput}),committedOutput){if(terminalEvent!==void 0){yield terminalEvent;return}throw failure}}}}finally{unsettled!==void 0&&await options.releaseSlot?.(unsettled)}}function parseAccountStrategy(value,field){switch(value){case void 0:case"cache-affine":case"fill-first":case"round-robin":return value;default:throw new Error(`${field} must be "cache-affine", "fill-first", or "round-robin"`)}}function orderAccounts(accounts,ranked,accountOrder,strategy="cache-affine",offset=0){switch(strategy){case"cache-affine":return applyAccountOrder(accountOrder,ranked);case"fill-first":return applyAccountOrder(accountOrder,accounts);case"round-robin":{let ordered=applyAccountOrder(accountOrder,accounts);if(ordered.length===0)return ordered;let start=offset%ordered.length;return[...ordered.slice(start),...ordered.slice(0,start)]}default:{let unsupported=strategy;throw new Error(`Unknown account strategy: ${unsupported}`)}}}function preferHeadroom(ordered,provider,limits,now,preferredAccount){let preferred=ordered.find(account=>account.name===preferredAccount),normal=preferred===void 0?ordered:[preferred,...ordered.filter(account=>account!==preferred)],nearLimit=new Set(limits.filter(limit=>limit.provider===provider&&limit.windows.some(window=>window.usedPercent>=95&&(window.resetsAt===void 0||!(Date.parse(window.resetsAt)<=now)))).map(limit=>limit.account)),withHeadroom=normal.filter(account=>!nearLimit.has(account.name));return withHeadroom.length>0?withHeadroom:normal}export{rendezvousOrder,applyAccountOrder,withoutOrderedAccount,isSlotBlocked,MAX_SLOT_BLOCK_MS,ACCOUNT_POOL_REFUSAL_NOTE,credentialFailureText,classifyCredentialFailure,CredentialFailoverError,isAvailable,attemptCandidates,noSlotsError,runCredentialFailover,parseAccountStrategy,orderAccounts,preferHeadroom};
|