acpx 0.18.0 → 0.19.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/dist/{agent-registry-DdKB-zia.js → agent-registry-DWlx5BQ4.js} +5 -3
  2. package/dist/agent-registry-DWlx5BQ4.js.map +1 -0
  3. package/dist/agent-registry.js +1 -1
  4. package/dist/{cli-8mVHeUXh.js → cli-BerngYEz.js} +5 -5
  5. package/dist/{cli-8mVHeUXh.js.map → cli-BerngYEz.js.map} +1 -1
  6. package/dist/cli.js +77 -53
  7. package/dist/cli.js.map +1 -1
  8. package/dist/{client-DeNKZZcu.d.ts → client-BchvQRpz.d.ts} +17 -4
  9. package/dist/client-BchvQRpz.d.ts.map +1 -0
  10. package/dist/{flows-WOQNzCMC.js → flows-DimX0it5.js} +693 -475
  11. package/dist/flows-DimX0it5.js.map +1 -0
  12. package/dist/flows.d.ts +20 -7
  13. package/dist/flows.d.ts.map +1 -1
  14. package/dist/flows.js +1 -1
  15. package/dist/{invocation-options-B6d7TI-y.js → invocation-options-vobVApfO.js} +32 -11
  16. package/dist/invocation-options-vobVApfO.js.map +1 -0
  17. package/dist/{ipc-BJrvfNXr.js → ipc-DAApJ5mi.js} +1041 -263
  18. package/dist/ipc-DAApJ5mi.js.map +1 -0
  19. package/dist/{output-CL18YmsG.js → output-Cnuji8Bo.js} +41 -20
  20. package/dist/output-Cnuji8Bo.js.map +1 -0
  21. package/dist/{queue-owner-runtime-Cr0dWJuL.js → queue-owner-runtime-C4OOosbo.js} +732 -507
  22. package/dist/queue-owner-runtime-C4OOosbo.js.map +1 -0
  23. package/dist/runtime.d.ts +19 -1
  24. package/dist/runtime.d.ts.map +1 -1
  25. package/dist/runtime.js +48 -29
  26. package/dist/runtime.js.map +1 -1
  27. package/dist/session-options-Dp6mzNSy.d.ts.map +1 -1
  28. package/dist/{session-watch-B8Q_TsGf.js → session-watch-Bj9LoYUq.js} +5 -5
  29. package/dist/session-watch-Bj9LoYUq.js.map +1 -0
  30. package/dist/{watch-Dp73ph8h.js → watch-Cz6jbrRs.js} +2 -2
  31. package/dist/{watch-Dp73ph8h.js.map → watch-Cz6jbrRs.js.map} +1 -1
  32. package/package.json +1 -1
  33. package/skills/acpx/SKILL.md +45 -23
  34. package/dist/agent-registry-DdKB-zia.js.map +0 -1
  35. package/dist/client-DeNKZZcu.d.ts.map +0 -1
  36. package/dist/flows-WOQNzCMC.js.map +0 -1
  37. package/dist/invocation-options-B6d7TI-y.js.map +0 -1
  38. package/dist/ipc-BJrvfNXr.js.map +0 -1
  39. package/dist/output-CL18YmsG.js.map +0 -1
  40. package/dist/queue-owner-runtime-Cr0dWJuL.js.map +0 -1
  41. package/dist/session-watch-B8Q_TsGf.js.map +0 -1
@@ -4,6 +4,7 @@ import path from "node:path";
4
4
  import { execFile } from "node:child_process";
5
5
  //#region src/acp/client-process.ts
6
6
  const PROCESS_HELPER_TIMEOUT_MS = 8e3;
7
+ const PROCESS_HELPER_MAX_BUFFER_BYTES = 33554432;
7
8
  async function runTimedExecFile(command, args, options = {}) {
8
9
  const timeoutMs = Math.max(1, Math.round(options.timeoutMs ?? 8e3));
9
10
  return await new Promise((resolve, reject) => {
@@ -13,7 +14,8 @@ async function runTimedExecFile(command, args, options = {}) {
13
14
  encoding: "utf8",
14
15
  maxBuffer: options.maxBufferBytes ?? 33554432,
15
16
  killSignal: "SIGKILL",
16
- windowsHide: options.windowsHide
17
+ windowsHide: options.windowsHide,
18
+ env: options.env
17
19
  }, (error, stdout) => {
18
20
  if (settled) return;
19
21
  settled = true;
@@ -783,6 +785,6 @@ function normalizeRegistryOverride(value) {
783
785
  return value.length > 0 && value[0]?.length ? [...value] : void 0;
784
786
  }
785
787
  //#endregion
786
- 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 };
788
+ export { requireAgentStdio as A, PROCESS_HELPER_TIMEOUT_MS as C, isoNow as D, isChildProcessRunning as E, waitForChildExit as F, waitForSpawn as I, resolveAgentSessionCwd as M, runTimedExecFile as N, normalizeAgentCommandInput as O, splitCommandLine as P, PROCESS_HELPER_MAX_BUFFER_BYTES as S, basenameToken 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, resolveAgentCommandParts as j, renderArgvIdentity 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, asAbsoluteCwd as w, resolveWindowsExecutablePath as x, buildTerminalSpawnCommand as y };
787
789
 
788
- //# sourceMappingURL=agent-registry-DdKB-zia.js.map
790
+ //# sourceMappingURL=agent-registry-DWlx5BQ4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-registry-DWlx5BQ4.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 env?: NodeJS.ProcessEnv;\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 env: options.env,\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(child: ChildProcess, timeoutMs: number): 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\nfunction findAgentEntry<T>(registry: Record<string, T>, agentName: string): T | undefined {\n const normalized = normalizeAgentName(agentName);\n const canonical = resolveCanonicalAgentName(agentName);\n return Object.hasOwn(registry, normalized)\n ? registry[normalized]\n : Object.hasOwn(registry, canonical)\n ? registry[canonical]\n : undefined;\n}\n\nexport function mergeAgentRegistry(overrides?: Record<string, string>): Record<string, string> {\n if (!overrides) {\n return { ...AGENT_REGISTRY };\n }\n\n const entries = Object.entries(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 entries.push([normalized, command.trim()]);\n }\n return Object.fromEntries(entries);\n}\n\nexport function resolveAgentCommand(agentName: string, overrides?: Record<string, string>): string {\n return findAgentEntry(mergeAgentRegistry(overrides), agentName) ?? agentName;\n}\n\nexport function resolveAgentArgv(agentName: string): string[] | undefined {\n const argv = findAgentEntry(AGENT_ARGV_REGISTRY, 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 override = findAgentEntry(overrides, agentName);\n return override ?? resolveAgentArgv(agentName) ?? resolveAgentCommand(agentName);\n },\n list() {\n return listBuiltInAgents(overrides);\n },\n inspect(agentId) {\n const override = findAgentEntry(overrides, agentId);\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 entries: Array<[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 entries.push([normalizedName, normalizedValue]);\n }\n }\n return Object.fromEntries(entries);\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":";;;;;AAKA,MAAa,4BAA4B;AACzC,MAAa,kCAAkC;AAE/C,eAAsB,iBACpB,SACA,MACA,UAKI,CAAC,GACY;CACjB,MAAM,YAAY,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,aAAA,GAAsC,CAAC;CACxF,OAAO,MAAM,IAAI,SAAiB,SAAS,WAAW;EACpD,IAAI,UAAU;EACd,IAAI;EACJ,MAAM,QAAQ,SACZ,SACA,CAAC,GAAG,IAAI,GACR;GACE,UAAU;GACV,WAAW,QAAQ,kBAAA;GACnB,YAAY;GACZ,aAAa,QAAQ;GACrB,KAAK,QAAQ;EACf,IACC,OAAO,WAAW;GACjB,IAAI,SACF;GAEF,UAAU;GACV,IAAI,OACF,aAAa,KAAK;GAEpB,IAAI,OAAO;IACT,OAAO,KAAK;IACZ;GACF;GACA,QAAQ,MAAM;EAChB,CACF;EAEA,QAAQ,iBAAiB;GACvB,IAAI,SACF;GAEF,UAAU;GACV,MAAM,SAAS,MAAM,KAAK,SAAS;GACnC,MAAM,QAAQ,QAAQ;GACtB,MAAM,QAAQ,QAAQ;GACtB,MAAM,MAAM;GACZ,OACE,OAAO,uBAAO,IAAI,MAAM,GAAG,QAAQ,mBAAmB,UAAU,GAAG,GAAG;IACpE,MAAM;IACN;IACA,QAAQ;GACV,CAAC,CACH;EACF,GAAG,SAAS;CACd,CAAC;AACH;AAOA,SAAgB,2BAA2B,OAGzC;CACA,IAAI,OAAO,UAAU,UACnB,OAAO,EAAE,cAAc,MAAM;CAE/B,MAAM,QAAQ,eAAe,CAAC,GAAG,KAAK,CAAC;CACvC,MAAM,OAAO,CAAC,MAAM,SAAS,GAAG,MAAM,IAAI;CAC1C,OAAO;EACL,cAAc,mBAAmB,IAAI;EACrC,WAAW;CACb;AACF;AAEA,MAAM,uBAAuB;AAE7B,SAAgB,mBAAmB,MAAiC;CAClE,OAAO,KAAK,KAAK,QAAS,qBAAqB,KAAK,GAAG,IAAI,MAAM,KAAK,UAAU,GAAG,CAAE,CAAC,CAAC,KAAK,GAAG;AACjG;AAQA,SAAgB,SAAiB;CAC/B,wBAAO,IAAI,KAAK,EAAA,CAAE,YAAY;AAChC;AAEA,SAAgB,aAAa,OAAoC;CAC/D,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,gBAAgB;GACpB,MAAM,IAAI,SAAS,OAAO;GAC1B,QAAQ;EACV;EACA,MAAM,WAAW,UAAiB;GAChC,MAAM,IAAI,SAAS,OAAO;GAC1B,OAAO,KAAK;EACd;EAEA,MAAM,KAAK,SAAS,OAAO;EAC3B,MAAM,KAAK,SAAS,OAAO;CAC7B,CAAC;AACH;AAEA,SAAgB,sBAAsB,OAA8B;CAClE,OAAO,MAAM,YAAY,QAAQ,MAAM,cAAc;AACvD;AAEA,SAAgB,kBACd,OACmD;CACnD,IAAI,CAAC,MAAM,SAAS,CAAC,MAAM,UAAU,CAAC,MAAM,QAC1C,MAAM,IAAI,MAAM,0DAA0D;CAE5E,OAAO;AACT;AAEA,SAAgB,iBAAiB,OAAqB,WAAqC;CACzF,IAAI,CAAC,sBAAsB,KAAK,GAC9B,OAAO,QAAQ,QAAQ,IAAI;CAG7B,OAAO,IAAI,SAAkB,YAAY;EACvC,IAAI,UAAU;EACd,MAAM,QAAQ,iBACN;GACJ,OAAO,KAAK;EACd,GACA,KAAK,IAAI,GAAG,SAAS,CACvB;EAEA,MAAM,UAAU,UAAmB;GACjC,IAAI,SACF;GAEF,UAAU;GACV,MAAM,IAAI,SAAS,UAAU;GAC7B,MAAM,IAAI,QAAQ,UAAU;GAC5B,aAAa,KAAK;GAClB,QAAQ,KAAK;EACf;EAEA,MAAM,mBAAmB;GACvB,OAAO,IAAI;EACb;EAEA,MAAM,KAAK,SAAS,UAAU;EAC9B,MAAM,KAAK,QAAQ,UAAU;CAC/B,CAAC;AACH;AAEA,SAAgB,yBACd,OACA,MACA,WAA4B,QAAQ,UACtB;CACd,IAAI,MAAM;EACR,MAAM,QAAQ,eAAe,CAAC,GAAG,IAAI,CAAC;EACtC,+BAA+B,MAAM,SAAS,QAAQ;EACtD,OAAO;CACT;CACA,IAAI,aAAa,SACf,MAAM,IAAI,MACR,oRACF;CAEF,OAAO,iBAAiB,KAAK;AAC/B;AAEA,SAAS,+BAA+B,SAAiB,UAAiC;CACxF,IAAI,aAAa,WAAW,KAAK,QAAQ,OAAO,CAAC,CAAC,YAAY,MAAM,OAClE,MAAM,IAAI,MACR,kDAAkD,QAAQ,qFAAqF,QAAQ,sCACzJ;AAEJ;AAUA,SAAgB,iBAAiB,OAA6B;CAC5D,MAAM,QAA0B;EAC9B,SAAS;EACT,OAAO;EACP,UAAU;EACV,OAAO,CAAC;EACR,SAAS;CACX;CACA,KAAK,MAAM,MAAM,OACf,oBAAoB,OAAO,EAAE;CAG/B,IAAI,MAAM,UAAU;EAClB,MAAM,WAAW;EACjB,MAAM,UAAU;CAClB;CACA,IAAI,MAAM,OACR,MAAM,IAAI,MAAM,6CAA6C;CAE/D,qBAAqB,KAAK;CAC1B,OAAO,eAAe,MAAM,KAAK;AACnC;AAEA,SAAS,eAAe,OAA+B;CACrD,IAAI,MAAM,WAAW,KAAK,MAAM,OAAO,IACrC,MAAM,IAAI,MAAM,wCAAwC;CAE1D,OAAO;EACL,SAAS,MAAM;EACf,MAAM,MAAM,MAAM,CAAC;CACrB;AACF;AAEA,SAAS,oBAAoB,OAAyB,IAAkB;CACtE,IAAI,MAAM,UAAU;EAClB,MAAM,WAAW;EACjB,MAAM,WAAW;EACjB,MAAM,UAAU;CAClB,OAAO,IAAI,OAAO,QAAQ,MAAM,UAAU,KACxC,MAAM,WAAW;MACZ,IAAI,MAAM,OAAO;EACtB,IAAI,OAAO,MAAM,OACf,MAAM,QAAQ;OAEd,MAAM,WAAW;EAEnB,MAAM,UAAU;CAClB,OACE,4BAA4B,OAAO,EAAE;AAEzC;AAEA,SAAS,4BAA4B,OAAyB,IAAkB;CAC9E,IAAI,OAAO,OAAO,OAAO,MAAK;EAC5B,MAAM,QAAQ;EACd,MAAM,UAAU;CAClB,OAAO,IAAI,KAAK,KAAK,EAAE,GACrB,qBAAqB,KAAK;MACrB;EACL,MAAM,WAAW;EACjB,MAAM,UAAU;CAClB;AACF;AAEA,SAAS,qBAAqB,OAA+B;CAC3D,IAAI,MAAM,SAAS;EACjB,MAAM,MAAM,KAAK,MAAM,OAAO;EAC9B,MAAM,UAAU;EAChB,MAAM,UAAU;CAClB;AACF;AAEA,SAAgB,cAAc,KAAqB;CACjD,OAAO,KAAK,QAAQ,GAAG;AACzB;AAEA,eAAsB,uBACpB,KACA,cACA,UAAoC,CAAC,GACpB;CACjB,MAAM,WAAW,cAAc,GAAG;CAClC,IAAI,CAAC,6BAA6B,cAAc,OAAO,GACrD,OAAO;CAGT,MAAM,cAAc,OAAO,QAAQ,cAAc,WAAA,CAAY,QAAQ,EAAA,CAAG,KAAK;CAC7E,IAAI,CAAC,YACH,MAAM,IAAI,MAAM,mDAAmD,UAAU;CAE/E,OAAO;AACT;AAEA,SAAS,6BACP,cACA,SACS;CACT,IAAI,CAAC,MAAM,OAAO,GAChB,OAAO;CAGT,IAAI;EACF,MAAM,EAAE,YAAY,iBAAiB,YAAY;EACjD,OAAO,2BAA2B,OAAO;CAC3C,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,MAAM,SAA4C;CAEzD,KADiB,QAAQ,YAAY,QAAQ,cAC5B,SACf,OAAO;CAIT,QADmB,QAAQ,cAAc,GAAG,WAAA,CAC1B,qCAAqC;AACzD;AAEA,MAAM,kCAAkC;AAExC,SAAS,2BAA2B,SAA0B;CAC5D,MAAM,aAAa,QAAQ,YAAY;CACvC,OAAO,gCAAgC,KAAK,UAAU;AACxD;AAEA,eAAe,WAAW,KAA8B;CACtD,OAAO,MAAM,iBAAiB,WAAW,CAAC,MAAM,GAAG,CAAC;AACtD;AAEA,SAAgB,cAAc,OAAuB;CACnD,OAAO,KACJ,SAAS,KAAK,CAAC,CACf,YAAY,CAAC,CACb,QAAQ,qBAAqB,EAAE;AACpC;;;AC5UA,SAAgB,oBAAoB,KAAwB,KAAiC;CAC3F,MAAM,aAAa,OAAO,KAAK,GAAG,CAAC,CAAC,MAAM,UAAU,MAAM,YAAY,MAAM,GAAG;CAC/E,OAAO,aAAa,IAAI,cAAc,KAAA;AACxC;AAEA,SAAS,4BAA4B,KAAkC;CACrE,QAAQ,oBAAoB,KAAK,SAAS,KAAK,sBAAA,CAC5C,MAAM,GAAG,CAAC,CACV,KAAK,UAAU,MAAM,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAC1C,QAAQ,UAAU,MAAM,SAAS,CAAC;AACvC;AAEA,SAAS,kBAAkB,SAAiB,KAAkC;CAE5E,IADyB,KAAK,QAAQ,OACnB,CAAC,CAAC,SAAS,GAC5B,OAAO,CAAC,OAAO;CAEjB,OAAO,4BAA4B,GAAG,CAAC,CAAC,KAAK,cAAc,GAAG,UAAU,WAAW;AACrF;AAEA,SAAS,eAAe,SAA0B;CAChD,OAAO,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,IAAI,KAAK,KAAK,WAAW,OAAO;AACnF;AAEA,SAAS,0BAA0B,SAAiB,KAA4C;CAC9F,MAAM,aAAa,kBAAkB,SAAS,GAAG;CACjD,MAAM,YAAY,oBAAoB,KAAK,MAAM;CACjD,IAAI,CAAC,WACH;CAGF,KAAK,MAAM,aAAa,UAAU,MAAM,GAAG,GAAG;EAC5C,MAAM,WAAW,+BAA+B,WAAW,UAAU;EACrE,IAAI,UACF,OAAO;CAEX;AAGF;AAEA,SAAS,+BACP,WACA,YACoB;CACpB,MAAM,mBAAmB,UAAU,KAAK;CACxC,IAAI,iBAAiB,WAAW,GAC9B;CAGF,OAAO,WACJ,KAAK,cAAc,KAAK,KAAK,kBAAkB,SAAS,CAAC,CAAC,CAC1D,MAAM,aAAa,GAAG,WAAW,QAAQ,CAAC;AAC/C;AAEA,SAAS,2BAA2B,OAAe,aAAyC;CAC1F,MAAM,WAAW,MAAM,MAAM,yBAAyB,CAAC,GAAG,EAAE,EAAE,KAAK;CACnE,IAAI,CAAC,UACH;CAEF,MAAM,YAAY,KAAK,QACrB,KAAK,QAAQ,WAAW,GACxB,SAAS,QAAQ,WAAW,KAAK,GAAG,CAAC,CAAC,QAAQ,WAAW,EAAE,CAC7D;CACA,OAAO,KAAK,QAAQ,SAAS,CAAC,CAAC,YAAY,MAAM,UAAU,GAAG,WAAW,SAAS,IAC9E,YACA,KAAA;AACN;AAEA,SAAS,gCAAgC,aAAyC;CAChF,IAAI,CAAC,GAAG,WAAW,WAAW,GAC5B;CAGF,IAAI;EAEF,OAAO,CAAC,GADQ,GAAG,aAAa,aAAa,MAC5B,CAAC,CAAC,SAAS,gBAAgB,CAAC,CAAC,CAC3C,KAAK,UAAU,2BAA2B,MAAM,MAAM,IAAI,WAAW,CAAC,CAAC,CACvE,MAAM,cAAmC,cAAc,KAAA,CAAS;CACrE,QAAQ;EAEN;CACF;AACF;AAEA,SAAgB,sBACd,SACA,MAAyB,QAAQ,KACb;CACpB,MAAM,aAAa,kBAAkB,SAAS,GAAG;CAEjD,IAAI,eAAe,OAAO,GACxB,OAAO,WAAW,MAAM,cAAc,GAAG,WAAW,SAAS,CAAC;CAGhE,OAAO,0BAA0B,SAAS,GAAG;AAC/C;;;;;;;;AASA,SAAgB,6BACd,SACA,MAAyB,QAAQ,KACb;CACpB,MAAM,WAAW,sBAAsB,SAAS,GAAG;CACnD,IAAI,CAAC,UACH;CAGF,MAAM,WAAW,KAAK,QAAQ,QAAQ;CACtC,MAAM,YAAY,KAAK,QAAQ,QAAQ,CAAC,CAAC,YAAY;CACrD,IAAI,cAAc,QAChB,OAAO;CAET,IAAI,cAAc,UAAU,cAAc,UAAU,cAAc,QAChE;CAGF,MAAM,oBAAoB,GAAG,SAAS,MAAM,GAAG,CAAC,UAAU,MAAM,EAAE;CAClE,OAAO,GAAG,WAAW,iBAAiB,IAClC,oBACA,gCAAgC,QAAQ;AAC9C;AAEA,SAAS,2BACP,SACA,WAA4B,QAAQ,UACpC,MAAyB,QAAQ,KACxB;CACT,IAAI,aAAa,SACf,OAAO;CAET,MAAM,kBAAkB,sBAAsB,SAAS,GAAG,KAAK;CAC/D,MAAM,MAAM,KAAK,QAAQ,eAAe,CAAC,CAAC,YAAY;CACtD,OAAO,QAAQ,UAAU,QAAQ;AACnC;AAQA,MAAM,mBAAmB;AACzB,MAAM,yBAAyB;AAC/B,MAAM,4BAA4B;AAClC,MAAM,cAAc;AAEpB,SAAS,iBAAiB,OAAuB;CAC/C,OAAO,MAAM,QAAQ,kBAAkB,KAAK;AAC9C;AAEA,SAAS,kBAAkB,OAAe,kBAAmC;CAI3E,MAAM,UAAU,IAHG,MAChB,QAAQ,wBAAwB,UAAS,CAAC,CAC1C,QAAQ,2BAA2B,MAAM,EAAE,GACvB,QAAQ,kBAAkB,KAAK;CACtD,OAAO,mBAAmB,QAAQ,QAAQ,kBAAkB,KAAK,IAAI;AACvE;AAEA,SAAgB,uBACd,SACA,MACA,WAA4B,QAAQ,UACpC,MAAyB,QAAQ,KACd;CACnB,IAAI,CAAC,2BAA2B,SAAS,UAAU,GAAG,GACpD,OAAO;EAAE;EAAS,MAAM,CAAC,GAAG,IAAI;CAAE;CAEpC,MAAM,kBAAkB,KAAK,MAAM,UAAU,sBAAsB,SAAS,GAAG,KAAK,OAAO;CAC3F,MAAM,mBAAmB,YAAY,KAAK,eAAe;CACzD,MAAM,eAAe,CACnB,iBAAiB,eAAe,GAChC,GAAG,KAAK,KAAK,QAAQ,kBAAkB,KAAK,gBAAgB,CAAC,CAC/D,CAAC,CAAC,KAAK,GAAG;CACV,OAAO;EACL,SAAS,oBAAoB,KAAK,SAAS,KAAK;EAChD,MAAM;GAAC;GAAM;GAAM;GAAM,IAAI,aAAa;EAAE;EAC5C,0BAA0B;CAC5B;AACF;AAEA,SAAgB,yBACd,SACA,SACA,WAA4B,QAAQ,UACpC,MAAyB,QAAQ,KACJ;CAC7B,IAAI,CAAC,2BAA2B,SAAS,UAAU,GAAG,GACpD,OAAO;CAET,OAAO;EACL,GAAG;EACH,OAAO;CACT;AACF;AAQA,SAAgB,0BACd,SACA,MACsB;CACtB,OAAO;EAAE;EAAS,MAAM,QAAQ,CAAC;EAAG,kBAAkB;CAAM;AAC9D;AAEA,SAAgB,+BACd,SACA,WAA4B,QAAQ,UACd;CACtB,IAAI,aAAa,SACf,OAAO;EAAE,SAAS;EAAW,MAAM;GAAC;GAAM;GAAM;GAAM;EAAO;EAAG,kBAAkB;CAAK;CAEzF,OAAO;EAAE,SAAS;EAAW,MAAM,CAAC,MAAM,OAAO;EAAG,kBAAkB;CAAK;AAC7E;;AAGA,SAAgB,2BAA2B,SAAqC;CAC9E,IAAI,QAAQ,aAAa,SAAS;EAChC,MAAM,WAAW,sBAAsB,OAAO;EAC9C,OAAO,YAAY,GAAG,SAAS,UAAU,EAAE,gBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,IACxE,KAAK,QAAQ,QAAQ,IACrB,KAAA;CACN;CAMA,QALmB,QAAQ,SAAS,GAAG,IACnC,CAAC,KAAK,QAAQ,OAAO,CAAC,KACrB,QAAQ,IAAI,QAAQ,GAAA,CAClB,MAAM,KAAK,SAAS,CAAC,CACrB,KAAK,cAAc,KAAK,QAAQ,WAAW,OAAO,CAAC,EAAA,CACxC,MAAM,cAAc;EACpC,IAAI;GACF,GAAG,WAAW,WAAW,GAAG,UAAU,IAAI;GAC1C,OAAO,GAAG,SAAS,SAAS,CAAC,CAAC,OAAO;EACvC,QAAQ;GACN,OAAO;EACT;CACF,CAAC;AACH;;;ACpPA,MAAM,6BAA6B;CACjC,IAAI;CACJ,OAAO;CACP,QAAQ;CACR,KAAK;AACP;AAsCA,MAAM,oBAAqD;CACzD,IAAI;EACF,MAAM;EACN,MAAM,CAAC,OAAO,UAAU,2BAA2B,IAAI;EACvD,eAAe,CAAC,QAAQ;EACxB,kBAAkB,CAAC,IAAI;EACvB,SAAS;GACP,aAAa;GACb,cAAc,2BAA2B;GACzC,kBAAkB;EACpB;CACF;CACA,UAAU;EAAE,MAAM;EAAY,MAAM,CAAC,YAAY,KAAK;CAAE;CACxD,OAAO;EACL,MAAM;EACN,MAAM;GAAC;GAAO;GAAM,kCAAkC,2BAA2B;EAAO;EACxF,eAAe,CAAC,WAAW;EAC3B,SAAS;GACP,aAAa;GACb,cAAc,2BAA2B;GACzC,kBAAkB;GAClB,wBAAwB,CAAC;EAC3B;EACA,qBAAqB;CACvB;CACA,QAAQ;EACN,MAAM;EACN,MAAM;GACJ;GACA;GACA,yCAAyC,2BAA2B;EACtE;EACA,eAAe,CAAC,kBAAkB;EAClC,SAAS;GACP,aAAa;GACb,cAAc,2BAA2B;GACzC,kBAAkB;GAClB,wBAAwB,CACtB,kDAAkD,2BAA2B,QAC/E;EACF;EACA,qBAAqB;CACvB;CACA,QAAQ;EAAE,MAAM;EAAc,MAAM,CAAC,UAAU,OAAO;CAAE;CACxD,QAAQ;EAAE,MAAM;EAAU,MAAM,CAAC,gBAAgB,KAAK;CAAE;CACxD,SAAS;EAAE,MAAM;EAAkB,MAAM;GAAC;GAAW;GAAS;EAAS;CAAE;CACzE,aAAa;EACX,MAAM;EACN,MACE,QAAQ,aAAa,UACjB,CAAC,oBAAoB,IACrB,CAAC,sBAAsB,GAAI,QAAQ,aAAa,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAE;CAClF;CACA,OAAO;EAAE,MAAM;EAAS,MAAM,CAAC,SAAS,KAAK;CAAE;CAC/C,OAAO;EAAE,MAAM;EAAiB,MAAM;GAAC;GAAS;GAAQ;GAAmB;EAAK;CAAE;CAClF,cAAc;EAAE,MAAM;EAAc,MAAM;GAAC;GAAO;GAAkB;EAAK;CAAE;CAC3E,IAAI;EAAE,MAAM;EAAM,MAAM,CAAC,MAAM,KAAK;CAAE;CACtC,cAAc;EAAE,MAAM;EAAc,MAAM;GAAC;GAAQ;GAAS;EAAO;CAAE;CACrE,OAAO;EAAE,MAAM;EAAS,MAAM,CAAC,SAAS,oBAAoB;CAAE;CAC9D,OAAO;EAAE,MAAM;EAAS,MAAM,CAAC,SAAS,YAAY;CAAE;CACtD,UAAU;EACR,MAAM;EACN,MAAM;GAAC;GAAO;GAAM;GAAiB;EAAK;EAC1C,eAAe,CAAC,QAAQ,KAAK;CAC/B;CACA,MAAM;EAAE,MAAM;EAAa,MAAM,CAAC,QAAQ,KAAK;CAAE;CACjD,MAAM;EAAE,MAAM;EAAQ,MAAM,CAAC,iBAAiB,KAAK;CAAE;CACrD,OAAO;EAAE,MAAM;EAAS,MAAM,CAAC,SAAS,KAAK;CAAE;CAC/C,KAAK;EAAE,MAAM;EAAO,MAAM;GAAC;GAAO;GAAM,OAAO,2BAA2B;GAAO;EAAK;CAAE;CACxF,UAAU;EACR,MAAM;EACN,MAAM;GAAC;GAAO;GAAM;GAAe;EAAK;EACxC,eAAe,CAAC,YAAY,KAAK;CACnC;CACA,MAAM;EAAE,MAAM;EAAY,MAAM,CAAC,QAAQ,KAAK;CAAE;CAChD,OAAO;EAAE,MAAM;EAAS,MAAM,CAAC,YAAY,OAAO;CAAE;CACpD,MAAM;EAAE,MAAM;EAAa,MAAM,CAAC,QAAQ,OAAO;CAAE;CACnD,MAAM;EAAE,MAAM;EAAQ,MAAM;GAAC;GAAW;GAAO;EAAO;CAAE;CACxD,UAAU;EAAE,MAAM;EAAY,MAAM,CAAC,YAAY,KAAK;CAAE;AAC1D;AAEA,MAAa,sBAAgD,OAAO,YAClE,OAAO,QAAQ,iBAAiB,CAAC,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,GAAG,WAAW,IAAI,CAAC,CAAC,CACxF;AACA,MAAa,iBAAyC,OAAO,YAC3D,OAAO,QAAQ,iBAAiB,CAAC,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC,IAAI,WAAW,KAAK,KAAK,GAAG,CAAC,CAAC,CAC7F;AACA,MAAa,0BAAmE,OAAO,YACrF,OAAO,QAAQ,iBAAiB,CAAC,CAAC,SAAS,CAAC,IAAI,gBAC9C,WAAW,uBAAuB,WAAW,UACzC,CAAC,CAAC,IAAI;CAAE,GAAG,WAAW;CAAS,iBAAiB,WAAW,KAAK,KAAK,GAAG;AAAE,CAAC,CAAC,IAC5E,CAAC,CACP,CACF;AAeA,SAAS,mBAAmB,MAAyB;CACnD,MAAM,UAAU,KAAK,MAClB,SAAS,KAAK,EAAE,CAAC,CACjB,YAAY,CAAC,CACb,QAAQ,oBAAoB,EAAE;CACjC,IAAI;EAAC;EAAO;EAAO;EAAO;EAAQ;CAAM,CAAC,CAAC,SAAS,OAAO,GACxD,OAAO;CAET,QAAQ,SAAR;EACE,KAAK,OACH,OAAO,KAAK,OAAO;EACrB,KAAK,MACH,OAAO,KAAK,OAAO,UAAU,KAAK,OAAO;EAC3C,KAAK,QACH,OAAO,wBAAwB,KAAK,KAAK,MAAM,EAAE;EACnD,SACE,OAAO;CACX;AACF;AAEA,SAAS,qBACP,IACA,UAC6B;CAC7B,MAAM,aAAa,OAAO,OAAO,mBAAmB,EAAE,IAAI,kBAAkB,MAAM,KAAA;CAClF,IAAI,CAAC,UACH,OAAO;CAET,IAAI,OAAO;CACX,IAAI,OAAO,SAAS,UAAU;EAC5B,MAAM,SAAS,iBAAiB,IAAI;EACpC,OAAO,CAAC,OAAO,SAAS,GAAG,OAAO,IAAI;CACxC;CACA,OAAO;EAAE,MAAM,YAAY,QAAQ;EAAI;CAAK;AAC9C;AAEA,SAAS,aACP,SACA,UACA,UAAqC,CAAC,GACN;CAChC,MAAM,KAAK,0BAA0B,OAAO;CAC5C,MAAM,aAAa,qBAAqB,IAAI,QAAQ;CACpD,IAAI,CAAC,YACH;CAEF,MAAM,OAAO,WAAW,iBAAiB,WAAW;CACpD,IAAI,mBAAmB,IAAI,GACzB;CAKF,MAAM,SAAS,cAAc,MAHhB,WAAW,UACpB;EAAE,GAAG,WAAW;EAAS,iBAAiB,WAAW,KAAK,KAAK,GAAG;CAAE,IACpE,KAAA,GACqC,OAAO;CAChD,OAAO;EACL;EACA,MAAM,WAAW;EACjB,QAAQ,qBAAqB,QAAQ,WAAW,oBAAoB,CAAC,GAAG,OAAO;CACjF;AACF;AAEA,SAAS,qBACP,QACA,kBACA,SAC8B;CAC9B,MAAM,oBAAoB,QAAQ,qBAAqB;CACvD,MAAM,kBAAkB,iBACrB,QAAQ,YAAY,CAAC,kBAAkB,OAAO,CAAC,CAAC,CAChD,KAAK,UAAU;EAAE,MAAM;EAAoB;CAAK,EAAE;CACrD,IAAI,gBAAgB,WAAW,GAC7B,OAAO;CAET,OAAO;EACL,MAAM;EACN,cAAc,CAAC,GAAI,OAAO,SAAS,YAAY,OAAO,eAAe,CAAC,GAAI,GAAG,eAAe;CAC9F;AACF;AAEA,SAAS,cACP,MACA,MACA,SAC8B;CAC9B,MAAM,WAAW,QAAQ,qBAAqB,2BAAA,CAA4B,KAAK,EAAE;CACjF,IAAI,SACF,OAAO;EAAE,MAAM;EAAa,MAAM,CAAC,SAAS,GAAG,KAAK,MAAM,CAAC,CAAC;CAAE;CAEhE,IAAI,CAAC,MACH,OAAO;EAAE,MAAM;EAAW,cAAc,CAAC;GAAE,MAAM;GAAW,MAAM,KAAK;EAAG,CAAC;CAAE;CAE/E,MAAM,YAAY,0CAA0C,MAAM,OAAO;CACzE,OAAO,YACH;EAAE,MAAM;EAAa,MAAM,CAAC,UAAU,SAAS,GAAG,UAAU,IAAI;CAAE,IAClE;EAAE,MAAM;EAAW,cAAc,CAAC;GAAE,MAAM;GAAW,MAAM,KAAK;EAAY,CAAC;CAAE;AACrF;AAEA,MAAM,gBAAwC;CAC5C,iBAAiB;CACjB,cAAc;AAChB;AAEA,MAAa,qBAAqB;AAElC,SAAgB,mBAAmB,OAAuB;CACxD,OAAO,MAAM,KAAK,CAAC,CAAC,YAAY;AAClC;AAEA,SAAgB,0BAA0B,OAAuB;CAC/D,MAAM,aAAa,mBAAmB,KAAK;CAC3C,OAAO,OAAO,OAAO,eAAe,UAAU,IAAI,cAAc,cAAc;AAChF;AAEA,SAAS,eAAkB,UAA6B,WAAkC;CACxF,MAAM,aAAa,mBAAmB,SAAS;CAC/C,MAAM,YAAY,0BAA0B,SAAS;CACrD,OAAO,OAAO,OAAO,UAAU,UAAU,IACrC,SAAS,cACT,OAAO,OAAO,UAAU,SAAS,IAC/B,SAAS,aACT,KAAA;AACR;AAEA,SAAgB,mBAAmB,WAA4D;CAC7F,IAAI,CAAC,WACH,OAAO,EAAE,GAAG,eAAe;CAG7B,MAAM,UAAU,OAAO,QAAQ,cAAc;CAC7C,KAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,SAAS,GAAG;EACvD,MAAM,aAAa,mBAAmB,IAAI;EAC1C,IAAI,CAAC,cAAc,CAAC,QAAQ,KAAK,GAC/B;EAEF,QAAQ,KAAK,CAAC,YAAY,QAAQ,KAAK,CAAC,CAAC;CAC3C;CACA,OAAO,OAAO,YAAY,OAAO;AACnC;AAEA,SAAgB,oBAAoB,WAAmB,WAA4C;CACjG,OAAO,eAAe,mBAAmB,SAAS,GAAG,SAAS,KAAK;AACrE;AAEA,SAAgB,iBAAiB,WAAyC;CACxE,MAAM,OAAO,eAAe,qBAAqB,SAAS;CAC1D,OAAO,OAAO,CAAC,GAAG,IAAI,IAAI,KAAA;AAC5B;AAEA,SAAgB,wBAAwB,cAA2D;CACjG,MAAM,aAAa,aAAa,KAAK;CAErC,OAD6B,OAAO,OAAO,uBACjB,CAAC,CAAC,MACzB,SACC,KAAK,oBAAoB,cAAc,KAAK,wBAAwB,SAAS,UAAU,CAC3F;AACF;AAEA,SAAS,0BAA0B,aAA6B;CAC9D,MAAM,WAAW,YAAY,MAAM,GAAG;CACtC,IAAI,SAAS,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;CAExD,OAAO,MAAM;EACX,MAAM,gBAAgB,KAAK,KAAK,QAAQ,gBAAgB,GAAG,QAAQ;EACnE,MAAM,eAAe,KAAK,KAAK,eAAe,cAAc;EAC5D,IAAI,GAAG,WAAW,YAAY,GAC5B,IAAI;GAIF,IAHe,KAAK,MAAM,GAAG,aAAa,cAAc,MAAM,CAGrD,CAAC,CAAC,SAAS,aAClB,OAAO;EAEX,QAAQ,CAER;EAGF,MAAM,SAAS,KAAK,QAAQ,MAAM;EAClC,IAAI,WAAW,QACb,MAAM,IAAI,MAAM,qCAAqC,aAAa;EAEpE,SAAS;CACX;AACF;AAEA,SAAS,kBACP,MACA,UAGoB;CACpB,IAAI,OAAO,SAAS,QAAQ,UAC1B,OAAO,SAAS;CAElB,IAAI,CAAC,SAAS,OAAO,OAAO,SAAS,QAAQ,UAC3C;CAEF,OACE,SAAS,IAAI,KAAK,sBACjB,OAAO,KAAK,SAAS,GAAG,CAAC,CAAC,WAAW,IAAI,OAAO,OAAO,SAAS,GAAG,CAAC,CAAC,KAAK,KAAA;AAE/E;AAEA,SAAS,yBAAyB,UAA0B;CAC1D,MAAM,YAAY,KAAK,QACrB,KAAK,QAAQ,QAAQ,GACrB,MACA,OACA,gBACA,OACA,OACA,YACF;CACA,IAAI,CAAC,GAAG,WAAW,SAAS,GAC1B,MAAM,IAAI,MAAM,mCAAmC,UAAU;CAE/D,OAAO;AACT;AAEA,SAAgB,mCACd,cACA,UAAwC,CAAC,GACT;CAChC,MAAM,OAAO,wBAAwB,YAAY;CACjD,IAAI,CAAC,MACH;CAGF,OAAO,0CAA0C,MAAM,OAAO;AAChE;AAEA,SAAS,0CACP,MACA,SACgC;CAChC,MAAM,eAAe,QAAQ,gBAAgB,GAAG;CAChD,MAAM,aAAa,QAAQ,cAAc,GAAG;CAC5C,MAAM,qBAAqB,QAAQ,sBAAsB;CAEzD,IAAI;EACF,MAAM,WAAW,oCAAoC,MAAM;GACzD;GACA;GACA;EACF,CAAC;EACD,IAAI,CAAC,UACH;EAGF,OAAO;GACL,QAAQ;GACR,SAAS,QAAQ;GACjB,MAAM,CAAC,SAAS,OAAO;GACvB,aAAa,KAAK;GAClB,cAAc,KAAK;GACnB,gBAAgB,SAAS;GACzB,SAAS,SAAS;EACpB;CACF,QAAQ;EACN;CACF;AACF;AAEA,SAAS,oCACP,MACA,SAG0D;CAC1D,MAAM,cAAc,QAAQ,mBAAmB,KAAK,WAAW;CAC/D,IAAI,CAAC,aACH;CAEF,MAAM,WAAW,KAAK,MACpB,QAAQ,aAAa,KAAK,KAAK,aAAa,cAAc,GAAG,MAAM,CACrE;CAKA,IAAI,SAAS,SAAS,KAAK,aACzB;CAGF,MAAM,kBAAkB,kBAAkB,MAAM,QAAQ;CACxD,IAAI,CAAC,iBACH;CAGF,MAAM,UAAU,KAAK,QAAQ,aAAa,eAAe;CACzD,OAAO,QAAQ,WAAW,OAAO,IAAI;EAAE,gBAAgB,SAAS;EAAS;CAAQ,IAAI,KAAA;AACvF;AAEA,SAAgB,qCACd,cACA,UAAwC,CAAC,GACT;CAChC,MAAM,OAAO,wBAAwB,YAAY;CACjD,IAAI,CAAC,MACH;CAGF,MAAM,aAAa,QAAQ,cAAc,GAAG;CAC5C,MAAM,WAAW,QAAQ,YAAY,QAAQ;CAC7C,MAAM,oBAAoB,QAAQ,qBAAqB;CAEvD,IAAI;EACF,MAAM,aAAa,kBAAkB,QAAQ;EAC7C,IAAI,CAAC,WAAW,UAAU,GACxB;EAGF,OAAO;GACL,QAAQ;GACR,SAAS;GACT,MAAM;IACJ;IACA;IACA;IACA,aAAa,KAAK,YAAY,GAAG,KAAK;IACtC;IACA,KAAK;GACP;GACA,aAAa,KAAK;GAClB,cAAc,KAAK;GACnB;EACF;CACF,QAAQ;EACN;CACF;AACF;AAEA,SAAgB,0BACd,cACA,UAAwC,CAAC,GACT;CAChC,OACE,mCAAmC,cAAc,OAAO,KACxD,qCAAqC,cAAc,OAAO;AAE9D;AAEA,SAAgB,kBAAkB,WAA+C;CAC/E,OAAO,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,cAAc,GAAG,GAAG,OAAO,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AACvF;AAWA,SAAgB,oBACd,QAG6B;CAC7B,MAAM,YAAY,2BAA2B,QAAQ,SAAS;CAC9D,OAAO;EACL,QAAQ,WAAmB;GAEzB,OADiB,eAAe,WAAW,SAC7B,KAAK,iBAAiB,SAAS,KAAK,oBAAoB,SAAS;EACjF;EACA,OAAO;GACL,OAAO,kBAAkB,SAAS;EACpC;EACA,QAAQ,SAAS;GAEf,OAAO,aAAa,SADH,eAAe,WAAW,OACP,GAAG,MAAM;EAC/C;CACF;AACF;AAEA,SAAS,2BACP,QACmC;CACnC,MAAM,UAA8C,CAAC;CACrD,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,UAAU,CAAC,CAAC,GAAG;EACxD,MAAM,iBAAiB,mBAAmB,IAAI;EAC9C,IAAI,CAAC,gBACH;EAEF,MAAM,kBAAkB,0BAA0B,KAAK;EACvD,IAAI,iBACF,QAAQ,KAAK,CAAC,gBAAgB,eAAe,CAAC;CAElD;CACA,OAAO,OAAO,YAAY,OAAO;AACnC;AAEA,SAAS,0BAA0B,OAAyD;CAC1F,IAAI,OAAO,UAAU,UACnB,OAAO,MAAM,KAAK,KAAK,KAAA;CAEzB,OAAO,MAAM,SAAS,KAAK,MAAM,EAAE,EAAE,SAAS,CAAC,GAAG,KAAK,IAAI,KAAA;AAC7D"}
@@ -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-DdKB-zia.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-DWlx5BQ4.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,7 +1,7 @@
1
- import { mt as writePrivateFile } from "./ipc-BJrvfNXr.js";
2
- import { et as permissionModeSatisfies } from "./queue-owner-runtime-Cr0dWJuL.js";
3
- import { C as resolvePermissionMode, S as resolveOutputPolicy, b as resolveAgentInvocation, l as hasExplicitPermissionModeFlag, t as resolvePermissionPolicyFromFlags, x as resolveGlobalFlags } from "./invocation-options-B6d7TI-y.js";
4
- import { c as validateFlowDefinition, h as isDefinedFlow, o as FlowRunner } from "./flows-WOQNzCMC.js";
1
+ import { _t as writePrivateFile } from "./ipc-DAApJ5mi.js";
2
+ import { tt as permissionModeSatisfies } from "./queue-owner-runtime-C4OOosbo.js";
3
+ import { C as resolvePermissionMode, S as resolveOutputPolicy, b as resolveAgentInvocation, l as hasExplicitPermissionModeFlag, t as resolvePermissionPolicyFromFlags, x as resolveGlobalFlags } from "./invocation-options-vobVApfO.js";
4
+ import { c as validateFlowDefinition, h as isDefinedFlow, o as FlowRunner } from "./flows-DimX0it5.js";
5
5
  import { fileURLToPath, pathToFileURL } from "node:url";
6
6
  import path from "node:path";
7
7
  import { InvalidArgumentError } from "commander";
@@ -189,4 +189,4 @@ function printFlowRunResult(result, globalFlags) {
189
189
  //#endregion
190
190
  export { handleFlowRun };
191
191
 
192
- //# sourceMappingURL=cli-8mVHeUXh.js.map
192
+ //# sourceMappingURL=cli-BerngYEz.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-8mVHeUXh.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-BerngYEz.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.js CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
- import { n as getTextErrorRemediationHints, o as __exportAll, t as createOutputFormatter } from "./output-CL18YmsG.js";
3
- import { At as AcpxOperationalError, B as serializeSessionRecordForDisk, D as findGitRepositoryRoot, Et as OUTPUT_FORMATS, H as normalizeAgentSessionId, L as writeSessionRecord, Mt as AgentSpawnError, N as normalizeName, O as findSession, S as parsePromptSource, St as EXIT_CODES, dt as sessionEventActivePath, ft as sessionEventLockPath, gt as isProcessAlive, j as listSessions, k as findSessionByDirectoryWalk, lt as defaultSessionEventLog, mt as writePrivateFile, u as probeQueueOwnerHealth, w as textPrompt, x as mergePromptSourceWithText, y as PromptInputValidationError, z as parseSessionRecord } from "./ipc-BJrvfNXr.js";
4
- import { $ as getAcpxVersion, at as InterruptedError, d as flushPerfMetricsCapture, dt as normalizeOutputError, f as installPerfMetricsCapture, i as runOnce, it as isLegacyZedCodexAcpInvocation, n as runSessionQueueOwner, ot as TimeoutError, rt as listSessionEvents, s as DISCARD_OUTPUT_FORMATTER, u as buildQueueOwnerArgOverride, ut as exitCodeForOutputErrorCode } from "./queue-owner-runtime-Cr0dWJuL.js";
5
- import { O as renderArgvIdentity, i as DEFAULT_AGENT_NAME, l as normalizeAgentName$1, s as listBuiltInAgents } from "./agent-registry-DdKB-zia.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-B6d7TI-y.js";
2
+ import { n as getTextErrorRemediationHints, o as __exportAll, t as createOutputFormatter } from "./output-Cnuji8Bo.js";
3
+ import { A as findGitRepositoryRoot, B as writeSessionRecord, D as textPrompt, G as normalizeAgentSessionId, H as parseSessionRecord, I as normalizeName, M as findSessionByDirectoryWalk, Mt as AcpxOperationalError, Ot as OUTPUT_FORMATS, P as listSessions, Pt as AgentSpawnError, S as PromptInputValidationError, T as parsePromptSource, U as serializeSessionRecordForDisk, _t as writePrivateFile, ft as defaultSessionEventLog, ht as sessionEventLockPath, j as findSession, mt as sessionEventActivePath, u as probeQueueOwnerHealth, w as mergePromptSourceWithText, wt as EXIT_CODES, yt as isProcessAlive } from "./ipc-DAApJ5mi.js";
4
+ import { at as isLegacyZedCodexAcpInvocation, d as flushPerfMetricsCapture, dt as exitCodeForOutputErrorCode, et as getAcpxVersion, f as installPerfMetricsCapture, ft as normalizeOutputError, i as runOnce, it as listSessionEvents, n as runSessionQueueOwner, ot as InterruptedError, s as DISCARD_OUTPUT_FORMATTER, st as TimeoutError, u as buildQueueOwnerArgOverride } from "./queue-owner-runtime-C4OOosbo.js";
5
+ import { i as DEFAULT_AGENT_NAME, k as renderArgvIdentity, l as normalizeAgentName$1, s as listBuiltInAgents } from "./agent-registry-DWlx5BQ4.js";
6
+ import { C as resolvePermissionMode, D as toTimerMilliseconds, E as resolveSessionsListFlags, S as resolveOutputPolicy, T as resolveSessionNameFromFlags, _ 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 resolvePromptFlags, x as resolveGlobalFlags, y as parseTtlSeconds } from "./invocation-options-vobVApfO.js";
7
7
  import { realpathSync } from "node:fs";
8
8
  import { fileURLToPath, pathToFileURL } from "node:url";
9
9
  import path from "node:path";
@@ -402,11 +402,11 @@ let sessionModulePromise;
402
402
  let outputModulePromise;
403
403
  let outputRenderModulePromise;
404
404
  function loadSessionModule() {
405
- sessionModulePromise ??= import("./output-CL18YmsG.js").then((n) => n.a);
405
+ sessionModulePromise ??= import("./output-Cnuji8Bo.js").then((n) => n.a);
406
406
  return sessionModulePromise;
407
407
  }
408
408
  function loadOutputModule() {
409
- outputModulePromise ??= import("./output-CL18YmsG.js").then((n) => n.r);
409
+ outputModulePromise ??= import("./output-Cnuji8Bo.js").then((n) => n.r);
410
410
  return outputModulePromise;
411
411
  }
412
412
  function loadOutputRenderModule() {
@@ -483,11 +483,12 @@ async function findRoutedSessionOrThrow(agentCommand, agentName, cwd, sessionNam
483
483
  throw new NoSessionError(`⚠ No acpx session found (searched up to ${walkBoundary}).\nCreate one: ${sessionName ? `acpx ${agentName} sessions new --name ${sessionName}` : `acpx ${agentName} sessions new`}`);
484
484
  }
485
485
  async function handlePrompt(explicitAgentName, promptParts, flags, command, config) {
486
+ const promptFlags = resolvePromptFlags(flags, command);
486
487
  const globalFlags = resolveGlobalFlags(command, config);
487
488
  const outputPolicy = resolveRequestedOutputPolicy(globalFlags);
488
489
  const permissionMode = resolvePermissionMode(globalFlags, config.defaultPermissions);
489
490
  const permissionPolicy = await resolvePermissionPolicyFromFlags(globalFlags);
490
- const prompt = await readPromptInput(flags.file, promptParts.join(" "), globalFlags.cwd);
491
+ const prompt = await readPromptInput(promptFlags.file, promptParts.join(" "), globalFlags.cwd);
491
492
  const agent = resolveAgentInvocation(explicitAgentName, globalFlags, config);
492
493
  const [{ createOutputFormatter }, { printPromptSessionBanner, printQueuedPromptByFormat }, { sendSession }] = await Promise.all([
493
494
  loadOutputModule(),
@@ -514,7 +515,7 @@ async function handlePrompt(explicitAgentName, promptParts, flags, command, conf
514
515
  ttlMs: globalFlags.ttl,
515
516
  maxQueueDepth: config.queueMaxDepth,
516
517
  promptRetries: globalFlags.promptRetries,
517
- waitForCompletion: flags.wait !== false,
518
+ waitForCompletion: promptFlags.wait,
518
519
  sessionOptions: sessionOptionsFromGlobalFlags(globalFlags)
519
520
  });
520
521
  if ("queued" in result) {
@@ -525,24 +526,15 @@ async function handlePrompt(explicitAgentName, promptParts, flags, command, conf
525
526
  if (globalFlags.verbose && result.loadError) process.stderr.write(`[acpx] session reconnect failed, started fresh session: ${result.loadError}\n`);
526
527
  }
527
528
  async function handleExec(explicitAgentName, promptParts, flags, command, config) {
528
- if (config.disableExec) {
529
- if (resolveRequestedOutputPolicy(resolveGlobalFlags(command, config)).format === "json") process.stdout.write(`${JSON.stringify({
530
- jsonrpc: "2.0",
531
- error: {
532
- code: -32603,
533
- message: "exec subcommand is disabled by configuration (disableExec: true)",
534
- data: { acpxCode: "EXEC_DISABLED" }
535
- }
536
- })}\n`);
537
- else process.stderr.write("Error: exec subcommand is disabled by configuration (disableExec: true)\n");
538
- process.exitCode = 1;
539
- return;
540
- }
541
529
  const globalFlags = resolveGlobalFlags(command, config);
530
+ if (config.disableExec) throw new AcpxOperationalError("exec subcommand is disabled by configuration (disableExec: true)", {
531
+ outputCode: "EXEC_DISABLED",
532
+ origin: "cli"
533
+ });
542
534
  const outputPolicy = resolveRequestedOutputPolicy(globalFlags);
543
535
  const permissionMode = resolvePermissionMode(globalFlags, config.defaultPermissions);
544
536
  const permissionPolicy = await resolvePermissionPolicyFromFlags(globalFlags);
545
- const prompt = await readPromptInput(flags.file, promptParts.join(" "), globalFlags.cwd);
537
+ const prompt = await readPromptInput(resolvePromptFlags(flags, command).file, promptParts.join(" "), globalFlags.cwd);
546
538
  const [{ createOutputFormatter }, { runOnce }] = await Promise.all([loadOutputModule(), loadSessionModule()]);
547
539
  const outputFormatter = createOutputFormatter(outputPolicy.format, { suppressReads: outputPolicy.suppressReads });
548
540
  const agent = resolveAgentInvocation(explicitAgentName, globalFlags, config);
@@ -694,17 +686,18 @@ async function tryListAgentSessions(agent, flags, globalFlags, config) {
694
686
  }
695
687
  }
696
688
  async function handleSessionsList(explicitAgentName, flags, command, config) {
689
+ const listFlags = resolveSessionsListFlags(flags, command);
697
690
  const globalFlags = resolveGlobalFlags(command, config);
698
691
  const agent = resolveAgentInvocation(explicitAgentName, globalFlags, config);
699
- const filterCwd = resolveSessionListFilterCwd(flags, agent.cwd);
700
- if (flags.local) {
701
- if (flags.cursor) throw new InvalidArgumentError("--cursor cannot be combined with --local");
692
+ const filterCwd = resolveSessionListFilterCwd(listFlags, agent.cwd);
693
+ if (listFlags.local) {
694
+ if (listFlags.cursor) throw new InvalidArgumentError("--cursor cannot be combined with --local");
702
695
  await printLocalSessionsList(agent.agentCommand, filterCwd, globalFlags.format);
703
696
  return;
704
697
  }
705
- const [result, { printAgentSessionsByFormat }] = await Promise.all([tryListAgentSessions(agent, flags, globalFlags, config), loadOutputRenderModule()]);
698
+ const [result, { printAgentSessionsByFormat }] = await Promise.all([tryListAgentSessions(agent, listFlags, globalFlags, config), loadOutputRenderModule()]);
706
699
  if (!result || result === "spawn-failed") {
707
- if (result !== "spawn-failed" && (flags.cursor || flags.filterCwd)) throw new Error(`Agent command "${agent.agentCommand}" does not advertise sessionCapabilities.list; cannot use agent-side session/list filters`);
700
+ if (result !== "spawn-failed" && (listFlags.cursor || listFlags.filterCwd)) throw new Error(`Agent command "${agent.agentCommand}" does not advertise sessionCapabilities.list; cannot use agent-side session/list filters`);
708
701
  await printLocalSessionsList(agent.agentCommand, void 0, globalFlags.format);
709
702
  return;
710
703
  }
@@ -880,18 +873,19 @@ async function handleSessionsHistory(explicitAgentName, sessionName, flags, comm
880
873
  async function handleSessionsWatch(explicitAgentName, flags, command, config) {
881
874
  const globalFlags = resolveGlobalFlags(command, config);
882
875
  const agent = resolveAgentInvocation(explicitAgentName, globalFlags, config);
876
+ const sessionName = resolveSessionNameFromFlags({ session: flags.name }, command);
883
877
  const scope = {
884
878
  agentCommand: agent.agentCommand,
885
879
  cwd: agent.cwd,
886
- name: flags.name,
880
+ name: sessionName,
887
881
  readOnly: true
888
882
  };
889
883
  const record = await findSession(scope) ?? await findSession({
890
884
  ...scope,
891
885
  includeClosed: true
892
886
  });
893
- if (!record) throw new Error(missingScopedSessionMessage(agent, flags.name));
894
- const { runSessionWatch } = await import("./session-watch-B8Q_TsGf.js");
887
+ if (!record) throw new Error(missingScopedSessionMessage(agent, sessionName));
888
+ const { runSessionWatch } = await import("./session-watch-Bj9LoYUq.js");
895
889
  await runSessionWatch(record, {
896
890
  cursor: flags.cursor,
897
891
  policy: resolveRequestedOutputPolicy(globalFlags)
@@ -956,19 +950,30 @@ function addCompareOptions(command) {
956
950
  return command.option("--cwd <dir>", "Target workspace").option("--approve-all", "Auto-approve all permission requests").option("--approve-reads", "Auto-approve read/search requests and prompt for writes").option("--deny-all", "Deny all permission requests").option("--timeout <seconds>", "Per-agent timeout in seconds", parseTimeoutSeconds).option("--format <fmt>", "Output format: text, json, quiet", parseOutputFormat$1).option("--json", "Alias for --format json").option("-f, --file <path>", "Read prompt text from file path (use - for stdin)", (value) => parseNonEmptyValue("Prompt file", value)).option("--prompt-file <path>", "Alias for --file", (value) => parseNonEmptyValue("Prompt file", value));
957
951
  }
958
952
  const VALUE_FLAGS = new Set(addCompareOptions(new Command()).options.filter((option) => option.required).flatMap((option) => [option.long, option.short].filter((flag) => flag !== void 0)));
953
+ function captureCompareOutputFlag(output, token, nextToken) {
954
+ if (token === "--json") output.json = true;
955
+ else if (token === "--format") output.format = nextToken;
956
+ else if (token.startsWith("--format=")) output.format = token.slice(9);
957
+ }
959
958
  function scanCompareArgs(argv) {
960
959
  let cwd;
960
+ const output = {};
961
961
  for (let index = 0; index < argv.length; index += 1) {
962
962
  const token = argv[index];
963
963
  if (token === "--") return {
964
964
  cwd,
965
+ ...output,
965
966
  promptTokens: argv.slice(index + 1)
966
967
  };
967
968
  if (token === "--cwd") cwd = argv[index + 1];
968
969
  else if (token.startsWith("--cwd=")) cwd = token.slice(6);
970
+ captureCompareOutputFlag(output, token, argv[index + 1]);
969
971
  if (VALUE_FLAGS.has(token)) index += 1;
970
972
  }
971
- return { cwd };
973
+ return {
974
+ cwd,
975
+ ...output
976
+ };
972
977
  }
973
978
  //#endregion
974
979
  //#region src/cli/compare-command.ts
@@ -1019,12 +1024,7 @@ function captureUsage(update, capture) {
1019
1024
  capture.usage = {
1020
1025
  input_tokens: numberField(source, ["input_tokens", "inputTokens"]) ?? void 0,
1021
1026
  output_tokens: numberField(source, ["output_tokens", "outputTokens"]) ?? void 0,
1022
- total_tokens: numberField(source, [
1023
- "total_tokens",
1024
- "totalTokens",
1025
- "size",
1026
- "used"
1027
- ]) ?? void 0
1027
+ total_tokens: numberField(source, ["total_tokens", "totalTokens"]) ?? void 0
1028
1028
  };
1029
1029
  }
1030
1030
  function captureSessionUpdate(notification, capture) {
@@ -1057,10 +1057,15 @@ function buildSuccessRow(agentName, result, capture, startedAt) {
1057
1057
  ...result._meta === void 0 ? {} : { _meta: result._meta }
1058
1058
  };
1059
1059
  }
1060
+ function rowStatusFromError(error) {
1061
+ if (error instanceof TimeoutError) return "cancelled";
1062
+ const { code } = normalizeOutputError(error);
1063
+ return code === "PERMISSION_PROMPT_UNAVAILABLE" || code === "PERMISSION_DENIED" ? "permission_denied" : "error";
1064
+ }
1060
1065
  function buildErrorRow(agentName, caught, capture, startedAt) {
1061
1066
  return {
1062
1067
  agent: agentName,
1063
- status: caught instanceof TimeoutError ? "cancelled" : "error",
1068
+ status: rowStatusFromError(caught),
1064
1069
  stop_reason: null,
1065
1070
  wall_ms: Math.round(performance.now() - startedAt),
1066
1071
  input_tokens: capture.usage.input_tokens ?? null,
@@ -1068,14 +1073,20 @@ function buildErrorRow(agentName, caught, capture, startedAt) {
1068
1073
  total_tokens: capture.usage.total_tokens ?? null,
1069
1074
  final_message: truncate(collapseWhitespace(capture.finalMessage), FINAL_MESSAGE_PREVIEW_CHARS),
1070
1075
  error: truncate(collapseWhitespace(caught instanceof Error ? caught.message : String(caught)), FINAL_MESSAGE_PREVIEW_CHARS),
1071
- permission_requests: 0,
1072
- permission_denied: 0
1076
+ permission_requests: capture.permissionStats.requested,
1077
+ permission_denied: capture.permissionStats.denied + capture.permissionStats.cancelled
1073
1078
  };
1074
1079
  }
1075
1080
  async function runAgentForCompare(params) {
1076
1081
  const capture = {
1077
1082
  finalMessage: "",
1078
- usage: {}
1083
+ usage: {},
1084
+ permissionStats: {
1085
+ requested: 0,
1086
+ approved: 0,
1087
+ denied: 0,
1088
+ cancelled: 0
1089
+ }
1079
1090
  };
1080
1091
  const t0 = performance.now();
1081
1092
  try {
@@ -1086,14 +1097,17 @@ async function runAgentForCompare(params) {
1086
1097
  agentArgv: agent.agentArgv,
1087
1098
  cwd: agent.cwd,
1088
1099
  prompt: params.prompt,
1089
- permissionMode: resolvePermissionMode(params.globalFlags, params.config.defaultPermissions),
1100
+ permissionMode: params.permissionMode,
1090
1101
  permissionPolicy: params.permissionPolicy,
1091
1102
  outputFormatter: DISCARD_OUTPUT_FORMATTER,
1092
1103
  suppressSdkConsoleErrors: true,
1093
1104
  timeoutMs: params.globalFlags.timeout ?? DEFAULT_COMPARE_TIMEOUT_MS,
1094
1105
  promptRetries: params.globalFlags.promptRetries,
1095
1106
  sessionOptions: sessionOptionsFromGlobalFlags(params.globalFlags),
1096
- onSessionUpdate: (notification) => captureSessionUpdate(notification, capture)
1107
+ onSessionUpdate: (notification) => captureSessionUpdate(notification, capture),
1108
+ onPermissionStats: (stats) => {
1109
+ capture.permissionStats = stats;
1110
+ }
1097
1111
  });
1098
1112
  return buildSuccessRow(params.agentName, result, capture, t0);
1099
1113
  } catch (caught) {
@@ -1201,10 +1215,11 @@ function registerCompareCommand(program, config) {
1201
1215
  const globalFlags = resolveGlobalFlags(this, config);
1202
1216
  if (flags.cwd !== void 0) globalFlags.cwd = path.resolve(flags.cwd);
1203
1217
  if (globalFlags.agent) throw new InvalidArgumentError("Do not combine compare with --agent; pass agent names");
1204
- const outputPolicy = resolveOutputPolicy(flags.json === true ? "json" : globalFlags.format, globalFlags.jsonStrict === true);
1218
+ const outputPolicy = resolveOutputPolicy(globalFlags.format, globalFlags.jsonStrict === true);
1205
1219
  const promptFile = resolvePromptFile(flags);
1206
1220
  const { promptTokens } = scanCompareArgs(program.args.slice(1));
1207
1221
  const { agents, promptText } = splitCompareArgs(args, promptFile, promptTokens);
1222
+ const permissionMode = resolvePermissionMode(globalFlags, config.defaultPermissions);
1208
1223
  const prompt = await readPromptInput(promptFile, promptText, globalFlags.cwd, "final argument");
1209
1224
  const permissionPolicy = await resolvePermissionPolicyFromFlags(globalFlags);
1210
1225
  const { rows, interrupted } = await runCompareAgents(agents, async (agentName) => await runAgentForCompare({
@@ -1212,6 +1227,7 @@ function registerCompareCommand(program, config) {
1212
1227
  prompt,
1213
1228
  config,
1214
1229
  globalFlags,
1230
+ permissionMode,
1215
1231
  permissionPolicy
1216
1232
  }));
1217
1233
  printRows(rows, outputPolicy.format);
@@ -1229,6 +1245,10 @@ function parseNonEmptyString(value, path) {
1229
1245
  if (typeof value !== "string" || value.trim().length === 0) throw new Error(`Invalid ${path}: expected non-empty string`);
1230
1246
  return value.trim();
1231
1247
  }
1248
+ function parseString(value, path) {
1249
+ if (typeof value !== "string") throw new Error(`Invalid ${path}: expected string`);
1250
+ return value;
1251
+ }
1232
1252
  function parseNameValuePairs(value, path) {
1233
1253
  if (value == null) return [];
1234
1254
  if (!Array.isArray(value)) throw new Error(`Invalid ${path}: expected array`);
@@ -1238,7 +1258,7 @@ function parseNameValuePairs(value, path) {
1238
1258
  if (!entry) throw new Error(`Invalid ${path}[${index}]: expected object`);
1239
1259
  entries.push({
1240
1260
  name: parseNonEmptyString(entry.name, `${path}[${index}].name`),
1241
- value: parseNonEmptyString(entry.value, `${path}[${index}].value`)
1261
+ value: parseString(entry.value, `${path}[${index}].value`)
1242
1262
  });
1243
1263
  }
1244
1264
  return entries;
@@ -1247,10 +1267,7 @@ function parseArgs(value, path) {
1247
1267
  if (value == null) return [];
1248
1268
  if (!Array.isArray(value)) throw new Error(`Invalid ${path}: expected array`);
1249
1269
  const args = [];
1250
- for (const [index, rawArg] of value.entries()) {
1251
- if (typeof rawArg !== "string") throw new Error(`Invalid ${path}[${index}]: expected string`);
1252
- args.push(rawArg);
1253
- }
1270
+ for (const [index, rawArg] of value.entries()) args.push(parseString(rawArg, `${path}[${index}]`));
1254
1271
  return args;
1255
1272
  }
1256
1273
  function parseMeta(value, path) {
@@ -2115,7 +2132,7 @@ function registerAgentCommand(program, agentName, config) {
2115
2132
  }
2116
2133
  function registerFlowCommand(program, config) {
2117
2134
  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) {
2118
- const { handleFlowRun } = await import("./cli-8mVHeUXh.js");
2135
+ const { handleFlowRun } = await import("./cli-BerngYEz.js");
2119
2136
  await handleFlowRun(file, flags, this, config);
2120
2137
  });
2121
2138
  }
@@ -2355,7 +2372,7 @@ function detectMcpConfigPath(argv, cwd) {
2355
2372
  return value ? path.resolve(cwd, value) : void 0;
2356
2373
  }
2357
2374
  function detectRequestedOutputFormat(argv, fallback) {
2358
- let detectedFormat = fallback;
2375
+ let detectedFormat;
2359
2376
  for (let index = 0; index < argv.length; index += 1) {
2360
2377
  const token = argv[index];
2361
2378
  const scan = classifyTopLevelFlagScan(token);
@@ -2365,7 +2382,14 @@ function detectRequestedOutputFormat(argv, fallback) {
2365
2382
  if (format) detectedFormat = format;
2366
2383
  if (scan.skipNext) index += 1;
2367
2384
  }
2368
- return detectedFormat;
2385
+ return detectCompareOutputFormat(argv, detectedFormat, fallback);
2386
+ }
2387
+ function detectCompareOutputFormat(argv, rootFormat, fallback) {
2388
+ const command = detectAgentToken(argv);
2389
+ if (command.token !== "compare" || command.index === void 0) return rootFormat ?? fallback;
2390
+ const local = scanCompareArgs(argv.slice(command.index + 1));
2391
+ const localFormat = isOutputFormat(local.format) ? local.format : void 0;
2392
+ return local.json ? "json" : rootFormat ?? localFormat ?? fallback;
2369
2393
  }
2370
2394
  function classifyTopLevelFlagScan(token) {
2371
2395
  if (token === "--" || !token.startsWith("-") || token === "-") return {