@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.
- package/README.md +6 -17
- package/dist/app/doctor.d.ts +2 -4
- package/dist/app/doctor.js +6 -4
- package/dist/app/doctor.js.map +1 -1
- package/dist/app/factory.d.ts +2 -0
- package/dist/app/factory.js +13 -2
- package/dist/app/factory.js.map +1 -1
- package/dist/app/init.d.ts +1 -5
- package/dist/app/init.js +1 -13
- package/dist/app/init.js.map +1 -1
- package/dist/app/options.d.ts +17 -0
- package/dist/app/options.js +78 -0
- package/dist/app/options.js.map +1 -0
- package/dist/app/run.d.ts +4 -20
- package/dist/app/run.js +22 -93
- package/dist/app/run.js.map +1 -1
- package/dist/app/runs.d.ts +4 -32
- package/dist/app/runs.js +9 -61
- package/dist/app/runs.js.map +1 -1
- package/dist/cli/application.d.ts +1 -1
- package/dist/cli/application.js +1 -1
- package/dist/cli/args.js +2 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/doctor.d.ts +1 -1
- package/dist/cli/doctor.js +1 -1
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/help.d.ts +1 -1
- package/dist/cli/help.js +1 -1
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +1 -1
- package/dist/cli/launcher.d.ts +1 -1
- package/dist/cli/launcher.js +4 -4
- package/dist/cli/launcher.js.map +1 -1
- package/dist/cli/reporter.d.ts +1 -1
- package/dist/cli/reporter.js +1 -2
- package/dist/cli/reporter.js.map +1 -1
- package/dist/cli/run.d.ts +1 -5
- package/dist/cli/run.js +24 -11
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/ui.d.ts +1 -1
- package/dist/cli/ui.js +10 -3
- package/dist/cli/ui.js.map +1 -1
- package/dist/index.d.ts +3 -7
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/system/factory.d.ts +1 -1
- package/dist/system/factory.js +1 -1
- package/dist/system/factory.js.map +1 -1
- package/dist/system/npm.d.ts +5 -0
- package/dist/system/npm.js +14 -0
- package/dist/system/npm.js.map +1 -0
- package/dist/system/templates.d.ts +1 -1
- package/dist/system/templates.js +1 -1
- package/package.json +7 -17
- package/dist/engine/metrics.d.ts +0 -45
- package/dist/engine/metrics.js +0 -60
- package/dist/engine/metrics.js.map +0 -1
- package/dist/engine/primitives.d.ts +0 -34
- package/dist/engine/primitives.js +0 -81
- package/dist/engine/primitives.js.map +0 -1
- package/dist/engine/profiles.d.ts +0 -53
- package/dist/engine/profiles.js +0 -117
- package/dist/engine/profiles.js.map +0 -1
- package/dist/engine/runner.d.ts +0 -13
- package/dist/engine/runner.js +0 -157
- package/dist/engine/runner.js.map +0 -1
- package/dist/engine/types.d.ts +0 -194
- package/dist/engine/types.js +0 -2
- package/dist/engine/types.js.map +0 -1
- package/dist/engine/workflow.d.ts +0 -18
- package/dist/engine/workflow.js +0 -196
- package/dist/engine/workflow.js.map +0 -1
- package/dist/system/process.d.ts +0 -21
- package/dist/system/process.js +0 -238
- package/dist/system/process.js.map +0 -1
- package/dist/system/runtimes/adapter.d.ts +0 -90
- package/dist/system/runtimes/adapter.js +0 -20
- package/dist/system/runtimes/adapter.js.map +0 -1
- package/dist/system/runtimes/agent-runtime.d.ts +0 -45
- package/dist/system/runtimes/agent-runtime.js +0 -184
- package/dist/system/runtimes/agent-runtime.js.map +0 -1
- package/dist/system/runtimes/claude-code.d.ts +0 -10
- package/dist/system/runtimes/claude-code.js +0 -383
- package/dist/system/runtimes/claude-code.js.map +0 -1
- package/dist/system/runtimes/inspect.d.ts +0 -25
- package/dist/system/runtimes/inspect.js +0 -129
- package/dist/system/runtimes/inspect.js.map +0 -1
- package/dist/system/runtimes/pi.d.ts +0 -7
- package/dist/system/runtimes/pi.js +0 -235
- package/dist/system/runtimes/pi.js.map +0 -1
- package/dist/system/runtimes/protocol.d.ts +0 -9
- package/dist/system/runtimes/protocol.js +0 -38
- package/dist/system/runtimes/protocol.js.map +0 -1
- package/dist/system/runtimes/registry.d.ts +0 -5
- package/dist/system/runtimes/registry.js +0 -5
- package/dist/system/runtimes/registry.js.map +0 -1
- package/dist/system/store.d.ts +0 -20
- package/dist/system/store.js +0 -126
- package/dist/system/store.js.map +0 -1
- package/dist/ui/server.d.ts +0 -8
- package/dist/ui/server.js +0 -111
- package/dist/ui/server.js.map +0 -1
- package/dist/ui/static/dashboard.js +0 -266
- package/dist/ui/static/follow.js +0 -67
- package/dist/ui/static/index.html +0 -20
- package/dist/ui/static/style.css +0 -166
- 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 +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"}
|
package/dist/system/store.d.ts
DELETED
|
@@ -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
|
-
}
|
package/dist/system/store.js
DELETED
|
@@ -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
|