acpx 0.16.0 → 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +2 -0
  2. package/dist/{agent-registry-DU6mhZBL.js → agent-registry-evUoJINz.js} +5 -1
  3. package/dist/agent-registry-evUoJINz.js.map +1 -0
  4. package/dist/agent-registry.d.ts.map +1 -1
  5. package/dist/agent-registry.js +1 -1
  6. package/dist/{cli-BkYIxj_N.js → cli-B2ycKzaO.js} +5 -4
  7. package/dist/{cli-BkYIxj_N.js.map → cli-B2ycKzaO.js.map} +1 -1
  8. package/dist/cli.d.ts +1 -1
  9. package/dist/cli.js +34 -27
  10. package/dist/cli.js.map +1 -1
  11. package/dist/{client-5levcBIs.d.ts → client-CkbBoSGd.d.ts} +17 -7
  12. package/dist/client-CkbBoSGd.d.ts.map +1 -0
  13. package/dist/{flows-Bxs4udrs.js → flows-xGyhmoHO.js} +7 -6
  14. package/dist/{flows-Bxs4udrs.js.map → flows-xGyhmoHO.js.map} +1 -1
  15. package/dist/flows.d.ts +2 -2
  16. package/dist/flows.js +1 -1
  17. package/dist/{invocation-options-BY4lxkn3.js → invocation-options-eZEBh4vd.js} +5 -4
  18. package/dist/{invocation-options-BY4lxkn3.js.map → invocation-options-eZEBh4vd.js.map} +1 -1
  19. package/dist/ipc-D2rstexT.js +3350 -0
  20. package/dist/ipc-D2rstexT.js.map +1 -0
  21. package/dist/output-D2xL6wdp.js +980 -0
  22. package/dist/output-D2xL6wdp.js.map +1 -0
  23. package/dist/{live-checkpoint-BEfxBKCh.js → queue-owner-runtime-Dgv3e2Tp.js} +3104 -1878
  24. package/dist/queue-owner-runtime-Dgv3e2Tp.js.map +1 -0
  25. package/dist/runtime.d.ts +187 -46
  26. package/dist/runtime.d.ts.map +1 -1
  27. package/dist/runtime.js +416 -93
  28. package/dist/runtime.js.map +1 -1
  29. package/dist/{session-options-t3d-F4dn.d.ts → session-options-Dp6mzNSy.d.ts} +2 -2
  30. package/dist/{session-options-t3d-F4dn.d.ts.map → session-options-Dp6mzNSy.d.ts.map} +1 -1
  31. package/dist/session-watch-CTe9Bnbc.js +76 -0
  32. package/dist/session-watch-CTe9Bnbc.js.map +1 -0
  33. package/dist/watch-DxuXEc8n.js +32 -0
  34. package/dist/watch-DxuXEc8n.js.map +1 -0
  35. package/package.json +3 -3
  36. package/skills/acpx/SKILL.md +6 -2
  37. package/dist/agent-registry-DU6mhZBL.js.map +0 -1
  38. package/dist/client-5levcBIs.d.ts.map +0 -1
  39. package/dist/live-checkpoint-BEfxBKCh.js.map +0 -1
  40. package/dist/output-uo5a27KB.js +0 -4711
  41. package/dist/output-uo5a27KB.js.map +0 -1
package/README.md CHANGED
@@ -87,6 +87,8 @@ Permission modes range from read approval to explicit deny or approve-all polici
87
87
 
88
88
  For multi-step work, `acpx flow run` executes TypeScript workflows that combine ACP turns with deterministic actions, decisions, computation, and checkpoints. The package also exports `acpx/runtime` and `acpx/flows` for applications that need session and workflow primitives without shelling out.
89
89
 
90
+ Use [`createSharedAcpRuntime()`](docs/shared-sessions.md) when an application and CLI processes need to share one local session owner.
91
+
90
92
  Start with the [flows guide](docs/flows.md), then use the [examples](examples/flows/README.md) and [architecture notes](docs/2026-03-25-acpx-flows-architecture.md) for deeper integrations.
91
93
 
92
94
  ## Documentation
@@ -417,6 +417,10 @@ const AGENT_DEFINITIONS = {
417
417
  "--stdio"
418
418
  ]
419
419
  },
420
+ antigravity: {
421
+ name: "Google Antigravity",
422
+ argv: process.platform === "win32" ? ["agy_acp_server.exe"] : ["agy_acp_server.par", ...process.platform === "linux" ? ["--uid="] : []]
423
+ },
420
424
  devin: {
421
425
  name: "Devin",
422
426
  argv: ["devin", "acp"]
@@ -782,4 +786,4 @@ function normalizeRegistryOverride(value) {
782
786
  //#endregion
783
787
  export { resolveAgentCommandParts as A, asAbsoluteCwd as C, normalizeAgentCommandInput as D, isoNow as E, waitForSpawn as F, runTimedExecFile as M, splitCommandLine as N, renderArgvIdentity as O, waitForChildExit as P, PROCESS_HELPER_TIMEOUT_MS as S, isChildProcessRunning as T, buildSpawnCommandOptions as _, createAgentRegistry as a, readWindowsEnvValue as b, mergeAgentRegistry as c, resolveAgentCommand as d, resolveBuiltInAgentLaunch as f, buildAgentSpawnCommand as g, resolvePackageExecBuiltInAgentLaunch as h, DEFAULT_AGENT_NAME as i, resolveAgentSessionCwd as j, requireAgentStdio as k, normalizeAgentName as l, resolveInstalledBuiltInAgentLaunch as m, AGENT_REGISTRY as n, findBuiltInAgentPackage as o, resolveCanonicalAgentName as p, BUILT_IN_AGENT_PACKAGES as r, listBuiltInAgents as s, AGENT_ARGV_REGISTRY as t, resolveAgentArgv as u, buildTerminalShellSpawnCommand as v, basenameToken as w, resolveWindowsExecutablePath as x, buildTerminalSpawnCommand as y };
784
788
 
785
- //# sourceMappingURL=agent-registry-DU6mhZBL.js.map
789
+ //# sourceMappingURL=agent-registry-evUoJINz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-registry-evUoJINz.js","names":[],"sources":["../src/acp/client-process.ts","../src/spawn-command-options.ts","../src/agent-registry.ts"],"sourcesContent":["import { execFile, type ChildProcess, type ChildProcessByStdio } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { Readable, Writable } from \"node:stream\";\n\nexport const PROCESS_HELPER_TIMEOUT_MS = 8_000;\nexport const PROCESS_HELPER_MAX_BUFFER_BYTES = 32 * 1024 * 1024;\n\nexport async function runTimedExecFile(\n command: string,\n args: readonly string[],\n options: {\n timeoutMs?: number;\n maxBufferBytes?: number;\n windowsHide?: boolean;\n } = {},\n): Promise<string> {\n const timeoutMs = Math.max(1, Math.round(options.timeoutMs ?? PROCESS_HELPER_TIMEOUT_MS));\n return await new Promise<string>((resolve, reject) => {\n let settled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const child = execFile(\n command,\n [...args],\n {\n encoding: \"utf8\",\n maxBuffer: options.maxBufferBytes ?? PROCESS_HELPER_MAX_BUFFER_BYTES,\n killSignal: \"SIGKILL\",\n windowsHide: options.windowsHide,\n },\n (error, stdout) => {\n if (settled) {\n return;\n }\n settled = true;\n if (timer) {\n clearTimeout(timer);\n }\n if (error) {\n reject(error);\n return;\n }\n resolve(stdout);\n },\n );\n\n timer = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n const killed = child.kill(\"SIGKILL\");\n child.stdout?.destroy();\n child.stderr?.destroy();\n child.unref();\n reject(\n Object.assign(new Error(`${command} timed out after ${timeoutMs}ms`), {\n code: \"ETIMEDOUT\",\n killed,\n signal: \"SIGKILL\" as const,\n }),\n );\n }, timeoutMs);\n });\n}\n\nexport type CommandParts = {\n command: string;\n args: string[];\n};\n\nexport function normalizeAgentCommandInput(value: string | readonly string[]): {\n agentCommand: string;\n agentArgv?: string[];\n} {\n if (typeof value === \"string\") {\n return { agentCommand: value };\n }\n const parts = toCommandParts([...value]);\n const argv = [parts.command, ...parts.args];\n return {\n agentCommand: renderArgvIdentity(argv),\n agentArgv: argv,\n };\n}\n\nconst IDENTITY_SAFE_ARG_RE = /^[A-Za-z0-9_@%+=:,./^~-]+$/u;\n\nexport function renderArgvIdentity(argv: readonly string[]): string {\n return argv.map((arg) => (IDENTITY_SAFE_ARG_RE.test(arg) ? arg : JSON.stringify(arg))).join(\" \");\n}\n\ntype ResolveSessionCwdOptions = {\n platform?: NodeJS.Platform;\n existsSync?: (filePath: string) => boolean;\n runWslpath?: (cwd: string) => Promise<string>;\n};\n\nexport function isoNow(): string {\n return new Date().toISOString();\n}\n\nexport function waitForSpawn(child: ChildProcess): Promise<void> {\n return new Promise((resolve, reject) => {\n const onSpawn = () => {\n child.off(\"error\", onError);\n resolve();\n };\n const onError = (error: Error) => {\n child.off(\"spawn\", onSpawn);\n reject(error);\n };\n\n child.once(\"spawn\", onSpawn);\n child.once(\"error\", onError);\n });\n}\n\nexport function isChildProcessRunning(child: ChildProcess): boolean {\n return child.exitCode == null && child.signalCode == null;\n}\n\nexport function requireAgentStdio(\n child: ChildProcess,\n): ChildProcessByStdio<Writable, Readable, Readable> {\n if (!child.stdin || !child.stdout || !child.stderr) {\n throw new Error(\"ACP agent must be spawned with piped stdin/stdout/stderr\");\n }\n return child as ChildProcessByStdio<Writable, Readable, Readable>;\n}\n\nexport function waitForChildExit(\n child: ChildProcessByStdio<Writable, Readable, Readable>,\n timeoutMs: number,\n): Promise<boolean> {\n if (!isChildProcessRunning(child)) {\n return Promise.resolve(true);\n }\n\n return new Promise<boolean>((resolve) => {\n let settled = false;\n const timer = setTimeout(\n () => {\n finish(false);\n },\n Math.max(0, timeoutMs),\n );\n\n const finish = (value: boolean) => {\n if (settled) {\n return;\n }\n settled = true;\n child.off(\"close\", onExitLike);\n child.off(\"exit\", onExitLike);\n clearTimeout(timer);\n resolve(value);\n };\n\n const onExitLike = () => {\n finish(true);\n };\n\n child.once(\"close\", onExitLike);\n child.once(\"exit\", onExitLike);\n });\n}\n\nexport function resolveAgentCommandParts(\n value: string,\n argv: readonly string[] | undefined,\n platform: NodeJS.Platform = process.platform,\n): CommandParts {\n if (argv) {\n const parts = toCommandParts([...argv]);\n assertWindowsLaunchableCommand(parts.command, platform);\n return parts;\n }\n if (platform === \"win32\") {\n throw new Error(\n 'Raw agent command strings are not supported on Windows. Configure the agent with an argv array, for example: \"argv\": [\"agent.exe\", \"--acp\"]. Legacy agents.<name>.args arrays are migrated automatically. Existing sessions without saved argv must be closed and recreated.',\n );\n }\n return splitCommandLine(value);\n}\n\nfunction assertWindowsLaunchableCommand(command: string, platform: NodeJS.Platform): void {\n if (platform === \"win32\" && path.extname(command).toLowerCase() === \".sh\") {\n throw new Error(\n `Windows cannot launch shell script executable \"${command}\" directly. Configure an explicit interpreter argv, for example: \"argv\": [\"bash\", \"${command}\"]. acpx does not infer interpreters.`,\n );\n }\n}\n\ntype CommandLineState = {\n current: string;\n quote: \"'\" | '\"' | null;\n escaping: boolean;\n parts: string[];\n hasPart: boolean;\n};\n\nexport function splitCommandLine(value: string): CommandParts {\n const state: CommandLineState = {\n current: \"\",\n quote: null,\n escaping: false,\n parts: [],\n hasPart: false,\n };\n for (const ch of value) {\n readCommandLineChar(state, ch);\n }\n\n if (state.escaping) {\n state.current += \"\\\\\";\n state.hasPart = true;\n }\n if (state.quote) {\n throw new Error(\"Invalid --agent command: unterminated quote\");\n }\n flushCommandLinePart(state);\n return toCommandParts(state.parts);\n}\n\nfunction toCommandParts(parts: string[]): CommandParts {\n if (parts.length === 0 || parts[0] === \"\") {\n throw new Error(\"Invalid --agent command: empty command\");\n }\n return {\n command: parts[0],\n args: parts.slice(1),\n };\n}\n\nfunction readCommandLineChar(state: CommandLineState, ch: string): void {\n if (state.escaping) {\n state.current += ch;\n state.escaping = false;\n state.hasPart = true;\n } else if (ch === \"\\\\\" && state.quote !== \"'\") {\n state.escaping = true;\n } else if (state.quote) {\n if (ch === state.quote) {\n state.quote = null;\n } else {\n state.current += ch;\n }\n state.hasPart = true;\n } else {\n readUnquotedCommandLineChar(state, ch);\n }\n}\n\nfunction readUnquotedCommandLineChar(state: CommandLineState, ch: string): void {\n if (ch === \"'\" || ch === '\"') {\n state.quote = ch;\n state.hasPart = true;\n } else if (/\\s/.test(ch)) {\n flushCommandLinePart(state);\n } else {\n state.current += ch;\n state.hasPart = true;\n }\n}\n\nfunction flushCommandLinePart(state: CommandLineState): void {\n if (state.hasPart) {\n state.parts.push(state.current);\n state.current = \"\";\n state.hasPart = false;\n }\n}\n\nexport function asAbsoluteCwd(cwd: string): string {\n return path.resolve(cwd);\n}\n\nexport async function resolveAgentSessionCwd(\n cwd: string,\n agentCommand: string,\n options: ResolveSessionCwdOptions = {},\n): Promise<string> {\n const resolved = asAbsoluteCwd(cwd);\n if (!shouldTranslateWslWindowsCwd(agentCommand, options)) {\n return resolved;\n }\n\n const translated = (await (options.runWslpath ?? runWslpath)(resolved)).trim();\n if (!translated) {\n throw new Error(`wslpath returned an empty Windows path for cwd: ${resolved}`);\n }\n return translated;\n}\n\nfunction shouldTranslateWslWindowsCwd(\n agentCommand: string,\n options: ResolveSessionCwdOptions,\n): boolean {\n if (!isWsl(options)) {\n return false;\n }\n\n try {\n const { command } = splitCommandLine(agentCommand);\n return isWindowsExecutableCommand(command);\n } catch {\n return false;\n }\n}\n\nfunction isWsl(options: ResolveSessionCwdOptions): boolean {\n const platform = options.platform ?? process.platform;\n if (platform !== \"linux\") {\n return false;\n }\n\n const existsSync = options.existsSync ?? fs.existsSync;\n return existsSync(\"/proc/sys/fs/binfmt_misc/WSLInterop\");\n}\n\nconst WINDOWS_EXECUTABLE_EXTENSION_RE = /\\.(?:exe|cmd|bat)$/u;\n\nfunction isWindowsExecutableCommand(command: string): boolean {\n const normalized = command.toLowerCase();\n return WINDOWS_EXECUTABLE_EXTENSION_RE.test(normalized);\n}\n\nasync function runWslpath(cwd: string): Promise<string> {\n return await runTimedExecFile(\"wslpath\", [\"-w\", cwd]);\n}\n\nexport function basenameToken(value: string): string {\n return path\n .basename(value)\n .toLowerCase()\n .replace(/\\.(cmd|exe|bat)$/u, \"\");\n}\n","import { spawn } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport function readWindowsEnvValue(env: NodeJS.ProcessEnv, key: string): string | undefined {\n const matchedKey = Object.keys(env).find((entry) => entry.toUpperCase() === key);\n return matchedKey ? env[matchedKey] : undefined;\n}\n\nfunction windowsExecutableExtensions(env: NodeJS.ProcessEnv): string[] {\n return (readWindowsEnvValue(env, \"PATHEXT\") ?? \".COM;.EXE;.BAT;.CMD\")\n .split(\";\")\n .map((value) => value.trim().toLowerCase())\n .filter((value) => value.length > 0);\n}\n\nfunction commandCandidates(command: string, env: NodeJS.ProcessEnv): string[] {\n const commandExtension = path.extname(command);\n if (commandExtension.length > 0) {\n return [command];\n }\n return windowsExecutableExtensions(env).map((extension) => `${command}${extension}`);\n}\n\nfunction commandHasPath(command: string): boolean {\n return command.includes(\"/\") || command.includes(\"\\\\\") || path.isAbsolute(command);\n}\n\nfunction resolveWindowsPathCommand(command: string, env: NodeJS.ProcessEnv): string | undefined {\n const candidates = commandCandidates(command, env);\n const pathValue = readWindowsEnvValue(env, \"PATH\");\n if (!pathValue) {\n return undefined;\n }\n\n for (const directory of pathValue.split(\";\")) {\n const resolved = findExistingCommandInDirectory(directory, candidates);\n if (resolved) {\n return resolved;\n }\n }\n\n return undefined;\n}\n\nfunction findExistingCommandInDirectory(\n directory: string,\n candidates: string[],\n): string | undefined {\n const trimmedDirectory = directory.trim();\n if (trimmedDirectory.length === 0) {\n return undefined;\n }\n\n return candidates\n .map((candidate) => path.join(trimmedDirectory, candidate))\n .find((resolved) => fs.existsSync(resolved));\n}\n\nfunction resolveWindowsWrapperToken(token: string, wrapperPath: string): string | undefined {\n const relative = token.match(/%~?dp0%?\\s*[\\\\/]*(.*)$/i)?.[1]?.trim();\n if (!relative) {\n return undefined;\n }\n const candidate = path.resolve(\n path.dirname(wrapperPath),\n relative.replace(/[\\\\/]+/g, path.sep).replace(/^[\\\\/]+/, \"\"),\n );\n return path.extname(candidate).toLowerCase() === \".exe\" && fs.existsSync(candidate)\n ? candidate\n : undefined;\n}\n\nfunction resolveWindowsWrapperExecutable(wrapperPath: string): string | undefined {\n if (!fs.existsSync(wrapperPath)) {\n return undefined;\n }\n\n try {\n const content = fs.readFileSync(wrapperPath, \"utf8\");\n return [...content.matchAll(/\"([^\"\\r\\n]*)\"/g)]\n .map((match) => resolveWindowsWrapperToken(match[1] ?? \"\", wrapperPath))\n .find((candidate): candidate is string => candidate !== undefined);\n } catch {\n // Ignore unreadable wrapper scripts and let callers use their fallback.\n return undefined;\n }\n}\n\nexport function resolveWindowsCommand(\n command: string,\n env: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n const candidates = commandCandidates(command, env);\n\n if (commandHasPath(command)) {\n return candidates.find((candidate) => fs.existsSync(candidate));\n }\n\n return resolveWindowsPathCommand(command, env);\n}\n\n/**\n * Resolve a Windows command to a native executable suitable for direct spawn.\n *\n * Batch and PowerShell shims are intentionally rejected unless they point at a\n * real `.exe` entrypoint. Callers that need shell execution should use the\n * command-specific shell policy instead.\n */\nexport function resolveWindowsExecutablePath(\n command: string,\n env: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n const resolved = resolveWindowsCommand(command, env);\n if (!resolved) {\n return undefined;\n }\n\n const absolute = path.resolve(resolved);\n const extension = path.extname(absolute).toLowerCase();\n if (extension === \".exe\") {\n return absolute;\n }\n if (extension !== \".cmd\" && extension !== \".bat\" && extension !== \".ps1\") {\n return undefined;\n }\n\n const siblingExecutable = `${absolute.slice(0, -extension.length)}.exe`;\n return fs.existsSync(siblingExecutable)\n ? siblingExecutable\n : resolveWindowsWrapperExecutable(absolute);\n}\n\nfunction shouldUseWindowsBatchShell(\n command: string,\n platform: NodeJS.Platform = process.platform,\n env: NodeJS.ProcessEnv = process.env,\n): boolean {\n if (platform !== \"win32\") {\n return false;\n }\n const resolvedCommand = resolveWindowsCommand(command, env) ?? command;\n const ext = path.extname(resolvedCommand).toLowerCase();\n return ext === \".cmd\" || ext === \".bat\";\n}\n\nexport type AgentSpawnCommand = {\n command: string;\n args: string[];\n windowsVerbatimArguments?: boolean;\n};\n\nconst CMD_META_CHAR_RE = /([()\\][%!^\"`<>&|;, *?])/gu;\nconst CMD_BACKSLASH_QUOTE_RE = /(?=(\\\\+?)?)\\1\"/gu;\nconst CMD_TRAILING_BACKSLASH_RE = /(?=(\\\\+?)?)\\1$/gu;\nconst CMD_SHIM_RE = /node_modules[\\\\/].bin[\\\\/][^\\\\/]+\\.cmd$/iu;\n\nfunction escapeCmdCommand(value: string): string {\n return value.replace(CMD_META_CHAR_RE, \"^$1\");\n}\n\nfunction escapeCmdArgument(value: string, doubleEscapeMeta: boolean): string {\n const quoted = `\"${value\n .replace(CMD_BACKSLASH_QUOTE_RE, '$1$1\\\\\"')\n .replace(CMD_TRAILING_BACKSLASH_RE, \"$1$1\")}\"`;\n const escaped = quoted.replace(CMD_META_CHAR_RE, \"^$1\");\n return doubleEscapeMeta ? escaped.replace(CMD_META_CHAR_RE, \"^$1\") : escaped;\n}\n\nexport function buildAgentSpawnCommand(\n command: string,\n args: readonly string[],\n platform: NodeJS.Platform = process.platform,\n env: NodeJS.ProcessEnv = process.env,\n): AgentSpawnCommand {\n if (!shouldUseWindowsBatchShell(command, platform, env)) {\n return { command, args: [...args] };\n }\n const resolvedCommand = path.win32.normalize(resolveWindowsCommand(command, env) ?? command);\n const doubleEscapeMeta = CMD_SHIM_RE.test(resolvedCommand);\n const shellCommand = [\n escapeCmdCommand(resolvedCommand),\n ...args.map((arg) => escapeCmdArgument(arg, doubleEscapeMeta)),\n ].join(\" \");\n return {\n command: readWindowsEnvValue(env, \"COMSPEC\") ?? \"cmd.exe\",\n args: [\"/d\", \"/s\", \"/c\", `\"${shellCommand}\"`],\n windowsVerbatimArguments: true,\n };\n}\n\nexport function buildSpawnCommandOptions(\n command: string,\n options: Parameters<typeof spawn>[2],\n platform: NodeJS.Platform = process.platform,\n env: NodeJS.ProcessEnv = process.env,\n): Parameters<typeof spawn>[2] {\n if (!shouldUseWindowsBatchShell(command, platform, env)) {\n return options;\n }\n return {\n ...options,\n shell: true,\n };\n}\n\nexport type TerminalSpawnCommand = {\n command: string;\n args: string[];\n killProcessGroup: boolean;\n};\n\nexport function buildTerminalSpawnCommand(\n command: string,\n args: string[] | undefined,\n): TerminalSpawnCommand {\n return { command, args: args ?? [], killProcessGroup: false };\n}\n\nexport function buildTerminalShellSpawnCommand(\n command: string,\n platform: NodeJS.Platform = process.platform,\n): TerminalSpawnCommand {\n if (platform === \"win32\") {\n return { command: \"cmd.exe\", args: [\"/d\", \"/s\", \"/c\", command], killProcessGroup: true };\n }\n return { command: \"/bin/sh\", args: [\"-c\", command], killProcessGroup: true };\n}\n\n/** Finds an installed entrypoint without executing it. */\nexport function resolveInstalledExecutable(command: string): string | undefined {\n if (process.platform === \"win32\") {\n const resolved = resolveWindowsCommand(command);\n return resolved && fs.statSync(resolved, { throwIfNoEntry: false })?.isFile()\n ? path.resolve(resolved)\n : undefined;\n }\n const candidates = command.includes(\"/\")\n ? [path.resolve(command)]\n : (process.env.PATH ?? \"\")\n .split(path.delimiter)\n .map((directory) => path.resolve(directory, command));\n return candidates.find((candidate) => {\n try {\n fs.accessSync(candidate, fs.constants.X_OK);\n return fs.statSync(candidate).isFile();\n } catch {\n return false;\n }\n });\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { splitCommandLine } from \"./acp/client-process.js\";\nimport { resolveInstalledExecutable } from \"./spawn-command-options.js\";\n\nconst ACP_ADAPTER_PACKAGE_RANGES = {\n pi: \"^0.0.33\",\n codex: \"^1.1.5\",\n claude: \"^0.76.0\",\n mux: \"^0.28.0\",\n} as const;\n\ntype BuiltInAgentPackageSpec = {\n packageName: string;\n packageRange: string;\n preferredBinName: string;\n fallbackCommand: string;\n legacyFallbackCommands?: string[];\n};\n\ntype BuiltInAgentLaunch = {\n source: \"installed\" | \"package-exec\";\n command: string;\n args: string[];\n packageName: string;\n packageRange: string;\n packageVersion?: string;\n binPath?: string;\n npmCliPath?: string;\n};\n\ntype BuiltInLaunchResolverOptions = {\n existsSync?: (path: string) => boolean;\n readFileSync?: typeof fs.readFileSync;\n resolvePackageRoot?: (packageName: string) => string | undefined;\n execPath?: string;\n resolveNpmCliPath?: (execPath: string) => string;\n};\n\ntype AgentDefinition = {\n name: string;\n argv: string[];\n installedArgv?: string[];\n requiredCommands?: string[];\n package?: Omit<BuiltInAgentPackageSpec, \"fallbackCommand\">;\n packageExecFallback?: boolean;\n};\n\nconst AGENT_DEFINITIONS: Record<string, AgentDefinition> = {\n pi: {\n name: \"Pi\",\n argv: [\"npx\", `pi-acp@${ACP_ADAPTER_PACKAGE_RANGES.pi}`],\n installedArgv: [\"pi-acp\"],\n requiredCommands: [\"pi\"],\n package: {\n packageName: \"pi-acp\",\n packageRange: ACP_ADAPTER_PACKAGE_RANGES.pi,\n preferredBinName: \"pi-acp\",\n },\n },\n openclaw: { name: \"OpenClaw\", argv: [\"openclaw\", \"acp\"] },\n codex: {\n name: \"Codex\",\n argv: [\"npx\", \"-y\", `@agentclientprotocol/codex-acp@${ACP_ADAPTER_PACKAGE_RANGES.codex}`],\n installedArgv: [\"codex-acp\"],\n package: {\n packageName: \"@agentclientprotocol/codex-acp\",\n packageRange: ACP_ADAPTER_PACKAGE_RANGES.codex,\n preferredBinName: \"codex-acp\",\n legacyFallbackCommands: [],\n },\n packageExecFallback: true,\n },\n claude: {\n name: \"Claude Code\",\n argv: [\n \"npx\",\n \"-y\",\n `@agentclientprotocol/claude-agent-acp@${ACP_ADAPTER_PACKAGE_RANGES.claude}`,\n ],\n installedArgv: [\"claude-agent-acp\"],\n package: {\n packageName: \"@agentclientprotocol/claude-agent-acp\",\n packageRange: ACP_ADAPTER_PACKAGE_RANGES.claude,\n preferredBinName: \"claude-agent-acp\",\n legacyFallbackCommands: [\n `npm exec @agentclientprotocol/claude-agent-acp@${ACP_ADAPTER_PACKAGE_RANGES.claude}`,\n ],\n },\n packageExecFallback: true,\n },\n gemini: { name: \"Gemini CLI\", argv: [\"gemini\", \"--acp\"] },\n cursor: { name: \"Cursor\", argv: [\"cursor-agent\", \"acp\"] },\n copilot: { name: \"GitHub Copilot\", argv: [\"copilot\", \"--acp\", \"--stdio\"] },\n antigravity: {\n name: \"Google Antigravity\",\n argv:\n process.platform === \"win32\"\n ? [\"agy_acp_server.exe\"]\n : [\"agy_acp_server.par\", ...(process.platform === \"linux\" ? [\"--uid=\"] : [])],\n },\n devin: { name: \"Devin\", argv: [\"devin\", \"acp\"] },\n droid: { name: \"Factory Droid\", argv: [\"droid\", \"exec\", \"--output-format\", \"acp\"] },\n \"fast-agent\": { name: \"Fast Agent\", argv: [\"uvx\", \"fast-agent-mcp\", \"acp\"] },\n fx: { name: \"fx\", argv: [\"fx\", \"acp\"] },\n \"grok-build\": { name: \"Grok Build\", argv: [\"grok\", \"agent\", \"stdio\"] },\n iflow: { name: \"iFlow\", argv: [\"iflow\", \"--experimental-acp\"] },\n junie: { name: \"Junie\", argv: [\"junie\", \"--acp=true\"] },\n kilocode: {\n name: \"Kilo Code\",\n argv: [\"npx\", \"-y\", \"@kilocode/cli\", \"acp\"],\n installedArgv: [\"kilo\", \"acp\"],\n },\n kimi: { name: \"Kimi Code\", argv: [\"kimi\", \"acp\"] },\n kiro: { name: \"Kiro\", argv: [\"kiro-cli-chat\", \"acp\"] },\n mcode: { name: \"MCode\", argv: [\"mcode\", \"acp\"] },\n mux: { name: \"Mux\", argv: [\"npx\", \"-y\", `mux@${ACP_ADAPTER_PACKAGE_RANGES.mux}`, \"acp\"] },\n opencode: {\n name: \"OpenCode\",\n argv: [\"npx\", \"-y\", \"opencode-ai\", \"acp\"],\n installedArgv: [\"opencode\", \"acp\"],\n },\n pool: { name: \"Poolside\", argv: [\"pool\", \"acp\"] },\n qoder: { name: \"Qoder\", argv: [\"qodercli\", \"--acp\"] },\n qwen: { name: \"Qwen Code\", argv: [\"qwen\", \"--acp\"] },\n trae: { name: \"Trae\", argv: [\"traecli\", \"acp\", \"serve\"] },\n zeroclaw: { name: \"ZeroClaw\", argv: [\"zeroclaw\", \"acp\"] },\n};\n\nexport const AGENT_ARGV_REGISTRY: Record<string, string[]> = Object.fromEntries(\n Object.entries(AGENT_DEFINITIONS).map(([id, definition]) => [id, [...definition.argv]]),\n);\nexport const AGENT_REGISTRY: Record<string, string> = Object.fromEntries(\n Object.entries(AGENT_DEFINITIONS).map(([id, definition]) => [id, definition.argv.join(\" \")]),\n);\nexport const BUILT_IN_AGENT_PACKAGES: Record<string, BuiltInAgentPackageSpec> = Object.fromEntries(\n Object.entries(AGENT_DEFINITIONS).flatMap(([id, definition]) =>\n definition.packageExecFallback && definition.package\n ? [[id, { ...definition.package, fallbackCommand: definition.argv.join(\" \") }]]\n : [],\n ),\n);\n\nexport type AcpAgentInspection = {\n id: string;\n name: string;\n launch:\n | { kind: \"installed\"; argv: string[] }\n | { kind: \"missing\"; requirements: Array<{ kind: \"command\" | \"package\"; name: string }> };\n};\n\nexport type AcpAgentInspectionOptions = {\n resolveExecutable?: (command: string) => string | undefined;\n resolvePackageRoot?: (packageName: string) => string | undefined;\n};\n\nfunction isPackageExecution(argv: string[]): boolean {\n const command = path.win32\n .basename(argv[0])\n .toLowerCase()\n .replace(/\\.(cmd|exe|bat)$/, \"\");\n if ([\"npx\", \"uvx\", \"npm\", \"pnpm\", \"bunx\"].includes(command)) {\n return true;\n }\n switch (command) {\n case \"bun\":\n return argv[1] === \"x\";\n case \"uv\":\n return argv[1] === \"tool\" && argv[2] === \"run\";\n case \"node\":\n return /(?:npm|npx)-cli\\.js$/u.test(argv[1] ?? \"\");\n default:\n return false;\n }\n}\n\nfunction inspectionDefinition(\n id: string,\n override: string | string[] | undefined,\n): AgentDefinition | undefined {\n const definition = Object.hasOwn(AGENT_DEFINITIONS, id) ? AGENT_DEFINITIONS[id] : undefined;\n if (!override) {\n return definition;\n }\n let argv = override;\n if (typeof argv === \"string\") {\n const parsed = splitCommandLine(argv);\n argv = [parsed.command, ...parsed.args];\n }\n return { name: definition?.name ?? id, argv };\n}\n\nfunction inspectAgent(\n agentId: string,\n override: string | string[] | undefined,\n options: AcpAgentInspectionOptions = {},\n): AcpAgentInspection | undefined {\n const id = resolveCanonicalAgentName(agentId);\n const definition = inspectionDefinition(id, override);\n if (!definition) {\n return undefined;\n }\n const argv = definition.installedArgv ?? definition.argv;\n if (isPackageExecution(argv)) {\n return undefined;\n }\n const spec = definition.package\n ? { ...definition.package, fallbackCommand: definition.argv.join(\" \") }\n : undefined;\n const launch = inspectLaunch(argv, spec, options);\n return {\n id,\n name: definition.name,\n launch: inspectPrerequisites(launch, definition.requiredCommands ?? [], options),\n };\n}\n\nfunction inspectPrerequisites(\n launch: AcpAgentInspection[\"launch\"],\n requiredCommands: string[],\n options: AcpAgentInspectionOptions,\n): AcpAgentInspection[\"launch\"] {\n const resolveExecutable = options.resolveExecutable ?? resolveInstalledExecutable;\n const missingCommands = requiredCommands\n .filter((command) => !resolveExecutable(command))\n .map((name) => ({ kind: \"command\" as const, name }));\n if (missingCommands.length === 0) {\n return launch;\n }\n return {\n kind: \"missing\",\n requirements: [...(launch.kind === \"missing\" ? launch.requirements : []), ...missingCommands],\n };\n}\n\nfunction inspectLaunch(\n argv: string[],\n spec: BuiltInAgentPackageSpec | undefined,\n options: AcpAgentInspectionOptions,\n): AcpAgentInspection[\"launch\"] {\n const command = (options.resolveExecutable ?? resolveInstalledExecutable)(argv[0]);\n if (command) {\n return { kind: \"installed\", argv: [command, ...argv.slice(1)] };\n }\n if (!spec) {\n return { kind: \"missing\", requirements: [{ kind: \"command\", name: argv[0] }] };\n }\n const installed = resolveInstalledBuiltInAgentLaunchForSpec(spec, options);\n return installed\n ? { kind: \"installed\", argv: [installed.command, ...installed.args] }\n : { kind: \"missing\", requirements: [{ kind: \"package\", name: spec.packageName }] };\n}\n\nconst AGENT_ALIASES: Record<string, string> = {\n \"factory-droid\": \"droid\",\n factorydroid: \"droid\",\n};\n\nexport const DEFAULT_AGENT_NAME = \"codex\";\n\nexport function normalizeAgentName(value: string): string {\n return value.trim().toLowerCase();\n}\n\nexport function resolveCanonicalAgentName(value: string): string {\n const normalized = normalizeAgentName(value);\n return Object.hasOwn(AGENT_ALIASES, normalized) ? AGENT_ALIASES[normalized] : normalized;\n}\n\nexport function mergeAgentRegistry(overrides?: Record<string, string>): Record<string, string> {\n if (!overrides) {\n return { ...AGENT_REGISTRY };\n }\n\n const merged = { ...AGENT_REGISTRY };\n for (const [name, command] of Object.entries(overrides)) {\n const normalized = normalizeAgentName(name);\n if (!normalized || !command.trim()) {\n continue;\n }\n merged[normalized] = command.trim();\n }\n return merged;\n}\n\nexport function resolveAgentCommand(agentName: string, overrides?: Record<string, string>): string {\n const normalized = normalizeAgentName(agentName);\n const registry = mergeAgentRegistry(overrides);\n return registry[normalized] ?? registry[AGENT_ALIASES[normalized] ?? normalized] ?? agentName;\n}\n\nexport function resolveAgentArgv(agentName: string): string[] | undefined {\n const normalized = normalizeAgentName(agentName);\n const argv =\n AGENT_ARGV_REGISTRY[normalized] ?? AGENT_ARGV_REGISTRY[resolveCanonicalAgentName(agentName)];\n return argv ? [...argv] : undefined;\n}\n\nexport function findBuiltInAgentPackage(agentCommand: string): BuiltInAgentPackageSpec | undefined {\n const normalized = agentCommand.trim();\n const builtInAgentPackages = Object.values(BUILT_IN_AGENT_PACKAGES);\n return builtInAgentPackages.find(\n (spec) =>\n spec.fallbackCommand === normalized || spec.legacyFallbackCommands?.includes(normalized),\n );\n}\n\nfunction defaultResolvePackageRoot(packageName: string): string {\n const segments = packageName.split(\"/\");\n let cursor = path.dirname(fileURLToPath(import.meta.url));\n\n while (true) {\n const candidateRoot = path.join(cursor, \"node_modules\", ...segments);\n const manifestPath = path.join(candidateRoot, \"package.json\");\n if (fs.existsSync(manifestPath)) {\n try {\n const parsed = JSON.parse(fs.readFileSync(manifestPath, \"utf8\")) as {\n name?: string;\n };\n if (parsed.name === packageName) {\n return candidateRoot;\n }\n } catch {\n // best effort; keep walking upward\n }\n }\n\n const parent = path.dirname(cursor);\n if (parent === cursor) {\n throw new Error(`Built-in agent package not found: ${packageName}`);\n }\n cursor = parent;\n }\n}\n\nfunction resolvePackageBin(\n spec: BuiltInAgentPackageSpec,\n manifest: {\n bin?: string | Record<string, string>;\n },\n): string | undefined {\n if (typeof manifest.bin === \"string\") {\n return manifest.bin;\n }\n if (!manifest.bin || typeof manifest.bin !== \"object\") {\n return undefined;\n }\n return (\n manifest.bin[spec.preferredBinName] ??\n (Object.keys(manifest.bin).length === 1 ? Object.values(manifest.bin)[0] : undefined)\n );\n}\n\nfunction defaultResolveNpmCliPath(execPath: string): string {\n const candidate = path.resolve(\n path.dirname(execPath),\n \"..\",\n \"lib\",\n \"node_modules\",\n \"npm\",\n \"bin\",\n \"npm-cli.js\",\n );\n if (!fs.existsSync(candidate)) {\n throw new Error(`npm CLI not found for execPath: ${execPath}`);\n }\n return candidate;\n}\n\nexport function resolveInstalledBuiltInAgentLaunch(\n agentCommand: string,\n options: BuiltInLaunchResolverOptions = {},\n): BuiltInAgentLaunch | undefined {\n const spec = findBuiltInAgentPackage(agentCommand);\n if (!spec) {\n return undefined;\n }\n\n return resolveInstalledBuiltInAgentLaunchForSpec(spec, options);\n}\n\nfunction resolveInstalledBuiltInAgentLaunchForSpec(\n spec: BuiltInAgentPackageSpec,\n options: BuiltInLaunchResolverOptions,\n): BuiltInAgentLaunch | undefined {\n const readFileSync = options.readFileSync ?? fs.readFileSync;\n const existsSync = options.existsSync ?? fs.existsSync;\n const resolvePackageRoot = options.resolvePackageRoot ?? defaultResolvePackageRoot;\n\n try {\n const resolved = resolveInstalledBuiltInAgentPackage(spec, {\n readFileSync,\n existsSync,\n resolvePackageRoot,\n });\n if (!resolved) {\n return undefined;\n }\n\n return {\n source: \"installed\",\n command: process.execPath,\n args: [resolved.binPath],\n packageName: spec.packageName,\n packageRange: spec.packageRange,\n packageVersion: resolved.packageVersion,\n binPath: resolved.binPath,\n };\n } catch {\n return undefined;\n }\n}\n\nfunction resolveInstalledBuiltInAgentPackage(\n spec: BuiltInAgentPackageSpec,\n options: Required<\n Pick<BuiltInLaunchResolverOptions, \"readFileSync\" | \"existsSync\" | \"resolvePackageRoot\">\n >,\n): { packageVersion?: string; binPath: string } | undefined {\n const packageRoot = options.resolvePackageRoot(spec.packageName);\n if (!packageRoot) {\n return undefined;\n }\n const manifest = JSON.parse(\n options.readFileSync(path.join(packageRoot, \"package.json\"), \"utf8\"),\n ) as {\n name?: string;\n version?: string;\n bin?: string | Record<string, string>;\n };\n if (manifest.name !== spec.packageName) {\n return undefined;\n }\n\n const relativeBinPath = resolvePackageBin(spec, manifest);\n if (!relativeBinPath) {\n return undefined;\n }\n\n const binPath = path.resolve(packageRoot, relativeBinPath);\n return options.existsSync(binPath) ? { packageVersion: manifest.version, binPath } : undefined;\n}\n\nexport function resolvePackageExecBuiltInAgentLaunch(\n agentCommand: string,\n options: BuiltInLaunchResolverOptions = {},\n): BuiltInAgentLaunch | undefined {\n const spec = findBuiltInAgentPackage(agentCommand);\n if (!spec) {\n return undefined;\n }\n\n const existsSync = options.existsSync ?? fs.existsSync;\n const execPath = options.execPath ?? process.execPath;\n const resolveNpmCliPath = options.resolveNpmCliPath ?? defaultResolveNpmCliPath;\n\n try {\n const npmCliPath = resolveNpmCliPath(execPath);\n if (!existsSync(npmCliPath)) {\n return undefined;\n }\n\n return {\n source: \"package-exec\",\n command: execPath,\n args: [\n npmCliPath,\n \"exec\",\n \"--yes\",\n `--package=${spec.packageName}@${spec.packageRange}`,\n \"--\",\n spec.preferredBinName,\n ],\n packageName: spec.packageName,\n packageRange: spec.packageRange,\n npmCliPath,\n };\n } catch {\n return undefined;\n }\n}\n\nexport function resolveBuiltInAgentLaunch(\n agentCommand: string,\n options: BuiltInLaunchResolverOptions = {},\n): BuiltInAgentLaunch | undefined {\n return (\n resolveInstalledBuiltInAgentLaunch(agentCommand, options) ??\n resolvePackageExecBuiltInAgentLaunch(agentCommand, options)\n );\n}\n\nexport function listBuiltInAgents(overrides?: Record<string, unknown>): string[] {\n return [...new Set([...Object.keys(AGENT_REGISTRY), ...Object.keys(overrides ?? {})])];\n}\n\nexport interface AcpAgentRegistry {\n resolve(agentName: string): string | string[];\n list(): string[];\n}\n\nexport type AcpInspectableAgentRegistry = AcpAgentRegistry & {\n inspect(agentId: string): AcpAgentInspection | undefined;\n};\n\nexport function createAgentRegistry(\n params?: {\n overrides?: Record<string, string | string[]>;\n } & AcpAgentInspectionOptions,\n): AcpInspectableAgentRegistry {\n const overrides = normalizeRegistryOverrides(params?.overrides);\n return {\n resolve(agentName: string) {\n const normalizedAgentName = normalizeAgentName(agentName);\n const override =\n overrides[normalizedAgentName] ?? overrides[resolveCanonicalAgentName(agentName)];\n return override ?? resolveAgentArgv(agentName) ?? resolveAgentCommand(agentName);\n },\n list() {\n return listBuiltInAgents(overrides);\n },\n inspect(agentId) {\n const normalized = normalizeAgentName(agentId);\n const canonical = resolveCanonicalAgentName(agentId);\n const override = Object.hasOwn(overrides, normalized)\n ? overrides[normalized]\n : Object.hasOwn(overrides, canonical)\n ? overrides[canonical]\n : undefined;\n return inspectAgent(agentId, override, params);\n },\n };\n}\n\nfunction normalizeRegistryOverrides(\n values: Record<string, string | string[]> | undefined,\n): Record<string, string | string[]> {\n const normalized: Record<string, string | string[]> = {};\n for (const [name, value] of Object.entries(values ?? {})) {\n const normalizedName = normalizeAgentName(name);\n if (!normalizedName) {\n continue;\n }\n const normalizedValue = normalizeRegistryOverride(value);\n if (normalizedValue) {\n normalized[normalizedName] = normalizedValue;\n }\n }\n return normalized;\n}\n\nfunction normalizeRegistryOverride(value: string | string[]): string | string[] | undefined {\n if (typeof value === \"string\") {\n return value.trim() || undefined;\n }\n return value.length > 0 && value[0]?.length ? [...value] : undefined;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-registry.d.ts","names":[],"sources":["../src/agent-registry.ts"],"mappings":";;KAaK;EACH;EACA;EACA;EACA;EACA;;KAGG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;KAGG;EACH,cAAc;EACd,sBAAsB,GAAG;EACzB,sBAAsB;EACtB;EACA,qBAAqB;;qBAsFV,qBAAqB;qBAGrB,gBAAgB;qBAGhB,yBAAyB,eAAe;YAQzC;EACV;EACA;EACA;IACM;IAAmB;;IACnB;IAAiB,cAAc;MAAQ;MAA6B;;;;YAGhE;EACV,qBAAqB;EACrB,sBAAsB;;qBAyGX;wBAEG,mBAAmB;wBAInB,0BAA0B;wBAK1B,mBAAmB,YAAY,yBAAyB;wBAgBxD,oBAAoB,mBAAmB,YAAY;wBAMnD,iBAAiB;wBAOjB,wBAAwB,uBAAuB;wBAuE/C,mCACd,sBACA,UAAS,+BACR;wBAuEa,qCACd,sBACA,UAAS,+BACR;wBAoCa,0BACd,sBACA,UAAS,+BACR;wBAOa,kBAAkB,YAAY;iBAI7B;EACf,QAAQ;EACR;;YAGU,8BAA8B;EACxC,QAAQ,kBAAkB;;wBAGZ,oBACd;EACE,YAAY;IACV,4BACH"}
1
+ {"version":3,"file":"agent-registry.d.ts","names":[],"sources":["../src/agent-registry.ts"],"mappings":";;KAaK;EACH;EACA;EACA;EACA;EACA;;KAGG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;KAGG;EACH,cAAc;EACd,sBAAsB,GAAG;EACzB,sBAAsB;EACtB;EACA,qBAAqB;;qBA6FV,qBAAqB;qBAGrB,gBAAgB;qBAGhB,yBAAyB,eAAe;YAQzC;EACV;EACA;EACA;IACM;IAAmB;;IACnB;IAAiB,cAAc;MAAQ;MAA6B;;;;YAGhE;EACV,qBAAqB;EACrB,sBAAsB;;qBAyGX;wBAEG,mBAAmB;wBAInB,0BAA0B;wBAK1B,mBAAmB,YAAY,yBAAyB;wBAgBxD,oBAAoB,mBAAmB,YAAY;wBAMnD,iBAAiB;wBAOjB,wBAAwB,uBAAuB;wBAuE/C,mCACd,sBACA,UAAS,+BACR;wBAuEa,qCACd,sBACA,UAAS,+BACR;wBAoCa,0BACd,sBACA,UAAS,+BACR;wBAOa,kBAAkB,YAAY;iBAI7B;EACf,QAAQ;EACR;;YAGU,8BAA8B;EACxC,QAAQ,kBAAkB;;wBAGZ,oBACd;EACE,YAAY;IACV,4BACH"}
@@ -1,2 +1,2 @@
1
- import { a as createAgentRegistry, c as mergeAgentRegistry, d as resolveAgentCommand, f as resolveBuiltInAgentLaunch, h as resolvePackageExecBuiltInAgentLaunch, i as DEFAULT_AGENT_NAME, l as normalizeAgentName, m as resolveInstalledBuiltInAgentLaunch, n as AGENT_REGISTRY, o as findBuiltInAgentPackage, p as resolveCanonicalAgentName, r as BUILT_IN_AGENT_PACKAGES, s as listBuiltInAgents, t as AGENT_ARGV_REGISTRY, u as resolveAgentArgv } from "./agent-registry-DU6mhZBL.js";
1
+ import { a as createAgentRegistry, c as mergeAgentRegistry, d as resolveAgentCommand, f as resolveBuiltInAgentLaunch, h as resolvePackageExecBuiltInAgentLaunch, i as DEFAULT_AGENT_NAME, l as normalizeAgentName, m as resolveInstalledBuiltInAgentLaunch, n as AGENT_REGISTRY, o as findBuiltInAgentPackage, p as resolveCanonicalAgentName, r as BUILT_IN_AGENT_PACKAGES, s as listBuiltInAgents, t as AGENT_ARGV_REGISTRY, u as resolveAgentArgv } from "./agent-registry-evUoJINz.js";
2
2
  export { AGENT_ARGV_REGISTRY, AGENT_REGISTRY, BUILT_IN_AGENT_PACKAGES, DEFAULT_AGENT_NAME, createAgentRegistry, findBuiltInAgentPackage, listBuiltInAgents, mergeAgentRegistry, normalizeAgentName, resolveAgentArgv, resolveAgentCommand, resolveBuiltInAgentLaunch, resolveCanonicalAgentName, resolveInstalledBuiltInAgentLaunch, resolvePackageExecBuiltInAgentLaunch };
@@ -1,6 +1,7 @@
1
- import { R as permissionModeSatisfies, ht as writePrivateFile } from "./live-checkpoint-BEfxBKCh.js";
2
- import { C as resolvePermissionMode, S as resolveOutputPolicy, b as resolveAgentInvocation, l as hasExplicitPermissionModeFlag, t as resolvePermissionPolicyFromFlags, x as resolveGlobalFlags } from "./invocation-options-BY4lxkn3.js";
3
- import { c as validateFlowDefinition, h as isDefinedFlow, o as FlowRunner } from "./flows-Bxs4udrs.js";
1
+ import { pt as writePrivateFile } from "./ipc-D2rstexT.js";
2
+ import { Z as permissionModeSatisfies } from "./queue-owner-runtime-Dgv3e2Tp.js";
3
+ import { C as resolvePermissionMode, S as resolveOutputPolicy, b as resolveAgentInvocation, l as hasExplicitPermissionModeFlag, t as resolvePermissionPolicyFromFlags, x as resolveGlobalFlags } from "./invocation-options-eZEBh4vd.js";
4
+ import { c as validateFlowDefinition, h as isDefinedFlow, o as FlowRunner } from "./flows-xGyhmoHO.js";
4
5
  import { fileURLToPath, pathToFileURL } from "node:url";
5
6
  import path from "node:path";
6
7
  import { InvalidArgumentError } from "commander";
@@ -188,4 +189,4 @@ function printFlowRunResult(result, globalFlags) {
188
189
  //#endregion
189
190
  export { handleFlowRun };
190
191
 
191
- //# sourceMappingURL=cli-BkYIxj_N.js.map
192
+ //# sourceMappingURL=cli-B2ycKzaO.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-BkYIxj_N.js","names":[],"sources":["../src/flows/cli.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { InvalidArgumentError, type Command } from \"commander\";\nimport type { ResolvedAcpxConfig } from \"../cli/config.js\";\nimport {\n hasExplicitPermissionModeFlag,\n resolveAgentInvocation,\n resolveGlobalFlags,\n resolveOutputPolicy,\n resolvePermissionMode,\n type GlobalFlags,\n} from \"../cli/flags.js\";\nimport { resolvePermissionPolicyFromFlags } from \"../cli/invocation-options.js\";\nimport { type FlowDefinition, FlowRunner } from \"../flows.js\";\nimport { permissionModeSatisfies } from \"../permissions.js\";\nimport { writePrivateFile } from \"../state-files.js\";\nimport type { PermissionMode } from \"../types.js\";\nimport { isDefinedFlow } from \"./authoring.js\";\nimport { validateFlowDefinition } from \"./graph.js\";\n\ntype FlowRunFlags = {\n inputJson?: string;\n inputFile?: string;\n defaultAgent?: string;\n};\n\nconst FLOW_RUNTIME_SPECIFIER = \"acpx/flows\";\nconst TEXT_MODULE_EXTENSIONS = new Set([\".js\", \".mjs\", \".cjs\", \".ts\", \".tsx\", \".mts\", \".cts\"]);\n\nexport async function handleFlowRun(\n flowFile: string,\n flags: FlowRunFlags,\n command: Command,\n config: ResolvedAcpxConfig,\n): Promise<void> {\n const globalFlags = resolveGlobalFlags(command, config);\n const permissionMode = resolvePermissionMode(globalFlags, config.defaultPermissions);\n const permissionPolicy = await resolvePermissionPolicyFromFlags(globalFlags);\n const outputPolicy = resolveOutputPolicy(globalFlags.format, globalFlags.jsonStrict === true);\n const input = await readFlowInput(flags);\n const flowPath = path.resolve(flowFile);\n const flow = await loadFlowModule(flowPath);\n assertFlowPermissionRequirements(flow, permissionMode, globalFlags);\n\n const runner = new FlowRunner({\n resolveAgent: (profile?: string) => {\n return resolveAgentInvocation(profile ?? flags.defaultAgent, globalFlags, config);\n },\n permissionMode,\n mcpServers: config.mcpServers,\n nonInteractivePermissions: globalFlags.nonInteractivePermissions,\n permissionPolicy,\n authCredentials: config.auth,\n authPolicy: globalFlags.authPolicy,\n fs: globalFlags.fs,\n timeoutMs: globalFlags.timeout,\n ttlMs: globalFlags.ttl,\n verbose: globalFlags.verbose,\n suppressSdkConsoleErrors: outputPolicy.suppressSdkConsoleErrors,\n sessionOptions: {\n model: globalFlags.model,\n allowedTools: globalFlags.allowedTools,\n maxTurns: globalFlags.maxTurns,\n },\n });\n\n const result = await runner.run(flow, input, {\n flowPath,\n });\n\n printFlowRunResult(result, globalFlags);\n}\n\nfunction assertFlowPermissionRequirements(\n flow: FlowDefinition,\n permissionMode: PermissionMode,\n globalFlags: GlobalFlags,\n): void {\n const permissions = flow.permissions;\n if (!permissions) {\n return;\n }\n\n if (permissions.requireExplicitGrant && !hasExplicitPermissionModeFlag(globalFlags)) {\n throw new InvalidArgumentError(\n buildFlowPermissionFailureMessage(flow, permissions.requiredMode, permissions.reason, true),\n );\n }\n\n if (!permissionModeSatisfies(permissionMode, permissions.requiredMode)) {\n throw new InvalidArgumentError(\n buildFlowPermissionFailureMessage(flow, permissions.requiredMode, permissions.reason, false),\n );\n }\n}\n\nfunction buildFlowPermissionFailureMessage(\n flow: FlowDefinition,\n requiredMode: PermissionMode,\n reason?: string,\n explicit = false,\n): string {\n return [\n explicit\n ? `Flow \"${flow.name}\" requires an explicit ${requiredMode} grant.`\n : `Flow \"${flow.name}\" requires permission mode ${requiredMode}.`,\n `Rerun with --${requiredMode}.`,\n ...(reason ? [`Reason: ${reason}`] : []),\n ].join(\" \");\n}\n\nasync function readFlowInput(flags: FlowRunFlags): Promise<unknown> {\n if (flags.inputJson && flags.inputFile) {\n throw new InvalidArgumentError(\"Use only one of --input-json or --input-file\");\n }\n\n if (flags.inputJson) {\n return parseJsonInput(flags.inputJson, \"--input-json\");\n }\n\n if (flags.inputFile) {\n const inputPath = path.resolve(flags.inputFile);\n const payload = await fs.readFile(inputPath, \"utf8\");\n return parseJsonInput(payload, \"--input-file\");\n }\n\n return {};\n}\n\nasync function loadFlowModule(flowPath: string): Promise<FlowDefinition> {\n const extension = path.extname(flowPath).toLowerCase();\n const prepared = await prepareFlowModuleImport(flowPath, extension);\n try {\n const module = await loadFlowRuntimeModule(prepared.flowUrl, extension);\n\n const candidate = findFlowDefinition(module);\n if (!candidate) {\n throw new Error(\n `Flow module must export default defineFlow({...}) from \"acpx/flows\": ${flowPath}`,\n );\n }\n validateFlowDefinition(candidate);\n return candidate;\n } finally {\n await prepared.cleanup?.();\n }\n}\n\nasync function prepareFlowModuleImport(\n flowPath: string,\n extension: string,\n): Promise<{\n flowUrl: string;\n cleanup?: () => Promise<void>;\n}> {\n const flowUrl = pathToFileURL(flowPath).href;\n if (!TEXT_MODULE_EXTENSIONS.has(extension)) {\n return { flowUrl };\n }\n\n const source = await fs.readFile(flowPath, \"utf8\");\n if (!source.includes(FLOW_RUNTIME_SPECIFIER)) {\n return { flowUrl };\n }\n\n const runtimeSpecifier = resolveFlowRuntimeImportSpecifier();\n const rewritten = source.replaceAll(\n /([\"'])acpx\\/flows\\1/g,\n (_match, quote: string) => `${quote}${runtimeSpecifier}${quote}`,\n );\n if (rewritten === source) {\n return { flowUrl };\n }\n\n const tempPath = path.join(path.dirname(flowPath), `.acpx-flow-load-${randomUUID()}${extension}`);\n await writePrivateFile(tempPath, rewritten, { privateDirectory: false });\n return {\n flowUrl: pathToFileURL(tempPath).href,\n cleanup: async () => {\n await fs.rm(tempPath, { force: true });\n },\n };\n}\n\nfunction resolveFlowRuntimeImportSpecifier(): string {\n const selfPath = fileURLToPath(import.meta.url);\n let runtimePath: string;\n\n if (selfPath.endsWith(`${path.sep}src${path.sep}flows${path.sep}cli.ts`)) {\n runtimePath = fileURLToPath(new URL(\"../flows.ts\", import.meta.url));\n } else if (selfPath.endsWith(`${path.sep}src${path.sep}flows${path.sep}cli.js`)) {\n runtimePath = fileURLToPath(new URL(\"../flows.js\", import.meta.url));\n } else {\n runtimePath = fileURLToPath(new URL(\"./flows.js\", import.meta.url));\n }\n return runtimePath.replaceAll(path.sep, \"/\");\n}\n\ntype FlowModule = {\n default?: unknown;\n \"module.exports\"?: unknown;\n};\n\nasync function loadFlowRuntimeModule(flowUrl: string, extension: string): Promise<FlowModule> {\n if (extension === \".ts\" || extension === \".tsx\" || extension === \".cts\") {\n const { register } = await import(\"tsx/cjs/api\");\n const loader = register({ namespace: randomUUID() });\n try {\n return loader.require(flowUrl, import.meta.url) as FlowModule;\n } finally {\n loader.unregister();\n }\n }\n\n if (extension === \".mts\") {\n const { register } = await import(\"tsx/esm/api\");\n const loader = register({ namespace: randomUUID() });\n try {\n return (await loader.import(flowUrl, import.meta.url)) as FlowModule;\n } finally {\n await loader.unregister();\n }\n }\n\n return (await import(flowUrl)) as FlowModule;\n}\n\nfunction findFlowDefinition(module: FlowModule): FlowDefinition | null {\n const candidates = [\n module.default,\n module[\"module.exports\"],\n getNestedDefault(module.default),\n getNestedDefault(module[\"module.exports\"]),\n ];\n\n for (const candidate of candidates) {\n if (isDefinedFlow(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction getNestedDefault(value: unknown): unknown {\n if (!value || typeof value !== \"object\" || !(\"default\" in value)) {\n return null;\n }\n return (value as { default?: unknown }).default ?? null;\n}\n\nfunction parseJsonInput(raw: string, label: string): unknown {\n try {\n return JSON.parse(raw);\n } catch (error) {\n throw new InvalidArgumentError(\n `${label} must contain valid JSON: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nfunction printFlowRunResult(\n result: Awaited<ReturnType<FlowRunner[\"run\"]>>,\n globalFlags: GlobalFlags,\n): void {\n const payload = {\n action: \"flow_run_result\",\n runId: result.state.runId,\n flowName: result.state.flowName,\n runTitle: result.state.runTitle,\n flowPath: result.state.flowPath,\n status: result.state.status,\n currentNode: result.state.currentNode,\n currentNodeType: result.state.currentNodeType,\n currentNodeStartedAt: result.state.currentNodeStartedAt,\n lastHeartbeatAt: result.state.lastHeartbeatAt,\n statusDetail: result.state.statusDetail,\n waitingOn: result.state.waitingOn,\n runDir: result.runDir,\n outputs: result.state.outputs,\n sessionBindings: result.state.sessionBindings,\n };\n\n if (globalFlags.format === \"json\") {\n process.stdout.write(`${JSON.stringify(payload)}\\n`);\n return;\n }\n\n if (globalFlags.format === \"quiet\") {\n process.stdout.write(`${result.state.runId}\\n`);\n return;\n }\n\n process.stdout.write(`runId: ${payload.runId}\\n`);\n process.stdout.write(`flow: ${payload.flowName}\\n`);\n if (payload.runTitle) {\n process.stdout.write(`title: ${payload.runTitle}\\n`);\n }\n process.stdout.write(`status: ${payload.status}\\n`);\n process.stdout.write(`runDir: ${payload.runDir}\\n`);\n if (payload.currentNode) {\n process.stdout.write(`currentNode: ${payload.currentNode}\\n`);\n }\n if (payload.statusDetail) {\n process.stdout.write(`statusDetail: ${payload.statusDetail}\\n`);\n }\n if (payload.waitingOn) {\n process.stdout.write(`waitingOn: ${payload.waitingOn}\\n`);\n }\n process.stdout.write(`${JSON.stringify(payload.outputs, null, 2)}\\n`);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli-B2ycKzaO.js","names":[],"sources":["../src/flows/cli.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { InvalidArgumentError, type Command } from \"commander\";\nimport type { ResolvedAcpxConfig } from \"../cli/config.js\";\nimport {\n hasExplicitPermissionModeFlag,\n resolveAgentInvocation,\n resolveGlobalFlags,\n resolveOutputPolicy,\n resolvePermissionMode,\n type GlobalFlags,\n} from \"../cli/flags.js\";\nimport { resolvePermissionPolicyFromFlags } from \"../cli/invocation-options.js\";\nimport { type FlowDefinition, FlowRunner } from \"../flows.js\";\nimport { permissionModeSatisfies } from \"../permissions.js\";\nimport { writePrivateFile } from \"../state-files.js\";\nimport type { PermissionMode } from \"../types.js\";\nimport { isDefinedFlow } from \"./authoring.js\";\nimport { validateFlowDefinition } from \"./graph.js\";\n\ntype FlowRunFlags = {\n inputJson?: string;\n inputFile?: string;\n defaultAgent?: string;\n};\n\nconst FLOW_RUNTIME_SPECIFIER = \"acpx/flows\";\nconst TEXT_MODULE_EXTENSIONS = new Set([\".js\", \".mjs\", \".cjs\", \".ts\", \".tsx\", \".mts\", \".cts\"]);\n\nexport async function handleFlowRun(\n flowFile: string,\n flags: FlowRunFlags,\n command: Command,\n config: ResolvedAcpxConfig,\n): Promise<void> {\n const globalFlags = resolveGlobalFlags(command, config);\n const permissionMode = resolvePermissionMode(globalFlags, config.defaultPermissions);\n const permissionPolicy = await resolvePermissionPolicyFromFlags(globalFlags);\n const outputPolicy = resolveOutputPolicy(globalFlags.format, globalFlags.jsonStrict === true);\n const input = await readFlowInput(flags);\n const flowPath = path.resolve(flowFile);\n const flow = await loadFlowModule(flowPath);\n assertFlowPermissionRequirements(flow, permissionMode, globalFlags);\n\n const runner = new FlowRunner({\n resolveAgent: (profile?: string) => {\n return resolveAgentInvocation(profile ?? flags.defaultAgent, globalFlags, config);\n },\n permissionMode,\n mcpServers: config.mcpServers,\n nonInteractivePermissions: globalFlags.nonInteractivePermissions,\n permissionPolicy,\n authCredentials: config.auth,\n authPolicy: globalFlags.authPolicy,\n fs: globalFlags.fs,\n timeoutMs: globalFlags.timeout,\n ttlMs: globalFlags.ttl,\n verbose: globalFlags.verbose,\n suppressSdkConsoleErrors: outputPolicy.suppressSdkConsoleErrors,\n sessionOptions: {\n model: globalFlags.model,\n allowedTools: globalFlags.allowedTools,\n maxTurns: globalFlags.maxTurns,\n },\n });\n\n const result = await runner.run(flow, input, {\n flowPath,\n });\n\n printFlowRunResult(result, globalFlags);\n}\n\nfunction assertFlowPermissionRequirements(\n flow: FlowDefinition,\n permissionMode: PermissionMode,\n globalFlags: GlobalFlags,\n): void {\n const permissions = flow.permissions;\n if (!permissions) {\n return;\n }\n\n if (permissions.requireExplicitGrant && !hasExplicitPermissionModeFlag(globalFlags)) {\n throw new InvalidArgumentError(\n buildFlowPermissionFailureMessage(flow, permissions.requiredMode, permissions.reason, true),\n );\n }\n\n if (!permissionModeSatisfies(permissionMode, permissions.requiredMode)) {\n throw new InvalidArgumentError(\n buildFlowPermissionFailureMessage(flow, permissions.requiredMode, permissions.reason, false),\n );\n }\n}\n\nfunction buildFlowPermissionFailureMessage(\n flow: FlowDefinition,\n requiredMode: PermissionMode,\n reason?: string,\n explicit = false,\n): string {\n return [\n explicit\n ? `Flow \"${flow.name}\" requires an explicit ${requiredMode} grant.`\n : `Flow \"${flow.name}\" requires permission mode ${requiredMode}.`,\n `Rerun with --${requiredMode}.`,\n ...(reason ? [`Reason: ${reason}`] : []),\n ].join(\" \");\n}\n\nasync function readFlowInput(flags: FlowRunFlags): Promise<unknown> {\n if (flags.inputJson && flags.inputFile) {\n throw new InvalidArgumentError(\"Use only one of --input-json or --input-file\");\n }\n\n if (flags.inputJson) {\n return parseJsonInput(flags.inputJson, \"--input-json\");\n }\n\n if (flags.inputFile) {\n const inputPath = path.resolve(flags.inputFile);\n const payload = await fs.readFile(inputPath, \"utf8\");\n return parseJsonInput(payload, \"--input-file\");\n }\n\n return {};\n}\n\nasync function loadFlowModule(flowPath: string): Promise<FlowDefinition> {\n const extension = path.extname(flowPath).toLowerCase();\n const prepared = await prepareFlowModuleImport(flowPath, extension);\n try {\n const module = await loadFlowRuntimeModule(prepared.flowUrl, extension);\n\n const candidate = findFlowDefinition(module);\n if (!candidate) {\n throw new Error(\n `Flow module must export default defineFlow({...}) from \"acpx/flows\": ${flowPath}`,\n );\n }\n validateFlowDefinition(candidate);\n return candidate;\n } finally {\n await prepared.cleanup?.();\n }\n}\n\nasync function prepareFlowModuleImport(\n flowPath: string,\n extension: string,\n): Promise<{\n flowUrl: string;\n cleanup?: () => Promise<void>;\n}> {\n const flowUrl = pathToFileURL(flowPath).href;\n if (!TEXT_MODULE_EXTENSIONS.has(extension)) {\n return { flowUrl };\n }\n\n const source = await fs.readFile(flowPath, \"utf8\");\n if (!source.includes(FLOW_RUNTIME_SPECIFIER)) {\n return { flowUrl };\n }\n\n const runtimeSpecifier = resolveFlowRuntimeImportSpecifier();\n const rewritten = source.replaceAll(\n /([\"'])acpx\\/flows\\1/g,\n (_match, quote: string) => `${quote}${runtimeSpecifier}${quote}`,\n );\n if (rewritten === source) {\n return { flowUrl };\n }\n\n const tempPath = path.join(path.dirname(flowPath), `.acpx-flow-load-${randomUUID()}${extension}`);\n await writePrivateFile(tempPath, rewritten, { privateDirectory: false });\n return {\n flowUrl: pathToFileURL(tempPath).href,\n cleanup: async () => {\n await fs.rm(tempPath, { force: true });\n },\n };\n}\n\nfunction resolveFlowRuntimeImportSpecifier(): string {\n const selfPath = fileURLToPath(import.meta.url);\n let runtimePath: string;\n\n if (selfPath.endsWith(`${path.sep}src${path.sep}flows${path.sep}cli.ts`)) {\n runtimePath = fileURLToPath(new URL(\"../flows.ts\", import.meta.url));\n } else if (selfPath.endsWith(`${path.sep}src${path.sep}flows${path.sep}cli.js`)) {\n runtimePath = fileURLToPath(new URL(\"../flows.js\", import.meta.url));\n } else {\n runtimePath = fileURLToPath(new URL(\"./flows.js\", import.meta.url));\n }\n return runtimePath.replaceAll(path.sep, \"/\");\n}\n\ntype FlowModule = {\n default?: unknown;\n \"module.exports\"?: unknown;\n};\n\nasync function loadFlowRuntimeModule(flowUrl: string, extension: string): Promise<FlowModule> {\n if (extension === \".ts\" || extension === \".tsx\" || extension === \".cts\") {\n const { register } = await import(\"tsx/cjs/api\");\n const loader = register({ namespace: randomUUID() });\n try {\n return loader.require(flowUrl, import.meta.url) as FlowModule;\n } finally {\n loader.unregister();\n }\n }\n\n if (extension === \".mts\") {\n const { register } = await import(\"tsx/esm/api\");\n const loader = register({ namespace: randomUUID() });\n try {\n return (await loader.import(flowUrl, import.meta.url)) as FlowModule;\n } finally {\n await loader.unregister();\n }\n }\n\n return (await import(flowUrl)) as FlowModule;\n}\n\nfunction findFlowDefinition(module: FlowModule): FlowDefinition | null {\n const candidates = [\n module.default,\n module[\"module.exports\"],\n getNestedDefault(module.default),\n getNestedDefault(module[\"module.exports\"]),\n ];\n\n for (const candidate of candidates) {\n if (isDefinedFlow(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction getNestedDefault(value: unknown): unknown {\n if (!value || typeof value !== \"object\" || !(\"default\" in value)) {\n return null;\n }\n return (value as { default?: unknown }).default ?? null;\n}\n\nfunction parseJsonInput(raw: string, label: string): unknown {\n try {\n return JSON.parse(raw);\n } catch (error) {\n throw new InvalidArgumentError(\n `${label} must contain valid JSON: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nfunction printFlowRunResult(\n result: Awaited<ReturnType<FlowRunner[\"run\"]>>,\n globalFlags: GlobalFlags,\n): void {\n const payload = {\n action: \"flow_run_result\",\n runId: result.state.runId,\n flowName: result.state.flowName,\n runTitle: result.state.runTitle,\n flowPath: result.state.flowPath,\n status: result.state.status,\n currentNode: result.state.currentNode,\n currentNodeType: result.state.currentNodeType,\n currentNodeStartedAt: result.state.currentNodeStartedAt,\n lastHeartbeatAt: result.state.lastHeartbeatAt,\n statusDetail: result.state.statusDetail,\n waitingOn: result.state.waitingOn,\n runDir: result.runDir,\n outputs: result.state.outputs,\n sessionBindings: result.state.sessionBindings,\n };\n\n if (globalFlags.format === \"json\") {\n process.stdout.write(`${JSON.stringify(payload)}\\n`);\n return;\n }\n\n if (globalFlags.format === \"quiet\") {\n process.stdout.write(`${result.state.runId}\\n`);\n return;\n }\n\n process.stdout.write(`runId: ${payload.runId}\\n`);\n process.stdout.write(`flow: ${payload.flowName}\\n`);\n if (payload.runTitle) {\n process.stdout.write(`title: ${payload.runTitle}\\n`);\n }\n process.stdout.write(`status: ${payload.status}\\n`);\n process.stdout.write(`runDir: ${payload.runDir}\\n`);\n if (payload.currentNode) {\n process.stdout.write(`currentNode: ${payload.currentNode}\\n`);\n }\n if (payload.statusDetail) {\n process.stdout.write(`statusDetail: ${payload.statusDetail}\\n`);\n }\n if (payload.waitingOn) {\n process.stdout.write(`waitingOn: ${payload.waitingOn}\\n`);\n }\n process.stdout.write(`${JSON.stringify(payload.outputs, null, 2)}\\n`);\n}\n"],"mappings":"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"}
package/dist/cli.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { w as SessionRecord } from "./session-options-t3d-F4dn.js";
1
+ import { T as SessionRecord } from "./session-options-Dp6mzNSy.js";
2
2
  import { Command } from "commander";
3
3
  //#region src/cli/flags.d.ts
4
4
  export declare function parseTtlSeconds(value: string): number;
package/dist/cli.js CHANGED
@@ -1,16 +1,17 @@
1
1
  #!/usr/bin/env node
2
- import { a as runSessionQueueOwner, c as DISCARD_OUTPUT_FORMATTER, d as installPerfMetricsCapture, g as __exportAll, l as buildQueueOwnerArgOverride, m as probeQueueOwnerHealth, n as getTextErrorRemediationHints, o as runOnce, t as createOutputFormatter, u as flushPerfMetricsCapture } from "./output-uo5a27KB.js";
3
- import { Bt as OUTPUT_FORMATS, Ct as isLegacyZedCodexAcpInvocation, F as parsePromptSource, G as listSessions, Gt as AgentSpawnError, H as findSession, It as EXIT_CODES, L as textPrompt, M as PromptInputValidationError, Ot as exitCodeForOutputErrorCode, P as mergePromptSourceWithText, Tt as TimeoutError, U as findSessionByDirectoryWalk, V as findGitRepositoryRoot, Wt as AcpxOperationalError, X as writeSessionRecord, _t as isProcessAlive, ct as normalizeAgentSessionId, ft as sessionEventActivePath, ht as writePrivateFile, j as getAcpxVersion, jt as normalizeOutputError, mt as sessionEventSegmentPath, ot as parseSessionRecord, pt as sessionEventLockPath, q as normalizeName, st as serializeSessionRecordForDisk, ut as defaultSessionEventLog, wt as InterruptedError, yt as isAcpJsonRpcMessage } from "./live-checkpoint-BEfxBKCh.js";
4
- import { O as renderArgvIdentity, i as DEFAULT_AGENT_NAME, l as normalizeAgentName$1, s as listBuiltInAgents } from "./agent-registry-DU6mhZBL.js";
5
- import { C as resolvePermissionMode, S as resolveOutputPolicy, T as toTimerMilliseconds, _ as parseSessionName, a as addGlobalFlags, b as resolveAgentInvocation, c as addSessionOption, d as parseDaysOlderThan, f as parseHistoryLimit, g as parsePruneBeforeDate, h as parseOutputFormat$1, i as addExecConfigOption, m as parseNonEmptyValue, n as sessionConnectionOptions, o as addPromptInputOption, p as parseMaxTurns, r as sessionOptionsFromGlobalFlags, s as addSessionNameOption, t as resolvePermissionPolicyFromFlags, u as parseAllowedTools, v as parseTimeoutSeconds, w as resolveSessionNameFromFlags, x as resolveGlobalFlags, y as parseTtlSeconds } from "./invocation-options-BY4lxkn3.js";
2
+ import { n as getTextErrorRemediationHints, o as __exportAll, t as createOutputFormatter } from "./output-D2xL6wdp.js";
3
+ import { A as listSessions, At as AgentSpawnError, C as textPrompt, D as findSession, E as findGitRepositoryRoot, I as writeSessionRecord, M as normalizeName, O as findSessionByDirectoryWalk, Ot as AcpxOperationalError, R as parseSessionRecord, V as normalizeAgentSessionId, b as mergePromptSourceWithText, bt as EXIT_CODES, ct as defaultSessionEventLog, dt as sessionEventLockPath, ht as isProcessAlive, pt as writePrivateFile, u as probeQueueOwnerHealth, ut as sessionEventActivePath, v as PromptInputValidationError, wt as OUTPUT_FORMATS, x as parsePromptSource, z as serializeSessionRecordForDisk } from "./ipc-D2rstexT.js";
4
+ import { X as getAcpxVersion, ct as normalizeOutputError, d as flushPerfMetricsCapture, et as listSessionEvents, f as installPerfMetricsCapture, i as runOnce, n as runSessionQueueOwner, nt as InterruptedError, rt as TimeoutError, s as DISCARD_OUTPUT_FORMATTER, st as exitCodeForOutputErrorCode, tt as isLegacyZedCodexAcpInvocation, u as buildQueueOwnerArgOverride } from "./queue-owner-runtime-Dgv3e2Tp.js";
5
+ import { O as renderArgvIdentity, i as DEFAULT_AGENT_NAME, l as normalizeAgentName$1, s as listBuiltInAgents } from "./agent-registry-evUoJINz.js";
6
+ import { C as resolvePermissionMode, S as resolveOutputPolicy, T as toTimerMilliseconds, _ as parseSessionName, a as addGlobalFlags, b as resolveAgentInvocation, c as addSessionOption, d as parseDaysOlderThan, f as parseHistoryLimit, g as parsePruneBeforeDate, h as parseOutputFormat$1, i as addExecConfigOption, m as parseNonEmptyValue, n as sessionConnectionOptions, o as addPromptInputOption, p as parseMaxTurns, r as sessionOptionsFromGlobalFlags, s as addSessionNameOption, t as resolvePermissionPolicyFromFlags, u as parseAllowedTools, v as parseTimeoutSeconds, w as resolveSessionNameFromFlags, x as resolveGlobalFlags, y as parseTtlSeconds } from "./invocation-options-eZEBh4vd.js";
6
7
  import { realpathSync } from "node:fs";
7
8
  import { fileURLToPath, pathToFileURL } from "node:url";
8
9
  import path from "node:path";
9
10
  import { Command, CommanderError, InvalidArgumentError, Option } from "commander";
10
11
  import fs$1 from "node:fs/promises";
11
12
  import os from "node:os";
12
- import { createHash, randomUUID } from "node:crypto";
13
13
  import { ZodError, z } from "zod";
14
+ import { createHash, randomUUID } from "node:crypto";
14
15
  import { text } from "node:stream/consumers";
15
16
  import { performance } from "node:perf_hooks";
16
17
  //#region src/cli-public.ts
@@ -116,23 +117,6 @@ async function isSessionActive(record) {
116
117
  if (record.closed) return false;
117
118
  return isProcessAlive(record.pid) || await hasLiveEventLock(record.acpxRecordId);
118
119
  }
119
- async function appendHistoryFile(filePath, history) {
120
- const payload = await fs$1.readFile(filePath, "utf8").catch((error) => {
121
- if (error.code === "ENOENT") return "";
122
- throw error;
123
- });
124
- for (const line of payload.split("\n").filter((entry) => entry.trim().length > 0)) try {
125
- const parsed = JSON.parse(line);
126
- if (isAcpJsonRpcMessage(parsed)) history.push(parsed);
127
- } catch {}
128
- }
129
- async function readSessionHistory(record) {
130
- const history = [];
131
- const maxSegments = Number.isInteger(record.eventLog.max_segments) ? record.eventLog.max_segments : 0;
132
- for (let segment = maxSegments; segment >= 1; segment -= 1) await appendHistoryFile(sessionEventSegmentPath(record.acpxRecordId, segment), history);
133
- await appendHistoryFile(sessionEventActivePath(record.acpxRecordId), history);
134
- return history;
135
- }
136
120
  function cwdRelativeToHome(cwd, home) {
137
121
  const relative = path.relative(home, cwd);
138
122
  if (relative.length === 0) return ".";
@@ -169,7 +153,7 @@ async function exportSession(sessionLookup, outputPath) {
169
153
  updated_at: record.lastUsedAt,
170
154
  state: serializeSessionRecordForArchive(record, cwdRelative)
171
155
  },
172
- history: await readSessionHistory(record)
156
+ history: await listSessionEvents(record.acpxRecordId, record.eventLog.max_segments)
173
157
  };
174
158
  const target = await resolveExportTarget(outputPath);
175
159
  await writePrivateFile(target, `${JSON.stringify(exported, null, 2)}\n`, { privateDirectory: false });
@@ -418,11 +402,11 @@ let sessionModulePromise;
418
402
  let outputModulePromise;
419
403
  let outputRenderModulePromise;
420
404
  function loadSessionModule() {
421
- sessionModulePromise ??= import("./output-uo5a27KB.js").then((n) => n.i);
405
+ sessionModulePromise ??= import("./output-D2xL6wdp.js").then((n) => n.a);
422
406
  return sessionModulePromise;
423
407
  }
424
408
  function loadOutputModule() {
425
- outputModulePromise ??= import("./output-uo5a27KB.js").then((n) => n.r);
409
+ outputModulePromise ??= import("./output-D2xL6wdp.js").then((n) => n.r);
426
410
  return outputModulePromise;
427
411
  }
428
412
  function loadOutputRenderModule() {
@@ -893,6 +877,26 @@ async function handleSessionsHistory(explicitAgentName, sessionName, flags, comm
893
877
  const globalFlags = resolveGlobalFlags(command, config);
894
878
  printSessionHistoryByFormat(await findScopedSessionOrThrow(resolveAgentInvocation(explicitAgentName, globalFlags, config), sessionName), flags.limit, globalFlags.format);
895
879
  }
880
+ async function handleSessionsWatch(explicitAgentName, flags, command, config) {
881
+ const globalFlags = resolveGlobalFlags(command, config);
882
+ const agent = resolveAgentInvocation(explicitAgentName, globalFlags, config);
883
+ const scope = {
884
+ agentCommand: agent.agentCommand,
885
+ cwd: agent.cwd,
886
+ name: flags.name,
887
+ readOnly: true
888
+ };
889
+ const record = await findSession(scope) ?? await findSession({
890
+ ...scope,
891
+ includeClosed: true
892
+ });
893
+ if (!record) throw new Error(missingScopedSessionMessage(agent, flags.name));
894
+ const { runSessionWatch } = await import("./session-watch-CTe9Bnbc.js");
895
+ await runSessionWatch(record, {
896
+ cursor: flags.cursor,
897
+ policy: resolveRequestedOutputPolicy(globalFlags)
898
+ });
899
+ }
896
900
  async function handleSessionsExport(explicitAgentName, sessionName, flags, command, config) {
897
901
  const globalFlags = resolveGlobalFlags(command, config);
898
902
  const agent = resolveAgentInvocation(explicitAgentName, globalFlags, config);
@@ -2008,6 +2012,9 @@ function registerSessionsCommand(parent, explicitAgentName, config) {
2008
2012
  sessionsCommand.command("read").description("Read full session history").argument("[name]", "Session name", parseSessionName).option("--tail <count>", "Show only the last N entries instead of all history", parseHistoryLimit).action(async function(name, flags) {
2009
2013
  await handleSessionsHistory(explicitAgentName, name, { limit: flags.tail ?? 0 }, this, config);
2010
2014
  });
2015
+ sessionsCommand.command("watch").description("Replay and follow session events without affecting the active turn").option("-s, --name <name>", "Session name", parseSessionName).option("--cursor <cursor>", "Resume after a session watch cursor", (value) => parseNonEmptyValue("Cursor", value)).action(async function(flags) {
2016
+ await handleSessionsWatch(explicitAgentName, flags, this, config);
2017
+ });
2011
2018
  sessionsCommand.command("export").description("Export a portable session archive").argument("[name]", "Session name", parseSessionName).requiredOption("--output <path>", "Output archive path", (value) => parseNonEmptyValue("Output path", value)).addOption(new LocalAttributeOption("--cwd <cwd>", "Session cwd to export", "sourceCwd").argParser((value) => parseNonEmptyValue("Session cwd", value))).action(async function(name, flags) {
2012
2019
  await handleSessionsExport(explicitAgentName, name, flags, this, config);
2013
2020
  });
@@ -2067,7 +2074,7 @@ function registerAgentCommand(program, agentName, config) {
2067
2074
  }
2068
2075
  function registerFlowCommand(program, config) {
2069
2076
  program.command("flow").description("Run multi-step ACP workflows from flow files").command("run").description("Run a flow file").argument("<file>", "Flow module path").option("--input-json <json>", "Flow input as JSON").option("--input-file <path>", "Read flow input JSON from file").option("--default-agent <name>", "Default agent profile for ACP nodes without profile", (value) => parseNonEmptyValue("Default agent", value)).action(async function(file, flags) {
2070
- const { handleFlowRun } = await import("./cli-BkYIxj_N.js");
2077
+ const { handleFlowRun } = await import("./cli-B2ycKzaO.js");
2071
2078
  await handleFlowRun(file, flags, this, config);
2072
2079
  });
2073
2080
  }
@@ -2086,7 +2093,7 @@ function registerDefaultCommands(program, config) {
2086
2093
  registerFlowCommand(program, config);
2087
2094
  }
2088
2095
  //#endregion
2089
- //#region src/cli/queue/owner-input.ts
2096
+ //#region src/session/queue/owner-input.ts
2090
2097
  function asRecord(value) {
2091
2098
  if (!value || typeof value !== "object" || Array.isArray(value)) return;
2092
2099
  return value;