@clemrig/factory 0.1.0 → 0.2.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 (107) hide show
  1. package/README.md +6 -17
  2. package/dist/app/doctor.d.ts +2 -4
  3. package/dist/app/doctor.js +6 -4
  4. package/dist/app/doctor.js.map +1 -1
  5. package/dist/app/factory.d.ts +2 -0
  6. package/dist/app/factory.js +13 -2
  7. package/dist/app/factory.js.map +1 -1
  8. package/dist/app/init.d.ts +1 -5
  9. package/dist/app/init.js +1 -13
  10. package/dist/app/init.js.map +1 -1
  11. package/dist/app/options.d.ts +17 -0
  12. package/dist/app/options.js +78 -0
  13. package/dist/app/options.js.map +1 -0
  14. package/dist/app/run.d.ts +4 -20
  15. package/dist/app/run.js +22 -93
  16. package/dist/app/run.js.map +1 -1
  17. package/dist/app/runs.d.ts +4 -32
  18. package/dist/app/runs.js +9 -61
  19. package/dist/app/runs.js.map +1 -1
  20. package/dist/cli/application.d.ts +1 -1
  21. package/dist/cli/application.js +1 -1
  22. package/dist/cli/args.js +2 -2
  23. package/dist/cli/args.js.map +1 -1
  24. package/dist/cli/doctor.d.ts +1 -1
  25. package/dist/cli/doctor.js +1 -1
  26. package/dist/cli/doctor.js.map +1 -1
  27. package/dist/cli/help.d.ts +1 -1
  28. package/dist/cli/help.js +1 -1
  29. package/dist/cli/init.d.ts +1 -1
  30. package/dist/cli/init.js +1 -1
  31. package/dist/cli/launcher.d.ts +1 -1
  32. package/dist/cli/launcher.js +4 -4
  33. package/dist/cli/launcher.js.map +1 -1
  34. package/dist/cli/reporter.d.ts +1 -1
  35. package/dist/cli/reporter.js +1 -2
  36. package/dist/cli/reporter.js.map +1 -1
  37. package/dist/cli/run.d.ts +1 -5
  38. package/dist/cli/run.js +24 -11
  39. package/dist/cli/run.js.map +1 -1
  40. package/dist/cli/ui.d.ts +1 -1
  41. package/dist/cli/ui.js +10 -3
  42. package/dist/cli/ui.js.map +1 -1
  43. package/dist/index.d.ts +3 -7
  44. package/dist/index.js +3 -5
  45. package/dist/index.js.map +1 -1
  46. package/dist/system/factory.d.ts +1 -1
  47. package/dist/system/factory.js +1 -1
  48. package/dist/system/factory.js.map +1 -1
  49. package/dist/system/npm.d.ts +5 -0
  50. package/dist/system/npm.js +14 -0
  51. package/dist/system/npm.js.map +1 -0
  52. package/dist/system/templates.d.ts +1 -1
  53. package/dist/system/templates.js +1 -1
  54. package/package.json +7 -17
  55. package/dist/engine/metrics.d.ts +0 -45
  56. package/dist/engine/metrics.js +0 -60
  57. package/dist/engine/metrics.js.map +0 -1
  58. package/dist/engine/primitives.d.ts +0 -34
  59. package/dist/engine/primitives.js +0 -81
  60. package/dist/engine/primitives.js.map +0 -1
  61. package/dist/engine/profiles.d.ts +0 -53
  62. package/dist/engine/profiles.js +0 -117
  63. package/dist/engine/profiles.js.map +0 -1
  64. package/dist/engine/runner.d.ts +0 -13
  65. package/dist/engine/runner.js +0 -157
  66. package/dist/engine/runner.js.map +0 -1
  67. package/dist/engine/types.d.ts +0 -194
  68. package/dist/engine/types.js +0 -2
  69. package/dist/engine/types.js.map +0 -1
  70. package/dist/engine/workflow.d.ts +0 -18
  71. package/dist/engine/workflow.js +0 -196
  72. package/dist/engine/workflow.js.map +0 -1
  73. package/dist/system/process.d.ts +0 -21
  74. package/dist/system/process.js +0 -238
  75. package/dist/system/process.js.map +0 -1
  76. package/dist/system/runtimes/adapter.d.ts +0 -90
  77. package/dist/system/runtimes/adapter.js +0 -20
  78. package/dist/system/runtimes/adapter.js.map +0 -1
  79. package/dist/system/runtimes/agent-runtime.d.ts +0 -45
  80. package/dist/system/runtimes/agent-runtime.js +0 -184
  81. package/dist/system/runtimes/agent-runtime.js.map +0 -1
  82. package/dist/system/runtimes/claude-code.d.ts +0 -10
  83. package/dist/system/runtimes/claude-code.js +0 -383
  84. package/dist/system/runtimes/claude-code.js.map +0 -1
  85. package/dist/system/runtimes/inspect.d.ts +0 -25
  86. package/dist/system/runtimes/inspect.js +0 -129
  87. package/dist/system/runtimes/inspect.js.map +0 -1
  88. package/dist/system/runtimes/pi.d.ts +0 -7
  89. package/dist/system/runtimes/pi.js +0 -235
  90. package/dist/system/runtimes/pi.js.map +0 -1
  91. package/dist/system/runtimes/protocol.d.ts +0 -9
  92. package/dist/system/runtimes/protocol.js +0 -38
  93. package/dist/system/runtimes/protocol.js.map +0 -1
  94. package/dist/system/runtimes/registry.d.ts +0 -5
  95. package/dist/system/runtimes/registry.js +0 -5
  96. package/dist/system/runtimes/registry.js.map +0 -1
  97. package/dist/system/store.d.ts +0 -20
  98. package/dist/system/store.js +0 -126
  99. package/dist/system/store.js.map +0 -1
  100. package/dist/ui/server.d.ts +0 -8
  101. package/dist/ui/server.js +0 -111
  102. package/dist/ui/server.js.map +0 -1
  103. package/dist/ui/static/dashboard.js +0 -266
  104. package/dist/ui/static/follow.js +0 -67
  105. package/dist/ui/static/index.html +0 -20
  106. package/dist/ui/static/style.css +0 -166
  107. package/dist/ui/static/timeline.js +0 -180
@@ -1,25 +0,0 @@
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
- }>;
@@ -1,129 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../src/system/runtimes/inspect.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
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">;
@@ -1,235 +0,0 @@
1
- import { z } from "zod";
2
- import { runtimeLabels } from "../../engine/profiles.js";
3
- import { parseEvent, } from "./adapter.js";
4
- import { agentSessionName } from "./protocol.js";
5
- const label = runtimeLabels.pi;
6
- const anyEvent = z.looseObject({ type: z.string() });
7
- const message = z.looseObject({
8
- role: z.string(),
9
- // Text content is one text part; a text part holds its text.
10
- content: z
11
- .preprocess((content) => typeof content === "string"
12
- ? [{ type: "text", text: content }]
13
- : content, z.array(z
14
- .looseObject({ type: z.string(), text: z.unknown().optional() })
15
- .superRefine((part, context) => {
16
- if (part.type === "text" && typeof part.text !== "string")
17
- context.addIssue({
18
- code: "custom",
19
- path: ["text"],
20
- message: "expected a string",
21
- });
22
- })))
23
- .optional(),
24
- stopReason: z.string().optional(),
25
- /** Only explains a failure: its shape never hides it. */
26
- errorMessage: z.unknown().optional(),
27
- usage: z.unknown().optional(),
28
- });
29
- const messageEnd = z.looseObject({ message });
30
- const compactionEnd = z.looseObject({
31
- aborted: z.boolean().optional(),
32
- result: z
33
- .looseObject({ usage: z.unknown().optional() })
34
- .nullable()
35
- .optional(),
36
- });
37
- const toolStart = z.looseObject({
38
- toolCallId: z.string(),
39
- toolName: z.string(),
40
- });
41
- const toolEnd = toolStart.extend({
42
- isError: z.boolean(),
43
- result: z
44
- .looseObject({ usage: z.unknown().optional() })
45
- .nullable()
46
- .optional(),
47
- });
48
- const agentEnd = z.looseObject({ messages: z.array(message) });
49
- const agentSettled = z.looseObject({ aborted: z.boolean() });
50
- /** Pi's usage of one response; measured on a best-effort basis. */
51
- const usage = z.looseObject({
52
- input: z.number().nonnegative(),
53
- output: z.number().nonnegative(),
54
- cacheRead: z.number().nonnegative(),
55
- cacheWrite: z.number().nonnegative(),
56
- cost: z.looseObject({ total: z.number().nonnegative() }),
57
- });
58
- function measure(value) {
59
- const parsed = usage.safeParse(value);
60
- const measured = parsed.success
61
- ? {
62
- input: parsed.data.input,
63
- output: parsed.data.output,
64
- cacheRead: parsed.data.cacheRead,
65
- cacheWrite: parsed.data.cacheWrite,
66
- costUsd: parsed.data.cost.total,
67
- }
68
- : undefined;
69
- return { type: "usage", scope: "response", usage: measured };
70
- }
71
- const textOf = (response) => (response.content ?? [])
72
- .map((part) => (part.type === "text" ? String(part.text) : ""))
73
- .join("");
74
- /** The final response once Pi has settled: its text, or why there is none. */
75
- function finalEvent(response) {
76
- if (!response)
77
- return {
78
- type: "failure",
79
- message: `${label} completed without an assistant response`,
80
- };
81
- if (response.stopReason === "error" || response.stopReason === "aborted")
82
- return {
83
- type: "failure",
84
- message: `${label} provider ${response.stopReason}: ${typeof response.errorMessage === "string" ? response.errorMessage : "no detail provided"}`,
85
- };
86
- if (response.stopReason !== "stop")
87
- return {
88
- type: "failure",
89
- message: `${label} final response ended with stop reason ${response.stopReason ?? "missing"}`,
90
- };
91
- return { type: "result", text: textOf(response) };
92
- }
93
- /** `pi auth check --json`: whether a provider's credentials are ready, never the credentials. */
94
- const authCheck = z.looseObject({
95
- status: z.string(),
96
- provider: z.string().optional(),
97
- authType: z.string().optional(),
98
- reason: z.string().optional(),
99
- });
100
- const authTypes = {
101
- oauth: "OAuth",
102
- api_key: "API key",
103
- };
104
- function readAuthCheck(provider, stdout) {
105
- let check;
106
- try {
107
- check = authCheck.parse(JSON.parse(stdout));
108
- }
109
- catch {
110
- return {
111
- connected: false,
112
- detail: `${label} connection check is unreadable`,
113
- };
114
- }
115
- return check.status === "ready"
116
- ? {
117
- connected: true,
118
- detail: `${provider} ${authTypes[check.authType ?? ""] ?? check.authType ?? "credentials"}`,
119
- }
120
- : {
121
- connected: false,
122
- detail: `${label} is not connected to ${provider}: ${check.reason ?? check.status}`,
123
- };
124
- }
125
- function profileArgs(profile, systemPrompt) {
126
- return [
127
- "--provider",
128
- profile.provider,
129
- "--model",
130
- profile.model,
131
- "--thinking",
132
- profile.thinking,
133
- "--append-system-prompt",
134
- systemPrompt,
135
- // Nothing from the machine: only the profile's tools, skills and extensions.
136
- "--no-extensions",
137
- "--no-skills",
138
- "--no-context-files",
139
- "--no-mcp",
140
- ...(profile.tools.length
141
- ? ["--tools", profile.tools.join(",")]
142
- : ["--no-tools"]),
143
- ...profile.skills.flatMap((skill) => ["--skill", skill]),
144
- ...profile.extensions.flatMap((extension) => ["--extension", extension]),
145
- ];
146
- }
147
- /**
148
- * Pi in JSON mode (its documented event stream), its session named after the run.
149
- * Every response is measured, retried ones included; the answer is the last
150
- * response once Pi has settled, after its own retries.
151
- */
152
- export const pi = {
153
- name: "pi",
154
- label,
155
- executable: "pi",
156
- minimumVersion: "1.1.0",
157
- // --no-refresh: an expired token is reported, never refreshed.
158
- connection: ({ provider }) => ({
159
- args: ["auth", "check", "--provider", provider, "--json", "--no-refresh"],
160
- read: (stdout) => readAuthCheck(provider, stdout),
161
- }),
162
- model: (profile) => `${profile.provider}/${profile.model}`,
163
- async start({ profile, systemPrompt, session, sessions }) {
164
- let final;
165
- return {
166
- args: [
167
- "--mode",
168
- "json",
169
- "--print",
170
- ...profileArgs(profile, systemPrompt),
171
- "--session-id",
172
- agentSessionName(sessions.runId, session),
173
- "--session-dir",
174
- sessions.directory,
175
- "--name",
176
- `${sessions.runId}:${session}`,
177
- "--",
178
- "Read and obey the complete factory request supplied through standard input. Return only the required JSON.",
179
- ],
180
- read(raw) {
181
- const { type } = parseEvent(label, anyEvent, raw);
182
- switch (type) {
183
- case "message_end": {
184
- const ended = parseEvent(label, messageEnd, raw).message;
185
- return ended.role === "assistant" ? [measure(ended.usage)] : [];
186
- }
187
- case "compaction_end": {
188
- const compaction = parseEvent(label, compactionEnd, raw);
189
- return compaction.aborted
190
- ? []
191
- : [measure(compaction.result?.usage)];
192
- }
193
- case "tool_execution_start": {
194
- const tool = parseEvent(label, toolStart, raw);
195
- return [
196
- {
197
- type: "tool",
198
- id: tool.toolCallId,
199
- name: tool.toolName,
200
- status: "started",
201
- },
202
- ];
203
- }
204
- case "tool_execution_end": {
205
- const tool = parseEvent(label, toolEnd, raw);
206
- // A tool that called a model reports that usage with its result.
207
- return [
208
- ...(tool.result?.usage === undefined
209
- ? []
210
- : [measure(tool.result.usage)]),
211
- {
212
- type: "tool",
213
- id: tool.toolCallId,
214
- name: tool.toolName,
215
- status: tool.isError ? "failed" : "completed",
216
- },
217
- ];
218
- }
219
- case "agent_end": {
220
- // After its own retries, Pi settles on the last run's response.
221
- final = parseEvent(label, agentEnd, raw).messages.findLast(({ role }) => role === "assistant");
222
- return [];
223
- }
224
- case "agent_settled":
225
- return parseEvent(label, agentSettled, raw).aborted
226
- ? [{ type: "failure", message: `${label} run was aborted` }]
227
- : [finalEvent(final)];
228
- default:
229
- return [];
230
- }
231
- },
232
- };
233
- },
234
- };
235
- //# sourceMappingURL=pi.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pi.js","sourceRoot":"","sources":["../../../src/system/runtimes/pi.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- /** The complete request every runtime receives through standard input. */
2
- export declare function agentPrompt(request: {
3
- context: unknown;
4
- schema: Record<string, unknown>;
5
- }): string;
6
- /** Accepts exact JSON or a single fenced JSON block, never prose surrounding a result. */
7
- export declare function parseAgentJson(text: string): unknown;
8
- /** One session per run and session name: `<run>.<session>`. */
9
- export declare function agentSessionName(runId: string, session: string): string;
@@ -1,38 +0,0 @@
1
- /** Output protocol shared by every runtime, sent before the factory request. */
2
- const outputProtocol = `# Response format
3
-
4
- - Return exactly one JSON value matching the requested schema.
5
- - Do not use Markdown or add prose.`;
6
- /** The complete request every runtime receives through standard input. */
7
- export function agentPrompt(request) {
8
- return [
9
- outputProtocol,
10
- "Factory request:",
11
- JSON.stringify({ context: request.context, outputSchema: request.schema }),
12
- ].join("\n\n");
13
- }
14
- /** Accepts exact JSON or a single fenced JSON block, never prose surrounding a result. */
15
- export function parseAgentJson(text) {
16
- const trimmed = text.trim();
17
- const fenced = /^```(?:json)?\s*\n([\s\S]*?)\n```$/i.exec(trimmed);
18
- const candidate = fenced ? (fenced[1] ?? "").trim() : trimmed;
19
- if (!candidate)
20
- throw new Error("Agent returned an empty final response");
21
- try {
22
- return JSON.parse(candidate);
23
- }
24
- catch (error) {
25
- throw new Error(`Agent final response is not a single JSON value: ${error instanceof Error ? error.message : String(error)}`);
26
- }
27
- }
28
- /** A session name segment: never contains the `.` separator, starts and ends alphanumeric. */
29
- const segment = /^[a-zA-Z0-9](?:[a-zA-Z0-9_-]*[a-zA-Z0-9])?$/;
30
- /** One session per run and session name: `<run>.<session>`. */
31
- export function agentSessionName(runId, session) {
32
- if (!segment.test(runId))
33
- throw new Error("Invalid run ID for agent session");
34
- if (typeof session !== "string" || !segment.test(session))
35
- throw new Error(`Invalid agent session name: ${String(session)}`);
36
- return `${runId}.${session}`;
37
- }
38
- //# sourceMappingURL=protocol.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/system/runtimes/protocol.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,MAAM,cAAc,GAAG;;;oCAGa,CAAC;AAErC,0EAA0E;AAC1E,MAAM,UAAU,WAAW,CAAC,OAG3B;IACC,OAAO;QACL,cAAc;QACd,kBAAkB;QAClB,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;KAC3E,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,qCAAqC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAC9D,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC1E,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,oDAAoD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC7G,CAAC;IACJ,CAAC;AACH,CAAC;AAED,8FAA8F;AAC9F,MAAM,OAAO,GAAG,6CAA6C,CAAC;AAE9D,+DAA+D;AAC/D,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,OAAe;IAC7D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC9E,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpE,OAAO,GAAG,KAAK,IAAI,OAAO,EAAE,CAAC;AAC/B,CAAC"}
@@ -1,5 +0,0 @@
1
- /** Every runtime a profile can select, by name. */
2
- export declare const runtimes: {
3
- readonly "claude-code": import("./adapter.js").RuntimeAdapter<"claude-code">;
4
- readonly pi: import("./adapter.js").RuntimeAdapter<"pi">;
5
- };
@@ -1,5 +0,0 @@
1
- import { claudeCode } from "./claude-code.js";
2
- import { pi } from "./pi.js";
3
- /** Every runtime a profile can select, by name. */
4
- export const runtimes = { "claude-code": claudeCode, pi };
5
- //# sourceMappingURL=registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/system/runtimes/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B,mDAAmD;AACnD,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,EAAW,CAAC"}
@@ -1,20 +0,0 @@
1
- import type { RunEvent, RunState, RunStore } from "../engine/types.js";
2
- /** No run has this ID, or none can: unlike a read error, asking again will not find it. */
3
- export declare class UnknownRunError extends Error {
4
- constructor(message: string);
5
- }
6
- /** A new run ID: its creation time, then a random suffix, so that IDs sort in creation order. */
7
- export declare function newRunId(): string;
8
- /** One run's directory: `state.json` and its `events.jsonl` journal. */
9
- export declare class FileRunStore implements RunStore {
10
- readonly directory: string;
11
- readonly runId: string;
12
- constructor(runsDir: string, runId: string);
13
- /** Run IDs in order: they start with their creation time. */
14
- static list(runsDir: string): Promise<string[]>;
15
- save(state: RunState): Promise<void>;
16
- load(): Promise<RunState>;
17
- event(event: RunEvent): Promise<void>;
18
- /** Recorded events; a last line still being written is ignored. */
19
- events(): Promise<RunEvent[]>;
20
- }
@@ -1,126 +0,0 @@
1
- import { randomUUID } from "node:crypto";
2
- import { appendFile, mkdir, readdir, readFile, rename, rm, writeFile, } from "node:fs/promises";
3
- import { join } from "node:path";
4
- const isRecord = (value) => !!value && typeof value === "object" && !Array.isArray(value);
5
- function isRetryCounts(value) {
6
- return (isRecord(value) &&
7
- Object.values(value).every((count) => Number.isSafeInteger(count) && count >= 1));
8
- }
9
- const finiteNonnegative = (n) => typeof n === "number" && Number.isFinite(n) && n >= 0;
10
- const isUsage = (value) => isRecord(value) &&
11
- ["input", "output", "cacheRead", "cacheWrite", "costUsd"].every((key) => finiteNonnegative(value[key]));
12
- function isRunMetrics(value) {
13
- if (!isRecord(value) || !isUsage(value.usage))
14
- return false;
15
- const counts = value.usage;
16
- return (["responses", "missing"].every((key) => Number.isSafeInteger(counts[key]) && finiteNonnegative(counts[key])) &&
17
- (value.sessions === undefined ||
18
- (isRecord(value.sessions) &&
19
- Object.values(value.sessions).every(isUsage))));
20
- }
21
- /** Each runtime's version and connection, as text. */
22
- const isRuntimes = (value) => isRecord(value) &&
23
- Object.values(value).every((detail) => typeof detail === "string");
24
- /** No run has this ID, or none can: unlike a read error, asking again will not find it. */
25
- export class UnknownRunError extends Error {
26
- constructor(message) {
27
- super(message);
28
- this.name = "UnknownRunError";
29
- }
30
- }
31
- /** A new run ID: its creation time, then a random suffix, so that IDs sort in creation order. */
32
- export function newRunId() {
33
- return `${Date.now()}-${randomUUID().slice(0, 8)}`;
34
- }
35
- /** One run's directory: `state.json` and its `events.jsonl` journal. */
36
- export class FileRunStore {
37
- directory;
38
- runId;
39
- constructor(runsDir, runId) {
40
- if (!/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$/.test(runId))
41
- throw new UnknownRunError("Invalid run ID");
42
- this.runId = runId;
43
- this.directory = join(runsDir, runId);
44
- }
45
- /** Run IDs in order: they start with their creation time. */
46
- static async list(runsDir) {
47
- try {
48
- return (await readdir(runsDir, { withFileTypes: true }))
49
- .filter((entry) => entry.isDirectory())
50
- .map((entry) => entry.name)
51
- .sort();
52
- }
53
- catch (error) {
54
- if (error.code === "ENOENT")
55
- return [];
56
- throw error;
57
- }
58
- }
59
- async save(state) {
60
- if (state.id !== this.runId)
61
- throw new Error("Run state ID does not match store");
62
- await mkdir(this.directory, { recursive: true });
63
- const temporary = join(this.directory, `state-${randomUUID()}.tmp`);
64
- try {
65
- await writeFile(temporary, `${JSON.stringify(state, null, 2)}\n`, {
66
- mode: 0o600,
67
- });
68
- await rename(temporary, join(this.directory, "state.json"));
69
- }
70
- finally {
71
- await rm(temporary, { force: true });
72
- }
73
- }
74
- async load() {
75
- let text;
76
- try {
77
- text = await readFile(join(this.directory, "state.json"), "utf8");
78
- }
79
- catch (error) {
80
- if (error.code === "ENOENT")
81
- throw new UnknownRunError(`Unknown run ${this.runId}`);
82
- throw error;
83
- }
84
- const state = JSON.parse(text);
85
- if (state?.version !== 4 ||
86
- state.id !== this.runId ||
87
- typeof state.workflow !== "string" ||
88
- !state.workflow.trim() ||
89
- !["running", "completed", "failed"].includes(state.status) ||
90
- typeof state.stage !== "string" ||
91
- typeof state.createdAt !== "string" ||
92
- typeof state.updatedAt !== "string" ||
93
- !isRecord(state.input) ||
94
- !isRecord(state.data) ||
95
- (state.retries !== undefined && !isRetryCounts(state.retries)) ||
96
- (state.metrics !== undefined && !isRunMetrics(state.metrics)) ||
97
- (state.runtimes !== undefined && !isRuntimes(state.runtimes)))
98
- throw new Error("Unsupported or mismatched persisted run; runs created by earlier factory versions are not readable");
99
- return state;
100
- }
101
- async event(event) {
102
- if (event.runId !== this.runId)
103
- throw new Error("Event run ID does not match store");
104
- await mkdir(this.directory, { recursive: true });
105
- await appendFile(join(this.directory, "events.jsonl"), `${JSON.stringify(event)}\n`, { mode: 0o600 });
106
- }
107
- /** Recorded events; a last line still being written is ignored. */
108
- async events() {
109
- let text;
110
- try {
111
- text = await readFile(join(this.directory, "events.jsonl"), "utf8");
112
- }
113
- catch (error) {
114
- if (error.code === "ENOENT")
115
- return [];
116
- throw error;
117
- }
118
- const lines = text.split("\n");
119
- // Only lines ended by a newline are complete.
120
- lines.pop();
121
- return lines
122
- .filter((line) => line.trim())
123
- .map((line) => JSON.parse(line));
124
- }
125
- }
126
- //# sourceMappingURL=store.js.map