acpx 0.19.3 → 0.19.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agent-registry-DWnqUICY.js → agent-registry-kHdpsK9F.js} +16 -5
- package/dist/agent-registry-kHdpsK9F.js.map +1 -0
- package/dist/agent-registry.d.ts.map +1 -1
- package/dist/agent-registry.js +1 -1
- package/dist/{cli-C1uofM8S.js → cli-CQtZNbI4.js} +34 -46
- package/dist/cli-CQtZNbI4.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +12 -11
- package/dist/cli.js.map +1 -1
- package/dist/{client-CdG6nVDG.d.ts → client-zT_kgYGW.d.ts} +4 -17
- package/dist/client-zT_kgYGW.d.ts.map +1 -0
- package/dist/{flows-hz_Pfsp-.js → flows-Clk_mTYy.js} +34 -14
- package/dist/flows-Clk_mTYy.js.map +1 -0
- package/dist/flows.d.ts +2 -2
- package/dist/flows.js +1 -1
- package/dist/{invocation-options-DbZzMvKM.js → invocation-options-iM1Cc2A1.js} +6 -12
- package/dist/invocation-options-iM1Cc2A1.js.map +1 -0
- package/dist/{ipc-BW06Pbb8.js → ipc-C96eDxkW.js} +188 -33
- package/dist/ipc-C96eDxkW.js.map +1 -0
- package/dist/{output-BjeeG-cj.js → output-DnEPVCtT.js} +80 -12
- package/dist/output-DnEPVCtT.js.map +1 -0
- package/dist/{queue-owner-runtime-Dhr4gxNE.js → queue-owner-runtime-DoijBCvt.js} +376 -174
- package/dist/queue-owner-runtime-DoijBCvt.js.map +1 -0
- package/dist/runtime.d.ts +18 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +34 -9
- package/dist/runtime.js.map +1 -1
- package/dist/{session-options-X7LhX9BF.d.ts → session-options-CkcvthCv.d.ts} +2 -1
- package/dist/{session-options-X7LhX9BF.d.ts.map → session-options-CkcvthCv.d.ts.map} +1 -1
- package/dist/{session-watch-CgfkUKLA.js → session-watch-2CKSvPIS.js} +4 -4
- package/dist/{session-watch-CgfkUKLA.js.map → session-watch-2CKSvPIS.js.map} +1 -1
- package/dist/{watch-BGdqBiNX.js → watch-pnPd9LCw.js} +2 -2
- package/dist/{watch-BGdqBiNX.js.map → watch-pnPd9LCw.js.map} +1 -1
- package/package.json +7 -7
- package/skills/acpx/SKILL.md +8 -1
- package/dist/agent-registry-DWnqUICY.js.map +0 -1
- package/dist/cli-C1uofM8S.js.map +0 -1
- package/dist/client-CdG6nVDG.d.ts.map +0 -1
- package/dist/flows-hz_Pfsp-.js.map +0 -1
- package/dist/invocation-options-DbZzMvKM.js.map +0 -1
- package/dist/ipc-BW06Pbb8.js.map +0 -1
- package/dist/output-BjeeG-cj.js.map +0 -1
- package/dist/queue-owner-runtime-Dhr4gxNE.js.map +0 -1
package/dist/flows.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { C as PermissionPolicy, E as PromptInput, S as PermissionMode, b as McpServer$1, t as SessionAgentOptions, x as NonInteractivePermissionPolicy, y as AuthPolicy } from "./session-options-
|
|
2
|
-
import "./client-
|
|
1
|
+
import { C as PermissionPolicy, E as PromptInput, S as PermissionMode, b as McpServer$1, t as SessionAgentOptions, x as NonInteractivePermissionPolicy, y as AuthPolicy } from "./session-options-CkcvthCv.js";
|
|
2
|
+
import "./client-zT_kgYGW.js";
|
|
3
3
|
import { SetSessionConfigOptionResponse } from "@agentclientprotocol/sdk";
|
|
4
4
|
import net from "node:net";
|
|
5
5
|
//#region src/flows/types.d.ts
|
package/dist/flows.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as parseStrictJsonObject, d as checkpoint, f as compute, i as parseJsonObject, l as acp, m as shell, n as decisionEdge, o as FlowRunner, p as defineFlow, r as extractJsonObject, s as flowRunsBaseDir, t as decision, u as action } from "./flows-
|
|
1
|
+
import { a as parseStrictJsonObject, d as checkpoint, f as compute, i as parseJsonObject, l as acp, m as shell, n as decisionEdge, o as FlowRunner, p as defineFlow, r as extractJsonObject, s as flowRunsBaseDir, t as decision, u as action } from "./flows-Clk_mTYy.js";
|
|
2
2
|
export { FlowRunner, acp, action, checkpoint, compute, decision, decisionEdge, defineFlow, extractJsonObject, flowRunsBaseDir, parseJsonObject, parseStrictJsonObject, shell };
|
|
@@ -1,16 +1,10 @@
|
|
|
1
|
-
import "./output-
|
|
2
|
-
import {
|
|
3
|
-
import { d as resolveAgentCommand, l as normalizeAgentName, p as resolveCanonicalAgentName, u as resolveAgentArgv } from "./agent-registry-
|
|
4
|
-
import "./queue-owner-runtime-
|
|
1
|
+
import { o as toTimerMilliseconds } from "./output-DnEPVCtT.js";
|
|
2
|
+
import { At as AUTH_POLICIES, Ft as PERMISSION_POLICY_ACTIONS, Mt as NON_INTERACTIVE_PERMISSION_POLICIES, Nt as OUTPUT_FORMATS } from "./ipc-C96eDxkW.js";
|
|
3
|
+
import { d as resolveAgentCommand, l as normalizeAgentName, p as resolveCanonicalAgentName, u as resolveAgentArgv } from "./agent-registry-kHdpsK9F.js";
|
|
4
|
+
import "./queue-owner-runtime-DoijBCvt.js";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { InvalidArgumentError } from "commander";
|
|
7
7
|
import fs from "node:fs/promises";
|
|
8
|
-
function toTimerMilliseconds(seconds, allowZero) {
|
|
9
|
-
if (allowZero && seconds === 0) return 0;
|
|
10
|
-
const milliseconds = Math.max(1, Math.round(seconds * 1e3));
|
|
11
|
-
return milliseconds <= 2147483647 ? milliseconds : void 0;
|
|
12
|
-
}
|
|
13
|
-
//#endregion
|
|
14
8
|
//#region src/cli/flags.ts
|
|
15
9
|
function hasExplicitPermissionModeFlag(flags) {
|
|
16
10
|
return flags.approveAll === true || flags.approveReads === true || flags.denyAll === true;
|
|
@@ -346,6 +340,6 @@ async function resolvePermissionPolicyFromFlags(globalFlags) {
|
|
|
346
340
|
}
|
|
347
341
|
}
|
|
348
342
|
//#endregion
|
|
349
|
-
export { resolvePermissionMode as C,
|
|
343
|
+
export { resolvePermissionMode as C, resolveSessionsListFlags as E, resolveOutputPolicy as S, resolveSessionNameFromFlags as T, parseSessionName as _, addGlobalFlags as a, resolveAgentInvocation as b, addSessionOption as c, parseDaysOlderThan as d, parseHistoryLimit as f, parsePruneBeforeDate as g, parseOutputFormat as h, addExecConfigOption as i, hasExplicitPermissionModeFlag as l, parseNonEmptyValue as m, sessionConnectionOptions as n, addPromptInputOption as o, parseMaxTurns as p, sessionOptionsFromGlobalFlags as r, addSessionNameOption as s, resolvePermissionPolicyFromFlags as t, parseAllowedTools as u, parseTimeoutSeconds as v, resolvePromptFlags as w, resolveGlobalFlags as x, parseTtlSeconds as y };
|
|
350
344
|
|
|
351
|
-
//# sourceMappingURL=invocation-options-
|
|
345
|
+
//# sourceMappingURL=invocation-options-iM1Cc2A1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invocation-options-iM1Cc2A1.js","names":["resolveAgentCommandFromRegistry"],"sources":["../src/cli/flags.ts","../src/permission-policy.ts","../src/cli/invocation-options.ts"],"sourcesContent":["import path from \"node:path\";\nimport { InvalidArgumentError } from \"commander\";\nimport type { Command } from \"commander\";\nimport {\n DEFAULT_AGENT_NAME,\n normalizeAgentName,\n resolveCanonicalAgentName,\n resolveAgentArgv,\n resolveAgentCommand as resolveAgentCommandFromRegistry,\n} from \"../agent-registry.js\";\nimport type { SystemPromptOption } from \"../runtime/engine/session-options.js\";\nimport { DEFAULT_QUEUE_OWNER_TTL_MS } from \"../session/session.js\";\nimport {\n AUTH_POLICIES,\n NON_INTERACTIVE_PERMISSION_POLICIES,\n OUTPUT_FORMATS,\n type AuthPolicy,\n type NonInteractivePermissionPolicy,\n type OutputFormat,\n type OutputPolicy,\n type PermissionMode,\n} from \"../types.js\";\nimport type { ResolvedAcpxConfig } from \"./config.js\";\nimport { toTimerMilliseconds } from \"./timer-duration.js\";\n\nexport type PermissionFlags = {\n approveAll?: boolean;\n approveReads?: boolean;\n denyAll?: boolean;\n};\n\nexport function hasExplicitPermissionModeFlag(flags: PermissionFlags): boolean {\n return flags.approveAll === true || flags.approveReads === true || flags.denyAll === true;\n}\n\nexport type GlobalFlags = PermissionFlags & {\n agent?: string;\n cwd: string;\n authPolicy?: AuthPolicy;\n nonInteractivePermissions: NonInteractivePermissionPolicy;\n jsonStrict?: boolean;\n suppressReads?: boolean;\n fs?: boolean;\n terminal?: boolean;\n timeout?: number;\n ttl: number;\n verbose?: boolean;\n format: OutputFormat;\n model?: string;\n allowedTools?: string[];\n maxTurns?: number;\n systemPrompt?: SystemPromptOption;\n promptRetries?: number;\n permissionPolicy?: string;\n};\n\nexport type PromptFlags = {\n session?: string;\n wait?: boolean;\n file?: string;\n};\n\nexport type ExecFlags = {\n file?: string;\n configOption?: SessionConfigOptionAssignment[];\n};\n\nexport type SessionConfigOptionAssignment = {\n configId: string;\n value: string;\n};\n\nexport type SessionsNewFlags = {\n name?: string;\n resumeSession?: string;\n};\n\nexport type SessionsHistoryFlags = {\n limit: number;\n};\n\nexport type SessionsListFlags = {\n cursor?: string;\n filterCwd?: string;\n local?: boolean;\n};\n\nexport type SessionsExportFlags = {\n output: string;\n sourceCwd?: string;\n};\n\nexport type SessionsImportFlags = {\n name?: string;\n destinationCwd?: string;\n};\n\nexport type StatusFlags = {\n session?: string;\n};\n\ntype SessionSelectionFlags = {\n session?: string;\n};\n\nexport type SessionsPruneFlags = {\n dryRun?: boolean;\n before?: Date;\n olderThan?: number;\n includeHistory?: boolean;\n};\n\nfunction stringOption(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction numberOption(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n\nfunction stringArrayOption(value: unknown): string[] | undefined {\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\")\n ? value\n : undefined;\n}\n\nfunction nonEmptyStringOption(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nexport function parseOutputFormat(value: string): OutputFormat {\n if (!OUTPUT_FORMATS.includes(value as OutputFormat)) {\n throw new InvalidArgumentError(\n `Invalid format \"${value}\". Expected one of: ${OUTPUT_FORMATS.join(\", \")}`,\n );\n }\n return value as OutputFormat;\n}\n\nexport function parseAuthPolicy(value: string): AuthPolicy {\n if (!AUTH_POLICIES.includes(value as AuthPolicy)) {\n throw new InvalidArgumentError(\n `Invalid auth policy \"${value}\". Expected one of: ${AUTH_POLICIES.join(\", \")}`,\n );\n }\n return value as AuthPolicy;\n}\n\nexport function parseNonInteractivePermissionPolicy(value: string): NonInteractivePermissionPolicy {\n if (!NON_INTERACTIVE_PERMISSION_POLICIES.includes(value as NonInteractivePermissionPolicy)) {\n throw new InvalidArgumentError(\n `Invalid non-interactive permission policy \"${value}\". Expected one of: ${NON_INTERACTIVE_PERMISSION_POLICIES.join(\", \")}`,\n );\n }\n return value as NonInteractivePermissionPolicy;\n}\n\nexport function parseTimeoutSeconds(value: string): number {\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new InvalidArgumentError(\"Timeout must be a positive number of seconds\");\n }\n const milliseconds = toTimerMilliseconds(parsed, false);\n if (milliseconds === undefined) {\n throw new InvalidArgumentError(\"Timeout exceeds the maximum supported timer delay\");\n }\n return milliseconds;\n}\n\nexport function parseTtlSeconds(value: string): number {\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || parsed < 0) {\n throw new InvalidArgumentError(\"TTL must be a non-negative number of seconds\");\n }\n const milliseconds = toTimerMilliseconds(parsed, true);\n if (milliseconds === undefined) {\n throw new InvalidArgumentError(\"TTL exceeds the maximum supported timer delay\");\n }\n return milliseconds;\n}\n\nexport function parseSessionName(value: string): string {\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n throw new InvalidArgumentError(\"Session name must not be empty\");\n }\n return trimmed;\n}\n\nexport function parseNonEmptyValue(label: string, value: string): string {\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n throw new InvalidArgumentError(`${label} must not be empty`);\n }\n return trimmed;\n}\n\nexport function parseSessionConfigOptionAssignment(value: string): SessionConfigOptionAssignment {\n const separator = value.indexOf(\"=\");\n if (separator <= 0 || separator === value.length - 1) {\n throw new InvalidArgumentError(\n 'Session config option must use \"<key>=<value>\" with non-empty parts',\n );\n }\n\n const configId = value.slice(0, separator).trim();\n const configValue = value.slice(separator + 1).trim();\n if (configId.length === 0 || configValue.length === 0) {\n throw new InvalidArgumentError(\n 'Session config option must use \"<key>=<value>\" with non-empty parts',\n );\n }\n return { configId, value: configValue };\n}\n\nfunction collectSessionConfigOptionAssignment(\n value: string,\n previous: SessionConfigOptionAssignment[] = [],\n): SessionConfigOptionAssignment[] {\n return [...previous, parseSessionConfigOptionAssignment(value)];\n}\n\nexport function parseHistoryLimit(value: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new InvalidArgumentError(\"Limit must be a positive integer\");\n }\n return parsed;\n}\n\nexport function parseDaysOlderThan(value: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new InvalidArgumentError(\"--older-than must be a positive integer number of days\");\n }\n return parsed;\n}\n\nexport function parsePruneBeforeDate(value: string): Date {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n throw new InvalidArgumentError(\n `--before must be a valid date (e.g. 2026-01-01 or 2026-01-01T00:00:00Z)`,\n );\n }\n return date;\n}\n\nexport function parseAllowedTools(value: string): string[] {\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return [];\n }\n\n const items = trimmed.split(\",\").map((item) => item.trim());\n if (items.some((item) => item.length === 0)) {\n throw new InvalidArgumentError(\n \"Allowed tools must be a comma-separated list without empty entries\",\n );\n }\n\n return items;\n}\n\nexport function parseMaxTurns(value: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new InvalidArgumentError(\"Max turns must be a positive integer\");\n }\n return parsed;\n}\n\nexport function resolveSystemPromptFlag(opts: {\n systemPrompt?: unknown;\n appendSystemPrompt?: unknown;\n}): SystemPromptOption | undefined {\n const replace = nonEmptyStringOption(opts.systemPrompt);\n const append = nonEmptyStringOption(opts.appendSystemPrompt);\n\n if (replace !== undefined && append !== undefined) {\n throw new InvalidArgumentError(\"Use only one of --system-prompt or --append-system-prompt\");\n }\n if (replace !== undefined) {\n return replace;\n }\n if (append !== undefined) {\n return { append };\n }\n return undefined;\n}\n\nexport function parsePromptRetries(value: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new InvalidArgumentError(\"Prompt retries must be a non-negative integer\");\n }\n return parsed;\n}\n\nexport function resolvePermissionMode(\n flags: PermissionFlags,\n defaultMode: PermissionMode,\n): PermissionMode {\n const selected = [flags.approveAll, flags.approveReads, flags.denyAll].filter(Boolean).length;\n\n if (selected > 1) {\n throw new InvalidArgumentError(\n \"Use only one permission mode: --approve-all, --approve-reads, or --deny-all\",\n );\n }\n\n if (flags.approveAll) {\n return \"approve-all\";\n }\n if (flags.approveReads) {\n return \"approve-reads\";\n }\n if (flags.denyAll) {\n return \"deny-all\";\n }\n\n return defaultMode;\n}\n\nexport function addGlobalFlags(command: Command): Command {\n return command\n .option(\"--agent <command>\", \"Raw ACP agent command (escape hatch)\")\n .option(\"--cwd <dir>\", \"Working directory\", process.cwd())\n .option(\n \"--auth-policy <policy>\",\n \"Authentication policy: skip or fail when auth is required\",\n parseAuthPolicy,\n )\n .option(\"--approve-all\", \"Auto-approve all permission requests\")\n .option(\"--approve-reads\", \"Auto-approve read/search requests and prompt for writes\")\n .option(\"--deny-all\", \"Deny all permission requests\")\n .option(\n \"--non-interactive-permissions <policy>\",\n \"When prompting is unavailable: deny or fail\",\n parseNonInteractivePermissionPolicy,\n )\n .option(\n \"--permission-policy <json-or-file>\",\n \"Permission policy JSON or path (autoApprove, autoDeny, escalate, defaultAction)\",\n )\n .option(\"--policy <json-or-file>\", \"Alias for --permission-policy\")\n .option(\"--format <fmt>\", \"Output format: text, json, quiet\", parseOutputFormat)\n .option(\"--suppress-reads\", \"Suppress raw read-file contents in output\")\n .option(\"--model <id>\", \"Agent model id\")\n .option(\n \"--allowed-tools <list>\",\n 'Allowed tool names as a comma-separated list (use \"\" for no tools)',\n parseAllowedTools,\n )\n .option(\"--max-turns <count>\", \"Maximum turns for the session\", parseMaxTurns)\n .option(\n \"--system-prompt <text>\",\n \"Replace the agent system prompt (claude-agent-acp via ACP _meta.systemPrompt)\",\n (value: string) => parseNonEmptyValue(\"System prompt\", value),\n )\n .option(\n \"--append-system-prompt <text>\",\n \"Append text to the agent system prompt (claude-agent-acp via ACP _meta.systemPrompt.append)\",\n (value: string) => parseNonEmptyValue(\"Append system prompt\", value),\n )\n .option(\n \"--prompt-retries <count>\",\n \"Retry failed prompt turns on transient errors (default: 0)\",\n parsePromptRetries,\n )\n .option(\n \"--json-strict\",\n \"Strict JSON mode: requires --format json and suppresses non-JSON stderr output\",\n )\n .option(\"--no-fs\", \"Do not advertise ACP filesystem capabilities\")\n .option(\"--no-terminal\", \"Do not advertise ACP terminal capability\")\n .option(\"--timeout <seconds>\", \"Maximum time to wait for agent response\", parseTimeoutSeconds)\n .option(\n \"--ttl <seconds>\",\n \"Queue owner idle TTL before shutdown (0 = keep alive forever) (default: 300)\",\n parseTtlSeconds,\n )\n .option(\n \"--mcp-config <path>\",\n \"Load MCP servers from a JSON config file instead of project/global mcpServers\",\n )\n .option(\"--verbose\", \"Enable verbose debug logs\");\n}\n\nexport function addSessionOption(command: Command): Command {\n return command\n .option(\"-s, --session <name>\", \"Use named session instead of cwd default\", parseSessionName)\n .option(\n \"--no-wait\",\n \"Queue prompt and return immediately when another prompt is already running\",\n );\n}\n\nexport function addSessionNameOption(command: Command): Command {\n return command.option(\n \"-s, --session <name>\",\n \"Use named session instead of cwd default\",\n parseSessionName,\n );\n}\n\nexport function resolveSessionNameFromFlags(\n flags: SessionSelectionFlags,\n command: Command,\n): string | undefined {\n const directSession = parseOptionalSessionName(flags.session);\n if (directSession !== undefined) {\n return directSession;\n }\n\n // Commander parses options on the parent command when flags appear before the\n // subcommand (e.g. `acpx codex -s foo cancel`). Use optsWithGlobals() so\n // subcommands can still access those values.\n const allOpts = command.optsWithGlobals<Record<string, unknown>>();\n return parseOptionalSessionName(allOpts.session);\n}\n\nfunction parseOptionalSessionName(value: unknown): string | undefined {\n const session = stringOption(value);\n return session === undefined ? undefined : parseSessionName(session);\n}\n\nfunction resolveCommandOption(command: Command, key: string, fallback: unknown): unknown {\n // Explicit child values win; a child's --no-wait default must not hide a parent flag.\n for (let current: Command | null = command; current; current = current.parent) {\n if (current.getOptionValueSource(key) === \"cli\") {\n return current.opts<Record<string, unknown>>()[key];\n }\n }\n return fallback;\n}\n\nexport function resolvePromptFlags(flags: PromptFlags, command: Command): PromptFlags {\n return {\n ...flags,\n file: stringOption(resolveCommandOption(command, \"file\", flags.file)),\n wait: resolveCommandOption(command, \"wait\", flags.wait) !== false,\n };\n}\n\nexport function resolveSessionsListFlags(\n flags: SessionsListFlags,\n command: Command,\n): SessionsListFlags {\n return {\n cursor: stringOption(resolveCommandOption(command, \"cursor\", flags.cursor)),\n filterCwd: stringOption(resolveCommandOption(command, \"filterCwd\", flags.filterCwd)),\n local: resolveCommandOption(command, \"local\", flags.local) === true,\n };\n}\n\nexport function addPromptInputOption(command: Command): Command {\n return command.option(\"-f, --file <path>\", \"Read prompt text from file path (use - for stdin)\");\n}\n\nexport function addExecConfigOption(command: Command): Command {\n return command.option(\n \"--config-option <key=value>\",\n \"Set an ACP session config option before the one-shot prompt (repeatable)\",\n collectSessionConfigOptionAssignment,\n );\n}\n\nexport function resolveGlobalFlags(command: Command, config: ResolvedAcpxConfig): GlobalFlags {\n const opts = command.optsWithGlobals<Record<string, unknown>>();\n const format = parseOutputFormat(\n opts.json === true ? \"json\" : (stringOption(opts.format) ?? config.format ?? \"text\"),\n );\n const jsonStrict = opts.jsonStrict === true;\n const verbose = opts.verbose === true;\n assertOutputFlagCompatibility(format, jsonStrict, verbose);\n\n return {\n agent: resolveAgentOverride(stringOption(opts.agent)),\n cwd: resolveCwdOption(opts.cwd),\n authPolicy: resolveAuthPolicy(opts.authPolicy, config),\n nonInteractivePermissions: resolveNonInteractivePermissions(\n opts.nonInteractivePermissions,\n config,\n ),\n permissionPolicy: resolvePermissionPolicyOption(opts),\n jsonStrict,\n suppressReads: opts.suppressReads === true,\n fs: resolveCapabilityOption(opts.fs),\n terminal: resolveCapabilityOption(opts.terminal),\n timeout: resolveTimeoutOption(opts.timeout, config),\n ttl: resolveTtlOption(opts.ttl, config),\n verbose,\n format,\n model: resolveModelOption(opts.model),\n allowedTools: stringArrayOption(opts.allowedTools),\n maxTurns: numberOption(opts.maxTurns),\n systemPrompt: resolveSystemPromptFlag(opts),\n promptRetries: numberOption(opts.promptRetries),\n approveAll: opts.approveAll ? true : undefined,\n approveReads: opts.approveReads ? true : undefined,\n denyAll: opts.denyAll ? true : undefined,\n };\n}\n\nfunction resolveCwdOption(value: unknown): string {\n return stringOption(value) ?? process.cwd();\n}\n\nfunction resolveAuthPolicy(optsValue: unknown, config: ResolvedAcpxConfig): AuthPolicy {\n const value = stringOption(optsValue);\n return value === undefined ? config.authPolicy : parseAuthPolicy(value);\n}\n\nfunction resolveNonInteractivePermissions(\n optsValue: unknown,\n config: ResolvedAcpxConfig,\n): NonInteractivePermissionPolicy {\n const value = stringOption(optsValue);\n return value === undefined\n ? config.nonInteractivePermissions\n : parseNonInteractivePermissionPolicy(value);\n}\n\nfunction resolvePermissionPolicyOption(opts: Record<string, unknown>): string | undefined {\n const primary = stringOption(opts.permissionPolicy);\n const alias = stringOption(opts.policy);\n if (primary !== undefined && alias !== undefined && primary !== alias) {\n throw new InvalidArgumentError(\n \"Use only one permission policy flag: --permission-policy or --policy\",\n );\n }\n return primary ?? alias;\n}\n\nfunction resolveCapabilityOption(value: unknown): boolean | undefined {\n return value === false ? false : undefined;\n}\n\nfunction resolveTimeoutOption(value: unknown, config: ResolvedAcpxConfig): number | undefined {\n return numberOption(value) ?? config.timeoutMs;\n}\n\nfunction resolveTtlOption(value: unknown, config: ResolvedAcpxConfig): number {\n return numberOption(value) ?? config.ttlMs ?? DEFAULT_QUEUE_OWNER_TTL_MS;\n}\n\nfunction assertOutputFlagCompatibility(\n format: OutputFormat,\n jsonStrict: boolean,\n verbose: boolean,\n): void {\n if (jsonStrict && format !== \"json\") {\n throw new InvalidArgumentError(\"--json-strict requires --format json\");\n }\n\n if (jsonStrict && verbose) {\n throw new InvalidArgumentError(\"--json-strict cannot be combined with --verbose\");\n }\n}\n\nfunction resolveModelOption(value: unknown): string | undefined {\n const model = stringOption(value);\n return model === undefined ? undefined : parseNonEmptyValue(\"Model\", model);\n}\n\nfunction resolveAgentOverride(value: string | undefined): string | undefined {\n return value === undefined ? undefined : parseNonEmptyValue(\"Agent command\", value);\n}\n\nexport function resolveOutputPolicy(format: OutputFormat, jsonStrict: boolean): OutputPolicy {\n return {\n format,\n jsonStrict,\n suppressReads: false,\n suppressNonJsonStderr: jsonStrict,\n queueErrorAlreadyEmitted: format !== \"quiet\",\n suppressSdkConsoleErrors: jsonStrict || format === \"quiet\",\n };\n}\n\nexport function resolveAgentInvocation(\n explicitAgentName: string | undefined,\n globalFlags: GlobalFlags,\n config: ResolvedAcpxConfig,\n): {\n agentName: string;\n agentCommand: string;\n agentArgv?: string[];\n cwd: string;\n} {\n const override = resolveAgentOverride(globalFlags.agent);\n if (override !== undefined && explicitAgentName !== undefined) {\n throw new InvalidArgumentError(\"Do not combine positional agent with --agent override\");\n }\n\n const agentName = explicitAgentName ?? config.defaultAgent ?? DEFAULT_AGENT_NAME;\n const command = resolveInvocationCommand(agentName, override, config);\n\n return {\n agentName,\n ...command,\n cwd: path.resolve(globalFlags.cwd),\n };\n}\n\nfunction resolveInvocationCommand(\n agentName: string,\n override: string | undefined,\n config: ResolvedAcpxConfig,\n): { agentCommand: string; agentArgv?: string[] } {\n if (override !== undefined) {\n return { agentCommand: override };\n }\n const normalizedAgentName = normalizeAgentName(agentName);\n const canonicalAgentName = resolveCanonicalAgentName(agentName);\n const configuredAgent = Object.hasOwn(config.agents, normalizedAgentName)\n ? config.agents[normalizedAgentName]\n : Object.hasOwn(config.agents, canonicalAgentName)\n ? config.agents[canonicalAgentName]\n : undefined;\n if (configuredAgent) {\n return {\n agentCommand: configuredAgent.command,\n ...(configuredAgent.argv ? { agentArgv: [...configuredAgent.argv] } : {}),\n };\n }\n const agentArgv = resolveAgentArgv(agentName);\n return {\n agentCommand: resolveAgentCommandFromRegistry(agentName),\n ...(agentArgv ? { agentArgv } : {}),\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n PERMISSION_POLICY_ACTIONS,\n type PermissionPolicy,\n type PermissionPolicyAction,\n} from \"./types.js\";\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction parseRuleList(value: unknown, key: string, source: string): string[] | undefined {\n if (value == null) {\n return undefined;\n }\n if (!Array.isArray(value)) {\n throw new Error(`${source}: permission policy ${key} must be an array of strings`);\n }\n\n const parsed = value.map((entry) => {\n if (typeof entry !== \"string\" || entry.trim().length === 0) {\n throw new Error(`${source}: permission policy ${key} must contain only non-empty strings`);\n }\n return entry.trim();\n });\n\n return parsed;\n}\n\nfunction isPermissionPolicyAction(value: unknown): value is PermissionPolicyAction {\n return (\n typeof value === \"string\" && PERMISSION_POLICY_ACTIONS.includes(value as PermissionPolicyAction)\n );\n}\n\nfunction parseDefaultAction(\n value: unknown,\n source: string,\n): PermissionPolicy[\"defaultAction\"] | undefined {\n if (value == null) {\n return undefined;\n }\n if (!isPermissionPolicyAction(value)) {\n throw new Error(\n `${source}: permission policy defaultAction must be one of ${PERMISSION_POLICY_ACTIONS.join(\", \")}`,\n );\n }\n return value;\n}\n\nfunction assignRuleList(\n policy: PermissionPolicy,\n key: \"autoApprove\" | \"autoDeny\" | \"escalate\",\n value: string[] | undefined,\n): void {\n if (value) {\n policy[key] = value;\n }\n}\n\nexport function parsePermissionPolicy(\n value: unknown,\n source = \"permission policy\",\n): PermissionPolicy {\n const record = asRecord(value);\n if (!record) {\n throw new Error(`${source}: permission policy must be a JSON object`);\n }\n\n const policy: PermissionPolicy = {};\n assignRuleList(policy, \"autoApprove\", parseRuleList(record.autoApprove, \"autoApprove\", source));\n assignRuleList(policy, \"autoDeny\", parseRuleList(record.autoDeny, \"autoDeny\", source));\n assignRuleList(policy, \"escalate\", parseRuleList(record.escalate, \"escalate\", source));\n\n const defaultAction = parseDefaultAction(record.defaultAction, source);\n if (defaultAction) {\n policy.defaultAction = defaultAction;\n }\n\n return policy;\n}\n\nexport async function loadPermissionPolicySpec(\n spec: string | undefined,\n cwd: string,\n): Promise<PermissionPolicy | undefined> {\n const trimmed = spec?.trim();\n if (!trimmed) {\n return undefined;\n }\n\n if (trimmed.startsWith(\"{\")) {\n return parsePermissionPolicy(JSON.parse(trimmed), \"--permission-policy\");\n }\n\n const policyPath = path.resolve(cwd, trimmed);\n const raw = await fs.readFile(policyPath, \"utf8\");\n return parsePermissionPolicy(JSON.parse(raw), policyPath);\n}\n","import { InvalidArgumentError } from \"commander\";\nimport { loadPermissionPolicySpec } from \"../permission-policy.js\";\nimport type {\n SessionConnectionOptions,\n SessionCreateOptions,\n} from \"../session/execution/contracts.js\";\nimport type { PermissionPolicy } from \"../types.js\";\nimport type { ResolvedAcpxConfig } from \"./config.js\";\nimport type { GlobalFlags } from \"./flags.js\";\n\nexport function sessionOptionsFromGlobalFlags(\n globalFlags: GlobalFlags,\n): NonNullable<SessionCreateOptions[\"sessionOptions\"]> {\n return {\n model: globalFlags.model,\n allowedTools: globalFlags.allowedTools,\n maxTurns: globalFlags.maxTurns,\n systemPrompt: globalFlags.systemPrompt,\n };\n}\n\nexport function sessionConnectionOptions(\n globalFlags: GlobalFlags,\n config: ResolvedAcpxConfig,\n): SessionConnectionOptions {\n return {\n mcpServers: config.mcpServers,\n nonInteractivePermissions: globalFlags.nonInteractivePermissions,\n authCredentials: config.auth,\n authPolicy: globalFlags.authPolicy,\n fs: globalFlags.fs,\n terminal: globalFlags.terminal,\n timeoutMs: globalFlags.timeout,\n verbose: globalFlags.verbose,\n };\n}\n\nexport async function resolvePermissionPolicyFromFlags(\n globalFlags: GlobalFlags,\n): Promise<PermissionPolicy | undefined> {\n try {\n return await loadPermissionPolicySpec(globalFlags.permissionPolicy, globalFlags.cwd);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new InvalidArgumentError(`Invalid permission policy: ${message}`);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as PROCESS_HELPER_TIMEOUT_MS, E as isChildProcessRunning, N as runTimedExecFile, S as PROCESS_HELPER_MAX_BUFFER_BYTES, n as AGENT_REGISTRY, r as BUILT_IN_AGENT_PACKAGES, t as AGENT_ARGV_REGISTRY } from "./agent-registry-
|
|
1
|
+
import { C as PROCESS_HELPER_TIMEOUT_MS, E as isChildProcessRunning, N as runTimedExecFile, P as splitCommandLine, S as PROCESS_HELPER_MAX_BUFFER_BYTES, n as AGENT_REGISTRY, r as BUILT_IN_AGENT_PACKAGES, t as AGENT_ARGV_REGISTRY } from "./agent-registry-kHdpsK9F.js";
|
|
2
2
|
import fs, { statSync } from "node:fs";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import fs$1 from "node:fs/promises";
|
|
@@ -545,6 +545,16 @@ async function writePrivateJsonFile(filePath, value) {
|
|
|
545
545
|
//#endregion
|
|
546
546
|
//#region src/session/event-log.ts
|
|
547
547
|
const DEFAULT_EVENT_SEGMENT_MAX_BYTES = 67108864;
|
|
548
|
+
/** Upper bound stored for a newly imported journal. */
|
|
549
|
+
const MAX_EVENT_SEGMENTS = 1024;
|
|
550
|
+
function retainedEventMaxSegments(value) {
|
|
551
|
+
if (!Number.isFinite(value) || value < 1) return 0;
|
|
552
|
+
return Math.floor(value);
|
|
553
|
+
}
|
|
554
|
+
function boundedEventMaxSegments(value) {
|
|
555
|
+
if (!Number.isFinite(value) || value < 1) return 0;
|
|
556
|
+
return Math.min(Math.floor(value), MAX_EVENT_SEGMENTS);
|
|
557
|
+
}
|
|
548
558
|
function sessionBaseDir() {
|
|
549
559
|
return path.join(os.homedir(), ".acpx", "sessions");
|
|
550
560
|
}
|
|
@@ -560,6 +570,42 @@ function sessionEventSegmentPath(sessionId, segment) {
|
|
|
560
570
|
function sessionEventLockPath(sessionId) {
|
|
561
571
|
return path.join(sessionBaseDir(), `${safeSessionId(sessionId)}.stream.lock`);
|
|
562
572
|
}
|
|
573
|
+
async function existingEventSegmentIndices(sessionId) {
|
|
574
|
+
return (await sessionEventFiles(sessionId)).indices;
|
|
575
|
+
}
|
|
576
|
+
async function sessionEventFiles(sessionId) {
|
|
577
|
+
const activeName = `${safeSessionId(sessionId)}.stream.ndjson`;
|
|
578
|
+
const indices = [];
|
|
579
|
+
let active = false;
|
|
580
|
+
for (const name of await readSessionDirNames()) {
|
|
581
|
+
if (name === activeName) {
|
|
582
|
+
active = true;
|
|
583
|
+
continue;
|
|
584
|
+
}
|
|
585
|
+
const index = eventSegmentIndex(sessionId, name);
|
|
586
|
+
if (index !== void 0) indices.push(index);
|
|
587
|
+
}
|
|
588
|
+
return {
|
|
589
|
+
indices,
|
|
590
|
+
active
|
|
591
|
+
};
|
|
592
|
+
}
|
|
593
|
+
async function readSessionDirNames() {
|
|
594
|
+
try {
|
|
595
|
+
return await fs$1.readdir(sessionBaseDir());
|
|
596
|
+
} catch (error) {
|
|
597
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") return [];
|
|
598
|
+
throw error;
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
function eventSegmentIndex(sessionId, name) {
|
|
602
|
+
const prefix = `${safeSessionId(sessionId)}.stream.`;
|
|
603
|
+
if (!name.startsWith(prefix) || !name.endsWith(".ndjson")) return;
|
|
604
|
+
const middle = name.slice(prefix.length, -7);
|
|
605
|
+
if (!/^[1-9]\d*$/.test(middle)) return;
|
|
606
|
+
const index = Number(middle);
|
|
607
|
+
return Number.isSafeInteger(index) ? index : void 0;
|
|
608
|
+
}
|
|
563
609
|
function defaultSessionEventLog(sessionId) {
|
|
564
610
|
return {
|
|
565
611
|
active_path: sessionEventActivePath(sessionId),
|
|
@@ -827,6 +873,21 @@ async function pathIdentity(filePath) {
|
|
|
827
873
|
throw error;
|
|
828
874
|
}
|
|
829
875
|
}
|
|
876
|
+
function boundedJournalPaths(sessionId, saved) {
|
|
877
|
+
const paths = [];
|
|
878
|
+
for (let index = saved; index > 0; index -= 1) paths.push(sessionEventSegmentPath(sessionId, index));
|
|
879
|
+
paths.push(sessionEventActivePath(sessionId));
|
|
880
|
+
return paths;
|
|
881
|
+
}
|
|
882
|
+
function sparseRotationHoles(indices, present, saved) {
|
|
883
|
+
const holes = [];
|
|
884
|
+
if (!present.has(1)) holes.push(1);
|
|
885
|
+
for (const index of indices) {
|
|
886
|
+
const next = index + 1;
|
|
887
|
+
if (index < saved && next <= saved && !present.has(next)) holes.push(next);
|
|
888
|
+
}
|
|
889
|
+
return holes;
|
|
890
|
+
}
|
|
830
891
|
function emptySegment() {
|
|
831
892
|
return {
|
|
832
893
|
offset: 0,
|
|
@@ -845,19 +906,34 @@ var SessionJournalReader = class {
|
|
|
845
906
|
constructor(record) {
|
|
846
907
|
this.record = record;
|
|
847
908
|
}
|
|
848
|
-
|
|
849
|
-
const
|
|
850
|
-
|
|
851
|
-
paths
|
|
852
|
-
|
|
909
|
+
async discoverPaths() {
|
|
910
|
+
const saved = retainedEventMaxSegments(this.record.eventLog.max_segments);
|
|
911
|
+
if (saved > 1024) return await this.discoverSparsePaths(saved);
|
|
912
|
+
return { paths: boundedJournalPaths(this.record.acpxRecordId, saved) };
|
|
913
|
+
}
|
|
914
|
+
async discoverSparsePaths(saved) {
|
|
915
|
+
const id = this.record.acpxRecordId;
|
|
916
|
+
const files = await sessionEventFiles(id);
|
|
917
|
+
const indices = files.indices.filter((index) => index <= saved);
|
|
918
|
+
const holeIndices = sparseRotationHoles(indices, new Set(indices), saved);
|
|
919
|
+
const paths = [.../* @__PURE__ */ new Set([...indices, ...holeIndices])].toSorted((left, right) => right - left).map((index) => sessionEventSegmentPath(id, index));
|
|
920
|
+
const active = sessionEventActivePath(id);
|
|
921
|
+
paths.push(active);
|
|
922
|
+
const holes = new Set(holeIndices.map((index) => sessionEventSegmentPath(id, index)));
|
|
923
|
+
if (!files.active) holes.add(active);
|
|
924
|
+
return {
|
|
925
|
+
paths,
|
|
926
|
+
holes
|
|
927
|
+
};
|
|
853
928
|
}
|
|
854
929
|
async openSnapshot(signal) {
|
|
855
930
|
for (;;) {
|
|
856
931
|
signal?.throwIfAborted();
|
|
857
932
|
const segments = [];
|
|
858
933
|
try {
|
|
859
|
-
const
|
|
860
|
-
|
|
934
|
+
const scan = await this.discoverPaths();
|
|
935
|
+
const paths = await this.openPresentSegments(segments, scan.paths);
|
|
936
|
+
if (await this.matchesSnapshot(paths, segments, scan.holes)) return segments;
|
|
861
937
|
} catch (error) {
|
|
862
938
|
if (!retryableSnapshotError(error)) {
|
|
863
939
|
await this.closeSnapshot(segments);
|
|
@@ -868,8 +944,7 @@ var SessionJournalReader = class {
|
|
|
868
944
|
await setTimeout$1(5, void 0, { signal });
|
|
869
945
|
}
|
|
870
946
|
}
|
|
871
|
-
async openPresentSegments(segments) {
|
|
872
|
-
const paths = this.paths();
|
|
947
|
+
async openPresentSegments(segments, paths) {
|
|
873
948
|
const present = await Promise.all(paths.map((filePath) => statRegularFile(filePath)));
|
|
874
949
|
if (present.every((entry) => entry.missing)) return paths;
|
|
875
950
|
const directory = await root(path.dirname(paths[0]));
|
|
@@ -898,10 +973,14 @@ var SessionJournalReader = class {
|
|
|
898
973
|
async closeSnapshot(segments) {
|
|
899
974
|
await Promise.all(segments.map(({ opened }) => opened[Symbol.asyncDispose]()));
|
|
900
975
|
}
|
|
901
|
-
async matchesSnapshot(paths, segments) {
|
|
976
|
+
async matchesSnapshot(paths, segments, holes) {
|
|
902
977
|
const current = await Promise.all(paths.map(pathIdentity));
|
|
903
978
|
const identities = new Map(segments.map((entry) => [entry.filePath, entry.identity]));
|
|
904
|
-
return paths.every((filePath, index) =>
|
|
979
|
+
return paths.every((filePath, index) => {
|
|
980
|
+
const expected = identities.get(filePath);
|
|
981
|
+
if (current[index] !== expected) return false;
|
|
982
|
+
return holes === void 0 || expected !== void 0 || holes.has(filePath);
|
|
983
|
+
});
|
|
905
984
|
}
|
|
906
985
|
async withSnapshot(read, signal) {
|
|
907
986
|
for (;;) {
|
|
@@ -911,7 +990,8 @@ var SessionJournalReader = class {
|
|
|
911
990
|
if (!(error instanceof SessionWatchError) || error.code !== "WATCH_JOURNAL_CORRUPT") throw error;
|
|
912
991
|
return { error };
|
|
913
992
|
});
|
|
914
|
-
|
|
993
|
+
const scan = await this.discoverPaths();
|
|
994
|
+
if (await this.matchesSnapshot(scan.paths, segments, scan.holes)) {
|
|
915
995
|
signal?.throwIfAborted();
|
|
916
996
|
if ("error" in outcome) throw outcome.error;
|
|
917
997
|
return outcome.value;
|
|
@@ -1264,7 +1344,8 @@ const LEGACY_AGENT_COMMANDS = {
|
|
|
1264
1344
|
pi: [
|
|
1265
1345
|
"npx pi-acp",
|
|
1266
1346
|
"npx pi-acp@^0.0.22",
|
|
1267
|
-
"npx pi-acp@^0.0.26"
|
|
1347
|
+
"npx pi-acp@^0.0.26",
|
|
1348
|
+
"npx pi-acp@^0.0.31"
|
|
1268
1349
|
],
|
|
1269
1350
|
codex: [
|
|
1270
1351
|
"npx @zed-industries/codex-acp",
|
|
@@ -1283,10 +1364,19 @@ const LEGACY_AGENT_COMMANDS = {
|
|
|
1283
1364
|
"npx -y @zed-industries/claude-agent-acp@^0.24.2",
|
|
1284
1365
|
"npx -y @zed-industries/claude-agent-acp@^0.25.0",
|
|
1285
1366
|
"npx -y @zed-industries/claude-agent-acp@^0.31.0",
|
|
1367
|
+
"npx -y @agentclientprotocol/claude-agent-acp@^0.24.2",
|
|
1368
|
+
"npx -y @agentclientprotocol/claude-agent-acp@^0.25.0",
|
|
1369
|
+
"npx -y @agentclientprotocol/claude-agent-acp@^0.31.0",
|
|
1286
1370
|
"npx -y @agentclientprotocol/claude-agent-acp@^0.36.1",
|
|
1287
1371
|
"npx -y @agentclientprotocol/claude-agent-acp@^0.37.0",
|
|
1372
|
+
"npx -y @agentclientprotocol/claude-agent-acp@^0.60.0",
|
|
1373
|
+
"npx -y @agentclientprotocol/claude-agent-acp@^0.76.0",
|
|
1374
|
+
"npm exec @agentclientprotocol/claude-agent-acp@^0.25.0",
|
|
1375
|
+
"npm exec @agentclientprotocol/claude-agent-acp@^0.31.0",
|
|
1288
1376
|
"npm exec @agentclientprotocol/claude-agent-acp@^0.36.1",
|
|
1289
|
-
"npm exec @agentclientprotocol/claude-agent-acp@^0.37.0"
|
|
1377
|
+
"npm exec @agentclientprotocol/claude-agent-acp@^0.37.0",
|
|
1378
|
+
"npm exec @agentclientprotocol/claude-agent-acp@^0.60.0",
|
|
1379
|
+
"npm exec @agentclientprotocol/claude-agent-acp@^0.76.0"
|
|
1290
1380
|
],
|
|
1291
1381
|
gemini: ["gemini", "gemini --experimental-acp"],
|
|
1292
1382
|
kiro: ["kiro-cli acp"],
|
|
@@ -1297,10 +1387,52 @@ function currentArgv(name) {
|
|
|
1297
1387
|
const argv = AGENT_ARGV_REGISTRY[name];
|
|
1298
1388
|
return argv ? [...argv] : void 0;
|
|
1299
1389
|
}
|
|
1390
|
+
function isFallbackCommand(name, agentCommand) {
|
|
1391
|
+
return (BUILT_IN_AGENT_PACKAGES[name]?.legacyFallbackCommands ?? []).includes(agentCommand);
|
|
1392
|
+
}
|
|
1393
|
+
/** Built-in agent whose current or earlier default command is exactly `agentCommand`. */
|
|
1394
|
+
function builtInAgentForCommand(agentCommand) {
|
|
1395
|
+
return Object.keys(AGENT_REGISTRY).find((name) => AGENT_REGISTRY[name] === agentCommand) ?? Object.keys(BUILT_IN_AGENT_PACKAGES).find((name) => isFallbackCommand(name, agentCommand)) ?? Object.keys(LEGACY_AGENT_COMMANDS).find((name) => LEGACY_AGENT_COMMANDS[name].includes(agentCommand));
|
|
1396
|
+
}
|
|
1300
1397
|
function resolveAgentArgvForCommand(agentCommand) {
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1398
|
+
const name = builtInAgentForCommand(agentCommand);
|
|
1399
|
+
return name ? currentArgv(name) : void 0;
|
|
1400
|
+
}
|
|
1401
|
+
function commandArgv(agentCommand) {
|
|
1402
|
+
const { command, args } = splitCommandLine(agentCommand);
|
|
1403
|
+
return [command, ...args];
|
|
1404
|
+
}
|
|
1405
|
+
function sameArgv(left, right) {
|
|
1406
|
+
return left.length === right.length && left.every((value, index) => value === right[index]);
|
|
1407
|
+
}
|
|
1408
|
+
function launchesBuiltIn(agentCommand, agentArgv, name) {
|
|
1409
|
+
return agentArgv === void 0 || sameArgv(agentArgv, commandArgv(agentCommand)) || sameArgv(agentArgv, AGENT_ARGV_REGISTRY[name] ?? []);
|
|
1410
|
+
}
|
|
1411
|
+
/**
|
|
1412
|
+
* Maps a saved launch identity from an earlier built-in default onto the current
|
|
1413
|
+
* built-in command and argv, so agent-scoped lookup keeps finding the session
|
|
1414
|
+
* after an adapter range change. Identities with a custom argv, and commands
|
|
1415
|
+
* acpx never shipped as a built-in default, are returned unchanged.
|
|
1416
|
+
*/
|
|
1417
|
+
function migrateBuiltInAgentIdentity(agentCommand, agentArgv) {
|
|
1418
|
+
const name = builtInAgentForCommand(agentCommand);
|
|
1419
|
+
const current = name ? AGENT_REGISTRY[name] : void 0;
|
|
1420
|
+
if (!name || !current || current === agentCommand) return {
|
|
1421
|
+
agentCommand,
|
|
1422
|
+
agentArgv
|
|
1423
|
+
};
|
|
1424
|
+
if (!launchesBuiltIn(agentCommand, agentArgv, name)) return {
|
|
1425
|
+
agentCommand,
|
|
1426
|
+
agentArgv
|
|
1427
|
+
};
|
|
1428
|
+
return {
|
|
1429
|
+
agentCommand: current,
|
|
1430
|
+
agentArgv: currentArgv(name)
|
|
1431
|
+
};
|
|
1432
|
+
}
|
|
1433
|
+
/** The agent command a session saved under `agentCommand` is filed under after migration. */
|
|
1434
|
+
function canonicalAgentCommand(agentCommand) {
|
|
1435
|
+
return migrateBuiltInAgentIdentity(agentCommand).agentCommand;
|
|
1304
1436
|
}
|
|
1305
1437
|
//#endregion
|
|
1306
1438
|
//#region src/session/persistence/parse.ts
|
|
@@ -1317,8 +1449,12 @@ function isStringArray(value) {
|
|
|
1317
1449
|
function parseOptionalAgentArgv(value) {
|
|
1318
1450
|
return isStringArray(value) && value.length > 0 && value[0]?.length > 0 ? value : void 0;
|
|
1319
1451
|
}
|
|
1320
|
-
function
|
|
1321
|
-
|
|
1452
|
+
function parsePersistedAgentIdentity(agentCommand, rawArgv) {
|
|
1453
|
+
const identity = migrateBuiltInAgentIdentity(agentCommand, parseOptionalAgentArgv(rawArgv));
|
|
1454
|
+
return {
|
|
1455
|
+
agentCommand: identity.agentCommand,
|
|
1456
|
+
agentArgv: identity.agentArgv ?? resolveAgentArgvForCommand(identity.agentCommand)
|
|
1457
|
+
};
|
|
1322
1458
|
}
|
|
1323
1459
|
function hasModelConfigOption(options) {
|
|
1324
1460
|
if (!Array.isArray(options)) return false;
|
|
@@ -1414,7 +1550,12 @@ function parseRequestTokenUsage(raw) {
|
|
|
1414
1550
|
for (const [key, value] of Object.entries(record)) {
|
|
1415
1551
|
const parsed = parseTokenUsage(value);
|
|
1416
1552
|
if (parsed == null) return null;
|
|
1417
|
-
usage
|
|
1553
|
+
Object.defineProperty(usage, key, {
|
|
1554
|
+
value: parsed,
|
|
1555
|
+
writable: true,
|
|
1556
|
+
enumerable: true,
|
|
1557
|
+
configurable: true
|
|
1558
|
+
});
|
|
1418
1559
|
}
|
|
1419
1560
|
return usage;
|
|
1420
1561
|
}
|
|
@@ -1532,6 +1673,7 @@ function parseAcpxState(raw) {
|
|
|
1532
1673
|
const record = asRecord$2(raw);
|
|
1533
1674
|
if (!record) return;
|
|
1534
1675
|
const state = {};
|
|
1676
|
+
if (record.session_origin === "new" || record.session_origin === "resume") state.session_origin = record.session_origin;
|
|
1535
1677
|
if (record.reset_on_next_ensure === true) state.reset_on_next_ensure = true;
|
|
1536
1678
|
assignStringState(state, "current_mode_id", record.current_mode_id);
|
|
1537
1679
|
assignStringState(state, "desired_mode_id", record.desired_mode_id);
|
|
@@ -1673,13 +1815,14 @@ function parseSessionRecord(raw) {
|
|
|
1673
1815
|
const eventLog = parseEventLog(record.event_log, record.acpx_record_id);
|
|
1674
1816
|
const metadata = parseSessionRecordMetadata(record);
|
|
1675
1817
|
if (!metadata) return null;
|
|
1818
|
+
const agent = parsePersistedAgentIdentity(record.agent_command, record.agent_argv);
|
|
1676
1819
|
return {
|
|
1677
1820
|
schema: SESSION_RECORD_SCHEMA,
|
|
1678
1821
|
acpxRecordId: record.acpx_record_id,
|
|
1679
1822
|
acpSessionId: record.acp_session_id,
|
|
1680
1823
|
agentSessionId: normalizeAgentSessionId(record.agent_session_id),
|
|
1681
|
-
agentCommand:
|
|
1682
|
-
agentArgv:
|
|
1824
|
+
agentCommand: agent.agentCommand,
|
|
1825
|
+
agentArgv: agent.agentArgv,
|
|
1683
1826
|
cwd: record.cwd,
|
|
1684
1827
|
name: optionals.name,
|
|
1685
1828
|
createdAt: record.created_at,
|
|
@@ -1849,8 +1992,16 @@ async function* sessionRecords(readOnly = false) {
|
|
|
1849
1992
|
if (!readOnly) await ensureSessionDir();
|
|
1850
1993
|
yield* scanSessionRecords(sessionBaseDir());
|
|
1851
1994
|
}
|
|
1852
|
-
|
|
1853
|
-
|
|
1995
|
+
/**
|
|
1996
|
+
* Commands a scoped query matches: the query itself, plus the current built-in
|
|
1997
|
+
* command when the query is an earlier built-in default (records under it are
|
|
1998
|
+
* migrated on read unless they carry a custom launcher).
|
|
1999
|
+
*/
|
|
2000
|
+
function agentScope(agentCommand) {
|
|
2001
|
+
return /* @__PURE__ */ new Set([agentCommand, canonicalAgentCommand(agentCommand)]);
|
|
2002
|
+
}
|
|
2003
|
+
function matchesSession(session, scope, normalizedName, includeClosed = false) {
|
|
2004
|
+
if (!scope.has(session.agentCommand)) return false;
|
|
1854
2005
|
if (!includeClosed && session.closed) return false;
|
|
1855
2006
|
if (normalizedName == null) return session.name == null;
|
|
1856
2007
|
return session.name === normalizedName;
|
|
@@ -1952,25 +2103,28 @@ async function listSessionsForAgent(agentCommand) {
|
|
|
1952
2103
|
return await collectSessionRecords(agentCommand);
|
|
1953
2104
|
}
|
|
1954
2105
|
async function collectSessionRecords(agentCommand) {
|
|
2106
|
+
const scope = agentCommand === void 0 ? void 0 : agentScope(agentCommand);
|
|
1955
2107
|
const records = [];
|
|
1956
|
-
for await (const record of sessionRecords()) if (
|
|
2108
|
+
for await (const record of sessionRecords()) if (scope === void 0 || scope.has(record.agentCommand)) records.push(record);
|
|
1957
2109
|
return records.toSorted((a, b) => b.lastUsedAt.localeCompare(a.lastUsedAt));
|
|
1958
2110
|
}
|
|
1959
2111
|
async function findSession(options) {
|
|
1960
2112
|
const normalizedCwd = absolutePath(options.cwd);
|
|
1961
2113
|
const normalizedName = normalizeName(options.name);
|
|
2114
|
+
const scope = agentScope(options.agentCommand);
|
|
1962
2115
|
let match;
|
|
1963
|
-
for await (const record of sessionRecords(options.readOnly)) if (record.cwd === normalizedCwd && matchesSession(record,
|
|
2116
|
+
for await (const record of sessionRecords(options.readOnly)) if (record.cwd === normalizedCwd && matchesSession(record, scope, normalizedName, options.includeClosed) && isNewer(record, match)) match = record;
|
|
1964
2117
|
return match;
|
|
1965
2118
|
}
|
|
1966
2119
|
async function findSessionByDirectoryWalk(options) {
|
|
1967
2120
|
const normalizedName = normalizeName(options.name);
|
|
2121
|
+
const scope = agentScope(options.agentCommand);
|
|
1968
2122
|
const directories = walkDirectories(options);
|
|
1969
2123
|
let match;
|
|
1970
2124
|
let distance = Infinity;
|
|
1971
2125
|
for await (const record of sessionRecords()) {
|
|
1972
2126
|
const candidateDistance = directories.get(record.cwd);
|
|
1973
|
-
if (candidateDistance !== void 0 && matchesSession(record,
|
|
2127
|
+
if (candidateDistance !== void 0 && matchesSession(record, scope, normalizedName) && (candidateDistance < distance || candidateDistance === distance && isNewer(record, match))) {
|
|
1974
2128
|
match = record;
|
|
1975
2129
|
distance = candidateDistance;
|
|
1976
2130
|
}
|
|
@@ -2023,13 +2177,14 @@ async function pruneSessions(options = {}) {
|
|
|
2023
2177
|
dryRun: false
|
|
2024
2178
|
};
|
|
2025
2179
|
}
|
|
2026
|
-
function isPruneCandidate(record,
|
|
2027
|
-
return record.closed === true && (!
|
|
2180
|
+
function isPruneCandidate(record, scope) {
|
|
2181
|
+
return record.closed === true && (!scope || scope.has(record.agentCommand));
|
|
2028
2182
|
}
|
|
2029
2183
|
async function loadPrunableRecords(cutoff, agentCommand) {
|
|
2030
2184
|
const records = [];
|
|
2031
2185
|
const cutoffIso = cutoff?.toISOString();
|
|
2032
|
-
|
|
2186
|
+
const scope = agentCommand === void 0 ? void 0 : agentScope(agentCommand);
|
|
2187
|
+
for await (const record of sessionRecords()) if (isPruneCandidate(record, scope) && isBeforeCutoff(record, cutoffIso)) records.push(record);
|
|
2033
2188
|
return records.toSorted((a, b) => b.lastUsedAt.localeCompare(a.lastUsedAt));
|
|
2034
2189
|
}
|
|
2035
2190
|
function isBeforeCutoff(record, cutoffIso) {
|
|
@@ -5217,6 +5372,6 @@ async function trySetConfigOptionOnRunningOwner(sessionId, configId, value, time
|
|
|
5217
5372
|
});
|
|
5218
5373
|
}
|
|
5219
5374
|
//#endregion
|
|
5220
|
-
export {
|
|
5375
|
+
export { measurePerf as $, UnsupportedPromptContentError as $t, findSession as A, AUTH_POLICIES as At, assertPersistedKeyPolicy as B, AgentStartupError as Bt, textPrompt as C, exitCodeForOutputErrorCode as Ct, DEFAULT_HISTORY_LIMIT as D, normalizeOutputError as Dt, observeProcessIncarnation as E, isRetryablePromptError as Et, normalizeName as F, PERMISSION_POLICY_ACTIONS as Ft, normalizeAgentSessionId as G, PermissionDeniedError as Gt, canonicalAgentCommand as H, ClaudeAcpSessionCreateTimeoutError as Ht, pruneSessions as I, SESSION_RECORD_SCHEMA as It, SessionWatchError as J, SessionConfigOptionReplayError as Jt, SESSION_JOURNAL_SCHEMA as K, PermissionPromptUnavailableError as Kt, readSessionRecord as L, AcpxOperationalError as Lt, isoNow as M, NON_INTERACTIVE_PERMISSION_POLICIES as Mt, listSessions as N, OUTPUT_FORMATS as Nt, absolutePath as O, extractAcpError as Ot, listSessionsForAgent as P, PERMISSION_MODES as Pt, incrementPerfCounter as Q, SessionResumeRequiredError as Qt, resolveSessionRecord as R, AgentDisconnectedError as Rt, promptToDisplayText as S, isProcessAlive as St, lockOwnerPid as T, isAcpQueryClosedBeforeResponseError as Tt, serializeSessionRecordForDisk as U, CopilotAcpUnsupportedError as Ut, parseSessionRecord as V, AuthPolicyError as Vt, extractAgentSessionId as W, GeminiAcpStartupTimeoutError as Wt, formatPerfMetric as X, SessionModelReplayError as Xt, watchSession as Y, SessionModeReplayError as Yt, getPerfMetricsSnapshot as Z, SessionNotFoundError as Zt, ProcessDescendants as _, sessionEventLockPath as _t, trySetModelOnRunningOwner as a, isAcpMessageObject as at, mergePromptSourceWithText as b, writePrivateJsonFile as bt, probeQueueOwnerHealth as c, parsePermissionNotice as ct, releaseQueueOwnerLease as d, boundedEventMaxSegments as dt, resetPerfMetrics as et, terminateProcess as f, defaultSessionEventLog as ft, QueueLeaseGuardSettlementError as g, sessionEventActivePath as gt, waitMs as h, sessionBaseDir as ht, trySetModeOnRunningOwner as i, isAcpJsonRpcMessage as it, findSessionByDirectoryWalk as j, EXIT_CODES as jt, findGitRepositoryRoot as k, isAcpResourceNotFoundError as kt, readQueueOwnerRecord as l, parsePromptStopReason as lt, tryAcquireQueueOwnerLease as m, retainedEventMaxSegments as mt, tryCloseSessionOnRunningOwner as n, startPerfTimer as nt, trySubmitToRunningOwner as o, isSessionUpdateNotification as ot, terminateQueueOwnerForSession as p, existingEventSegmentIndices as pt, SessionJournalReader as q, QueueConnectionError as qt, trySetConfigOptionOnRunningOwner as r, extractSessionUpdateNotification as rt, SessionQueueOwner as s, parseJsonRpcErrorMessage as st, tryCancelOnRunningOwner as t, setPerfGauge as tt, refreshQueueOwnerLease as u, DEFAULT_EVENT_SEGMENT_MAX_BYTES as ut, PromptInputValidationError as v, sessionEventSegmentPath as vt, createLockOwner as w, formatErrorMessage as wt, parsePromptSource as x, _usingCtx as xt, getUnsupportedPromptContentMessage as y, writePrivateFile as yt, writeSessionRecord as z, AgentSpawnError as zt };
|
|
5221
5376
|
|
|
5222
|
-
//# sourceMappingURL=ipc-
|
|
5377
|
+
//# sourceMappingURL=ipc-C96eDxkW.js.map
|