@clemrig/factory 0.0.0-stage → 0.1.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 (121) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +198 -2
  3. package/dist/app/doctor.d.ts +20 -0
  4. package/dist/app/doctor.js +38 -0
  5. package/dist/app/doctor.js.map +1 -0
  6. package/dist/app/factory.d.ts +12 -0
  7. package/dist/app/factory.js +22 -0
  8. package/dist/app/factory.js.map +1 -0
  9. package/dist/app/init.d.ts +6 -0
  10. package/dist/app/init.js +15 -0
  11. package/dist/app/init.js.map +1 -0
  12. package/dist/app/run.d.ts +24 -0
  13. package/dist/app/run.js +100 -0
  14. package/dist/app/run.js.map +1 -0
  15. package/dist/app/runs.d.ts +36 -0
  16. package/dist/app/runs.js +66 -0
  17. package/dist/app/runs.js.map +1 -0
  18. package/dist/cli/application.d.ts +6 -0
  19. package/dist/cli/application.js +63 -0
  20. package/dist/cli/application.js.map +1 -0
  21. package/dist/cli/args.d.ts +12 -0
  22. package/dist/cli/args.js +45 -0
  23. package/dist/cli/args.js.map +1 -0
  24. package/dist/cli/doctor.d.ts +5 -0
  25. package/dist/cli/doctor.js +33 -0
  26. package/dist/cli/doctor.js.map +1 -0
  27. package/dist/cli/help.d.ts +1 -0
  28. package/dist/cli/help.js +17 -0
  29. package/dist/cli/help.js.map +1 -0
  30. package/dist/cli/init.d.ts +6 -0
  31. package/dist/cli/init.js +18 -0
  32. package/dist/cli/init.js.map +1 -0
  33. package/dist/cli/launcher.d.ts +5 -0
  34. package/dist/cli/launcher.js +55 -0
  35. package/dist/cli/launcher.js.map +1 -0
  36. package/dist/cli/reporter.d.ts +17 -0
  37. package/dist/cli/reporter.js +123 -0
  38. package/dist/cli/reporter.js.map +1 -0
  39. package/dist/cli/run.d.ts +9 -0
  40. package/dist/cli/run.js +39 -0
  41. package/dist/cli/run.js.map +1 -0
  42. package/dist/cli/status.d.ts +4 -0
  43. package/dist/cli/status.js +15 -0
  44. package/dist/cli/status.js.map +1 -0
  45. package/dist/cli/ui.d.ts +3 -0
  46. package/dist/cli/ui.js +18 -0
  47. package/dist/cli/ui.js.map +1 -0
  48. package/dist/engine/metrics.d.ts +45 -0
  49. package/dist/engine/metrics.js +60 -0
  50. package/dist/engine/metrics.js.map +1 -0
  51. package/dist/engine/primitives.d.ts +34 -0
  52. package/dist/engine/primitives.js +81 -0
  53. package/dist/engine/primitives.js.map +1 -0
  54. package/dist/engine/profiles.d.ts +53 -0
  55. package/dist/engine/profiles.js +117 -0
  56. package/dist/engine/profiles.js.map +1 -0
  57. package/dist/engine/runner.d.ts +13 -0
  58. package/dist/engine/runner.js +157 -0
  59. package/dist/engine/runner.js.map +1 -0
  60. package/dist/engine/types.d.ts +194 -0
  61. package/dist/engine/types.js +2 -0
  62. package/dist/engine/types.js.map +1 -0
  63. package/dist/engine/workflow.d.ts +18 -0
  64. package/dist/engine/workflow.js +196 -0
  65. package/dist/engine/workflow.js.map +1 -0
  66. package/dist/index.d.ts +10 -0
  67. package/dist/index.js +9 -0
  68. package/dist/index.js.map +1 -0
  69. package/dist/main.d.ts +2 -0
  70. package/dist/main.js +4 -0
  71. package/dist/main.js.map +1 -0
  72. package/dist/system/environment.d.ts +2 -0
  73. package/dist/system/environment.js +13 -0
  74. package/dist/system/environment.js.map +1 -0
  75. package/dist/system/factory.d.ts +16 -0
  76. package/dist/system/factory.js +62 -0
  77. package/dist/system/factory.js.map +1 -0
  78. package/dist/system/process.d.ts +21 -0
  79. package/dist/system/process.js +238 -0
  80. package/dist/system/process.js.map +1 -0
  81. package/dist/system/runtimes/adapter.d.ts +90 -0
  82. package/dist/system/runtimes/adapter.js +20 -0
  83. package/dist/system/runtimes/adapter.js.map +1 -0
  84. package/dist/system/runtimes/agent-runtime.d.ts +45 -0
  85. package/dist/system/runtimes/agent-runtime.js +184 -0
  86. package/dist/system/runtimes/agent-runtime.js.map +1 -0
  87. package/dist/system/runtimes/claude-code.d.ts +10 -0
  88. package/dist/system/runtimes/claude-code.js +383 -0
  89. package/dist/system/runtimes/claude-code.js.map +1 -0
  90. package/dist/system/runtimes/inspect.d.ts +25 -0
  91. package/dist/system/runtimes/inspect.js +129 -0
  92. package/dist/system/runtimes/inspect.js.map +1 -0
  93. package/dist/system/runtimes/pi.d.ts +7 -0
  94. package/dist/system/runtimes/pi.js +235 -0
  95. package/dist/system/runtimes/pi.js.map +1 -0
  96. package/dist/system/runtimes/protocol.d.ts +9 -0
  97. package/dist/system/runtimes/protocol.js +38 -0
  98. package/dist/system/runtimes/protocol.js.map +1 -0
  99. package/dist/system/runtimes/registry.d.ts +5 -0
  100. package/dist/system/runtimes/registry.js +5 -0
  101. package/dist/system/runtimes/registry.js.map +1 -0
  102. package/dist/system/store.d.ts +20 -0
  103. package/dist/system/store.js +126 -0
  104. package/dist/system/store.js.map +1 -0
  105. package/dist/system/templates.d.ts +8 -0
  106. package/dist/system/templates.js +30 -0
  107. package/dist/system/templates.js.map +1 -0
  108. package/dist/ui/server.d.ts +8 -0
  109. package/dist/ui/server.js +111 -0
  110. package/dist/ui/server.js.map +1 -0
  111. package/dist/ui/static/dashboard.js +266 -0
  112. package/dist/ui/static/follow.js +67 -0
  113. package/dist/ui/static/index.html +20 -0
  114. package/dist/ui/static/style.css +166 -0
  115. package/dist/ui/static/timeline.js +180 -0
  116. package/package.json +52 -4
  117. package/templates/init/factory.ts +4 -0
  118. package/templates/init/gitignore +3 -0
  119. package/templates/init/tsconfig.json +13 -0
  120. package/templates/init/workflows/ask/index.ts +57 -0
  121. package/templates/init/workflows/ask/prompts/answer.md +7 -0
@@ -0,0 +1,383 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, writeFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { z } from "zod";
5
+ import { runtimeLabels } from "../../engine/profiles.js";
6
+ import { parseEvent, } from "./adapter.js";
7
+ import { agentSessionName } from "./protocol.js";
8
+ const label = runtimeLabels["claude-code"];
9
+ const anyEvent = z.looseObject({
10
+ type: z.string(),
11
+ subtype: z.unknown().optional(),
12
+ });
13
+ /** What the session holds. Capabilities are required: an unreported one could hide a tool. */
14
+ const initEvent = z.looseObject({
15
+ session_id: z.string(),
16
+ tools: z.array(z.string()),
17
+ mcp_servers: z.array(z.looseObject({ name: z.string(), status: z.string() })),
18
+ plugins: z.array(z.looseObject({ name: z.string(), path: z.string() })),
19
+ skills: z.array(z.string()).optional(),
20
+ slash_commands: z.array(z.string()).optional(),
21
+ output_style: z.string().optional(),
22
+ memory_paths: z.unknown().optional(),
23
+ });
24
+ /** A content block; a tool use names its call and its tool, a tool result its call. */
25
+ const contentBlock = z
26
+ .looseObject({
27
+ type: z.string(),
28
+ id: z.unknown().optional(),
29
+ name: z.unknown().optional(),
30
+ tool_use_id: z.unknown().optional(),
31
+ is_error: z.boolean().optional(),
32
+ })
33
+ .superRefine((block, context) => {
34
+ const required = block.type === "tool_use"
35
+ ? ["id", "name"]
36
+ : block.type === "tool_result"
37
+ ? ["tool_use_id"]
38
+ : [];
39
+ for (const key of required)
40
+ if (typeof block[key] !== "string")
41
+ context.addIssue({
42
+ code: "custom",
43
+ path: [key],
44
+ message: "expected a string",
45
+ });
46
+ });
47
+ const messageEvent = z.looseObject({
48
+ /** Set on a subagent's messages. */
49
+ parent_tool_use_id: z.unknown().optional(),
50
+ message: z.looseObject({
51
+ id: z.unknown().optional(),
52
+ usage: z.unknown().optional(),
53
+ // Text content holds no tool call.
54
+ content: z.preprocess((content) => (typeof content === "string" ? [] : content), z.array(contentBlock)),
55
+ }),
56
+ });
57
+ /** `result`, `errors` and the subtype only explain a failure: their shape never hides it. */
58
+ const resultEvent = z.looseObject({
59
+ subtype: z.unknown().optional(),
60
+ is_error: z.boolean(),
61
+ result: z.unknown().optional(),
62
+ stop_reason: z.string().nullable().optional(),
63
+ errors: z.unknown().optional(),
64
+ modelUsage: z.unknown().optional(),
65
+ });
66
+ const text = (value) => (typeof value === "string" ? value : "");
67
+ /** Every model of the call, subagents and compactions included; measured on a best-effort basis. */
68
+ const modelUsage = z
69
+ .record(z.string(), z.looseObject({
70
+ inputTokens: z.number().nonnegative(),
71
+ outputTokens: z.number().nonnegative(),
72
+ cacheReadInputTokens: z.number().nonnegative(),
73
+ cacheCreationInputTokens: z.number().nonnegative(),
74
+ costUSD: z.number().nonnegative(),
75
+ }))
76
+ .refine((models) => Object.keys(models).length > 0);
77
+ function usageOf(value) {
78
+ const parsed = modelUsage.safeParse(value);
79
+ if (!parsed.success)
80
+ return undefined;
81
+ const usage = {
82
+ input: 0,
83
+ output: 0,
84
+ cacheRead: 0,
85
+ cacheWrite: 0,
86
+ costUsd: 0,
87
+ };
88
+ for (const model of Object.values(parsed.data)) {
89
+ usage.input += model.inputTokens;
90
+ usage.output += model.outputTokens;
91
+ usage.cacheRead += model.cacheReadInputTokens;
92
+ usage.cacheWrite += model.cacheCreationInputTokens;
93
+ usage.costUsd += model.costUSD;
94
+ }
95
+ return usage;
96
+ }
97
+ /** A response's tokens on its assistant events; output tokens are provisional until the result. */
98
+ const stepUsage = z.looseObject({
99
+ input_tokens: z.number().nonnegative(),
100
+ output_tokens: z.number().nonnegative(),
101
+ cache_read_input_tokens: z.number().nonnegative(),
102
+ cache_creation_input_tokens: z.number().nonnegative(),
103
+ });
104
+ /** Claude Code session IDs are UUIDs: a stable one per session name. */
105
+ export function claudeCodeSessionId(name) {
106
+ const hex = createHash("sha256").update(name).digest("hex");
107
+ const variant = ((Number.parseInt(hex[16] ?? "0", 16) & 0x3) | 0x8).toString(16);
108
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-5${hex.slice(13, 16)}-${variant}${hex.slice(17, 20)}-${hex.slice(20, 32)}`;
109
+ }
110
+ const isMcpTool = (tool) => tool.startsWith("mcp__");
111
+ function profileArgs(profile, systemPrompt) {
112
+ const servers = Object.keys(profile.mcpServers).length
113
+ ? ["--mcp-config", JSON.stringify({ mcpServers: profile.mcpServers })]
114
+ : [];
115
+ return [
116
+ "--model",
117
+ profile.model,
118
+ "--effort",
119
+ profile.thinking,
120
+ "--append-system-prompt",
121
+ systemPrompt,
122
+ // No settings file: no CLAUDE.md, installed plugins, hooks, permissions or output style
123
+ // from the operator's setup. `--safe-mode` would also drop the profile's MCP servers.
124
+ "--setting-sources",
125
+ "",
126
+ "--strict-mcp-config",
127
+ ...servers,
128
+ "--disable-slash-commands",
129
+ "--settings",
130
+ JSON.stringify({ outputStyle: "default", autoMemoryEnabled: false }),
131
+ // `--tools` bounds built-in tools only; the allowlist is what lets MCP tools run.
132
+ "--tools",
133
+ profile.tools.filter((tool) => !isMcpTool(tool)).join(","),
134
+ ...(profile.tools.length
135
+ ? ["--allowedTools", profile.tools.join(",")]
136
+ : []),
137
+ "--permission-mode",
138
+ "dontAsk",
139
+ ];
140
+ }
141
+ /**
142
+ * Checks the started session against the profile: what the agent can do must be
143
+ * exactly what the profile grants (failure); any other customization is a warning.
144
+ */
145
+ function checkSession(profile, init) {
146
+ const declared = Object.keys(profile.mcpServers);
147
+ // A server that failed to start would otherwise surface as missing tools.
148
+ const unavailable = declared.flatMap((server) => {
149
+ const status = init.mcp_servers.find(({ name }) => name === server)?.status;
150
+ return status === "connected" ? [] : [`${server} (${status ?? "missing"})`];
151
+ });
152
+ if (unavailable.length)
153
+ return failure(`${label} MCP servers are not connected: ${unavailable.join(", ")}`);
154
+ // An unknown name would silently remove a tool the profile grants.
155
+ const missing = profile.tools.filter((tool) => !init.tools.includes(tool));
156
+ if (missing.length)
157
+ return failure(`${label} does not provide tools: ${missing.join(", ")}`);
158
+ const capabilities = [
159
+ [
160
+ "tools",
161
+ init.tools.filter((tool) => !profile.tools.includes(tool) &&
162
+ !declared.some((server) => tool.startsWith(`mcp__${server}__`))),
163
+ ],
164
+ [
165
+ "MCP servers",
166
+ init.mcp_servers
167
+ .map(({ name }) => name)
168
+ .filter((name) => !declared.includes(name)),
169
+ ],
170
+ [
171
+ "plugins",
172
+ init.plugins
173
+ .filter(({ path }) => path !== "builtin")
174
+ .map(({ name }) => name),
175
+ ],
176
+ ];
177
+ const extra = capabilities.flatMap(([field, names]) => names.length ? [`${field} ${names.join(", ")}`] : []);
178
+ if (extra.length)
179
+ return failure(`${label} session is not isolated: ${extra.join("; ")}`);
180
+ const customizations = [
181
+ ...[
182
+ ["skills", init.skills],
183
+ ["slash commands", init.slash_commands],
184
+ ].flatMap(([field, names]) => names === undefined
185
+ ? [`${field} unreported`]
186
+ : names.length
187
+ ? [`${field} ${names.join(", ")}`]
188
+ : []),
189
+ ...(init.memory_paths === undefined ? [] : ["auto memory"]),
190
+ ...(init.output_style === "default"
191
+ ? []
192
+ : [`output style ${init.output_style ?? "unreported"}`]),
193
+ ];
194
+ return customizations.length
195
+ ? [
196
+ {
197
+ type: "warning",
198
+ message: `${label} session is not fully isolated: ${customizations.join("; ")}`,
199
+ },
200
+ ]
201
+ : [];
202
+ }
203
+ /** `claude auth status --json`; it also names the account, which is never read. */
204
+ const loginStatus = z.looseObject({
205
+ loggedIn: z.boolean(),
206
+ authMethod: z.string().optional(),
207
+ apiKeySource: z.string().optional(),
208
+ });
209
+ function readLogin(stdout) {
210
+ let status;
211
+ try {
212
+ status = loginStatus.parse(JSON.parse(stdout));
213
+ }
214
+ catch {
215
+ return {
216
+ connected: false,
217
+ detail: `${label} login status is unreadable`,
218
+ };
219
+ }
220
+ if (!status.loggedIn)
221
+ return { connected: false, detail: `${label} is not logged in` };
222
+ // An API key in the environment replaces the login.
223
+ return {
224
+ connected: true,
225
+ detail: status.authMethod === "claude.ai"
226
+ ? "claude.ai subscription"
227
+ : status.authMethod === "api_key"
228
+ ? `API key (${status.apiKeySource ?? "unknown source"})`
229
+ : `${status.authMethod ?? "unknown"} login`,
230
+ };
231
+ }
232
+ const failure = (message) => [
233
+ { type: "failure", message },
234
+ ];
235
+ /**
236
+ * Claude Code in print mode, in a session that holds only the profile's tools and
237
+ * MCP servers. Its sessions need UUIDs: the run keeps a marker per session, so
238
+ * that the next call resumes it. At the end of each call, Claude Code announces
239
+ * its session's total, which is reported as it is.
240
+ */
241
+ export const claudeCode = {
242
+ name: "claude-code",
243
+ label,
244
+ executable: "claude",
245
+ minimumVersion: "2.1.296",
246
+ connection: () => ({
247
+ args: ["auth", "status", "--json"],
248
+ read: readLogin,
249
+ }),
250
+ model: (profile) => profile.model,
251
+ async start({ profile, systemPrompt, session, sessions }) {
252
+ const name = agentSessionName(sessions.runId, session);
253
+ const sessionId = claudeCodeSessionId(name);
254
+ const marker = join(sessions.directory, name);
255
+ // `--session-id` refuses an existing session and `--resume` a missing one.
256
+ const created = existsSync(marker);
257
+ const tools = new Map();
258
+ const responses = new Set();
259
+ let initialized = false;
260
+ /** A main-loop response once, however many events carry it; unreadable tokens are not reported. */
261
+ const responseOf = (type, parent, message) => {
262
+ if (type !== "assistant" || parent || typeof message.id !== "string")
263
+ return [];
264
+ if (responses.has(message.id))
265
+ return [];
266
+ responses.add(message.id);
267
+ const usage = stepUsage.safeParse(message.usage);
268
+ return usage.success
269
+ ? [
270
+ {
271
+ type: "response",
272
+ tokens: {
273
+ input: usage.data.input_tokens,
274
+ output: usage.data.output_tokens,
275
+ cacheRead: usage.data.cache_read_input_tokens,
276
+ cacheWrite: usage.data.cache_creation_input_tokens,
277
+ },
278
+ },
279
+ ]
280
+ : [];
281
+ };
282
+ return {
283
+ args: [
284
+ "--print",
285
+ "--output-format",
286
+ "stream-json",
287
+ "--verbose",
288
+ ...profileArgs(profile, systemPrompt),
289
+ created ? "--resume" : "--session-id",
290
+ sessionId,
291
+ "--name",
292
+ `${sessions.runId}:${session}`,
293
+ ],
294
+ read(raw) {
295
+ const event = parseEvent(label, anyEvent, raw);
296
+ if (event.type === "system" && event.subtype === "init") {
297
+ const init = parseEvent(label, initEvent, raw);
298
+ if (init.session_id !== sessionId)
299
+ return failure(`${label} started session ${init.session_id} instead of ${sessionId}`);
300
+ if (!created)
301
+ writeFileSync(marker, `${JSON.stringify({ sessionId })}\n`, {
302
+ mode: 0o600,
303
+ });
304
+ initialized = true;
305
+ return checkSession(profile, init);
306
+ }
307
+ if (event.type === "assistant" || event.type === "user") {
308
+ const { parent_tool_use_id: parent, message } = parseEvent(label, messageEvent, raw);
309
+ return [
310
+ ...responseOf(event.type, parent, message),
311
+ ...message.content.flatMap((block) => {
312
+ if (block.type === "tool_use") {
313
+ tools.set(String(block.id), String(block.name));
314
+ return [
315
+ {
316
+ type: "tool",
317
+ id: String(block.id),
318
+ name: String(block.name),
319
+ status: "started",
320
+ },
321
+ ];
322
+ }
323
+ if (block.type !== "tool_result")
324
+ return [];
325
+ const id = String(block.tool_use_id);
326
+ return [
327
+ {
328
+ type: "tool",
329
+ id,
330
+ name: tools.get(id) ?? id,
331
+ status: block.is_error ? "failed" : "completed",
332
+ },
333
+ ];
334
+ }),
335
+ ];
336
+ }
337
+ if (event.type !== "result")
338
+ return [];
339
+ const result = parseEvent(label, resultEvent, raw);
340
+ const total = usageOf(result.modelUsage);
341
+ // A crash result may announce zeroed figures (Claude Code's cost tracking docs):
342
+ // nothing is measured, so the session keeps its earlier total.
343
+ const crashed = result.is_error &&
344
+ result.subtype === "error_during_execution" &&
345
+ total !== undefined &&
346
+ Object.values(total).every((value) => value === 0);
347
+ const usage = {
348
+ type: "usage",
349
+ scope: "session",
350
+ usage: crashed ? undefined : total,
351
+ };
352
+ if (result.is_error) {
353
+ const errors = Array.isArray(result.errors)
354
+ ? result.errors.filter((error) => typeof error === "string")
355
+ : [];
356
+ return [
357
+ usage,
358
+ ...failure(`${label} ${text(result.subtype) || "error"}: ${text(result.result) || errors.join("; ") || "no detail provided"}`),
359
+ ];
360
+ }
361
+ if (result.stop_reason && result.stop_reason !== "end_turn")
362
+ return [
363
+ usage,
364
+ ...failure(`${label} final response ended with stop reason ${result.stop_reason}`),
365
+ ];
366
+ // Without an init event, neither the session nor its isolation was checked.
367
+ if (!initialized)
368
+ return [
369
+ usage,
370
+ ...failure(`${label} answered without reporting its session (init)`),
371
+ ];
372
+ // A successful call's final text is what the stage receives.
373
+ if (typeof result.result !== "string")
374
+ return [
375
+ usage,
376
+ ...failure(`${label} emitted an unexpected result event: result: expected a string`),
377
+ ];
378
+ return [usage, { type: "result", text: result.result }];
379
+ },
380
+ };
381
+ },
382
+ };
383
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/system/runtimes/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { Runtime } from "../../engine/profiles.js";
2
+ import type { AgentStage } from "../../engine/types.js";
3
+ export interface RuntimeStatus {
4
+ ok: boolean;
5
+ detail: string;
6
+ }
7
+ export interface AgentProblem {
8
+ /** The agent stage, as the caller names it. */
9
+ stage: string;
10
+ runtime: Runtime;
11
+ reason: string;
12
+ }
13
+ /** Node 24 or later runs the factory's TypeScript without a build step. */
14
+ export declare function inspectNode(): RuntimeStatus;
15
+ /**
16
+ * Inspects each runtime the agent stages use, without any provider request: the
17
+ * executable in the PATH, its version, then the connection each stage's profile
18
+ * would use. A missing prerequisite is reported for every stage it concerns.
19
+ */
20
+ export declare function inspectRuntimes(agents: Record<string, Pick<AgentStage, "profile">>): Promise<{
21
+ runtimes: Partial<Record<Runtime, RuntimeStatus>>;
22
+ problems: AgentProblem[];
23
+ /** Each runtime found, by absolute path: a run launches exactly what was checked. */
24
+ executables: Partial<Record<Runtime, string>>;
25
+ }>;
@@ -0,0 +1,129 @@
1
+ import { constants } from "node:fs";
2
+ import { access, stat } from "node:fs/promises";
3
+ import { delimiter, isAbsolute, join } from "node:path";
4
+ import { ProcessInterruptedError, runProcess } from "../process.js";
5
+ import { runtimes } from "./registry.js";
6
+ /** Only absolute PATH entries: an empty or relative one depends on the current directory. */
7
+ async function findInPath(name) {
8
+ for (const dir of (process.env.PATH ?? "").split(delimiter)) {
9
+ if (!isAbsolute(dir))
10
+ continue;
11
+ const candidate = join(dir, name);
12
+ try {
13
+ await access(candidate, constants.X_OK);
14
+ if ((await stat(candidate)).isFile())
15
+ return candidate;
16
+ }
17
+ catch {
18
+ // Not in this directory.
19
+ }
20
+ }
21
+ return undefined;
22
+ }
23
+ /** Node 24 or later runs the factory's TypeScript without a build step. */
24
+ export function inspectNode() {
25
+ const version = process.versions.node;
26
+ return Number(version.split(".")[0]) >= 24
27
+ ? { ok: true, detail: `Node ${version}` }
28
+ : { ok: false, detail: `Node 24+ required; found ${version}` };
29
+ }
30
+ /** Standard output of a quick local command; a runtime that cannot run is a finding, not an error. */
31
+ async function output(executable, args) {
32
+ try {
33
+ return await runProcess([executable, ...args], process.cwd(), 10_000);
34
+ }
35
+ catch (error) {
36
+ if (error instanceof ProcessInterruptedError)
37
+ throw error;
38
+ return { error: error instanceof Error ? error.message : String(error) };
39
+ }
40
+ }
41
+ const older = (version, minimum) => {
42
+ const [a, b] = [version, minimum].map((value) => value.split(".").map(Number));
43
+ for (let i = 0; i < 3; i++)
44
+ if ((a?.[i] ?? 0) !== (b?.[i] ?? 0))
45
+ return (a?.[i] ?? 0) < (b?.[i] ?? 0);
46
+ return false;
47
+ };
48
+ /** The executable in the PATH and its version: where it is, or why it cannot be used. */
49
+ async function inspectExecutable(adapter) {
50
+ const path = await findInPath(adapter.executable);
51
+ if (!path)
52
+ return { problem: `${adapter.executable} not found in PATH` };
53
+ const printed = await output(path, ["--version"]);
54
+ if ("error" in printed)
55
+ return { problem: `Cannot run ${adapter.label}: ${printed.error}` };
56
+ if (printed.exitCode !== 0)
57
+ return {
58
+ problem: `${adapter.label} --version exited with code ${printed.exitCode}`,
59
+ };
60
+ const version = /\d+\.\d+\.\d+/.exec(printed.stdout)?.[0];
61
+ if (!version)
62
+ return {
63
+ problem: `Cannot read the ${adapter.label} version: ${printed.stdout.trim() || printed.stderr.trim() || "no output"}`,
64
+ };
65
+ if (older(version, adapter.minimumVersion))
66
+ return {
67
+ problem: `${adapter.label} ${version} is older than ${adapter.minimumVersion}, the oldest version factory supports`,
68
+ };
69
+ return { path, version };
70
+ }
71
+ /** The connection a check reports, trusted only when the check succeeded; a refusal keeps its own reason. */
72
+ function connectionOf(adapter, printed, read) {
73
+ if ("error" in printed)
74
+ return {
75
+ connected: false,
76
+ detail: `Cannot run ${adapter.label}: ${printed.error}`,
77
+ };
78
+ const reported = read(printed.stdout);
79
+ return reported.connected && printed.exitCode !== 0
80
+ ? {
81
+ connected: false,
82
+ detail: `${adapter.label} connection check exited with code ${printed.exitCode}`,
83
+ }
84
+ : reported;
85
+ }
86
+ /**
87
+ * Inspects each runtime the agent stages use, without any provider request: the
88
+ * executable in the PATH, its version, then the connection each stage's profile
89
+ * would use. A missing prerequisite is reported for every stage it concerns.
90
+ */
91
+ export async function inspectRuntimes(agents) {
92
+ const statuses = {};
93
+ const executables = {};
94
+ const problems = [];
95
+ const stages = Object.entries(agents);
96
+ for (const runtime of new Set(stages.map(([, { profile }]) => profile.runtime))) {
97
+ const adapter = runtimes[runtime];
98
+ const using = stages.filter(([, { profile }]) => profile.runtime === runtime);
99
+ const executable = await inspectExecutable(adapter);
100
+ if ("problem" in executable) {
101
+ statuses[runtime] = { ok: false, detail: executable.problem };
102
+ for (const [stage] of using)
103
+ problems.push({ stage, runtime, reason: executable.problem });
104
+ continue;
105
+ }
106
+ executables[runtime] = executable.path;
107
+ // Stages whose profiles use the same connection share one check.
108
+ const checked = new Map();
109
+ for (const [stage, { profile }] of using) {
110
+ const { args, read } = adapter.connection(profile);
111
+ const key = args.join("\0");
112
+ let connection = checked.get(key);
113
+ if (!connection) {
114
+ const printed = await output(executable.path, args);
115
+ connection = connectionOf(adapter, printed, read);
116
+ checked.set(key, connection);
117
+ }
118
+ if (!connection.connected)
119
+ problems.push({ stage, runtime, reason: connection.detail });
120
+ }
121
+ const connections = [...checked.values()];
122
+ statuses[runtime] = {
123
+ ok: connections.every(({ connected }) => connected),
124
+ detail: `${adapter.label} ${executable.version} (${executable.path}): ${connections.map(({ detail }) => detail).join(", ")}`,
125
+ };
126
+ }
127
+ return { runtimes: statuses, problems, executables };
128
+ }
129
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../src/system/runtimes/inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type RuntimeAdapter } from "./adapter.js";
2
+ /**
3
+ * Pi in JSON mode (its documented event stream), its session named after the run.
4
+ * Every response is measured, retried ones included; the answer is the last
5
+ * response once Pi has settled, after its own retries.
6
+ */
7
+ export declare const pi: RuntimeAdapter<"pi">;