acpx 0.7.0 → 0.9.0

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 (50) hide show
  1. package/README.md +14 -6
  2. package/dist/{cli-T-Z-9x6a.js → cli-Bf3yjqzE.js} +35 -10
  3. package/dist/cli-Bf3yjqzE.js.map +1 -0
  4. package/dist/cli.d.ts +1 -1
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +724 -241
  7. package/dist/cli.js.map +1 -1
  8. package/dist/{client-COPilhO_.d.ts → client-BssohYqM.d.ts} +35 -4
  9. package/dist/client-BssohYqM.d.ts.map +1 -0
  10. package/dist/flags-C-rwARqg.js +260 -0
  11. package/dist/flags-C-rwARqg.js.map +1 -0
  12. package/dist/{flows-CF8w1rPI.js → flows-WLs26_5Y.js} +405 -337
  13. package/dist/flows-WLs26_5Y.js.map +1 -0
  14. package/dist/flows.d.ts +23 -2
  15. package/dist/flows.d.ts.map +1 -1
  16. package/dist/flows.js +1 -1
  17. package/dist/{prompt-turn-CVPMWdj1.js → live-checkpoint-D5d-K9s1.js} +2487 -609
  18. package/dist/live-checkpoint-D5d-K9s1.js.map +1 -0
  19. package/dist/output-DPg20dvn.js +4146 -0
  20. package/dist/output-DPg20dvn.js.map +1 -0
  21. package/dist/runtime.d.ts +56 -4
  22. package/dist/runtime.d.ts.map +1 -1
  23. package/dist/runtime.js +676 -393
  24. package/dist/runtime.js.map +1 -1
  25. package/dist/{types-CVBeQyi3.d.ts → session-options-CFudjdkU.d.ts} +62 -3
  26. package/dist/session-options-CFudjdkU.d.ts.map +1 -0
  27. package/package.json +30 -25
  28. package/skills/acpx/SKILL.md +211 -13
  29. package/dist/cli-T-Z-9x6a.js.map +0 -1
  30. package/dist/client-COPilhO_.d.ts.map +0 -1
  31. package/dist/flags-Dj-IXgo9.js +0 -163
  32. package/dist/flags-Dj-IXgo9.js.map +0 -1
  33. package/dist/flows-CF8w1rPI.js.map +0 -1
  34. package/dist/ipc-ABXlXzGP.js +0 -1290
  35. package/dist/ipc-ABXlXzGP.js.map +0 -1
  36. package/dist/jsonrpc-DSxh2w5R.js +0 -68
  37. package/dist/jsonrpc-DSxh2w5R.js.map +0 -1
  38. package/dist/output-DmHvT8vm.js +0 -807
  39. package/dist/output-DmHvT8vm.js.map +0 -1
  40. package/dist/perf-metrics-C2pXfxvR.js +0 -598
  41. package/dist/perf-metrics-C2pXfxvR.js.map +0 -1
  42. package/dist/prompt-turn-CVPMWdj1.js.map +0 -1
  43. package/dist/render-N5YwotCy.js +0 -172
  44. package/dist/render-N5YwotCy.js.map +0 -1
  45. package/dist/rolldown-runtime-CiIaOW0V.js +0 -13
  46. package/dist/session-CDaQe6BH.js +0 -1538
  47. package/dist/session-CDaQe6BH.js.map +0 -1
  48. package/dist/session-options-pCbHn_n7.d.ts +0 -13
  49. package/dist/session-options-pCbHn_n7.d.ts.map +0 -1
  50. package/dist/types-CVBeQyi3.d.ts.map +0 -1
@@ -1,5 +1,5 @@
1
- import { a as PermissionMode, c as PromptInput, i as NonInteractivePermissionPolicy, o as PermissionStats, t as AcpClientOptions } from "./types-CVBeQyi3.js";
2
- import { InitializeResponse, PromptResponse, SessionConfigOption, SessionModelState, SetSessionConfigOptionResponse } from "@agentclientprotocol/sdk";
1
+ import { c as NonInteractivePermissionPolicy, d as PermissionStats, l as PermissionMode, p as PromptInput, r as AcpClientOptions } from "./session-options-CFudjdkU.js";
2
+ import { InitializeResponse, ListSessionsRequest, ListSessionsResponse, PromptResponse, SessionConfigOption, SessionModelState, SetSessionConfigOptionResponse } from "@agentclientprotocol/sdk";
3
3
 
4
4
  //#region src/acp/client.d.ts
5
5
  type LoadSessionOptions = {
@@ -18,6 +18,7 @@ type SessionLoadResult = {
18
18
  configOptions?: SessionConfigOption[];
19
19
  models?: SessionModelState;
20
20
  };
21
+ type SessionResumeResult = SessionLoadResult;
21
22
  type AgentDisconnectReason = "process_exit" | "process_close" | "pipe_close" | "connection_close";
22
23
  type AgentExitInfo = {
23
24
  exitCode: number | null;
@@ -49,6 +50,7 @@ declare class AcpClient {
49
50
  private suppressReplaySessionUpdateMessages;
50
51
  private activePrompt?;
51
52
  private readonly cancellingSessionIds;
53
+ private readonly permissionAbortControllers;
52
54
  private closing;
53
55
  private agentStartedAt?;
54
56
  private lastAgentExit?;
@@ -61,33 +63,54 @@ declare class AcpClient {
61
63
  getPermissionStats(): PermissionStats;
62
64
  getAgentLifecycleSnapshot(): AgentLifecycleSnapshot;
63
65
  supportsLoadSession(): boolean;
66
+ supportsResumeSession(): boolean;
64
67
  supportsCloseSession(): boolean;
65
- setEventHandlers(handlers: Pick<AcpClientOptions, "onAcpMessage" | "onAcpOutputMessage" | "onSessionUpdate" | "onClientOperation">): void;
68
+ supportsListSessions(): boolean;
69
+ setEventHandlers(handlers: Pick<AcpClientOptions, "onAcpMessage" | "onAcpOutputMessage" | "onSessionUpdate" | "onClientOperation" | "onPermissionEscalation">): void;
66
70
  clearEventHandlers(): void;
67
71
  updateRuntimeOptions(options: {
68
72
  permissionMode?: PermissionMode;
69
73
  nonInteractivePermissions?: NonInteractivePermissionPolicy;
74
+ permissionPolicy?: AcpClientOptions["permissionPolicy"];
70
75
  terminal?: boolean;
71
76
  suppressSdkConsoleErrors?: boolean;
72
77
  verbose?: boolean;
73
78
  }): void;
79
+ private refreshRuntimePermissionPolicy;
74
80
  hasReusableSession(sessionId: string): boolean;
75
81
  hasActivePrompt(sessionId?: string): boolean;
76
82
  start(): Promise<void>;
83
+ private resolveAgentLaunchPlan;
84
+ private logAgentLaunch;
85
+ private ensureLaunchSupport;
86
+ private spawnAgentProcess;
87
+ private createConnection;
88
+ private initializeAgentConnection;
89
+ private initializeProtocolConnection;
90
+ private handleInitializeFailure;
77
91
  private createTappedStream;
78
92
  createSession(cwd?: string): Promise<SessionCreateResult>;
79
93
  loadSession(sessionId: string, cwd?: string): Promise<SessionLoadResult>;
80
94
  loadSessionWithOptions(sessionId: string, cwd?: string, options?: LoadSessionOptions): Promise<SessionLoadResult>;
95
+ resumeSession(sessionId: string, cwd?: string): Promise<SessionResumeResult>;
96
+ private applySessionUpdateSuppression;
97
+ private restoreSessionUpdateSuppression;
81
98
  prompt(sessionId: string, prompt: PromptInput | string): Promise<PromptResponse>;
99
+ private normalizePromptForAgent;
100
+ private returnPromptResponseOrPermissionFailure;
101
+ private throwPromptPermissionFailureIfPresent;
82
102
  setSessionMode(sessionId: string, modeId: string): Promise<void>;
83
103
  setSessionConfigOption(sessionId: string, configId: string, value: string): Promise<SetSessionConfigOptionResponse>;
84
104
  setSessionModel(sessionId: string, modelId: string): Promise<void>;
85
105
  cancel(sessionId: string): Promise<void>;
86
106
  closeSession(sessionId: string): Promise<void>;
107
+ listSessions(params?: ListSessionsRequest): Promise<ListSessionsResponse>;
87
108
  requestCancelActivePrompt(): Promise<boolean>;
88
109
  cancelActivePrompt(waitMs?: number): Promise<PromptResponse | undefined>;
89
110
  close(): Promise<void>;
90
111
  private terminateAgentProcess;
112
+ private endAgentStdin;
113
+ private killAgentIfRunning;
91
114
  private detachAgentHandles;
92
115
  private getConnection;
93
116
  private log;
@@ -98,6 +121,12 @@ declare class AcpClient {
98
121
  private selectAuthMethod;
99
122
  private authenticateIfRequired;
100
123
  private handlePermissionRequest;
124
+ private tryHandlePermissionRequestWithHost;
125
+ private hostPermissionDecisionResponse;
126
+ private hostPermissionErrorResponse;
127
+ private resolvePermissionRequestFromMode;
128
+ private emitPermissionEscalation;
129
+ private handleModePermissionError;
101
130
  private attachAgentLifecycleObservers;
102
131
  private recordAgentExit;
103
132
  private notePromptPermissionFailure;
@@ -111,6 +140,8 @@ declare class AcpClient {
111
140
  private handleWaitForTerminalExit;
112
141
  private handleKillTerminal;
113
142
  private handleReleaseTerminal;
143
+ private cancellationSignalForSession;
144
+ private abortAndDropPermissionSignal;
114
145
  private recordPermissionDecision;
115
146
  private recordPermissionError;
116
147
  private handleSessionUpdate;
@@ -122,4 +153,4 @@ declare class AcpClient {
122
153
  }
123
154
  //#endregion
124
155
  export { AcpClient as t };
125
- //# sourceMappingURL=client-COPilhO_.d.ts.map
156
+ //# sourceMappingURL=client-BssohYqM.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-BssohYqM.d.ts","names":[],"sources":["../src/acp/client.ts"],"mappings":"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"}
@@ -0,0 +1,260 @@
1
+ import "./output-DPg20dvn.js";
2
+ import { It as PERMISSION_POLICY_ACTIONS, Pt as OUTPUT_FORMATS, jt as NON_INTERACTIVE_PERMISSION_POLICIES, kt as AUTH_POLICIES, xt as resolveAgentCommand } from "./live-checkpoint-D5d-K9s1.js";
3
+ import path from "node:path";
4
+ import { InvalidArgumentError } from "commander";
5
+ import fs from "node:fs/promises";
6
+ //#region src/permission-policy.ts
7
+ function asRecord$1(value) {
8
+ if (!value || typeof value !== "object" || Array.isArray(value)) return;
9
+ return value;
10
+ }
11
+ function parseRuleList(value, key, source) {
12
+ if (value == null) return;
13
+ if (!Array.isArray(value)) throw new Error(`${source}: permission policy ${key} must be an array of strings`);
14
+ return value.map((entry) => {
15
+ if (typeof entry !== "string" || entry.trim().length === 0) throw new Error(`${source}: permission policy ${key} must contain only non-empty strings`);
16
+ return entry.trim();
17
+ });
18
+ }
19
+ function isPermissionPolicyAction(value) {
20
+ return typeof value === "string" && PERMISSION_POLICY_ACTIONS.includes(value);
21
+ }
22
+ function parseDefaultAction(value, source) {
23
+ if (value == null) return;
24
+ if (!isPermissionPolicyAction(value)) throw new Error(`${source}: permission policy defaultAction must be one of ${PERMISSION_POLICY_ACTIONS.join(", ")}`);
25
+ return value;
26
+ }
27
+ function assignRuleList(policy, key, value) {
28
+ if (value) policy[key] = value;
29
+ }
30
+ function parsePermissionPolicy(value, source = "permission policy") {
31
+ const record = asRecord$1(value);
32
+ if (!record) throw new Error(`${source}: permission policy must be a JSON object`);
33
+ const policy = {};
34
+ assignRuleList(policy, "autoApprove", parseRuleList(record.autoApprove, "autoApprove", source));
35
+ assignRuleList(policy, "autoDeny", parseRuleList(record.autoDeny, "autoDeny", source));
36
+ assignRuleList(policy, "escalate", parseRuleList(record.escalate, "escalate", source));
37
+ const defaultAction = parseDefaultAction(record.defaultAction, source);
38
+ if (defaultAction) policy.defaultAction = defaultAction;
39
+ return policy;
40
+ }
41
+ async function loadPermissionPolicySpec(spec, cwd) {
42
+ const trimmed = spec?.trim();
43
+ if (!trimmed) return;
44
+ if (trimmed.startsWith("{")) return parsePermissionPolicy(JSON.parse(trimmed), "--permission-policy");
45
+ const policyPath = path.resolve(cwd, trimmed);
46
+ const raw = await fs.readFile(policyPath, "utf8");
47
+ return parsePermissionPolicy(JSON.parse(raw), policyPath);
48
+ }
49
+ //#endregion
50
+ //#region src/cli/flags.ts
51
+ function hasExplicitPermissionModeFlag(flags) {
52
+ return flags.approveAll === true || flags.approveReads === true || flags.denyAll === true;
53
+ }
54
+ function asRecord(value) {
55
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value) ? value : void 0;
56
+ }
57
+ function stringOption(value) {
58
+ return typeof value === "string" ? value : void 0;
59
+ }
60
+ function numberOption(value) {
61
+ return typeof value === "number" ? value : void 0;
62
+ }
63
+ function stringArrayOption(value) {
64
+ return Array.isArray(value) && value.every((entry) => typeof entry === "string") ? value : void 0;
65
+ }
66
+ function nonEmptyStringOption(value) {
67
+ return typeof value === "string" && value.length > 0 ? value : void 0;
68
+ }
69
+ function parseOutputFormat(value) {
70
+ if (!OUTPUT_FORMATS.includes(value)) throw new InvalidArgumentError(`Invalid format "${value}". Expected one of: ${OUTPUT_FORMATS.join(", ")}`);
71
+ return value;
72
+ }
73
+ function parseAuthPolicy(value) {
74
+ if (!AUTH_POLICIES.includes(value)) throw new InvalidArgumentError(`Invalid auth policy "${value}". Expected one of: ${AUTH_POLICIES.join(", ")}`);
75
+ return value;
76
+ }
77
+ function parseNonInteractivePermissionPolicy(value) {
78
+ if (!NON_INTERACTIVE_PERMISSION_POLICIES.includes(value)) throw new InvalidArgumentError(`Invalid non-interactive permission policy "${value}". Expected one of: ${NON_INTERACTIVE_PERMISSION_POLICIES.join(", ")}`);
79
+ return value;
80
+ }
81
+ function parseTimeoutSeconds(value) {
82
+ const parsed = Number(value);
83
+ if (!Number.isFinite(parsed) || parsed <= 0) throw new InvalidArgumentError("Timeout must be a positive number of seconds");
84
+ return Math.round(parsed * 1e3);
85
+ }
86
+ function parseTtlSeconds(value) {
87
+ const parsed = Number(value);
88
+ if (!Number.isFinite(parsed) || parsed < 0) throw new InvalidArgumentError("TTL must be a non-negative number of seconds");
89
+ return Math.round(parsed * 1e3);
90
+ }
91
+ function parseSessionName(value) {
92
+ const trimmed = value.trim();
93
+ if (trimmed.length === 0) throw new InvalidArgumentError("Session name must not be empty");
94
+ return trimmed;
95
+ }
96
+ function parseNonEmptyValue(label, value) {
97
+ const trimmed = value.trim();
98
+ if (trimmed.length === 0) throw new InvalidArgumentError(`${label} must not be empty`);
99
+ return trimmed;
100
+ }
101
+ function parseHistoryLimit(value) {
102
+ const parsed = Number(value);
103
+ if (!Number.isInteger(parsed) || parsed <= 0) throw new InvalidArgumentError("Limit must be a positive integer");
104
+ return parsed;
105
+ }
106
+ function parseDaysOlderThan(value) {
107
+ const parsed = Number(value);
108
+ if (!Number.isInteger(parsed) || parsed <= 0) throw new InvalidArgumentError("--older-than must be a positive integer number of days");
109
+ return parsed;
110
+ }
111
+ function parsePruneBeforeDate(value) {
112
+ const date = new Date(value);
113
+ if (Number.isNaN(date.getTime())) throw new InvalidArgumentError(`--before must be a valid date (e.g. 2026-01-01 or 2026-01-01T00:00:00Z)`);
114
+ return date;
115
+ }
116
+ function parseAllowedTools(value) {
117
+ const trimmed = value.trim();
118
+ if (trimmed.length === 0) return [];
119
+ const items = trimmed.split(",").map((item) => item.trim());
120
+ if (items.some((item) => item.length === 0)) throw new InvalidArgumentError("Allowed tools must be a comma-separated list without empty entries");
121
+ return items;
122
+ }
123
+ function parseMaxTurns(value) {
124
+ const parsed = Number(value);
125
+ if (!Number.isInteger(parsed) || parsed <= 0) throw new InvalidArgumentError("Max turns must be a positive integer");
126
+ return parsed;
127
+ }
128
+ function resolveSystemPromptFlag(opts) {
129
+ const replace = nonEmptyStringOption(opts.systemPrompt);
130
+ const append = nonEmptyStringOption(opts.appendSystemPrompt);
131
+ if (replace !== void 0 && append !== void 0) throw new InvalidArgumentError("Use only one of --system-prompt or --append-system-prompt");
132
+ if (replace !== void 0) return replace;
133
+ if (append !== void 0) return { append };
134
+ }
135
+ function parsePromptRetries(value) {
136
+ const parsed = Number(value);
137
+ if (!Number.isInteger(parsed) || parsed < 0) throw new InvalidArgumentError("Prompt retries must be a non-negative integer");
138
+ return parsed;
139
+ }
140
+ function resolvePermissionMode(flags, defaultMode) {
141
+ if ([
142
+ flags.approveAll,
143
+ flags.approveReads,
144
+ flags.denyAll
145
+ ].filter(Boolean).length > 1) throw new InvalidArgumentError("Use only one permission mode: --approve-all, --approve-reads, or --deny-all");
146
+ if (flags.approveAll) return "approve-all";
147
+ if (flags.approveReads) return "approve-reads";
148
+ if (flags.denyAll) return "deny-all";
149
+ return defaultMode;
150
+ }
151
+ function addGlobalFlags(command) {
152
+ return command.option("--agent <command>", "Raw ACP agent command (escape hatch)").option("--cwd <dir>", "Working directory", process.cwd()).option("--auth-policy <policy>", "Authentication policy: skip or fail when auth is required", parseAuthPolicy).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("--non-interactive-permissions <policy>", "When prompting is unavailable: deny or fail", parseNonInteractivePermissionPolicy).option("--permission-policy <json-or-file>", "Permission policy JSON or path (autoApprove, autoDeny, escalate, defaultAction)").option("--policy <json-or-file>", "Alias for --permission-policy").option("--format <fmt>", "Output format: text, json, quiet", parseOutputFormat).option("--suppress-reads", "Suppress raw read-file contents in output").option("--model <id>", "Agent model id").option("--allowed-tools <list>", "Allowed tool names as a comma-separated list (use \"\" for no tools)", parseAllowedTools).option("--max-turns <count>", "Maximum turns for the session", parseMaxTurns).option("--system-prompt <text>", "Replace the agent system prompt (claude-agent-acp via ACP _meta.systemPrompt)", (value) => parseNonEmptyValue("System prompt", value)).option("--append-system-prompt <text>", "Append text to the agent system prompt (claude-agent-acp via ACP _meta.systemPrompt.append)", (value) => parseNonEmptyValue("Append system prompt", value)).option("--prompt-retries <count>", "Retry failed prompt turns on transient errors (default: 0)", parsePromptRetries).option("--json-strict", "Strict JSON mode: requires --format json and suppresses non-JSON stderr output").option("--no-terminal", "Do not advertise ACP terminal capability").option("--timeout <seconds>", "Maximum time to wait for agent response", parseTimeoutSeconds).option("--ttl <seconds>", "Queue owner idle TTL before shutdown (0 = keep alive forever) (default: 300)", parseTtlSeconds).option("--verbose", "Enable verbose debug logs");
153
+ }
154
+ function addSessionOption(command) {
155
+ return command.option("-s, --session <name>", "Use named session instead of cwd default", parseSessionName).option("--no-wait", "Queue prompt and return immediately when another prompt is already running");
156
+ }
157
+ function addSessionNameOption(command) {
158
+ return command.option("-s, --session <name>", "Use named session instead of cwd default", parseSessionName);
159
+ }
160
+ function resolveSessionNameFromFlags(flags, command) {
161
+ const directSession = parseOptionalSessionName(flags.session);
162
+ if (directSession !== void 0) return directSession;
163
+ const globalSession = parseOptionalSessionName(asRecord(command.optsWithGlobals?.())?.session);
164
+ if (globalSession !== void 0) return globalSession;
165
+ return parseOptionalSessionName(asRecord(command.parent?.opts?.())?.session);
166
+ }
167
+ function parseOptionalSessionName(value) {
168
+ const session = stringOption(value);
169
+ return session === void 0 ? void 0 : parseSessionName(session);
170
+ }
171
+ function addPromptInputOption(command) {
172
+ return command.option("-f, --file <path>", "Read prompt text from file path (use - for stdin)");
173
+ }
174
+ function resolveGlobalFlags(command, config) {
175
+ const opts = asRecord(command.optsWithGlobals()) ?? {};
176
+ const format = parseOutputFormat(stringOption(opts.format) ?? config.format ?? "text");
177
+ const jsonStrict = opts.jsonStrict === true;
178
+ const verbose = opts.verbose === true;
179
+ assertOutputFlagCompatibility(format, jsonStrict, verbose);
180
+ return {
181
+ agent: stringOption(opts.agent),
182
+ cwd: resolveCwdOption(opts.cwd),
183
+ authPolicy: resolveAuthPolicy(opts.authPolicy, config),
184
+ nonInteractivePermissions: resolveNonInteractivePermissions(opts.nonInteractivePermissions, config),
185
+ permissionPolicy: resolvePermissionPolicyOption(opts),
186
+ jsonStrict,
187
+ suppressReads: opts.suppressReads === true,
188
+ terminal: resolveTerminalOption(opts.terminal),
189
+ timeout: resolveTimeoutOption(opts.timeout, config),
190
+ ttl: resolveTtlOption(opts.ttl, config),
191
+ verbose,
192
+ format,
193
+ model: resolveModelOption(opts.model),
194
+ allowedTools: stringArrayOption(opts.allowedTools),
195
+ maxTurns: numberOption(opts.maxTurns),
196
+ systemPrompt: resolveSystemPromptFlag(opts),
197
+ promptRetries: numberOption(opts.promptRetries),
198
+ approveAll: opts.approveAll ? true : void 0,
199
+ approveReads: opts.approveReads ? true : void 0,
200
+ denyAll: opts.denyAll ? true : void 0
201
+ };
202
+ }
203
+ function resolveCwdOption(value) {
204
+ return stringOption(value) ?? process.cwd();
205
+ }
206
+ function resolveAuthPolicy(optsValue, config) {
207
+ const value = stringOption(optsValue);
208
+ return value === void 0 ? config.authPolicy : parseAuthPolicy(value);
209
+ }
210
+ function resolveNonInteractivePermissions(optsValue, config) {
211
+ const value = stringOption(optsValue);
212
+ return value === void 0 ? config.nonInteractivePermissions : parseNonInteractivePermissionPolicy(value);
213
+ }
214
+ function resolvePermissionPolicyOption(opts) {
215
+ const primary = stringOption(opts.permissionPolicy);
216
+ const alias = stringOption(opts.policy);
217
+ if (primary !== void 0 && alias !== void 0 && primary !== alias) throw new InvalidArgumentError("Use only one permission policy flag: --permission-policy or --policy");
218
+ return primary ?? alias;
219
+ }
220
+ function resolveTerminalOption(value) {
221
+ return value === false ? false : void 0;
222
+ }
223
+ function resolveTimeoutOption(value, config) {
224
+ return numberOption(value) ?? config.timeoutMs;
225
+ }
226
+ function resolveTtlOption(value, config) {
227
+ return numberOption(value) ?? config.ttlMs ?? 3e5;
228
+ }
229
+ function assertOutputFlagCompatibility(format, jsonStrict, verbose) {
230
+ if (jsonStrict && format !== "json") throw new InvalidArgumentError("--json-strict requires --format json");
231
+ if (jsonStrict && verbose) throw new InvalidArgumentError("--json-strict cannot be combined with --verbose");
232
+ }
233
+ function resolveModelOption(value) {
234
+ const model = stringOption(value);
235
+ return model === void 0 ? void 0 : parseNonEmptyValue("Model", model);
236
+ }
237
+ function resolveOutputPolicy(format, jsonStrict) {
238
+ return {
239
+ format,
240
+ jsonStrict,
241
+ suppressReads: false,
242
+ suppressNonJsonStderr: jsonStrict,
243
+ queueErrorAlreadyEmitted: format !== "quiet",
244
+ suppressSdkConsoleErrors: jsonStrict
245
+ };
246
+ }
247
+ function resolveAgentInvocation(explicitAgentName, globalFlags, config) {
248
+ const override = globalFlags.agent?.trim();
249
+ if (override && explicitAgentName) throw new InvalidArgumentError("Do not combine positional agent with --agent override");
250
+ const agentName = explicitAgentName ?? config.defaultAgent ?? "codex";
251
+ return {
252
+ agentName,
253
+ agentCommand: override && override.length > 0 ? override : resolveAgentCommand(agentName, config.agents),
254
+ cwd: path.resolve(globalFlags.cwd)
255
+ };
256
+ }
257
+ //#endregion
258
+ export { resolveOutputPolicy as _, hasExplicitPermissionModeFlag as a, loadPermissionPolicySpec as b, parseHistoryLimit as c, parseOutputFormat as d, parsePruneBeforeDate as f, resolveGlobalFlags as g, resolveAgentInvocation as h, addSessionOption as i, parseMaxTurns as l, parseTtlSeconds as m, addPromptInputOption as n, parseAllowedTools as o, parseSessionName as p, addSessionNameOption as r, parseDaysOlderThan as s, addGlobalFlags as t, parseNonEmptyValue as u, resolvePermissionMode as v, resolveSessionNameFromFlags as y };
259
+
260
+ //# sourceMappingURL=flags-C-rwARqg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flags-C-rwARqg.js","names":["asRecord","resolveAgentCommandFromRegistry"],"sources":["../src/permission-policy.ts","../src/cli/flags.ts"],"sourcesContent":["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 path from \"node:path\";\nimport { InvalidArgumentError } from \"commander\";\nimport type { Command } from \"commander\";\nimport {\n DEFAULT_AGENT_NAME,\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\";\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 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};\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 StatusFlags = {\n session?: string;\n};\n\nexport type SessionsPruneFlags = {\n dryRun?: boolean;\n before?: Date;\n olderThan?: number;\n includeHistory?: boolean;\n};\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\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 return Math.round(parsed * 1000);\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 return Math.round(parsed * 1000);\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 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-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(\"--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: StatusFlags,\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 = asRecord(\n (command as unknown as { optsWithGlobals?: () => unknown }).optsWithGlobals?.(),\n );\n const globalSession = parseOptionalSessionName(allOpts?.session);\n if (globalSession !== undefined) {\n return globalSession;\n }\n\n const parentOpts = asRecord(command.parent?.opts?.() as unknown);\n return parseOptionalSessionName(parentOpts?.session);\n}\n\nfunction parseOptionalSessionName(value: unknown): string | undefined {\n const session = stringOption(value);\n return session === undefined ? undefined : parseSessionName(session);\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 resolveGlobalFlags(command: Command, config: ResolvedAcpxConfig): GlobalFlags {\n const opts = asRecord(command.optsWithGlobals() as unknown) ?? {};\n const format = parseOutputFormat(stringOption(opts.format) ?? config.format ?? \"text\");\n const jsonStrict = opts.jsonStrict === true;\n const verbose = opts.verbose === true;\n assertOutputFlagCompatibility(format, jsonStrict, verbose);\n\n return {\n agent: 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 terminal: resolveTerminalOption(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 resolveTerminalOption(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\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,\n };\n}\n\nexport function resolveAgentInvocation(\n explicitAgentName: string | undefined,\n globalFlags: GlobalFlags,\n config: ResolvedAcpxConfig,\n): {\n agentName: string;\n agentCommand: string;\n cwd: string;\n} {\n const override = globalFlags.agent?.trim();\n if (override && explicitAgentName) {\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 agentCommand =\n override && override.length > 0\n ? override\n : resolveAgentCommandFromRegistry(agentName, config.agents);\n\n return {\n agentName,\n agentCommand,\n cwd: path.resolve(globalFlags.cwd),\n };\n}\n"],"mappings":"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"}