@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.
Files changed (95) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/bundle/chunks/{args-H56W53X6.js → args-JWBI5LNO.js} +1 -1
  3. package/dist/bundle/chunks/{azure-openai-responses-MNN2TINI.js → azure-openai-responses-PEMLRPJ5.js} +1 -1
  4. package/dist/bundle/chunks/{chunk-HZQHA4PA.js → chunk-3RILB2OD.js} +1 -1
  5. package/dist/bundle/chunks/{chunk-Y4PFEXFN.js → chunk-5IXYN6DK.js} +1 -1
  6. package/dist/bundle/chunks/{chunk-BKDXY6EM.js → chunk-5NECOJNK.js} +1 -1
  7. package/dist/bundle/chunks/{chunk-NI2AOYP6.js → chunk-6MRUNB3Z.js} +1 -1
  8. package/dist/bundle/chunks/chunk-6QQL3SKM.js +2 -0
  9. package/dist/bundle/chunks/{chunk-I4N2OIY4.js → chunk-6QXAYNO7.js} +17 -17
  10. package/dist/bundle/chunks/{chunk-7T2LAWZ4.js → chunk-73HGQTJN.js} +1 -1
  11. package/dist/bundle/chunks/chunk-75O3CWR5.js +2 -0
  12. package/dist/bundle/chunks/{chunk-AZ27TE3H.js → chunk-7BX3JQ7F.js} +1 -1
  13. package/dist/bundle/chunks/{chunk-NDI6N4NJ.js → chunk-7CXLNKEH.js} +1 -1
  14. package/dist/bundle/chunks/{chunk-E6ZBTSC6.js → chunk-A3LGSX7Z.js} +1 -1
  15. package/dist/bundle/chunks/{chunk-7GD2EO6T.js → chunk-FYVQEZYN.js} +1 -1
  16. package/dist/bundle/chunks/{chunk-U4FAWC6C.js → chunk-GXPH7RN6.js} +1 -1
  17. package/dist/bundle/chunks/{chunk-SFACYIB6.js → chunk-IK3S2NDB.js} +1 -1
  18. package/dist/bundle/chunks/{chunk-V4VDIV3U.js → chunk-PWA75RQU.js} +1 -1
  19. package/dist/bundle/chunks/{chunk-IREUIMFE.js → chunk-PWTXZXHH.js} +1 -1
  20. package/dist/bundle/chunks/{chunk-KKB3K5CV.js → chunk-Q4RJ4WLE.js} +1 -1
  21. package/dist/bundle/chunks/chunk-QVG5SUSV.js +2 -0
  22. package/dist/bundle/chunks/chunk-RLIY3AUC.js +2 -0
  23. package/dist/bundle/chunks/{chunk-EQT4WNCW.js → chunk-TACOXP5H.js} +1 -1
  24. package/dist/bundle/chunks/{chunk-NXGSYUMV.js → chunk-TB6LIKVR.js} +2 -2
  25. package/dist/bundle/chunks/{chunk-JLCZIEBC.js → chunk-THYIV26N.js} +1 -1
  26. package/dist/bundle/chunks/{chunk-6FE42M54.js → chunk-VGHGM5PR.js} +1 -1
  27. package/dist/bundle/chunks/{chunk-CU6HUYL7.js → chunk-WAGFTIT4.js} +1 -1
  28. package/dist/bundle/chunks/{chunk-UYPH6RHY.js → chunk-Z4PN2MDA.js} +2 -2
  29. package/dist/bundle/chunks/{chunk-JJYN347Z.js → chunk-ZJUL5ODW.js} +1 -1
  30. package/dist/bundle/chunks/{cli-main-MY53RXU3.js → cli-main-MM2XCVYE.js} +1 -1
  31. package/dist/bundle/chunks/credential-accounts-RXZIUKFM.js +2 -0
  32. package/dist/bundle/chunks/github-copilot.js +1 -1
  33. package/dist/bundle/chunks/{hand-entry-AXTVMVJK.js → hand-entry-MBOPYO6I.js} +1 -1
  34. package/dist/bundle/chunks/{headless-host-SU5O2KZ2.js → headless-host-OEK6W65T.js} +1 -1
  35. package/dist/bundle/chunks/{health-write-TN7EXGLI.js → health-write-44JERGEJ.js} +1 -1
  36. package/dist/bundle/chunks/{help-fast-path-TFQ4HJNO.js → help-fast-path-JWHUCE4E.js} +1 -1
  37. package/dist/bundle/chunks/{host-command-FG56Y53E.js → host-command-O2K2WIPO.js} +1 -1
  38. package/dist/bundle/chunks/{host-session-command-UFEOW7EP.js → host-session-command-EWA6N4JJ.js} +1 -1
  39. package/dist/bundle/chunks/interactive-mode-VSZYRVYY.js +2 -0
  40. package/dist/bundle/chunks/{login-health-XBTIORM4.js → login-health-V4B6LSCP.js} +1 -1
  41. package/dist/bundle/chunks/main-VEWKRBTD.js +2 -0
  42. package/dist/bundle/chunks/{multi-session-host-Q6SHI22A.js → multi-session-host-HC6NR5N2.js} +1 -1
  43. package/dist/bundle/chunks/{openai-codex-responses-VRGOAFEG.js → openai-codex-responses-IFPWK7NG.js} +1 -1
  44. package/dist/bundle/chunks/openai-responses-2BTL5MA2.js +5 -0
  45. package/dist/bundle/chunks/{package-manager-cli-LILAWI3Q.js → package-manager-cli-OZ6DK6GI.js} +3 -3
  46. package/dist/bundle/chunks/{role-KODRTWH5.js → role-BTH5PVME.js} +1 -1
  47. package/dist/bundle/chunks/{rotation-stream-2KNROTYB.js → rotation-stream-ZGPXLY62.js} +1 -1
  48. package/dist/bundle/chunks/rpc-mode-WPF3NVBL.js +2 -0
  49. package/dist/bundle/chunks/{run-attached-tui-OEFHV5CZ.js → run-attached-tui-RVVYEINN.js} +1 -1
  50. package/dist/bundle/chunks/{schedule-command-VO4RP2KX.js → schedule-command-6TAAG2KU.js} +1 -1
  51. package/dist/bundle/chunks/{session-control-endpoint-CCVRJHSC.js → session-control-endpoint-3FNVOKKT.js} +1 -1
  52. package/dist/bundle/chunks/{session-picker-VN5I2ZDI.js → session-picker-YDXDCBRL.js} +1 -1
  53. package/dist/bundle/chunks/session-slot-N4E4OSCX.js +2 -0
  54. package/dist/bundle/chunks/session-worker.js +22 -21
  55. package/dist/bundle/chunks/{state-store-7RVODZJU.js → state-store-I6MUHET3.js} +1 -1
  56. package/dist/bundle/cli.js +2 -2
  57. package/dist/bundle/index.js +1 -1
  58. package/dist/bundle/rpc-entry.js +1 -1
  59. package/dist/bundle/runtime-manifest.json +1 -1
  60. package/dist/core/agent-session.d.ts +5 -3
  61. package/dist/core/agent-session.js +16 -6
  62. package/dist/core/credential-accounts.d.ts +5 -3
  63. package/dist/core/credential-accounts.js +8 -6
  64. package/dist/core/credential-pool/classify.js +5 -1
  65. package/dist/core/extensions/builtin/anthropic-subscription/content-blocks.d.ts +6 -0
  66. package/dist/core/extensions/builtin/anthropic-subscription/content-blocks.js +14 -0
  67. package/dist/core/extensions/builtin/anthropic-subscription/prompt-bridge.js +3 -1
  68. package/dist/core/extensions/builtin/anthropic-subscription/session-sync.js +4 -1
  69. package/dist/core/extensions/builtin/permission-system/index.js +5 -1
  70. package/dist/core/reasoning-baseline.d.ts +8 -1
  71. package/dist/core/reasoning-baseline.js +24 -0
  72. package/dist/modes/rpc/connection-handler.js +4 -0
  73. package/dist/modes/rpc/method-classes-schema-session.d.ts +3 -0
  74. package/dist/modes/rpc/method-classes-schema-session.js +6 -2
  75. package/dist/modes/rpc/method-classes-schema.d.ts +3 -0
  76. package/dist/modes/rpc/project-expected-cwd.d.ts +29 -0
  77. package/dist/modes/rpc/project-expected-cwd.js +45 -0
  78. package/dist/modes/rpc/rpc-error-types.d.ts +7 -1
  79. package/dist/modes/rpc/rpc-error-types.js +6 -0
  80. package/dist/modes/rpc/rpc-session-command-types.d.ts +3 -0
  81. package/dist/package-manager-cli.d.ts +14 -0
  82. package/dist/package-manager-cli.js +20 -4
  83. package/dist/utils/version-check.d.ts +10 -7
  84. package/dist/utils/version-check.js +24 -5
  85. package/docs/rpc.md +20 -7
  86. package/package.json +7 -7
  87. package/dist/bundle/chunks/chunk-GLTOBXZY.js +0 -2
  88. package/dist/bundle/chunks/chunk-PBUV2Z3R.js +0 -2
  89. package/dist/bundle/chunks/chunk-WRBOKYPS.js +0 -2
  90. package/dist/bundle/chunks/credential-accounts-ZB5IXHIG.js +0 -2
  91. package/dist/bundle/chunks/interactive-mode-PHES47E3.js +0 -2
  92. package/dist/bundle/chunks/main-PR4FI6HQ.js +0 -2
  93. package/dist/bundle/chunks/openai-responses-I7PXRWCM.js +0 -4
  94. package/dist/bundle/chunks/rpc-mode-CGVK4SSA.js +0 -2
  95. 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{COMPACT_LEAF_CODE_UNITS,CatalogNodeWriter,CompactComponentRoots,CompactContentStore,CompactReadError,CompactReadLease,CompactSelection,CompactValues,CompactWriteError,DEFAULT_TRANSCRIPT_ANCESTRY_BYTES,EVENT_RESYNC_CAPABILITY,ExtensionTransportOwner,FRAGMENT_MAX_BYTES,McpPresenterAuthority,SECRET_INPUT_FEATURE,SEQUENCED,SocketPeerRecovery,StagedReadError,TransferStaging,TransferStagingError,answerSealedFrame,applyContextPatch,assertRange,attachMcpGrantPresentation,baseRef,catalogDigest,catalogDigester,catalogRootRef,checkSealedAnswer,childRef,createAuthority,declarationReply,decodeCatalogNode,effectStatusRecord,features,isCorrelatedReply,maskOfRoles,nextIncarnation,observeLifecycleDelivery,openFrozenBytes,parseBoundedId,parseContentDigest,parseContentRef,parseDeclaration,parsePageRef,privateRootStat,producePage,protocolId,publishedSessionContext,readAuthority,readRootMarker,refSteps,remoteOriginField,rolesOfMask,rootOwnerState,samePrincipal,secretBinding,secretRequestHash,secretRequestTranscript,sessionQuestionBridges,startAtOrBefore,storeNarrowed,storeRetired,storedBytes,unvouchedCall,withReceipt}from"./chunk-KKB3K5CV.js";import{RPC_ERROR_INVALID_SESSION_CONTEXT,RPC_ERROR_INVALID_SUBSCRIPTION,RPC_ERROR_RESPONSE_UNWRITABLE,RPC_ERROR_SESSION_NOT_ATTACHED,RPC_ERROR_SUBSCRIPTION_LIMIT,RPC_ERROR_UNKNOWN_SUBSCRIPTION,RPC_ERROR_UNSUPPORTED_TRANSPORT}from"./chunk-WRBOKYPS.js";import{carriesMedia,normalizeJsonValue,omitNormalInlineMedia}from"./chunk-XI6THO4F.js";import{BaseContentHash,compactUpdatesEnabled,fingerprintLine,parseSessionEntryLine}from"./chunk-WMDJMN5W.js";import{bindPrivateMcpForms,isRecord}from"./chunk-MOVB6H22.js";import{COMPACT_EVENTS_CAPABILITY,MEDIA_PLACEHOLDERS_CAPABILITY,RAISER_NOTICE_CAPABILITY,RPC_METHOD_CLASS,RPC_METHOD_CLASSES_DIGEST,RPC_METHOD_CLASSES_VERSION,classifyRpcMethod,hostGeneration,hostInstanceId}from"./chunk-IJXKHJYR.js";import{PRESENTER_EXCHANGE_MS,PRESENTER_PARKING_MS}from"./chunk-7WYJAYHH.js";import{RPC_LAUNCH_PROOF_RECORD}from"./chunk-VUY4BZDI.js";import{LegacyRecordDepthError,attachJsonlLineReader,isStackOverflow,serializeJsonLine}from"./chunk-SF4MQDKZ.js";import{external_exports}from"./chunk-36BLGKRO.js";import{randomUUID}from"node:crypto";import{tmpdir}from"node:os";import{join}from"node:path";var SKIPPED=new Set(["undefined","function","symbol"]),isRecord2=value=>typeof value=="object"&&value!==null&&!Array.isArray(value);function jsonSize(value){let bytes=0,units=0;for(let piece of walk(value))bytes+=Buffer.byteLength(piece),units+=piece.length;return{bytes,units}}function*jsonChunks(value,size){let pending="";for(let piece of walk(value))for(pending+=piece;pending.length>=size;)yield pending.slice(0,size),pending=pending.slice(size);pending.length>0&&(yield pending)}function*walk(value){let stack=[],pending={value};for(;;){if(pending){let current=pending.value;if(pending=void 0,Array.isArray(current))yield"[",stack.push({entries:current,array:!0,index:0});else if(isRecord2(current)){yield"{";let members=Object.entries(current).filter(([,child])=>!SKIPPED.has(typeof child));stack.push({entries:members,array:!1,index:0})}else yield JSON.stringify(current)??"null"}let frame=stack.at(-1);if(!frame)return;if(frame.index===frame.entries.length){stack.pop(),yield frame.array?"]":"}";continue}frame.index>0&&(yield",");let entry=frame.entries[frame.index++];if(frame.array)pending={value:entry};else{let[key,child]=entry;yield`${JSON.stringify(key)}:`,pending={value:child}}}}function stageRecord(staging,record,content){let kind=protocolId("event"),id=protocolId("record");if(typeof content=="string")return staging.stage(kind,id,content.slice(0,-1));let chunks2="chunks"in content?content.chunks:()=>jsonChunks(record,FRAGMENT_MAX_BYTES/2),units="units"in content?content.units:0;if("chunks"in content)for(let chunk of chunks2())units+=chunk.length;let transfer=staging.begin(kind,id,units*2);try{for(let chunk of chunks2())transfer.append(chunk);return transfer.commit()}catch(cause){throw transfer.abort(),cause}}function assertNever(value){throw new Error(`unexpected recovery failure: ${JSON.stringify(value)}`)}function refusalReason(failure){switch(failure.kind){case"storage_unavailable":return failure.kind;case"repair_needed":return failure.reason;default:return assertNever(failure)}}var recovered=value=>({ok:!0,value}),repairNeeded=reason=>({kind:"repair_needed",reason}),storageUnavailable=reason=>({kind:"storage_unavailable",reason}),RecoveryRefusedError=class extends Error{constructor(failure){super(`recovery refused (${failure.kind}: ${failure.reason})`),this.name="RecoveryRefusedError",this.failure=failure}};var COMPACT_RECORD_MAX_BYTES=2*FRAGMENT_MAX_BYTES,PEER_EVENT_LEASES_MAX=32,RELEASED_LEASES_REMEMBERED=256,EVENT_RECORD_COMPONENT="record",EventLeases=class{constructor(peerLimit=PEER_EVENT_LEASES_MAX){this.peers=new Map,this.shared=new WeakMap,this.ended=new Set,this.refusals=new Map,this.open=0,this.minted=0,this.released=0,this.duplicates=0,this.abandoned=0,this.contentBytes=0,this.peerLimit=peerLimit}onLeaseEnd(listener){this.ended.add(listener)}mint(caller,at,record,content){let peer=this.peers.get(caller.socketEpoch)??{held:new Map,released:new Map};if(peer.held.size>=this.peerLimit)return this.refuse("lease_limit");let shared=this.stage(record,content);if(!shared)return this.refuse("storage_unavailable");let{entry}=shared.content.ref,lease=Object.freeze({kind:"event",id:protocolId(`event:${caller.socketEpoch}:${++this.minted}`),admissionId:caller.admissionId,...at,componentRef:EVENT_RECORD_COMPONENT,length:entry.length,digest:entry.digest});shared.holders+=1;let held={lease,sessionId:caller.sessionId,shared,admissions:new Set([caller.admissionId]),reads:new CompactReadLease(()=>this.dispose(peer,held))};return peer.held.set(lease.id,held),this.peers.set(caller.socketEpoch,peer),this.open+=1,{ok:!0,value:lease}}claim(caller,leaseId,admissionId){let held=this.peers.get(caller.socketEpoch)?.held.get(leaseId);return!held||held.sessionId!==caller.sessionId||!held.admissions.has(admissionId)?{ok:!1,failure:repairNeeded("unknown_token")}:recovered(held)}async page(held,componentRef,offset,signal){let staging=this.staging;if(componentRef!==EVENT_RECORD_COMPONENT||!staging)return{ok:!1,failure:storageUnavailable("range")};try{return staging.store.health.needsRecovery&&await staging.store.repair(),recovered(await held.reads.run(async()=>{held.shared.opened??=staging.open(held.shared.content);let bytes=await held.shared.opened;if(signal?.aborted)throw new CompactReadError("aborted");return producePage(bytes,offset,()=>held.reads.assert())}))}catch(cause){if(held.shared.opened=void 0,cause instanceof StagedReadError)return{ok:!1,failure:storageUnavailable("integrity")};if(!(cause instanceof CompactReadError))throw cause;return{ok:!1,failure:cause.reason==="released"?repairNeeded("released"):storageUnavailable(cause.reason)}}}release(caller,leaseId,admissionId){let peer=this.peers.get(caller.socketEpoch),receipt=(outcome,remaining)=>recovered({lease:{kind:"event",id:leaseId},outcome,remaining});if(!peer)return{ok:!1,failure:repairNeeded("unknown_token")};let held=peer.held.get(leaseId);if(held?.sessionId===caller.sessionId&&held.admissions.delete(admissionId))return this.remember(peer,held,admissionId),held.admissions.size>0?receipt("held",held.admissions.size):(this.released+=1,held.reads.release(),receipt("released",0));let done=peer.released.get(leaseId);return done?.sessionId===caller.sessionId&&done.admissions.has(admissionId)?(this.duplicates+=1,receipt("duplicate",held?.admissions.size??0)):{ok:!1,failure:repairNeeded("unknown_token")}}abandon(socketEpoch,leaseId){let held=this.peers.get(socketEpoch)?.held.get(leaseId);!held||!held.reads.release()||(this.abandoned+=1)}forgetAdmission(caller,admissionId){for(let held of this.peers.get(caller.socketEpoch)?.held.values()??[])held.sessionId!==caller.sessionId||!held.admissions.delete(admissionId)||held.admissions.size===0&&this.abandon(caller.socketEpoch,held.lease.id)}forgetPeer(socketEpoch){let peer=this.peers.get(socketEpoch);this.peers.delete(socketEpoch);for(let held of peer?.held.values()??[])held.reads.release()}status(){return{open:this.open,peers:this.peers.size,minted:this.minted,released:this.released,duplicates:this.duplicates,abandoned:this.abandoned,contentBytes:this.contentBytes,refused:Object.fromEntries(this.refusals)}}stage(record,content){let existing=this.shared.get(record);if(existing&&existing.holders>0)return existing;this.staging??=new TransferStaging(new CompactContentStore({dir:join(tmpdir(),`senpi-event-leases-${randomUUID()}`)}));try{let staged=stageRecord(this.staging,record,content);this.staging.adopt(staged);let shared={content:staged,holders:0};return this.contentBytes+=staged.ref.entry.length,this.shared.set(record,shared),shared}catch(cause){if(cause instanceof TransferStagingError||cause instanceof CompactWriteError||cause instanceof CompactReadError){process.stderr.write(`senpi rpc event lease: record not staged (${cause.message})
2
+ import{COMPACT_LEAF_CODE_UNITS,CatalogNodeWriter,CompactComponentRoots,CompactContentStore,CompactReadError,CompactReadLease,CompactSelection,CompactValues,CompactWriteError,DEFAULT_TRANSCRIPT_ANCESTRY_BYTES,EVENT_RESYNC_CAPABILITY,ExtensionTransportOwner,FRAGMENT_MAX_BYTES,McpPresenterAuthority,SECRET_INPUT_FEATURE,SEQUENCED,SocketPeerRecovery,StagedReadError,TransferStaging,TransferStagingError,answerSealedFrame,applyContextPatch,assertRange,attachMcpGrantPresentation,baseRef,catalogDigest,catalogDigester,catalogRootRef,checkSealedAnswer,childRef,createAuthority,declarationReply,decodeCatalogNode,effectStatusRecord,features,isCorrelatedReply,maskOfRoles,nextIncarnation,observeLifecycleDelivery,openFrozenBytes,parseBoundedId,parseContentDigest,parseContentRef,parseDeclaration,parsePageRef,privateRootStat,producePage,protocolId,publishedSessionContext,readAuthority,readRootMarker,refSteps,remoteOriginField,rolesOfMask,rootOwnerState,samePrincipal,secretBinding,secretRequestHash,secretRequestTranscript,sessionQuestionBridges,startAtOrBefore,storeNarrowed,storeRetired,storedBytes,unvouchedCall,withReceipt}from"./chunk-Q4RJ4WLE.js";import{RPC_ERROR_INVALID_SESSION_CONTEXT,RPC_ERROR_INVALID_SUBSCRIPTION,RPC_ERROR_RESPONSE_UNWRITABLE,RPC_ERROR_SESSION_NOT_ATTACHED,RPC_ERROR_SUBSCRIPTION_LIMIT,RPC_ERROR_UNKNOWN_SUBSCRIPTION,RPC_ERROR_UNSUPPORTED_TRANSPORT}from"./chunk-75O3CWR5.js";import{carriesMedia,normalizeJsonValue,omitNormalInlineMedia}from"./chunk-XI6THO4F.js";import{BaseContentHash,compactUpdatesEnabled,fingerprintLine,parseSessionEntryLine}from"./chunk-WMDJMN5W.js";import{bindPrivateMcpForms,isRecord}from"./chunk-MOVB6H22.js";import{COMPACT_EVENTS_CAPABILITY,MEDIA_PLACEHOLDERS_CAPABILITY,RAISER_NOTICE_CAPABILITY,RPC_METHOD_CLASS,RPC_METHOD_CLASSES_DIGEST,RPC_METHOD_CLASSES_VERSION,classifyRpcMethod,hostGeneration,hostInstanceId}from"./chunk-IJXKHJYR.js";import{PRESENTER_EXCHANGE_MS,PRESENTER_PARKING_MS}from"./chunk-7WYJAYHH.js";import{RPC_LAUNCH_PROOF_RECORD}from"./chunk-VUY4BZDI.js";import{LegacyRecordDepthError,attachJsonlLineReader,isStackOverflow,serializeJsonLine}from"./chunk-SF4MQDKZ.js";import{external_exports}from"./chunk-36BLGKRO.js";import{randomUUID}from"node:crypto";import{tmpdir}from"node:os";import{join}from"node:path";var SKIPPED=new Set(["undefined","function","symbol"]),isRecord2=value=>typeof value=="object"&&value!==null&&!Array.isArray(value);function jsonSize(value){let bytes=0,units=0;for(let piece of walk(value))bytes+=Buffer.byteLength(piece),units+=piece.length;return{bytes,units}}function*jsonChunks(value,size){let pending="";for(let piece of walk(value))for(pending+=piece;pending.length>=size;)yield pending.slice(0,size),pending=pending.slice(size);pending.length>0&&(yield pending)}function*walk(value){let stack=[],pending={value};for(;;){if(pending){let current=pending.value;if(pending=void 0,Array.isArray(current))yield"[",stack.push({entries:current,array:!0,index:0});else if(isRecord2(current)){yield"{";let members=Object.entries(current).filter(([,child])=>!SKIPPED.has(typeof child));stack.push({entries:members,array:!1,index:0})}else yield JSON.stringify(current)??"null"}let frame=stack.at(-1);if(!frame)return;if(frame.index===frame.entries.length){stack.pop(),yield frame.array?"]":"}";continue}frame.index>0&&(yield",");let entry=frame.entries[frame.index++];if(frame.array)pending={value:entry};else{let[key,child]=entry;yield`${JSON.stringify(key)}:`,pending={value:child}}}}function stageRecord(staging,record,content){let kind=protocolId("event"),id=protocolId("record");if(typeof content=="string")return staging.stage(kind,id,content.slice(0,-1));let chunks2="chunks"in content?content.chunks:()=>jsonChunks(record,FRAGMENT_MAX_BYTES/2),units="units"in content?content.units:0;if("chunks"in content)for(let chunk of chunks2())units+=chunk.length;let transfer=staging.begin(kind,id,units*2);try{for(let chunk of chunks2())transfer.append(chunk);return transfer.commit()}catch(cause){throw transfer.abort(),cause}}function assertNever(value){throw new Error(`unexpected recovery failure: ${JSON.stringify(value)}`)}function refusalReason(failure){switch(failure.kind){case"storage_unavailable":return failure.kind;case"repair_needed":return failure.reason;default:return assertNever(failure)}}var recovered=value=>({ok:!0,value}),repairNeeded=reason=>({kind:"repair_needed",reason}),storageUnavailable=reason=>({kind:"storage_unavailable",reason}),RecoveryRefusedError=class extends Error{constructor(failure){super(`recovery refused (${failure.kind}: ${failure.reason})`),this.name="RecoveryRefusedError",this.failure=failure}};var COMPACT_RECORD_MAX_BYTES=2*FRAGMENT_MAX_BYTES,PEER_EVENT_LEASES_MAX=32,RELEASED_LEASES_REMEMBERED=256,EVENT_RECORD_COMPONENT="record",EventLeases=class{constructor(peerLimit=PEER_EVENT_LEASES_MAX){this.peers=new Map,this.shared=new WeakMap,this.ended=new Set,this.refusals=new Map,this.open=0,this.minted=0,this.released=0,this.duplicates=0,this.abandoned=0,this.contentBytes=0,this.peerLimit=peerLimit}onLeaseEnd(listener){this.ended.add(listener)}mint(caller,at,record,content){let peer=this.peers.get(caller.socketEpoch)??{held:new Map,released:new Map};if(peer.held.size>=this.peerLimit)return this.refuse("lease_limit");let shared=this.stage(record,content);if(!shared)return this.refuse("storage_unavailable");let{entry}=shared.content.ref,lease=Object.freeze({kind:"event",id:protocolId(`event:${caller.socketEpoch}:${++this.minted}`),admissionId:caller.admissionId,...at,componentRef:EVENT_RECORD_COMPONENT,length:entry.length,digest:entry.digest});shared.holders+=1;let held={lease,sessionId:caller.sessionId,shared,admissions:new Set([caller.admissionId]),reads:new CompactReadLease(()=>this.dispose(peer,held))};return peer.held.set(lease.id,held),this.peers.set(caller.socketEpoch,peer),this.open+=1,{ok:!0,value:lease}}claim(caller,leaseId,admissionId){let held=this.peers.get(caller.socketEpoch)?.held.get(leaseId);return!held||held.sessionId!==caller.sessionId||!held.admissions.has(admissionId)?{ok:!1,failure:repairNeeded("unknown_token")}:recovered(held)}async page(held,componentRef,offset,signal){let staging=this.staging;if(componentRef!==EVENT_RECORD_COMPONENT||!staging)return{ok:!1,failure:storageUnavailable("range")};try{return staging.store.health.needsRecovery&&await staging.store.repair(),recovered(await held.reads.run(async()=>{held.shared.opened??=staging.open(held.shared.content);let bytes=await held.shared.opened;if(signal?.aborted)throw new CompactReadError("aborted");return producePage(bytes,offset,()=>held.reads.assert())}))}catch(cause){if(held.shared.opened=void 0,cause instanceof StagedReadError)return{ok:!1,failure:storageUnavailable("integrity")};if(!(cause instanceof CompactReadError))throw cause;return{ok:!1,failure:cause.reason==="released"?repairNeeded("released"):storageUnavailable(cause.reason)}}}release(caller,leaseId,admissionId){let peer=this.peers.get(caller.socketEpoch),receipt=(outcome,remaining)=>recovered({lease:{kind:"event",id:leaseId},outcome,remaining});if(!peer)return{ok:!1,failure:repairNeeded("unknown_token")};let held=peer.held.get(leaseId);if(held?.sessionId===caller.sessionId&&held.admissions.delete(admissionId))return this.remember(peer,held,admissionId),held.admissions.size>0?receipt("held",held.admissions.size):(this.released+=1,held.reads.release(),receipt("released",0));let done=peer.released.get(leaseId);return done?.sessionId===caller.sessionId&&done.admissions.has(admissionId)?(this.duplicates+=1,receipt("duplicate",held?.admissions.size??0)):{ok:!1,failure:repairNeeded("unknown_token")}}abandon(socketEpoch,leaseId){let held=this.peers.get(socketEpoch)?.held.get(leaseId);!held||!held.reads.release()||(this.abandoned+=1)}forgetAdmission(caller,admissionId){for(let held of this.peers.get(caller.socketEpoch)?.held.values()??[])held.sessionId!==caller.sessionId||!held.admissions.delete(admissionId)||held.admissions.size===0&&this.abandon(caller.socketEpoch,held.lease.id)}forgetPeer(socketEpoch){let peer=this.peers.get(socketEpoch);this.peers.delete(socketEpoch);for(let held of peer?.held.values()??[])held.reads.release()}status(){return{open:this.open,peers:this.peers.size,minted:this.minted,released:this.released,duplicates:this.duplicates,abandoned:this.abandoned,contentBytes:this.contentBytes,refused:Object.fromEntries(this.refusals)}}stage(record,content){let existing=this.shared.get(record);if(existing&&existing.holders>0)return existing;this.staging??=new TransferStaging(new CompactContentStore({dir:join(tmpdir(),`senpi-event-leases-${randomUUID()}`)}));try{let staged=stageRecord(this.staging,record,content);this.staging.adopt(staged);let shared={content:staged,holders:0};return this.contentBytes+=staged.ref.entry.length,this.shared.set(record,shared),shared}catch(cause){if(cause instanceof TransferStagingError||cause instanceof CompactWriteError||cause instanceof CompactReadError){process.stderr.write(`senpi rpc event lease: record not staged (${cause.message})
3
3
  `);return}throw cause}}remember(peer,held,admissionId){let admissions=new Set([...peer.released.get(held.lease.id)?.admissions??[],admissionId]);peer.released.set(held.lease.id,{sessionId:held.sessionId,admissions});for(let oldest of peer.released.keys()){if(peer.released.size<=RELEASED_LEASES_REMEMBERED)break;peer.released.delete(oldest)}}dispose(peer,held){peer.held.delete(held.lease.id),this.open-=1,held.shared.holders-=1,held.shared.holders===0&&this.staging&&(this.staging.release(held.shared.content),this.contentBytes-=held.shared.content.ref.entry.length);for(let listener of this.ended)listener(held.lease.id)}refuse(reason){return this.refusals.set(reason,(this.refusals.get(reason)??0)+1),{ok:!1,reason}}};var MESSAGE_KEY="message",COMPACT_DELTA_TYPES=new Set(["text_delta","thinking_delta","toolcall_delta"]);function compactDelta(value){if(value.type!=="message_update"||!Object.hasOwn(value,"message"))return;let event=value.assistantMessageEvent;if(typeof event!="object"||event===null)return;let{type,contentIndex,delta}=event;if(!(typeof type!="string"||!COMPACT_DELTA_TYPES.has(type)||typeof contentIndex!="number"||typeof delta!="string"))return{type,contentIndex,delta}}function demoteToDeltaOnly(value){let event=value.assistantMessageEvent;return{...value,message:null,assistantMessageEvent:{...event,partial:null}}}function toolUpdateKey(value){return value.type==="tool_execution_update"&&typeof value.toolCallId=="string"?`tool:${value.toolCallId}`:void 0}import{AsyncLocalStorage}from"node:async_hooks";var requests=new AsyncLocalStorage;function captureAdmissionReply(){let scope=requests.getStore();return scope&&{id:scope.command.id,admissionId:scope.command.admissionId,peer:scope.peer}}function withAdmissionReply(scope,action){return scope===void 0?action():requests.run({command:scope,peer:scope.peer},action)}function withAdmissionRequest(command,peer,action){return compactUpdatesEnabled()?requests.run({command,peer},action):action()}function replyAdmission(id,peer,routes){let request=requests.getStore();if(!request||request.command.id!==id||request.peer!==peer)return null;let admissionId=request.command.admissionId;return admissionId===void 0?void 0:routes.find(route=>route===admissionId)??null}var BaselineBarrier=class{constructor(cursor,live){this.cancelled=!1,this.ended=!1,this.cursor=cursor,this.live=live}get active(){return!this.cancelled&&!this.ended&&this.live()}cancel(){this.cancelled=!0,this.end()}end(){this.ended||(this.ended=!0,this.cursor.release())}async deliver(write,head){try{if(!this.active)return;let line=await this.cursor.next();for(head!==void 0&&this.active&&await write(head);line!==void 0&&this.active;)await write(line),line=await this.cursor.next()}finally{this.end()}}};var blockedMsTotal=0;function recordLoopBlockedMs(driftMs){driftMs>0&&(blockedMsTotal+=driftMs)}function loopBlockedMark(){return blockedMsTotal}function loopBlockedMsSince(mark){return blockedMsTotal-mark}var SocketEventQueueStallError=class extends Error{constructor(pendingBytes,stallMs){super(`socket event queue stalled: peer did not drain ${pendingBytes} queued bytes within ${stallMs}ms`),this.name="SocketEventQueueStallError",this.pendingBytes=pendingBytes,this.stallMs=stallMs}},SocketEventQueueOverflowError=class extends Error{constructor(queuedBytes,incomingBytes,maxQueueBytes,incomingPreview){super(`socket event queue overflow: ${queuedBytes} queued + ${incomingBytes} incoming > ${maxQueueBytes} (incoming: ${incomingPreview})`),this.name="SocketEventQueueOverflowError",this.queuedBytes=queuedBytes,this.incomingBytes=incomingBytes,this.maxQueueBytes=maxQueueBytes,this.incomingPreview=incomingPreview}};function waitForDrainOrStall(peer,writtenBytes){return new Promise((resolve2,reject)=>{let timer,blockedMark=loopBlockedMark(),cleanup=()=>{clearTimeout(timer),peer.stopped.removeEventListener("abort",onStop)},onStop=()=>{cleanup(),resolve2()},onDeadline=()=>{let blockedMs=loopBlockedMsSince(blockedMark);if(blockedMs>0){blockedMark=loopBlockedMark(),timer=setTimeout(onDeadline,Math.min(blockedMs,peer.stallMs));return}try{if(peer.shedAndPing()){blockedMark=loopBlockedMark(),timer=setTimeout(onDeadline,peer.stallMs);return}}catch(cause){cleanup(),reject(cause);return}let stall=new SocketEventQueueStallError(peer.queuedBytes()+writtenBytes,peer.stallMs);try{peer.sink.writeRaw(`${JSON.stringify({type:"overflow",error:"stalled, resync required"})}
4
4
  `)}catch{}cleanup(),reject(stall)};timer=setTimeout(onDeadline,peer.stallMs),peer.stopped.addEventListener("abort",onStop,{once:!0}),peer.sink.waitForBackpressure().then(()=>{cleanup(),resolve2()},cause=>{cleanup(),reject(cause)})})}var isBarrier=item=>"kind"in item,SocketEventQueue=class{constructor(){this.items=[],this.charged=0}get bytes(){return this.charged}get length(){return this.items.length}push(item){this.items.push(item),isBarrier(item)||(this.charged+=item.bytes)}shift(){let item=this.items.shift();return item!==void 0&&!isBarrier(item)&&(this.charged-=item.bytes),item}insertBefore(before,entry){let at=this.items.indexOf(before);at<0?this.items.push(entry):this.items.splice(at,0,entry),this.charged+=entry.bytes}supersede(key){let existing=this.items.find(item=>!isBarrier(item)&&item.key===key);existing===void 0||isBarrier(existing)||(existing.demotedLine!==void 0&&(this.charged-=existing.bytes,existing.line=existing.demotedLine,existing.bytes=Buffer.byteLength(existing.line),this.charged+=existing.bytes,existing.demotedLine=void 0,existing.onWritten?.(!1),existing.onWritten=void 0),existing.key=void 0)}retain(keep){let kept=[];for(let item of this.items)keep(item)?kept.push(item):isBarrier(item)?item.barrier.cancel():item.onWritten?.(!1);this.items=kept,this.charged=kept.reduce((bytes,item)=>isBarrier(item)?bytes:bytes+item.bytes,0)}clear(){for(let item of this.items)isBarrier(item)&&item.barrier.cancel();this.items.length=0,this.charged=0}};var SocketPeerShed=class{constructor(queue,mode){this.queue=queue,this.mode=mode}get isPending(){return this.pending!==void 0}get dropsRecords(){return this.pending!==void 0&&(this.mode==="drop"||this.pending.stale)}cut(reason,snapshot,live){this.queue.retain(item=>!isBarrier(item)&&item.reply);let cut=snapshot(reason);this.pending={kind:"recovery",reason,sessions:cut.sessions,barrier:new BaselineBarrier(cut,live),stale:!1},this.queue.push(this.pending)}supersede(){if(!this.pending||this.pending.stale)return;let recovery=this.pending;this.queue.retain(item=>isBarrier(item)?item===recovery:item.reply),recovery.barrier.cancel(),recovery.stale=!0}admitReply(entry){this.pending&&this.mode==="drop"?this.queue.insertBefore(this.pending,entry):this.queue.push(entry)}take(entry,snapshot,live){return entry.stale&&snapshot&&(entry.barrier=new BaselineBarrier(snapshot(entry.reason,entry.sessions),live)),this.pending===entry&&(this.pending=void 0),entry.barrier}clear(){this.pending=void 0}};var DEFAULT_QUEUE_BYTES=64*1024*1024,DEFAULT_STALL_MS=3e4,SocketEventSinkActor=class{constructor(sink,onFailure,maxQueueBytes=DEFAULT_QUEUE_BYTES,stallMs=DEFAULT_STALL_MS,shedMode="drop"){this.queue=new SocketEventQueue,this.closed=!1,this.recoveryEnabled=!1,this.frameBytes=0,this.stopped=new AbortController,this.sink=sink,this.onFailure=onFailure,this.maxQueueBytes=maxQueueBytes,this.shed=new SocketPeerShed(this.queue,shedMode),this.stallPeer={sink,stallMs,stopped:this.stopped.signal,queuedBytes:()=>this.queue.bytes,shedAndPing:()=>!this.recovery||!this.recoveryEnabled?!1:(this.cutOnce("stall"),this.recovery.ping(),!0)}}enableRecovery(snapshot){this.recoveryEnabled=!0,this.snapshot=snapshot,this.recovery??=new SocketPeerRecovery(line=>this.sink.writeRaw(line)),this.recovery.acknowledge()}disableRecovery(){this.recoveryEnabled=!1,this.recovery?.pending||(this.recovery=void 0)}installBaseline(cursor,live){if(this.closed||cursor.empty||this.shed.dropsRecords){cursor.release();return}this.queue.push({kind:"attach",barrier:new BaselineBarrier(cursor,live)}),this.drain()}enqueue(line,key,onWritten,demotedLine,reply=!1,held,current){if(this.closed)return;let bytes=Buffer.byteLength(line);if(this.shed.dropsRecords){reply?this.admitReply({line,bytes,onWritten,reply,current}):onWritten?.(!1);return}if(key!==void 0&&this.queue.supersede(key),!this.fits(bytes)){if(this.recovery&&this.recoveryEnabled){this.shed.isPending?this.shed.supersede():this.cut("overflow"),reply?this.admitReply({line,bytes,onWritten,reply,current}):onWritten?.(!1),this.drain();return}this.failOverflow(bytes,line);return}this.queue.push({line,bytes,key,demotedLine,onWritten,reply,held:this.shed.isPending?held:void 0,current}),this.drain()}async flush(){for(;this.draining;)await this.draining;if(this.failure!==void 0)throw this.failure}waitForAcceptance(){return Promise.resolve()}close(){this.closed=!0,this.dropQueue(),this.stopped.abort()}fits(bytes){return this.queue.bytes+this.frameBytes+bytes<=this.maxQueueBytes}admitReply(entry){if(!this.fits(entry.bytes)){this.recovery?.loseReply(),entry.onWritten?.(!1);return}this.shed.admitReply(entry),this.drain()}failOverflow(bytes,line){let overflow=new SocketEventQueueOverflowError(this.queue.bytes+this.frameBytes,bytes,this.maxQueueBytes,line.slice(0,120));this.closed=!0,this.dropQueue();try{this.sink.writeRaw(`${JSON.stringify({type:"overflow",error:"overflow, resync required"})}
5
5
  `)}catch(cause){this.onFailure(cause)}this.onFailure(overflow)}dropQueue(){this.queue.clear(),this.attempt?.cancel(),this.shed.clear()}cutOnce(reason){this.recovery?.pending||this.cut(reason)}cut(reason){!this.recovery||!this.snapshot||(this.attempt?.cancel(),this.recovery.shed(reason),this.shed.cut(reason,this.snapshot,()=>!this.closed))}async write(line){this.sink.writeRaw(line),await waitForDrainOrStall(this.stallPeer,Buffer.byteLength(line))}async writeFrame(line){let bytes=Buffer.byteLength(line);if(!this.fits(bytes)){this.recovery&&this.recoveryEnabled?this.cutOnce("overflow"):this.failOverflow(bytes,line);return}this.frameBytes=bytes;try{await this.write(line)}finally{this.frameBytes=0}}async deliver(entry){if(entry.kind==="attach"){await this.stream(entry.barrier,line=>this.writeFrame(line));return}if(await waitForDrainOrStall(this.stallPeer,0),this.closed||!this.recovery)return;let barrier=this.shed.take(entry,this.snapshot,()=>!this.closed),gap=this.recovery.takeGap();this.recoveryEnabled||(this.recovery=void 0),await this.stream(barrier,line=>this.write(line),gap)}async stream(barrier,write,head){this.attempt=barrier;try{await barrier.deliver(write,head)}finally{barrier.end(),this.attempt===barrier&&(this.attempt=void 0)}}drain(){return this.draining?this.draining:(this.draining=(async()=>{try{for(;!this.closed&&this.queue.length>0;){let item=this.queue.shift();if(item===void 0)break;if(isBarrier(item)){try{await this.deliver(item)}finally{item.barrier.end()}continue}let written=(item.held?.()??!0)&&(item.current?.()??!0);written&&await this.write(item.line),item.onWritten?.(written)}}catch(cause){this.failure=cause,this.closed=!0,this.dropQueue(),this.onFailure(cause)}})().finally(()=>{this.draining=void 0,!this.closed&&this.queue.length>0&&this.drain()}),this.draining)}};var AdmissionRoutingActor=class extends SocketEventSinkActor{constructor(){super(...arguments),this.admissions=new Set,this.subscriptions=new Map,this.mirrorOwners=new Map,this.pendingMirrors=new Map,this.opened=new Map,this.retireAfterReply=new Map,this.terminal=new Map}close(){this.subscriptions.clear(),this.mirrorOwners.clear();for(let pending of this.pendingMirrors.values())pending.retire();this.pendingMirrors.clear(),this.admissions.clear(),this.opened.clear(),this.retireAfterReply.clear(),this.terminal.clear(),super.close()}remember(sessionId,checkpoints,socketEpoch){let stream=checkpoints.stream({socketEpoch,sessionId}),remembered=stream??this.terminal.get(sessionId),routes=remembered?.routes.filter(id=>this.admissions.has(id)||[...this.mirrorOwners.values()].includes(id))??[];return stream&&routes.length>0&&this.terminal.set(sessionId,{...stream,routes}),remembered?{...remembered,routes}:void 0}route(line,checkpoints,socketEpoch){if(this.admissions.size===0&&this.subscriptions.size===0&&this.mirrorOwners.size===0)return[line];let record=JSON.parse(line);if(typeof record.sessionId!="string"||record.admissionId!==void 0)return[line];if(typeof record.subscriptionId=="string"){let subscription=this.subscriptions.get(record.subscriptionId);return subscription===void 0?[line]:[serializeJsonLine({...record,admissionId:subscription,generation:0})]}let mirrors=record.type==="response"?[]:this.mirrorAdmissions?.(record.sessionId,String(record.type))??[],stream=this.remember(record.sessionId,checkpoints,socketEpoch),terminal=record.type==="session_closed"||record.type==="session_parked",routes=[...new Set([...(stream?.routes??[]).filter(id=>this.admissions.has(id)||terminal&&[...this.mirrorOwners.values()].includes(id)),...mirrors])];if(record.type==="response"&&typeof record.id=="string"){let admissionId=replyAdmission(record.id,this.peer,routes);return admissionId===null?[]:admissionId===void 0?[line]:[serializeJsonLine({...record,admissionId,generation:stream?.generation})]}return routes.length===0?[line]:routes.map(admissionId=>serializeJsonLine({...record,admissionId,generation:stream?.generation}))}deferRetire(id,retire){this.retireAfterReply.set(id,retire)}retireReplied(line){if(this.retireAfterReply.size===0)return;let record=JSON.parse(line);if(record.type!=="response"||typeof record.id!="string")return;let retire=this.retireAfterReply.get(record.id);this.retireAfterReply.delete(record.id),retire?.()}bind(checkpoints,socketEpoch,peer){this.peer=peer;let enqueue=super.enqueue.bind(this);this.enqueue=(line,key,written,demoted,reply,held)=>{let lines2=this.route(line,checkpoints,socketEpoch);if(this.retireReplied(line),lines2.length===0){written?.(!1);return}let replacements=demoted===void 0?void 0:this.route(demoted,checkpoints,socketEpoch),remaining=lines2.length,delivered=!1,receipt=ok=>{delivered||=ok,--remaining===0&&written?.(delivered)};for(let i=0;i<lines2.length;i++){let line2=lines2[i]??"",admissionId=Reflect.get(JSON.parse(line2),"admissionId"),pending=typeof admissionId=="string"?this.pendingMirrors.get(admissionId):void 0,deliver=()=>enqueue(lines2[i]??line2,key===void 0?void 0:`${key}:${i}`,receipt,replacements?.[i],reply,held);pending&&!reply?pending.enqueue(line2,deliver,()=>receipt(!1)):deliver()}}}};var CompactRequiredStreams=class{constructor(fanout,status){this.states=new WeakMap,this.fanout=fanout,this.status=status}sessions(peer){return this.status.requiredSessions(peer)}routes(peer,sessionId,type){let registered=this.fanout.get(peer),actor=registered?.actor;return!(actor instanceof AdmissionRoutingActor)||!registered?[]:[...new Set([...(this.fanout.checkpoints.stream({socketEpoch:registered.socketEpoch,sessionId})?.routes??[]).filter(id=>actor.admissions.has(id)),...this.status.mirrorAdmissions(peer,sessionId,type)])]}prepare(sessionId,record){let lane=this.fanout.acceptance.get(sessionId);if(!(!lane||lane.retired))for(let peer of this.fanout.connectionIds()){if(!this.fanout.connectionHas(peer,COMPACT_EVENTS_CAPABILITY))continue;let registered=this.fanout.get(peer),actor=registered?.actor;if(!(actor instanceof AdmissionRoutingActor)||!registered)continue;let routes=this.status.requiredAdmissions(peer,sessionId),caller={socketEpoch:registered.socketEpoch,sessionId};for(let admissionId of routes){if(this.fanout.checkpoints.stream(caller)?.routes.includes(admissionId))continue;let frozen=this.fanout.checkpoints.freeze({...caller,peer,admissionId,routeKind:"mirror"},lane,!0);if(!frozen.ok){registered.close("checkpoint_unavailable",frozen.failure.reason);continue}}let stream=this.fanout.checkpoints.stream(caller);if(!stream?.routes.length)continue;let states=this.states.get(actor)??new Map;this.states.set(actor,states);let state=states.get(sessionId);if(state?.epoch!==lane.sessionEpoch&&(state={epoch:lane.sessionEpoch,dirty:!1},states.set(sessionId,state),state.seed=this.fanout.checkpoints.tokens().find(t=>t.admission.socketEpoch===caller.socketEpoch&&t.admission.sessionId===sessionId)),!record)continue;let type=String(Reflect.get(record,"type"));if(!(stream.routes.some(id=>actor.admissions.has(id))||this.status.mirrorAdmissions(peer,sessionId,type).length>0)){state.dirty=!0;continue}if(state.dirty){let frozen=this.fanout.checkpoints.freeze({...caller,peer,admissionId:stream.routes[0],routeKind:routes.length?"mirror":"ordinary"},lane);if(!frozen.ok){registered.close("checkpoint_unavailable",frozen.failure.reason);continue}state.seed=frozen.value.token,state.dirty=!1}}}takeSeed(peer,sessionId){let actor=this.fanout.get(peer)?.actor,state=actor instanceof AdmissionRoutingActor?this.states.get(actor)?.get(sessionId):void 0,seed=state?.seed;return state&&(state.seed=void 0),seed}forgetSession(sessionId){for(let peer of this.fanout.connectionIds()){let actor=this.fanout.get(peer)?.actor;actor instanceof AdmissionRoutingActor&&this.states.get(actor)?.delete(sessionId)}}};function causeLine(cause){let text=cause instanceof Error?`${cause.name}: ${cause.message}`:String(cause);return text.split(`
@@ -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{parseEntryLine,resolveMovedPath}from"./chunk-GTJJ73DE.js";import{advanceSessionFence}from"./chunk-SOMFLLPD.js";import{source_default}from"./chunk-26UBFF6N.js";import{killWindowsProcessTree}from"./chunk-JJYN347Z.js";import{APP_NAME}from"./chunk-SODMQEHO.js";import{ownProcessStartedAtMs,processBootAtMs,sameBoot}from"./chunk-44BJPS5I.js";import{processStartTimeMs,sameProcessStartMs}from"./chunk-O5RYI3IW.js";import{randomUUID}from"node:crypto";import{mkdir,readdir,readFile,rename,rm,stat,writeFile}from"node:fs/promises";import{dirname,join}from"node:path";var InvalidScheduledJobError=class extends Error{constructor(message){super(message),this.name="InvalidScheduledJobError"}};function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function requireString(raw,key){let value=raw[key];if(typeof value!="string"||value.length===0)throw new InvalidScheduledJobError(`scheduled job field "${key}" must be a non-empty string`);return value}function requireCount(raw,key){let value=raw[key];if(typeof value!="number"||!Number.isSafeInteger(value)||value<0)throw new InvalidScheduledJobError(`scheduled job field "${key}" must be a non-negative integer`);return value}function nullableCount(raw,key){return raw[key]===null||raw[key]===void 0?null:requireCount(raw,key)}function nullableString(raw,key){let value=raw[key];if(value==null)return null;if(typeof value!="string")throw new InvalidScheduledJobError(`scheduled job field "${key}" must be a string`);return value}function parseScheduledJob(raw){if(!isRecord(raw))throw new InvalidScheduledJobError("scheduled job must be a JSON object");if(raw.version!==1)throw new InvalidScheduledJobError(`unsupported scheduled job version: ${JSON.stringify(raw.version)}`);let id=requireString(raw,"id");if(!/^sch_[a-z0-9]{12}$/.test(id))throw new InvalidScheduledJobError(`invalid scheduled job id: ${id}`);let everyMs=nullableCount(raw,"everyMs");if(everyMs!==null&&everyMs<60*1e3)throw new InvalidScheduledJobError("scheduled job recurrence must be at least 60s");if(everyMs!==null&&everyMs>316224e5)throw new InvalidScheduledJobError("scheduled job recurrence must be at most 366 days");let prompt=requireString(raw,"prompt");if(Buffer.byteLength(prompt,"utf8")>16384)throw new InvalidScheduledJobError("scheduled job prompt exceeds 16384 bytes");let createdAt=requireCount(raw,"createdAt"),dueAt=requireCount(raw,"dueAt");return{version:1,id,sessionId:requireString(raw,"sessionId"),sessionFile:nullableString(raw,"sessionFile"),cwd:requireString(raw,"cwd"),prompt,createdAt,dueAt,everyMs,fireCount:requireCount(raw,"fireCount"),lastFiredAt:nullableCount(raw,"lastFiredAt"),lastError:nullableString(raw,"lastError")}}function nextRecurringDueAt(dueAt,everyMs,now){if(dueAt>now)return dueAt;let missed=Math.floor((now-dueAt)/everyMs)+1;return dueAt+missed*everyMs}function formatScheduledMessage(job,firedAt){let recurrence=job.everyMs===null?"":`, repeats every ${Math.round(job.everyMs/1e3)}s`;return`[Scheduled prompt ${job.id}: created ${new Date(job.createdAt).toISOString()}, due ${new Date(job.dueAt).toISOString()}, fired ${new Date(firedAt).toISOString()}${recurrence}]
2
+ import{parseEntryLine,resolveMovedPath}from"./chunk-GTJJ73DE.js";import{advanceSessionFence}from"./chunk-SOMFLLPD.js";import{source_default}from"./chunk-26UBFF6N.js";import{killWindowsProcessTree}from"./chunk-ZJUL5ODW.js";import{APP_NAME}from"./chunk-SODMQEHO.js";import{ownProcessStartedAtMs,processBootAtMs,sameBoot}from"./chunk-44BJPS5I.js";import{processStartTimeMs,sameProcessStartMs}from"./chunk-O5RYI3IW.js";import{randomUUID}from"node:crypto";import{mkdir,readdir,readFile,rename,rm,stat,writeFile}from"node:fs/promises";import{dirname,join}from"node:path";var InvalidScheduledJobError=class extends Error{constructor(message){super(message),this.name="InvalidScheduledJobError"}};function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function requireString(raw,key){let value=raw[key];if(typeof value!="string"||value.length===0)throw new InvalidScheduledJobError(`scheduled job field "${key}" must be a non-empty string`);return value}function requireCount(raw,key){let value=raw[key];if(typeof value!="number"||!Number.isSafeInteger(value)||value<0)throw new InvalidScheduledJobError(`scheduled job field "${key}" must be a non-negative integer`);return value}function nullableCount(raw,key){return raw[key]===null||raw[key]===void 0?null:requireCount(raw,key)}function nullableString(raw,key){let value=raw[key];if(value==null)return null;if(typeof value!="string")throw new InvalidScheduledJobError(`scheduled job field "${key}" must be a string`);return value}function parseScheduledJob(raw){if(!isRecord(raw))throw new InvalidScheduledJobError("scheduled job must be a JSON object");if(raw.version!==1)throw new InvalidScheduledJobError(`unsupported scheduled job version: ${JSON.stringify(raw.version)}`);let id=requireString(raw,"id");if(!/^sch_[a-z0-9]{12}$/.test(id))throw new InvalidScheduledJobError(`invalid scheduled job id: ${id}`);let everyMs=nullableCount(raw,"everyMs");if(everyMs!==null&&everyMs<60*1e3)throw new InvalidScheduledJobError("scheduled job recurrence must be at least 60s");if(everyMs!==null&&everyMs>316224e5)throw new InvalidScheduledJobError("scheduled job recurrence must be at most 366 days");let prompt=requireString(raw,"prompt");if(Buffer.byteLength(prompt,"utf8")>16384)throw new InvalidScheduledJobError("scheduled job prompt exceeds 16384 bytes");let createdAt=requireCount(raw,"createdAt"),dueAt=requireCount(raw,"dueAt");return{version:1,id,sessionId:requireString(raw,"sessionId"),sessionFile:nullableString(raw,"sessionFile"),cwd:requireString(raw,"cwd"),prompt,createdAt,dueAt,everyMs,fireCount:requireCount(raw,"fireCount"),lastFiredAt:nullableCount(raw,"lastFiredAt"),lastError:nullableString(raw,"lastError")}}function nextRecurringDueAt(dueAt,everyMs,now){if(dueAt>now)return dueAt;let missed=Math.floor((now-dueAt)/everyMs)+1;return dueAt+missed*everyMs}function formatScheduledMessage(job,firedAt){let recurrence=job.everyMs===null?"":`, repeats every ${Math.round(job.everyMs/1e3)}s`;return`[Scheduled prompt ${job.id}: created ${new Date(job.createdAt).toISOString()}, due ${new Date(job.dueAt).toISOString()}, fired ${new Date(firedAt).toISOString()}${recurrence}]
3
3
  ${job.prompt}`}var STATE_DIRS=["pending","firing","failed"],JOB_ID=/^sch_[a-z0-9]{12}$/,RECORD_FILE=/^(sch_[a-z0-9]{12})(?:@(\d+)(?:~(\d+)-(\d+))?)?\.json$/;function scheduleDir(agentDir){return join(agentDir,"schedule")}function isScheduledJobId(id){return JOB_ID.test(id)}function isFileSystemError(error,code){return error instanceof Error&&"code"in error&&error.code===code}async function ensureDir(dir){await mkdir(dir,{recursive:!0,mode:448})}async function writeAtomic(filePath,contents){await ensureDir(dirname(filePath));let tempPath=join(dirname(filePath),`.schedule-${randomUUID()}.tmp`);try{await writeFile(tempPath,contents,{encoding:"utf8",mode:384}),await rename(tempPath,filePath)}catch(error){throw await rm(tempPath,{force:!0}),error}}function serialize(job){return`${JSON.stringify(job,null,2)}
4
4
  `}async function readJobFile(path,expectedId){if((await stat(path)).size>65536)throw new InvalidScheduledJobError(`scheduled job file exceeds ${65536} bytes`);let parsed;try{parsed=JSON.parse(await readFile(path,"utf8"))}catch(error){throw isFileSystemError(error,"ENOENT")?error:new InvalidScheduledJobError("scheduled job file is not valid JSON")}let job=parseScheduledJob(parsed);if(job.id!==expectedId)throw new InvalidScheduledJobError(`scheduled job id ${job.id} does not match its file`);return job}async function listScheduledJobs(dir){let jobs=[],invalid=[];for(let state of STATE_DIRS){let names;try{names=await readdir(join(dir,state))}catch(error){if(isFileSystemError(error,"ENOENT"))continue;throw error}for(let name of names.sort()){let match=RECORD_FILE.exec(name);if(match===null)continue;let[,id,occurrence,pid,startedAt]=match,file=join(state,name);if(!(state==="pending"?occurrence===void 0:state==="firing"?pid!==void 0:occurrence!==void 0&&pid===void 0)||id===void 0){invalid.push({state,file,error:`unexpected record name for ${state}/`});continue}try{let job=await readJobFile(join(dir,file),id);jobs.push({state,job,file,...occurrence===void 0?{}:{occurrence:Number(occurrence)},...pid===void 0||startedAt===void 0?{}:{owner:{pid:Number(pid),processStartedAtMs:Number(startedAt)}}})}catch(error){if(isFileSystemError(error,"ENOENT"))continue;invalid.push({state,file,error:error instanceof Error?error.message:String(error)})}}}return jobs.sort((a,b)=>a.job.dueAt-b.job.dueAt),{jobs,invalid}}async function createScheduledJob(dir,input,now){let job=parseScheduledJob({version:1,id:`sch_${randomUUID().replace(/-/g,"").slice(0,12)}`,...input,createdAt:now,fireCount:0,lastFiredAt:null});return await writeAtomic(join(dir,"pending",`${job.id}.json`),serialize(job)),job}function tombstonePath(dir,id){return join(dir,"cancelled",id)}async function isCancelled(dir,id){try{return await stat(tombstonePath(dir,id)),!0}catch(error){if(isFileSystemError(error,"ENOENT"))return!1;throw error}}function runnersDir(dir){return join(dir,"runners")}import{randomUUID as randomUUID2}from"node:crypto";import{link,readdir as readdir2,rename as rename2,rm as rm2,stat as stat2,writeFile as writeFile2}from"node:fs/promises";import{join as join2}from"node:path";var TOMBSTONE_RETENTION_MS=1440*60*1e3;async function cancelScheduledJob(dir,id,options={}){if(!isScheduledJobId(id))return;let records=(await listScheduledJobs(dir)).jobs.filter(record=>record.job.id===id),representative=records.find(record=>record.state==="pending")??records[0];if(representative===void 0||options.sessionId!==void 0&&representative.job.sessionId!==options.sessionId)return;await writeAtomic(tombstonePath(dir,id),`${new Date().toISOString()}
5
5
  `);let inFlight=(await occurrenceNumbers(dir,"firing",id)).length>0;await rm2(join2(dir,"pending",`${id}.json`),{force:!0});let failed=records.filter(record=>record.state==="failed");for(let record of failed)await rm2(join2(dir,record.file),{force:!0});return{job:representative.job,inFlight,removedFailed:failed.length}}function occurrenceFile(id,occurrence,owner){return join2("firing",`${id}@${occurrence}~${owner.pid}-${owner.processStartedAtMs}.json`)}async function restorePending(dir,record,id){let pending=join2(dir,"pending",`${id}.json`);try{await link(join2(dir,record),pending)}catch(error){if(!isFileSystemError(error,"EEXIST"))throw error}await rm2(join2(dir,record),{force:!0}),await isCancelled(dir,id)&&await rm2(pending,{force:!0})}async function claimOccurrence(dir,job,owner){let record=occurrenceFile(job.id,job.fireCount+1,owner);await ensureDir(join2(dir,"firing"));try{await rename2(join2(dir,"pending",`${job.id}.json`),join2(dir,record))}catch(error){if(isFileSystemError(error,"ENOENT"))return;throw error}if(await isCancelled(dir,job.id)){await rm2(join2(dir,record),{force:!0});return}if((await readJobFile(join2(dir,record),job.id)).fireCount!==job.fireCount){await restorePending(dir,record,job.id);return}return record}async function rearmRecurringJob(dir,next){if(await isCancelled(dir,next.id))return;let path=join2(dir,"pending",`${next.id}.json`);await writeAtomic(path,serialize(next)),await isCancelled(dir,next.id)&&await rm2(path,{force:!0})}async function occurrenceNumbers(dir,state,id){let names;try{names=await readdir2(join2(dir,state))}catch(error){if(isFileSystemError(error,"ENOENT"))return[];throw error}let prefix=`${id}@`;return names.filter(name=>name.startsWith(prefix)).map(name=>Number.parseInt(name.slice(prefix.length),10)).filter(occurrence=>Number.isSafeInteger(occurrence))}async function restoreAbandonedSchedule(dir,job,occurrence,now){if(job.everyMs===null||await isCancelled(dir,job.id))return;let pending=join2(dir,"pending",`${job.id}.json`);if(await stat2(pending).then(()=>!0,()=>!1)||[...await occurrenceNumbers(dir,"firing",job.id),...await occurrenceNumbers(dir,"failed",job.id)].some(n=>n>occurrence))return;let next={...job,fireCount:occurrence,dueAt:nextRecurringDueAt(job.dueAt,job.everyMs,now),lastError:null};await ensureDir(join2(dir,"pending"));let temp=join2(dir,"pending",`.schedule-${randomUUID2()}.tmp`);try{await writeFile2(temp,serialize(next),{encoding:"utf8",mode:384}),await link(temp,pending)}catch(error){if(!isFileSystemError(error,"EEXIST"))throw error;return}finally{await rm2(temp,{force:!0})}if(await isCancelled(dir,job.id)){await rm2(pending,{force:!0});return}return next}async function settleOccurrence(dir,record,job,occurrence,outcome){if(!outcome.ok&&!await isCancelled(dir,job.id)){let failed=join2(dir,"failed",`${job.id}@${occurrence}.json`);await writeAtomic(failed,serialize({...job,lastError:outcome.error})),await isCancelled(dir,job.id)&&await rm2(failed,{force:!0});let older=(await occurrenceNumbers(dir,"failed",job.id)).sort((a,b)=>b-a);for(let stale of older.slice(10))await rm2(join2(dir,"failed",`${job.id}@${stale}.json`),{force:!0})}await rm2(join2(dir,record),{force:!0})}async function pruneTombstones(dir,listing,now){let names;try{names=await readdir2(join2(dir,"cancelled"))}catch(error){if(isFileSystemError(error,"ENOENT"))return;throw error}let live=new Set(listing.jobs.filter(record=>record.state!=="failed").map(record=>record.job.id));for(let id of names){if(!isScheduledJobId(id)||live.has(id))continue;let info=await stat2(tombstonePath(dir,id)).catch(()=>{});info!==void 0&&now-info.mtimeMs>TOMBSTONE_RETENTION_MS&&await rm2(tombstonePath(dir,id),{force:!0})}}import{mkdir as mkdir2,readdir as readdir3,stat as stat4}from"node:fs/promises";import{join as join3}from"node:path";import{randomUUID as randomUUID3}from"node:crypto";import{link as link2,open,readFile as readFile3,rename as rename3,stat as stat3,unlink}from"node:fs/promises";import{execFile}from"node:child_process";import{readFile as readFile2}from"node:fs/promises";var LINUX_CLOCK_TICKS_PER_SECOND=100;async function linuxProcessStartMs(pid){let[stat6,systemStat]=await Promise.all([readFile2(`/proc/${pid}/stat`,"utf8"),readFile2("/proc/stat","utf8")]),afterComm=stat6.slice(stat6.lastIndexOf(")")+2).split(" "),startTicks=Number(afterComm[19]),bootSeconds=Number(/^btime (\d+)/m.exec(systemStat)?.[1]);if(!(!Number.isFinite(startTicks)||!Number.isFinite(bootSeconds)))return Math.round((bootSeconds+startTicks/LINUX_CLOCK_TICKS_PER_SECOND)*1e3)}function execText(command,args,env){return new Promise((resolve,reject)=>{execFile(command,[...args],{encoding:"utf8",timeout:5e3,windowsHide:!0,...env===void 0?{}:{env}},(error,stdout)=>{error?reject(error):resolve(stdout)})})}async function darwinProcessStartMs(pid){let text=(await execText("ps",["-o","lstart=","-p",String(pid)],{...process.env,LC_ALL:"C",LANG:"C"})).trim();if(text.length!==0)return processStartTimeMs(text)}async function windowsProcessStartMs(pid){let script=`(Get-Process -Id ${pid} -ErrorAction Stop).StartTime.ToUniversalTime().ToString('o')`,text=(await execText("powershell",["-NoProfile","-NonInteractive","-Command",script])).trim();return processStartTimeMs(text)}async function readProcessStartMs(pid){try{switch(process.platform){case"linux":return await linuxProcessStartMs(pid);case"darwin":return await darwinProcessStartMs(pid);case"win32":return await windowsProcessStartMs(pid);default:return}}catch{return}}function errorCode(error){if(typeof error=="object"&&error!==null&&"code"in error&&typeof error.code=="string")return error.code}async function unlinkIfPresent(path){try{await unlink(path)}catch(error){if(errorCode(error)!=="ENOENT")throw error}}async function readLeaseText(path){try{return await readFile3(path,"utf8")}catch(error){if(errorCode(error)==="ENOENT")return;throw error}}async function writeTemp(path,content,mode){let temp=`${path}.${process.pid}.${randomUUID3().slice(0,8)}.tmp`,file=await open(temp,"wx",mode);try{await file.writeFile(content,"utf8")}finally{await file.close()}return temp}async function publishExclusive(path,content,options={}){let temp=await writeTemp(path,content,options.mode);try{await link2(temp,path)}catch(error){let code=errorCode(error);if(code!=="ENOTSUP"&&code!=="EOPNOTSUPP"&&code!=="EPERM")throw error;let file=await open(path,"wx",options.mode);try{await file.writeFile(content,"utf8")}finally{await file.close()}}finally{await unlinkIfPresent(temp)}}async function publishReplace(path,content,options={}){let temp=await writeTemp(path,content,options.mode);try{await rename3(temp,path)}catch(error){throw await unlinkIfPresent(temp),error}}function pidAlive(pid){try{return process.kill(pid,0),!0}catch(error){return errorCode(error)==="EPERM"}}var UNREADABLE_LOCK_STALE_MS=3e4;function readLockHolder(raw){try{let parsed=JSON.parse(raw);if(typeof parsed!="object"||parsed===null||!("pid"in parsed)||!("bootAtMs"in parsed)||!("processStartedAtMs"in parsed))return;let{pid,bootAtMs,processStartedAtMs}=parsed;return typeof pid!="number"||typeof bootAtMs!="number"||typeof processStartedAtMs!="number"?void 0:{pid,bootAtMs,processStartedAtMs}}catch{return}}async function reclaimLockState(lock,probes={}){let raw=await readLeaseText(lock);if(raw===void 0)return{state:"free"};let holder=readLockHolder(raw);if(holder===void 0)return await stat3(lock).then(info=>Date.now()-info.mtimeMs,()=>0)>UNREADABLE_LOCK_STALE_MS?{state:"stale",raw}:{state:"held"};if(!sameBoot(holder.bootAtMs,processBootAtMs()))return{state:"stale",raw};if(holder.pid===process.pid)return sameProcessStartMs(holder.processStartedAtMs,ownProcessStartedAtMs())?{state:"held",holder}:{state:"stale",raw};if(!(probes.isProcessAlive??pidAlive)(holder.pid))return{state:"stale",raw};let observed=await(probes.readProcessStartMs??readProcessStartMs)(holder.pid).catch(()=>{});return observed===void 0?{state:"held",holder,unproven:!0}:sameProcessStartMs(holder.processStartedAtMs,observed)?{state:"held",holder}:{state:"stale",raw}}async function breakStaleLock(lock,raw){let aside=`${lock}.${process.pid}.${randomUUID3().slice(0,8)}.broken`;try{await rename3(lock,aside)}catch(error){if(errorCode(error)==="ENOENT")return;throw error}let moved=await readFile3(aside,"utf8");if(moved!==raw)try{await publishExclusive(lock,moved)}catch(error){if(errorCode(error)!=="EEXIST")throw error}await unlinkIfPresent(aside)}async function takeReclaimLock(lock,probes){let mine=JSON.stringify({pid:process.pid,bootAtMs:processBootAtMs(),processStartedAtMs:ownProcessStartedAtMs()});for(let attempt=0;attempt<3;attempt+=1){try{return await publishExclusive(lock,mine),mine}catch(error){if(errorCode(error)!=="EEXIST")throw error}let seen=await reclaimLockState(lock,probes);if(seen.state==="held")return{holder:seen.holder};seen.state==="stale"&&await breakStaleLock(lock,seen.raw)}return{}}async function reclaimInspected(path,inspected,probes={}){let lock=`${path}.lock`,taken=await takeReclaimLock(lock,probes);if(typeof taken!="string")return{outcome:"busy",...taken.holder?{holder:taken.holder}:{}};try{return await readLeaseText(path)!==inspected?{outcome:"changed"}:(await unlinkIfPresent(path),{outcome:"removed"})}finally{await readLeaseText(lock)===taken&&await unlinkIfPresent(lock)}}var RUNNER_HEARTBEAT_STALE_MS=12e4,RUNNER_HEARTBEAT_INTERVAL_MS=3e4,DEFAULT_MAX_DELIVERY_MS=9e5,PRIVATE={mode:384};function ownRunnerIdentity(){return{pid:process.pid,processStartedAtMs:ownProcessStartedAtMs()}}function leasePath(dir,pid){return join3(runnersDir(dir),`${pid}.json`)}async function writeRunnerLease(dir,lease,now){await mkdir2(runnersDir(dir),{recursive:!0,mode:448});let identity=ownRunnerIdentity();await publishReplace(leasePath(dir,identity.pid),JSON.stringify({...identity,bootAtMs:processBootAtMs(),beatAt:now,...lease}),PRIVATE)}async function removeRunnerLease(dir){await unlinkIfPresent(leasePath(dir,process.pid))}function parseLease(raw){try{let parsed=JSON.parse(raw);if(typeof parsed!="object"||parsed===null)return;let beatAt="beatAt"in parsed?parsed.beatAt:void 0;if(typeof beatAt!="number")return;let watch="watch"in parsed&&parsed.watch===!0,exec="exec"in parsed&&typeof parsed.exec=="string"?parsed.exec:null;return{beatAt,watch,exec}}catch{return}}async function liveRunners(dir){let names;try{names=await readdir3(runnersDir(dir))}catch(error){if(error instanceof Error&&"code"in error&&error.code==="ENOENT")return[];throw error}let runners=[];for(let name of names){if(!/^\d+\.json$/.test(name))continue;let path=join3(runnersDir(dir),name),state=await reclaimLockState(path);if(state.state==="stale"&&await breakStaleLock(path,state.raw),state.state!=="held"||state.holder===void 0)continue;let raw=await readLeaseText(path),lease=raw===void 0?void 0:parseLease(raw);lease!==void 0&&runners.push({pid:state.holder.pid,processStartedAtMs:state.holder.processStartedAtMs,...lease})}return runners}async function isWatchRunnerAvailable(dir,now){return(await liveRunners(dir)).some(runner=>runner.watch&&now-runner.beatAt<=RUNNER_HEARTBEAT_STALE_MS)}function isOwnerAmong(owner,runners){return runners.some(runner=>runner.pid===owner.pid&&sameProcessStartMs(runner.processStartedAtMs,owner.processStartedAtMs))}function sessionLockPath(dir,sessionId){return join3(dir,"sessions",`${encodeURIComponent(sessionId)}.lock`)}function isDeliveryGroupAlive(pid){try{return process.kill(process.platform==="win32"?pid:-pid,0),!0}catch(error){return errorCode(error)==="EPERM"}}function isPidAlive(pid){try{return process.kill(pid,0),!0}catch(error){return errorCode(error)==="EPERM"}}async function orphanedDelivery(raw,lockAgeMs,probes){let parsed;try{parsed=JSON.parse(raw)}catch{return}if(typeof parsed!="object"||parsed===null)return;let field=key=>key in parsed?Reflect.get(parsed,key):void 0,boot=field("bootAtMs");if(typeof boot!="number"||!sameBoot(boot,processBootAtMs()))return;let pid=field("deliveryPid"),startedAt=field("deliveryStartedAtMs");if(typeof pid!="number"||typeof startedAt!="number"){let maxDeliveryMs=field("maxDeliveryMs"),runner=field("pid");return field("gated")===!1&&typeof maxDeliveryMs=="number"&&lockAgeMs<=maxDeliveryMs&&typeof runner=="number"?runner:void 0}if(!isDeliveryGroupAlive(pid))return;if(!isPidAlive(pid))return pid;let leaderStart=await(probes.readProcessStartMs??readProcessStartMs)(pid).catch(()=>{});return leaderStart!==void 0&&sameProcessStartMs(startedAt,leaderStart)?pid:void 0}async function acquireSessionDeliveryLock(dir,sessionId,options={}){let probes=options,path=sessionLockPath(dir,sessionId),identity={pid:process.pid,bootAtMs:processBootAtMs(),processStartedAtMs:ownProcessStartedAtMs(),gated:options.gated??process.platform!=="win32",maxDeliveryMs:options.maxDeliveryMs??DEFAULT_MAX_DELIVERY_MS},mine=JSON.stringify(identity);for(let attempt=0;attempt<3;attempt+=1){try{await publishExclusive(path,mine,PRIVATE);let tail=Promise.resolve(),serialized=operation=>{let run=tail.then(operation);return tail=run.catch(()=>{}),run};return{acquired:!0,attachDelivery:pid=>serialized(async()=>{let startedAt=Math.floor(Date.now()/1e3)*1e3;if(await readLeaseText(path)!==mine)throw new Error("session delivery lock was lost");let next=JSON.stringify({...identity,deliveryPid:pid,deliveryStartedAtMs:startedAt});await publishReplace(path,next,PRIVATE),mine=next}),release:()=>serialized(async()=>{await readLeaseText(path)===mine&&await unlinkIfPresent(path)})}}catch(error){let code=errorCode(error);if(code==="ENOENT"){await mkdir2(join3(dir,"sessions"),{recursive:!0,mode:448});continue}if(code!=="EEXIST")throw error}let state=await reclaimLockState(path);if(state.state==="held")return{acquired:!1,heldByPid:state.holder?.pid};if(state.state==="stale"){let lockAgeMs=await stat4(path).then(info=>Date.now()-info.mtimeMs,()=>0),delivering=await orphanedDelivery(state.raw,lockAgeMs,probes);if(delivering!==void 0)return{acquired:!1,heldByPid:delivering};await breakStaleLock(path,state.raw)}}return{acquired:!1,heldByPid:void 0}}import{createReadStream}from"node:fs";import{stat as stat5}from"node:fs/promises";import{createInterface}from"node:readline";import{randomUUID as randomUUID5}from"node:crypto";import{existsSync,mkdirSync,readFileSync,renameSync,rmdirSync,statSync,unlinkSync,writeFileSync}from"node:fs";import{mkdir as mkdir4}from"node:fs/promises";import{dirname as dirname3,join as join6}from"node:path";var SessionHeldError=class extends Error{constructor(sessionFile,holders){let who=holders.map(h=>h.cwd?`pid ${h.pid} in ${h.cwd}`:`pid ${h.pid}`).join("; ");super(`This session is open in another ${APP_NAME} process (${who}). Quit it there, then try again.`),this.code="ESESSIONHELD",this.name="SessionHeldError",this.sessionFile=sessionFile,this.holders=holders}},SessionMovingError=class extends Error{constructor(sessionFile,moverPid){let who=moverPid===void 0?"another process":`another process (pid ${moverPid})`;super(`Session ${sessionFile} is being moved by ${who}. Try again in a moment.`),this.code="ESESSIONMOVING",this.name="SessionMovingError",this.moverPid=moverPid}},SessionMovedError=class extends Error{constructor(sessionFile){super(`Session ${sessionFile} no longer exists: another process moved it. Resume it from its new location.`),this.code="ESESSIONMOVED",this.name="SessionMovedError"}};import{readdir as readdir4}from"node:fs/promises";import{join as join4}from"node:path";var HOLDER_RECORD=/^\d+\.json$/;function parseCwd(raw){let parsed=JSON.parse(raw);if(!(typeof parsed!="object"||parsed===null||!("cwd"in parsed)))return typeof parsed.cwd=="string"?parsed.cwd:void 0}async function fenced(fenceSession){return fenceSession===void 0?!1:fenceSession().then(()=>!0,()=>!1)}function holderGeneration(parsed){return typeof parsed!="object"||parsed===null?{}:{..."host_instance"in parsed&&typeof parsed.host_instance=="string"?{host_instance:parsed.host_instance}:{},..."host_daemon_dir"in parsed&&typeof parsed.host_daemon_dir=="string"?{host_daemon_dir:parsed.host_daemon_dir}:{}}}async function liveHolders(dir,probes={},fenceSession){let holders=[];for(let name of await readdir4(dir)){if(!HOLDER_RECORD.test(name))continue;let path=join4(dir,name),before=await readLeaseText(path),state=await reclaimLockState(path,probes);if(state.state==="stale"&&await breakStaleLock(path,state.raw),state.state!=="held"||state.holder===void 0)continue;let raw=await readLeaseText(path),stable=raw!==void 0&&raw===before,parsed=stable?JSON.parse(raw):void 0;if(stable&&state.unproven===!0&&await probes.holderEnded?.(holderGeneration(parsed))===!0&&await fenced(fenceSession)){await breakStaleLock(path,raw);continue}let endpoint=typeof parsed=="object"&&parsed!==null&&"host_instance"in parsed&&typeof parsed.host_instance=="string"?{host_instance:parsed.host_instance,..."host_socket"in parsed&&typeof parsed.host_socket=="string"?{host_socket:parsed.host_socket}:{}}:{};holders.push({pid:state.holder.pid,cwd:stable?parseCwd(raw):void 0,...endpoint,...probes.markUnproven===!0&&state.unproven===!0?{unproven:!0}:{}})}return holders}import{randomUUID as randomUUID4}from"node:crypto";import{mkdir as mkdir3,readFile as readFile4,rename as rename4,rm as rm3,writeFile as writeFile3}from"node:fs/promises";import{dirname as dirname2,join as join5}from"node:path";var InvalidSidecarStoreError=class extends Error{constructor(message,options){super(message,options),this.name="InvalidSidecarStoreError"}},UnsupportedSidecarStoreVersionError=class extends Error{constructor(message){super(message),this.name="UnsupportedSidecarStoreVersionError"}},mutationTails=new Map,snapshots=new Map;function encodedSessionId(sessionId){return encodeURIComponent(sessionId)}function sidecarFilePath(ref){return join5(ref.baseDir,`${encodedSessionId(ref.sessionId)}.json`)}function createSidecarStore(options){let ref={baseDir:options.baseDir,sessionId:options.sessionId},filePath=sidecarFilePath(ref);async function read(){let raw;try{raw=await readFile4(filePath,"utf8")}catch(error){if(isFileSystemError2(error,"ENOENT"))return null;throw error}let state=parsePayload(raw,options,ref);return snapshots.set(filePath,state),state}async function write(state){await mkdir3(dirname2(filePath),{recursive:!0}),await writeAtomic2(filePath,`${JSON.stringify(state,null,2)}
@@ -1,3 +1,3 @@
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{emitProviderAccountsChanged,slotsOfOwnKind,subscriptionLimits}from"./chunk-GILDYS3O.js";import{signalSpawnedChild}from"./chunk-KLAX467B.js";import{discoverEnvSlots}from"./chunk-C4AHHZ6P.js";import{CredentialSlotRepository,applicableStoredState}from"./chunk-CEFKVI3E.js";import{roundRobinState}from"./chunk-WHQ2QPP5.js";import{applyAccountOrder,isAvailable,isSlotBlocked,orderAccounts,preferHeadroom,withoutOrderedAccount}from"./chunk-PBUV2Z3R.js";import{activeModelBlockUntil,modelBlockApplies,pruneModelBlocks}from"./chunk-NJ43NBSP.js";import{accountDisplayName,listSlots,normalizeProviderId,pinSlot,projectSlot,removeSlot,renameSlotDisplayName}from"./chunk-OH5TKHW7.js";import{getAgentDir}from"./chunk-SODMQEHO.js";import{lstat as lstat2}from"node:fs/promises";import{dirname as dirname3,join as join4}from"node:path";function isForeignAuthBlock(slot){let fields=slot;if(fields.store!=="claude-cli"||fields.blockReason!=="auth_error"||fields.signInRequired==="login_expired")return!1;let verdict=fields.authVerdict;return verdict?.dirId!==fields.dirId||verdict?.at!==fields.blockedAt}function withoutForeignAuthBlock(slot){if(!isForeignAuthBlock(slot))return slot;let{blockedUntil:_until,blockReason:_reason,blockedAt:_at,authVerdict:_verdict,...rest}=slot;return rest}function isEnvSlot(slot){return slot.store===void 0}var SENTINEL_OAUTH_FIELDS={access:"claude-sdk-oauth-managed",refresh:"claude-sdk-oauth-managed",expires:41024448e5};function emptyCredential(){return{type:"oauth",...SENTINEL_OAUTH_FIELDS,accounts:[]}}function storedSlots(credential){return credential.accounts??[]}function isListedStoredSlot(slot){let candidate=slot,name=candidate.name;return candidate.store==="claude-cli"&&typeof name=="string"&&name.trim()!==""}function unusableStoredSlotCount(credential){if(credential===null||typeof credential!="object"||!("accounts"in credential))return 0;let stored=credential.accounts;return Array.isArray(stored)?stored.filter(slot=>slot!==null&&typeof slot=="object"&&slot.store==="claude-cli"&&!isListedStoredSlot(slot)).length:0}function listAccounts(credential,env){let slots=storedSlots(credential).filter(isListedStoredSlot).map(withoutForeignAuthBlock);if(env){let state=credential.slotState??{};for(let slot of envSlots(env)){let persisted=state[slot.name];slots.push(persisted?{...slot,...persisted}:slot)}}return slots}var ACCOUNT_NAME_PATTERN=/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/;function assertValidAccountName(name){if(!ACCOUNT_NAME_PATTERN.test(name))throw new Error(`Invalid account name '${name}': use letters, digits, '-' or '_', starting with a letter or digit`)}function pinAccount(credential,name){return{...credential,pinned:name}}function envSlots(env){let slots=[],read=suffix=>env(suffix===void 0?"CLAUDE_CODE_OAUTH_TOKEN":`CLAUDE_CODE_OAUTH_TOKEN_${suffix}`),names=[{slot:"env"}];for(let index=2;index<=16;index++)names.push({suffix:String(index),slot:`env-${index}`});for(let{suffix,slot}of names)read(suffix)&&slots.push({name:slot,refresh:"",access:"",expires:0,source:"env"});return slots}function envSlotToken(env,slotName){let match=/^env(?:-(\d+))?$/.exec(slotName);if(!match)return;let suffix=match[1];return env(suffix===void 0?"CLAUDE_CODE_OAUTH_TOKEN":`CLAUDE_CODE_OAUTH_TOKEN_${suffix}`)}import{createHash}from"node:crypto";function usageShowsCapacity(limits,since,now){return limits.error!==void 0||limits.windows.length===0||Date.parse(limits.reportedAt)<=since?!1:limits.windows.every(window=>{if(window.usedPercent<100)return!0;let resetsAt=window.resetsAt===void 0?Number.NaN:Date.parse(window.resetsAt);return Number.isFinite(resetsAt)&&resetsAt<=now})}function accountsWithCapacity(snapshot,provider,since,now){return snapshot.filter(limits=>limits.provider===provider&&usageShowsCapacity(limits,since,now)).map(limits=>limits.account)}var DEFAULT_AFFINITY_KEY="claude-sdk-oauth-default";function describeAccountState(state){let until=state.until===void 0?"re-login":new Date(state.until).toISOString(),login=state.reason==="auth_error"?` (run /login anthropic-subscription for ${state.name})`:"";return`${state.name}: ${state.reason} until ${until}${login}`}var AllAccountsBlockedError=class extends Error{constructor(soonestUnblockAt2,blockReason,limitedModel2,unavailableAccount,accounts=[],rateLimitedUntil){let until=soonestUnblockAt2===void 0?void 0:new Date(soonestUnblockAt2).toISOString(),summary=limitedModel2!==void 0&&until!==void 0?`All Anthropic Subscription accounts have hit the usage limit for model ${limitedModel2} until ${until}.`:until===void 0?"All Anthropic Subscription accounts are blocked until re-login.":`All Anthropic Subscription accounts are blocked until ${until}.`;super(accounts.length===0?summary:`${summary} Accounts: ${accounts.map(describeAccountState).join("; ")}.`),this.accounts=accounts,this.limitedModel=limitedModel2,this.name="AllAccountsBlockedError",this.soonestUnblockAt=soonestUnblockAt2,this.blockReason=blockReason,this.unavailableAccount=unavailableAccount,this.rateLimitedUntil=rateLimitedUntil}};function getAffinityKey(options){return options.affinityKey??options.sessionId??DEFAULT_AFFINITY_KEY}function score(key,accountName){return createHash("sha256").update(`${key}\0${accountName}`).digest().readBigUInt64BE(0)}function rendezvousOrder(key,accounts){return[...accounts].map(account=>({account,score:score(key,account.name)})).sort((left,right)=>right.score>left.score?1:right.score<left.score?-1:0).map(({account})=>account)}function isAccountBlocked(account,now){return account.blockedUntil!==void 0&&account.blockedUntil>now}function isBlockedFor(account,now,model){return isAccountBlocked(account,now)||activeModelBlockUntil(account.modelBlocks,model,now)!==void 0}function isLimitLiftedEarly(account,now){if(account.blockReason!=="rate_limit"||account.blockedAt===void 0||account.blockedUntil===void 0||account.blockedUntil<=now)return!1;let limits=subscriptionLimits.snapshot().find(entry=>entry.provider==="anthropic-subscription"&&entry.account===account.name);return limits!==void 0&&usageShowsCapacity(limits,account.blockedAt,now)}function clearExpiredBlocks(accounts,now=Date.now()){return accounts.map(account=>{let available=account;if(account.blockReason!==void 0&&(account.blockedUntil===void 0||account.blockedUntil<=now)||isLimitLiftedEarly(account,now)){let{blockedUntil:_blockedUntil,blockReason:_blockReason,blockedAt:_blockedAt,authVerdict:_authVerdict,...rest2}=account;available=rest2}if(available.modelBlocks===void 0)return available;let{modelBlocks,...rest}=available,live=pruneModelBlocks(modelBlocks,now);return live===void 0?rest:{...rest,modelBlocks:live}})}function selectUnblocked(accounts,options,now,roundRobinOffset=0){let pinned=options.pinnedAccount===void 0?void 0:accounts.find(account=>account.name===options.pinnedAccount);if(pinned&&!isBlockedFor(pinned,now,options.model))return pinned;let preferred=options.preferredAccount===void 0?void 0:accounts.find(account=>account.name===options.preferredAccount),usable=orderAccounts(accounts,rendezvousOrder(getAffinityKey(options),accounts),options.accountOrder,options.accountStrategy,roundRobinOffset).filter(account=>!isBlockedFor(account,now,options.model));return preferHeadroom(usable,"anthropic-subscription",subscriptionLimits.snapshot(),now,preferred?.name)[0]}function unblockAt(account,now,model){let accountUntil=account.blockedUntil!==void 0&&account.blockedUntil>now?account.blockedUntil:void 0,modelUntil=activeModelBlockUntil(account.modelBlocks,model,now);return accountUntil===void 0?modelUntil:modelUntil===void 0?accountUntil:Math.max(accountUntil,modelUntil)}function soonestUnblockAt(accounts,now,model){let candidates=accounts.map(account=>unblockAt(account,now,model)).filter(value=>value!==void 0);return candidates.length===0?void 0:Math.min(...candidates)}var OUT_OF_POOL_REASONS=new Set(["billing","org_not_allowed","auth_error"]);function poolRateLimitedUntil(accounts,now,model){let waiting=accounts.filter(account=>!(isAccountBlocked(account,now)&&OUT_OF_POOL_REASONS.has(account.blockReason??""))),resets=[];for(let account of waiting){let rateLimited=isAccountBlocked(account,now)?account.blockReason==="rate_limit":activeModelBlockUntil(account.modelBlocks,model,now)!==void 0,until=unblockAt(account,now,model);if(!rateLimited||until===void 0)return;resets.push(until)}return resets.length===0?void 0:Math.min(...resets)}function limitedModel(accounts,now,model){return accounts.some(account=>!isAccountBlocked(account,now)&&activeModelBlockUntil(account.modelBlocks,model,now)!==void 0)?model:void 0}function selectAccount(accounts,requestedOptions={}){let roundRobin=requestedOptions.accountStrategy==="round-robin"?roundRobinState.session("anthropic-subscription",getAffinityKey(requestedOptions)):void 0,options=roundRobin?.account!==void 0&&requestedOptions.preferredAccount===void 0?{...requestedOptions,preferredAccount:roundRobin.account}:requestedOptions,now=options.now??Date.now(),candidates=accounts,unavailableAccount;if(options.accountFallback===!1){let name=options.pinnedAccount??options.preferredAccount??orderAccounts(accounts,rendezvousOrder(getAffinityKey(options),accounts),options.accountOrder,options.accountStrategy,roundRobin?.offset)[0]?.name;candidates=accounts.filter(account=>account.name===name);let pinnedBy=options.pinnedAccount!==void 0?options.pinSource:void 0;name!==void 0&&(unavailableAccount={name,configured:candidates.length>0,...pinnedBy===void 0?{}:{pinnedBy}})}let selected=selectUnblocked(candidates,options,now,roundRobin?.offset);if(selected)return roundRobin!==void 0&&(roundRobin.account=selected.name),selected;let cleared=clearExpiredBlocks(candidates,now),afterClear=selectUnblocked(cleared,options,now,roundRobin?.offset);if(afterClear)return roundRobin!==void 0&&(roundRobin.account=afterClear.name),afterClear;throw new AllAccountsBlockedError(soonestUnblockAt(candidates,now,options.model),candidates.length>0&&candidates.every(account=>account.blockReason==="auth_error")?"auth_error":void 0,limitedModel(candidates,now,options.model),unavailableAccount,candidates.map(account=>({name:account.name,reason:account.blockReason??(isAccountBlocked(account,now)?"blocked":"model_limit"),until:unblockAt(account,now,options.model)})),poolRateLimitedUntil(candidates,now,options.model))}import{randomBytes}from"node:crypto";import{chmodSync,constants,lstatSync,mkdirSync,readlinkSync,symlinkSync,unlinkSync}from"node:fs";import{lstat,mkdir,open,rm,unlink}from"node:fs/promises";import{homedir}from"node:os";import{join,resolve}from"node:path";import{spawn}from"node:child_process";function isClaudeOauthTokenName(name){return name==="CLAUDE_CODE_OAUTH_TOKEN"||/^CLAUDE_CODE_OAUTH_TOKEN_\d+$/.test(name)}function hasRequestOauthToken(requestEnvironment){return Object.entries(requestEnvironment??{}).some(([name,value])=>isClaudeOauthTokenName(name)&&!!value)}function mergeRequestAuthEnvironment(hostEnvironment,requestEnvironment){let environment={...hostEnvironment},requestTokens=Object.entries(requestEnvironment??{}).filter(([name])=>isClaudeOauthTokenName(name));if(requestTokens.length===0)return environment;for(let name of Object.keys(environment))isClaudeOauthTokenName(name)&&delete environment[name];for(let[name,value]of requestTokens)environment[name]=value;return environment}function stripManagedAuthEnvironment(parent){let{ANTHROPIC_API_KEY:_apiKey,ANTHROPIC_AUTH_TOKEN:_authToken,ANTHROPIC_BASE_URL:_gateway,ANTHROPIC_CUSTOM_HEADERS:_customHeaders,CLAUDE_CODE_OAUTH_TOKEN:_oauthToken,CLAUDE_CODE_USE_BEDROCK:_bedrock,CLAUDE_CODE_USE_FOUNDRY:_foundry,CLAUDE_CODE_USE_GATEWAY:_gatewayMode,CLAUDE_CODE_USE_VERTEX:_vertex,...environment}=parent;for(let name of Object.keys(environment))/^CLAUDE_CODE_OAUTH_TOKEN_\d+$/.test(name)&&delete environment[name],name.startsWith("SENPI_")&&delete environment[name];return environment}var HOST_REDIRECT_NAMES=["CLAUDE_SECURESTORAGE_CONFIG_DIR","CLAUDE_CONFIG_DIR","BROWSER"],INHERITED_CREDENTIAL_DESCRIPTORS=["CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR","CLAUDE_CODE_API_KEY_FILE_DESCRIPTOR"];function buildClaudeCliEnvironment(parent,options){let environment=stripManagedAuthEnvironment(parent);for(let name of[...HOST_REDIRECT_NAMES,...INHERITED_CREDENTIAL_DESCRIPTORS])delete environment[name];return environment.CLAUDE_CONFIG_DIR=options.configDir,environment.NO_COLOR="1",options.browser!==void 0&&(environment.BROWSER=options.browser),environment}function spawnClaudeCli(run,args,browser){return spawn(run.executable,[...args],{cwd:run.configDir,env:buildClaudeCliEnvironment(run.parentEnv??process.env,{configDir:run.configDir,...browser===void 0?{}:{browser}}),stdio:["pipe","pipe","pipe"],windowsHide:!0})}function stopClaudeCli(child,graceMs){if(child.exitCode!==null||child.signalCode!==null)return;signalSpawnedChild(child,"SIGTERM");let escalate=setTimeout(()=>signalSpawnedChild(child,"SIGKILL"),graceMs);escalate.unref?.(),child.once("close",()=>clearTimeout(escalate))}var DEFAULT_SHORT_COMMAND_TIMEOUT_MS=1e4;function runClaudeCliToExit(run,args,timeoutMs=DEFAULT_SHORT_COMMAND_TIMEOUT_MS,signal){return signal?.aborted?Promise.resolve(void 0):new Promise(resolve2=>{let child=spawnClaudeCli(run,args);child.stdin?.end();let stdout="";child.stdout?.setEncoding("utf8"),child.stdout?.on("data",chunk=>{stdout+=chunk}),child.stderr?.resume();let deadline=setTimeout(()=>{signalSpawnedChild(child,"SIGKILL"),resolve2(void 0)},timeoutMs);deadline.unref?.();let onAbort=()=>{clearTimeout(deadline),signalSpawnedChild(child,"SIGKILL"),resolve2(void 0)};signal?.addEventListener("abort",onAbort,{once:!0}),child.once("error",()=>{clearTimeout(deadline),signal?.removeEventListener("abort",onAbort),resolve2(void 0)}),child.once("close",exitCode=>{clearTimeout(deadline),signal?.removeEventListener("abort",onAbort),resolve2({exitCode,stdout})})})}function stringField(record,name){let value=record[name];return typeof value=="string"&&value.length>0?value:void 0}function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function parseClaudeCliAuthStatus(stdout,exitCode){let parsed;try{parsed=JSON.parse(stdout)}catch{return{state:"unreadable"}}if(!isRecord(parsed)||typeof parsed.loggedIn!="boolean")return{state:"unreadable"};if(!parsed.loggedIn)return exitCode===0?{state:"unreadable"}:{state:"signed_out"};if(exitCode!==0)return{state:"unreadable"};if(parsed.authMethod!=="claude.ai")return{state:"rejected",reason:"auth_method"};if(parsed.apiProvider!=="firstParty")return{state:"rejected",reason:"api_provider"};let email=stringField(parsed,"email"),orgName=stringField(parsed,"orgName"),subscriptionType=stringField(parsed,"subscriptionType");return{state:"signed_in",profile:{...email===void 0?{}:{email},...orgName===void 0?{}:{orgName},...subscriptionType===void 0?{}:{subscriptionType}}}}async function readClaudeCliAuthStatus(run,timeoutMs){let exit=await runClaudeCliToExit(run,["auth","status","--json"],timeoutMs);return exit===void 0?{state:"unreadable"}:parseClaudeCliAuthStatus(exit.stdout,exit.exitCode)}async function logoutClaudeCli(run,timeoutMs,signal){return(await runClaudeCliToExit(run,["auth","logout"],timeoutMs,signal))?.exitCode===0}var CLAUDE_CLI_SHARED_LINKS=["projects","settings.json","CLAUDE.md","agents","commands","skills","output-styles"],SHARED_FILES=new Set(["settings.json","CLAUDE.md"]),DIR_ID_PATTERN=/^[0-9a-f]{32}$/;function newAccountDirId(){return randomBytes(16).toString("hex")}function isValidAccountDirId(dirId){return DIR_ID_PATTERN.test(dirId)}function accountDirFor(agentDir,dirId){if(!isValidAccountDirId(dirId))throw new Error("Invalid Claude account dir id");return join(agentDir,"anthropic-subscription-claude",dirId)}async function readClaudeCliAccessToken(accountDir,now){let file=join(accountDir,".credentials.json"),parsed;try{let[dirStats,fileStats]=await Promise.all([lstat(accountDir),lstat(file)]);if(!dirStats.isDirectory()||!fileStats.isFile())return;let handle=await open(file,constants.O_RDONLY|(constants.O_NOFOLLOW??0));try{let opened=await handle.stat();if(!opened.isFile()||opened.ino!==fileStats.ino||opened.dev!==fileStats.dev)return;parsed=JSON.parse(await handle.readFile("utf8"))}finally{await handle.close()}let dirAfter=await lstat(accountDir);if(!dirAfter.isDirectory()||dirAfter.ino!==dirStats.ino||dirAfter.dev!==dirStats.dev)return}catch{return}let oauth=typeof parsed=="object"&&parsed!==null?parsed.claudeAiOauth:void 0;if(typeof oauth!="object"||oauth===null)return;let{accessToken,expiresAt}=oauth;if(!(typeof accessToken!="string"||accessToken==="")&&!(typeof expiresAt=="number"&&expiresAt<=now))return accessToken}function claudeCliSharedRoot(env){let inherited=env.CLAUDE_CONFIG_DIR;return inherited?resolve(inherited):join(homedir(),".claude")}function isLink(path){try{return lstatSync(path).isSymbolicLink()}catch{return!1}}function exists(path){try{return lstatSync(path),!0}catch{return!1}}async function lstatOrUndefined(path){try{return await lstat(path)}catch(error){if(error.code==="ENOENT")return;throw error}}function linkEntry(entry,target,path){if(!SHARED_FILES.has(entry)){mkdirSync(target,{recursive:!0}),symlinkSync(target,path,process.platform==="win32"?"junction":"dir");return}if(exists(target))try{symlinkSync(target,path,"file")}catch(error){if(process.platform!=="win32")throw error}}function ensureAccountDir(options){let accountDir=accountDirFor(options.agentDir,options.dirId);mkdirSync(accountDir,{recursive:!0,mode:448}),process.platform!=="win32"&&chmodSync(accountDir,448);for(let entry of CLAUDE_CLI_SHARED_LINKS){let path=join(accountDir,entry),target=join(options.sharedRoot,entry);if(isLink(path)){if(resolve(accountDir,readlinkSync(path))===resolve(target))continue;unlinkSync(path)}else if(exists(path))continue;linkEntry(entry,target,path)}return accountDir}async function removeAccountDir(options){let accountDir=accountDirFor(options.agentDir,options.dirId);if(options.signal?.throwIfAborted(),await lstatOrUndefined(accountDir)===void 0&&await mkdir(accountDir,{recursive:!0,mode:448}),!(await lstatOrUndefined(accountDir))?.isDirectory())return"not_an_account_dir";let signedOut=options.executable!==void 0&&await logoutClaudeCli({executable:options.executable,configDir:accountDir,...options.parentEnv===void 0?{}:{parentEnv:options.parentEnv}},void 0,options.signal).catch(()=>!1);options.signal?.throwIfAborted();for(let entry of CLAUDE_CLI_SHARED_LINKS){let path=join(accountDir,entry);(await lstatOrUndefined(path))?.isSymbolicLink()&&await unlink(path)}return await rm(accountDir,{recursive:!0,force:!0}),signedOut?"removed":"removed_without_sign_out"}import{readFileSync as readFileSync3,statSync}from"node:fs";import{createRequire}from"node:module";import{dirname as dirname2,posix as posix2,win32 as win322}from"node:path";import{createHash as createHash2,randomBytes as randomBytes2}from"crypto";import{chmodSync as chmodSync2,closeSync,constants as fsConstants,fchmodSync,fstatSync,lstatSync as lstatSync2,mkdirSync as mkdirSync2,openSync,readFileSync,readSync,renameSync,unlinkSync as unlinkSync2,writeFileSync}from"fs";import{tmpdir as osTmpdir}from"os";import{basename,join as join2}from"path";function tmpdir(){return process.env.CLAUDE_CODE_TMPDIR?process.env.CLAUDE_CODE_TMPDIR:process.platform==="darwin"?"/tmp":osTmpdir()}function safeTempBase(){let dir=join2(tmpdir(),process.platform==="win32"?"claude-agent-sdk":`claude-agent-sdk-${process.getuid?.()??0}`);if(typeof process.getuid=="function"){mkdirSync2(dir,{recursive:!0,mode:448});let uid=process.getuid(),st=lstatSync2(dir);if(!st.isDirectory())throw new Error(`Temp directory ${dir} is not a directory (may be an attacker-planted symlink). Refusing to use it.`);if(st.uid!==uid)throw new Error(`Temp directory ${dir} is owned by uid ${st.uid}, expected ${uid}. Refusing to use it \u2014 another user may have pre-created it.`);(st.mode&511)!==448&&chmodSync2(dir,448)}else try{mkdirSync2(dir,{recursive:!0,mode:448})}catch{}return dir}function isNoFileId(ino){return ino===0n||ino===-1n||ino===0xffffffffffffffffn||ino===1n<<64n}function isExtractedCopy(file,content){let fd,inoAtPath;try{if(typeof process.getuid=="function")fd=openSync(file,fsConstants.O_RDONLY|fsConstants.O_NOFOLLOW|fsConstants.O_NONBLOCK);else{let atPath=lstatSync2(file,{bigint:!0});if(!atPath.isFile())return!1;inoAtPath=atPath.ino,fd=openSync(file,"r")}let st=fstatSync(fd,{bigint:!0});if(!st.isFile()||Number(st.nlink)!==1||Number(st.size)!==content.length||inoAtPath!==void 0&&!isNoFileId(inoAtPath)&&!isNoFileId(st.ino)&&st.ino!==inoAtPath)return!1;let chunk=Buffer.allocUnsafe(1<<20),offset=0;for(;offset<content.length;){let n=readSync(fd,chunk,0,chunk.length,offset);if(n<=0||!chunk.subarray(0,n).equals(content.subarray(offset,offset+n)))return!1;offset+=n}return!0}catch{return!1}finally{fd!==void 0&&closeSync(fd)}}function extractFromBunfs(embeddedPath){if(!embeddedPath.includes("$bunfs")&&!embeddedPath.includes("~BUN"))return embeddedPath;try{let content=readFileSync(embeddedPath),hash=createHash2("sha256").update(content).digest("hex").slice(0,16),tmpDir=join2(safeTempBase(),`claude-agent-sdk-${hash}`),fileName=basename(embeddedPath),tmpPath=join2(tmpDir,fileName);if(mkdirSync2(tmpDir,{recursive:!0,mode:448}),!lstatSync2(tmpDir).isDirectory())throw new Error("The claude-agent-sdk-<hash> folder under the temp directory is a symlink or not a directory, possibly planted; delete it and restart");if(isExtractedCopy(tmpPath,content))return tmpPath;let tmpFile=join2(tmpDir,`${fileName}.tmp.${process.pid}.${randomBytes2(8).toString("hex")}`),fd=openSync(tmpFile,"wx",448),renamed=!1;try{try{writeFileSync(fd,content),fchmodSync(fd,493)}finally{closeSync(fd)}try{renameSync(tmpFile,tmpPath)}catch(e){if(e.code!=="EEXIST"&&e.code!=="EPERM"&&e.code!=="EBUSY")throw e;if(isExtractedCopy(tmpPath,content))return tmpPath;try{unlinkSync2(tmpPath)}catch(unlinkError){if(unlinkError.code!=="ENOENT")throw unlinkError}try{renameSync(tmpFile,tmpPath)}catch{if(isExtractedCopy(tmpPath,content))return tmpPath;throw e}}return renamed=!0,tmpPath}finally{if(!renamed)try{unlinkSync2(tmpFile)}catch{}}}catch(err){return console.warn(`[claude-agent-sdk] Failed to extract CLI from $bunfs: ${err.message}. Child processes cannot access $bunfs paths \u2014 the CLI will likely fail to start.`),embeddedPath}}import{posix,win32}from"node:path";var WIN32_BATCH_EXTENSIONS=new Set([".bat",".cmd"]),CMD_SHIM_NATIVE_TARGET=/"%~?dp0%?\\([^"%]+?\.exe)"/i;function nativeTargetOfBatchFile(batchPath,deps){let text=deps.readText?.(batchPath),match=text===void 0?null:CMD_SHIM_NATIVE_TARGET.exec(text);if(!match?.[1])return;let target=win32.join(win32.dirname(batchPath),match[1]);return deps.isFile(target)?target:void 0}var WIN32_DEFAULT_PATHEXT=".COM;.EXE;.BAT;.CMD";function namesToProbe(name,platform,pathext){return platform!=="win32"?[name]:(pathext??WIN32_DEFAULT_PATHEXT).split(";").filter(extension=>extension.length>0).map(extension=>extension.toLowerCase()).map(extension=>`${name}${extension}`)}function pathDirectories(platform,path){if(path===void 0)return[];let delimiter=platform==="win32"?";":":";return path.split(delimiter).map(entry=>platform==="win32"?entry.replace(/^"(.*)"$/,"$1"):entry).filter(entry=>entry.length>0)}function findExecutableOnPath(name,deps){let join5=deps.platform==="win32"?win32.join:posix.join,names=namesToProbe(name,deps.platform,deps.env("PATHEXT"));for(let directory of pathDirectories(deps.platform,deps.env("PATH")))for(let candidate of names){let path=join5(directory,candidate);if(!deps.isFile(path))continue;if(deps.platform!=="win32"||!WIN32_BATCH_EXTENSIONS.has(win32.extname(path).toLowerCase()))return path;let target=nativeTargetOfBatchFile(path,deps);if(target!==void 0)return target;deps.onSkip?.(path)}}import{execFileSync}from"node:child_process";import{readFileSync as readFileSync2}from"node:fs";import{dirname,join as join3}from"node:path";import{fileURLToPath}from"node:url";var VERSION_PATTERN=/(\d+)\.(\d+)\.(\d+)/,VERSION_PROBE_TIMEOUT_MS=5e3;function parseClaudeCodeVersion(text){let match=text===void 0?null:VERSION_PATTERN.exec(text);if(match)return[Number(match[1]),Number(match[2]),Number(match[3])]}function isNewerClaudeCodeVersion(candidate,baseline){let left=parseClaudeCodeVersion(candidate),right=parseClaudeCodeVersion(baseline);if(left===void 0||right===void 0)return!1;for(let index=0;index<3;index++)if(left[index]!==right[index])return left[index]>right[index];return!1}var probedVersions=new Map;function probeClaudeCodeVersion(executable){if(probedVersions.has(executable))return probedVersions.get(executable);let version;try{let output=execFileSync(executable,["--version"],{encoding:"utf8",timeout:VERSION_PROBE_TIMEOUT_MS,windowsHide:!0,stdio:["ignore","pipe","ignore"]});version=VERSION_PATTERN.exec(output)?.[0]}catch{version=void 0}return probedVersions.set(executable,version),version}function bundledClaudeCodeVersion(){try{let entry=fileURLToPath(import.meta.resolve("@anthropic-ai/claude-agent-sdk")),manifest=JSON.parse(readFileSync2(join3(dirname(entry),"package.json"),"utf8"));return typeof manifest!="object"||manifest===null||!("claudeCodeVersion"in manifest)?void 0:typeof manifest.claudeCodeVersion=="string"?manifest.claudeCodeVersion:void 0}catch{return}}function claudeCodeExecutableCandidates(platform,arch,preferMusl=!1){let ext=platform==="win32"?".exe":"";if(platform==="linux"){let glibc=`@anthropic-ai/claude-agent-sdk-linux-${arch}/claude${ext}`,musl=`@anthropic-ai/claude-agent-sdk-linux-${arch}-musl/claude${ext}`;return preferMusl?[musl,glibc]:[glibc,musl]}return[`@anthropic-ai/claude-agent-sdk-${platform}-${arch}/claude${ext}`]}function spawnableSpelling(platform,candidate){return platform==="win32"?win322.toNamespacedPath(win322.resolve(candidate)):posix2.resolve(candidate)}function describeClaudeCodeExecutable(deps){let tried=[],accept=candidate=>{let spelled=spawnableSpelling(deps.platform,candidate);return tried.push(spelled),deps.isFile(spelled)?spelled:void 0},done=(executable,source)=>({executable,source,tried}),override=deps.env("CLAUDE_CODE_EXECUTABLE");if(override){let accepted=accept(override);if(accepted!==void 0)return done(accepted,"override")}let candidates=claudeCodeExecutableCandidates(deps.platform,deps.arch,deps.platform==="linux"&&deps.isMusl?.()===!0),bundled=acceptBundled(deps,candidates,accept,tried);if(bundled!==void 0){let newer=newerClaudeOnPath(deps,bundled);return newer===void 0?done(bundled,"bundled"):(tried.push(newer),done(newer,"path"))}let onPath=findExecutableOnPath("claude",{...deps,onSkip:batchFile=>tried.push(`${batchFile} (batch file wrapping no native binary)`)});if(onPath!==void 0){let accepted=accept(onPath);if(accepted!==void 0)return done(accepted,"path")}else tried.push(deps.env("PATH")?"claude on PATH":"claude on PATH (PATH is unset)");return{executable:void 0,source:void 0,tried}}function acceptBundled(deps,candidates,accept,tried){if(deps.isCompiledBun?.()&&deps.extractFromBunfs)for(let candidate of candidates){let extracted;try{extracted=deps.extractFromBunfs(deps.resolve(candidate))}catch{continue}let accepted=accept(extracted);if(accepted!==void 0)return accepted}for(let candidate of candidates){let resolved;try{resolved=deps.resolve(candidate)}catch{tried.push(candidate);continue}let accepted=accept(resolved);if(accepted!==void 0)return accepted}let executableDir=deps.isCompiledBun?.()?deps.executableDir?.():void 0;if(executableDir!==void 0){let path=deps.platform==="win32"?win322:posix2;for(let candidate of candidates){let accepted=accept(path.join(executableDir,"node_modules",...candidate.split("/")));if(accepted!==void 0)return accepted}}}function newerClaudeOnPath(deps,bundled){let versionOf=deps.versionOf;if(versionOf===void 0)return;let onPath=findExecutableOnPath("claude",deps);if(onPath===void 0)return;let spelled=spawnableSpelling(deps.platform,onPath);if(spelled===bundled||!deps.isFile(spelled))return;let pathVersion=versionOf(spelled);if(pathVersion===void 0)return;let bundledVersion=deps.bundledVersion?.()??versionOf(bundled);return isNewerClaudeCodeVersion(pathVersion,bundledVersion)?spelled:void 0}function resolveClaudeCodeExecutable(deps){return resolveClaudeCodeRun(deps).executable}function resolveClaudeCodeRun(deps){let resolution=describeClaudeCodeExecutable(deps);if(resolution.executable!==void 0&&resolution.source!==void 0)return{executable:resolution.executable,source:resolution.source};throw new Error([`Claude Code executable not found for ${deps.platform}-${deps.arch}. Tried:`,...resolution.tried.map(candidate=>` - ${candidate}`),"Reinstall @anthropic-ai/claude-agent-sdk without --omit=optional, install Claude Code so `claude` is on PATH, or set CLAUDE_CODE_EXECUTABLE to the binary."].join(`
3
- `))}var defaultRequire=null,isCompiledBunBinary=import.meta.url.includes("$bunfs")||import.meta.url.includes("~BUN")||import.meta.url.includes("%7EBUN");function isMuslLinuxRuntime(){if(process.platform!=="linux"||typeof process.report?.getReport!="function")return!1;let report=process.report.getReport();return report===null||!("header"in report)||typeof report.header!="object"||report.header===null?!1:!("glibcVersionRuntime"in report.header)||report.header.glibcVersionRuntime===void 0}function readBatchFileText(path){try{return readFileSync3(path,"utf8")}catch{return}}function isRegularFile(path){try{return statSync(path).isFile()}catch{return!1}}var defaultDeps={platform:process.platform,arch:process.arch,env:name=>process.env[name],isFile:isRegularFile,readText:readBatchFileText,isMusl:isMuslLinuxRuntime,isCompiledBun:()=>isCompiledBunBinary,extractFromBunfs,bundledVersion:bundledClaudeCodeVersion,versionOf:probeClaudeCodeVersion,executableDir:()=>dirname2(process.execPath),resolve:spec=>(defaultRequire||(defaultRequire=createRequire(import.meta.resolve("@anthropic-ai/claude-agent-sdk"))),defaultRequire.resolve(spec))},activeDeps=defaultDeps;function defaultExecutableDeps(){return activeDeps}var NEEDS_USER=new Set(["auth_error","disabled"]);function accountsNeedingUser(summaries){return summaries.filter(account=>account.unused===!0||account.signedOut===!0||NEEDS_USER.has(account.blockedReason??"")).map(account=>account.name)}function accountCanServe(account,modelId,now){return account.blocked||account.signedOut===!0?!1:!(account.blockedModels??[]).some(block=>block.until>now&&modelBlockApplies(block.model,modelId))}function objectField(value,key){let found=Object.entries(value).find(([candidate])=>candidate===key)?.[1];return typeof found=="object"&&found!==null&&!Array.isArray(found)?found:void 0}function storedCheck(slot){let check=objectField(slot,"check");if(check===void 0)return;let model=stringField2(check,"model"),outcome=stringField2(check,"outcome"),at=numberField(check,"at");if(model===void 0||at===void 0||outcome!=="ok"&&outcome!=="failed")return;let reason=stringField2(check,"reason"),message=stringField2(check,"message"),status=numberField(check,"status");return{model,outcome,...reason===void 0?{}:{reason},...message===void 0?{}:{message},...status===void 0?{}:{status},at}}function claudeCliSlotFields(slot){if(stringField2(slot,"store")!=="claude-cli")return{};let profile=objectField(slot,"profile")??{},signedInAt=numberField(slot,"signedInAt"),email=stringField2(profile,"email"),orgName=stringField2(profile,"orgName"),subscriptionType=stringField2(profile,"subscriptionType"),check=storedCheck(slot);return{store:"claude-cli",...signedInAt===void 0?{}:{signedInAt},...email===void 0?{}:{email},...orgName===void 0?{}:{orgName},...subscriptionType===void 0?{}:{subscriptionType},...check===void 0?{}:{check},signIn:stringField2(slot,"signInRequired")===void 0?"signed_in":"needs_sign_in"}}var ACCOUNT_NAME_PATTERN2=/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/;function assertValidAccountName2(name){if(!ACCOUNT_NAME_PATTERN2.test(name))throw new Error(`Invalid account name '${name}': use letters, digits, '-' or '_', starting with a letter or digit`)}function selectedOAuthAccount(storage,provider,name){assertValidAccountName2(name);let credential=projectSlot(storage.get(provider),name);if(credential?.type!=="oauth")throw new Error(`OAuth account not found: ${name}`);return credential}function pooledFrom(credential){return credential===void 0?void 0:credential}function pinnedName(credential){return credential?.pinned}function numberField(value,key){let found=Object.entries(value).find(([candidate])=>candidate===key)?.[1];return typeof found=="number"?found:void 0}function credentialPoolRepository(storage){let authPath=storage.getStoragePath();return new CredentialSlotRepository(authPath?join4(dirname3(authPath),"credential-pool-state.json"):void 0)}function stringField2(value,key){let found=Object.entries(value).find(([candidate])=>candidate===key)?.[1];return typeof found=="string"?found:void 0}var UNBLOCKED={blocked:!1};function accountBlockedReason(reason){switch(reason){case"auth_error":case"rate_limit":return reason;case"account_disabled":return"disabled";default:return}}function liveBlock(reason,blockedUntil,now){let blockedReason=accountBlockedReason(reason);return blockedReason==="disabled"?{blocked:!0,blockedReason}:blockedUntil===void 0||blockedUntil<=now?UNBLOCKED:{blocked:!0,...blockedReason===void 0?{}:{blockedReason},blockedUntil}}function sidecarBlock(sidecar,now){return sidecar?.usageLimit?{blocked:!0,paused:!0,usageUrl:"https://chatgpt.com/settings/usage"}:sidecar===void 0||isAvailable(sidecar,now)?UNBLOCKED:liveBlock(sidecar?.blockReason,sidecar?.blockedUntil,now)}function storedSlotBlock(provider,slot,now){let blockReason=stringField2(slot,"blockReason"),blockedUntil=numberField(slot,"blockedUntil"),blockedReason=accountBlockedReason(blockReason);return blockedReason==="disabled"?{blocked:!0,blockedReason}:normalizeProviderId(provider)==="anthropic-subscription"&&isForeignAuthBlock(slot)||!(normalizeProviderId(provider)==="anthropic-subscription"?isAccountBlocked({blockedUntil},now)&&!isLimitLiftedEarly({name:stringField2(slot,"name")??"",blockReason,blockedAt:numberField(slot,"blockedAt"),blockedUntil},now):isSlotBlocked({blockReason,blockedUntil},now))?UNBLOCKED:{blocked:!0,...blockedReason===void 0?{}:{blockedReason},...blockedUntil===void 0||blockedUntil<=now?{}:{blockedUntil}}}function slotBlocked(provider,slot,sidecar,now){let fromSidecar=sidecarBlock(sidecar,now),lane=normalizeProviderId(provider);if(lane!=="cursor-cli-oauth"&&lane!=="anthropic-subscription")return fromSidecar;let fromSlot=storedSlotBlock(provider,slot,now);if(fromSlot.blockedReason==="disabled")return fromSlot;if(fromSidecar.blockedReason==="disabled"||!fromSlot.blocked)return fromSidecar;if(!fromSidecar.blocked||fromSlot.blockedUntil===void 0)return fromSlot;let later=(fromSlot.blockedUntil??0)>(fromSidecar.blockedUntil??0)?fromSlot:fromSidecar;return[fromSidecar,fromSlot].some(block=>block.blockedReason==="auth_error")?{...later,blockedReason:"auth_error"}:later}function storedModelBlocks(slot){let found=Object.entries(slot).find(([candidate])=>candidate==="modelBlocks")?.[1];if(found===null||typeof found!="object")return;let entries=Object.entries(found).flatMap(([model,block])=>{let until=block!==null&&typeof block=="object"?numberField(block,"blockedUntil"):void 0;return until===void 0?[]:[[model,{blockedUntil:until}]]});return entries.length===0?void 0:Object.fromEntries(entries)}function blockedModels(now,...sources){let until=new Map;for(let blocks of sources)for(let[model,block]of Object.entries(pruneModelBlocks(blocks,now)??{}))until.set(model,Math.max(until.get(model)??0,block.blockedUntil));return until.size===0?{}:{blockedModels:[...until].map(([model,at])=>({model,until:at}))}}async function getCredentialAccounts(storage,provider,env=process.env,repository,activeName){let accounts=await summarizeCredentialAccounts(provider,storage.get(provider),env,repository??credentialPoolRepository(storage));return normalizeProviderId(provider)!=="chatgpt-subscription"?accounts:accounts.map(account=>account.name===activeName&&!account.blocked&&!account.signedOut&&!account.unused?{...account,active:!0}:account)}async function summarizeCredentialAccounts(provider,stored,env=process.env,repository=new CredentialSlotRepository){let credential=pooledFrom(stored);return applyAccountOrder(credential?.order,await summarizeInStoredOrder(provider,credential,env,repository))}async function summarizeInStoredOrder(provider,credential,env,repository){let now=Date.now(),pinned=pinnedName(credential),summaries=[];if(credential){let state2=await repository.listSlots(provider,"stored"),isClaudeSubscription=normalizeProviderId(provider)==="anthropic-subscription",storedAccounts=isClaudeSubscription?Array.isArray(credential.accounts)?listSlots(credential).filter(isListedStoredSlot):[]:listSlots(credential),usable=new Set(slotsOfOwnKind(credential).map(slot=>slot.name));for(let slot of storedAccounts){let displayName=accountDisplayName(slot.displayName),persisted=state2[slot.name],revisions=await repository.storedSlotRevisions(provider,slot.name,{key:slot.key,access:slot.access,refresh:slot.refresh}),applicable=applicableStoredState(persisted,revisions);summaries.push({name:slot.name,...normalizeProviderId(provider)==="chatgpt-subscription"&&credential.type==="oauth"?{route:slot.route==="siwc"?"siwc":"legacy",...slot.route==="siwc"&&typeof slot.planUsageEnabled=="boolean"?{planUsageEnabled:slot.planUsageEnabled}:{},...slot.signedOut===!0?{signedOut:!0}:{}}:{},...displayName===void 0?{}:{displayName},source:slot.source??"login",...slotBlocked(provider,slot,applicable,now),pinned:pinned===slot.name,...blockedModels(now,applicable?.modelBlocks,storedModelBlocks(slot)),...usable.has(slot.name)?{}:{unused:!0},...isClaudeSubscription?claudeCliSlotFields(slot):{}})}if(normalizeProviderId(provider)!=="anthropic-subscription")return summaries}let state=await repository.listSlots(provider,"env");for(let slot of discoverEnvSlots(provider,name=>env[name])){let persisted=state[slot.name],revision=await repository.envCredentialRevision(slot.envVarName,slot.key),applicable=persisted?.credentialRevision===revision?persisted:void 0;summaries.push({name:slot.name,source:"env",...sidecarBlock(applicable,now),pinned:pinned===slot.name,...blockedModels(now,applicable?.modelBlocks)})}return summaries}async function renameCredentialAccount(storage,provider,name,displayName){await storage.modify(provider,async current=>{if(!current)throw new Error(`No stored credential for provider: ${provider}`);if(current.type==="oauth"&&!Array.isArray(current.accounts)&&current.access===current.refresh&&current.access.endsWith("-managed"))throw new Error(`Stored provider account not found: ${name}`);return renameSlotDisplayName(current,name,displayName)}),emitProviderAccountsChanged(provider)}async function pinCredentialAccount(storage,provider,name,env=process.env,repository){let repo=repository??credentialPoolRepository(storage);if(name!==null){assertValidAccountName2(name);let account=(await getCredentialAccounts(storage,provider,env,repo)).find(candidate=>candidate.name===name);if(!account)throw new Error(`Provider account not found: ${name}`);if(account.unused)throw new Error(`Account ${name} holds a login of the other kind and is never used, so it cannot be pinned. To switch ${provider} to it, save it again with /login.`)}await storage.modify(provider,async current=>{if(current===void 0){if(normalizeProviderId(provider)!=="anthropic-subscription"||name===null)throw new Error(`No stored credential for provider: ${provider}`);return pinSlot({type:"oauth",...SENTINEL_OAUTH_FIELDS,accounts:[]},name)}if(name===null){if(pinnedName(current)===void 0)return current;let{pinned:_pinned,...unpinned}={...current,pinned:void 0};return unpinned}return pinSlot(current,name)}),emitProviderAccountsChanged(provider)}async function removeCredentialAccount(storage,provider,name,env=process.env,repository){let repo=repository??credentialPoolRepository(storage),account=(await getCredentialAccounts(storage,provider,env,repo)).find(candidate=>candidate.name===name);if(!account)throw new Error(`Provider account not found: ${name}`);if(account.source==="env")throw new Error(`Environment provider account cannot be removed: ${name}`);let notice=await signOutAndDropSlot(storage,provider,name,env,repo);return emitProviderAccountsChanged(provider),notice===void 0?{}:{notice}}async function dropStoredSlot(storage,provider,name,repo){let removed=removeSlot(await storage.read(provider),name),remaining=removed===void 0?void 0:withoutOrderedAccount(removed,name);remaining===void 0?await storage.delete(provider):await storage.modify(provider,async()=>remaining),await repo.mutateSlotState(provider,"stored",name,()=>{})}async function pathExists(path){try{return await lstat2(path),!0}catch{return!1}}async function signOutAndDropSlot(storage,provider,name,env,repo,signal){let credential=await storage.read(provider);if(credential===void 0)throw new Error(`No stored credential for provider: ${provider}`);let notice;if(normalizeProviderId(provider)==="anthropic-subscription"){let accountDir=claudeCliAccountDir(storage,credential,name),dirExisted=accountDir!==void 0&&await pathExists(accountDir);try{notice=await signOutClaudeCliSlot(storage,credential,name,env,signal)}catch(error){throw dirExisted&&!await pathExists(accountDir)&&await dropStoredSlot(storage,provider,name,repo),error}}return await dropStoredSlot(storage,provider,name,repo),notice}async function signOutClaudeCliSlotsForLogout(storage,provider,env=process.env,signal,slotName){if(normalizeProviderId(provider)!=="anthropic-subscription")return[];let credential=await storage.read(provider);if(credential===void 0)return[];let repo=credentialPoolRepository(storage),notices=[],dropped=!1;try{for(let slot of listSlots(credential)){if(stringField2(slot,"store")!=="claude-cli"||slotName!==void 0&&slot.name!==slotName)continue;signal?.throwIfAborted();let notice=await signOutAndDropSlot(storage,provider,slot.name,env,repo,signal);dropped=!0,notice!==void 0&&notices.push(notice)}}finally{dropped&&emitProviderAccountsChanged(provider)}return notices}function claudeCliAgentDir(storage){let authPath=storage.getStoragePath();return authPath?dirname3(authPath):getAgentDir()}function claudeCliAccountDir(storage,credential,name){let slot=listSlots(credential).find(candidate=>candidate.name===name);if(slot===void 0||stringField2(slot,"store")!=="claude-cli")return;let dirId=stringField2(slot,"dirId");return dirId!==void 0&&isValidAccountDirId(dirId)?accountDirFor(claudeCliAgentDir(storage),dirId):void 0}async function signOutClaudeCliSlot(storage,credential,name,env,signal){let slot=listSlots(credential).find(candidate=>candidate.name===name);if(slot===void 0||stringField2(slot,"store")!=="claude-cli")return;let dirId=stringField2(slot,"dirId"),agentDir=claudeCliAgentDir(storage);if(dirId===void 0||!isValidAccountDirId(dirId))return`Removed Claude account ${name} without a Claude sign-out: it names no valid account dir.`;let executable;try{executable=resolveClaudeCodeExecutable({...defaultExecutableDeps(),env:key=>env[key]})}catch{executable=void 0}let outcome=await removeAccountDir({agentDir,dirId,executable,parentEnv:env,...signal===void 0?{}:{signal}});if(outcome!=="removed")return outcome==="removed_without_sign_out"?`Removed Claude account ${name}, but the Claude CLI sign-out could not run; its stored sign-in may remain in the Claude CLI's credential store.`:`Removed Claude account ${name} without a Claude sign-out: its account dir is a link or a file, left untouched at ${accountDirFor(agentDir,dirId)}.`}export{isEnvSlot,SENTINEL_OAUTH_FIELDS,emptyCredential,isListedStoredSlot,unusableStoredSlotCount,listAccounts,assertValidAccountName,pinAccount,envSlotToken,hasRequestOauthToken,mergeRequestAuthEnvironment,stripManagedAuthEnvironment,buildClaudeCliEnvironment,spawnClaudeCli,stopClaudeCli,readClaudeCliAuthStatus,logoutClaudeCli,CLAUDE_CLI_SHARED_LINKS,newAccountDirId,isValidAccountDirId,accountDirFor,readClaudeCliAccessToken,claudeCliSharedRoot,ensureAccountDir,removeAccountDir,accountsWithCapacity,AllAccountsBlockedError,isBlockedFor,clearExpiredBlocks,selectAccount,resolveClaudeCodeExecutable,resolveClaudeCodeRun,defaultExecutableDeps,accountsNeedingUser,accountCanServe,assertValidAccountName2,selectedOAuthAccount,credentialPoolRepository,getCredentialAccounts,summarizeCredentialAccounts,renameCredentialAccount,pinCredentialAccount,removeCredentialAccount,signOutClaudeCliSlotsForLogout};
2
+ import{emitProviderAccountsChanged,slotsOfOwnKind,subscriptionLimits}from"./chunk-GILDYS3O.js";import{signalSpawnedChild}from"./chunk-KLAX467B.js";import{discoverEnvSlots}from"./chunk-C4AHHZ6P.js";import{CredentialSlotRepository,applicableStoredState}from"./chunk-CEFKVI3E.js";import{roundRobinState}from"./chunk-WHQ2QPP5.js";import{applyAccountOrder,isAvailable,isSlotBlocked,orderAccounts,preferHeadroom,withoutOrderedAccount}from"./chunk-RLIY3AUC.js";import{activeModelBlockUntil,modelBlockApplies,pruneModelBlocks}from"./chunk-NJ43NBSP.js";import{accountDisplayName,listSlots,normalizeProviderId,pinSlot,projectSlot,removeSlot,renameSlotDisplayName}from"./chunk-OH5TKHW7.js";import{getAgentDir}from"./chunk-SODMQEHO.js";import{lstat as lstat2}from"node:fs/promises";import{dirname as dirname3,join as join4}from"node:path";function isForeignAuthBlock(slot){let fields=slot;if(fields.store!=="claude-cli"||fields.blockReason!=="auth_error"||fields.signInRequired==="login_expired")return!1;let verdict=fields.authVerdict;return verdict?.dirId!==fields.dirId||verdict?.at!==fields.blockedAt}function withoutForeignAuthBlock(slot){if(!isForeignAuthBlock(slot))return slot;let{blockedUntil:_until,blockReason:_reason,blockedAt:_at,authVerdict:_verdict,...rest}=slot;return rest}function isEnvSlot(slot){return slot.store===void 0}var SENTINEL_OAUTH_FIELDS={access:"claude-sdk-oauth-managed",refresh:"claude-sdk-oauth-managed",expires:41024448e5};function emptyCredential(){return{type:"oauth",...SENTINEL_OAUTH_FIELDS,accounts:[]}}function storedSlots(credential){return credential.accounts??[]}function isListedStoredSlot(slot){let candidate=slot,name=candidate.name;return candidate.store==="claude-cli"&&typeof name=="string"&&name.trim()!==""}function unusableStoredSlotCount(credential){if(credential===null||typeof credential!="object"||!("accounts"in credential))return 0;let stored=credential.accounts;return Array.isArray(stored)?stored.filter(slot=>slot!==null&&typeof slot=="object"&&slot.store==="claude-cli"&&!isListedStoredSlot(slot)).length:0}function listAccounts(credential,env){let slots=storedSlots(credential).filter(isListedStoredSlot).map(withoutForeignAuthBlock);if(env){let state=credential.slotState??{};for(let slot of envSlots(env)){let persisted=state[slot.name];slots.push(persisted?{...slot,...persisted}:slot)}}return slots}var ACCOUNT_NAME_PATTERN=/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/;function assertValidAccountName(name){if(!ACCOUNT_NAME_PATTERN.test(name))throw new Error(`Invalid account name '${name}': use letters, digits, '-' or '_', starting with a letter or digit`)}function pinAccount(credential,name){return{...credential,pinned:name}}function envSlots(env){let slots=[],read=suffix=>env(suffix===void 0?"CLAUDE_CODE_OAUTH_TOKEN":`CLAUDE_CODE_OAUTH_TOKEN_${suffix}`),names=[{slot:"env"}];for(let index=2;index<=16;index++)names.push({suffix:String(index),slot:`env-${index}`});for(let{suffix,slot}of names)read(suffix)&&slots.push({name:slot,refresh:"",access:"",expires:0,source:"env"});return slots}function envSlotToken(env,slotName){let match=/^env(?:-(\d+))?$/.exec(slotName);if(!match)return;let suffix=match[1];return env(suffix===void 0?"CLAUDE_CODE_OAUTH_TOKEN":`CLAUDE_CODE_OAUTH_TOKEN_${suffix}`)}import{createHash}from"node:crypto";function usageShowsCapacity(limits,since,now){return limits.error!==void 0||limits.windows.length===0||Date.parse(limits.reportedAt)<=since?!1:limits.windows.every(window=>{if(window.usedPercent<100)return!0;let resetsAt=window.resetsAt===void 0?Number.NaN:Date.parse(window.resetsAt);return Number.isFinite(resetsAt)&&resetsAt<=now})}function accountsWithCapacity(snapshot,provider,since,now){return snapshot.filter(limits=>limits.provider===provider&&usageShowsCapacity(limits,since,now)).map(limits=>limits.account)}var DEFAULT_AFFINITY_KEY="claude-sdk-oauth-default";function describeAccountState(state){let until=state.until===void 0?"re-login":new Date(state.until).toISOString(),login=state.reason==="auth_error"?` (run /login anthropic-subscription for ${state.name})`:"";return`${state.name}: ${state.reason} until ${until}${login}`}var AllAccountsBlockedError=class extends Error{constructor(soonestUnblockAt2,blockReason,limitedModel2,unavailableAccount,accounts=[],rateLimitedUntil){let until=soonestUnblockAt2===void 0?void 0:new Date(soonestUnblockAt2).toISOString(),summary=limitedModel2!==void 0&&until!==void 0?`All Anthropic Subscription accounts have hit the usage limit for model ${limitedModel2} until ${until}.`:until===void 0?"All Anthropic Subscription accounts are blocked until re-login.":`All Anthropic Subscription accounts are blocked until ${until}.`;super(accounts.length===0?summary:`${summary} Accounts: ${accounts.map(describeAccountState).join("; ")}.`),this.accounts=accounts,this.limitedModel=limitedModel2,this.name="AllAccountsBlockedError",this.soonestUnblockAt=soonestUnblockAt2,this.blockReason=blockReason,this.unavailableAccount=unavailableAccount,this.rateLimitedUntil=rateLimitedUntil}};function getAffinityKey(options){return options.affinityKey??options.sessionId??DEFAULT_AFFINITY_KEY}function score(key,accountName){return createHash("sha256").update(`${key}\0${accountName}`).digest().readBigUInt64BE(0)}function rendezvousOrder(key,accounts){return[...accounts].map(account=>({account,score:score(key,account.name)})).sort((left,right)=>right.score>left.score?1:right.score<left.score?-1:0).map(({account})=>account)}function isAccountBlocked(account,now){return account.blockedUntil!==void 0&&account.blockedUntil>now}function isBlockedFor(account,now,model){return isAccountBlocked(account,now)||activeModelBlockUntil(account.modelBlocks,model,now)!==void 0}function isLimitLiftedEarly(account,now){if(account.blockReason!=="rate_limit"||account.blockedAt===void 0||account.blockedUntil===void 0||account.blockedUntil<=now)return!1;let limits=subscriptionLimits.snapshot().find(entry=>entry.provider==="anthropic-subscription"&&entry.account===account.name);return limits!==void 0&&usageShowsCapacity(limits,account.blockedAt,now)}function clearExpiredBlocks(accounts,now=Date.now()){return accounts.map(account=>{let available=account;if(account.blockReason!==void 0&&(account.blockedUntil===void 0||account.blockedUntil<=now)||isLimitLiftedEarly(account,now)){let{blockedUntil:_blockedUntil,blockReason:_blockReason,blockedAt:_blockedAt,authVerdict:_authVerdict,...rest2}=account;available=rest2}if(available.modelBlocks===void 0)return available;let{modelBlocks,...rest}=available,live=pruneModelBlocks(modelBlocks,now);return live===void 0?rest:{...rest,modelBlocks:live}})}function selectUnblocked(accounts,options,now,roundRobinOffset=0){let pinned=options.pinnedAccount===void 0?void 0:accounts.find(account=>account.name===options.pinnedAccount);if(pinned&&!isBlockedFor(pinned,now,options.model))return pinned;let preferred=options.preferredAccount===void 0?void 0:accounts.find(account=>account.name===options.preferredAccount),usable=orderAccounts(accounts,rendezvousOrder(getAffinityKey(options),accounts),options.accountOrder,options.accountStrategy,roundRobinOffset).filter(account=>!isBlockedFor(account,now,options.model));return preferHeadroom(usable,"anthropic-subscription",subscriptionLimits.snapshot(),now,preferred?.name)[0]}function unblockAt(account,now,model){let accountUntil=account.blockedUntil!==void 0&&account.blockedUntil>now?account.blockedUntil:void 0,modelUntil=activeModelBlockUntil(account.modelBlocks,model,now);return accountUntil===void 0?modelUntil:modelUntil===void 0?accountUntil:Math.max(accountUntil,modelUntil)}function soonestUnblockAt(accounts,now,model){let candidates=accounts.map(account=>unblockAt(account,now,model)).filter(value=>value!==void 0);return candidates.length===0?void 0:Math.min(...candidates)}var OUT_OF_POOL_REASONS=new Set(["billing","org_not_allowed","auth_error"]);function poolRateLimitedUntil(accounts,now,model){let waiting=accounts.filter(account=>!(isAccountBlocked(account,now)&&OUT_OF_POOL_REASONS.has(account.blockReason??""))),resets=[];for(let account of waiting){let rateLimited=isAccountBlocked(account,now)?account.blockReason==="rate_limit":activeModelBlockUntil(account.modelBlocks,model,now)!==void 0,until=unblockAt(account,now,model);if(!rateLimited||until===void 0)return;resets.push(until)}return resets.length===0?void 0:Math.min(...resets)}function limitedModel(accounts,now,model){return accounts.some(account=>!isAccountBlocked(account,now)&&activeModelBlockUntil(account.modelBlocks,model,now)!==void 0)?model:void 0}function selectAccount(accounts,requestedOptions={}){let roundRobin=requestedOptions.accountStrategy==="round-robin"?roundRobinState.session("anthropic-subscription",getAffinityKey(requestedOptions)):void 0,options=roundRobin?.account!==void 0&&requestedOptions.preferredAccount===void 0?{...requestedOptions,preferredAccount:roundRobin.account}:requestedOptions,now=options.now??Date.now(),candidates=accounts,unavailableAccount;if(options.accountFallback===!1){let name=options.pinnedAccount??options.preferredAccount??orderAccounts(accounts,rendezvousOrder(getAffinityKey(options),accounts),options.accountOrder,options.accountStrategy,roundRobin?.offset)[0]?.name;candidates=accounts.filter(account=>account.name===name);let pinnedBy=options.pinnedAccount!==void 0?options.pinSource:void 0;name!==void 0&&(unavailableAccount={name,configured:candidates.length>0,...pinnedBy===void 0?{}:{pinnedBy}})}let selected=selectUnblocked(candidates,options,now,roundRobin?.offset);if(selected)return roundRobin!==void 0&&(roundRobin.account=selected.name),selected;let cleared=clearExpiredBlocks(candidates,now),afterClear=selectUnblocked(cleared,options,now,roundRobin?.offset);if(afterClear)return roundRobin!==void 0&&(roundRobin.account=afterClear.name),afterClear;throw new AllAccountsBlockedError(soonestUnblockAt(candidates,now,options.model),candidates.length>0&&candidates.every(account=>account.blockReason==="auth_error")?"auth_error":void 0,limitedModel(candidates,now,options.model),unavailableAccount,candidates.map(account=>({name:account.name,reason:account.blockReason??(isAccountBlocked(account,now)?"blocked":"model_limit"),until:unblockAt(account,now,options.model)})),poolRateLimitedUntil(candidates,now,options.model))}import{randomBytes}from"node:crypto";import{chmodSync,constants,lstatSync,mkdirSync,readlinkSync,symlinkSync,unlinkSync}from"node:fs";import{lstat,mkdir,open,rm,unlink}from"node:fs/promises";import{homedir}from"node:os";import{join,resolve}from"node:path";import{spawn}from"node:child_process";function isClaudeOauthTokenName(name){return name==="CLAUDE_CODE_OAUTH_TOKEN"||/^CLAUDE_CODE_OAUTH_TOKEN_\d+$/.test(name)}function hasRequestOauthToken(requestEnvironment){return Object.entries(requestEnvironment??{}).some(([name,value])=>isClaudeOauthTokenName(name)&&!!value)}function mergeRequestAuthEnvironment(hostEnvironment,requestEnvironment){let environment={...hostEnvironment},requestTokens=Object.entries(requestEnvironment??{}).filter(([name])=>isClaudeOauthTokenName(name));if(requestTokens.length===0)return environment;for(let name of Object.keys(environment))isClaudeOauthTokenName(name)&&delete environment[name];for(let[name,value]of requestTokens)environment[name]=value;return environment}function stripManagedAuthEnvironment(parent){let{ANTHROPIC_API_KEY:_apiKey,ANTHROPIC_AUTH_TOKEN:_authToken,ANTHROPIC_BASE_URL:_gateway,ANTHROPIC_CUSTOM_HEADERS:_customHeaders,CLAUDE_CODE_OAUTH_TOKEN:_oauthToken,CLAUDE_CODE_USE_BEDROCK:_bedrock,CLAUDE_CODE_USE_FOUNDRY:_foundry,CLAUDE_CODE_USE_GATEWAY:_gatewayMode,CLAUDE_CODE_USE_VERTEX:_vertex,...environment}=parent;for(let name of Object.keys(environment))/^CLAUDE_CODE_OAUTH_TOKEN_\d+$/.test(name)&&delete environment[name],name.startsWith("SENPI_")&&delete environment[name];return environment}var HOST_REDIRECT_NAMES=["CLAUDE_SECURESTORAGE_CONFIG_DIR","CLAUDE_CONFIG_DIR","BROWSER"],INHERITED_CREDENTIAL_DESCRIPTORS=["CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR","CLAUDE_CODE_API_KEY_FILE_DESCRIPTOR"];function buildClaudeCliEnvironment(parent,options){let environment=stripManagedAuthEnvironment(parent);for(let name of[...HOST_REDIRECT_NAMES,...INHERITED_CREDENTIAL_DESCRIPTORS])delete environment[name];return environment.CLAUDE_CONFIG_DIR=options.configDir,environment.NO_COLOR="1",options.browser!==void 0&&(environment.BROWSER=options.browser),environment}function spawnClaudeCli(run,args,browser){return spawn(run.executable,[...args],{cwd:run.configDir,env:buildClaudeCliEnvironment(run.parentEnv??process.env,{configDir:run.configDir,...browser===void 0?{}:{browser}}),stdio:["pipe","pipe","pipe"],windowsHide:!0})}function stopClaudeCli(child,graceMs){if(child.exitCode!==null||child.signalCode!==null)return;signalSpawnedChild(child,"SIGTERM");let escalate=setTimeout(()=>signalSpawnedChild(child,"SIGKILL"),graceMs);escalate.unref?.(),child.once("close",()=>clearTimeout(escalate))}var DEFAULT_SHORT_COMMAND_TIMEOUT_MS=1e4;function runClaudeCliToExit(run,args,timeoutMs=DEFAULT_SHORT_COMMAND_TIMEOUT_MS,signal){return signal?.aborted?Promise.resolve(void 0):new Promise(resolve2=>{let child=spawnClaudeCli(run,args);child.stdin?.end();let stdout="";child.stdout?.setEncoding("utf8"),child.stdout?.on("data",chunk=>{stdout+=chunk}),child.stderr?.resume();let deadline=setTimeout(()=>{signalSpawnedChild(child,"SIGKILL"),resolve2(void 0)},timeoutMs);deadline.unref?.();let onAbort=()=>{clearTimeout(deadline),signalSpawnedChild(child,"SIGKILL"),resolve2(void 0)};signal?.addEventListener("abort",onAbort,{once:!0}),child.once("error",()=>{clearTimeout(deadline),signal?.removeEventListener("abort",onAbort),resolve2(void 0)}),child.once("close",exitCode=>{clearTimeout(deadline),signal?.removeEventListener("abort",onAbort),resolve2({exitCode,stdout})})})}function stringField(record,name){let value=record[name];return typeof value=="string"&&value.length>0?value:void 0}function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function parseClaudeCliAuthStatus(stdout,exitCode){let parsed;try{parsed=JSON.parse(stdout)}catch{return{state:"unreadable"}}if(!isRecord(parsed)||typeof parsed.loggedIn!="boolean")return{state:"unreadable"};if(!parsed.loggedIn)return exitCode===0?{state:"unreadable"}:{state:"signed_out"};if(exitCode!==0)return{state:"unreadable"};if(parsed.authMethod!=="claude.ai")return{state:"rejected",reason:"auth_method"};if(parsed.apiProvider!=="firstParty")return{state:"rejected",reason:"api_provider"};let email=stringField(parsed,"email"),orgName=stringField(parsed,"orgName"),subscriptionType=stringField(parsed,"subscriptionType");return{state:"signed_in",profile:{...email===void 0?{}:{email},...orgName===void 0?{}:{orgName},...subscriptionType===void 0?{}:{subscriptionType}}}}async function readClaudeCliAuthStatus(run,timeoutMs){let exit=await runClaudeCliToExit(run,["auth","status","--json"],timeoutMs);return exit===void 0?{state:"unreadable"}:parseClaudeCliAuthStatus(exit.stdout,exit.exitCode)}async function logoutClaudeCli(run,timeoutMs,signal){return(await runClaudeCliToExit(run,["auth","logout"],timeoutMs,signal))?.exitCode===0}var CLAUDE_CLI_SHARED_LINKS=["projects","settings.json","CLAUDE.md","agents","commands","skills","output-styles"],SHARED_FILES=new Set(["settings.json","CLAUDE.md"]),DIR_ID_PATTERN=/^[0-9a-f]{32}$/;function newAccountDirId(){return randomBytes(16).toString("hex")}function isValidAccountDirId(dirId){return DIR_ID_PATTERN.test(dirId)}function accountDirFor(agentDir,dirId){if(!isValidAccountDirId(dirId))throw new Error("Invalid Claude account dir id");return join(agentDir,"anthropic-subscription-claude",dirId)}async function readClaudeCliAccessToken(accountDir,now){let file=join(accountDir,".credentials.json"),parsed;try{let[dirStats,fileStats]=await Promise.all([lstat(accountDir),lstat(file)]);if(!dirStats.isDirectory()||!fileStats.isFile())return;let handle=await open(file,constants.O_RDONLY|(constants.O_NOFOLLOW??0));try{let opened=await handle.stat();if(!opened.isFile()||opened.ino!==fileStats.ino||opened.dev!==fileStats.dev)return;parsed=JSON.parse(await handle.readFile("utf8"))}finally{await handle.close()}let dirAfter=await lstat(accountDir);if(!dirAfter.isDirectory()||dirAfter.ino!==dirStats.ino||dirAfter.dev!==dirStats.dev)return}catch{return}let oauth=typeof parsed=="object"&&parsed!==null?parsed.claudeAiOauth:void 0;if(typeof oauth!="object"||oauth===null)return;let{accessToken,expiresAt}=oauth;if(!(typeof accessToken!="string"||accessToken==="")&&!(typeof expiresAt=="number"&&expiresAt<=now))return accessToken}function claudeCliSharedRoot(env){let inherited=env.CLAUDE_CONFIG_DIR;return inherited?resolve(inherited):join(homedir(),".claude")}function isLink(path){try{return lstatSync(path).isSymbolicLink()}catch{return!1}}function exists(path){try{return lstatSync(path),!0}catch{return!1}}async function lstatOrUndefined(path){try{return await lstat(path)}catch(error){if(error.code==="ENOENT")return;throw error}}function linkEntry(entry,target,path){if(!SHARED_FILES.has(entry)){mkdirSync(target,{recursive:!0}),symlinkSync(target,path,process.platform==="win32"?"junction":"dir");return}if(exists(target))try{symlinkSync(target,path,"file")}catch(error){if(process.platform!=="win32")throw error}}function ensureAccountDir(options){let accountDir=accountDirFor(options.agentDir,options.dirId);mkdirSync(accountDir,{recursive:!0,mode:448}),process.platform!=="win32"&&chmodSync(accountDir,448);for(let entry of CLAUDE_CLI_SHARED_LINKS){let path=join(accountDir,entry),target=join(options.sharedRoot,entry);if(isLink(path)){if(resolve(accountDir,readlinkSync(path))===resolve(target))continue;unlinkSync(path)}else if(exists(path))continue;linkEntry(entry,target,path)}return accountDir}async function removeAccountDir(options){let accountDir=accountDirFor(options.agentDir,options.dirId);if(options.signal?.throwIfAborted(),await lstatOrUndefined(accountDir)===void 0&&await mkdir(accountDir,{recursive:!0,mode:448}),!(await lstatOrUndefined(accountDir))?.isDirectory())return"not_an_account_dir";let signedOut=options.executable!==void 0&&await logoutClaudeCli({executable:options.executable,configDir:accountDir,...options.parentEnv===void 0?{}:{parentEnv:options.parentEnv}},void 0,options.signal).catch(()=>!1);options.signal?.throwIfAborted();for(let entry of CLAUDE_CLI_SHARED_LINKS){let path=join(accountDir,entry);(await lstatOrUndefined(path))?.isSymbolicLink()&&await unlink(path)}return await rm(accountDir,{recursive:!0,force:!0}),signedOut?"removed":"removed_without_sign_out"}import{readFileSync as readFileSync3,statSync}from"node:fs";import{createRequire}from"node:module";import{dirname as dirname2,posix as posix2,win32 as win322}from"node:path";import{createHash as createHash2,randomBytes as randomBytes2}from"crypto";import{chmodSync as chmodSync2,closeSync,constants as fsConstants,fchmodSync,fstatSync,lstatSync as lstatSync2,mkdirSync as mkdirSync2,openSync,readFileSync,readSync,renameSync,unlinkSync as unlinkSync2,writeFileSync}from"fs";import{tmpdir as osTmpdir}from"os";import{basename,join as join2}from"path";function tmpdir(){return process.env.CLAUDE_CODE_TMPDIR?process.env.CLAUDE_CODE_TMPDIR:process.platform==="darwin"?"/tmp":osTmpdir()}function safeTempBase(){let dir=join2(tmpdir(),process.platform==="win32"?"claude-agent-sdk":`claude-agent-sdk-${process.getuid?.()??0}`);if(typeof process.getuid=="function"){mkdirSync2(dir,{recursive:!0,mode:448});let uid=process.getuid(),st=lstatSync2(dir);if(!st.isDirectory())throw new Error(`Temp directory ${dir} is not a directory (may be an attacker-planted symlink). Refusing to use it.`);if(st.uid!==uid)throw new Error(`Temp directory ${dir} is owned by uid ${st.uid}, expected ${uid}. Refusing to use it \u2014 another user may have pre-created it.`);(st.mode&511)!==448&&chmodSync2(dir,448)}else try{mkdirSync2(dir,{recursive:!0,mode:448})}catch{}return dir}function isNoFileId(ino){return ino===0n||ino===-1n||ino===0xffffffffffffffffn||ino===1n<<64n}function isExtractedCopy(file,content){let fd,inoAtPath;try{if(typeof process.getuid=="function")fd=openSync(file,fsConstants.O_RDONLY|fsConstants.O_NOFOLLOW|fsConstants.O_NONBLOCK);else{let atPath=lstatSync2(file,{bigint:!0});if(!atPath.isFile())return!1;inoAtPath=atPath.ino,fd=openSync(file,"r")}let st=fstatSync(fd,{bigint:!0});if(!st.isFile()||Number(st.nlink)!==1||Number(st.size)!==content.length||inoAtPath!==void 0&&!isNoFileId(inoAtPath)&&!isNoFileId(st.ino)&&st.ino!==inoAtPath)return!1;let chunk=Buffer.allocUnsafe(1<<20),offset=0;for(;offset<content.length;){let n=readSync(fd,chunk,0,chunk.length,offset);if(n<=0||!chunk.subarray(0,n).equals(content.subarray(offset,offset+n)))return!1;offset+=n}return!0}catch{return!1}finally{fd!==void 0&&closeSync(fd)}}function extractFromBunfs(embeddedPath){if(!embeddedPath.includes("$bunfs")&&!embeddedPath.includes("~BUN"))return embeddedPath;try{let content=readFileSync(embeddedPath),hash=createHash2("sha256").update(content).digest("hex").slice(0,16),tmpDir=join2(safeTempBase(),`claude-agent-sdk-${hash}`),fileName=basename(embeddedPath),tmpPath=join2(tmpDir,fileName);if(mkdirSync2(tmpDir,{recursive:!0,mode:448}),!lstatSync2(tmpDir).isDirectory())throw new Error("The claude-agent-sdk-<hash> folder under the temp directory is a symlink or not a directory, possibly planted; delete it and restart");if(isExtractedCopy(tmpPath,content))return tmpPath;let tmpFile=join2(tmpDir,`${fileName}.tmp.${process.pid}.${randomBytes2(8).toString("hex")}`),fd=openSync(tmpFile,"wx",448),renamed=!1;try{try{writeFileSync(fd,content),fchmodSync(fd,493)}finally{closeSync(fd)}try{renameSync(tmpFile,tmpPath)}catch(e){if(e.code!=="EEXIST"&&e.code!=="EPERM"&&e.code!=="EBUSY")throw e;if(isExtractedCopy(tmpPath,content))return tmpPath;try{unlinkSync2(tmpPath)}catch(unlinkError){if(unlinkError.code!=="ENOENT")throw unlinkError}try{renameSync(tmpFile,tmpPath)}catch{if(isExtractedCopy(tmpPath,content))return tmpPath;throw e}}return renamed=!0,tmpPath}finally{if(!renamed)try{unlinkSync2(tmpFile)}catch{}}}catch(err){return console.warn(`[claude-agent-sdk] Failed to extract CLI from $bunfs: ${err.message}. Child processes cannot access $bunfs paths \u2014 the CLI will likely fail to start.`),embeddedPath}}import{posix,win32}from"node:path";var WIN32_BATCH_EXTENSIONS=new Set([".bat",".cmd"]),CMD_SHIM_NATIVE_TARGET=/"%~?dp0%?\\([^"%]+?\.exe)"/i;function nativeTargetOfBatchFile(batchPath,deps){let text=deps.readText?.(batchPath),match=text===void 0?null:CMD_SHIM_NATIVE_TARGET.exec(text);if(!match?.[1])return;let target=win32.join(win32.dirname(batchPath),match[1]);return deps.isFile(target)?target:void 0}var WIN32_DEFAULT_PATHEXT=".COM;.EXE;.BAT;.CMD";function namesToProbe(name,platform,pathext){return platform!=="win32"?[name]:(pathext??WIN32_DEFAULT_PATHEXT).split(";").filter(extension=>extension.length>0).map(extension=>extension.toLowerCase()).map(extension=>`${name}${extension}`)}function pathDirectories(platform,path){if(path===void 0)return[];let delimiter=platform==="win32"?";":":";return path.split(delimiter).map(entry=>platform==="win32"?entry.replace(/^"(.*)"$/,"$1"):entry).filter(entry=>entry.length>0)}function findExecutableOnPath(name,deps){let join5=deps.platform==="win32"?win32.join:posix.join,names=namesToProbe(name,deps.platform,deps.env("PATHEXT"));for(let directory of pathDirectories(deps.platform,deps.env("PATH")))for(let candidate of names){let path=join5(directory,candidate);if(!deps.isFile(path))continue;if(deps.platform!=="win32"||!WIN32_BATCH_EXTENSIONS.has(win32.extname(path).toLowerCase()))return path;let target=nativeTargetOfBatchFile(path,deps);if(target!==void 0)return target;deps.onSkip?.(path)}}import{execFileSync}from"node:child_process";import{readFileSync as readFileSync2}from"node:fs";import{dirname,join as join3}from"node:path";import{fileURLToPath}from"node:url";var VERSION_PATTERN=/(\d+)\.(\d+)\.(\d+)/,VERSION_PROBE_TIMEOUT_MS=5e3;function parseClaudeCodeVersion(text){let match=text===void 0?null:VERSION_PATTERN.exec(text);if(match)return[Number(match[1]),Number(match[2]),Number(match[3])]}function isNewerClaudeCodeVersion(candidate,baseline){let left=parseClaudeCodeVersion(candidate),right=parseClaudeCodeVersion(baseline);if(left===void 0||right===void 0)return!1;for(let index=0;index<3;index++)if(left[index]!==right[index])return left[index]>right[index];return!1}var probedVersions=new Map;function probeClaudeCodeVersion(executable){if(probedVersions.has(executable))return probedVersions.get(executable);let version;try{let output=execFileSync(executable,["--version"],{encoding:"utf8",timeout:VERSION_PROBE_TIMEOUT_MS,windowsHide:!0,stdio:["ignore","pipe","ignore"]});version=VERSION_PATTERN.exec(output)?.[0]}catch{version=void 0}return probedVersions.set(executable,version),version}function bundledClaudeCodeVersion(){try{let entry=fileURLToPath(import.meta.resolve("@anthropic-ai/claude-agent-sdk")),manifest=JSON.parse(readFileSync2(join3(dirname(entry),"package.json"),"utf8"));return typeof manifest!="object"||manifest===null||!("claudeCodeVersion"in manifest)?void 0:typeof manifest.claudeCodeVersion=="string"?manifest.claudeCodeVersion:void 0}catch{return}}function claudeCodeExecutableCandidates(platform,arch,preferMusl=!1){let ext=platform==="win32"?".exe":"";if(platform==="linux"){let glibc=`@anthropic-ai/claude-agent-sdk-linux-${arch}/claude${ext}`,musl=`@anthropic-ai/claude-agent-sdk-linux-${arch}-musl/claude${ext}`;return preferMusl?[musl,glibc]:[glibc,musl]}return[`@anthropic-ai/claude-agent-sdk-${platform}-${arch}/claude${ext}`]}function spawnableSpelling(platform,candidate){return platform==="win32"?win322.toNamespacedPath(win322.resolve(candidate)):posix2.resolve(candidate)}function describeClaudeCodeExecutable(deps){let tried=[],accept=candidate=>{let spelled=spawnableSpelling(deps.platform,candidate);return tried.push(spelled),deps.isFile(spelled)?spelled:void 0},done=(executable,source)=>({executable,source,tried}),override=deps.env("CLAUDE_CODE_EXECUTABLE");if(override){let accepted=accept(override);if(accepted!==void 0)return done(accepted,"override")}let candidates=claudeCodeExecutableCandidates(deps.platform,deps.arch,deps.platform==="linux"&&deps.isMusl?.()===!0),bundled=acceptBundled(deps,candidates,accept,tried);if(bundled!==void 0){let newer=newerClaudeOnPath(deps,bundled);return newer===void 0?done(bundled,"bundled"):(tried.push(newer),done(newer,"path"))}let onPath=findExecutableOnPath("claude",{...deps,onSkip:batchFile=>tried.push(`${batchFile} (batch file wrapping no native binary)`)});if(onPath!==void 0){let accepted=accept(onPath);if(accepted!==void 0)return done(accepted,"path")}else tried.push(deps.env("PATH")?"claude on PATH":"claude on PATH (PATH is unset)");return{executable:void 0,source:void 0,tried}}function acceptBundled(deps,candidates,accept,tried){if(deps.isCompiledBun?.()&&deps.extractFromBunfs)for(let candidate of candidates){let extracted;try{extracted=deps.extractFromBunfs(deps.resolve(candidate))}catch{continue}let accepted=accept(extracted);if(accepted!==void 0)return accepted}for(let candidate of candidates){let resolved;try{resolved=deps.resolve(candidate)}catch{tried.push(candidate);continue}let accepted=accept(resolved);if(accepted!==void 0)return accepted}let executableDir=deps.isCompiledBun?.()?deps.executableDir?.():void 0;if(executableDir!==void 0){let path=deps.platform==="win32"?win322:posix2;for(let candidate of candidates){let accepted=accept(path.join(executableDir,"node_modules",...candidate.split("/")));if(accepted!==void 0)return accepted}}}function newerClaudeOnPath(deps,bundled){let versionOf=deps.versionOf;if(versionOf===void 0)return;let onPath=findExecutableOnPath("claude",deps);if(onPath===void 0)return;let spelled=spawnableSpelling(deps.platform,onPath);if(spelled===bundled||!deps.isFile(spelled))return;let pathVersion=versionOf(spelled);if(pathVersion===void 0)return;let bundledVersion=deps.bundledVersion?.()??versionOf(bundled);return isNewerClaudeCodeVersion(pathVersion,bundledVersion)?spelled:void 0}function resolveClaudeCodeExecutable(deps){return resolveClaudeCodeRun(deps).executable}function resolveClaudeCodeRun(deps){let resolution=describeClaudeCodeExecutable(deps);if(resolution.executable!==void 0&&resolution.source!==void 0)return{executable:resolution.executable,source:resolution.source};throw new Error([`Claude Code executable not found for ${deps.platform}-${deps.arch}. Tried:`,...resolution.tried.map(candidate=>` - ${candidate}`),"Reinstall @anthropic-ai/claude-agent-sdk without --omit=optional, install Claude Code so `claude` is on PATH, or set CLAUDE_CODE_EXECUTABLE to the binary."].join(`
3
+ `))}var defaultRequire=null,isCompiledBunBinary=import.meta.url.includes("$bunfs")||import.meta.url.includes("~BUN")||import.meta.url.includes("%7EBUN");function isMuslLinuxRuntime(){if(process.platform!=="linux"||typeof process.report?.getReport!="function")return!1;let report=process.report.getReport();return report===null||!("header"in report)||typeof report.header!="object"||report.header===null?!1:!("glibcVersionRuntime"in report.header)||report.header.glibcVersionRuntime===void 0}function readBatchFileText(path){try{return readFileSync3(path,"utf8")}catch{return}}function isRegularFile(path){try{return statSync(path).isFile()}catch{return!1}}var defaultDeps={platform:process.platform,arch:process.arch,env:name=>process.env[name],isFile:isRegularFile,readText:readBatchFileText,isMusl:isMuslLinuxRuntime,isCompiledBun:()=>isCompiledBunBinary,extractFromBunfs,bundledVersion:bundledClaudeCodeVersion,versionOf:probeClaudeCodeVersion,executableDir:()=>dirname2(process.execPath),resolve:spec=>(defaultRequire||(defaultRequire=createRequire(import.meta.resolve("@anthropic-ai/claude-agent-sdk"))),defaultRequire.resolve(spec))},activeDeps=defaultDeps;function defaultExecutableDeps(){return activeDeps}function accountsNeedingUser(summaries){return summaries.filter(account=>account.unused===!0||account.signedOut===!0||account.blocked&&account.blockedReason!=="rate_limit"&&account.paused!==!0).map(account=>account.name)}function accountCanServe(account,modelId,now){return account.blocked||account.signedOut===!0?!1:!(account.blockedModels??[]).some(block=>block.until>now&&modelBlockApplies(block.model,modelId))}function objectField(value,key){let found=Object.entries(value).find(([candidate])=>candidate===key)?.[1];return typeof found=="object"&&found!==null&&!Array.isArray(found)?found:void 0}function storedCheck(slot){let check=objectField(slot,"check");if(check===void 0)return;let model=stringField2(check,"model"),outcome=stringField2(check,"outcome"),at=numberField(check,"at");if(model===void 0||at===void 0||outcome!=="ok"&&outcome!=="failed")return;let reason=stringField2(check,"reason"),message=stringField2(check,"message"),status=numberField(check,"status");return{model,outcome,...reason===void 0?{}:{reason},...message===void 0?{}:{message},...status===void 0?{}:{status},at}}function claudeCliSlotFields(slot){if(stringField2(slot,"store")!=="claude-cli")return{};let profile=objectField(slot,"profile")??{},signedInAt=numberField(slot,"signedInAt"),email=stringField2(profile,"email"),orgName=stringField2(profile,"orgName"),subscriptionType=stringField2(profile,"subscriptionType"),check=storedCheck(slot);return{store:"claude-cli",...signedInAt===void 0?{}:{signedInAt},...email===void 0?{}:{email},...orgName===void 0?{}:{orgName},...subscriptionType===void 0?{}:{subscriptionType},...check===void 0?{}:{check},signIn:stringField2(slot,"signInRequired")===void 0?"signed_in":"needs_sign_in"}}var ACCOUNT_NAME_PATTERN2=/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/;function assertValidAccountName2(name){if(!ACCOUNT_NAME_PATTERN2.test(name))throw new Error(`Invalid account name '${name}': use letters, digits, '-' or '_', starting with a letter or digit`)}function selectedOAuthAccount(storage,provider,name){assertValidAccountName2(name);let credential=projectSlot(storage.get(provider),name);if(credential?.type!=="oauth")throw new Error(`OAuth account not found: ${name}`);return credential}function pooledFrom(credential){return credential===void 0?void 0:credential}function pinnedName(credential){return credential?.pinned}function numberField(value,key){let found=Object.entries(value).find(([candidate])=>candidate===key)?.[1];return typeof found=="number"?found:void 0}function credentialPoolRepository(storage){let authPath=storage.getStoragePath();return new CredentialSlotRepository(authPath?join4(dirname3(authPath),"credential-pool-state.json"):void 0)}function stringField2(value,key){let found=Object.entries(value).find(([candidate])=>candidate===key)?.[1];return typeof found=="string"?found:void 0}var UNBLOCKED={blocked:!1};function accountBlockedReason(reason){switch(reason){case"auth_error":case"rate_limit":return reason;case"account_disabled":return"disabled";default:return}}function liveBlock(reason,blockedUntil,now){let blockedReason=accountBlockedReason(reason);return blockedReason==="disabled"?{blocked:!0,blockedReason}:blockedUntil===void 0||blockedUntil<=now?UNBLOCKED:{blocked:!0,...blockedReason===void 0?{}:{blockedReason},blockedUntil}}function sidecarBlock(sidecar,now){return sidecar?.usageLimit?{blocked:!0,paused:!0,usageUrl:"https://chatgpt.com/settings/usage"}:sidecar===void 0||isAvailable(sidecar,now)?UNBLOCKED:liveBlock(sidecar?.blockReason,sidecar?.blockedUntil,now)}function storedSlotBlock(provider,slot,now){let blockReason=stringField2(slot,"blockReason"),blockedUntil=numberField(slot,"blockedUntil"),blockedReason=accountBlockedReason(blockReason);return blockedReason==="disabled"?{blocked:!0,blockedReason}:normalizeProviderId(provider)==="anthropic-subscription"&&isForeignAuthBlock(slot)||!(normalizeProviderId(provider)==="anthropic-subscription"?isAccountBlocked({blockedUntil},now)&&!isLimitLiftedEarly({name:stringField2(slot,"name")??"",blockReason,blockedAt:numberField(slot,"blockedAt"),blockedUntil},now):isSlotBlocked({blockReason,blockedUntil},now))?UNBLOCKED:{blocked:!0,...blockedReason===void 0?{}:{blockedReason},...blockedUntil===void 0||blockedUntil<=now?{}:{blockedUntil}}}function slotBlocked(provider,slot,sidecar,now){let fromSidecar=sidecarBlock(sidecar,now),lane=normalizeProviderId(provider);if(lane!=="cursor-cli-oauth"&&lane!=="anthropic-subscription")return fromSidecar;let fromSlot=storedSlotBlock(provider,slot,now);if(fromSlot.blockedReason==="disabled")return fromSlot;if(fromSidecar.blockedReason==="disabled"||!fromSlot.blocked)return fromSidecar;if(!fromSidecar.blocked||fromSlot.blockedUntil===void 0)return fromSlot;let later=(fromSlot.blockedUntil??0)>(fromSidecar.blockedUntil??0)?fromSlot:fromSidecar;return[fromSidecar,fromSlot].some(block=>block.blockedReason==="auth_error")?{...later,blockedReason:"auth_error"}:later}function storedModelBlocks(slot){let found=Object.entries(slot).find(([candidate])=>candidate==="modelBlocks")?.[1];if(found===null||typeof found!="object")return;let entries=Object.entries(found).flatMap(([model,block])=>{let until=block!==null&&typeof block=="object"?numberField(block,"blockedUntil"):void 0;return until===void 0?[]:[[model,{blockedUntil:until}]]});return entries.length===0?void 0:Object.fromEntries(entries)}function blockedModels(now,...sources){let until=new Map;for(let blocks of sources)for(let[model,block]of Object.entries(pruneModelBlocks(blocks,now)??{}))until.set(model,Math.max(until.get(model)??0,block.blockedUntil));return until.size===0?{}:{blockedModels:[...until].map(([model,at])=>({model,until:at}))}}async function getCredentialAccounts(storage,provider,env=process.env,repository,activeName){let accounts=await summarizeCredentialAccounts(provider,storage.get(provider),env,repository??credentialPoolRepository(storage));return normalizeProviderId(provider)!=="chatgpt-subscription"?accounts:accounts.map(account=>account.name===activeName&&!account.blocked&&!account.signedOut&&!account.unused?{...account,active:!0}:account)}async function summarizeCredentialAccounts(provider,stored,env=process.env,repository=new CredentialSlotRepository){let credential=pooledFrom(stored);return applyAccountOrder(credential?.order,await summarizeInStoredOrder(provider,credential,env,repository))}async function summarizeInStoredOrder(provider,credential,env,repository){let now=Date.now(),pinned=pinnedName(credential),summaries=[];if(credential){let state2=await repository.listSlots(provider,"stored"),isClaudeSubscription=normalizeProviderId(provider)==="anthropic-subscription",storedAccounts=isClaudeSubscription?Array.isArray(credential.accounts)?listSlots(credential).filter(isListedStoredSlot):[]:listSlots(credential),usable=new Set(slotsOfOwnKind(credential).map(slot=>slot.name));for(let slot of storedAccounts){let displayName=accountDisplayName(slot.displayName),persisted=state2[slot.name],revisions=await repository.storedSlotRevisions(provider,slot.name,{key:slot.key,access:slot.access,refresh:slot.refresh}),applicable=applicableStoredState(persisted,revisions);summaries.push({name:slot.name,...normalizeProviderId(provider)==="chatgpt-subscription"&&credential.type==="oauth"?{route:slot.route==="siwc"?"siwc":"legacy",...slot.route==="siwc"&&typeof slot.planUsageEnabled=="boolean"?{planUsageEnabled:slot.planUsageEnabled}:{},...slot.signedOut===!0?{signedOut:!0}:{}}:{},...displayName===void 0?{}:{displayName},source:slot.source??"login",...slotBlocked(provider,slot,applicable,now),pinned:pinned===slot.name,...blockedModels(now,applicable?.modelBlocks,storedModelBlocks(slot)),...usable.has(slot.name)?{}:{unused:!0},...isClaudeSubscription?claudeCliSlotFields(slot):{}})}if(normalizeProviderId(provider)!=="anthropic-subscription")return summaries}let state=await repository.listSlots(provider,"env");for(let slot of discoverEnvSlots(provider,name=>env[name])){let persisted=state[slot.name],revision=await repository.envCredentialRevision(slot.envVarName,slot.key),applicable=persisted?.credentialRevision===revision?persisted:void 0;summaries.push({name:slot.name,source:"env",...sidecarBlock(applicable,now),pinned:pinned===slot.name,...blockedModels(now,applicable?.modelBlocks)})}return summaries}async function renameCredentialAccount(storage,provider,name,displayName){await storage.modify(provider,async current=>{if(!current)throw new Error(`No stored credential for provider: ${provider}`);if(current.type==="oauth"&&!Array.isArray(current.accounts)&&current.access===current.refresh&&current.access.endsWith("-managed"))throw new Error(`Stored provider account not found: ${name}`);return renameSlotDisplayName(current,name,displayName)}),emitProviderAccountsChanged(provider)}async function pinCredentialAccount(storage,provider,name,env=process.env,repository){let repo=repository??credentialPoolRepository(storage);if(name!==null){assertValidAccountName2(name);let account=(await getCredentialAccounts(storage,provider,env,repo)).find(candidate=>candidate.name===name);if(!account)throw new Error(`Provider account not found: ${name}`);if(account.unused)throw new Error(`Account ${name} holds a login of the other kind and is never used, so it cannot be pinned. To switch ${provider} to it, save it again with /login.`)}await storage.modify(provider,async current=>{if(current===void 0){if(normalizeProviderId(provider)!=="anthropic-subscription"||name===null)throw new Error(`No stored credential for provider: ${provider}`);return pinSlot({type:"oauth",...SENTINEL_OAUTH_FIELDS,accounts:[]},name)}if(name===null){if(pinnedName(current)===void 0)return current;let{pinned:_pinned,...unpinned}={...current,pinned:void 0};return unpinned}return pinSlot(current,name)}),emitProviderAccountsChanged(provider)}async function removeCredentialAccount(storage,provider,name,env=process.env,repository){let repo=repository??credentialPoolRepository(storage),account=(await getCredentialAccounts(storage,provider,env,repo)).find(candidate=>candidate.name===name);if(!account)throw new Error(`Provider account not found: ${name}`);if(account.source==="env")throw new Error(`Environment provider account cannot be removed: ${name}`);let notice=await signOutAndDropSlot(storage,provider,name,env,repo);return emitProviderAccountsChanged(provider),notice===void 0?{}:{notice}}async function dropStoredSlot(storage,provider,name,repo){let removed=removeSlot(await storage.read(provider),name),remaining=removed===void 0?void 0:withoutOrderedAccount(removed,name);remaining===void 0?await storage.delete(provider):await storage.modify(provider,async()=>remaining),await repo.mutateSlotState(provider,"stored",name,()=>{})}async function pathExists(path){try{return await lstat2(path),!0}catch{return!1}}async function signOutAndDropSlot(storage,provider,name,env,repo,signal){let credential=await storage.read(provider);if(credential===void 0)throw new Error(`No stored credential for provider: ${provider}`);let notice;if(normalizeProviderId(provider)==="anthropic-subscription"){let accountDir=claudeCliAccountDir(storage,credential,name),dirExisted=accountDir!==void 0&&await pathExists(accountDir);try{notice=await signOutClaudeCliSlot(storage,credential,name,env,signal)}catch(error){throw dirExisted&&!await pathExists(accountDir)&&await dropStoredSlot(storage,provider,name,repo),error}}return await dropStoredSlot(storage,provider,name,repo),notice}async function signOutClaudeCliSlotsForLogout(storage,provider,env=process.env,signal,slotName){if(normalizeProviderId(provider)!=="anthropic-subscription")return[];let credential=await storage.read(provider);if(credential===void 0)return[];let repo=credentialPoolRepository(storage),notices=[],dropped=!1;try{for(let slot of listSlots(credential)){if(stringField2(slot,"store")!=="claude-cli"||slotName!==void 0&&slot.name!==slotName)continue;signal?.throwIfAborted();let notice=await signOutAndDropSlot(storage,provider,slot.name,env,repo,signal);dropped=!0,notice!==void 0&&notices.push(notice)}}finally{dropped&&emitProviderAccountsChanged(provider)}return notices}function claudeCliAgentDir(storage){let authPath=storage.getStoragePath();return authPath?dirname3(authPath):getAgentDir()}function claudeCliAccountDir(storage,credential,name){let slot=listSlots(credential).find(candidate=>candidate.name===name);if(slot===void 0||stringField2(slot,"store")!=="claude-cli")return;let dirId=stringField2(slot,"dirId");return dirId!==void 0&&isValidAccountDirId(dirId)?accountDirFor(claudeCliAgentDir(storage),dirId):void 0}async function signOutClaudeCliSlot(storage,credential,name,env,signal){let slot=listSlots(credential).find(candidate=>candidate.name===name);if(slot===void 0||stringField2(slot,"store")!=="claude-cli")return;let dirId=stringField2(slot,"dirId"),agentDir=claudeCliAgentDir(storage);if(dirId===void 0||!isValidAccountDirId(dirId))return`Removed Claude account ${name} without a Claude sign-out: it names no valid account dir.`;let executable;try{executable=resolveClaudeCodeExecutable({...defaultExecutableDeps(),env:key=>env[key]})}catch{executable=void 0}let outcome=await removeAccountDir({agentDir,dirId,executable,parentEnv:env,...signal===void 0?{}:{signal}});if(outcome!=="removed")return outcome==="removed_without_sign_out"?`Removed Claude account ${name}, but the Claude CLI sign-out could not run; its stored sign-in may remain in the Claude CLI's credential store.`:`Removed Claude account ${name} without a Claude sign-out: its account dir is a link or a file, left untouched at ${accountDirFor(agentDir,dirId)}.`}export{isEnvSlot,SENTINEL_OAUTH_FIELDS,emptyCredential,isListedStoredSlot,unusableStoredSlotCount,listAccounts,assertValidAccountName,pinAccount,envSlotToken,hasRequestOauthToken,mergeRequestAuthEnvironment,stripManagedAuthEnvironment,buildClaudeCliEnvironment,spawnClaudeCli,stopClaudeCli,readClaudeCliAuthStatus,logoutClaudeCli,CLAUDE_CLI_SHARED_LINKS,newAccountDirId,isValidAccountDirId,accountDirFor,readClaudeCliAccessToken,claudeCliSharedRoot,ensureAccountDir,removeAccountDir,accountsWithCapacity,AllAccountsBlockedError,isBlockedFor,clearExpiredBlocks,selectAccount,resolveClaudeCodeExecutable,resolveClaudeCodeRun,defaultExecutableDeps,accountsNeedingUser,accountCanServe,assertValidAccountName2,selectedOAuthAccount,credentialPoolRepository,getCredentialAccounts,summarizeCredentialAccounts,renameCredentialAccount,pinCredentialAccount,removeCredentialAccount,signOutClaudeCliSlotsForLogout};
@@ -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{DeviceFileError,FILE_CHANNEL_MAX_BYTES,LOCAL_DEVICE_FILES}from"./chunk-NDI6N4NJ.js";import{engineTrustAction}from"./chunk-R7J5TEYK.js";import{hasFunctions,realmRegistry}from"./chunk-XDEZA6U6.js";import{KILL_GUARD_TAG,refuse,refuseAll}from"./chunk-WOHQJ6JB.js";import{VERSION,getAgentDir,getBinDir,isBunBinary}from"./chunk-SODMQEHO.js";import{adoptedEngineTrust}from"./chunk-RFFMEA4B.js";import{existsSync,mkdirSync,mkdtempSync,readFileSync,renameSync,rmSync,writeFileSync}from"node:fs";import{basename,delimiter,dirname,join}from"node:path";import{fileURLToPath}from"node:url";var KILL_GUARD_BASH_ENV="bash_env.sh",KILL_GUARD_BASH_KILL="bash_kill.sh",KILL_GUARD_PROMPT_HOOK_PREFIX="__senpi_kg_q=$?;",KILL_GUARD_SHIM_MARKER=".senpi-kill-guard",KILL_GUARD_JUDGE_DEADLINE_SECONDS=10,quote=text=>`'${text.replaceAll("'","'\\''")}'`,refusal=verdict=>verdict.action==="refuse"?verdict.message:"",ALL_PROCESSES=refusal(refuseAll()),PROTECTED_WITHOUT_JUDGE=refusal(refuse("R2","it names a pid the host marked protected, and the kill guard's judge is not installed to check it")),JUDGE_FAILED=refusal(refuse("R5","the kill guard's judge failed or did not answer in time, so nothing was signalled")),JUDGE_MISSING=`${KILL_GUARD_TAG} the kill guard's judge is not installed (SENPI_KILL_GUARD_EXEC), so this runs unjudged:`;function library(deadlineSeconds){return`__senpi_kg_all=${quote(ALL_PROCESSES)}
2
+ import{DeviceFileError,FILE_CHANNEL_MAX_BYTES,LOCAL_DEVICE_FILES}from"./chunk-7CXLNKEH.js";import{engineTrustAction}from"./chunk-R7J5TEYK.js";import{hasFunctions,realmRegistry}from"./chunk-XDEZA6U6.js";import{KILL_GUARD_TAG,refuse,refuseAll}from"./chunk-WOHQJ6JB.js";import{VERSION,getAgentDir,getBinDir,isBunBinary}from"./chunk-SODMQEHO.js";import{adoptedEngineTrust}from"./chunk-RFFMEA4B.js";import{existsSync,mkdirSync,mkdtempSync,readFileSync,renameSync,rmSync,writeFileSync}from"node:fs";import{basename,delimiter,dirname,join}from"node:path";import{fileURLToPath}from"node:url";var KILL_GUARD_BASH_ENV="bash_env.sh",KILL_GUARD_BASH_KILL="bash_kill.sh",KILL_GUARD_PROMPT_HOOK_PREFIX="__senpi_kg_q=$?;",KILL_GUARD_SHIM_MARKER=".senpi-kill-guard",KILL_GUARD_JUDGE_DEADLINE_SECONDS=10,quote=text=>`'${text.replaceAll("'","'\\''")}'`,refusal=verdict=>verdict.action==="refuse"?verdict.message:"",ALL_PROCESSES=refusal(refuseAll()),PROTECTED_WITHOUT_JUDGE=refusal(refuse("R2","it names a pid the host marked protected, and the kill guard's judge is not installed to check it")),JUDGE_FAILED=refusal(refuse("R5","the kill guard's judge failed or did not answer in time, so nothing was signalled")),JUDGE_MISSING=`${KILL_GUARD_TAG} the kill guard's judge is not installed (SENPI_KILL_GUARD_EXEC), so this runs unjudged:`;function library(deadlineSeconds){return`__senpi_kg_all=${quote(ALL_PROCESSES)}
3
3
  __senpi_kg_protected=${quote(PROTECTED_WITHOUT_JUDGE)}
4
4
  __senpi_kg_failed=${quote(JUDGE_FAILED)}
5
5
  __senpi_kg_missing=${quote(JUDGE_MISSING)}
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
  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 = () => {}; } }
3
- import"./chunk-POTKWOUB.js";import{dispatchAgentDirectoryCommand,enableStartupCompileCache}from"./chunk-NXGSYUMV.js";import"./chunk-JLCZIEBC.js";import{installStaleExtensionContainment}from"./chunk-Y4PFEXFN.js";import{configureHttpDispatcher}from"./chunk-DEUEMEV3.js";import"./chunk-OSNR3IRD.js";import"./chunk-EUCZC2RF.js";import"./chunk-62OVOJPI.js";import"./chunk-G7U4BOJP.js";import"./chunk-SFACYIB6.js";import"./chunk-XDEZA6U6.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-IREUIMFE.js";import"./chunk-GVSBCJFI.js";import"./chunk-Z6TEQEZO.js";import"./chunk-ZG3MNTNX.js";import"./chunk-WHPDEDCC.js";import"./chunk-HK46JMSC.js";import"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import"./chunk-UAOOH2V7.js";import"./chunk-WDTJ6JKE.js";import"./chunk-OH5TKHW7.js";import"./chunk-NDNQ23SK.js";import"./chunk-JGKH3D6W.js";import"./chunk-3SASTB6Y.js";import"./chunk-PJ34QVL5.js";import{installEarlyInspectorVmImportRecovery}from"./chunk-U4FAWC6C.js";import"./chunk-ZFIC2DZV.js";import"./chunk-K3GAGIPX.js";import"./chunk-RUGTHELO.js";import"./chunk-42XRJQM6.js";import"./chunk-IHES3JES.js";import"./chunk-5XHOHZIR.js";import"./chunk-HW6AAS3R.js";import{APP_NAME,scrubBrandFromEnvironment}from"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-MIENF2YK.js";import"./chunk-FQXWKEVK.js";import"./chunk-IKOFCODM.js";await dispatchAgentDirectoryCommand(process.argv.slice(2));await enableStartupCompileCache();installEarlyInspectorVmImportRecovery();installStaleExtensionContainment();process.title=APP_NAME;scrubBrandFromEnvironment();process.env.PI_CODING_AGENT="true";process.emitWarning=(()=>{});configureHttpDispatcher();var{main}=await import("./main-PR4FI6HQ.js");await main(process.argv.slice(2));
3
+ import"./chunk-POTKWOUB.js";import{dispatchAgentDirectoryCommand,enableStartupCompileCache}from"./chunk-TB6LIKVR.js";import"./chunk-THYIV26N.js";import{installStaleExtensionContainment}from"./chunk-5IXYN6DK.js";import{configureHttpDispatcher}from"./chunk-DEUEMEV3.js";import"./chunk-OSNR3IRD.js";import"./chunk-EUCZC2RF.js";import"./chunk-62OVOJPI.js";import"./chunk-G7U4BOJP.js";import"./chunk-IK3S2NDB.js";import"./chunk-XDEZA6U6.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-PWTXZXHH.js";import"./chunk-GVSBCJFI.js";import"./chunk-Z6TEQEZO.js";import"./chunk-ZG3MNTNX.js";import"./chunk-WHPDEDCC.js";import"./chunk-HK46JMSC.js";import"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import"./chunk-UAOOH2V7.js";import"./chunk-WDTJ6JKE.js";import"./chunk-OH5TKHW7.js";import"./chunk-NDNQ23SK.js";import"./chunk-JGKH3D6W.js";import"./chunk-3SASTB6Y.js";import"./chunk-PJ34QVL5.js";import{installEarlyInspectorVmImportRecovery}from"./chunk-GXPH7RN6.js";import"./chunk-ZFIC2DZV.js";import"./chunk-K3GAGIPX.js";import"./chunk-RUGTHELO.js";import"./chunk-42XRJQM6.js";import"./chunk-IHES3JES.js";import"./chunk-5XHOHZIR.js";import"./chunk-HW6AAS3R.js";import{APP_NAME,scrubBrandFromEnvironment}from"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-MIENF2YK.js";import"./chunk-FQXWKEVK.js";import"./chunk-IKOFCODM.js";await dispatchAgentDirectoryCommand(process.argv.slice(2));await enableStartupCompileCache();installEarlyInspectorVmImportRecovery();installStaleExtensionContainment();process.title=APP_NAME;scrubBrandFromEnvironment();process.env.PI_CODING_AGENT="true";process.emitWarning=(()=>{});configureHttpDispatcher();var{main}=await import("./main-VEWKRBTD.js");await main(process.argv.slice(2));
@@ -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{accountCanServe,accountsNeedingUser,assertValidAccountName2 as assertValidAccountName,credentialPoolRepository,getCredentialAccounts,pinCredentialAccount,removeCredentialAccount,renameCredentialAccount,selectedOAuthAccount,signOutClaudeCliSlotsForLogout,summarizeCredentialAccounts}from"./chunk-Z4PN2MDA.js";import"./chunk-GILDYS3O.js";import"./chunk-KLAX467B.js";import"./chunk-C4AHHZ6P.js";import"./chunk-CEFKVI3E.js";import"./chunk-HGCQAMC6.js";import"./chunk-GZVCRV7I.js";import"./chunk-236TAYFX.js";import"./chunk-36BLGKRO.js";import"./chunk-FKX6EWFV.js";import"./chunk-U3VOXCGP.js";import"./chunk-7X72IACK.js";import"./chunk-EUCZC2RF.js";import"./chunk-WHQ2QPP5.js";import"./chunk-RLIY3AUC.js";import"./chunk-WB4BUHOH.js";import"./chunk-NJ43NBSP.js";import"./chunk-6QQL3SKM.js";import"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import"./chunk-62OVOJPI.js";import"./chunk-G7U4BOJP.js";import"./chunk-IK3S2NDB.js";import"./chunk-XDEZA6U6.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-PWTXZXHH.js";import"./chunk-GVSBCJFI.js";import"./chunk-Z6TEQEZO.js";import"./chunk-ZG3MNTNX.js";import"./chunk-WHPDEDCC.js";import"./chunk-HK46JMSC.js";import"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import"./chunk-UAOOH2V7.js";import"./chunk-WDTJ6JKE.js";import"./chunk-OH5TKHW7.js";import"./chunk-NDNQ23SK.js";import"./chunk-JGKH3D6W.js";import"./chunk-3SASTB6Y.js";import"./chunk-PJ34QVL5.js";import"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-MIENF2YK.js";import"./chunk-IKOFCODM.js";export{accountCanServe,accountsNeedingUser,assertValidAccountName,credentialPoolRepository,getCredentialAccounts,pinCredentialAccount,removeCredentialAccount,renameCredentialAccount,selectedOAuthAccount,signOutClaudeCliSlotsForLogout,summarizeCredentialAccounts};