@claudexor/cli 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +22 -0
  3. package/dist/args.d.ts +12 -0
  4. package/dist/args.d.ts.map +1 -0
  5. package/dist/args.js +88 -0
  6. package/dist/args.js.map +1 -0
  7. package/dist/attachment-resolver.d.ts +11 -0
  8. package/dist/attachment-resolver.d.ts.map +1 -0
  9. package/dist/attachment-resolver.js +61 -0
  10. package/dist/attachment-resolver.js.map +1 -0
  11. package/dist/capabilities.d.ts +13 -0
  12. package/dist/capabilities.d.ts.map +1 -0
  13. package/dist/capabilities.js +90 -0
  14. package/dist/capabilities.js.map +1 -0
  15. package/dist/claudexord.d.ts +3 -0
  16. package/dist/claudexord.d.ts.map +1 -0
  17. package/dist/claudexord.js +564 -0
  18. package/dist/claudexord.js.map +1 -0
  19. package/dist/cli-io.d.ts +28 -0
  20. package/dist/cli-io.d.ts.map +1 -0
  21. package/dist/cli-io.js +37 -0
  22. package/dist/cli-io.js.map +1 -0
  23. package/dist/cli.d.ts +3 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +1459 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/command-registry.d.ts +105 -0
  28. package/dist/command-registry.d.ts.map +1 -0
  29. package/dist/command-registry.js +516 -0
  30. package/dist/command-registry.js.map +1 -0
  31. package/dist/daemon-lifecycle.d.ts +18 -0
  32. package/dist/daemon-lifecycle.d.ts.map +1 -0
  33. package/dist/daemon-lifecycle.js +62 -0
  34. package/dist/daemon-lifecycle.js.map +1 -0
  35. package/dist/daemon-run.d.ts +86 -0
  36. package/dist/daemon-run.d.ts.map +1 -0
  37. package/dist/daemon-run.js +269 -0
  38. package/dist/daemon-run.js.map +1 -0
  39. package/dist/decision.d.ts +18 -0
  40. package/dist/decision.d.ts.map +1 -0
  41. package/dist/decision.js +46 -0
  42. package/dist/decision.js.map +1 -0
  43. package/dist/live.d.ts +26 -0
  44. package/dist/live.d.ts.map +1 -0
  45. package/dist/live.js +311 -0
  46. package/dist/live.js.map +1 -0
  47. package/dist/mcp-runner.d.ts +41 -0
  48. package/dist/mcp-runner.d.ts.map +1 -0
  49. package/dist/mcp-runner.js +306 -0
  50. package/dist/mcp-runner.js.map +1 -0
  51. package/dist/ops-commands.d.ts +11 -0
  52. package/dist/ops-commands.d.ts.map +1 -0
  53. package/dist/ops-commands.js +358 -0
  54. package/dist/ops-commands.js.map +1 -0
  55. package/dist/orchestrate-options.d.ts +9 -0
  56. package/dist/orchestrate-options.d.ts.map +1 -0
  57. package/dist/orchestrate-options.js +16 -0
  58. package/dist/orchestrate-options.js.map +1 -0
  59. package/dist/orphan-reaper.d.ts +9 -0
  60. package/dist/orphan-reaper.d.ts.map +1 -0
  61. package/dist/orphan-reaper.js +97 -0
  62. package/dist/orphan-reaper.js.map +1 -0
  63. package/dist/orphan-sweeper.d.ts +7 -0
  64. package/dist/orphan-sweeper.d.ts.map +1 -0
  65. package/dist/orphan-sweeper.js +289 -0
  66. package/dist/orphan-sweeper.js.map +1 -0
  67. package/dist/plugins.d.ts +44 -0
  68. package/dist/plugins.d.ts.map +1 -0
  69. package/dist/plugins.js +1383 -0
  70. package/dist/plugins.js.map +1 -0
  71. package/dist/primary-output.d.ts +14 -0
  72. package/dist/primary-output.d.ts.map +1 -0
  73. package/dist/primary-output.js +34 -0
  74. package/dist/primary-output.js.map +1 -0
  75. package/dist/registry.d.ts +26 -0
  76. package/dist/registry.d.ts.map +1 -0
  77. package/dist/registry.js +71 -0
  78. package/dist/registry.js.map +1 -0
  79. package/dist/release.d.ts +14 -0
  80. package/dist/release.d.ts.map +1 -0
  81. package/dist/release.js +49 -0
  82. package/dist/release.js.map +1 -0
  83. package/dist/repl.d.ts +26 -0
  84. package/dist/repl.d.ts.map +1 -0
  85. package/dist/repl.js +277 -0
  86. package/dist/repl.js.map +1 -0
  87. package/dist/review-command.d.ts +3 -0
  88. package/dist/review-command.d.ts.map +1 -0
  89. package/dist/review-command.js +83 -0
  90. package/dist/review-command.js.map +1 -0
  91. package/dist/reviewer-options.d.ts +18 -0
  92. package/dist/reviewer-options.d.ts.map +1 -0
  93. package/dist/reviewer-options.js +110 -0
  94. package/dist/reviewer-options.js.map +1 -0
  95. package/dist/run-options.d.ts +8 -0
  96. package/dist/run-options.d.ts.map +1 -0
  97. package/dist/run-options.js +50 -0
  98. package/dist/run-options.js.map +1 -0
  99. package/dist/run-secret-scan.d.ts +2 -0
  100. package/dist/run-secret-scan.d.ts.map +1 -0
  101. package/dist/run-secret-scan.js +5 -0
  102. package/dist/run-secret-scan.js.map +1 -0
  103. package/dist/settings-command.d.ts +3 -0
  104. package/dist/settings-command.d.ts.map +1 -0
  105. package/dist/settings-command.js +202 -0
  106. package/dist/settings-command.js.map +1 -0
  107. package/dist/settings-display.d.ts +3 -0
  108. package/dist/settings-display.d.ts.map +1 -0
  109. package/dist/settings-display.js +33 -0
  110. package/dist/settings-display.js.map +1 -0
  111. package/dist/settings-service.d.ts +15 -0
  112. package/dist/settings-service.d.ts.map +1 -0
  113. package/dist/settings-service.js +91 -0
  114. package/dist/settings-service.js.map +1 -0
  115. package/dist/setup-jobs.d.ts +28 -0
  116. package/dist/setup-jobs.d.ts.map +1 -0
  117. package/dist/setup-jobs.js +477 -0
  118. package/dist/setup-jobs.js.map +1 -0
  119. package/dist/spec.d.ts +84 -0
  120. package/dist/spec.d.ts.map +1 -0
  121. package/dist/spec.js +438 -0
  122. package/dist/spec.js.map +1 -0
  123. package/dist/trust-command.d.ts +3 -0
  124. package/dist/trust-command.d.ts.map +1 -0
  125. package/dist/trust-command.js +80 -0
  126. package/dist/trust-command.js.map +1 -0
  127. package/dist/trust-services.d.ts +7 -0
  128. package/dist/trust-services.d.ts.map +1 -0
  129. package/dist/trust-services.js +35 -0
  130. package/dist/trust-services.js.map +1 -0
  131. package/package.json +59 -0
@@ -0,0 +1,564 @@
1
+ #!/usr/bin/env node
2
+ import { appendFileSync, chmodSync, mkdirSync, writeFileSync } from "node:fs";
3
+ import { isAbsolute, join } from "node:path";
4
+ import { DaemonClient, DaemonServer, InteractionRegistry, RunEventBus, ThreadStore, daemonDir, defaultSocketPath, ensureToken, logPath, socketAlive, } from "@claudexor/daemon";
5
+ import { DaemonControlApiServer, normalizeRunStartRequest } from "@claudexor/control-api";
6
+ import { armDaemonLifecycle, runStartupCrashGc } from "./daemon-lifecycle.js";
7
+ import { Orchestrator } from "@claudexor/orchestrator";
8
+ import { loadConfig, updateGlobalConfig } from "@claudexor/config";
9
+ import { listTrustService, updateTrustService } from "./trust-services.js";
10
+ import { SecretStore } from "@claudexor/secrets";
11
+ import { ensureThreadWorktree, diffStaged, git, snapshotTree } from "@claudexor/workspace";
12
+ import { deliver } from "@claudexor/delivery";
13
+ import { containsSecretLikeToken, noProjectRepoRoot, readTextSafe, } from "@claudexor/util";
14
+ import { ControlSettingsUpdateRequest, InterviewAnswer, } from "@claudexor/schema";
15
+ import { invalidateDoctorCache, validateModel } from "@claudexor/core";
16
+ import { resolveAttachments } from "./attachment-resolver.js";
17
+ import { buildGateway, buildRegistry, harnessModels } from "./registry.js";
18
+ import { buildAgentCapabilityCatalog } from "./capabilities.js";
19
+ import { applyHarnessSettingsPatches, assertSettingsPatchValid } from "./settings-service.js";
20
+ import { createSetupJobManager } from "./setup-jobs.js";
21
+ import { buildGroundingPrompt, extractQuestionsFromPlan, freezeSpecFromGrounding, persistSpec, } from "./spec.js";
22
+ const NO_PROJECT_ROOT = noProjectRepoRoot();
23
+ async function main() {
24
+ // The daemon dir holds the auth token, jobs registry, and setup logs: it must
25
+ // never be group/world readable (mkdir mode only applies on creation).
26
+ mkdirSync(daemonDir(), { recursive: true, mode: 0o700 });
27
+ chmodSync(daemonDir(), 0o700);
28
+ const token = ensureToken();
29
+ const socketPath = defaultSocketPath();
30
+ // Live observation plane: every RunEvent is pushed onto the in-process bus
31
+ // (SSE latency drops to immediate; events.jsonl stays the canonical log) and
32
+ // harness questions park in the interaction registry until answered.
33
+ const bus = new RunEventBus();
34
+ const interactions = new InteractionRegistry();
35
+ // Thread/session SSOT: durable conversation registry; vendor CLI session
36
+ // ids are the re-hostable cache that lets later turns resume natively.
37
+ const threads = new ThreadStore(join(daemonDir(), "threads.json"));
38
+ const server = new DaemonServer({
39
+ socketPath,
40
+ token,
41
+ // Durable run registry so the run list survives a daemon/Mac restart.
42
+ persistPath: join(daemonDir(), "jobs.json"),
43
+ // A terminal run must stop advertising waiting_on_user immediately —
44
+ // cancelled/failed runs otherwise park their questions in the registry
45
+ // until the interaction timeout.
46
+ onRunTerminal: (runId) => interactions.dropForRun(runId),
47
+ // A turn whose job died BEFORE a run bound (trust gate, preflight throw)
48
+ // records the refusal on itself — the chat renders it inline instead of
49
+ // an eternally-empty bubble.
50
+ onTurnEnqueueFailed: (turnId, error, code) => threads.setTurnEnqueueError(turnId, error, code),
51
+ runner: async (params, ctx) => {
52
+ const p = normalizeDaemonRunStart(params);
53
+ const mode = p.mode;
54
+ const noProjectAsk = mode === "ask" && p.scope.kind === "none";
55
+ const repoRoot = p.scope.kind === "project" ? p.scope.root : NO_PROJECT_ROOT;
56
+ if (noProjectAsk)
57
+ mkdirSync(NO_PROJECT_ROOT, { recursive: true, mode: 0o700 });
58
+ const orchestrator = new Orchestrator({
59
+ registry: buildRegistry(),
60
+ portfolio: p.portfolio,
61
+ reviewerPanel: p.reviewerPanel,
62
+ reviewerModels: p.reviewerModels && typeof p.reviewerModels === "object" ? p.reviewerModels : undefined,
63
+ reviewerEfforts: p.reviewerEfforts && typeof p.reviewerEfforts === "object"
64
+ ? p.reviewerEfforts
65
+ : undefined,
66
+ });
67
+ // Fail loud on bogus socket-caller thread/turn ids (job settles failed).
68
+ const { threadId, turnId } = threads.assertKnownIds(p.threadId, p.turnId);
69
+ // Resolve the execution tree: an ISOLATED thread runs in its persistent
70
+ // worktree (lazily created); in-place threads and ordinary runs use the
71
+ // project root. Config/artifacts stay anchored to repoRoot either way.
72
+ let executionRoot;
73
+ let inPlace = p.execution.isolation === "live";
74
+ if (threadId && repoRoot !== NO_PROJECT_ROOT) {
75
+ const thread = threads.getThread(threadId);
76
+ if (thread?.workspace.mode === "isolated") {
77
+ const wt = await ensureThreadWorktree(repoRoot, threadId);
78
+ executionRoot = wt.path;
79
+ // Persist the base ONLY on creation: `apply` advances base_sha, and a
80
+ // later turn must not clobber it back to the worktree HEAD (which never
81
+ // moves, since turns don't commit) — that would re-apply old work.
82
+ if (wt.created)
83
+ threads.setThreadWorktree(threadId, wt.path, wt.baseSha);
84
+ inPlace = true; // isolated turns run in-place WITHIN the worktree
85
+ }
86
+ }
87
+ // Single-writer turn binding: control-api pre-creates the turn and passes
88
+ // its id, which we bind when the run starts. A thread run WITHOUT a
89
+ // pre-created turn (a direct POST /runs with threadId) gets its turn
90
+ // created and bound here, so "a run is always recorded on its thread".
91
+ const onRunStart = (info) => {
92
+ ctx.onRunStart?.(info);
93
+ if (!threadId)
94
+ return;
95
+ try {
96
+ if (turnId) {
97
+ threads.bindTurnRun(turnId, info.runId);
98
+ }
99
+ else {
100
+ const turn = threads.createTurn(threadId, String(p.prompt ?? ""), {
101
+ parentRunId: typeof p.parentRunId === "string" ? p.parentRunId : null,
102
+ });
103
+ threads.bindTurnRun(turn.id, info.runId);
104
+ }
105
+ }
106
+ catch {
107
+ /* turn binding must never fail the run */
108
+ }
109
+ };
110
+ return orchestrator.run({
111
+ onEvent: (event) => bus.publish(event),
112
+ onInteraction: (ctx2) => interactions.register(ctx2),
113
+ interactionTimeoutMs: loadConfig(repoRoot).global.interaction_timeout_ms,
114
+ threadId,
115
+ executionRoot,
116
+ // Native session continuity: resume each routed harness's own prior
117
+ // conversation in this thread; record new native ids for future turns.
118
+ resumeSessions: threadId ? threads.resumeMap(threadId) : undefined,
119
+ onSessionObserved: threadId
120
+ ? (harnessId, nativeSessionId, observedModel) => threads.recordSession(threadId, harnessId, nativeSessionId, observedModel)
121
+ : undefined,
122
+ authPreference: p.authPreference,
123
+ // Orchestrate autonomy (suggest/auto_safe/auto_full): consumed by the
124
+ // executor in runOrchestrate. The daemon also lends the executor a live
125
+ // answer-delivery service for answer_question steps (the engine does not
126
+ // own the interaction registry).
127
+ autonomy: p.autonomy,
128
+ answerInteraction: async (subRunId, interactionId, answers) => interactions.answer(subRunId, interactionId, answers).status === "delivered",
129
+ repoRoot,
130
+ prompt: String(p.prompt ?? ""),
131
+ // Attachments ride on the turn (resolved to scoped paths); a direct
132
+ // POST /runs without a turn resolves them here. Never base64 in jobs.json.
133
+ attachments: turnId
134
+ ? (threads.getTurn(turnId)?.attachments ?? [])
135
+ : resolveAttachments(p.attachments),
136
+ // Agent-driven browser opt-in (Playwright MCP). The orchestrator gates it
137
+ // on the harness's browser_tool capability + web policy != off.
138
+ browser: p.browser === true,
139
+ mode: p.mode,
140
+ contextMode: noProjectAsk
141
+ ? "off"
142
+ : p.scope.kind === "project"
143
+ ? p.scope.context
144
+ : undefined,
145
+ harnesses: p.harnesses,
146
+ primaryHarness: p.primaryHarness,
147
+ portfolio: p.portfolio,
148
+ n: p.n,
149
+ attempts: p.attempts ?? null,
150
+ untilClean: p.untilClean === true,
151
+ swarm: p.swarm === true,
152
+ create: p.create === true,
153
+ synthesis: p.synthesis,
154
+ // Policy from the GUI composer / API client (applied, not just displayed).
155
+ maxUsd: p.maxUsd ?? null,
156
+ maxToolCalls: p.maxToolCalls ?? null,
157
+ access: p.access,
158
+ web: p.web ?? p.externalContextPolicy,
159
+ externalContextPolicy: p.externalContextPolicy ?? p.web,
160
+ model: p.model,
161
+ models: p.models,
162
+ effort: p.effort,
163
+ tests: Array.isArray(p.tests) ? p.tests : undefined,
164
+ protectedPathApprovals: Array.isArray(p.protectedPathApprovals)
165
+ ? p.protectedPathApprovals
166
+ : undefined,
167
+ specId: typeof p.specId === "string" ? p.specId : undefined,
168
+ specHash: typeof p.specHash === "string" ? p.specHash : undefined,
169
+ specPath: typeof p.specPath === "string" ? p.specPath : undefined,
170
+ inPlace,
171
+ signal: ctx.signal,
172
+ onRunStart,
173
+ });
174
+ },
175
+ });
176
+ // SINGLETON GUARD FIRST: a second claudexord must refuse BEFORE crash GC —
177
+ // otherwise it would reap the LIVE daemon's recorded children and sweep
178
+ // envelopes its running jobs still own. server.start() re-checks (race-safe
179
+ // enough: the window between the probe and listen is milliseconds, and GC
180
+ // only runs when the probe found no live daemon).
181
+ if (await socketAlive(socketPath)) {
182
+ throw new Error(`a claudexor daemon is already listening on ${socketPath}; stop it first`);
183
+ }
184
+ // Crash GC before any new work (reap surviving children, sweep orphaned
185
+ // envelopes/branches/tmp-homes), then arm live-children bookkeeping and
186
+ // graceful SIGTERM/SIGINT shutdown.
187
+ await runStartupCrashGc({ daemonDir: daemonDir(), logPath: logPath() });
188
+ await server.start();
189
+ appendFileSync(logPath(), `[${new Date().toISOString()}] claudexord listening on ${socketPath}\n`);
190
+ const lifecycle = armDaemonLifecycle({
191
+ daemonDir: daemonDir(),
192
+ logPath: logPath(),
193
+ stop: () => server.stop(),
194
+ });
195
+ const control = process.env.CLAUDEXOR_NO_CONTROL_API === "1"
196
+ ? null
197
+ : new DaemonControlApiServer({
198
+ token,
199
+ daemon: new DaemonClient(socketPath, token),
200
+ port: Number(process.env.CLAUDEXOR_CONTROL_PORT ?? 0),
201
+ bus,
202
+ services: controlServices(interactions, threads),
203
+ });
204
+ if (control) {
205
+ const controlAddr = await control.start();
206
+ writeFileSync(join(daemonDir(), "control-api.json"), JSON.stringify({ ...controlAddr, tokenPath: join(daemonDir(), "token") }, null, 2) + "\n", { mode: 0o600 });
207
+ appendFileSync(logPath(), `[${new Date().toISOString()}] claudexor control-api listening on http://${controlAddr.host}:${controlAddr.port}\n`);
208
+ }
209
+ else {
210
+ appendFileSync(logPath(), `[${new Date().toISOString()}] claudexor control-api disabled by CLAUDEXOR_NO_CONTROL_API=1\n`);
211
+ }
212
+ await server.waitForShutdown();
213
+ await control?.stop();
214
+ lifecycle.finalize();
215
+ appendFileSync(logPath(), `[${new Date().toISOString()}] claudexord shut down\n`);
216
+ process.exit(0);
217
+ }
218
+ // Run-start normalization has exactly one owner (control-api); the socket
219
+ // runner path delegates so scope/secret/absolute-root rules cannot drift.
220
+ const normalizeDaemonRunStart = (raw) => normalizeRunStartRequest(raw);
221
+ function projectRootFromScopedInput(p, purpose) {
222
+ if ("repoRoot" in p)
223
+ throw new Error("legacy repoRoot field is not accepted; use scope.kind=project with scope.root");
224
+ const scope = p["scope"];
225
+ if (!scope || typeof scope !== "object" || Array.isArray(scope))
226
+ throw new Error(`project scope is required for ${purpose}`);
227
+ const s = scope;
228
+ if (s["kind"] !== "project")
229
+ throw new Error(`project scope is required for ${purpose}`);
230
+ const root = typeof s["root"] === "string" ? s["root"].trim() : "";
231
+ if (!root)
232
+ throw new Error(`project scope root is required for ${purpose}`);
233
+ if (!isAbsolute(root))
234
+ throw new Error("project root must be an absolute path");
235
+ return root;
236
+ }
237
+ /** Deliver an isolated thread's accumulated worktree diff to its project. */
238
+ async function applyThreadDiff(threads, id, opts) {
239
+ const thread = threads.getThread(id);
240
+ if (!thread)
241
+ throw Object.assign(new Error(`no such thread: ${id}`), { status: 404 });
242
+ const ws = thread.workspace;
243
+ if (ws.mode !== "isolated" || !ws.worktree_path || !thread.repo) {
244
+ throw Object.assign(new Error("thread has no isolated worktree to apply (in-place threads write the project directly)"), { status: 400 });
245
+ }
246
+ const projectRoot = thread.repo.root;
247
+ const base = ws.base_sha ?? "HEAD";
248
+ const patch = await diffStaged(ws.worktree_path, base);
249
+ if (!patch.trim())
250
+ return { applied: false, status: "empty", headMoved: false, detail: "no changes to apply" };
251
+ if (containsSecretLikeToken(patch))
252
+ return {
253
+ applied: false,
254
+ status: "rejected",
255
+ headMoved: false,
256
+ detail: "patch contains a secret-like token; refusing apply",
257
+ };
258
+ // Best-effort: did the PROJECT advance past where this thread branched? (a
259
+ // warning, not a blocker — git apply --3way still merges or fails loudly.)
260
+ let headMoved = false;
261
+ try {
262
+ const head = (await git(projectRoot, ["rev-parse", "HEAD"])).stdout.trim();
263
+ const mb = (await git(projectRoot, ["merge-base", "HEAD", base])).stdout.trim();
264
+ headMoved = mb !== "" && head !== "" && mb !== head;
265
+ }
266
+ catch {
267
+ /* best-effort */
268
+ }
269
+ const mode = (["apply", "branch", "commit", "pr"].includes(opts.mode) ? opts.mode : "apply");
270
+ const delivered = await deliver(projectRoot, patch, {
271
+ mode,
272
+ branch: opts.branch,
273
+ message: opts.message,
274
+ });
275
+ if (delivered.applied) {
276
+ // Re-base the thread on the new project state so the next apply diffs only new work.
277
+ threads.setThreadWorktree(id, ws.worktree_path, await snapshotTree(ws.worktree_path));
278
+ }
279
+ const status = !delivered.applied
280
+ ? "conflict"
281
+ : mode === "branch"
282
+ ? "branched"
283
+ : mode === "commit"
284
+ ? "committed"
285
+ : mode === "pr"
286
+ ? "pr_opened"
287
+ : "applied";
288
+ return { applied: delivered.applied, status, headMoved, detail: delivered.detail ?? null };
289
+ }
290
+ function controlServices(interactions, threads) {
291
+ const secretStore = new SecretStore();
292
+ const setupJobs = createSetupJobManager();
293
+ mkdirSync(NO_PROJECT_ROOT, { recursive: true, mode: 0o700 });
294
+ return {
295
+ createThread: async (input) => threads.createThread((input ?? {})),
296
+ listThreads: async () => ({ threads: threads.listThreads() }),
297
+ threadDetail: async (id) => {
298
+ const thread = threads.getThread(id);
299
+ if (!thread)
300
+ throw Object.assign(new Error(`no such thread: ${id}`), { status: 404 });
301
+ return {
302
+ thread: thread,
303
+ sessions: threads.sessionsForThread(id),
304
+ turns: threads.turnsFor(id),
305
+ };
306
+ },
307
+ createThreadTurn: async (id, prompt, opts) => threads.createTurn(id, prompt, {
308
+ kind: opts.kind,
309
+ parentRunId: opts.parentRunId,
310
+ planRunId: opts.planRunId,
311
+ attachments: resolveAttachments(opts.attachments),
312
+ }),
313
+ updateThread: async (id, patch) => threads.updateThread(id, {
314
+ title: patch.title,
315
+ state: patch.state,
316
+ primaryHarness: patch.primaryHarness,
317
+ eligibleHarnesses: patch.eligibleHarnesses,
318
+ }),
319
+ applyThread: async (id, opts) => applyThreadDiff(threads, id, opts),
320
+ setTurnEnqueueError: (turnId, message, code, retryable) => threads.setTurnEnqueueError(turnId, message, code, retryable ?? true),
321
+ // User-level trust surface (narrow by design): list per-repo trust files
322
+ // and grant/revoke ONE flag — the same file/writer `claudexor trust` owns.
323
+ listTrust: listTrustService,
324
+ updateTrust: updateTrustService,
325
+ pendingInteractions: (runId) => interactions.pendingForRun(runId),
326
+ answerInteraction: (runId, interactionId, answers) => interactions.answer(runId, interactionId, answers),
327
+ harnesses: async () => {
328
+ const statuses = await buildGateway({ includeFakes: false }).statusAll({
329
+ cwd: NO_PROJECT_ROOT,
330
+ });
331
+ // The doctor's configured-model truth check rides the status DTO
332
+ // so the UI renders the same honesty the CLI prints (never a green
333
+ // harness with a doomed configured model).
334
+ const cfg = loadConfig(NO_PROJECT_ROOT);
335
+ return {
336
+ harnesses: await Promise.all(statuses.map(async (s) => {
337
+ const configured = cfg.global.harnesses[s.id]?.default_model ?? null;
338
+ if (!configured)
339
+ return { ...s, configuredModel: null, configuredModelCheck: null };
340
+ const truth = await harnessModels(s.id, NO_PROJECT_ROOT, true);
341
+ const check = validateModel(configured, truth.models.map((m) => m.id), truth.source === "api" ? "api" : "manifest");
342
+ return { ...s, configuredModel: configured, configuredModelCheck: check };
343
+ })),
344
+ };
345
+ },
346
+ harnessModels: async (input) => harnessModels(input.harnessId, NO_PROJECT_ROOT),
347
+ // Derived catalog for external agents; same composer the CLI verb and the
348
+ // MCP tool use, so all three surfaces answer identically.
349
+ agentCapabilities: async () => buildAgentCapabilityCatalog(),
350
+ createSetupJob: async (input) => setupJobs.create(input),
351
+ listSetupJobs: async () => ({ jobs: setupJobs.list() }),
352
+ setupJobStatus: async (input) => setupJobs.status(input),
353
+ cancelSetupJob: async (input) => setupJobs.cancel(input),
354
+ confirmSetupJob: async (input) => setupJobs.confirm(input),
355
+ settings: async () => {
356
+ const cfg = loadConfig(NO_PROJECT_ROOT);
357
+ return {
358
+ sources: cfg.sources,
359
+ defaultPortfolio: cfg.global.default_portfolio,
360
+ interactionTimeoutMs: cfg.global.interaction_timeout_ms,
361
+ routing: {
362
+ defaultPolicy: cfg.global.routing.default_policy,
363
+ primaryHarness: cfg.global.routing.primary_harness,
364
+ eligibleHarnesses: cfg.global.routing.eligible_harnesses,
365
+ envInheritance: cfg.global.routing.env_inheritance,
366
+ authPreference: cfg.global.routing.auth_preference,
367
+ },
368
+ budget: {
369
+ maxUsdPerRun: cfg.global.budget.max_usd_per_run,
370
+ },
371
+ runtime: {
372
+ reviewerTimeoutMs: cfg.global.runtime.reviewer_timeout_ms,
373
+ harnessInactivityTimeoutMs: cfg.global.runtime.harness_inactivity_timeout_ms,
374
+ transientRetry: {
375
+ maxRetries: cfg.global.runtime.transient_retry.max_retries,
376
+ initialDelayMs: cfg.global.runtime.transient_retry.initial_delay_ms,
377
+ maxDelayMs: cfg.global.runtime.transient_retry.max_delay_ms,
378
+ },
379
+ },
380
+ harnesses: Object.fromEntries(Object.entries(cfg.global.harnesses).map(([id, h]) => [
381
+ id,
382
+ {
383
+ enabled: h.enabled,
384
+ defaultModel: h.default_model,
385
+ effort: h.effort,
386
+ maxTurns: h.max_turns,
387
+ maxRounds: h.max_rounds,
388
+ maxUsd: h.max_usd,
389
+ toolsAllow: h.tools_allow,
390
+ toolsDeny: h.tools_deny,
391
+ fallbackModel: h.fallback_model,
392
+ web: h.web,
393
+ authPreference: h.auth_preference,
394
+ },
395
+ ])),
396
+ };
397
+ },
398
+ updateSettings: async (patch) => {
399
+ // FAIL LOUDLY on malformed patches: a typo'd field name or bad enum must
400
+ // surface as a 4xx, never be silently dropped.
401
+ const p = ControlSettingsUpdateRequest.parse(patch ?? {});
402
+ await assertSettingsPatchValid(p);
403
+ const nullableName = (value, current) => {
404
+ if (value === undefined)
405
+ return current;
406
+ if (value === null)
407
+ return null;
408
+ return value;
409
+ };
410
+ const updated = updateGlobalConfig((cfg) => ({
411
+ ...cfg,
412
+ default_portfolio: p.defaultPortfolio ?? cfg.default_portfolio,
413
+ interaction_timeout_ms: p.interactionTimeoutMs ?? cfg.interaction_timeout_ms,
414
+ routing: {
415
+ ...cfg.routing,
416
+ primary_harness: nullableName(p.primaryHarness, cfg.routing.primary_harness),
417
+ default_policy: p.routingPolicy ?? cfg.routing.default_policy,
418
+ env_inheritance: p.envInheritance ?? cfg.routing.env_inheritance,
419
+ eligible_harnesses: p.eligibleHarnesses ?? cfg.routing.eligible_harnesses,
420
+ auth_preference: p.authPreference ?? cfg.routing.auth_preference,
421
+ },
422
+ budget: {
423
+ ...cfg.budget,
424
+ max_usd_per_run: p.clearMaxUsdPerRun === true ? null : (p.maxUsdPerRun ?? cfg.budget.max_usd_per_run),
425
+ },
426
+ harnesses: applyHarnessSettingsPatches(cfg.harnesses, p.harnesses),
427
+ }));
428
+ // Routing/auth settings change harness readiness semantics: drop the
429
+ // doctor TTL cache so the next /harnesses reflects the new truth.
430
+ invalidateDoctorCache();
431
+ return updated;
432
+ },
433
+ listSecrets: async () => ({
434
+ backend: secretStore.resolvedBackend(),
435
+ secrets: secretStore.list(),
436
+ }),
437
+ setSecret: async (input) => {
438
+ const p = (input ?? {});
439
+ const name = typeof p["name"] === "string" ? p["name"] : "";
440
+ const value = typeof p["value"] === "string" ? p["value"] : "";
441
+ if (!name || !value)
442
+ throw new Error("name and value are required");
443
+ const backend = secretStore.set(name, value);
444
+ // A new key changes auth readiness immediately: drop the doctor TTL cache.
445
+ invalidateDoctorCache();
446
+ // Keychain->file degradation is disclosed, not silent (UI shows it).
447
+ return {
448
+ name,
449
+ backend,
450
+ stored: true,
451
+ ...(secretStore.lastFallbackReason ? { warning: secretStore.lastFallbackReason } : {}),
452
+ };
453
+ },
454
+ deleteSecret: async (name) => {
455
+ secretStore.delete(name);
456
+ // A removed key changes auth readiness immediately: drop the doctor cache.
457
+ invalidateDoctorCache();
458
+ return { name, deleted: true };
459
+ },
460
+ specQuestions: async (input) => {
461
+ const p = (input ?? {});
462
+ const prompt = typeof p["prompt"] === "string" ? p["prompt"] : "";
463
+ if (!prompt.trim())
464
+ throw new Error("prompt is required");
465
+ const repoRoot = projectRootFromScopedInput(p, "spec questions");
466
+ // Drive an interactive, CHOICE-BASED interview: the read-only grounding plan
467
+ // must end with a structured "## Open Questions" section that
468
+ // extractQuestionsFromPlan parses into single/multi/text questions with options.
469
+ // The instruction + its parser are a co-located contract pair in spec.ts.
470
+ // Prior tiers' answers: carried so each round goes DEEPER (adaptive interview).
471
+ const priorDecisions = Array.isArray(p["priorDecisions"])
472
+ ? p["priorDecisions"].filter((d) => !!d &&
473
+ typeof d === "object" &&
474
+ typeof d.question === "string" &&
475
+ typeof d.answer === "string")
476
+ : [];
477
+ const plan = await new Orchestrator({ registry: buildRegistry() }).run({
478
+ repoRoot,
479
+ prompt: buildGroundingPrompt(prompt, priorDecisions),
480
+ mode: "plan",
481
+ harnesses: Array.isArray(p["harnesses"])
482
+ ? p["harnesses"].filter((x) => typeof x === "string")
483
+ : undefined,
484
+ access: "readonly",
485
+ });
486
+ const planText = readTextSafe(join(plan.runDir, "final", "plan.md")) ?? plan.summary;
487
+ return {
488
+ planRunId: plan.runId,
489
+ planDir: plan.runDir,
490
+ questions: extractQuestionsFromPlan(planText),
491
+ };
492
+ },
493
+ specFreeze: async (input) => {
494
+ const p = (input ?? {});
495
+ const prompt = typeof p["prompt"] === "string" ? p["prompt"] : "";
496
+ const planDir = typeof p["planDir"] === "string" ? p["planDir"] : "";
497
+ const plan = typeof p["plan"] === "string"
498
+ ? p["plan"]
499
+ : (readTextSafe(join(planDir, "final", "plan.md")) ?? "");
500
+ if (!prompt.trim() || !plan.trim())
501
+ throw new Error("prompt and plan/planDir are required");
502
+ const repoRoot = projectRootFromScopedInput(p, "spec freeze");
503
+ // Forward the full SpecAnswersFile shape — not just answers — so a client that
504
+ // edited the draft's summary / criteria / non-goals / gates doesn't have them
505
+ // silently dropped from the frozen SpecPack. Fail LOUDLY on a malformed field
506
+ // (e.g. tests:[123]) rather than silently filtering it.
507
+ const strArr = (v, field) => {
508
+ if (v === undefined)
509
+ return undefined;
510
+ if (!Array.isArray(v) || !v.every((x) => typeof x === "string")) {
511
+ throw new Error(`spec freeze: "${field}" must be an array of strings`);
512
+ }
513
+ return v;
514
+ };
515
+ const strOpt = (v, field) => {
516
+ if (v === undefined)
517
+ return undefined;
518
+ if (typeof v !== "string")
519
+ throw new Error(`spec freeze: "${field}" must be a string`);
520
+ return v;
521
+ };
522
+ // Schema-parse the answers at the wire boundary (Bible §3): a malformed item
523
+ // (missing/typed question_id, bad option_ids) fails loudly with a typed error,
524
+ // rather than slipping through an `as never[]` cast. Absent => no answers.
525
+ const answers = p["answers"] === undefined ? [] : InterviewAnswer.array().parse(p["answers"]);
526
+ // Multi-tier interview: prior-tier decisions are folded into decided_tradeoffs
527
+ // so the frozen SpecPack carries EVERY tier, not just the last one the client
528
+ // sent as `answers` (the v0.13 freeze-drops-prior-tiers bug, #8/#9).
529
+ const priorDecisions = Array.isArray(p["priorDecisions"])
530
+ ? p["priorDecisions"].filter((d) => !!d &&
531
+ typeof d.question === "string" &&
532
+ typeof d.answer === "string")
533
+ : [];
534
+ const priorLines = priorDecisions.map((d) => `Interview (prior tier) — ${d.question} → ${d.answer}`);
535
+ const explicitTradeoffs = strArr(p["decided_tradeoffs"], "decided_tradeoffs") ?? [];
536
+ const mergedTradeoffs = [...priorLines, ...explicitTradeoffs];
537
+ const spec = await freezeSpecFromGrounding(prompt, plan, {
538
+ answers,
539
+ summary: strOpt(p["summary"], "summary"),
540
+ success_criteria: strArr(p["success_criteria"], "success_criteria"),
541
+ non_goals: strArr(p["non_goals"], "non_goals"),
542
+ forbidden_approaches: strArr(p["forbidden_approaches"], "forbidden_approaches"),
543
+ // undefined-when-empty keeps single-tier behavior byte-identical.
544
+ decided_tradeoffs: mergedTradeoffs.length ? mergedTradeoffs : undefined,
545
+ tests: strArr(p["tests"], "tests"),
546
+ });
547
+ const persisted = persistSpec(repoRoot, spec, plan);
548
+ // specPath = the frozen SpecPack file an Implement run reads (a bare specId
549
+ // does not load content). Single producer; the layout matches persistSpec.
550
+ return {
551
+ specId: spec.id,
552
+ specDir: persisted.specDir,
553
+ specPath: join(persisted.specDir, "spec.json"),
554
+ specHash: persisted.specHash,
555
+ changes: persisted.changes,
556
+ };
557
+ },
558
+ };
559
+ }
560
+ main().catch((err) => {
561
+ process.stderr.write(`claudexord: ${err instanceof Error ? err.message : String(err)}\n`);
562
+ process.exit(1);
563
+ });
564
+ //# sourceMappingURL=claudexord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claudexord.js","sourceRoot":"","sources":["../src/claudexord.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * CLI output helpers: one owner for stdout/JSON purity. `--json` mode emits
3
+ * exactly one JSON object on stdout; usage errors go to stderr (text mode)
4
+ * or a typed {ok:false,exitCode,error} object (json mode).
5
+ */
6
+ export declare function print(s: string): void;
7
+ export declare function printJson(value: unknown): void;
8
+ export declare function printUsageError(json: boolean, error: string): number;
9
+ export declare function statusGlyph(status: string): string;
10
+ export declare function authSourceAvailability(status: {
11
+ manifest?: {
12
+ auth_modes?: string[];
13
+ capability_profile?: {
14
+ auth?: {
15
+ supported_sources?: string[];
16
+ preferred_source?: string | null;
17
+ };
18
+ };
19
+ } | null;
20
+ }): string;
21
+ export declare function checksSummary(status: {
22
+ checks?: {
23
+ id: string;
24
+ status: string;
25
+ detail?: string;
26
+ }[];
27
+ }): string;
28
+ //# sourceMappingURL=cli-io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-io.d.ts","sourceRoot":"","sources":["../src/cli-io.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAErC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE9C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIpE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,QAAQ,CAAC,EAAE;QACT,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,kBAAkB,CAAC,EAAE;YACnB,IAAI,CAAC,EAAE;gBAAE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;gBAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;aAAE,CAAC;SAC3E,CAAC;KACH,GAAG,IAAI,CAAC;CACV,GAAG,MAAM,CAQT;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACpC,MAAM,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC5D,GAAG,MAAM,CAIT"}