@code-yeongyu/senpi 2026.11.10-1 → 2026.11.10-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/bundle/chunks/{chunk-GPXZTSEX.js → chunk-2M54EAAY.js} +3 -3
- package/dist/bundle/chunks/{chunk-YPAQXRP3.js → chunk-47T6YMI2.js} +2 -2
- package/dist/bundle/chunks/{chunk-I5ASHSLZ.js → chunk-4JMGWVRH.js} +1 -1
- package/dist/bundle/chunks/{chunk-HI5JSLG5.js → chunk-74IB3JPP.js} +2 -2
- package/dist/bundle/chunks/{chunk-NH7SYIGN.js → chunk-DLPV4B3R.js} +1 -1
- package/dist/bundle/chunks/{chunk-Y7Z7XPUF.js → chunk-DZQA5LVN.js} +1 -1
- package/dist/bundle/chunks/{chunk-2CNSCMYC.js → chunk-E5O4SP5I.js} +1 -1
- package/dist/bundle/chunks/{chunk-3IYWH6RO.js → chunk-IKJCA5SH.js} +1 -1
- package/dist/bundle/chunks/{chunk-H33A33M4.js → chunk-M2VJVJMK.js} +1 -1
- package/dist/bundle/chunks/{chunk-L6NRDUWJ.js → chunk-OF3XVGG4.js} +1 -1
- package/dist/bundle/chunks/{chunk-THYEZBUG.js → chunk-Q4G5DECT.js} +2 -2
- package/dist/bundle/chunks/{chunk-ARUV3US4.js → chunk-QATU6BBC.js} +1 -1
- package/dist/bundle/chunks/{chunk-FAFIGBUD.js → chunk-TUEZNIBK.js} +1 -1
- package/dist/bundle/chunks/{chunk-BELNOPAI.js → chunk-UOZDDYBN.js} +2 -2
- package/dist/bundle/chunks/{chunk-DBQBJTMF.js → chunk-VUY4BZDI.js} +1 -1
- package/dist/bundle/chunks/{chunk-TGW4R7SI.js → chunk-XH24X5B2.js} +1 -1
- package/dist/bundle/chunks/chunk-XI6THO4F.js +2 -0
- package/dist/bundle/chunks/{chunk-X4XWAB3J.js → chunk-YCPURLPU.js} +38 -38
- package/dist/bundle/chunks/{chunk-LHEP3ACI.js → chunk-YNGEZBTP.js} +1 -1
- package/dist/bundle/chunks/{cli-main-VG3C2EXI.js → cli-main-Y6ALA5OI.js} +1 -1
- package/dist/bundle/chunks/{hand-entry-3LQKUTYS.js → hand-entry-IPDAIOGI.js} +1 -1
- package/dist/bundle/chunks/{host-command-CCASS7W4.js → host-command-2326GCUP.js} +1 -1
- package/dist/bundle/chunks/{host-lifecycle-WWC7HXQ6.js → host-lifecycle-TNHASSFJ.js} +1 -1
- package/dist/bundle/chunks/host-lifecycle.js +1 -1
- package/dist/bundle/chunks/{host-session-command-YJB2FLKU.js → host-session-command-BZYBDOIE.js} +1 -1
- package/dist/bundle/chunks/{host-socket-request-DMYXC56U.js → host-socket-request-QN4Q2P5E.js} +1 -1
- package/dist/bundle/chunks/{interactive-mode-CUN3WMUF.js → interactive-mode-LBQB7DDR.js} +1 -1
- package/dist/bundle/chunks/{main-P7XRC2OI.js → main-FFRFP34W.js} +1 -1
- package/dist/bundle/chunks/{multi-session-host-244X3P6L.js → multi-session-host-NDIHHJ2L.js} +11 -8
- package/dist/bundle/chunks/{package-manager-cli-UVWJOQA3.js → package-manager-cli-XCPAMOYI.js} +1 -1
- package/dist/bundle/chunks/{rpc-mode-G4I3HHPB.js → rpc-mode-TKNZM4PZ.js} +1 -1
- package/dist/bundle/chunks/{rpc-monitor-source-C6VQ3BC4.js → rpc-monitor-source-PGTDSGWP.js} +1 -1
- package/dist/bundle/chunks/{run-attached-tui-R3RB5P7G.js → run-attached-tui-JDUKXDI2.js} +1 -1
- package/dist/bundle/chunks/{schedule-command-5FG2OKSR.js → schedule-command-HF2DHABB.js} +1 -1
- package/dist/bundle/chunks/{session-control-endpoint-XWCFLJYC.js → session-control-endpoint-A6R6W2JQ.js} +1 -1
- package/dist/bundle/chunks/{session-picker-2FZSNFS7.js → session-picker-GWA4S2PO.js} +1 -1
- package/dist/bundle/chunks/session-worker.js +119 -116
- package/dist/bundle/cli.js +2 -2
- package/dist/bundle/host-supervisor.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/bundle/runtime-manifest.json +1 -1
- package/dist/core/agent-session-runtime.d.ts +2 -0
- package/dist/core/agent-session-runtime.js +5 -0
- package/dist/core/agent-session.d.ts +1 -1
- package/dist/core/agent-session.js +30 -10
- package/dist/core/extensions/builtin/config-reload/change-groups.js +6 -2
- package/dist/core/extensions/builtin/mcp/auth/catalog-identity.js +32 -8
- package/dist/core/extensions/builtin/mcp/auth/oauth-grant.d.ts +43 -0
- package/dist/core/extensions/builtin/mcp/auth/oauth-grant.js +196 -0
- package/dist/core/extensions/builtin/mcp/auth/oauth-provider.d.ts +4 -17
- package/dist/core/extensions/builtin/mcp/auth/oauth-provider.js +64 -75
- package/dist/core/extensions/builtin/mcp/auth/oauth-refresh.d.ts +1 -1
- package/dist/core/extensions/builtin/mcp/auth/oauth-refresh.js +25 -4
- package/dist/core/extensions/builtin/mcp/auth/oauth.js +10 -7
- package/dist/core/extensions/builtin/mcp/auth/token-store.d.ts +18 -0
- package/dist/core/extensions/builtin/mcp/auth/token-store.js +3 -0
- package/dist/core/extensions/builtin/mcp/catalog-cache.js +7 -6
- package/dist/core/extensions/builtin/mcp/catalog.js +3 -2
- package/dist/core/extensions/builtin/mcp/invocation.js +6 -0
- package/dist/core/extensions/builtin/mcp/service-register.js +16 -2
- package/dist/core/extensions/builtin/mcp/service-tools-changed.js +61 -54
- package/dist/core/extensions/builtin/mcp/startup-race.d.ts +2 -0
- package/dist/core/extensions/builtin/mcp/startup-race.js +25 -7
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-2.js +6 -6
- package/dist/core/open-timing.d.ts +2 -0
- package/dist/core/open-timing.js +7 -1
- package/dist/core/session-manager.d.ts +2 -0
- package/dist/core/session-manager.js +15 -1
- package/dist/modes/interactive/session-control-rpc-commands.d.ts +1 -1
- package/dist/modes/interactive/session-control-rpc-commands.js +5 -0
- package/dist/modes/rpc/compact-admission-validation.js +4 -1
- package/dist/modes/rpc/connection-handler.d.ts +2 -0
- package/dist/modes/rpc/connection-handler.js +10 -2
- package/dist/modes/rpc/custom-capability.d.ts +2 -0
- package/dist/modes/rpc/custom-capability.js +2 -0
- package/dist/modes/rpc/effect-commands.d.ts +21 -0
- package/dist/modes/rpc/host-capabilities.d.ts +1 -0
- package/dist/modes/rpc/host-capabilities.js +3 -1
- package/dist/modes/rpc/host-observe-request.d.ts +2 -0
- package/dist/modes/rpc/host-observe-request.js +6 -1
- package/dist/modes/rpc/host-park-ledger.d.ts +19 -0
- package/dist/modes/rpc/host-park-ledger.js +110 -0
- package/dist/modes/rpc/lifecycle-delivery.js +4 -1
- package/dist/modes/rpc/media-placeholders.js +1 -0
- package/dist/modes/rpc/method-classes-schema-host.d.ts +42 -1
- package/dist/modes/rpc/method-classes-schema-host.js +24 -21
- package/dist/modes/rpc/method-classes-schema.d.ts +42 -1
- package/dist/modes/rpc/method-classes-schema.js +5 -2
- package/dist/modes/rpc/method-classes.d.ts +2 -0
- package/dist/modes/rpc/method-classes.js +3 -0
- package/dist/modes/rpc/multi-session-host.js +1 -1
- package/dist/modes/rpc/rpc-host-command-types.d.ts +14 -1
- package/dist/modes/rpc/rpc-host-response-types.d.ts +21 -0
- package/dist/modes/rpc/session-attachment-gate.js +2 -0
- package/dist/modes/rpc/session-binding.d.ts +1 -0
- package/dist/modes/rpc/session-binding.js +6 -1
- package/dist/modes/rpc/session-connection-context.d.ts +2 -0
- package/dist/modes/rpc/session-connection-context.js +4 -0
- package/dist/modes/rpc/session-registry-attach.d.ts +2 -0
- package/dist/modes/rpc/session-registry-attach.js +15 -11
- package/dist/modes/rpc/session-registry-claims.js +2 -0
- package/dist/modes/rpc/session-registry-open.js +13 -7
- package/dist/modes/rpc/session-registry-opening.js +2 -1
- package/dist/modes/rpc/session-registry-types.d.ts +4 -0
- package/dist/modes/rpc/session-registry.d.ts +3 -0
- package/dist/modes/rpc/session-registry.js +27 -3
- package/dist/modes/rpc/session-router-close.js +1 -0
- package/dist/modes/rpc/session-router-context.d.ts +4 -2
- package/dist/modes/rpc/session-router-context.js +3 -0
- package/dist/modes/rpc/session-router-host-reads.js +1 -0
- package/dist/modes/rpc/session-router-occupancy.js +10 -1
- package/dist/modes/rpc/session-router-open-result.d.ts +12 -0
- package/dist/modes/rpc/session-router-open-result.js +63 -0
- package/dist/modes/rpc/session-router-open.d.ts +3 -0
- package/dist/modes/rpc/session-router-open.js +15 -63
- package/dist/modes/rpc/session-router-park.d.ts +15 -0
- package/dist/modes/rpc/session-router-park.js +176 -0
- package/dist/modes/rpc/session-router-routing.d.ts +1 -1
- package/dist/modes/rpc/session-router-routing.js +7 -0
- package/dist/modes/rpc/session-status-source.js +2 -2
- package/docs/engine-socket/fixtures/admission-routes/h-legacy.json +1 -1
- package/docs/engine-socket/fixtures/rpc-inbound-samples.json +22 -2
- package/docs/rpc.md +50 -0
- package/native/socket-secret/prebuilds/win32-arm64/senpi_socket_secret.win32-arm64.node +0 -0
- package/native/socket-secret/prebuilds/win32-x64/senpi_socket_secret.win32-x64.node +0 -0
- package/package.json +6 -6
- package/dist/bundle/chunks/chunk-436DNN4Z.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{CONFIG_COMMAND_ARGV,HOST_COMMAND_ARGV,SCHEDULE_COMMAND_ARGV,exitAfterOutput,isPackageCommandArgv}from"./chunk-
|
|
2
|
+
import{CONFIG_COMMAND_ARGV,HOST_COMMAND_ARGV,SCHEDULE_COMMAND_ARGV,exitAfterOutput,isPackageCommandArgv}from"./chunk-IKJCA5SH.js";import{APP_NAME,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,ENV_PREFIX,brandEnvNames,getAgentDir}from"./chunk-SODMQEHO.js";import{homedir}from"node:os";try{process.cwd()}catch{let fallback=homedir();process.chdir(fallback),console.error(`the current working directory no longer exists; continuing from ${fallback}`)}import{homedir as homedir2}from"node:os";import{join}from"node:path";async function dispatchAgentDirectoryCommand(args){if(!(args[0]!=="config"||args[1]!=="agent-dir")){(args.length!==3||args[2]!=="--json")&&await exitAfterOutput(`${JSON.stringify({version:1,ok:!1,code:"invalid_arguments",message:`Usage: ${APP_NAME} config agent-dir --json`})}
|
|
3
3
|
`,2);try{let dir=getAgentDir(),selector=brandEnvNames("CODING_AGENT_DIR").find(name=>process.env[name]!==void 0),explicit=selector!==void 0&&process.env[selector]?selector:void 0,homeDefault=CONFIG_FLAT_LAYOUT?join(homedir2(),CONFIG_DIR_NAME):join(homedir2(),CONFIG_DIR_NAME,"agent"),rule=explicit!==void 0?"environment":dir===homeDefault?"home-default":"project-local";await exitAfterOutput(`${JSON.stringify({version:1,ok:!0,dir,source:explicit??(rule==="project-local"?"project-local":"default"),rule,brandedPrefix:ENV_PREFIX})}
|
|
4
4
|
`,0)}catch(error){await exitAfterOutput(`${JSON.stringify({version:1,ok:!1,code:"selection_failed",message:error instanceof Error?error.message:"Unable to resolve the agent directory."})}
|
|
5
5
|
`,1)}}}import*as nodeModule from"node:module";async function enableStartupCompileCache(){let enable=nodeModule.enableCompileCache;if(typeof enable!="function")return;let args=process.argv.slice(2);if(!isPackageCommandArgv(args)&&args[0]!==CONFIG_COMMAND_ARGV&&(args.includes("--version")||args.includes("-v")))return;let scheduleWatch=!1;if(args[0]===SCHEDULE_COMMAND_ARGV&&args[1]==="run")for(let index=2;index<args.length;index++){let arg=args[index];arg==="--watch"?scheduleWatch=!0:["--exec","--poll-seconds","--timeout-seconds","--concurrency"].includes(arg??"")&&index++}if(!(isPackageCommandArgv(args)||args[0]===HOST_COMMAND_ARGV||args[0]===SCHEDULE_COMMAND_ARGV&&!scheduleWatch)){if(!scheduleWatch&&args.some(arg=>["--help","-h","--export","--list-models","--list-tips"].includes(arg)))try{let{parseArgs}=await import("./args-77GYOPEO.js"),parsed=parseArgs(args);if(parsed.version||parsed.export||parsed.listModels!==void 0||parsed.listTips||parsed.help&&!(parsed.mode==="rpc"&&parsed.multiSession))return}catch{}try{let result=enable();result.directory!==void 0&&process.env.NODE_COMPILE_CACHE===void 0&&(process.env.NODE_COMPILE_CACHE=result.directory)}catch{}}}export{dispatchAgentDirectoryCommand,enableStartupCompileCache};
|
|
@@ -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-
|
|
3
|
+
import"./chunk-POTKWOUB.js";import{dispatchAgentDirectoryCommand,enableStartupCompileCache}from"./chunk-YNGEZBTP.js";import"./chunk-KU72IKV5.js";import{installStaleExtensionContainment}from"./chunk-XH24X5B2.js";import{configureHttpDispatcher}from"./chunk-FEQDJBDL.js";import"./chunk-R2Z7CX77.js";import"./chunk-MSDBBOB2.js";import"./chunk-BPNSOZ2C.js";import"./chunk-DLAY7CIU.js";import"./chunk-WXYMAUFX.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-XH2MWTXA.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-IKJCA5SH.js";import"./chunk-ZFIC2DZV.js";import"./chunk-T2SMQPRE.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-FFRFP34W.js");await main(process.argv.slice(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{PresentationBroker,bootstrapRuntime,buildToolRegistry,builtInExtensions,canonicalizeFilesystemPath,childModuleRoots,createAgentSessionServices,createProjectTrustContext,createToolChildRuntime,forwardToolEvents,presetTrustsProject,resolveProjectTrusted,sessionExtensionFlagValues,toolChildModuleRoots,toolInfoOf,withFileMutationQueue,withFileMutationQueues}from"./chunk-X4XWAB3J.js";import"./chunk-TGW4R7SI.js";import"./chunk-HI5JSLG5.js";import"./chunk-ARUV3US4.js";import"./chunk-3IYEGHBI.js";import"./chunk-RYPM5BZQ.js";import"./chunk-NLYT7BND.js";import{SettingsManager}from"./chunk-FAFIGBUD.js";import"./chunk-FEQDJBDL.js";import"./chunk-436DNN4Z.js";import"./chunk-BELNOPAI.js";import"./chunk-J2I56WLK.js";import"./chunk-GTJJ73DE.js";import{ProjectTrustStore,getSavedProjectTrust,hasTrustRequiringProjectResources}from"./chunk-VD7AKTGP.js";import"./chunk-7MN7YNO5.js";import"./chunk-H33A33M4.js";import"./chunk-TQHNFP77.js";import"./chunk-ZUQCYIRY.js";import"./chunk-HKCFMDJN.js";import"./chunk-3Q5ZENSD.js";import"./chunk-3QPE75AR.js";import"./chunk-4GKU755E.js";import"./chunk-Y3TMJV3J.js";import"./chunk-O3FG6HML.js";import"./chunk-MOVB6H22.js";import"./chunk-NH7SYIGN.js";import"./chunk-VPVD5G32.js";import"./chunk-H4QOEVS5.js";import"./chunk-SOMFLLPD.js";import"./chunk-MTQQ2VQH.js";import"./chunk-L6NRDUWJ.js";import"./chunk-THYEZBUG.js";import"./chunk-QMRJYMNH.js";import"./chunk-Y7Z7XPUF.js";import"./chunk-IEY2SL46.js";import"./chunk-26UBFF6N.js";import"./chunk-I5ASHSLZ.js";import"./chunk-2CNSCMYC.js";import"./chunk-DX43FSQT.js";import"./chunk-7WYJAYHH.js";import{closeServer,listen,prepareSocketPath}from"./chunk-YPAQXRP3.js";import"./chunk-R2Z7CX77.js";import"./chunk-UCXBDE6R.js";import"./chunk-YI6KRJDC.js";import"./chunk-DBQBJTMF.js";import{MAX_RPC_LINE_CHARACTERS,attachJsonlLineReader}from"./chunk-SF4MQDKZ.js";import"./chunk-EJB5E2JK.js";import"./chunk-RCHIMH7N.js";import"./chunk-GILDYS3O.js";import"./chunk-KLAX467B.js";import"./chunk-C4AHHZ6P.js";import"./chunk-J7FW7MED.js";import"./chunk-2EJ4BGBM.js";import"./chunk-GZVCRV7I.js";import"./chunk-KUPQO7MC.js";import"./chunk-U3VOXCGP.js";import"./chunk-7X72IACK.js";import"./chunk-MSDBBOB2.js";import"./chunk-WHQ2QPP5.js";import"./chunk-J2NGJKXL.js";import"./chunk-WB4BUHOH.js";import"./chunk-NJ43NBSP.js";import"./chunk-KDUJCDLM.js";import"./chunk-6APXZK7W.js";import"./chunk-YU2P3CAR.js";import"./chunk-2IKL4F24.js";import"./chunk-KJR3XXMI.js";import"./chunk-IYL5E4QQ.js";import"./chunk-7THM57HH.js";import"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import"./chunk-2U6HXWXS.js";import"./chunk-TMXRR3N7.js";import"./chunk-LPYBKMPT.js";import{localDeviceFiles}from"./chunk-33MZJTQ3.js";import{DeviceFileError,FILE_CHANNEL_MAX_BYTES,base64Length,createReliableTransport,createRemoteExecutor,decodeBase64,decodeDeviceFileArgs,encodeBase64,fileRefusal,fileResult,serveLoopHooks}from"./chunk-V5FSENW6.js";import"./chunk-R7J5TEYK.js";import"./chunk-BPNSOZ2C.js";import"./chunk-DLAY7CIU.js";import{validateToolArguments}from"./chunk-WXYMAUFX.js";import"./chunk-WOHQJ6JB.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-XH2MWTXA.js";import"./chunk-GVSBCJFI.js";import"./chunk-QTS2XGPQ.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-BMX2U22F.js";import"./chunk-GLTOBXZY.js";import"./chunk-3IYWH6RO.js";import"./chunk-ZOFZRJSL.js";import"./chunk-ZFIC2DZV.js";import"./chunk-2SOVDETB.js";import"./chunk-E266ORGA.js";import"./chunk-T2SMQPRE.js";import"./chunk-RUGTHELO.js";import"./chunk-42XRJQM6.js";import"./chunk-IHES3JES.js";import{shieldSocketDuringClose,unlinkOwnedSocket}from"./chunk-5XHOHZIR.js";import{authenticateSocket,ensureSocketSecret,resolveSocketTransportAddress,socketSecretPath}from"./chunk-HW6AAS3R.js";import{isLocalPath,resolvePath}from"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-EYSV6A7S.js";import"./chunk-MIENF2YK.js";import"./chunk-OXNWERO4.js";import"./chunk-44BJPS5I.js";import"./chunk-AOTHPTMU.js";import"./chunk-O5RYI3IW.js";import"./chunk-RFFMEA4B.js";import"./chunk-IKOFCODM.js";import{createServer}from"node:net";import{posix as posix2,win32}from"node:path";import{isAbsolute as isAbsolute2}from"node:path";import{randomUUID as randomUUID2}from"node:crypto";import{basename as basename4,dirname as dirname4,join as join4,resolve as resolve3}from"node:path";import{spawn}from"node:child_process";import{randomUUID}from"node:crypto";import{existsSync}from"node:fs";import{constants as fsConstants}from"node:fs";import{open}from"node:fs/promises";import{constants as osConstants}from"node:os";import{basename,dirname,join,resolve}from"node:path";var GIT_ACTIVITY_LOCK_NAME="git-activity.flock",GIT_ACTIVITY_SHARED_WAIT_MS=1e4,RETRY_MS=5,LOCK_SH=1,LOCK_NB=4;function classifyFlockErrno(errno){let{EAGAIN,EWOULDBLOCK,ENOLCK,EOPNOTSUPP,ENOSYS}=osConstants.errno;return errno===EAGAIN||errno===EWOULDBLOCK?"busy":errno===ENOLCK||errno===EOPNOTSUPP||errno===ENOSYS?"no-lock":"failed"}function identityLocksDir(repoDir){let repo=resolve(repoDir);if(!(basename(repo)!=="repo"||basename(dirname(dirname(repo)))!=="agents"))return join(dirname(repo),"runtime","locks")}var NO_HOLD={fd:void 0,release:async()=>{}},delay=ms=>new Promise(done=>setTimeout(done,ms));async function holdActivityLock(cwd,flock,waitMs=GIT_ACTIVITY_SHARED_WAIT_MS){let locksDir=identityLocksDir(cwd);if(locksDir===void 0||flock===void 0)return NO_HOLD;if(!existsSync(locksDir))throw new DeviceFileError("not_found","the identity's locks directory does not exist");let handle=await open(join(locksDir,GIT_ACTIVITY_LOCK_NAME),fsConstants.O_RDWR|fsConstants.O_CREAT,384),deadline=Date.now()+waitMs;try{for(;;){let{rc,errno}=flock(handle.fd,LOCK_SH|LOCK_NB);if(rc===0)return{fd:handle.fd,release:()=>handle.close()};let kind=classifyFlockErrno(errno);if(kind==="no-lock")return await handle.close(),NO_HOLD;if(kind==="failed")throw new DeviceFileError("io",`flock on the git-activity lock failed (errno ${errno})`);if(Date.now()>=deadline)throw new DeviceFileError("io",`the git-activity lock stayed exclusively held for ${waitMs} ms`);await delay(RETRY_MS)}}catch(error){throw await handle.close(),error}}import{posix}from"node:path";var k=kind=>({kind}),eq=(prefix,kind)=>({prefix,kind}),opt=(...optional)=>({optional}),rep=(min,...repeat)=>({repeat,min}),NUL=/\0/,REV=/^(?![-./~:])[A-Za-z0-9._/@{}^~+-]+$/,REL=/^(?![/-])(?!.*(?:^|\/)\.\.(?:\/|$))[^\0]+$/,rev=value=>REV.test(value)&&!value.includes("..")&&!value.includes("//"),range=value=>{let parts=value.split("..");return parts.length===2&&parts.every(rev)},blobref=value=>{let at=value.indexOf(":");return at>=0&&(at===0||rev(value.slice(0,at)))&&REL.test(value.slice(at+1))},filesystem=value=>value.length>0&&!NUL.test(value)&&!/^[-:]/.test(value);function scheme(value){return/^([A-Za-z][A-Za-z0-9+.-]*):\/\//.exec(value)?.[1]}function urlIsLocal(value){let colon=value.indexOf(":"),slash=value.indexOf("/");return colon<0||slash>=0&&slash<colon||process.platform==="win32"&&/^[A-Za-z]:[\\/]/.test(value)}var unsafeUrl=value=>value.length===0||NUL.test(value)||/\s/.test(value)||value.startsWith("-")||value.includes("::");function remote(value){if(unsafeUrl(value))return!1;let named=scheme(value);return named!==void 0?named==="https"||named==="ssh":!urlIsLocal(value)}function localUrlPath(value){if(unsafeUrl(value)||scheme(value)!=="file")return;let rest=value.slice(7);if(!rest.startsWith("/")||/[?#]/.test(rest))return;let path;try{path=decodeURIComponent(rest)}catch{return}return path.length>1&&!NUL.test(path)&&!path.endsWith("/")&&posix.normalize(path)===path&&path.split("/").slice(1).every(part=>part!==""&&part!=="."&&part!=="..")?path:void 0}var localCandidate=value=>!unsafeUrl(value)&&(scheme(value)==="file"||scheme(value)===void 0&&urlIsLocal(value)),KINDS={rev,range,revish:value=>rev(value)||range(value),object:value=>rev(value)||blobref(value),blobref,ref:value=>value==="HEAD"||/^refs\/[A-Za-z0-9._/-]+$/.test(value)&&!value.includes(".."),refpat:value=>/^refs\/[A-Za-z0-9._/-]+\*?$/.test(value)&&!value.includes(".."),branch:value=>/^(?![-./])[A-Za-z0-9._/-]+$/.test(value)&&!value.includes(".."),refspec:value=>/^[A-Za-z0-9._/]+(?:-[A-Za-z0-9._/]+)*:[A-Za-z0-9._/-]+$/.test(value)&&!value.includes(".."),msg:value=>!NUL.test(value),count:value=>/^\d{1,9}$/.test(value),mode:value=>/^(?:100644|100755|120000|160000)$/.test(value),oid:value=>/^[0-9a-f]{40}(?:[0-9a-f]{24})?$/.test(value),filter:value=>/^[ACDMRTUXB]+$/i.test(value),fmt:value=>!NUL.test(value),iso:value=>/^\d{4}-\d\d-\d\dT[\d:.]+Z$/.test(value),relpath:value=>REL.test(value),gitpath:value=>value==="index"||value==="MERGE_HEAD",path:filesystem,worktree:filesystem,source:value=>remote(value)||localCandidate(value),target:value=>remote(value)||localCandidate(value)},FORMAT=eq("--format=","fmt"),LOG_RECORD="--format=%x1e%H%x1f%s%x1f%b%x1f%an%x1f%ae%x1f%cI",SHAPES={add:[["-A","--",rep(1,k("path"))]],branch:[["--show-current"],["-D",k("branch")]],"cat-file":[["blob",k("object")],["--batch"],["-e",k("blobref")]],checkout:[[k("rev"),"--",k("path")]],commit:[["-q","--no-verify","-m",k("msg")]],"commit-tree":[[k("rev"),opt("-p",k("rev")),"-F","-"]],"count-objects":[["-v"]],diff:[["--cached","-M","-C","-z","--raw","--no-abbrev"],["--name-only","-z",eq("--diff-filter=","filter"),k("rev"),k("rev"),"--"],["--name-status","-M","-z",k("range"),"--"],["--cached","--quiet",k("rev"),"--"],["--no-renames","--name-only","-z",k("range"),"--",k("path")],["--name-only","-z",k("range"),"--"],["--name-only",eq("--diff-filter=","filter")]],"diff-files":[["--name-only","-z"]],"diff-tree":[["-r","-m","--no-commit-id","--no-renames",eq("--diff-filter=","filter"),"--raw","-z",k("rev")]],"for-each-ref":[[FORMAT,rep(1,k("refpat"))]],"hash-object":[[opt("-w"),"--no-filters","--stdin"],[opt("-w"),eq("--path=","relpath"),"--stdin"]],init:[["--template="]],log:[["-1",FORMAT,k("rev")],[{prefix:"-",kind:"count"},FORMAT,k("rev")],[FORMAT,"--name-only","-z","--no-renames","--diff-merges=first-parent",eq("--diff-filter=","filter"),rep(0,k("revish")),"--"],[LOG_RECORD,opt("--name-only","-z","--no-renames","--full-diff"),opt("--fixed-strings","--all-match",rep(1,eq("--grep=","msg"))),opt("-n",k("count")),opt(eq("--since=","iso")),opt(k("revish")),opt("--",rep(1,k("path")))]],"ls-files":[["--stage","-z","--",k("path")],["--eol","-z"]],"ls-remote":[[k("source"),k("ref")]],"ls-tree":[["-r","--name-only","-z",k("rev"),opt("--",k("path"))],["-r","-l","-z",k("rev")],["-r","-z",k("rev")],["-z",k("rev"),"--",k("path")]],maintenance:[["run","--task=loose-objects","--quiet"]],merge:[[],["--abort"],[opt("--no-ff"),opt("-m",k("msg")),k("rev")],["--no-ff",k("rev"),rep(1,"-m",k("msg"))]],"merge-base":[["--is-ancestor",k("rev"),k("rev")]],"prune-packed":[["--quiet"]],push:[["--quiet",k("target"),k("refspec")]],"read-tree":[["--empty"],[k("rev")]],remote:[["-v"]],reset:[["--soft",k("rev")]],restore:[["--source=HEAD","--staged",opt("--worktree"),"--",rep(1,k("path"))]],"rev-list":[[opt("--count"),k("range")],["--reverse",k("range")]],"rev-parse":[["--verify",opt("--quiet"),k("rev")],["-q","--verify",k("rev")],["--git-path",k("gitpath")],["--git-common-dir"]],rm:[["-q","--cached",opt("-f"),"--ignore-unmatch","--",rep(1,k("path"))],["-rf","-q","--ignore-unmatch","--",k("path")]],show:[["-s",FORMAT,k("rev")],[k("blobref")]],"show-ref":[["--verify",k("ref")]],status:[["--porcelain",opt("--untracked-files=all",opt("--",rep(1,k("path"))))]],"symbolic-ref":[["HEAD",k("ref")]],"update-index":[["--force-remove","--",k("path")],["--add","--cacheinfo",k("mode"),k("oid"),k("path")],["-q","-z","--stdin"]],"update-ref":[["-m",k("msg"),"HEAD",k("rev"),k("rev")]],worktree:[["add","-b",k("branch"),k("worktree"),k("rev")],["remove",opt("--force"),k("worktree")],["list","--porcelain"],["prune"]],"write-tree":[[]]};function match(items,args,at,paths,then){let[item,...rest]=items;if(item===void 0)return then(at);let next=to=>match(rest,args,to,paths,then);if(typeof item=="string")return args[at]===item&&next(at+1);if("optional"in item)return match(item.optional,args,at,paths,next)||next(at);if("repeat"in item){let again=(count,from)=>count>=item.min&&next(from)||match(item.repeat,args,from,paths,to=>to>from&&again(count+1,to));return again(0,at)}let arg=args[at];if(arg===void 0)return!1;let value="prefix"in item?arg.startsWith(item.prefix)?arg.slice(item.prefix.length):void 0:arg;if(value===void 0||!KINDS[item.kind](value))return!1;let kind=item.kind,typed=kind==="path"||kind==="worktree"||(kind==="source"||kind==="target")&&localCandidate(value);return typed&&paths.push({kind,value}),next(at+1)?!0:(typed&&paths.pop(),!1)}function matchShape(sub,args){for(let shape of SHAPES[sub]??[]){let paths=[];if(match(shape,args,0,paths,at=>at===args.length))return paths}}var HAND_GIT_PREFIX=["-c","core.fsmonitor=false","-c","protocol.file.allow=always"],SUBCOMMANDS=new Set(["add","branch","cat-file","checkout","commit","commit-tree","config","count-objects","diff","diff-files","diff-tree","for-each-ref","hash-object","init","log","ls-files","ls-remote","ls-tree","maintenance","merge","merge-base","prune-packed","push","read-tree","remote","reset","restore","rev-list","rev-parse","rm","show","show-ref","status","symbolic-ref","update-index","update-ref","worktree","write-tree"]);function configKey(key){let parts=key.split(".");if(parts.length<2)return key;let section=parts[0]?.toLowerCase()??"",name=parts[parts.length-1]?.toLowerCase()??"";return[section,...parts.slice(1,-1),name].join(".")}var keySet=keys=>new Set(keys.map(configKey)),CALLER_C_KEYS=keySet(["maintenance.auto","gc.auto","user.name","user.email","core.autocrlf","log.showRoot","core.quotePath","log.showSignature","log.follow"]),CONFIG_KEYS=keySet(["omo.agentId","user.name","user.email","commit.gpgsign","gc.auto","core.autocrlf","omo.memoryRepository.url","omo.sync.binding","omo.sync.space"]);function subcommandArgs(sub,rest){if(sub==="config"){let[scope,first,second,extra]=rest;if(scope!=="--local"||first===void 0||extra!==void 0)return"config shape";let key=first==="--get"||first==="--unset-all"?second:first;return key===void 0||first!=="--get"&&first!=="--unset-all"&&(second??"-").startsWith("-")?"config shape":CONFIG_KEYS.has(configKey(key))?[]:`config key ${key}`}return matchShape(sub,rest)??`${sub} shape`}function planGit(argv){let index=0;for(;argv[index]?.startsWith("-");){let arg=argv[index]??"";if(arg==="--literal-pathspecs"){index++;continue}if(arg!=="-c")return arg;let setting=argv[index+1]??"",separator=setting.indexOf("=");if(separator<=0||!CALLER_C_KEYS.has(configKey(setting.slice(0,separator))))return`-c ${setting}`;index+=2}let sub=argv[index];if(sub===void 0||!SUBCOMMANDS.has(sub))return`subcommand ${sub??"(none)"}`;let paths=subcommandArgs(sub,argv.slice(index+1));return typeof paths=="string"?paths:{argv:[...HAND_GIT_PREFIX,...argv],paths}}var equal=(args,expected)=>args.length===expected.length&&args.every((arg,index)=>arg===expected[index]);function planLsof(argv,uid){let holders=argv.length===3&&argv[0]==="-t"&&argv[1]==="--"&&(argv[2]??"").length>0,inUse=equal(argv,["-w","-a","-d","cwd","-u",String(uid),"-Fpn"]);return holders||inUse?[...argv]:"lsof shape"}var CALLER_ENV={GIT_TERMINAL_PROMPT:value=>value==="0",GIT_INDEX_FILE:value=>value.length>0,GIT_GLOB_PATHSPECS:value=>value==="0"||value==="1",GIT_AUTHOR_NAME:()=>!0,GIT_AUTHOR_EMAIL:()=>!0,GIT_COMMITTER_NAME:()=>!0,GIT_COMMITTER_EMAIL:()=>!0},WIN32_BASELINE=["SYSTEMROOT","TEMP","TMP","USERPROFILE","HOMEDRIVE","HOMEPATH","PATHEXT"];function baseline(context){let env={},keep=key=>{let value=context.ownEnv[key];value!==void 0&&(env[key]=value)};for(let key of["PATH","HOME","SSH_AUTH_SOCK"])keep(key);if(context.platform==="win32")for(let key of WIN32_BASELINE)keep(key);else keep("TMPDIR"),env.LANG="C";return env.GIT_PROTOCOL_FROM_USER="0",env}function planRun(request,context){let env=baseline(context);for(let[key,value]of Object.entries(request.env)){let allowed2=Object.hasOwn(CALLER_ENV,key)?CALLER_ENV[key]:void 0;if(allowed2===void 0||!allowed2(value))return{ok:!1,reason:`not in the run allowlist: env ${key}`};env[key]=value}let planned=request.exe==="git"?planGit(request.argv):request.exe==="lsof"?planLsof(request.argv,context.uid):`executable ${request.exe}`;return typeof planned=="string"?{ok:!1,reason:`not in the run allowlist: ${planned}`}:Array.isArray(planned)?{ok:!0,exe:"lsof",argv:planned,env,paths:[]}:{ok:!0,exe:"git",argv:planned.argv,env,paths:planned.paths}}var SAFE=/^[A-Za-z0-9@%+=:,./_-]+$/;function renderCommand(exe,argv){return[exe,...argv].map(arg=>SAFE.test(arg)?arg:`'${arg.replaceAll("'","'\\''")}'`).join(" ")}import{execFile as execFile2}from"node:child_process";import{lstat as lstat2,stat}from"node:fs/promises";import{basename as basename3,dirname as dirname3,isAbsolute,join as join3,resolve as resolve2,sep}from"node:path";import{execFile}from"node:child_process";import{lstat,readdir,realpath}from"node:fs/promises";import{basename as basename2,dirname as dirname2,join as join2}from"node:path";var SHAPE="local_repo_shape_unsupported",WALK_BOUND=2e4,refuse=detail=>{throw new DeviceFileError("refused_by_policy",`${SHAPE}: ${detail}`)};async function kindOf(path){let entry=await lstat(path).catch(()=>{});if(entry!==void 0)return entry.isSymbolicLink()?"link":entry.isFile()?"file":entry.isDirectory()?"dir":"other"}async function noLinks(path,recursive,budget){let kind=await kindOf(path);if(kind!==void 0&&(kind==="link"&&refuse(`symlink at ${path}`),kind==="dir"))for(let name of await readdir(path)){budget.left-=1,budget.left<0&&refuse(`more than ${WALK_BOUND} entries under the repository`);let child=join2(path,name),childKind=await kindOf(child);childKind==="link"&&refuse(`symlink at ${child}`),recursive&&childKind==="dir"&&await noLinks(child,!0,budget)}}async function plainGitDir(dir){let[head,objects,refs,commondir,alternates]=await Promise.all(["HEAD","objects","refs","commondir","objects/info/alternates"].map(entry=>kindOf(join2(dir,entry))));(head!=="file"||objects!=="dir"||refs!=="dir")&&refuse(`${dir} is not a plain git directory`),(commondir!==void 0||alternates!==void 0)&&refuse(`${dir} redirects through commondir or alternates`);let budget={left:WALK_BOUND};for(let entry of["HEAD","config","packed-refs"])await noLinks(join2(dir,entry),!1,budget);await noLinks(join2(dir,"refs"),!0,budget),await noLinks(join2(dir,"hooks"),!0,budget),await noLinks(join2(dir,"logs"),!0,budget),await noLinks(join2(dir,"worktrees"),!1,budget),await noLinks(join2(dir,"objects"),!1,budget);for(let sub of["info","pack"])await noLinks(join2(dir,"objects",sub),!1,budget)}function gitConfig(file){let env={PATH:process.env.PATH??"/usr/bin:/bin",GIT_CONFIG_NOSYSTEM:"1",GIT_CONFIG_GLOBAL:"/dev/null",LANG:"C"};return new Promise((done,fail)=>{execFile("git",["config","--file",file,"--no-includes","--list","-z"],{env,timeout:3e4,windowsHide:!0},(error,stdout)=>{if(error)return fail(error);let records=String(stdout).split("\0").filter(Boolean);done(records.map(record=>{let at=record.indexOf(`
|
|
2
|
+
import{PresentationBroker,bootstrapRuntime,buildToolRegistry,builtInExtensions,canonicalizeFilesystemPath,childModuleRoots,createAgentSessionServices,createProjectTrustContext,createToolChildRuntime,forwardToolEvents,presetTrustsProject,resolveProjectTrusted,sessionExtensionFlagValues,toolChildModuleRoots,toolInfoOf,withFileMutationQueue,withFileMutationQueues}from"./chunk-YCPURLPU.js";import"./chunk-XH24X5B2.js";import"./chunk-74IB3JPP.js";import"./chunk-QATU6BBC.js";import"./chunk-3IYEGHBI.js";import"./chunk-RYPM5BZQ.js";import"./chunk-NLYT7BND.js";import{SettingsManager}from"./chunk-TUEZNIBK.js";import"./chunk-FEQDJBDL.js";import"./chunk-XI6THO4F.js";import"./chunk-UOZDDYBN.js";import"./chunk-J2I56WLK.js";import"./chunk-GTJJ73DE.js";import{ProjectTrustStore,getSavedProjectTrust,hasTrustRequiringProjectResources}from"./chunk-VD7AKTGP.js";import"./chunk-7MN7YNO5.js";import"./chunk-M2VJVJMK.js";import"./chunk-TQHNFP77.js";import"./chunk-ZUQCYIRY.js";import"./chunk-HKCFMDJN.js";import"./chunk-3Q5ZENSD.js";import"./chunk-3QPE75AR.js";import"./chunk-4GKU755E.js";import"./chunk-Y3TMJV3J.js";import"./chunk-O3FG6HML.js";import"./chunk-MOVB6H22.js";import"./chunk-DLPV4B3R.js";import"./chunk-VPVD5G32.js";import"./chunk-H4QOEVS5.js";import"./chunk-SOMFLLPD.js";import"./chunk-MTQQ2VQH.js";import"./chunk-OF3XVGG4.js";import"./chunk-Q4G5DECT.js";import"./chunk-QMRJYMNH.js";import"./chunk-DZQA5LVN.js";import"./chunk-IEY2SL46.js";import"./chunk-26UBFF6N.js";import"./chunk-4JMGWVRH.js";import"./chunk-E5O4SP5I.js";import"./chunk-DX43FSQT.js";import"./chunk-7WYJAYHH.js";import{closeServer,listen,prepareSocketPath}from"./chunk-47T6YMI2.js";import"./chunk-R2Z7CX77.js";import"./chunk-UCXBDE6R.js";import"./chunk-YI6KRJDC.js";import"./chunk-VUY4BZDI.js";import{MAX_RPC_LINE_CHARACTERS,attachJsonlLineReader}from"./chunk-SF4MQDKZ.js";import"./chunk-EJB5E2JK.js";import"./chunk-RCHIMH7N.js";import"./chunk-GILDYS3O.js";import"./chunk-KLAX467B.js";import"./chunk-C4AHHZ6P.js";import"./chunk-J7FW7MED.js";import"./chunk-2EJ4BGBM.js";import"./chunk-GZVCRV7I.js";import"./chunk-KUPQO7MC.js";import"./chunk-U3VOXCGP.js";import"./chunk-7X72IACK.js";import"./chunk-MSDBBOB2.js";import"./chunk-WHQ2QPP5.js";import"./chunk-J2NGJKXL.js";import"./chunk-WB4BUHOH.js";import"./chunk-NJ43NBSP.js";import"./chunk-KDUJCDLM.js";import"./chunk-6APXZK7W.js";import"./chunk-YU2P3CAR.js";import"./chunk-2IKL4F24.js";import"./chunk-KJR3XXMI.js";import"./chunk-IYL5E4QQ.js";import"./chunk-7THM57HH.js";import"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import"./chunk-2U6HXWXS.js";import"./chunk-TMXRR3N7.js";import"./chunk-LPYBKMPT.js";import{localDeviceFiles}from"./chunk-33MZJTQ3.js";import{DeviceFileError,FILE_CHANNEL_MAX_BYTES,base64Length,createReliableTransport,createRemoteExecutor,decodeBase64,decodeDeviceFileArgs,encodeBase64,fileRefusal,fileResult,serveLoopHooks}from"./chunk-V5FSENW6.js";import"./chunk-R7J5TEYK.js";import"./chunk-BPNSOZ2C.js";import"./chunk-DLAY7CIU.js";import{validateToolArguments}from"./chunk-WXYMAUFX.js";import"./chunk-WOHQJ6JB.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-XH2MWTXA.js";import"./chunk-GVSBCJFI.js";import"./chunk-QTS2XGPQ.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-BMX2U22F.js";import"./chunk-GLTOBXZY.js";import"./chunk-IKJCA5SH.js";import"./chunk-ZOFZRJSL.js";import"./chunk-ZFIC2DZV.js";import"./chunk-2SOVDETB.js";import"./chunk-E266ORGA.js";import"./chunk-T2SMQPRE.js";import"./chunk-RUGTHELO.js";import"./chunk-42XRJQM6.js";import"./chunk-IHES3JES.js";import{shieldSocketDuringClose,unlinkOwnedSocket}from"./chunk-5XHOHZIR.js";import{authenticateSocket,ensureSocketSecret,resolveSocketTransportAddress,socketSecretPath}from"./chunk-HW6AAS3R.js";import{isLocalPath,resolvePath}from"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-EYSV6A7S.js";import"./chunk-MIENF2YK.js";import"./chunk-OXNWERO4.js";import"./chunk-44BJPS5I.js";import"./chunk-AOTHPTMU.js";import"./chunk-O5RYI3IW.js";import"./chunk-RFFMEA4B.js";import"./chunk-IKOFCODM.js";import{createServer}from"node:net";import{posix as posix2,win32}from"node:path";import{isAbsolute as isAbsolute2}from"node:path";import{randomUUID as randomUUID2}from"node:crypto";import{basename as basename4,dirname as dirname4,join as join4,resolve as resolve3}from"node:path";import{spawn}from"node:child_process";import{randomUUID}from"node:crypto";import{existsSync}from"node:fs";import{constants as fsConstants}from"node:fs";import{open}from"node:fs/promises";import{constants as osConstants}from"node:os";import{basename,dirname,join,resolve}from"node:path";var GIT_ACTIVITY_LOCK_NAME="git-activity.flock",GIT_ACTIVITY_SHARED_WAIT_MS=1e4,RETRY_MS=5,LOCK_SH=1,LOCK_NB=4;function classifyFlockErrno(errno){let{EAGAIN,EWOULDBLOCK,ENOLCK,EOPNOTSUPP,ENOSYS}=osConstants.errno;return errno===EAGAIN||errno===EWOULDBLOCK?"busy":errno===ENOLCK||errno===EOPNOTSUPP||errno===ENOSYS?"no-lock":"failed"}function identityLocksDir(repoDir){let repo=resolve(repoDir);if(!(basename(repo)!=="repo"||basename(dirname(dirname(repo)))!=="agents"))return join(dirname(repo),"runtime","locks")}var NO_HOLD={fd:void 0,release:async()=>{}},delay=ms=>new Promise(done=>setTimeout(done,ms));async function holdActivityLock(cwd,flock,waitMs=GIT_ACTIVITY_SHARED_WAIT_MS){let locksDir=identityLocksDir(cwd);if(locksDir===void 0||flock===void 0)return NO_HOLD;if(!existsSync(locksDir))throw new DeviceFileError("not_found","the identity's locks directory does not exist");let handle=await open(join(locksDir,GIT_ACTIVITY_LOCK_NAME),fsConstants.O_RDWR|fsConstants.O_CREAT,384),deadline=Date.now()+waitMs;try{for(;;){let{rc,errno}=flock(handle.fd,LOCK_SH|LOCK_NB);if(rc===0)return{fd:handle.fd,release:()=>handle.close()};let kind=classifyFlockErrno(errno);if(kind==="no-lock")return await handle.close(),NO_HOLD;if(kind==="failed")throw new DeviceFileError("io",`flock on the git-activity lock failed (errno ${errno})`);if(Date.now()>=deadline)throw new DeviceFileError("io",`the git-activity lock stayed exclusively held for ${waitMs} ms`);await delay(RETRY_MS)}}catch(error){throw await handle.close(),error}}import{posix}from"node:path";var k=kind=>({kind}),eq=(prefix,kind)=>({prefix,kind}),opt=(...optional)=>({optional}),rep=(min,...repeat)=>({repeat,min}),NUL=/\0/,REV=/^(?![-./~:])[A-Za-z0-9._/@{}^~+-]+$/,REL=/^(?![/-])(?!.*(?:^|\/)\.\.(?:\/|$))[^\0]+$/,rev=value=>REV.test(value)&&!value.includes("..")&&!value.includes("//"),range=value=>{let parts=value.split("..");return parts.length===2&&parts.every(rev)},blobref=value=>{let at=value.indexOf(":");return at>=0&&(at===0||rev(value.slice(0,at)))&&REL.test(value.slice(at+1))},filesystem=value=>value.length>0&&!NUL.test(value)&&!/^[-:]/.test(value);function scheme(value){return/^([A-Za-z][A-Za-z0-9+.-]*):\/\//.exec(value)?.[1]}function urlIsLocal(value){let colon=value.indexOf(":"),slash=value.indexOf("/");return colon<0||slash>=0&&slash<colon||process.platform==="win32"&&/^[A-Za-z]:[\\/]/.test(value)}var unsafeUrl=value=>value.length===0||NUL.test(value)||/\s/.test(value)||value.startsWith("-")||value.includes("::");function remote(value){if(unsafeUrl(value))return!1;let named=scheme(value);return named!==void 0?named==="https"||named==="ssh":!urlIsLocal(value)}function localUrlPath(value){if(unsafeUrl(value)||scheme(value)!=="file")return;let rest=value.slice(7);if(!rest.startsWith("/")||/[?#]/.test(rest))return;let path;try{path=decodeURIComponent(rest)}catch{return}return path.length>1&&!NUL.test(path)&&!path.endsWith("/")&&posix.normalize(path)===path&&path.split("/").slice(1).every(part=>part!==""&&part!=="."&&part!=="..")?path:void 0}var localCandidate=value=>!unsafeUrl(value)&&(scheme(value)==="file"||scheme(value)===void 0&&urlIsLocal(value)),KINDS={rev,range,revish:value=>rev(value)||range(value),object:value=>rev(value)||blobref(value),blobref,ref:value=>value==="HEAD"||/^refs\/[A-Za-z0-9._/-]+$/.test(value)&&!value.includes(".."),refpat:value=>/^refs\/[A-Za-z0-9._/-]+\*?$/.test(value)&&!value.includes(".."),branch:value=>/^(?![-./])[A-Za-z0-9._/-]+$/.test(value)&&!value.includes(".."),refspec:value=>/^[A-Za-z0-9._/]+(?:-[A-Za-z0-9._/]+)*:[A-Za-z0-9._/-]+$/.test(value)&&!value.includes(".."),msg:value=>!NUL.test(value),count:value=>/^\d{1,9}$/.test(value),mode:value=>/^(?:100644|100755|120000|160000)$/.test(value),oid:value=>/^[0-9a-f]{40}(?:[0-9a-f]{24})?$/.test(value),filter:value=>/^[ACDMRTUXB]+$/i.test(value),fmt:value=>!NUL.test(value),iso:value=>/^\d{4}-\d\d-\d\dT[\d:.]+Z$/.test(value),relpath:value=>REL.test(value),gitpath:value=>value==="index"||value==="MERGE_HEAD",path:filesystem,worktree:filesystem,source:value=>remote(value)||localCandidate(value),target:value=>remote(value)||localCandidate(value)},FORMAT=eq("--format=","fmt"),LOG_RECORD="--format=%x1e%H%x1f%s%x1f%b%x1f%an%x1f%ae%x1f%cI",SHAPES={add:[["-A","--",rep(1,k("path"))]],branch:[["--show-current"],["-D",k("branch")]],"cat-file":[["blob",k("object")],["--batch"],["-e",k("blobref")]],checkout:[[k("rev"),"--",k("path")]],commit:[["-q","--no-verify","-m",k("msg")]],"commit-tree":[[k("rev"),opt("-p",k("rev")),"-F","-"]],"count-objects":[["-v"]],diff:[["--cached","-M","-C","-z","--raw","--no-abbrev"],["--name-only","-z",eq("--diff-filter=","filter"),k("rev"),k("rev"),"--"],["--name-status","-M","-z",k("range"),"--"],["--cached","--quiet",k("rev"),"--"],["--no-renames","--name-only","-z",k("range"),"--",k("path")],["--name-only","-z",k("range"),"--"],["--name-only",eq("--diff-filter=","filter")]],"diff-files":[["--name-only","-z"]],"diff-tree":[["-r","-m","--no-commit-id","--no-renames",eq("--diff-filter=","filter"),"--raw","-z",k("rev")]],"for-each-ref":[[FORMAT,rep(1,k("refpat"))]],"hash-object":[[opt("-w"),"--no-filters","--stdin"],[opt("-w"),eq("--path=","relpath"),"--stdin"]],init:[["--template="]],log:[["-1",FORMAT,k("rev")],[{prefix:"-",kind:"count"},FORMAT,k("rev")],[FORMAT,"--name-only","-z","--no-renames","--diff-merges=first-parent",eq("--diff-filter=","filter"),rep(0,k("revish")),"--"],[LOG_RECORD,opt("--name-only","-z","--no-renames","--full-diff"),opt("--fixed-strings","--all-match",rep(1,eq("--grep=","msg"))),opt("-n",k("count")),opt(eq("--since=","iso")),opt(k("revish")),opt("--",rep(1,k("path")))]],"ls-files":[["--stage","-z","--",k("path")],["--eol","-z"]],"ls-remote":[[k("source"),k("ref")]],"ls-tree":[["-r","--name-only","-z",k("rev"),opt("--",k("path"))],["-r","-l","-z",k("rev")],["-r","-z",k("rev")],["-z",k("rev"),"--",k("path")]],maintenance:[["run","--task=loose-objects","--quiet"]],merge:[[],["--abort"],[opt("--no-ff"),opt("-m",k("msg")),k("rev")],["--no-ff",k("rev"),rep(1,"-m",k("msg"))]],"merge-base":[["--is-ancestor",k("rev"),k("rev")]],"prune-packed":[["--quiet"]],push:[["--quiet",k("target"),k("refspec")]],"read-tree":[["--empty"],[k("rev")]],remote:[["-v"]],reset:[["--soft",k("rev")]],restore:[["--source=HEAD","--staged",opt("--worktree"),"--",rep(1,k("path"))]],"rev-list":[[opt("--count"),k("range")],["--reverse",k("range")]],"rev-parse":[["--verify",opt("--quiet"),k("rev")],["-q","--verify",k("rev")],["--git-path",k("gitpath")],["--git-common-dir"]],rm:[["-q","--cached",opt("-f"),"--ignore-unmatch","--",rep(1,k("path"))],["-rf","-q","--ignore-unmatch","--",k("path")]],show:[["-s",FORMAT,k("rev")],[k("blobref")]],"show-ref":[["--verify",k("ref")]],status:[["--porcelain",opt("--untracked-files=all",opt("--",rep(1,k("path"))))]],"symbolic-ref":[["HEAD",k("ref")]],"update-index":[["--force-remove","--",k("path")],["--add","--cacheinfo",k("mode"),k("oid"),k("path")],["-q","-z","--stdin"]],"update-ref":[["-m",k("msg"),"HEAD",k("rev"),k("rev")]],worktree:[["add","-b",k("branch"),k("worktree"),k("rev")],["remove",opt("--force"),k("worktree")],["list","--porcelain"],["prune"]],"write-tree":[[]]};function match(items,args,at,paths,then){let[item,...rest]=items;if(item===void 0)return then(at);let next=to=>match(rest,args,to,paths,then);if(typeof item=="string")return args[at]===item&&next(at+1);if("optional"in item)return match(item.optional,args,at,paths,next)||next(at);if("repeat"in item){let again=(count,from)=>count>=item.min&&next(from)||match(item.repeat,args,from,paths,to=>to>from&&again(count+1,to));return again(0,at)}let arg=args[at];if(arg===void 0)return!1;let value="prefix"in item?arg.startsWith(item.prefix)?arg.slice(item.prefix.length):void 0:arg;if(value===void 0||!KINDS[item.kind](value))return!1;let kind=item.kind,typed=kind==="path"||kind==="worktree"||(kind==="source"||kind==="target")&&localCandidate(value);return typed&&paths.push({kind,value}),next(at+1)?!0:(typed&&paths.pop(),!1)}function matchShape(sub,args){for(let shape of SHAPES[sub]??[]){let paths=[];if(match(shape,args,0,paths,at=>at===args.length))return paths}}var HAND_GIT_PREFIX=["-c","core.fsmonitor=false","-c","protocol.file.allow=always"],SUBCOMMANDS=new Set(["add","branch","cat-file","checkout","commit","commit-tree","config","count-objects","diff","diff-files","diff-tree","for-each-ref","hash-object","init","log","ls-files","ls-remote","ls-tree","maintenance","merge","merge-base","prune-packed","push","read-tree","remote","reset","restore","rev-list","rev-parse","rm","show","show-ref","status","symbolic-ref","update-index","update-ref","worktree","write-tree"]);function configKey(key){let parts=key.split(".");if(parts.length<2)return key;let section=parts[0]?.toLowerCase()??"",name=parts[parts.length-1]?.toLowerCase()??"";return[section,...parts.slice(1,-1),name].join(".")}var keySet=keys=>new Set(keys.map(configKey)),CALLER_C_KEYS=keySet(["maintenance.auto","gc.auto","user.name","user.email","core.autocrlf","log.showRoot","core.quotePath","log.showSignature","log.follow"]),CONFIG_KEYS=keySet(["omo.agentId","user.name","user.email","commit.gpgsign","gc.auto","core.autocrlf","omo.memoryRepository.url","omo.sync.binding","omo.sync.space"]);function subcommandArgs(sub,rest){if(sub==="config"){let[scope,first,second,extra]=rest;if(scope!=="--local"||first===void 0||extra!==void 0)return"config shape";let key=first==="--get"||first==="--unset-all"?second:first;return key===void 0||first!=="--get"&&first!=="--unset-all"&&(second??"-").startsWith("-")?"config shape":CONFIG_KEYS.has(configKey(key))?[]:`config key ${key}`}return matchShape(sub,rest)??`${sub} shape`}function planGit(argv){let index=0;for(;argv[index]?.startsWith("-");){let arg=argv[index]??"";if(arg==="--literal-pathspecs"){index++;continue}if(arg!=="-c")return arg;let setting=argv[index+1]??"",separator=setting.indexOf("=");if(separator<=0||!CALLER_C_KEYS.has(configKey(setting.slice(0,separator))))return`-c ${setting}`;index+=2}let sub=argv[index];if(sub===void 0||!SUBCOMMANDS.has(sub))return`subcommand ${sub??"(none)"}`;let paths=subcommandArgs(sub,argv.slice(index+1));return typeof paths=="string"?paths:{argv:[...HAND_GIT_PREFIX,...argv],paths}}var equal=(args,expected)=>args.length===expected.length&&args.every((arg,index)=>arg===expected[index]);function planLsof(argv,uid){let holders=argv.length===3&&argv[0]==="-t"&&argv[1]==="--"&&(argv[2]??"").length>0,inUse=equal(argv,["-w","-a","-d","cwd","-u",String(uid),"-Fpn"]);return holders||inUse?[...argv]:"lsof shape"}var CALLER_ENV={GIT_TERMINAL_PROMPT:value=>value==="0",GIT_INDEX_FILE:value=>value.length>0,GIT_GLOB_PATHSPECS:value=>value==="0"||value==="1",GIT_AUTHOR_NAME:()=>!0,GIT_AUTHOR_EMAIL:()=>!0,GIT_COMMITTER_NAME:()=>!0,GIT_COMMITTER_EMAIL:()=>!0},WIN32_BASELINE=["SYSTEMROOT","TEMP","TMP","USERPROFILE","HOMEDRIVE","HOMEPATH","PATHEXT"];function baseline(context){let env={},keep=key=>{let value=context.ownEnv[key];value!==void 0&&(env[key]=value)};for(let key of["PATH","HOME","SSH_AUTH_SOCK"])keep(key);if(context.platform==="win32")for(let key of WIN32_BASELINE)keep(key);else keep("TMPDIR"),env.LANG="C";return env.GIT_PROTOCOL_FROM_USER="0",env}function planRun(request,context){let env=baseline(context);for(let[key,value]of Object.entries(request.env)){let allowed2=Object.hasOwn(CALLER_ENV,key)?CALLER_ENV[key]:void 0;if(allowed2===void 0||!allowed2(value))return{ok:!1,reason:`not in the run allowlist: env ${key}`};env[key]=value}let planned=request.exe==="git"?planGit(request.argv):request.exe==="lsof"?planLsof(request.argv,context.uid):`executable ${request.exe}`;return typeof planned=="string"?{ok:!1,reason:`not in the run allowlist: ${planned}`}:Array.isArray(planned)?{ok:!0,exe:"lsof",argv:planned,env,paths:[]}:{ok:!0,exe:"git",argv:planned.argv,env,paths:planned.paths}}var SAFE=/^[A-Za-z0-9@%+=:,./_-]+$/;function renderCommand(exe,argv){return[exe,...argv].map(arg=>SAFE.test(arg)?arg:`'${arg.replaceAll("'","'\\''")}'`).join(" ")}import{execFile as execFile2}from"node:child_process";import{lstat as lstat2,stat}from"node:fs/promises";import{basename as basename3,dirname as dirname3,isAbsolute,join as join3,resolve as resolve2,sep}from"node:path";import{execFile}from"node:child_process";import{lstat,readdir,realpath}from"node:fs/promises";import{basename as basename2,dirname as dirname2,join as join2}from"node:path";var SHAPE="local_repo_shape_unsupported",WALK_BOUND=2e4,refuse=detail=>{throw new DeviceFileError("refused_by_policy",`${SHAPE}: ${detail}`)};async function kindOf(path){let entry=await lstat(path).catch(()=>{});if(entry!==void 0)return entry.isSymbolicLink()?"link":entry.isFile()?"file":entry.isDirectory()?"dir":"other"}async function noLinks(path,recursive,budget){let kind=await kindOf(path);if(kind!==void 0&&(kind==="link"&&refuse(`symlink at ${path}`),kind==="dir"))for(let name of await readdir(path)){budget.left-=1,budget.left<0&&refuse(`more than ${WALK_BOUND} entries under the repository`);let child=join2(path,name),childKind=await kindOf(child);childKind==="link"&&refuse(`symlink at ${child}`),recursive&&childKind==="dir"&&await noLinks(child,!0,budget)}}async function plainGitDir(dir){let[head,objects,refs,commondir,alternates]=await Promise.all(["HEAD","objects","refs","commondir","objects/info/alternates"].map(entry=>kindOf(join2(dir,entry))));(head!=="file"||objects!=="dir"||refs!=="dir")&&refuse(`${dir} is not a plain git directory`),(commondir!==void 0||alternates!==void 0)&&refuse(`${dir} redirects through commondir or alternates`);let budget={left:WALK_BOUND};for(let entry of["HEAD","config","packed-refs"])await noLinks(join2(dir,entry),!1,budget);await noLinks(join2(dir,"refs"),!0,budget),await noLinks(join2(dir,"hooks"),!0,budget),await noLinks(join2(dir,"logs"),!0,budget),await noLinks(join2(dir,"worktrees"),!1,budget),await noLinks(join2(dir,"objects"),!1,budget);for(let sub of["info","pack"])await noLinks(join2(dir,"objects",sub),!1,budget)}function gitConfig(file){let env={PATH:process.env.PATH??"/usr/bin:/bin",GIT_CONFIG_NOSYSTEM:"1",GIT_CONFIG_GLOBAL:"/dev/null",LANG:"C"};return new Promise((done,fail)=>{execFile("git",["config","--file",file,"--no-includes","--list","-z"],{env,timeout:3e4,windowsHide:!0},(error,stdout)=>{if(error)return fail(error);let records=String(stdout).split("\0").filter(Boolean);done(records.map(record=>{let at=record.indexOf(`
|
|
3
3
|
`);return at<0?[record,""]:[record.slice(0,at),record.slice(at+1)]}))})})}var INIT_KEYS=new Set(["core.repositoryformatversion","core.filemode","core.bare","core.ignorecase","core.precomposeunicode","core.logallrefupdates"]),CLONE_KEY=/^remote\..+\.(?:url|fetch|mirror|tagopt)$/,WORKING_CLONE_KEY=/^branch\..+\.(?:remote|merge)$|^user\.(?:name|email)$/;async function allowlistedConfig(dir,bare){let config=join2(dir,"config");await kindOf(config)!=="file"&&refuse(`${dir} has no config file`);let entries=await gitConfig(config).catch(()=>refuse("target config is unreadable"));for(let[key,value]of entries){if(key==="core.bare"){value!==String(bare)&&refuse(`core.bare=${value} on a ${bare?"bare":"working-clone"} target`);continue}INIT_KEYS.has(key)||CLONE_KEY.test(key)||!bare&&WORKING_CLONE_KEY.test(key)||refuse(`target config key ${key} is not allowlisted`)}}async function canonicalLocalRepo(path){let parent=await realpath(dirname2(path)).catch(()=>refuse(`no repository at ${path}`)),real=join2(parent,basename2(path)),self=await kindOf(real);self==="link"&&refuse(`${path} is a symlink`),self!=="dir"&&refuse(`no repository at ${path}`),await kindOf(`${real}.git`)!==void 0&&refuse(`${path}.git exists`);let dotGit=await kindOf(join2(real,".git"));dotGit!==void 0&&dotGit!=="dir"&&refuse(`${path}/.git is not a directory`);let gitDir=dotGit==="dir"?join2(real,".git"):real;return await plainGitDir(gitDir),await allowlistedConfig(gitDir,dotGit!=="dir"),gitDir}var MIN_GIT=[2,29];function git(argv,cwd,env){return new Promise((done,fail)=>{execFile2("git",[...argv],{cwd,env,timeout:3e4,windowsHide:!0},(error,stdout)=>error?fail(error):done(String(stdout)))})}var versionChecked;function gitIsSupported(env){return versionChecked??=git(["--version"],process.cwd(),env).then(output=>{let match2=/git version (\d+)\.(\d+)/.exec(output);if(match2===null)return!1;let[major,minor]=[Number(match2[1]),Number(match2[2])];return major>MIN_GIT[0]||major===MIN_GIT[0]&&minor>=MIN_GIT[1]},()=>!1),versionChecked}async function runDirectory(root,cwd){let canonical=await canonicalizeFilesystemPath(resolve2(root,cwd)),entry=await stat(canonical).catch(()=>{});if(entry===void 0)throw new DeviceFileError("not_found",cwd);if(!entry.isDirectory())throw new DeviceFileError("not_a_file",cwd);return canonical}var inside=(path,dir)=>path===dir||path.startsWith(`${dir}${sep}`);async function confinedIndexFile(value,cwd,env){if(!isAbsolute(value))throw new DeviceFileError("refused_by_policy","GIT_INDEX_FILE must be absolute");let dirs=await gitDirs(cwd,env),parent=await canonicalizeFilesystemPath(dirname3(value));if(!dirs.some(dir=>inside(parent,dir)))throw new DeviceFileError("refused_by_policy","GIT_INDEX_FILE is outside the repository's git directory");return join3(parent,basename3(value))}async function hasUrlRewrites(cwd,env){return(await git(["config","--get-regexp","^url\\."],cwd,env).catch(error=>error.code===1?"":Promise.reject(error))).trim().length>0}async function gitDirs(cwd,env){let[gitDir,commonDir]=(await git(["rev-parse","--absolute-git-dir","--git-common-dir"],cwd,env)).trim().split(`
|
|
4
4
|
`);if(gitDir===void 0||commonDir===void 0)throw new DeviceFileError("refused_by_policy","no repository at cwd");return Promise.all([gitDir,resolve2(cwd,commonDir)].map(dir=>canonicalizeFilesystemPath(dir)))}async function canonicalTarget(raw,cwd){let target=resolve2(cwd,raw);if((await lstat2(target).catch(()=>{}))?.isSymbolicLink()===!0)throw new DeviceFileError("refused_by_policy",`symlink: ${raw}`);return join3(await canonicalizeFilesystemPath(dirname3(target)),basename3(target))}async function confinePaths(paths,cwd,env){if(paths.length===0)return[];let dirs=await gitDirs(cwd,env),top=await git(["rev-parse","--show-toplevel"],cwd,env).then(output=>canonicalizeFilesystemPath(output.trim()),()=>{}),targets=[];for(let{kind,value}of paths){if(kind==="source"||kind==="target"){let local=localUrlPath(value);if(local===void 0)throw new DeviceFileError("refused_by_policy",`local_repo_shape_unsupported: only an absolute file:// url: ${value}`);let operation=kind==="source"?"read":"write";targets.push({operation,canonicalPath:await canonicalLocalRepo(local)});continue}let canonical=await canonicalTarget(value,cwd),inGitDir=dirs.some(dir=>inside(canonical,dir)||kind==="worktree"&&inside(dir,canonical));if(kind==="worktree"){if(inGitDir)throw new DeviceFileError("refused_by_policy","worktree path is inside the repository's git directory");targets.push({operation:"write",canonicalPath:canonical})}else if(!inGitDir&&(top===void 0||!inside(canonical,top)))throw new DeviceFileError("refused_by_policy",`path outside the repository: ${value}`)}return targets}var HARDENED_RECEIVE_PACK=["git","-c core.hooksPath=/dev/null","-c receive.denyCurrentBranch=refuse","-c core.fsmonitor=false","-c receive.autogc=false","-c gc.auto=0","-c maintenance.auto=false","receive-pack"].join(" "),CLIENT_LOCAL_GUARDS=["-c","core.hooksPath=/dev/null"],REMOTE_GUARDS=["-c","protocol.file.allow=never","-c","protocol.ext.allow=never","-c","protocol.fd.allow=never"];function subcommandAt(argv){let index=0;for(;index<argv.length&&(argv[index]??"").startsWith("-");)index+=argv[index]==="-c"?2:1;return index}function transportFor(argv,env,paths){let at=subcommandAt(argv),sub=argv[at];if(paths.some(path=>path.kind==="source"||path.kind==="target")){let pushed=sub==="push"?[`--receive-pack=${HARDENED_RECEIVE_PACK}`]:[];return{argv:[...argv.slice(0,at),...CLIENT_LOCAL_GUARDS,argv[at]??"",...pushed,...argv.slice(at+1)],env:{...env,GIT_CONFIG_NOSYSTEM:"1",GIT_CONFIG_GLOBAL:"/dev/null"},local:!0}}return sub==="ls-remote"||sub==="push"?{argv:[...argv.slice(0,at),...REMOTE_GUARDS,...argv.slice(at)],env,local:!1}:{argv:[...argv],env,local:!1}}var RUN_TIMEOUT_CAP_MS=3e5,DEFAULT_TIMEOUT_MS=3e4,KILL_GRACE_MS=1e4;async function judged(guards,command,nested){let input={command},decision;try{decision=await guards.beforeToolCall("bash",`run-${randomUUID()}`,input,nested)}catch(error){throw new DeviceFileError("refused_by_policy",error instanceof Error?error.message:String(error))}if(decision?.block===!0)throw new DeviceFileError("refused_by_policy",decision.reason??"blocked");if(input.command!==command)throw new DeviceFileError("refused_by_policy","a tool_call handler rewrote the command")}async function runOnHand(args,deps,signal){let plan=planRun({exe:args.exe,argv:args.argv,env:args.env},deps.context);if(!plan.ok)throw new DeviceFileError("refused_by_policy",plan.reason);if(args.stdin!==void 0&&base64Length(args.stdin)>FILE_CHANNEL_MAX_BYTES)throw new DeviceFileError("too_large","stdin");let cwd=await runDirectory(deps.root,args.cwd),verdict=await deps.guards.filesystemPolicy()?.({operation:"write",canonicalPath:cwd,toolName:"bash"});if(verdict!==void 0&&!verdict.allow)throw new DeviceFileError("refused_by_policy",verdict.reason);let transport=plan.exe==="git"?transportFor(plan.argv,plan.env,plan.paths):{argv:plan.argv,env:plan.env,local:!1},env={...transport.env};if(plan.exe==="git"){if(!await gitIsSupported(env))throw new DeviceFileError("unsupported","git 2.29 or newer is required");if(transport.local&&await hasUrlRewrites(cwd,env))throw new DeviceFileError("refused_by_policy","local_url_rewritten: a url.* rewrite is configured")}if(await judged(deps.guards,renderCommand(plan.exe,transport.argv),deps.nested),plan.exe==="git"){env.GIT_INDEX_FILE!==void 0&&(env.GIT_INDEX_FILE=await confinedIndexFile(env.GIT_INDEX_FILE,cwd,env));for(let{operation,canonicalPath}of await confinePaths(plan.paths,cwd,env)){let decision=await deps.guards.filesystemPolicy()?.({operation,canonicalPath,toolName:"bash"});if(decision!==void 0&&!decision.allow)throw new DeviceFileError("refused_by_policy",decision.reason)}}let hold=args.activityLock===!0&&plan.exe==="git"?await holdActivityLock(cwd,deps.flock):void 0;try{return await spawnBounded(plan.exe,transport.argv,cwd,env,args,hold?.fd,signal)}finally{await hold?.release()}}function spawnBounded(exe,argv,cwd,env,args,lockFd,signal){return new Promise((done,fail)=>{let child=spawn(exe,[...argv],{cwd,env,shell:!1,windowsHide:!0,stdio:["pipe","pipe","pipe",lockFd??"ignore"]}),out=[],err=[],size={out:0,err:0},overflow=!1,killTimer,stop=()=>{child.exitCode===null&&child.signalCode===null&&child.kill("SIGTERM"),killTimer??=setTimeout(()=>{child.kill("SIGKILL"),child.stdout?.destroy(),child.stderr?.destroy()},KILL_GRACE_MS)},timeout=setTimeout(stop,Math.min(args.timeoutMs??DEFAULT_TIMEOUT_MS,RUN_TIMEOUT_CAP_MS)),onAbort=()=>stop();signal.addEventListener("abort",onAbort,{once:!0});let collect=(into,key)=>chunk=>{if(size={...size,[key]:size[key]+chunk.length},size[key]>FILE_CHANNEL_MAX_BYTES){overflow=!0,stop();return}into.push(chunk)};child.stdout?.on("data",collect(out,"out")),child.stderr?.on("data",collect(err,"err")),child.on("error",error=>fail(new DeviceFileError("io",error.message))),child.on("close",(code,exitSignal)=>{if(clearTimeout(timeout),killTimer!==void 0&&clearTimeout(killTimer),signal.removeEventListener("abort",onAbort),signal.aborted)return fail(new DeviceFileError("aborted","the run was aborted"));if(overflow)return fail(new DeviceFileError("too_large","the run's output passed the limit"));done({code,signal:exitSignal,stdout:encodeBase64(new Uint8Array(Buffer.concat(out))),stderr:Buffer.concat(err).toString("utf8")})}),child.stdin?.on("error",()=>{}),child.stdin?.end(args.stdin===void 0?void 0:Buffer.from(decodeBase64(args.stdin)))})}function checksOf(args){switch(args.op){case"read":return[{toolName:"read",operation:"read",path:args.path}];case"list":return[{toolName:"ls",operation:"enumerate",path:args.path}];case"stat":return[{toolName:"ls",operation:"enumerate",path:args.path,entry:!0}];case"write":return[{toolName:"write",operation:"write",path:args.path,content:new TextDecoder().decode(decodeBase64(args.data))}];case"rename":return[{toolName:"write",operation:"write",path:args.path,content:"",entry:!0},{toolName:"write",operation:"write",path:args.to,content:"",entry:!0}];case"remove":return[{toolName:"write",operation:"write",path:args.path,content:"",entry:!0}];case"mkdir":return[{toolName:"write",operation:"write",path:args.path,content:""}]}}async function canonicalOf(path,entry){return entry?join4(await canonicalizeFilesystemPath(dirname4(path)),basename4(path)):canonicalizeFilesystemPath(path)}async function allowed(guards,root,check,nested){let content=check.content??"",input=check.toolName==="write"?{path:check.path,content}:{path:check.path},decision;try{decision=await guards.beforeToolCall(check.toolName,`file-${randomUUID2()}`,input,nested)}catch(error){throw new DeviceFileError("refused_by_policy",error instanceof Error?error.message:String(error))}if(decision?.block===!0)throw new DeviceFileError("refused_by_policy",decision.reason??"blocked");if(input.path!==check.path||check.toolName==="write"&&input.content!==content)throw new DeviceFileError("refused_by_policy","a tool_call handler rewrote the operation");let canonicalPath=await canonicalOf(resolve3(root,check.path),check.entry===!0),verdict=await guards.filesystemPolicy()?.({operation:check.operation,canonicalPath,toolName:check.toolName});if(verdict!==void 0&&!verdict.allow)throw new DeviceFileError("refused_by_policy",verdict.reason);return canonicalPath}function createHandFileOps(root,guards,run){let files=localDeviceFiles();return async(op,rawArgs,signal,nested)=>{let args=decodeDeviceFileArgs(op,rawArgs);if(args===void 0)return fileRefusal("protocol",`malformed ${op} arguments`);if(args.op==="run"){if(run===void 0)return fileRefusal("unsupported","this hand serves no run channel");try{let{exe,argv,env,stdin,timeoutMs,activityLock}=args,request={exe,argv,cwd:args.path,env,activityLock,...stdin===void 0?{}:{stdin},...timeoutMs===void 0?{}:{timeoutMs}},outcome=await runOnHand(request,{root,guards,context:run.context,flock:run.flock,...nested?{nested}:{}},signal);return fileResult({ok:!0,value:{...outcome}})}catch(error){return error instanceof DeviceFileError?fileRefusal(error.code,error.message):fileRefusal("io",error instanceof Error?error.message:String(error))}}if(args.op==="write"&&base64Length(args.data)>FILE_CHANNEL_MAX_BYTES)return fileRefusal("too_large",args.path);try{let[target,destination]=await Promise.all(checksOf(args).map(check=>allowed(guards,root,check,nested)));if(target===void 0)return fileRefusal("protocol","no target");let options={signal};switch(args.op){case"read":return fileResult({ok:!0,value:encodeBase64(await files.read(target,options))});case"list":return fileResult({ok:!0,value:[...await files.list(target,options)]});case"stat":return fileResult({ok:!0,value:{...await files.stat(target,options)}});case"write":{let data=decodeBase64(args.data);await withFileMutationQueue(target,()=>files.write(target,data,{...options,exclusive:args.exclusive}));break}case"rename":await withFileMutationQueues([target,destination??target],()=>files.rename(target,destination??target,options));break;case"remove":await withFileMutationQueue(target,()=>files.remove(target,options));break;case"mkdir":await files.mkdir(target,options);break}return fileResult({ok:!0,value:null})}catch(error){return error instanceof DeviceFileError?fileRefusal(error.code,error.message):fileRefusal("io",error instanceof Error?error.message:String(error))}}}var bound;function loadFlock(){return bound===void 0&&(bound=bindFlock()??null),bound??void 0}function bindFlock(){if(process.platform!=="darwin"&&process.platform!=="linux")return;let ffi=process.getBuiltinModule("bun:ffi");if(ffi===void 0)return;let errnoSymbol=process.platform==="darwin"?"__error":"__errno_location";try{let library=ffi.dlopen(process.platform==="darwin"?"libSystem.B.dylib":"libc.so.6",{flock:{args:[ffi.FFIType.i32,ffi.FFIType.i32],returns:ffi.FFIType.i32},[errnoSymbol]:{args:[],returns:ffi.FFIType.ptr}}),errnoPointer=library.symbols[errnoSymbol];return(fd,operation)=>{let rc=Number(library.symbols.flock(fd,operation));if(rc===0||errnoPointer===void 0)return{rc,errno:0};let pointer=errnoPointer();return{rc,errno:typeof pointer=="number"&&pointer!==0?ffi.read.i32(pointer,0):-1}}}catch{return}}var LOOPLESS_EXECUTE_CALLERS=["in-process-test-harness","remote-tool-executor"],issued=new WeakSet,LooplessExecuteRefusedError=class extends Error{constructor(reason){super(`loopless_execute_refused: ${reason}`)}};function grantLooplessExecuteToRemoteExecutor(){let grant=Object.freeze({caller:"remote-tool-executor"});return issued.add(grant),grant}function looplessGrantRunsToolHandlers(grant){return isLooplessExecuteGranted(grant)&&grant?.caller==="remote-tool-executor"}function isLooplessExecuteGranted(grant){return grant!==void 0&&issued.has(grant)&&LOOPLESS_EXECUTE_CALLERS.includes(grant.caller)}import{randomUUID as randomUUID3}from"node:crypto";async function resolveLooplessSettings(configuration,startupSettingsManager,profile,diagnostics){let{parsed,agentDir,appMode}=configuration,{cwd,launchProfile}=profile,trustStore=new ProjectTrustStore(agentDir),flagValues=sessionExtensionFlagValues(parsed.unknownFlags,launchProfile),hasTrustRequiringResources=hasTrustRequiringProjectResources(cwd),savedProjectTrust=await getSavedProjectTrust(trustStore,cwd),globalPreset=startupSettingsManager.getGlobalSettings().permissionPreset,fullAccessTrust=presetTrustsProject(flagValues.get("permission-preset"),globalPreset)&&savedProjectTrust!==!1,shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&!fullAccessTrust&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:parsed.projectTrustOverride??(fullAccessTrust||!hasTrustRequiringResources||savedProjectTrust===!0),trustFromFullAccess=fullAccessTrust&&hasTrustRequiringResources&&parsed.projectTrustOverride===void 0&&savedProjectTrust!==!0;return{settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted,trustFromFullAccess,projectTrustLocked:parsed.projectTrustOverride!==void 0}),flagValues,reloadOptions:shouldResolveProjectTrust?{resolveProjectTrust:({extensionsResult})=>resolveProjectTrusted({cwd,trustStore,trustOverride:parsed.projectTrustOverride,defaultProjectTrust:startupSettingsManager.getDefaultProjectTrust(),extensionsResult,projectTrustContext:createProjectTrustContext({cwd,mode:appMode,settingsManager:startupSettingsManager,hasUI:!1}),onExtensionError:message=>diagnostics.push({type:"warning",message})})}:void 0}}function resolveCliPaths(cwd,paths){return paths?.map(value=>isLocalPath(value)?resolvePath(value,cwd):value)}function looplessToolFilters(parsed,settingsManager){let noTools=parsed.noTools?"all":parsed.noBuiltinTools?"builtin":void 0,defaultToolNames=parsed.tools===void 0&&noTools===void 0?settingsManager.getDefaultTools():void 0,allowedToolNames=parsed.tools??(noTools==="all"?[]:void 0);return{...defaultToolNames===void 0?{}:{defaultToolNames:new Set(defaultToolNames)},...allowedToolNames===void 0?{}:{allowedToolNames:new Set(allowedToolNames)},...parsed.excludeTools===void 0?{}:{excludedToolNames:new Set(parsed.excludeTools)}}}function errorResult(message){return{content:[{type:"text",text:message}],details:void 0,isError:!0}}function withOverride(result,override){let structuredContent=override.structuredContent??(override.content?void 0:result.structuredContent),next={...result,content:override.content??result.content,details:override.details??result.details,usage:override.usage??result.usage,isError:override.isError??result.isError===!0};return structuredContent===void 0?delete next.structuredContent:next.structuredContent=structuredContent,next}async function runLooplessToolCall(tool,call,handlers){let{toolCallId,signal}=call,nested=call.nested===void 0?{}:{nested:call.nested},args;try{let prepared=tool.prepareArguments?tool.prepareArguments(call.params):call.params,toolCall={type:"toolCall",id:toolCallId,name:tool.name,arguments:prepared};args=validateToolArguments(tool,toolCall)}catch(error){return errorResult(error instanceof Error?error.message:String(error))}if(handlers){let before;try{before=await handlers.beforeToolCall({toolName:tool.name,toolCallId,input:args,...nested})}catch(error){return errorResult(error instanceof Error?error.message:`Extension failed, blocking execution: ${String(error)}`)}if(signal?.aborted)return errorResult("Operation aborted");if(before?.block){let blocked=errorResult(before.reason||"Tool execution was blocked");return before.terminate===!0&&(blocked.terminate=!0),blocked}}let result;try{result=await tool.execute(toolCallId,args,signal,void 0)}catch(error){result=errorResult(error instanceof Error?error.message:String(error))}if(!handlers)return result;try{let override=await handlers.afterToolCall({toolName:tool.name,toolCallId,input:args,result,isError:result.isError===!0,...nested});return override?withOverride(result,override):result}catch(error){return errorResult(error instanceof Error?error.message:String(error))}}import{AsyncLocalStorage}from"node:async_hooks";function extensionToolHandlers(runner,twoSidedHome="loop"){let twoSided=twoSidedHome==="loop"?runner.twoSidedExtensionPaths():new Set,options=nested=>nested===void 0||twoSided.size===0?{}:{forward:forwardToolEvents(twoSided,nested)};return{beforeToolCall:({toolName,toolCallId,input,nested})=>runner.hasHandlers("tool_call")?runner.emitToolCall({type:"tool_call",toolName,toolCallId,input},options(nested)):Promise.resolve(void 0),afterToolCall:({toolName,toolCallId,input,result,isError,nested})=>runner.hasHandlers("tool_result")?runner.emitToolResult({type:"tool_result",toolName,toolCallId,input,content:result.content,details:result.details,...result.structuredContent===void 0?{}:{structuredContent:result.structuredContent},isError,usage:result.usage},options(nested)):Promise.resolve(void 0)}}var isRecord=value=>typeof value=="object"&&value!==null&&!Array.isArray(value);function extensionLoopHooks(runner,twoSidedHome,cwd,call){return async(event,payload)=>{if(twoSidedHome!=="hand")throw new Error("this hand is not the home of its extensions' loop hooks");if(!isRecord(payload)||typeof payload.sessionId!="string"||typeof payload.idle!="boolean")throw new Error(`malformed ${event} payload`);let{sessionId,idle}=payload,images=imagesOf(payload.images);if(images===null)throw new Error(`malformed ${event} payload: images`);if(event==="input"){let{inputId,text,source,attribution,streamingBehavior}=payload;if(typeof inputId!="string"||typeof text!="string"||!isOneOf(source,INPUT_SOURCES)||!isOneOf(attribution,INPUT_ATTRIBUTIONS)||!(streamingBehavior===void 0||isOneOf(streamingBehavior,STREAMING_BEHAVIORS)))throw new Error("malformed input payload");return call.run(sessionId,cwd,idle,effects=>dispatchLoopHook(runner,call,effects,()=>runner.emitInput(text,images,source,streamingBehavior,inputId,attribution,isUserLoopHook)))}if(event==="before_agent_start"){let{prompt,systemPrompt,trigger,preview,systemPromptOptions}=payload;if(typeof prompt!="string"||typeof systemPrompt!="string"||!isOneOf(trigger,TRIGGERS)||!(preview===void 0||typeof preview=="boolean")||!isRecord(systemPromptOptions))throw new Error("malformed before_agent_start payload");let options={...systemPromptOptions,cwd};return call.run(sessionId,cwd,idle,effects=>dispatchLoopHook(runner,call,effects,()=>runner.emitBeforeAgentStart(prompt,images,systemPrompt,options,{only:isUserLoopHook,trigger,...preview===void 0?{}:{preview}})))}throw new Error(`no loop hooks run on a hand for ${event}`)}}var isUserLoopHook=extensionPath=>!extensionPath.startsWith("<builtin:")||extensionPath==="<builtin:hooks>",INPUT_SOURCES=["interactive","rpc","extension"],INPUT_ATTRIBUTIONS=["user","agent"],STREAMING_BEHAVIORS=["steer","followUp"],TRIGGERS=["prompt","delivery","extension"],isOneOf=(value,allowed2)=>typeof value=="string"&&allowed2.includes(value),imagesOf=value=>value===void 0?void 0:Array.isArray(value)&&value.every(isImage)?value:null,isImage=value=>isRecord(value)&&value.type==="image"&&typeof value.data=="string"&&typeof value.mimeType=="string";async function dispatchLoopHook(runner,call,effects,dispatch){let own=call.current(),errors=[],stop=runner.onError(({extensionPath,event,error})=>{own!==void 0&&call.current()===own&&errors.push({extensionPath,event,error})});try{let result=await dispatch(),{sent,notices}=effects;return JSON.parse(JSON.stringify({...result,...sent.length>0?{sent}:{},...notices.length>0?{notices}:{},...effects.dropped>0?{droppedLate:effects.dropped}:{},...errors.length>0?{errors}:{}}))}finally{stop()}}var LATE_PER_SESSION=256;function createLoopHookCall(){let calls=new AsyncLocalStorage,late=new Map,holdLate=(sessionId,add)=>{let held=late.get(sessionId)??{sent:[],notices:[],dropped:0};for(add(held);held.sent.length+held.notices.length>LATE_PER_SESSION;)(held.notices.length>0?held.notices:held.sent).shift(),held.dropped++;late.set(sessionId,held)};return{current:()=>{let call=calls.getStore();return call?.live()===!0?call.facts:void 0},sender:()=>calls.getStore()?.facts.sendMessage,async run(sessionId,cwd,idle,dispatch){let live=!0,controller=new AbortController,effects=late.get(sessionId)??{sent:[],notices:[],dropped:0};late.delete(sessionId);let facts=Object.freeze({sessionManager:readOnlySession(sessionId,cwd,()=>live),signal:controller.signal,isIdle:()=>idle,sendMessage:(message,options)=>{let entry=options===void 0?{message}:{message,options};live?effects.sent.push(entry):holdLate(sessionId,held=>held.sent.push(entry))},notify:(message,type)=>{let entry=type===void 0?{message}:{message,type};live?effects.notices.push(entry):holdLate(sessionId,held=>held.notices.push(entry))}});try{return await calls.run({live:()=>live,facts},()=>dispatch(effects))}finally{live=!1,controller.abort()}}}}var LoopHookCallEndedError=class extends Error{constructor(member){super(`this loop-hook call has ended; ${member} is bound to that call only`),this.name="LoopHookCallEndedError",this.member=member}};function readOnlySession(sessionId,cwd,live){let bound2=(member,read)=>()=>{if(!live())throw new LoopHookCallEndedError(`sessionManager.${member}`);return read()},unbound=member=>()=>{throw new Error(`sessionManager.${member} is loop-side: a loop-hook call on a hand carries only the session's id`)};return Object.freeze({getSessionId:bound2("getSessionId",()=>sessionId),getSessionFile:bound2("getSessionFile",()=>{}),getCwd:bound2("getCwd",()=>cwd),getSessionDir:unbound("getSessionDir"),getLeafId:unbound("getLeafId"),getLeafEntry:unbound("getLeafEntry"),getEntry:unbound("getEntry"),getLabel:unbound("getLabel"),getBranch:unbound("getBranch"),getFullBranch:unbound("getFullBranch"),buildContextEntries:unbound("buildContextEntries"),buildSessionContext:unbound("buildSessionContext"),buildSessionProjection:unbound("buildSessionProjection"),getHeader:unbound("getHeader"),getEntries:unbound("getEntries"),reduceHistory:unbound("reduceHistory"),getTree:unbound("getTree"),getSessionName:unbound("getSessionName")})}var LooplessToolNotFoundError=class extends Error{constructor(toolName){super(`loopless_tool_not_found: ${toolName}`),this.toolName=toolName}};function createLooplessRuntimeFactory(configuration,local={}){let{parsed,agentDir,toolRuntime}=configuration,extensionFactories=local.extensionFactories??builtInExtensions,startupSettingsManager=local.startupSettingsManager??SettingsManager.create(configuration.cwd,configuration.agentDir);return async profile=>{let{cwd}=profile,diagnostics=[],{settingsManager,flagValues,reloadOptions}=await resolveLooplessSettings(configuration,startupSettingsManager,profile,diagnostics),services=await createAgentSessionServices({cwd,agentDir,settingsManager,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:flagValues,...reloadOptions?{resourceLoaderReloadOptions:reloadOptions}:{},resourceLoaderOptions:{sessionKind:profile.launchProfile?.sessionKind,sessionContext:profile.launchProfile?.sessionContext,additionalExtensionPaths:resolveCliPaths(cwd,parsed.extensions),additionalSkillPaths:resolveCliPaths(cwd,parsed.skills),additionalPromptTemplatePaths:resolveCliPaths(cwd,parsed.promptTemplates),additionalThemePaths:resolveCliPaths(cwd,parsed.themes),noExtensions:parsed.noExtensions,noSkills:parsed.noSkills,noPromptTemplates:parsed.noPromptTemplates,noThemes:parsed.noThemes,noContextFiles:parsed.noContextFiles,extensionFactories}}),extensionsResult=services.resourceLoader.getExtensions();diagnostics.push(...services.diagnostics,...extensionsResult.errors.map(({path,error})=>({type:"warning",message:`Failed to load extension "${path}": ${error}`})),...(extensionsResult.warnings??[]).map(({path,warning})=>({type:"warning",message:`Extension package "${path}": ${warning}`})));let execute=()=>Promise.reject(new Error("Loopless runtime is not ready")),toolNames=()=>[],toolChildRuntime=createToolChildRuntime({toolRuntime:toolRuntime??"in-process",agentDir,scopeId:`loopless-${randomUUID3()}`,cwd:services.cwd,moduleRoots:()=>[...toolChildModuleRoots(runtime.extensionRunner.getAllRegisteredTools()),...childModuleRoots(runtime.extensionRunner.getAllChildModules())],hostCallDeps:{cwd:services.cwd,executeNested:async(_parentToolCallId,name,args,signal)=>{let toolCall={type:"toolCall",id:`nested-${randomUUID3()}`,name,arguments:{}},result=await execute(name,toolCall.id,args,signal);return{toolCall,result,isError:result.isError===!0}},callableToolNames:()=>toolNames(),target:()=>{},filesystemPolicy:()=>runtime.filesystemPolicy},onRecord:()=>{}}),{dispatcher,toolChild}=toolChildRuntime,runtime=bootstrapRuntime({cwd:services.cwd,settingsManager:services.settingsManager,extensionsResult,modelRegistry:services.modelRegistry,toolDispatcher:dispatcher}),registry=buildToolRegistry({baseToolDefinitions:runtime.baseToolDefinitions,runner:runtime.extensionRunner,dispatcher,...looplessToolFilters(parsed,services.settingsManager)});toolNames=()=>[...registry.toolRegistry.keys()];let getLoadedHookSources=services.resourceLoader.getLoadedHookSources?.bind(services.resourceLoader),loopHookCall=createLoopHookCall();runtime.extensionRunner.bindSessionlessFacts({getAllTools:()=>Array.from(registry.definitions.values(),toolInfoOf),loopHookCall:()=>loopHookCall.current(),loopHookSend:()=>loopHookCall.sender(),...getLoadedHookSources?{getLoadedHookSources}:{}});let presentation=new PresentationBroker(error=>runtime.extensionRunner.emitError({extensionPath:"<presentation-port>",event:"ui_presentation",error:`A presentation could not reach the attached client: ${error instanceof Error?error.message:String(error)}`}));runtime.extensionRunner.setUiBroker(presentation);let toolHandlers=looplessGrantRunsToolHandlers(local.executeGrant)?extensionToolHandlers(runtime.extensionRunner,local.twoSidedHome):void 0;execute=(name,toolCallId,params,signal,nested)=>{if(!isLooplessExecuteGranted(local.executeGrant))return Promise.reject(new LooplessExecuteRefusedError("no executor runs the tool_call/tool_result handlers for this runtime yet"));let tool=registry.toolRegistry.get(name);return tool===void 0?Promise.reject(new LooplessToolNotFoundError(name)):presentation.present(nested,()=>runLooplessToolCall(tool,{toolCallId,params,...signal?{signal}:{},...nested?{nested}:{}},toolHandlers))};let fileGuards=toolHandlers!==void 0&&isLooplessExecuteGranted(local.executeGrant)?{beforeToolCall:(toolName,toolCallId,input,nested)=>presentation.present(nested,()=>toolHandlers.beforeToolCall({toolName,toolCallId,input,...nested?{nested}:{}})),filesystemPolicy:()=>runtime.filesystemPolicy}:void 0;return{cwd:services.cwd,definitions:registry.definitions,diagnostics,fileGuards,execute:(name,toolCallId,params,signal,nested)=>execute(name,toolCallId,params,signal,nested),runLoopHooks:extensionLoopHooks(runtime.extensionRunner,local.twoSidedHome??"loop",services.cwd,loopHookCall),dispose:async()=>{runtime.extensionRunner.invalidate("This loopless runtime was disposed.");let failure=(await Promise.allSettled([dispatcher.dispose(),toolChild?.close()])).find(outcome=>outcome.status==="rejected");if(failure!==void 0)throw failure.reason}}}}var handRun={context:{uid:process.getuid?.()??-1,platform:process.platform,ownEnv:process.env},flock:loadFlock()};function notFound(name){return{content:[{type:"text",text:`Tool ${name} not found`}],details:{},isError:!0}}var isRecord2=value=>typeof value=="object"&&value!==null&&!Array.isArray(value);function scopeOf(payload){let scope=isRecord2(payload)?payload.scope:void 0;if(!isRecord2(scope)||typeof scope.id!="string"||typeof scope.root!="string")throw new Error("a loop-hook call names no scope");return{id:scope.id,root:scope.root}}function createLooplessHand(configuration,local={}){let factory=createLooplessRuntimeFactory(configuration,{...local,executeGrant:grantLooplessExecuteToRemoteExecutor()}),runtimes=new Map,disposed=new Set,closed=!1,disposals=new WeakMap,disposeOnce=runtime=>{let known=disposals.get(runtime);if(known!==void 0)return known;let disposing=runtime.dispose();return disposals.set(runtime,disposing),disposing},runtimeOf=(scope,reopen)=>{if(closed)return Promise.reject(new Error("this hand is closed"));if(!isAbsolute2(scope.root))return Promise.reject(new Error(`scope root must be an absolute path: ${JSON.stringify(scope.root)}`));let known=runtimes.get(scope.id);if(known!==void 0)return known.root===scope.root?known.runtime:Promise.reject(new Error(`scope_binding_mismatch: scope ${JSON.stringify(scope.id)} is bound to another root`));if(!reopen&&disposed.has(scope.id))return Promise.reject(new Error(`scope ${JSON.stringify(scope.id)} was disposed; its extensions' loop-hook state is gone`));disposed.delete(scope.id);let opened=factory({cwd:scope.root});return runtimes.set(scope.id,{root:scope.root,runtime:opened}),opened.catch(()=>runtimes.delete(scope.id)),opened};return{async openScope(scope){let runtime=await runtimeOf(scope,!0);return{run:call=>runtime.definitions.has(call.name)?runtime.execute(call.name,call.toolCallId,call.arguments,call.signal,call.nested):Promise.resolve(notFound(call.name)),isSequential:name=>runtime.definitions.get(name)?.definition.executionMode==="sequential",...runtime.fileGuards===void 0?{}:{file:createHandFileOps(scope.root,runtime.fileGuards,handRun)},dispose:()=>(runtimes.delete(scope.id),disposed.add(scope.id),disposeOnce(runtime))}},runLoopHooks:async(scope,event,payload)=>(await runtimeOf(scope,!1)).runLoopHooks(event,payload),loopHooks:async(event,payload)=>(await runtimeOf(scopeOf(payload),!1)).runLoopHooks(event,payload),async close(){closed=!0;let open2=[...runtimes.values()];runtimes.clear();let failures=(await Promise.allSettled(open2.map(({runtime})=>runtime.then(opened=>disposeOnce(opened),()=>{})))).flatMap(outcome=>outcome.status==="rejected"?[outcome.reason]:[]);if(failures.length===1)throw failures[0];if(failures.length>1)throw new AggregateError(failures,"disposing this hand's runtimes failed")}}}var isRecord3=value=>typeof value=="object"&&value!==null&&!Array.isArray(value);function encodeCarrierLine(message){if(!isRecord3(message)||typeof message.lane!="string"||typeof message.seq!="number")return;if(message.kind==="ack")return`${JSON.stringify({kind:"ack",lane:message.lane,seq:message.seq})}
|
|
5
5
|
`;if(message.kind!=="data"||!(message.payload instanceof Uint8Array))return;let payload=Buffer.from(message.payload).toString("base64");return`${JSON.stringify({kind:"data",lane:message.lane,seq:message.seq,payload})}
|
|
@@ -1,2 +1,2 @@
|
|
|
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{parseHostArgs,resolveHostSocket,runHostCommand}from"./chunk-
|
|
2
|
+
import{parseHostArgs,resolveHostSocket,runHostCommand}from"./chunk-OF3XVGG4.js";import"./chunk-Q4G5DECT.js";import"./chunk-QMRJYMNH.js";import"./chunk-DZQA5LVN.js";import"./chunk-IEY2SL46.js";import"./chunk-26UBFF6N.js";import"./chunk-4JMGWVRH.js";import"./chunk-E5O4SP5I.js";import"./chunk-DX43FSQT.js";import"./chunk-7WYJAYHH.js";import"./chunk-47T6YMI2.js";import"./chunk-R2Z7CX77.js";import"./chunk-UCXBDE6R.js";import"./chunk-YI6KRJDC.js";import"./chunk-VUY4BZDI.js";import"./chunk-SF4MQDKZ.js";import"./chunk-C4AHHZ6P.js";import"./chunk-KUPQO7MC.js";import"./chunk-U3VOXCGP.js";import"./chunk-R7J5TEYK.js";import"./chunk-WXYMAUFX.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-XH2MWTXA.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-E266ORGA.js";import"./chunk-T2SMQPRE.js";import"./chunk-RUGTHELO.js";import"./chunk-42XRJQM6.js";import"./chunk-5XHOHZIR.js";import"./chunk-HW6AAS3R.js";import"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-MIENF2YK.js";import"./chunk-O5RYI3IW.js";import"./chunk-RFFMEA4B.js";import"./chunk-IKOFCODM.js";export{parseHostArgs,resolveHostSocket,runHostCommand};
|
|
@@ -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{HOST_CHILD_LISTEN_MS,INTERNAL_SUPERVISOR_FLAG,createInternalSocketPath,findInternalSupervisorArgs,parseSupervisorArgs,resolveCliMainPath,resolveHostChildLaunch,runHostSupervisor,spawnableChildLaunch}from"./chunk-
|
|
3
|
+
import{HOST_CHILD_LISTEN_MS,INTERNAL_SUPERVISOR_FLAG,createInternalSocketPath,findInternalSupervisorArgs,parseSupervisorArgs,resolveCliMainPath,resolveHostChildLaunch,runHostSupervisor,spawnableChildLaunch}from"./chunk-47T6YMI2.js";import"./chunk-R2Z7CX77.js";import{DEFAULT_HANDOFF_GRACE_MS,DEFAULT_HOST_IDLE_EXIT_MS,HANDOFF_GRACE_MS_ENV,HOST_COLD_START_ENV,HOST_IDLE_EXIT_MS_ENV,IdleExitDecider,classifyChildExit,parseColdStart,parseIdleExitMs,resolveHostPolicy}from"./chunk-UCXBDE6R.js";import"./chunk-YI6KRJDC.js";import"./chunk-VUY4BZDI.js";import"./chunk-SF4MQDKZ.js";import"./chunk-U3VOXCGP.js";import"./chunk-E266ORGA.js";import"./chunk-T2SMQPRE.js";import"./chunk-RUGTHELO.js";import"./chunk-42XRJQM6.js";import"./chunk-5XHOHZIR.js";import"./chunk-HW6AAS3R.js";import"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-O5RYI3IW.js";import"./chunk-IKOFCODM.js";export{DEFAULT_HANDOFF_GRACE_MS,DEFAULT_HOST_IDLE_EXIT_MS,HANDOFF_GRACE_MS_ENV,HOST_CHILD_LISTEN_MS,HOST_COLD_START_ENV,HOST_IDLE_EXIT_MS_ENV,INTERNAL_SUPERVISOR_FLAG,IdleExitDecider,classifyChildExit,createInternalSocketPath,findInternalSupervisorArgs,parseColdStart,parseIdleExitMs,parseSupervisorArgs,resolveCliMainPath,resolveHostChildLaunch,resolveHostPolicy,runHostSupervisor,spawnableChildLaunch};
|
|
@@ -13,7 +13,7 @@ renameSync(temporary, launcher);
|
|
|
13
13
|
`);return}let source=parsed,name=readString(source,"name");if(!name){process.stderr.write(`warning: ignoring ${BRAND_ENV_VAR} without a "name"
|
|
14
14
|
`);return}let configDir=readString(source,"configDir")||`.${name}`;if(!isSafeConfigDirName(configDir)){process.stderr.write(`warning: ignoring ${BRAND_ENV_VAR} with an unsafe "configDir"
|
|
15
15
|
`);return}let changelog=readChangelog(source);return{name,command:readString(source,"command"),displayVersion:readString(source,"displayVersion"),configDir,flatLayout:source.flatLayout===!0,envPrefix:(readString(source,"envPrefix")||name).toUpperCase(),userAgent:readString(source,"userAgent")||name,originator:readString(source,"originator"),logo:readString(source,"logo"),update:readUpdateChannel(source),...changelog?{changelog}:{}}}function consumeBrandProfile(env=process.env){return parseBrandProfile(env[BRAND_ENV_VAR])}function brandProfile(){return profileResolved||(cachedProfile=consumeBrandProfile(),profileResolved=!0),cachedProfile}function brandEnvNames(suffix,profile=brandProfile()){let prefixes=[profile?.envPrefix,...LEGACY_ENV_PREFIXES].filter(prefix=>typeof prefix=="string"&&prefix.length>0);return[...new Set(prefixes)].map(prefix=>`${prefix}_${suffix}`)}function envValue(suffix,env=process.env){for(let name of brandEnvNames(suffix)){let value=env[name];if(value!==void 0)return value}}var BRAND_ENV_VAR,LEGACY_ENV_PREFIXES,cachedProfile,profileResolved,init_brand=__esm({"packages/coding-agent/dist/core/brand.js"(){BRAND_ENV_VAR="SENPI_BRAND";LEGACY_ENV_PREFIXES=["SENPI","PI"],profileResolved=!1}});import{lstatSync}from"node:fs";import{dirname,join,normalize}from"node:path";function isDirectory(path2){try{return lstatSync(path2).isDirectory()}catch{return!1}}function isFile(path2){try{return lstatSync(path2).isFile()}catch{return!1}}function findNearestParentConfigDir(cwd,homeDir,configDirName,requiredChildDir,requiredChildFile){let normalizedHomeDir=normalize(homeDir),currentDir=normalize(cwd);for(let depth=0;depth<=MAX_PARENT_CONFIG_SEARCH_DEPTH;depth+=1){if(currentDir===normalizedHomeDir)return;let configDir=join(currentDir,configDirName),hasRequiredChild=requiredChildFile?isFile(join(configDir,requiredChildFile)):!requiredChildDir||isDirectory(join(configDir,requiredChildDir));if(isDirectory(configDir)&&hasRequiredChild)return configDir;let parentDir=dirname(currentDir);if(parentDir===currentDir)return;currentDir=parentDir}}var MAX_PARENT_CONFIG_SEARCH_DEPTH,init_nearest_parent_config=__esm({"packages/coding-agent/dist/nearest-parent-config.js"(){MAX_PARENT_CONFIG_SEARCH_DEPTH=100}});var init_marker=__esm({"packages/coding-agent/dist/runtime-snapshot/marker.js"(){}});var require_windows=__commonJS({"node_modules/isexe/windows.js"(exports,module){module.exports=isexe;isexe.sync=sync;var fs2=__require("fs");function checkPathExt(path2,options){var pathext=options.pathExt!==void 0?options.pathExt:process.env.PATHEXT;if(!pathext||(pathext=pathext.split(";"),pathext.indexOf("")!==-1))return!0;for(var i=0;i<pathext.length;i++){var p=pathext[i].toLowerCase();if(p&&path2.substr(-p.length).toLowerCase()===p)return!0}return!1}function checkStat(stat5,path2,options){return!stat5.isSymbolicLink()&&!stat5.isFile()?!1:checkPathExt(path2,options)}function isexe(path2,options,cb){fs2.stat(path2,function(er,stat5){cb(er,er?!1:checkStat(stat5,path2,options))})}function sync(path2,options){return checkStat(fs2.statSync(path2),path2,options)}}});var require_mode=__commonJS({"node_modules/isexe/mode.js"(exports,module){module.exports=isexe;isexe.sync=sync;var fs2=__require("fs");function isexe(path2,options,cb){fs2.stat(path2,function(er,stat5){cb(er,er?!1:checkStat(stat5,options))})}function sync(path2,options){return checkStat(fs2.statSync(path2),options)}function checkStat(stat5,options){return stat5.isFile()&&checkMode(stat5,options)}function checkMode(stat5,options){var mod=stat5.mode,uid=stat5.uid,gid=stat5.gid,myUid=options.uid!==void 0?options.uid:process.getuid&&process.getuid(),myGid=options.gid!==void 0?options.gid:process.getgid&&process.getgid(),u=parseInt("100",8),g=parseInt("010",8),o=parseInt("001",8),ug=u|g,ret=mod&o||mod&g&&gid===myGid||mod&u&&uid===myUid||mod&ug&&myUid===0;return ret}}});var require_isexe=__commonJS({"node_modules/isexe/index.js"(exports,module){var fs2=__require("fs"),core;process.platform==="win32"||global.TESTING_WINDOWS?core=require_windows():core=require_mode();module.exports=isexe;isexe.sync=sync;function isexe(path2,options,cb){if(typeof options=="function"&&(cb=options,options={}),!cb){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(resolve4,reject){isexe(path2,options||{},function(er,is){er?reject(er):resolve4(is)})})}core(path2,options||{},function(er,is){er&&(er.code==="EACCES"||options&&options.ignoreErrors)&&(er=null,is=!1),cb(er,is)})}function sync(path2,options){try{return core.sync(path2,options||{})}catch(er){if(options&&options.ignoreErrors||er.code==="EACCES")return!1;throw er}}}});var require_which=__commonJS({"node_modules/which/which.js"(exports,module){var isWindows=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",path2=__require("path"),COLON=isWindows?";":":",isexe=require_isexe(),getNotFoundError=cmd=>Object.assign(new Error(`not found: ${cmd}`),{code:"ENOENT"}),getPathInfo=(cmd,opt)=>{let colon=opt.colon||COLON,pathEnv=cmd.match(/\//)||isWindows&&cmd.match(/\\/)?[""]:[...isWindows?[process.cwd()]:[],...(opt.path||process.env.PATH||"").split(colon)],pathExtExe=isWindows?opt.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",pathExt=isWindows?pathExtExe.split(colon):[""];return isWindows&&cmd.indexOf(".")!==-1&&pathExt[0]!==""&&pathExt.unshift(""),{pathEnv,pathExt,pathExtExe}},which=(cmd,opt,cb)=>{typeof opt=="function"&&(cb=opt,opt={}),opt||(opt={});let{pathEnv,pathExt,pathExtExe}=getPathInfo(cmd,opt),found=[],step=i=>new Promise((resolve4,reject)=>{if(i===pathEnv.length)return opt.all&&found.length?resolve4(found):reject(getNotFoundError(cmd));let ppRaw=pathEnv[i],pathPart=/^".*"$/.test(ppRaw)?ppRaw.slice(1,-1):ppRaw,pCmd=path2.join(pathPart,cmd),p=!pathPart&&/^\.[\\\/]/.test(cmd)?cmd.slice(0,2)+pCmd:pCmd;resolve4(subStep(p,i,0))}),subStep=(p,i,ii)=>new Promise((resolve4,reject)=>{if(ii===pathExt.length)return resolve4(step(i+1));let ext=pathExt[ii];isexe(p+ext,{pathExt:pathExtExe},(er,is)=>{if(!er&&is)if(opt.all)found.push(p+ext);else return resolve4(p+ext);return resolve4(subStep(p,i,ii+1))})});return cb?step(0).then(res=>cb(null,res),cb):step(0)},whichSync=(cmd,opt)=>{opt=opt||{};let{pathEnv,pathExt,pathExtExe}=getPathInfo(cmd,opt),found=[];for(let i=0;i<pathEnv.length;i++){let ppRaw=pathEnv[i],pathPart=/^".*"$/.test(ppRaw)?ppRaw.slice(1,-1):ppRaw,pCmd=path2.join(pathPart,cmd),p=!pathPart&&/^\.[\\\/]/.test(cmd)?cmd.slice(0,2)+pCmd:pCmd;for(let j=0;j<pathExt.length;j++){let cur=p+pathExt[j];try{if(isexe.sync(cur,{pathExt:pathExtExe}))if(opt.all)found.push(cur);else return cur}catch{}}}if(opt.all&&found.length)return found;if(opt.nothrow)return null;throw getNotFoundError(cmd)};module.exports=which;which.sync=whichSync}});var require_path_key=__commonJS({"node_modules/path-key/index.js"(exports,module){"use strict";var pathKey=(options={})=>{let environment=options.env||process.env;return(options.platform||process.platform)!=="win32"?"PATH":Object.keys(environment).reverse().find(key=>key.toUpperCase()==="PATH")||"Path"};module.exports=pathKey;module.exports.default=pathKey}});var require_resolveCommand=__commonJS({"node_modules/cross-spawn/lib/util/resolveCommand.js"(exports,module){"use strict";var path2=__require("path"),which=require_which(),getPathKey=require_path_key();function resolveCommandAttempt(parsed,withoutPathExt){let env=parsed.options.env||process.env,cwd=process.cwd(),hasCustomCwd=parsed.options.cwd!=null,shouldSwitchCwd=hasCustomCwd&&process.chdir!==void 0&&!process.chdir.disabled;if(shouldSwitchCwd)try{process.chdir(parsed.options.cwd)}catch{}let resolved;try{resolved=which.sync(parsed.command,{path:env[getPathKey({env})],pathExt:withoutPathExt?path2.delimiter:void 0})}catch{}finally{shouldSwitchCwd&&process.chdir(cwd)}return resolved&&(resolved=path2.resolve(hasCustomCwd?parsed.options.cwd:"",resolved)),resolved}function resolveCommand(parsed){return resolveCommandAttempt(parsed)||resolveCommandAttempt(parsed,!0)}module.exports=resolveCommand}});var require_escape=__commonJS({"node_modules/cross-spawn/lib/util/escape.js"(exports,module){"use strict";var metaCharsRegExp=/([()\][%!^"`<>&|;, *?])/g;function escapeCommand(arg){return arg=arg.replace(metaCharsRegExp,"^$1"),arg}function escapeArgument(arg,doubleEscapeMetaChars){return arg=`${arg}`,arg=arg.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"'),arg=arg.replace(/(?=(\\+?)?)\1$/,"$1$1"),arg=`"${arg}"`,arg=arg.replace(metaCharsRegExp,"^$1"),doubleEscapeMetaChars&&(arg=arg.replace(metaCharsRegExp,"^$1")),arg}module.exports.command=escapeCommand;module.exports.argument=escapeArgument}});var require_shebang_regex=__commonJS({"node_modules/shebang-regex/index.js"(exports,module){"use strict";module.exports=/^#!(.*)/}});var require_shebang_command=__commonJS({"node_modules/shebang-command/index.js"(exports,module){"use strict";var shebangRegex=require_shebang_regex();module.exports=(string4="")=>{let match=string4.match(shebangRegex);if(!match)return null;let[path2,argument]=match[0].replace(/#! ?/,"").split(" "),binary=path2.split("/").pop();return binary==="env"?argument:argument?`${binary} ${argument}`:binary}}});var require_readShebang=__commonJS({"node_modules/cross-spawn/lib/util/readShebang.js"(exports,module){"use strict";var fs2=__require("fs"),shebangCommand=require_shebang_command();function readShebang(command){let buffer=Buffer.alloc(150),fd;try{fd=fs2.openSync(command,"r"),fs2.readSync(fd,buffer,0,150,0),fs2.closeSync(fd)}catch{}return shebangCommand(buffer.toString())}module.exports=readShebang}});var require_parse=__commonJS({"node_modules/cross-spawn/lib/parse.js"(exports,module){"use strict";var path2=__require("path"),resolveCommand=require_resolveCommand(),escape=require_escape(),readShebang=require_readShebang(),isWin=process.platform==="win32",isExecutableRegExp=/\.(?:com|exe)$/i,isCmdShimRegExp=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function detectShebang(parsed){parsed.file=resolveCommand(parsed);let shebang=parsed.file&&readShebang(parsed.file);return shebang?(parsed.args.unshift(parsed.file),parsed.command=shebang,resolveCommand(parsed)):parsed.file}function parseNonShell(parsed){if(!isWin)return parsed;let commandFile=detectShebang(parsed),needsShell=!isExecutableRegExp.test(commandFile);if(parsed.options.forceShell||needsShell){let needsDoubleEscapeMetaChars=isCmdShimRegExp.test(commandFile);parsed.command=path2.normalize(parsed.command),parsed.command=escape.command(parsed.command),parsed.args=parsed.args.map(arg=>escape.argument(arg,needsDoubleEscapeMetaChars));let shellCommand=[parsed.command].concat(parsed.args).join(" ");parsed.args=["/d","/s","/c",`"${shellCommand}"`],parsed.command=process.env.comspec||"cmd.exe",parsed.options.windowsVerbatimArguments=!0}return parsed}function parse4(command,args,options){args&&!Array.isArray(args)&&(options=args,args=null),args=args?args.slice(0):[],options=Object.assign({},options);let parsed={command,args,options,file:void 0,original:{command,args}};return options.shell?parsed:parseNonShell(parsed)}module.exports=parse4}});var require_enoent=__commonJS({"node_modules/cross-spawn/lib/enoent.js"(exports,module){"use strict";var isWin=process.platform==="win32";function notFoundError(original,syscall){return Object.assign(new Error(`${syscall} ${original.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${syscall} ${original.command}`,path:original.command,spawnargs:original.args})}function hookChildProcess(cp,parsed){if(!isWin)return;let originalEmit=cp.emit;cp.emit=function(name,arg1){if(name==="exit"){let err=verifyENOENT(arg1,parsed);if(err)return originalEmit.call(cp,"error",err)}return originalEmit.apply(cp,arguments)}}function verifyENOENT(status,parsed){return isWin&&status===1&&!parsed.file?notFoundError(parsed.original,"spawn"):null}function verifyENOENTSync(status,parsed){return isWin&&status===1&&!parsed.file?notFoundError(parsed.original,"spawnSync"):null}module.exports={hookChildProcess,verifyENOENT,verifyENOENTSync,notFoundError}}});var require_cross_spawn=__commonJS({"node_modules/cross-spawn/index.js"(exports,module){"use strict";var cp=__require("child_process"),parse4=require_parse(),enoent=require_enoent();function spawn(command,args,options){let parsed=parse4(command,args,options),spawned=cp.spawn(parsed.command,parsed.args,parsed.options);return enoent.hookChildProcess(spawned,parsed),spawned}function spawnSync(command,args,options){let parsed=parse4(command,args,options),result=cp.spawnSync(parsed.command,parsed.args,parsed.options);return result.error=result.error||enoent.verifyENOENTSync(result.status,parsed),result}module.exports=spawn;module.exports.spawn=spawn;module.exports.sync=spawnSync;module.exports._parse=parse4;module.exports._enoent=enoent}});var import_cross_spawn,init_child_process=__esm({"packages/coding-agent/dist/utils/child-process.js"(){import_cross_spawn=__toESM(require_cross_spawn(),1)}});import{homedir}from"node:os";import{isAbsolute,join as join2,resolve as nodeResolvePath,parse,relative,sep}from"node:path";import{fileURLToPath}from"node:url";function normalizeWindowsShellPath(filePath){if(!filePath.startsWith("/")||filePath.startsWith("//")||filePath.includes("\\"))return filePath;let match=filePath.match(/^\/(?:mnt\/|cygdrive\/)?([a-z])(?:\/(.*))?$/i);if(!match)return filePath;let suffix=match[2]?.replaceAll("/","\\");return`${match[1].toUpperCase()}:\\${suffix??""}`}function normalizePath(input2,options={}){let normalized=options.trim?input2.trim():input2;if(options.normalizeUnicodeSpaces&&(normalized=normalized.replace(UNICODE_SPACES," ")),options.stripAtPrefix&&normalized.startsWith("@")&&(normalized=normalized.slice(1)),process.platform==="win32"&&(normalized=normalizeWindowsShellPath(normalized)),options.expandTilde??!0){let home=options.homeDir??homedir();if(normalized==="~")return home;if(normalized.startsWith("~/")||process.platform==="win32"&&normalized.startsWith("~\\"))return join2(home,normalized.slice(2))}return/^file:\/\//.test(normalized)?fileURLToPath(normalized):normalized}var UNICODE_SPACES,init_paths=__esm({"packages/coding-agent/dist/utils/paths.js"(){init_child_process();UNICODE_SPACES=/[\u00A0\u2000-\u200A\u202F\u205F\u3000]/g}});function splitBom(content){return content.startsWith("\uFEFF")?{bom:"\uFEFF",text:content.slice(1)}:{bom:"",text:content}}function stripBom(content){return splitBom(content).text}var init_text=__esm({"packages/coding-agent/dist/utils/text.js"(){}});import{accessSync,constants,existsSync,readFileSync,realpathSync}from"fs";import{homedir as homedir2,userInfo}from"os";import{basename,dirname as dirname2,join as join3,resolve,sep as sep2,win32}from"path";import{fileURLToPath as fileURLToPath2}from"url";function findNodePackageDir(startDir){let dir=startDir;for(;dir!==dirname2(dir);){if(existsSync(join3(dir,"package.json"))){let parent=dirname2(dir);return basename(dir)==="dist"&&existsSync(join3(parent,"package.json"))?parent:dir}dir=dirname2(dir)}return startDir}function getPackageDir(){let envDir=envValue("PACKAGE_DIR");return envDir?normalizePath(envDir):isBunBinary?dirname2(process.execPath):(nodePackageDir??=findNodePackageDir(__dirname),nodePackageDir)}function getPackageJsonPath(){return join3(getPackageDir(),"package.json")}function resolveAgentDir(cwd,homeDir,envDir){if(envDir)return normalizePath(envDir,{homeDir});if(CONFIG_FLAT_LAYOUT)return findNearestParentConfigDir(cwd,homeDir,CONFIG_DIR_NAME,void 0,FLAT_LAYOUT_SENTINEL)??join3(homeDir,CONFIG_DIR_NAME);let projectConfigDir=findNearestParentConfigDir(cwd,homeDir,CONFIG_DIR_NAME,"agent");return projectConfigDir?join3(projectConfigDir,"agent"):join3(homeDir,CONFIG_DIR_NAME,"agent")}function isGuardedTestRun(env){return env.SENPI_TEST_AGENT_DIR_GUARD==="1"}function realHomeDir(){try{return userInfo().homedir}catch{return}}function assertAgentDirAllowedInTests(agentDir,activeConfigDirName,env=process.env){if(!isGuardedTestRun(env)||env.SENPI_TEST_USE_REAL_AGENT_DIR==="1")return;let home=realHomeDir();if(!home)return;let target=resolve(agentDir);for(let configDir of new Set([...KNOWN_BRAND_CONFIG_DIRS,activeConfigDirName])){let root=join3(home,configDir);if(target===root||target.startsWith(root+sep2))throw new RealAgentDirInTestError(target)}}function getAgentDir(){let agentDir=resolveAgentDir(process.cwd(),homedir2(),envValue("CODING_AGENT_DIR"));return assertAgentDirAllowedInTests(agentDir,CONFIG_DIR_NAME),agentDir}var __filename,__dirname,isBunBinary,isBunRuntime,isBundledNode,nodePackageDir,pkg,piConfigName,BRAND,PACKAGE_NAME,APP_NAME,APP_COMMAND,APP_TITLE,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,VERSION,DISPLAY_VERSION,ENV_PREFIX,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,KNOWN_BRAND_CONFIG_DIRS,RealAgentDirInTestError,init_config=__esm({"packages/coding-agent/dist/config.js"(){init_bun_global_launcher();init_brand();init_nearest_parent_config();init_marker();init_child_process();init_paths();init_text();__filename=fileURLToPath2(import.meta.url),__dirname=dirname2(__filename),isBunBinary=import.meta.url.includes("$bunfs")||import.meta.url.includes("~BUN")||import.meta.url.includes("%7EBUN"),isBunRuntime=!!process.versions.bun,isBundledNode=!0;pkg={};try{pkg=JSON.parse(stripBom(readFileSync(getPackageJsonPath(),"utf-8")))}catch(e){if(e.code!=="ENOENT")throw e}piConfigName=pkg.piConfig?.name,BRAND=brandProfile(),PACKAGE_NAME=pkg.name||"@earendil-works/pi-coding-agent",APP_NAME=BRAND?.name||piConfigName||"pi",APP_COMMAND=BRAND?.command??APP_NAME,APP_TITLE=BRAND?.name||(piConfigName?APP_NAME:"\u03C0"),CONFIG_DIR_NAME=BRAND?.configDir||pkg.piConfig?.configDir||".pi",CONFIG_FLAT_LAYOUT=BRAND?.flatLayout===!0,VERSION=pkg.version||"0.0.0",DISPLAY_VERSION=BRAND?.displayVersion||VERSION,ENV_PREFIX=BRAND?.envPrefix||APP_NAME.toUpperCase(),ENV_AGENT_DIR=`${ENV_PREFIX}_CODING_AGENT_DIR`,ENV_SESSION_DIR=`${ENV_PREFIX}_CODING_AGENT_SESSION_DIR`,FLAT_LAYOUT_SENTINEL="settings.json";KNOWN_BRAND_CONFIG_DIRS=[".senpi",".omo",".pi"],RealAgentDirInTestError=class extends Error{constructor(agentDir){super(`Refusing to use the real agent directory ${agentDir} from a test run. Point <BRAND>_CODING_AGENT_DIR at a temp dir, or set SENPI_TEST_USE_REAL_AGENT_DIR=1 to opt in.`),this.name="RealAgentDirInTestError",this.agentDir=agentDir}}}});var require_signals=__commonJS({"node_modules/signal-exit/signals.js"(exports,module){module.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];process.platform!=="win32"&&module.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");process.platform==="linux"&&module.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")}});var require_signal_exit=__commonJS({"node_modules/signal-exit/index.js"(exports,module){var process2=global.process,processOk=function(process3){return process3&&typeof process3=="object"&&typeof process3.removeListener=="function"&&typeof process3.emit=="function"&&typeof process3.reallyExit=="function"&&typeof process3.listeners=="function"&&typeof process3.kill=="function"&&typeof process3.pid=="number"&&typeof process3.on=="function"};processOk(process2)?(assert2=__require("assert"),signals=require_signals(),isWin=/^win/i.test(process2.platform),EE=__require("events"),typeof EE!="function"&&(EE=EE.EventEmitter),process2.__signal_exit_emitter__?emitter=process2.__signal_exit_emitter__:(emitter=process2.__signal_exit_emitter__=new EE,emitter.count=0,emitter.emitted={}),emitter.infinite||(emitter.setMaxListeners(1/0),emitter.infinite=!0),module.exports=function(cb,opts){if(!processOk(global.process))return function(){};assert2.equal(typeof cb,"function","a callback must be provided for exit handler"),loaded===!1&&load();var ev="exit";opts&&opts.alwaysLast&&(ev="afterexit");var remove=function(){emitter.removeListener(ev,cb),emitter.listeners("exit").length===0&&emitter.listeners("afterexit").length===0&&unload()};return emitter.on(ev,cb),remove},unload=function(){!loaded||!processOk(global.process)||(loaded=!1,signals.forEach(function(sig){try{process2.removeListener(sig,sigListeners[sig])}catch{}}),process2.emit=originalProcessEmit,process2.reallyExit=originalProcessReallyExit,emitter.count-=1)},module.exports.unload=unload,emit=function(event,code,signal){emitter.emitted[event]||(emitter.emitted[event]=!0,emitter.emit(event,code,signal))},sigListeners={},signals.forEach(function(sig){sigListeners[sig]=function(){if(processOk(global.process)){var listeners=process2.listeners(sig);listeners.length===emitter.count&&(unload(),emit("exit",null,sig),emit("afterexit",null,sig),isWin&&sig==="SIGHUP"&&(sig="SIGINT"),process2.kill(process2.pid,sig))}}}),module.exports.signals=function(){return signals},loaded=!1,load=function(){loaded||!processOk(global.process)||(loaded=!0,emitter.count+=1,signals=signals.filter(function(sig){try{return process2.on(sig,sigListeners[sig]),!0}catch{return!1}}),process2.emit=processEmit,process2.reallyExit=processReallyExit)},module.exports.load=load,originalProcessReallyExit=process2.reallyExit,processReallyExit=function(code){processOk(global.process)&&(process2.exitCode=code||0,emit("exit",process2.exitCode,null),emit("afterexit",process2.exitCode,null),originalProcessReallyExit.call(process2,process2.exitCode))},originalProcessEmit=process2.emit,processEmit=function(ev,arg){if(ev==="exit"&&processOk(global.process)){arg!==void 0&&(process2.exitCode=arg);var ret=originalProcessEmit.apply(this,arguments);return emit("exit",process2.exitCode,null),emit("afterexit",process2.exitCode,null),ret}else return originalProcessEmit.apply(this,arguments)}):module.exports=function(){return function(){}};var assert2,signals,isWin,EE,emitter,unload,emit,sigListeners,loaded,load,originalProcessReallyExit,processReallyExit,originalProcessEmit,processEmit}});import{stat}from"node:fs/promises";async function openLockDatabase(lockPath){if(typeof globalThis.Bun<"u"){let{Database}=await import("bun:sqlite"),database2=new Database(lockPath,{create:!0});return{exec:sql=>database2.exec(sql),close:()=>database2.close(!1)}}let{DatabaseSync}=await import("node:sqlite"),database=new DatabaseSync(lockPath);return{exec:sql=>database.exec(sql),close:()=>database.close()}}async function acquireOwnershipSafeLock(lockPath,options={}){let retries=options.retries??DEFAULT_RETRIES,deadline=Date.now()+retries.retries*retries.maxTimeout;for(;;){await rejectLegacyDirectory(lockPath);let busyMs=Math.max(1,Math.min(retries.maxTimeout,deadline-Date.now())),database;try{database=await openLockDatabase(lockPath),database.exec(`PRAGMA busy_timeout = ${busyMs}; BEGIN EXCLUSIVE;`);let released=!1,held=database;return async()=>{if(!released){released=!0;try{held.exec("COMMIT;")}finally{held.close()}}}}catch(error62){try{database?.close()}catch{}if(await rejectLegacyDirectory(lockPath),isBusy(error62)&&Date.now()<deadline){await new Promise(resolve4=>setTimeout(resolve4,Math.min(retries.minTimeout,Math.max(1,deadline-Date.now()))));continue}throw error62}}}async function rejectLegacyDirectory(lockPath){try{if((await stat(lockPath)).isDirectory())throw new LegacyLockArtifactError(lockPath)}catch(error62){if(error62 instanceof LegacyLockArtifactError||error62.code!=="ENOENT")throw error62}}function isBusy(error62){let message=error62 instanceof Error?error62.message:String(error62);return/busy|locked/i.test(message)||error62?.code==="SQLITE_BUSY"}var LegacyLockArtifactError,DEFAULT_RETRIES,init_ownership_safe_lock=__esm({"packages/coding-agent/dist/modes/rpc/ownership-safe-lock.js"(){LegacyLockArtifactError=class extends Error{constructor(lockPath){super(`Legacy lock directory is present at ${lockPath}`),this.code="ELEGACY_LOCK_ARTIFACT",this.name="LegacyLockArtifactError",this.lockPath=lockPath}},DEFAULT_RETRIES={retries:100,minTimeout:20,maxTimeout:100}}});import{execFile,execFileSync}from"node:child_process";function processStartTimeMs(identity){if(/^\d+$/.test(identity)){let parsed2=Number((BigInt(identity)-WINDOWS_FILETIME_EPOCH)/10000n);return Number.isFinite(parsed2)?parsed2:void 0}let localIdentity=identity.trim(),korean=/^(\d{4})\uB144\s+(\d{1,2})\uC6D4\s+(\d{1,2})\uC77C\s+[\uC6D4\uD654\uC218\uBAA9\uAE08\uD1A0\uC77C]\uC694\uC77C\s+(\d{1,2})\uC2DC\s+(\d{1,2})\uBD84\s+(\d{1,2})\uCD08$/.exec(localIdentity),japanese=/^[\u65E5\u6708\u706B\u6C34\u6728\u91D1\u571F](?:\u66DC\u65E5)?\s+(\d{1,2})\/\s*(\d{1,2})\s+(\d{2}):(\d{2}):(\d{2})\s+(\d{4})$/.exec(localIdentity),parts=korean?korean.slice(1):japanese?[japanese[6],japanese[1],japanese[2],japanese[3],japanese[4],japanese[5]]:void 0;if(parts===void 0){let parsed2=Date.parse(identity);return Number.isFinite(parsed2)?parsed2:void 0}let[year=NaN,month=NaN,day=NaN,hour=NaN,minute=NaN,second=NaN]=parts.map(Number),parsed=new Date(year,month-1,day,hour,minute,second,0);return parsed.getFullYear()===year&&parsed.getMonth()===month-1&&parsed.getDate()===day&&parsed.getHours()===hour&&parsed.getMinutes()===minute&&parsed.getSeconds()===second?parsed.getTime():void 0}function sameProcessStartMs(recorded,observed){return recorded!==void 0&&observed!==void 0&&Number.isFinite(recorded)&&Number.isFinite(observed)&&Math.abs(recorded-observed)<=PROCESS_START_TOLERANCE_MS}function parseDaemonPidFile(text){let parsed;try{parsed=JSON.parse(text)}catch(error62){if(error62 instanceof SyntaxError)return;throw error62}let unguarded=parsed!==null&&isRecord(parsed)&&parsed.processStartTime===null;if(!(!isRecord(parsed)||typeof parsed.pid!="number"||!unguarded&&typeof parsed.processStartTime!="string")&&!(!Number.isInteger(parsed.pid)||parsed.pid<=0)){if(unguarded)return{pid:parsed.pid,processStartTime:null};if(!(typeof parsed.processStartTime!="string"||parsed.processStartTime.trim()===""))return{pid:parsed.pid,processStartTime:parsed.processStartTime}}}async function readProcessIdentity(pid,platform=process.platform,timeoutMs,isLive=processIsLive,timeZone){let command=platform==="win32"?{executable:"powershell.exe",args:["-NoProfile","-NonInteractive","-Command",`$process = Get-CimInstance Win32_Process -Filter "ProcessId=${String(pid)}" -ErrorAction Stop; if ($null -eq $process) { Write-Output '__SENPI_ABSENT__'; exit 0 }; $process.CreationDate.ToFileTimeUtc().ToString("D", [Globalization.CultureInfo]::InvariantCulture)`]}:{executable:"ps",args:["-o","stat=,lstart=","-p",String(pid)]};return new Promise(resolve4=>{let effectiveTimeoutMs=timeoutMs??(platform==="win32"?1e3:void 0);execFile(command.executable,command.args,{windowsHide:!0,...effectiveTimeoutMs===void 0?{}:{timeout:effectiveTimeoutMs},...platform==="win32"&&timeZone===void 0?{}:{env:{...process.env,LC_ALL:"C",LANG:"C",...timeZone?{TZ:timeZone}:{}}}},(error62,stdout)=>{if(error62){let code="code"in error62?error62.code:void 0;if(platform!=="win32"&&code===1||!isLive(pid)){resolve4({kind:"absent"});return}resolve4({kind:"error",error:error62});return}let snapshot=stdout.trim();if(snapshot==="__SENPI_ABSENT__")return resolve4({kind:"absent"});let state3=platform==="win32"?"":snapshot.split(/\s+/,1)[0]??"";if(state3.startsWith("Z"))return resolve4({kind:"absent"});let output2=platform==="win32"?snapshot:snapshot.slice(state3.length).trim();if(!output2||platform==="win32"&&!/^\d+$/.test(output2))return resolve4({kind:"error",error:new Error("invalid process identity output")});resolve4({kind:"present",identity:timeZone&&platform!=="win32"?`${output2} UTC`:output2})}).once("error",error62=>resolve4({kind:"error",error:error62}))})}async function readProcessStartTime(pid,platform=process.platform,timeoutMs){return readProcessIdentity(pid,platform,timeoutMs).then(result=>{if(result.kind==="error")throw result.error;return result.kind==="present"?result.identity:void 0})}function processIsLive(pid){try{return process.kill(pid,0),!0}catch(error62){if(isNodeErrorCode(error62,"ESRCH"))return!1;if(isNodeErrorCode(error62,"EPERM"))return!0;throw error62}}async function waitForStartTime(pid,timeoutMs,readStartTime=readProcessStartTime,isLive=processIsLive){let deadline=Date.now()+timeoutMs;for(;Date.now()<=deadline;){let startTime;try{startTime=await readStartTime(pid)}catch{}if(startTime)return startTime;await delay(20)}if(!isLive(pid))throw new Error(`spawned daemon pid ${pid} had no process start time`)}function delay(ms){return new Promise(resolveDelay=>setTimeout(resolveDelay,ms))}function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function isNodeErrorCode(error62,code){return error62 instanceof Error&&"code"in error62&&error62.code===code}var WINDOWS_FILETIME_EPOCH,PROCESS_START_TOLERANCE_MS,init_process_identity=__esm({"packages/coding-agent/dist/utils/process-identity.js"(){WINDOWS_FILETIME_EPOCH=116444736000000000n,PROCESS_START_TOLERANCE_MS=3e3}});import{createHmac,timingSafeEqual}from"node:crypto";function launchProofRecordRefusal(id){return{...id===void 0?{}:{id},type:"response",command:RPC_LAUNCH_PROOF_RECORD,success:!1,error:"reserved_record",errorCode:"reserved_record"}}function rpcAuthProof(key,label,...parts){return createHmac("sha256",key).update([`senpi-rpc-${label}`,...parts].join(`
|
|
16
|
-
`),"utf8").digest("hex")}function rpcProofMatches(expected,received){return typeof received=="string"&&RPC_AUTH_HEX.test(received)&&timingSafeEqual(Buffer.from(expected,"hex"),Buffer.from(received,"hex"))}function authRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)?value:void 0}var RPC_AUTH_CAPABILITY,RPC_AUTH_HEX,RPC_LAUNCH_ID,RPC_LAUNCH_PROOF_RECORD,RpcEndpointAuthError,init_rpc_auth_proof=__esm({"packages/coding-agent/dist/modes/rpc/rpc-auth-proof.js"(){RPC_AUTH_CAPABILITY="socket_auth",RPC_AUTH_HEX=/^[a-f0-9]{64}$/,RPC_LAUNCH_ID=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,RPC_LAUNCH_PROOF_RECORD="launch_proven";RpcEndpointAuthError=class extends Error{constructor(code,detail,options){super(`${code}: ${detail}`,options),this.code=code,this.name="RpcEndpointAuthError"}}}});function isObservingRequest(line){let request;try{request=JSON.parse(line)}catch{return!1}if(typeof request!="object"||request===null||Array.isArray(request))return!1;let record3=request;return record3.type==="warm"||record3.type==="authenticate"||record3.type===RPC_LAUNCH_PROOF_RECORD?!0:record3[OBSERVE_REQUEST_FIELD]===!0&&OBSERVING_COMMANDS.has(record3.type)}function observingHoldChange(line){let request;try{request=JSON.parse(line)}catch{return}if(typeof request!="object"||request===null||Array.isArray(request))return;let record3=request;if(record3[OBSERVE_REQUEST_FIELD]!==!0||!OBSERVING_COMMANDS.has(record3.type))return;let hold=record3[HOLD_HOST_FIELD];return typeof hold=="boolean"?hold:void 0}function originHostInstance(env=process.env){let instance=env[HOST_INSTANCE_ID_ENV]?.trim();return instance||void 0}function requestOriginHostInstance(line){let request;try{request=JSON.parse(line)}catch{return}if(typeof request!="object"||request===null||Array.isArray(request))return;let origin=Reflect.get(request,ORIGIN_HOST_INSTANCE_FIELD);return typeof origin=="string"&&origin.length>0?origin:void 0}var OBSERVE_REQUEST_FIELD,ORIGIN_HOST_INSTANCE_FIELD,HOLD_HOST_FIELD,OBSERVING_COMMANDS,init_host_observe_request=__esm({"packages/coding-agent/dist/modes/rpc/host-observe-request.js"(){init_host_identity_env();init_rpc_auth_proof();OBSERVE_REQUEST_FIELD="observe",ORIGIN_HOST_INSTANCE_FIELD="origin_host_instance",HOLD_HOST_FIELD="hold_host",OBSERVING_COMMANDS=new Set(["get_protocol_info","get_snapshot","list_sessions","subscribe_sessions","unsubscribe_sessions","get_effect_status","get_pending_inputs","get_subscription_limits","get_state","get_entries"])}});import{StringDecoder}from"node:string_decoder";import{isBigIntObject,isBooleanObject,isNumberObject,isStringObject}from"node:util/types";function isStackOverflow(cause){return cause instanceof RangeError&&cause.message.startsWith("Maximum call stack size exceeded")}function jsonStep(input2,key){let value=input2;if(typeof value=="object"&&value!==null||typeof value=="function"||typeof value=="bigint"){let toJSON=value.toJSON;typeof toJSON=="function"&&(value=toJSON.call(value,key))}if(typeof value=="object"&&value!==null){if(isNumberObject(value))value=+value;else if(isStringObject(value))value=String(value);else if(isBooleanObject(value))value=Boolean.prototype.valueOf.call(value);else if(isBigIntObject(value))throw new TypeError("Do not know how to serialize a BigInt")}if(typeof value=="bigint")throw new TypeError("Do not know how to serialize a BigInt");return typeof value=="number"?Number.isFinite(value)?Object.is(value,-0)?0:value:null:typeof value>"u"||typeof value=="function"||typeof value=="symbol"?OMITTED:value}function jsonNormalValue(input2){let ancestors=new Set,stack=[],enter=(input3,key)=>{let value=jsonStep(input3,key);if(typeof value!="object"||value===null)return value;if(ancestors.has(value))throw new TypeError("Converting circular structure to JSON");if(ancestors.add(value),Array.isArray(value)){let out2=[];return stack.push({source:value,out:out2,keys:void 0,length:value.length,index:0}),out2}let keys=Object.keys(value),out={};return stack.push({source:value,out,keys,length:keys.length,index:0}),out},root=enter(input2,"");for(;stack.length>0;){let frame=stack[stack.length-1];if(frame.index===frame.length){ancestors.delete(frame.source),stack.pop();continue}let index=frame.index++;if(frame.keys===void 0){let child2=enter(frame.source[index],String(index));frame.out.push(child2===OMITTED?null:child2);continue}let name=frame.keys[index],child=enter(frame.source[name],name);child!==OMITTED&&Object.defineProperty(frame.out,name,{value:child,enumerable:!0,configurable:!0,writable:!0})}return root===OMITTED?void 0:root}function normalJsonText(root){let parts=[],stack=[],open4=value=>{typeof value!="object"||value===null?parts.push(JSON.stringify(value)):Array.isArray(value)?(parts.push("["),stack.push({value,index:0})):(parts.push("{"),stack.push({value,keys:Object.keys(value),index:0}))};for(open4(root);stack.length>0;){let frame=stack[stack.length-1],{keys}=frame,length=keys===void 0?frame.value.length:keys.length;if(frame.index===length){parts.push(keys===void 0?"]":"}"),stack.pop();continue}let index=frame.index++;if(index>0&&parts.push(","),keys===void 0)open4(frame.value[index]);else{let name=keys[index];parts.push(JSON.stringify(name),":"),open4(frame.value[name])}}return parts.join("")}function legacyJsonText(value){try{return JSON.stringify(value)}catch(cause){if(!isStackOverflow(cause))throw cause;let normal=jsonNormalValue(value);return normal===void 0?void 0:normalJsonText(normal)}}function serializeJsonLine(value){return`${legacyJsonText(value)}
|
|
16
|
+
`),"utf8").digest("hex")}function rpcProofMatches(expected,received){return typeof received=="string"&&RPC_AUTH_HEX.test(received)&&timingSafeEqual(Buffer.from(expected,"hex"),Buffer.from(received,"hex"))}function authRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)?value:void 0}var RPC_AUTH_CAPABILITY,RPC_AUTH_HEX,RPC_LAUNCH_ID,RPC_LAUNCH_PROOF_RECORD,RpcEndpointAuthError,init_rpc_auth_proof=__esm({"packages/coding-agent/dist/modes/rpc/rpc-auth-proof.js"(){RPC_AUTH_CAPABILITY="socket_auth",RPC_AUTH_HEX=/^[a-f0-9]{64}$/,RPC_LAUNCH_ID=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,RPC_LAUNCH_PROOF_RECORD="launch_proven";RpcEndpointAuthError=class extends Error{constructor(code,detail,options){super(`${code}: ${detail}`,options),this.code=code,this.name="RpcEndpointAuthError"}}}});function isObservingRequest(line){let request;try{request=JSON.parse(line)}catch{return!1}if(typeof request!="object"||request===null||Array.isArray(request))return!1;let record3=request;return record3.type==="warm"||record3.type==="park_session"||record3.type==="authenticate"||record3.type===RPC_LAUNCH_PROOF_RECORD?!0:record3[OBSERVE_REQUEST_FIELD]===!0&&OBSERVING_COMMANDS.has(record3.type)}function observingHoldChange(line){let request;try{request=JSON.parse(line)}catch{return}if(typeof request!="object"||request===null||Array.isArray(request))return;let record3=request;if(record3[OBSERVE_REQUEST_FIELD]!==!0||!OBSERVING_COMMANDS.has(record3.type))return;let hold=record3[HOLD_HOST_FIELD];return typeof hold=="boolean"?hold:void 0}function originHostInstance(env=process.env){let instance=env[HOST_INSTANCE_ID_ENV]?.trim();return instance||void 0}function requestOriginHostInstance(line){let request;try{request=JSON.parse(line)}catch{return}if(typeof request!="object"||request===null||Array.isArray(request))return;let origin=Reflect.get(request,ORIGIN_HOST_INSTANCE_FIELD);return typeof origin=="string"&&origin.length>0?origin:void 0}var OBSERVE_REQUEST_FIELD,ORIGIN_HOST_INSTANCE_FIELD,HOLD_HOST_FIELD,OBSERVING_COMMANDS,init_host_observe_request=__esm({"packages/coding-agent/dist/modes/rpc/host-observe-request.js"(){init_host_identity_env();init_rpc_auth_proof();OBSERVE_REQUEST_FIELD="observe",ORIGIN_HOST_INSTANCE_FIELD="origin_host_instance",HOLD_HOST_FIELD="hold_host",OBSERVING_COMMANDS=new Set(["get_protocol_info","get_snapshot","list_sessions","subscribe_sessions","unsubscribe_sessions","get_effect_status","get_pending_inputs","get_subscription_limits","get_state","get_entries"])}});import{StringDecoder}from"node:string_decoder";import{isBigIntObject,isBooleanObject,isNumberObject,isStringObject}from"node:util/types";function isStackOverflow(cause){return cause instanceof RangeError&&cause.message.startsWith("Maximum call stack size exceeded")}function jsonStep(input2,key){let value=input2;if(typeof value=="object"&&value!==null||typeof value=="function"||typeof value=="bigint"){let toJSON=value.toJSON;typeof toJSON=="function"&&(value=toJSON.call(value,key))}if(typeof value=="object"&&value!==null){if(isNumberObject(value))value=+value;else if(isStringObject(value))value=String(value);else if(isBooleanObject(value))value=Boolean.prototype.valueOf.call(value);else if(isBigIntObject(value))throw new TypeError("Do not know how to serialize a BigInt")}if(typeof value=="bigint")throw new TypeError("Do not know how to serialize a BigInt");return typeof value=="number"?Number.isFinite(value)?Object.is(value,-0)?0:value:null:typeof value>"u"||typeof value=="function"||typeof value=="symbol"?OMITTED:value}function jsonNormalValue(input2){let ancestors=new Set,stack=[],enter=(input3,key)=>{let value=jsonStep(input3,key);if(typeof value!="object"||value===null)return value;if(ancestors.has(value))throw new TypeError("Converting circular structure to JSON");if(ancestors.add(value),Array.isArray(value)){let out2=[];return stack.push({source:value,out:out2,keys:void 0,length:value.length,index:0}),out2}let keys=Object.keys(value),out={};return stack.push({source:value,out,keys,length:keys.length,index:0}),out},root=enter(input2,"");for(;stack.length>0;){let frame=stack[stack.length-1];if(frame.index===frame.length){ancestors.delete(frame.source),stack.pop();continue}let index=frame.index++;if(frame.keys===void 0){let child2=enter(frame.source[index],String(index));frame.out.push(child2===OMITTED?null:child2);continue}let name=frame.keys[index],child=enter(frame.source[name],name);child!==OMITTED&&Object.defineProperty(frame.out,name,{value:child,enumerable:!0,configurable:!0,writable:!0})}return root===OMITTED?void 0:root}function normalJsonText(root){let parts=[],stack=[],open4=value=>{typeof value!="object"||value===null?parts.push(JSON.stringify(value)):Array.isArray(value)?(parts.push("["),stack.push({value,index:0})):(parts.push("{"),stack.push({value,keys:Object.keys(value),index:0}))};for(open4(root);stack.length>0;){let frame=stack[stack.length-1],{keys}=frame,length=keys===void 0?frame.value.length:keys.length;if(frame.index===length){parts.push(keys===void 0?"]":"}"),stack.pop();continue}let index=frame.index++;if(index>0&&parts.push(","),keys===void 0)open4(frame.value[index]);else{let name=keys[index];parts.push(JSON.stringify(name),":"),open4(frame.value[name])}}return parts.join("")}function legacyJsonText(value){try{return JSON.stringify(value)}catch(cause){if(!isStackOverflow(cause))throw cause;let normal=jsonNormalValue(value);return normal===void 0?void 0:normalJsonText(normal)}}function serializeJsonLine(value){return`${legacyJsonText(value)}
|
|
17
17
|
`}function attachJsonlLineReader(stream,onLine,options={}){let decoder=new StringDecoder("utf8"),maxLineLength=options.maxLineLength??Number.POSITIVE_INFINITY;if(!(maxLineLength>0))throw new Error("maxLineLength must be greater than zero.");let buffer="",discardingOversizedLine=!1,consume=text=>{let offset=0;for(;offset<text.length;){if(discardingOversizedLine){let newlineIndex2=text.indexOf(`
|
|
18
18
|
`,offset);if(newlineIndex2===-1)return;discardingOversizedLine=!1,offset=newlineIndex2+1;continue}let newlineIndex=text.indexOf(`
|
|
19
19
|
`,offset);if(newlineIndex===-1){let remainder=text.slice(offset);buffer.length+remainder.length>maxLineLength?(buffer="",discardingOversizedLine=!0,options.onOversizedLine?.()):buffer+=remainder;return}let segment=text.slice(offset,newlineIndex);if(buffer.length+segment.length>maxLineLength)options.onOversizedLine?.();else{let line=buffer+segment;onLine(line.endsWith("\r")?line.slice(0,-1):line)}buffer="",offset=newlineIndex+1}},onData=chunk=>{consume(typeof chunk=="string"?chunk:decoder.write(chunk))},onEnd=()=>{consume(decoder.end()),!discardingOversizedLine&&buffer.length>0&&onLine(buffer.endsWith("\r")?buffer.slice(0,-1):buffer),buffer="",discardingOversizedLine=!1};return stream.on("data",onData),stream.on("end",onEnd),()=>{stream.off("data",onData),stream.off("end",onEnd)}}var OMITTED,MAX_RPC_LINE_CHARACTERS,init_jsonl=__esm({"packages/coding-agent/dist/modes/rpc/jsonl.js"(){OMITTED=Symbol("omitted");MAX_RPC_LINE_CHARACTERS=16*1024*1024}});import{createHash as createHash2,randomBytes as randomBytes2,timingSafeEqual as timingSafeEqual2}from"node:crypto";import{constants as constants2}from"node:fs";import{chmod as chmod2,link,mkdir as mkdir2,open,readFile as readFile4,realpath,rename as rename2,unlink,writeFile as writeFile3}from"node:fs/promises";import{basename as basename6,dirname as dirname7,join as join10,win32 as win323}from"node:path";function socketSecretPath(logicalPath){if(logicalPath.toLowerCase().startsWith("\\\\.\\pipe\\"))throw new Error(`Windows RPC named-pipe addresses need a logical filesystem path for their secret: ${logicalPath}`);return`${logicalPath}${SOCKET_SECRET_SUFFIX}`}async function ensureSocketSecret(path2){let existing=await readSecretEntry(path2);if(existing?.length===SOCKET_SECRET_BYTES)return existing;await mkdir2(dirname7(path2),{recursive:!0,mode:448});let release=await acquireOwnershipSafeLock(await socketSecretLockPath(path2));try{let current=await readSecretEntry(path2);if(current?.length===SOCKET_SECRET_BYTES)return current;if(process.platform==="win32")return await writeSocketSecretInPlace(path2);let candidate=randomBytes2(SOCKET_SECRET_BYTES);if(current===void 0){if(await publishSocketSecretIfAbsent(path2,candidate)==="published")return candidate;let winner=await readSecretEntry(path2);if(winner?.length===SOCKET_SECRET_BYTES)return winner;throw new Error(`RPC socket secret is invalid and was not replaced: ${path2}`)}return await replaceSocketSecret(path2,candidate),candidate}finally{await release()}}async function readSecretEntry(path2){let handle;try{handle=await open(path2,constants2.O_RDONLY|(constants2.O_NOFOLLOW??0))}catch(error62){if(isNodeErrorCode3(error62,"ENOENT"))return;throw isNodeErrorCode3(error62,"ELOOP")?new Error(`RPC socket secret is not a regular file: ${path2}`):error62}try{if(!(await handle.stat()).isFile())throw new Error(`RPC socket secret is not a regular file: ${path2}`);let buffer=Buffer.alloc(SOCKET_SECRET_BYTES+1),length=0;for(;length<buffer.length;){let{bytesRead}=await handle.read(buffer,length,buffer.length-length,null);if(bytesRead===0)break;length+=bytesRead}return buffer.subarray(0,length)}finally{await handle.close()}}async function createSocketSecret(path2){if(process.platform==="win32")return writeSocketSecretInPlace(path2);await mkdir2(dirname7(path2),{recursive:!0,mode:448});let candidate=randomBytes2(SOCKET_SECRET_BYTES);if(await readSecretEntry(path2)===void 0&&await publishSocketSecretIfAbsent(path2,candidate)==="published")return candidate;let winner=await readSecretEntry(path2);if(winner?.length!==SOCKET_SECRET_BYTES)throw new Error(`RPC socket secret is invalid and was not replaced: ${path2}`);return winner}async function publishSocketSecretIfAbsent(path2,candidate){let staging=stagingPath(path2);await writeStaging(staging,candidate);try{return await link(staging,path2),await syncDirectory(dirname7(path2)),"published"}catch(error62){if(isNodeErrorCode3(error62,"EEXIST"))return"collision";throw error62}finally{await unlink(staging).catch(error62=>{if(!isNodeErrorCode3(error62,"ENOENT"))throw error62})}}async function writeStaging(staging,candidate){let handle=await open(staging,constants2.O_WRONLY|constants2.O_CREAT|constants2.O_EXCL|(constants2.O_NOFOLLOW??0),384),failure2;try{await handle.chmod(384);let offset=0;for(;offset<candidate.length;){let{bytesWritten}=await handle.write(candidate,offset,candidate.length-offset,null);if(bytesWritten===0)throw new Error(`short write to the RPC socket secret staging file: ${staging}`);offset+=bytesWritten}await handle.sync()}catch(error62){failure2=error62}if(await handle.close().catch(error62=>{failure2??=error62}),failure2!==void 0)throw await unlink(staging).catch(()=>{}),failure2}async function syncDirectory(dir){let handle=await open(dir,constants2.O_RDONLY);try{await handle.sync()}finally{await handle.close()}}async function socketSecretLockPath(path2){let lockPath=join10(await realpath(dirname7(path2)),`${basename6(path2)}.publish.lock`),handle=await open(lockPath,constants2.O_RDONLY|constants2.O_CREAT|(constants2.O_NOFOLLOW??0),384);try{if(!(await handle.stat()).isFile())throw new Error(`RPC socket secret lock is not a regular file: ${lockPath}`)}finally{await handle.close()}return lockPath}async function replaceSocketSecret(path2,candidate){let staging=stagingPath(path2);await writeStaging(staging,candidate);try{await rename2(staging,path2)}catch(error62){throw await unlink(staging).catch(()=>{}),error62}await syncDirectory(dirname7(path2))}function stagingPath(path2){return join10(dirname7(path2),`.${basename6(path2)}.stage-${process.pid}-${randomBytes2(8).toString("hex")}`)}async function writeSocketSecretInPlace(path2){await mkdir2(dirname7(path2),{recursive:!0});let secret=randomBytes2(SOCKET_SECRET_BYTES);return await writeFile3(path2,secret,{mode:384}),await chmod2(path2,384),secret}async function readSocketSecret(path2){let secret=await readFile4(path2);if(secret.length!==SOCKET_SECRET_BYTES)throw new Error(`invalid RPC socket secret: ${path2}`);return secret}function resolveSocketTransportAddress(socketPath,platform,secret){if(platform!=="win32"||socketPath.toLowerCase().startsWith("\\\\.\\pipe\\"))return socketPath;if(!/^[a-zA-Z]:[\\/]/.test(socketPath)&&!/^\\\\[^/]/.test(socketPath))throw new Error(`Windows RPC socket path must be drive-qualified or UNC: ${socketPath}`);let canonical=win323.normalize(socketPath).toLowerCase(),identity=Buffer.concat([Buffer.from(canonical,"utf8"),Buffer.from(secret??[])]),name=createHash2("sha256").update(identity).digest("hex").slice(0,32);return`${WINDOWS_PIPE_PREFIX}${name}`}function authenticateSocket(socket,secret,onAuthenticated){let received=Buffer.alloc(0),finish=()=>{clearTimeout(timer),socket.off("data",onData),socket.off("error",onError)},onError=()=>{finish(),socket.destroy()},timer=setTimeout(()=>{finish(),socket.destroy()},SOCKET_HANDSHAKE_TIMEOUT_MS),onData=chunk=>{if(received=Buffer.concat([received,chunk]),received.length<secret.length)return;if(finish(),!timingSafeEqual2(received.subarray(0,secret.length),Buffer.from(secret))){socket.destroy();return}let remainder=received.subarray(secret.length);remainder.length>0&&socket.unshift(remainder),onAuthenticated()};socket.on("data",onData),socket.once("error",onError),socket.once("close",finish)}function sendSocketHandshake(socket,secret){socket.write(Buffer.from(secret))}function isNodeErrorCode3(error62,code){return error62 instanceof Error&&"code"in error62&&error62.code===code}var WINDOWS_PIPE_PREFIX,SOCKET_SECRET_BYTES,SOCKET_SECRET_SUFFIX,SOCKET_SECRET_FILE_ENV,SOCKET_HANDSHAKE_TIMEOUT_MS,init_socket_transport=__esm({"packages/coding-agent/dist/modes/rpc/socket-transport.js"(){init_ownership_safe_lock();WINDOWS_PIPE_PREFIX="\\\\.\\pipe\\senpi-rpc-",SOCKET_SECRET_BYTES=32,SOCKET_SECRET_SUFFIX=".secret",SOCKET_SECRET_FILE_ENV="SENPI_RPC_SOCKET_SECRET_FILE",SOCKET_HANDSHAKE_TIMEOUT_MS=2e3}});import{randomBytes as randomBytes3,randomUUID as randomUUID3}from"node:crypto";import{constants as constants3,unlinkSync}from"node:fs";import*as fs from"node:fs/promises";import{join as join11}from"node:path";async function checkRpcKeyDirectory(path2,privateKeys=!1){let checked=privateKeys?path2:await fs.realpath(path2),problem=keyDirectoryProblem(await fs.lstat(checked),checked,privateKeys);if(problem!==void 0)throw new RpcEndpointAuthError("unsafe_key_record",`${checked} ${problem}`)}function keyDirectoryProblem(info,path2,privateKeys){if(!info.isDirectory())return"is not a directory";if(info.uid!==process.getuid?.())return"is not owned by this user";let mode=info.mode&4095;return privateKeys?mode===448?void 0:`must be mode 0700 (is 0${mode.toString(8)}); run: chmod 700 ${path2}`:(mode&18)===0?void 0:`is writable by group or others; run: chmod go-w ${path2}`}async function checkRpcKeyParents(root){await checkRpcKeyDirectory(root),await checkRpcKeyDirectory(join11(root,"rpc"))}async function readRpcKeyRecord(root,launchId){if(!RPC_LAUNCH_ID.test(launchId))throw new RpcEndpointAuthError("unsafe_key_record",`invalid launch id under ${root}`);let path2=join11(root,"rpc","keys",launchId);try{await checkRpcKeyParents(root),await checkRpcKeyDirectory(join11(root,"rpc","keys"),!0);let handle=await fs.open(path2,constants3.O_RDONLY|constants3.O_NOFOLLOW|constants3.O_NONBLOCK);try{let info=await handle.stat();if(!info.isFile()||info.uid!==process.getuid?.()||(info.mode&4095)!==384||info.size>MAX_KEY_RECORD_BYTES)throw new RpcEndpointAuthError("unsafe_key_record",path2);let record3=authRecord(JSON.parse(await handle.readFile("utf8")));if(record3?.version!==1||record3.launch_id!==launchId||typeof record3.key!="string"||!RPC_AUTH_HEX.test(record3.key))throw new RpcEndpointAuthError("unsafe_key_record",path2);return record3}finally{await handle.close()}}catch(cause){if(cause instanceof Error&&"code"in cause&&cause.code==="ENOENT")return;throw cause instanceof RpcEndpointAuthError?cause:new RpcEndpointAuthError("unsafe_key_record",path2,{cause})}}var MAX_KEY_RECORD_BYTES,RpcPublicEndpoint,init_rpc_public_key=__esm({"packages/coding-agent/dist/modes/rpc/rpc-public-key.js"(){init_process_identity();init_rpc_auth_proof();MAX_KEY_RECORD_BYTES=4096;RpcPublicEndpoint=class{constructor(agentDir,endpoint){this.key=randomBytes3(32),this.launchId=randomUUID3(),this.publication=Promise.withResolvers(),this.created=!1,this.exitCleanup=()=>{if(this.created)try{unlinkSync(this.recordPath)}catch(cause){cause instanceof Error&&"code"in cause&&cause.code==="ENOENT"||process.stderr.write(`senpi rpc host: could not remove own endpoint key record
|
package/dist/bundle/chunks/{host-session-command-YJB2FLKU.js → host-session-command-BZYBDOIE.js}
RENAMED
|
@@ -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{RpcClient,RpcCommandError,RpcTransportGoneError,isTransportGoneError}from"./chunk-ARUV3US4.js";import"./chunk-3IYEGHBI.js";import{SessionManager,assertValidSessionId}from"./chunk-BELNOPAI.js";import"./chunk-J2I56WLK.js";import"./chunk-GTJJ73DE.js";import{RpcRequestTimeoutError}from"./chunk-H33A33M4.js";import"./chunk-TQHNFP77.js";import"./chunk-3Q5ZENSD.js";import"./chunk-SOMFLLPD.js";import{DEFAULT_HOST_LAUNCH_SPEC,HOST_EXIT_ERROR,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HostLaunchSpecError,daemonEnvKeys,daemonEnvOverrides,emit,ensureHost,loadHostLaunchSpec,refusal,resolveHostSocket,writeDaemonEnvKeys}from"./chunk-L6NRDUWJ.js";import{HostEnsureRefusedError,STOP_WAIT_BUDGET_MS}from"./chunk-THYEZBUG.js";import"./chunk-QMRJYMNH.js";import{endpointKindOfSocket}from"./chunk-Y7Z7XPUF.js";import"./chunk-IEY2SL46.js";import"./chunk-26UBFF6N.js";import"./chunk-I5ASHSLZ.js";import{withRpcKeyRoot}from"./chunk-2CNSCMYC.js";import"./chunk-DX43FSQT.js";import"./chunk-7WYJAYHH.js";import"./chunk-YPAQXRP3.js";import"./chunk-R2Z7CX77.js";import"./chunk-UCXBDE6R.js";import{canonicalSessionPath,createHostDaemonPaths}from"./chunk-YI6KRJDC.js";import"./chunk-DBQBJTMF.js";import"./chunk-SF4MQDKZ.js";import"./chunk-KLAX467B.js";import"./chunk-C4AHHZ6P.js";import"./chunk-KUPQO7MC.js";import"./chunk-U3VOXCGP.js";import"./chunk-TMXRR3N7.js";import"./chunk-V5FSENW6.js";import"./chunk-R7J5TEYK.js";import"./chunk-WXYMAUFX.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-XH2MWTXA.js";import"./chunk-GVSBCJFI.js";import"./chunk-QTS2XGPQ.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-BMX2U22F.js";import"./chunk-E266ORGA.js";import"./chunk-T2SMQPRE.js";import"./chunk-RUGTHELO.js";import"./chunk-42XRJQM6.js";import"./chunk-5XHOHZIR.js";import"./chunk-HW6AAS3R.js";import{APP_NAME,getAgentDir}from"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-EYSV6A7S.js";import"./chunk-MIENF2YK.js";import"./chunk-O5RYI3IW.js";import"./chunk-RFFMEA4B.js";import"./chunk-IKOFCODM.js";import{readFileSync}from"node:fs";import{resolve}from"node:path";var DETACH_ACK_TIMEOUT_MS=5e3;async function detachBeforeClose(client,report,timeoutMs=DETACH_ACK_TIMEOUT_MS){let timer,late=new Promise(resolve2=>{timer=setTimeout(()=>resolve2("late"),timeoutMs)});try{await Promise.race([client.detachConnection(),late])==="late"&&report(`the host did not confirm the detach within ${timeoutMs} ms; closing the connection anyway`)}catch(error){if(error instanceof RpcTransportGoneError)return;report(`the host refused the detach (${error instanceof Error?error.message:String(error)}); closing the connection anyway`)}finally{clearTimeout(timer)}}var USAGE_CODES=new Set(["missing_session_id","invalid_path","invalid_session_context","invalid_session_kind","invalid_launch_profile","invalid_session_id","invalid_release_reason","empty","unknown_command"]),FAILURE_CODES=new Set(["open_failed","warm_failed","release_failed"]),REASON_FOR_CODE={streaming:"busy",not_found:"unknown_cursor"},BARE_CODE=/^[a-z][a-z0-9_]*$/;function mapError(error,socket){let detail=error instanceof Error?error.message:String(error);if(error instanceof RpcCommandError){let code=error.errorCode??(BARE_CODE.test(detail)?detail:void 0);if(code===void 0)return hostError(detail,socket);let exitCode=USAGE_CODES.has(code)?HOST_EXIT_USAGE:FAILURE_CODES.has(code)?HOST_EXIT_ERROR:HOST_EXIT_REFUSED;return{exitCode,payload:{action:exitCode===HOST_EXIT_REFUSED?"refuse":"error",reason:REASON_FOR_CODE[code]??code,detail,socket,...error.errorData!==void 0&&{data:error.errorData}}}}return isTransportGoneError(error)?{exitCode:HOST_EXIT_ERROR,payload:{action:"error",reason:"transport_gone",detail,socket}}:hostError(detail,socket)}function hostError(detail,socket){return{exitCode:HOST_EXIT_ERROR,payload:{action:"error",reason:"host_error",detail,socket}}}async function openHostSession(client,request,socket,ensured){let opened=await client.openSession({cwd:request.cwd,retain_on_disconnect:!0,...request.model&&{provider:request.model.provider,modelId:request.model.id}});ensured?.release();let{state}=opened,identity={sessionId:opened.sessionId,sessionPath:state.sessionFile,durableSessionId:state.sessionId};try{request.name!==void 0&&await client.setSessionName(request.name);let disposition=request.prompt===void 0?void 0:await client.prompt(request.prompt);return{exitCode:HOST_EXIT_OK,payload:{action:"open",socket,pid:ensured?.pid,reused:ensured?.reused,...identity,cwd:state.cwd,model:state.model?{provider:state.model.provider,id:state.model.id}:null,attached:opened.attached??!1,...disposition!==void 0&&{prompt:{disposition}}}}}catch(error){let outcome=mapError(error,socket),closed=await closeOpened(client,opened.sessionId);return{...outcome,payload:{...outcome.payload,...identity,closed}}}}async function closeOpened(client,sessionId){try{return await client.closeSession(sessionId),!(await client.listSessions()).some(row=>row.sessionId===sessionId)}catch{return!1}}import{existsSync}from"node:fs";import{readdir}from"node:fs/promises";import{dirname,join}from"node:path";async function resolveSessionRef(client,ref,agentDir){let rows=await client.listSessions(),handle=rows.find(row=>row.sessionId===ref);if(handle)return{kind:"live",row:handle};if(isSessionId(ref)){let byId=await resolveDurableId(ref,rows,agentDir);if(byId)return byId}let named=rows.filter(row=>row.name===ref);if(named.length>1)return{kind:"ambiguous",candidates:named.map(row=>row.sessionId)};let live=named[0]??rows.find(row=>row.sessionPath!==void 0&&samePath(row.sessionPath,ref));return live?{kind:"live",row:live}:looksLikePath(ref)?parkedByPath(ref):{kind:"unknown"}}async function resolveDurableId(id,rows,agentDir){let liveRows=rows.filter(row=>row.durableSessionId===id),transcripts=(await transcriptsUnder(agentDir)).filter(session=>session.id===id),files=new Set([...liveRows.map(row=>row.sessionPath===void 0?row.sessionId:canonicalSessionPath(row.sessionPath)),...transcripts.map(session=>canonicalSessionPath(session.path))]);return files.size>1?{kind:"ambiguous",candidates:[...files]}:liveRows[0]?{kind:"live",row:liveRows[0]}:transcripts[0]?parked(transcripts[0]):void 0}function isSessionId(ref){try{return assertValidSessionId(ref),!0}catch{return!1}}function looksLikePath(ref){return ref.includes("/")||ref.includes("\\")||ref.endsWith(".jsonl")}async function parkedByPath(ref){let path=canonicalSessionPath(ref);if(!existsSync(path))return{kind:"unknown"};let info=(await SessionManager.listAll(dirname(path))).find(session=>samePath(session.path,path));return info?parked(info):{kind:"unknown"}}async function transcriptsUnder(agentDir){let root=join(agentDir,"sessions");if(!existsSync(root))return[];let dirs=(await readdir(root,{withFileTypes:!0})).filter(entry=>entry.isDirectory());return(await Promise.all(dirs.map(entry=>SessionManager.listAll(join(root,entry.name))))).flat()}function parked(info){return{kind:"parked",sessionPath:info.path,cwd:info.cwd,durableSessionId:info.id}}function samePath(left,right){return canonicalSessionPath(left)===canonicalSessionPath(right)}function waitForHostSession(client,sessionId,request,onTransportLoss){let started=Date.now();return new Promise((resolveWait,reject)=>{let finished=!1,observed=!1,state,timer,cleanup=()=>{finished=!0,clearTimeout(timer),unsubscribe(),onTransportLoss(void 0)},fail=error=>{finished||(cleanup(),reject(error))},finish=outcome=>{finished||(cleanup(),resolveWait({exitCode:HOST_EXIT_OK,payload:{action:"wait",sessionId,until:request.until,outcome,waited_ms:Date.now()-started,state:{isStreaming:state?.isStreaming??!1,pendingMessageCount:state?.pendingMessageCount??0,lastAbortSource:state?.lastAbortSource??null}}}))},unsubscribe=client.onEvent(record=>{let event=record;if(event.type==="session_closed"||event.type==="session_parked"){finish(event.type);return}if(event.type==="agent_settled"&&"reason"in event&&event.reason==="session_closed"){finish("session_closed");return}event.type!=="agent_idle"&&!(request.until==="done"&&event.type==="agent_settled")||(observed=!0,client.getState().then(snapshot=>{state=snapshot,request.until==="done"?finish("done"):isDrained(snapshot)&&finish("idle")},fail))});onTransportLoss(fail),timer=setTimeout(()=>{finished||(cleanup(),resolveWait({exitCode:HOST_EXIT_ERROR,payload:{action:"error",reason:"wait_timeout",sessionId,until:request.until,timeoutMs:request.timeoutMs}}))},request.timeoutMs),client.getState().then(snapshot=>{state=snapshot,!observed&&(request.until==="done"?!snapshot.isStreaming:isDrained(snapshot))&&finish("already_idle")},fail)})}function isDrained(state){return!state.isStreaming&&state.steering.length===0&&state.followUp.length===0&&state.ordered.length===0&&state.pendingMessageCount===0}async function runHostSessionRequest(request){let deadline=Date.now()+STOP_WAIT_BUDGET_MS;for(;;)try{return await runHostSessionRequestOnce(request,Math.max(0,deadline-Date.now()))}catch(error){if(request.action==="open"&&error instanceof RpcCommandError&&error.errorCode==="host_stopping"&&Date.now()<deadline)continue;return mapError(error,request.target.socket)}}async function runHostSessionRequestOnce(request,stoppingTimeoutMs){let{socket,agentDir}=request.target,client,ensured,disconnected,connectionUnusable=!1;try{if(await endpointKindOfSocket(socket,agentDir)==="tui")return refusal("refuse",void 0,{reason:"unsupported_endpoint_kind",socket,endpoint_kind:"tui"});request.action==="open"&&(ensured=await ensureHost({socket,agentDir,hostArgs:request.spec.hostArgs,env:daemonEnvOverrides(process.env,request.spec.env),policy:request.spec.policy,upgrade:"never",stoppingTimeoutMs}),ensured.reused||await writeDaemonEnvKeys(createHostDaemonPaths({socket,agentDir}),daemonEnvKeys(process.env,request.spec.env))),client=new RpcClient({socketPath:socket,onDisconnect:error=>{connectionUnusable=!0,disconnected?.(error)}});try{await client.start()}catch(error){if(error instanceof Error&&"code"in error&&(error.code==="ENOENT"||error.code==="ECONNREFUSED"))return refusal("refuse",void 0,{reason:"host_unavailable",socket,detail:error.message});throw error}let sessionId,durableSessionId;if("ref"in request){let found=await resolveSessionRef(client,request.ref,agentDir);if(found.kind==="unknown")return refusal("refuse",void 0,{reason:"unknown_session",ref:request.ref,socket});if(found.kind==="ambiguous"){let detail={reason:"ambiguous_session",ref:request.ref,candidates:found.candidates,socket};return refusal("refuse",void 0,detail)}let reopen=found.kind==="parked"?{sessionPath:found.sessionPath,cwd:found.cwd,retain_on_disconnect:!0,attended:!1}:{sessionPath:found.row.sessionPath,cwd:found.row.cwd};durableSessionId=found.kind==="parked"?found.durableSessionId:found.row.durableSessionId,sessionId=(await client.openSession(reopen)).sessionId}switch(request.action){case"open":return await openHostSession(client,request,socket,ensured);case"prompt":return{exitCode:HOST_EXIT_OK,payload:{action:"prompt",sessionId,disposition:await client.prompt(request.text)}};case"steer":{let streaming=(await client.getState()).isStreaming,disposition=await client.steer(request.text);return{exitCode:HOST_EXIT_OK,payload:{action:"steer",sessionId,disposition,streaming}}}case"abort":{let aborted=(await client.getState()).isStreaming;return await client.abortStrict(),{exitCode:HOST_EXIT_OK,payload:{action:"abort",sessionId,acknowledged:!0,aborted}}}case"model":{await client.setModel(request.model.provider,request.model.id);let state=await client.getState();return{exitCode:HOST_EXIT_OK,payload:{action:"model",sessionId,requested:request.model,model:state.model?{provider:state.model.provider,id:state.model.id}:null,pendingModelSwitch:state.pendingModelSwitch??null}}}case"list":return{exitCode:HOST_EXIT_OK,payload:{action:"list",socket,sessions:await client.listSessions({observe:!0})}};case"state":return{exitCode:HOST_EXIT_OK,payload:{action:"state",sessionId,durableSessionId,state:await client.getState()}};case"read":{if(request.messages){let all=await client.getMessages(),messages=request.tail===void 0?all:all.slice(-request.tail);return{exitCode:HOST_EXIT_OK,payload:{action:"read",sessionId,messages,count:messages.length}}}let{entries,leafId}=await client.getEntries(request.since),slice=request.tail===void 0?entries:entries.slice(-request.tail);return{exitCode:HOST_EXIT_OK,payload:{action:"read",sessionId,entries:slice,count:slice.length,total:entries.length,leafId,nextSince:slice.at(-1)?.id??request.since??null,...request.since!==void 0&&{since:request.since}}}}case"wait":return await waitForHostSession(client,sessionId,request,handler=>{disconnected=handler});case"unload":{let answer=await client.unloadSession({sessionId,interrupt:request.interrupt,force:request.force,clearQueue:request.clearQueue,children:request.children});return{exitCode:answer.outcome==="unloaded"?HOST_EXIT_OK:HOST_EXIT_REFUSED,payload:{action:"unload",sessionId,...answer}}}case"close":{let reason,unsubscribe=client.onEvent(record=>{let event=record;event.type==="session_closed"&&(reason=event.reason)});try{await client.closeSession(sessionId);let remaining=(await client.listSessions()).find(row=>row.sessionId===sessionId);return{exitCode:HOST_EXIT_OK,payload:remaining?{action:"close",sessionId,closed:!1,attachments:remaining.attachments}:{action:"close",sessionId,closed:!0,reason:reason??"client_close"}}}finally{unsubscribe()}}default:return assertNever(request)}}catch(error){if((error instanceof RpcRequestTimeoutError||isTransportGoneError(error))&&(connectionUnusable=!0),request.action==="open"&&error instanceof RpcCommandError&&error.errorCode==="host_stopping")throw error;return error instanceof HostEnsureRefusedError?refusal("refuse",void 0,{reason:error.reason,socket,detail:error.detail}):mapError(error,socket)}finally{ensured?.release(),client&&!connectionUnusable&&await detachBeforeClose(client,line=>process.stderr.write(`senpi host session: ${line}
|
|
2
|
+
import{RpcClient,RpcCommandError,RpcTransportGoneError,isTransportGoneError}from"./chunk-QATU6BBC.js";import"./chunk-3IYEGHBI.js";import{SessionManager,assertValidSessionId}from"./chunk-UOZDDYBN.js";import"./chunk-J2I56WLK.js";import"./chunk-GTJJ73DE.js";import{RpcRequestTimeoutError}from"./chunk-M2VJVJMK.js";import"./chunk-TQHNFP77.js";import"./chunk-3Q5ZENSD.js";import"./chunk-SOMFLLPD.js";import{DEFAULT_HOST_LAUNCH_SPEC,HOST_EXIT_ERROR,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HostLaunchSpecError,daemonEnvKeys,daemonEnvOverrides,emit,ensureHost,loadHostLaunchSpec,refusal,resolveHostSocket,writeDaemonEnvKeys}from"./chunk-OF3XVGG4.js";import{HostEnsureRefusedError,STOP_WAIT_BUDGET_MS}from"./chunk-Q4G5DECT.js";import"./chunk-QMRJYMNH.js";import{endpointKindOfSocket}from"./chunk-DZQA5LVN.js";import"./chunk-IEY2SL46.js";import"./chunk-26UBFF6N.js";import"./chunk-4JMGWVRH.js";import{withRpcKeyRoot}from"./chunk-E5O4SP5I.js";import"./chunk-DX43FSQT.js";import"./chunk-7WYJAYHH.js";import"./chunk-47T6YMI2.js";import"./chunk-R2Z7CX77.js";import"./chunk-UCXBDE6R.js";import{canonicalSessionPath,createHostDaemonPaths}from"./chunk-YI6KRJDC.js";import"./chunk-VUY4BZDI.js";import"./chunk-SF4MQDKZ.js";import"./chunk-KLAX467B.js";import"./chunk-C4AHHZ6P.js";import"./chunk-KUPQO7MC.js";import"./chunk-U3VOXCGP.js";import"./chunk-TMXRR3N7.js";import"./chunk-V5FSENW6.js";import"./chunk-R7J5TEYK.js";import"./chunk-WXYMAUFX.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-XH2MWTXA.js";import"./chunk-GVSBCJFI.js";import"./chunk-QTS2XGPQ.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-BMX2U22F.js";import"./chunk-E266ORGA.js";import"./chunk-T2SMQPRE.js";import"./chunk-RUGTHELO.js";import"./chunk-42XRJQM6.js";import"./chunk-5XHOHZIR.js";import"./chunk-HW6AAS3R.js";import{APP_NAME,getAgentDir}from"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-EYSV6A7S.js";import"./chunk-MIENF2YK.js";import"./chunk-O5RYI3IW.js";import"./chunk-RFFMEA4B.js";import"./chunk-IKOFCODM.js";import{readFileSync}from"node:fs";import{resolve}from"node:path";var DETACH_ACK_TIMEOUT_MS=5e3;async function detachBeforeClose(client,report,timeoutMs=DETACH_ACK_TIMEOUT_MS){let timer,late=new Promise(resolve2=>{timer=setTimeout(()=>resolve2("late"),timeoutMs)});try{await Promise.race([client.detachConnection(),late])==="late"&&report(`the host did not confirm the detach within ${timeoutMs} ms; closing the connection anyway`)}catch(error){if(error instanceof RpcTransportGoneError)return;report(`the host refused the detach (${error instanceof Error?error.message:String(error)}); closing the connection anyway`)}finally{clearTimeout(timer)}}var USAGE_CODES=new Set(["missing_session_id","invalid_path","invalid_session_context","invalid_session_kind","invalid_launch_profile","invalid_session_id","invalid_release_reason","empty","unknown_command"]),FAILURE_CODES=new Set(["open_failed","warm_failed","release_failed"]),REASON_FOR_CODE={streaming:"busy",not_found:"unknown_cursor"},BARE_CODE=/^[a-z][a-z0-9_]*$/;function mapError(error,socket){let detail=error instanceof Error?error.message:String(error);if(error instanceof RpcCommandError){let code=error.errorCode??(BARE_CODE.test(detail)?detail:void 0);if(code===void 0)return hostError(detail,socket);let exitCode=USAGE_CODES.has(code)?HOST_EXIT_USAGE:FAILURE_CODES.has(code)?HOST_EXIT_ERROR:HOST_EXIT_REFUSED;return{exitCode,payload:{action:exitCode===HOST_EXIT_REFUSED?"refuse":"error",reason:REASON_FOR_CODE[code]??code,detail,socket,...error.errorData!==void 0&&{data:error.errorData}}}}return isTransportGoneError(error)?{exitCode:HOST_EXIT_ERROR,payload:{action:"error",reason:"transport_gone",detail,socket}}:hostError(detail,socket)}function hostError(detail,socket){return{exitCode:HOST_EXIT_ERROR,payload:{action:"error",reason:"host_error",detail,socket}}}async function openHostSession(client,request,socket,ensured){let opened=await client.openSession({cwd:request.cwd,retain_on_disconnect:!0,...request.model&&{provider:request.model.provider,modelId:request.model.id}});ensured?.release();let{state}=opened,identity={sessionId:opened.sessionId,sessionPath:state.sessionFile,durableSessionId:state.sessionId};try{request.name!==void 0&&await client.setSessionName(request.name);let disposition=request.prompt===void 0?void 0:await client.prompt(request.prompt);return{exitCode:HOST_EXIT_OK,payload:{action:"open",socket,pid:ensured?.pid,reused:ensured?.reused,...identity,cwd:state.cwd,model:state.model?{provider:state.model.provider,id:state.model.id}:null,attached:opened.attached??!1,...disposition!==void 0&&{prompt:{disposition}}}}}catch(error){let outcome=mapError(error,socket),closed=await closeOpened(client,opened.sessionId);return{...outcome,payload:{...outcome.payload,...identity,closed}}}}async function closeOpened(client,sessionId){try{return await client.closeSession(sessionId),!(await client.listSessions()).some(row=>row.sessionId===sessionId)}catch{return!1}}import{existsSync}from"node:fs";import{readdir}from"node:fs/promises";import{dirname,join}from"node:path";async function resolveSessionRef(client,ref,agentDir){let rows=await client.listSessions(),handle=rows.find(row=>row.sessionId===ref);if(handle)return{kind:"live",row:handle};if(isSessionId(ref)){let byId=await resolveDurableId(ref,rows,agentDir);if(byId)return byId}let named=rows.filter(row=>row.name===ref);if(named.length>1)return{kind:"ambiguous",candidates:named.map(row=>row.sessionId)};let live=named[0]??rows.find(row=>row.sessionPath!==void 0&&samePath(row.sessionPath,ref));return live?{kind:"live",row:live}:looksLikePath(ref)?parkedByPath(ref):{kind:"unknown"}}async function resolveDurableId(id,rows,agentDir){let liveRows=rows.filter(row=>row.durableSessionId===id),transcripts=(await transcriptsUnder(agentDir)).filter(session=>session.id===id),files=new Set([...liveRows.map(row=>row.sessionPath===void 0?row.sessionId:canonicalSessionPath(row.sessionPath)),...transcripts.map(session=>canonicalSessionPath(session.path))]);return files.size>1?{kind:"ambiguous",candidates:[...files]}:liveRows[0]?{kind:"live",row:liveRows[0]}:transcripts[0]?parked(transcripts[0]):void 0}function isSessionId(ref){try{return assertValidSessionId(ref),!0}catch{return!1}}function looksLikePath(ref){return ref.includes("/")||ref.includes("\\")||ref.endsWith(".jsonl")}async function parkedByPath(ref){let path=canonicalSessionPath(ref);if(!existsSync(path))return{kind:"unknown"};let info=(await SessionManager.listAll(dirname(path))).find(session=>samePath(session.path,path));return info?parked(info):{kind:"unknown"}}async function transcriptsUnder(agentDir){let root=join(agentDir,"sessions");if(!existsSync(root))return[];let dirs=(await readdir(root,{withFileTypes:!0})).filter(entry=>entry.isDirectory());return(await Promise.all(dirs.map(entry=>SessionManager.listAll(join(root,entry.name))))).flat()}function parked(info){return{kind:"parked",sessionPath:info.path,cwd:info.cwd,durableSessionId:info.id}}function samePath(left,right){return canonicalSessionPath(left)===canonicalSessionPath(right)}function waitForHostSession(client,sessionId,request,onTransportLoss){let started=Date.now();return new Promise((resolveWait,reject)=>{let finished=!1,observed=!1,state,timer,cleanup=()=>{finished=!0,clearTimeout(timer),unsubscribe(),onTransportLoss(void 0)},fail=error=>{finished||(cleanup(),reject(error))},finish=outcome=>{finished||(cleanup(),resolveWait({exitCode:HOST_EXIT_OK,payload:{action:"wait",sessionId,until:request.until,outcome,waited_ms:Date.now()-started,state:{isStreaming:state?.isStreaming??!1,pendingMessageCount:state?.pendingMessageCount??0,lastAbortSource:state?.lastAbortSource??null}}}))},unsubscribe=client.onEvent(record=>{let event=record;if(event.type==="session_closed"||event.type==="session_parked"){finish(event.type);return}if(event.type==="agent_settled"&&"reason"in event&&event.reason==="session_closed"){finish("session_closed");return}event.type!=="agent_idle"&&!(request.until==="done"&&event.type==="agent_settled")||(observed=!0,client.getState().then(snapshot=>{state=snapshot,request.until==="done"?finish("done"):isDrained(snapshot)&&finish("idle")},fail))});onTransportLoss(fail),timer=setTimeout(()=>{finished||(cleanup(),resolveWait({exitCode:HOST_EXIT_ERROR,payload:{action:"error",reason:"wait_timeout",sessionId,until:request.until,timeoutMs:request.timeoutMs}}))},request.timeoutMs),client.getState().then(snapshot=>{state=snapshot,!observed&&(request.until==="done"?!snapshot.isStreaming:isDrained(snapshot))&&finish("already_idle")},fail)})}function isDrained(state){return!state.isStreaming&&state.steering.length===0&&state.followUp.length===0&&state.ordered.length===0&&state.pendingMessageCount===0}async function runHostSessionRequest(request){let deadline=Date.now()+STOP_WAIT_BUDGET_MS;for(;;)try{return await runHostSessionRequestOnce(request,Math.max(0,deadline-Date.now()))}catch(error){if(request.action==="open"&&error instanceof RpcCommandError&&error.errorCode==="host_stopping"&&Date.now()<deadline)continue;return mapError(error,request.target.socket)}}async function runHostSessionRequestOnce(request,stoppingTimeoutMs){let{socket,agentDir}=request.target,client,ensured,disconnected,connectionUnusable=!1;try{if(await endpointKindOfSocket(socket,agentDir)==="tui")return refusal("refuse",void 0,{reason:"unsupported_endpoint_kind",socket,endpoint_kind:"tui"});request.action==="open"&&(ensured=await ensureHost({socket,agentDir,hostArgs:request.spec.hostArgs,env:daemonEnvOverrides(process.env,request.spec.env),policy:request.spec.policy,upgrade:"never",stoppingTimeoutMs}),ensured.reused||await writeDaemonEnvKeys(createHostDaemonPaths({socket,agentDir}),daemonEnvKeys(process.env,request.spec.env))),client=new RpcClient({socketPath:socket,onDisconnect:error=>{connectionUnusable=!0,disconnected?.(error)}});try{await client.start()}catch(error){if(error instanceof Error&&"code"in error&&(error.code==="ENOENT"||error.code==="ECONNREFUSED"))return refusal("refuse",void 0,{reason:"host_unavailable",socket,detail:error.message});throw error}let sessionId,durableSessionId;if("ref"in request){let found=await resolveSessionRef(client,request.ref,agentDir);if(found.kind==="unknown")return refusal("refuse",void 0,{reason:"unknown_session",ref:request.ref,socket});if(found.kind==="ambiguous"){let detail={reason:"ambiguous_session",ref:request.ref,candidates:found.candidates,socket};return refusal("refuse",void 0,detail)}let reopen=found.kind==="parked"?{sessionPath:found.sessionPath,cwd:found.cwd,retain_on_disconnect:!0,attended:!1}:{sessionPath:found.row.sessionPath,cwd:found.row.cwd};durableSessionId=found.kind==="parked"?found.durableSessionId:found.row.durableSessionId,sessionId=(await client.openSession(reopen)).sessionId}switch(request.action){case"open":return await openHostSession(client,request,socket,ensured);case"prompt":return{exitCode:HOST_EXIT_OK,payload:{action:"prompt",sessionId,disposition:await client.prompt(request.text)}};case"steer":{let streaming=(await client.getState()).isStreaming,disposition=await client.steer(request.text);return{exitCode:HOST_EXIT_OK,payload:{action:"steer",sessionId,disposition,streaming}}}case"abort":{let aborted=(await client.getState()).isStreaming;return await client.abortStrict(),{exitCode:HOST_EXIT_OK,payload:{action:"abort",sessionId,acknowledged:!0,aborted}}}case"model":{await client.setModel(request.model.provider,request.model.id);let state=await client.getState();return{exitCode:HOST_EXIT_OK,payload:{action:"model",sessionId,requested:request.model,model:state.model?{provider:state.model.provider,id:state.model.id}:null,pendingModelSwitch:state.pendingModelSwitch??null}}}case"list":return{exitCode:HOST_EXIT_OK,payload:{action:"list",socket,sessions:await client.listSessions({observe:!0})}};case"state":return{exitCode:HOST_EXIT_OK,payload:{action:"state",sessionId,durableSessionId,state:await client.getState()}};case"read":{if(request.messages){let all=await client.getMessages(),messages=request.tail===void 0?all:all.slice(-request.tail);return{exitCode:HOST_EXIT_OK,payload:{action:"read",sessionId,messages,count:messages.length}}}let{entries,leafId}=await client.getEntries(request.since),slice=request.tail===void 0?entries:entries.slice(-request.tail);return{exitCode:HOST_EXIT_OK,payload:{action:"read",sessionId,entries:slice,count:slice.length,total:entries.length,leafId,nextSince:slice.at(-1)?.id??request.since??null,...request.since!==void 0&&{since:request.since}}}}case"wait":return await waitForHostSession(client,sessionId,request,handler=>{disconnected=handler});case"unload":{let answer=await client.unloadSession({sessionId,interrupt:request.interrupt,force:request.force,clearQueue:request.clearQueue,children:request.children});return{exitCode:answer.outcome==="unloaded"?HOST_EXIT_OK:HOST_EXIT_REFUSED,payload:{action:"unload",sessionId,...answer}}}case"close":{let reason,unsubscribe=client.onEvent(record=>{let event=record;event.type==="session_closed"&&(reason=event.reason)});try{await client.closeSession(sessionId);let remaining=(await client.listSessions()).find(row=>row.sessionId===sessionId);return{exitCode:HOST_EXIT_OK,payload:remaining?{action:"close",sessionId,closed:!1,attachments:remaining.attachments}:{action:"close",sessionId,closed:!0,reason:reason??"client_close"}}}finally{unsubscribe()}}default:return assertNever(request)}}catch(error){if((error instanceof RpcRequestTimeoutError||isTransportGoneError(error))&&(connectionUnusable=!0),request.action==="open"&&error instanceof RpcCommandError&&error.errorCode==="host_stopping")throw error;return error instanceof HostEnsureRefusedError?refusal("refuse",void 0,{reason:error.reason,socket,detail:error.detail}):mapError(error,socket)}finally{ensured?.release(),client&&!connectionUnusable&&await detachBeforeClose(client,line=>process.stderr.write(`senpi host session: ${line}
|
|
3
3
|
`)),await client?.stop()}}function assertNever(value){throw new Error(`unreachable host session request: ${JSON.stringify(value)}`)}var USAGE=`usage: ${APP_NAME} host session <command> [--socket <path>] [--rpc-key-root <dir>] [--json]
|
|
4
4
|
|
|
5
5
|
open --cwd <dir> [--model <provider/id>] [--name <text>] [--prompt <text|@file>] [--launch-spec <file>]
|
package/dist/bundle/chunks/{host-socket-request-DMYXC56U.js → host-socket-request-QN4Q2P5E.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
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{PROBE_REQUEST_ID,connectAndAsk,isRecord,readAnswer,requestOnSocket}from"./chunk-
|
|
2
|
+
import{PROBE_REQUEST_ID,connectAndAsk,isRecord,readAnswer,requestOnSocket}from"./chunk-4JMGWVRH.js";import"./chunk-E5O4SP5I.js";import"./chunk-VUY4BZDI.js";import"./chunk-SF4MQDKZ.js";import"./chunk-RUGTHELO.js";import"./chunk-HW6AAS3R.js";import"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-O5RYI3IW.js";import"./chunk-IKOFCODM.js";export{PROBE_REQUEST_ID,connectAndAsk,isRecord,readAnswer,requestOnSocket};
|
|
@@ -1,2 +1,2 @@
|
|
|
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{InteractiveMode,OptimisticUserEchoController,formatCrashExtensionHint,formatResumeCommand,isApiKeyLoginProvider,replayStartupSubmission,shouldShowRetryIndicator,showsStartupDetails,showsStartupHeader}from"./chunk-
|
|
2
|
+
import{InteractiveMode,OptimisticUserEchoController,formatCrashExtensionHint,formatResumeCommand,isApiKeyLoginProvider,replayStartupSubmission,shouldShowRetryIndicator,showsStartupDetails,showsStartupHeader}from"./chunk-YCPURLPU.js";import"./chunk-XH24X5B2.js";import"./chunk-74IB3JPP.js";import"./chunk-QATU6BBC.js";import"./chunk-3IYEGHBI.js";import"./chunk-RYPM5BZQ.js";import"./chunk-NLYT7BND.js";import"./chunk-TUEZNIBK.js";import"./chunk-FEQDJBDL.js";import"./chunk-XI6THO4F.js";import"./chunk-UOZDDYBN.js";import"./chunk-J2I56WLK.js";import"./chunk-GTJJ73DE.js";import"./chunk-VD7AKTGP.js";import{createInteractiveTui,createInteractiveTuiReference}from"./chunk-7MN7YNO5.js";import"./chunk-M2VJVJMK.js";import"./chunk-TQHNFP77.js";import"./chunk-ZUQCYIRY.js";import"./chunk-HKCFMDJN.js";import"./chunk-3Q5ZENSD.js";import"./chunk-3QPE75AR.js";import"./chunk-4GKU755E.js";import"./chunk-Y3TMJV3J.js";import"./chunk-O3FG6HML.js";import"./chunk-MOVB6H22.js";import"./chunk-DLPV4B3R.js";import"./chunk-VPVD5G32.js";import"./chunk-H4QOEVS5.js";import"./chunk-SOMFLLPD.js";import"./chunk-MTQQ2VQH.js";import"./chunk-OF3XVGG4.js";import"./chunk-Q4G5DECT.js";import"./chunk-QMRJYMNH.js";import"./chunk-DZQA5LVN.js";import"./chunk-IEY2SL46.js";import"./chunk-26UBFF6N.js";import"./chunk-4JMGWVRH.js";import"./chunk-E5O4SP5I.js";import"./chunk-DX43FSQT.js";import"./chunk-7WYJAYHH.js";import"./chunk-47T6YMI2.js";import"./chunk-R2Z7CX77.js";import"./chunk-UCXBDE6R.js";import"./chunk-YI6KRJDC.js";import"./chunk-VUY4BZDI.js";import"./chunk-SF4MQDKZ.js";import"./chunk-EJB5E2JK.js";import"./chunk-RCHIMH7N.js";import"./chunk-GILDYS3O.js";import"./chunk-KLAX467B.js";import"./chunk-C4AHHZ6P.js";import"./chunk-J7FW7MED.js";import"./chunk-2EJ4BGBM.js";import"./chunk-GZVCRV7I.js";import"./chunk-KUPQO7MC.js";import"./chunk-U3VOXCGP.js";import"./chunk-7X72IACK.js";import"./chunk-MSDBBOB2.js";import"./chunk-WHQ2QPP5.js";import"./chunk-J2NGJKXL.js";import"./chunk-WB4BUHOH.js";import"./chunk-NJ43NBSP.js";import"./chunk-KDUJCDLM.js";import"./chunk-6APXZK7W.js";import"./chunk-YU2P3CAR.js";import"./chunk-2IKL4F24.js";import"./chunk-KJR3XXMI.js";import"./chunk-IYL5E4QQ.js";import"./chunk-7THM57HH.js";import"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import"./chunk-2U6HXWXS.js";import"./chunk-TMXRR3N7.js";import"./chunk-LPYBKMPT.js";import"./chunk-33MZJTQ3.js";import"./chunk-V5FSENW6.js";import"./chunk-R7J5TEYK.js";import"./chunk-BPNSOZ2C.js";import"./chunk-DLAY7CIU.js";import"./chunk-WXYMAUFX.js";import"./chunk-WOHQJ6JB.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-XH2MWTXA.js";import"./chunk-GVSBCJFI.js";import"./chunk-QTS2XGPQ.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-BMX2U22F.js";import"./chunk-GLTOBXZY.js";import"./chunk-IKJCA5SH.js";import"./chunk-ZOFZRJSL.js";import"./chunk-ZFIC2DZV.js";import"./chunk-2SOVDETB.js";import"./chunk-E266ORGA.js";import"./chunk-T2SMQPRE.js";import"./chunk-RUGTHELO.js";import"./chunk-42XRJQM6.js";import"./chunk-IHES3JES.js";import"./chunk-5XHOHZIR.js";import"./chunk-HW6AAS3R.js";import"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-EYSV6A7S.js";import"./chunk-MIENF2YK.js";import"./chunk-OXNWERO4.js";import"./chunk-44BJPS5I.js";import"./chunk-AOTHPTMU.js";import"./chunk-O5RYI3IW.js";import"./chunk-RFFMEA4B.js";import"./chunk-IKOFCODM.js";export{InteractiveMode,OptimisticUserEchoController,createInteractiveTui,createInteractiveTuiReference,formatCrashExtensionHint,formatResumeCommand,isApiKeyLoginProvider,replayStartupSubmission,shouldShowRetryIndicator,showsStartupDetails,showsStartupHeader};
|
|
@@ -1,2 +1,2 @@
|
|
|
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{applyGrokNeoThemeFallback,collectAuthDiagnostics,collectExtensionLoadDiagnostics,createCliRuntimeFactory,createSessionManager,interactiveAuthNotices,main,promptConfirm,resolveAutoTitleSessions}from"./chunk-
|
|
2
|
+
import{applyGrokNeoThemeFallback,collectAuthDiagnostics,collectExtensionLoadDiagnostics,createCliRuntimeFactory,createSessionManager,interactiveAuthNotices,main,promptConfirm,resolveAutoTitleSessions}from"./chunk-YCPURLPU.js";import"./chunk-XH24X5B2.js";import"./chunk-74IB3JPP.js";import"./chunk-QATU6BBC.js";import"./chunk-3IYEGHBI.js";import"./chunk-RYPM5BZQ.js";import"./chunk-NLYT7BND.js";import"./chunk-TUEZNIBK.js";import"./chunk-FEQDJBDL.js";import"./chunk-XI6THO4F.js";import"./chunk-UOZDDYBN.js";import"./chunk-J2I56WLK.js";import"./chunk-GTJJ73DE.js";import"./chunk-VD7AKTGP.js";import"./chunk-7MN7YNO5.js";import"./chunk-M2VJVJMK.js";import"./chunk-TQHNFP77.js";import"./chunk-ZUQCYIRY.js";import"./chunk-HKCFMDJN.js";import"./chunk-3Q5ZENSD.js";import"./chunk-3QPE75AR.js";import"./chunk-4GKU755E.js";import"./chunk-Y3TMJV3J.js";import"./chunk-O3FG6HML.js";import"./chunk-MOVB6H22.js";import"./chunk-DLPV4B3R.js";import"./chunk-VPVD5G32.js";import"./chunk-H4QOEVS5.js";import"./chunk-SOMFLLPD.js";import"./chunk-MTQQ2VQH.js";import"./chunk-OF3XVGG4.js";import"./chunk-Q4G5DECT.js";import"./chunk-QMRJYMNH.js";import"./chunk-DZQA5LVN.js";import"./chunk-IEY2SL46.js";import"./chunk-26UBFF6N.js";import"./chunk-4JMGWVRH.js";import"./chunk-E5O4SP5I.js";import"./chunk-DX43FSQT.js";import"./chunk-7WYJAYHH.js";import"./chunk-47T6YMI2.js";import"./chunk-R2Z7CX77.js";import"./chunk-UCXBDE6R.js";import"./chunk-YI6KRJDC.js";import"./chunk-VUY4BZDI.js";import"./chunk-SF4MQDKZ.js";import"./chunk-EJB5E2JK.js";import"./chunk-RCHIMH7N.js";import"./chunk-GILDYS3O.js";import"./chunk-KLAX467B.js";import"./chunk-C4AHHZ6P.js";import"./chunk-J7FW7MED.js";import"./chunk-2EJ4BGBM.js";import"./chunk-GZVCRV7I.js";import"./chunk-KUPQO7MC.js";import"./chunk-U3VOXCGP.js";import"./chunk-7X72IACK.js";import"./chunk-MSDBBOB2.js";import"./chunk-WHQ2QPP5.js";import"./chunk-J2NGJKXL.js";import"./chunk-WB4BUHOH.js";import"./chunk-NJ43NBSP.js";import"./chunk-KDUJCDLM.js";import"./chunk-6APXZK7W.js";import"./chunk-YU2P3CAR.js";import"./chunk-2IKL4F24.js";import"./chunk-KJR3XXMI.js";import"./chunk-IYL5E4QQ.js";import"./chunk-7THM57HH.js";import"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import"./chunk-2U6HXWXS.js";import"./chunk-TMXRR3N7.js";import"./chunk-LPYBKMPT.js";import"./chunk-33MZJTQ3.js";import"./chunk-V5FSENW6.js";import"./chunk-R7J5TEYK.js";import"./chunk-BPNSOZ2C.js";import"./chunk-DLAY7CIU.js";import"./chunk-WXYMAUFX.js";import"./chunk-WOHQJ6JB.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-XH2MWTXA.js";import"./chunk-GVSBCJFI.js";import"./chunk-QTS2XGPQ.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-BMX2U22F.js";import"./chunk-GLTOBXZY.js";import"./chunk-IKJCA5SH.js";import"./chunk-ZOFZRJSL.js";import"./chunk-ZFIC2DZV.js";import"./chunk-2SOVDETB.js";import"./chunk-E266ORGA.js";import"./chunk-T2SMQPRE.js";import"./chunk-RUGTHELO.js";import"./chunk-42XRJQM6.js";import"./chunk-IHES3JES.js";import"./chunk-5XHOHZIR.js";import"./chunk-HW6AAS3R.js";import"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-EYSV6A7S.js";import"./chunk-MIENF2YK.js";import"./chunk-OXNWERO4.js";import"./chunk-44BJPS5I.js";import"./chunk-AOTHPTMU.js";import"./chunk-O5RYI3IW.js";import"./chunk-RFFMEA4B.js";import"./chunk-IKOFCODM.js";export{applyGrokNeoThemeFallback,collectAuthDiagnostics,collectExtensionLoadDiagnostics,createCliRuntimeFactory,createSessionManager,interactiveAuthNotices,main,promptConfirm,resolveAutoTitleSessions};
|