pi-worker-graph 0.1.0-dev.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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +455 -0
  3. package/SECURITY.md +54 -0
  4. package/dist/config.d.ts +25 -0
  5. package/dist/config.d.ts.map +1 -0
  6. package/dist/config.js +181 -0
  7. package/dist/config.js.map +1 -0
  8. package/dist/context.d.ts +22 -0
  9. package/dist/context.d.ts.map +1 -0
  10. package/dist/context.js +81 -0
  11. package/dist/context.js.map +1 -0
  12. package/dist/coordination.d.ts +19 -0
  13. package/dist/coordination.d.ts.map +1 -0
  14. package/dist/coordination.js +267 -0
  15. package/dist/coordination.js.map +1 -0
  16. package/dist/execution-failure.d.ts +42 -0
  17. package/dist/execution-failure.d.ts.map +1 -0
  18. package/dist/execution-failure.js +90 -0
  19. package/dist/execution-failure.js.map +1 -0
  20. package/dist/extension.d.ts +8 -0
  21. package/dist/extension.d.ts.map +1 -0
  22. package/dist/extension.js +641 -0
  23. package/dist/extension.js.map +1 -0
  24. package/dist/graph.d.ts +44 -0
  25. package/dist/graph.d.ts.map +1 -0
  26. package/dist/graph.js +292 -0
  27. package/dist/graph.js.map +1 -0
  28. package/dist/index.d.ts +16 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +8 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/json.d.ts +9 -0
  33. package/dist/json.d.ts.map +1 -0
  34. package/dist/json.js +66 -0
  35. package/dist/json.js.map +1 -0
  36. package/dist/orchestrator.d.ts +15 -0
  37. package/dist/orchestrator.d.ts.map +1 -0
  38. package/dist/orchestrator.js +473 -0
  39. package/dist/orchestrator.js.map +1 -0
  40. package/dist/output.d.ts +61 -0
  41. package/dist/output.d.ts.map +1 -0
  42. package/dist/output.js +248 -0
  43. package/dist/output.js.map +1 -0
  44. package/dist/pi-subprocess.d.ts +92 -0
  45. package/dist/pi-subprocess.d.ts.map +1 -0
  46. package/dist/pi-subprocess.js +897 -0
  47. package/dist/pi-subprocess.js.map +1 -0
  48. package/dist/run.d.ts +89 -0
  49. package/dist/run.d.ts.map +1 -0
  50. package/dist/run.js +562 -0
  51. package/dist/run.js.map +1 -0
  52. package/dist/store.d.ts +331 -0
  53. package/dist/store.d.ts.map +1 -0
  54. package/dist/store.js +1993 -0
  55. package/dist/store.js.map +1 -0
  56. package/dist/usage.d.ts +35 -0
  57. package/dist/usage.d.ts.map +1 -0
  58. package/dist/usage.js +88 -0
  59. package/dist/usage.js.map +1 -0
  60. package/docs/DECISIONS.md +221 -0
  61. package/docs/DESIGN.md +392 -0
  62. package/docs/NEXT.md +229 -0
  63. package/docs/PLAN.md +203 -0
  64. package/docs/worker-graph.example.json +12 -0
  65. package/extensions/index.ts +1 -0
  66. package/extensions/tsconfig.json +11 -0
  67. package/package.json +66 -0
package/dist/output.js ADDED
@@ -0,0 +1,248 @@
1
+ export const NODE_OUTPUT_SCHEMA_VERSION = 1;
2
+ export const NODE_OUTPUT_LIMITS = Object.freeze({
3
+ maxBytes: 96 * 1024,
4
+ maxItemsPerSection: 128,
5
+ maxTextBytes: 16 * 1024,
6
+ maxPathBytes: 4 * 1024,
7
+ maxDiagnosticsBytes: 16 * 1024,
8
+ /**
9
+ * Supplemental long-form text a worker may retain beside its report. It is
10
+ * not part of the report envelope and is not counted against `maxBytes`:
11
+ * the runtime never parses it and never places it on a dependency edge.
12
+ */
13
+ maxArtifactBytes: 128 * 1024,
14
+ });
15
+ export class NodeOutputValidationError extends Error {
16
+ code;
17
+ path;
18
+ constructor(code, path, message) {
19
+ super(`Invalid node output at ${path}: ${message}`);
20
+ this.name = "NodeOutputValidationError";
21
+ this.code = code;
22
+ this.path = path;
23
+ }
24
+ }
25
+ const OUTPUT_FIELDS = new Set([
26
+ "schemaVersion",
27
+ "summary",
28
+ "changedFiles",
29
+ "interfaces",
30
+ "decisions",
31
+ "validation",
32
+ "blockers",
33
+ ]);
34
+ const CHANGED_FILE_FIELDS = new Set(["path", "description"]);
35
+ const VALIDATION_FIELDS = new Set(["command", "result"]);
36
+ const SIMPLE_FIELD = /^[A-Za-z_][A-Za-z0-9_]*$/;
37
+ const WINDOWS_DRIVE_PATH = /^[A-Za-z]:/;
38
+ function fail(code, path, message) {
39
+ throw new NodeOutputValidationError(code, path, message);
40
+ }
41
+ function fieldPath(path, field) {
42
+ return field.length <= 64 && SIMPLE_FIELD.test(field)
43
+ ? `${path}.${field}`
44
+ : path;
45
+ }
46
+ function dataFields(value, path, maxFields) {
47
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
48
+ return fail("invalid_field", path, "expected an object");
49
+ }
50
+ const prototype = Object.getPrototypeOf(value);
51
+ if (prototype !== Object.prototype && prototype !== null) {
52
+ return fail("invalid_value", path, "expected a plain object");
53
+ }
54
+ const keys = Reflect.ownKeys(value);
55
+ if (keys.length > maxFields) {
56
+ fail("unknown_field", path, "object contains too many fields");
57
+ }
58
+ const fields = new Map();
59
+ for (const key of keys) {
60
+ if (typeof key !== "string") {
61
+ fail("invalid_value", path, "symbol fields are not allowed");
62
+ }
63
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
64
+ if (descriptor === undefined ||
65
+ !descriptor.enumerable ||
66
+ !("value" in descriptor)) {
67
+ fail("invalid_value", fieldPath(path, key), "expected a data field");
68
+ }
69
+ fields.set(key, descriptor.value);
70
+ }
71
+ return fields;
72
+ }
73
+ function exactFields(value, expected, path) {
74
+ const fields = dataFields(value, path, expected.size + 1);
75
+ for (const field of expected) {
76
+ if (!fields.has(field)) {
77
+ fail("missing_field", `${path}.${field}`, "field is required");
78
+ }
79
+ }
80
+ for (const field of [...fields.keys()].sort()) {
81
+ if (!expected.has(field)) {
82
+ fail("unknown_field", fieldPath(path, field), "field is not allowed");
83
+ }
84
+ }
85
+ return fields;
86
+ }
87
+ function arrayItems(value, path) {
88
+ if (!Array.isArray(value)) {
89
+ return fail("invalid_field", path, "expected an array");
90
+ }
91
+ if (Object.getPrototypeOf(value) !== Array.prototype) {
92
+ return fail("invalid_value", path, "expected a plain array");
93
+ }
94
+ const lengthDescriptor = Object.getOwnPropertyDescriptor(value, "length");
95
+ if (lengthDescriptor === undefined ||
96
+ !("value" in lengthDescriptor) ||
97
+ !Number.isInteger(lengthDescriptor.value) ||
98
+ lengthDescriptor.value < 0) {
99
+ return fail("invalid_value", path, "array has an invalid length");
100
+ }
101
+ const length = lengthDescriptor.value;
102
+ if (length > NODE_OUTPUT_LIMITS.maxItemsPerSection) {
103
+ fail("item_limit", path, `section exceeds ${NODE_OUTPUT_LIMITS.maxItemsPerSection} items`);
104
+ }
105
+ const keys = Reflect.ownKeys(value);
106
+ if (keys.length !== length + 1 || !keys.includes("length")) {
107
+ fail("invalid_value", path, "expected a dense array without extra fields");
108
+ }
109
+ const items = [];
110
+ for (let index = 0; index < length; index += 1) {
111
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
112
+ if (descriptor === undefined ||
113
+ !descriptor.enumerable ||
114
+ !("value" in descriptor)) {
115
+ fail("invalid_value", `${path}[${index}]`, "expected a data item");
116
+ }
117
+ items.push(descriptor.value);
118
+ }
119
+ return items;
120
+ }
121
+ function text(value, path, maxBytes, budget) {
122
+ if (typeof value !== "string" || value.trim().length === 0) {
123
+ return fail("invalid_field", path, "expected a non-empty string");
124
+ }
125
+ if (Buffer.byteLength(value) > maxBytes) {
126
+ fail("text_limit", path, `text exceeds ${maxBytes} bytes`);
127
+ }
128
+ budget.serializedTextBytes += Buffer.byteLength(JSON.stringify(value));
129
+ if (budget.serializedTextBytes > NODE_OUTPUT_LIMITS.maxBytes) {
130
+ fail("output_limit", "$", `serialized report exceeds ${NODE_OUTPUT_LIMITS.maxBytes} bytes`);
131
+ }
132
+ return value;
133
+ }
134
+ function reportPath(value, path, budget) {
135
+ const parsed = text(value, path, NODE_OUTPUT_LIMITS.maxPathBytes, budget);
136
+ const segments = parsed.split("/");
137
+ if (parsed.startsWith("/") ||
138
+ parsed.includes("\\") ||
139
+ WINDOWS_DRIVE_PATH.test(parsed) ||
140
+ [...parsed].some((character) => {
141
+ const code = character.codePointAt(0);
142
+ return code !== undefined && (code <= 0x1f || code === 0x7f);
143
+ }) ||
144
+ segments.some((segment) => segment.length === 0 || segment === "." || segment === "..")) {
145
+ fail("invalid_field", path, "expected a normalized repository-relative path");
146
+ }
147
+ return parsed;
148
+ }
149
+ function textSection(value, path, budget) {
150
+ return Object.freeze(arrayItems(value, path).map((item, index) => text(item, `${path}[${index}]`, NODE_OUTPUT_LIMITS.maxTextBytes, budget)));
151
+ }
152
+ function parseReport(value) {
153
+ const budget = { serializedTextBytes: 0 };
154
+ const candidate = exactFields(value, OUTPUT_FIELDS, "$");
155
+ if (candidate.get("schemaVersion") !== NODE_OUTPUT_SCHEMA_VERSION) {
156
+ fail("invalid_schema_version", "$.schemaVersion", `expected schema version ${NODE_OUTPUT_SCHEMA_VERSION}`);
157
+ }
158
+ const changedFiles = Object.freeze(arrayItems(candidate.get("changedFiles"), "$.changedFiles").map((item, index) => {
159
+ const path = `$.changedFiles[${index}]`;
160
+ const changedFile = exactFields(item, CHANGED_FILE_FIELDS, path);
161
+ return Object.freeze({
162
+ path: reportPath(changedFile.get("path"), `${path}.path`, budget),
163
+ description: text(changedFile.get("description"), `${path}.description`, NODE_OUTPUT_LIMITS.maxTextBytes, budget),
164
+ });
165
+ }));
166
+ const validation = Object.freeze(arrayItems(candidate.get("validation"), "$.validation").map((item, index) => {
167
+ const path = `$.validation[${index}]`;
168
+ const result = exactFields(item, VALIDATION_FIELDS, path);
169
+ return Object.freeze({
170
+ command: text(result.get("command"), `${path}.command`, NODE_OUTPUT_LIMITS.maxTextBytes, budget),
171
+ result: text(result.get("result"), `${path}.result`, NODE_OUTPUT_LIMITS.maxTextBytes, budget),
172
+ });
173
+ }));
174
+ const output = Object.freeze({
175
+ schemaVersion: NODE_OUTPUT_SCHEMA_VERSION,
176
+ summary: text(candidate.get("summary"), "$.summary", NODE_OUTPUT_LIMITS.maxTextBytes, budget),
177
+ changedFiles,
178
+ interfaces: textSection(candidate.get("interfaces"), "$.interfaces", budget),
179
+ decisions: textSection(candidate.get("decisions"), "$.decisions", budget),
180
+ validation,
181
+ blockers: textSection(candidate.get("blockers"), "$.blockers", budget),
182
+ });
183
+ if (Buffer.byteLength(JSON.stringify(output)) > NODE_OUTPUT_LIMITS.maxBytes) {
184
+ fail("output_limit", "$", `serialized report exceeds ${NODE_OUTPUT_LIMITS.maxBytes} bytes`);
185
+ }
186
+ return output;
187
+ }
188
+ /** Validates an untrusted worker report and returns an immutable snapshot. */
189
+ export function parseNodeOutput(value) {
190
+ try {
191
+ return parseReport(value);
192
+ }
193
+ catch (error) {
194
+ if (error instanceof NodeOutputValidationError)
195
+ throw error;
196
+ return fail("invalid_value", "$", "value cannot be inspected safely");
197
+ }
198
+ }
199
+ /**
200
+ * Splits a submitted worker report into the report envelope and the optional
201
+ * artifact submitted beside it.
202
+ *
203
+ * The split reads the value through the same field discipline
204
+ * `parseNodeOutput` applies, before reading anything: an exotic prototype, a
205
+ * symbol key, and an accessor property are rejected here rather than invoked.
206
+ * Separating the artifact must never become a way past that check, which a
207
+ * rest-destructuring of the submitted value would be.
208
+ */
209
+ export function splitReportArtifact(value) {
210
+ const fields = dataFields(value, "$", OUTPUT_FIELDS.size + 2);
211
+ const report = {};
212
+ for (const [field, item] of fields) {
213
+ if (field !== "artifact")
214
+ report[field] = item;
215
+ }
216
+ return { report, artifact: fields.get("artifact") };
217
+ }
218
+ /**
219
+ * Internal shared validation for a retained text artifact, at every boundary
220
+ * it crosses: the worker report tool, the adapter that reads a child's tool
221
+ * result, the graph runner, and the store that publishes it.
222
+ */
223
+ export function parseNodeArtifact(value) {
224
+ if (value === undefined)
225
+ return undefined;
226
+ if (typeof value !== "string" || value.trim().length === 0) {
227
+ return fail("invalid_field", "$.artifact", "expected non-blank text");
228
+ }
229
+ if (Buffer.byteLength(value) > NODE_OUTPUT_LIMITS.maxArtifactBytes) {
230
+ fail("text_limit", "$.artifact", `artifact exceeds ${NODE_OUTPUT_LIMITS.maxArtifactBytes} bytes`);
231
+ }
232
+ return value;
233
+ }
234
+ /** Internal shared validation for persisted and executor diagnostics. */
235
+ export function parseNodeDiagnostics(value) {
236
+ if (value === undefined)
237
+ return undefined;
238
+ if (typeof value !== "string") {
239
+ return fail("invalid_field", "$.diagnostics", "expected a string");
240
+ }
241
+ if (Buffer.byteLength(value) > NODE_OUTPUT_LIMITS.maxDiagnosticsBytes ||
242
+ Buffer.byteLength(JSON.stringify(value)) >
243
+ NODE_OUTPUT_LIMITS.maxDiagnosticsBytes) {
244
+ fail("text_limit", "$.diagnostics", `diagnostics exceed ${NODE_OUTPUT_LIMITS.maxDiagnosticsBytes} bytes`);
245
+ }
246
+ return value;
247
+ }
248
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import type { ChildProcessWithoutNullStreams } from "node:child_process";
2
+ import { spawn } from "node:child_process";
3
+ import type { TaskExecutionInput, TaskExecutionResult, TaskExecutor } from "./run.js";
4
+ import type { TaskUsage } from "./usage.js";
5
+ declare const REPORT_TOOL_NAME = "worker_graph_report";
6
+ /**
7
+ * Registered by the child extension only when the worker receives run-scoped
8
+ * coordination, so they are allowlisted on exactly the same condition: Pi's
9
+ * `--tools` is a strict allowlist over built-in, extension, and custom tools.
10
+ */
11
+ declare const COORDINATION_TOOL_NAMES: readonly ["worker_graph_event", "worker_graph_events", "worker_graph_message", "worker_graph_inbox"];
12
+ export type PiThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
13
+ /**
14
+ * Pi's own session thinking levels, which have no `off`. A worker is a fresh
15
+ * one-shot subprocess, so `off` is expressible there; the parent's level is set
16
+ * on a live session through an API that cannot express it.
17
+ */
18
+ export type PiSessionThinkingLevel = Exclude<PiThinkingLevel, "off">;
19
+ export type PiWorkerTool = "read" | "bash" | "powershell" | "edit" | "write" | "grep" | "find" | "ls";
20
+ export type PiWorkerCoordinationTool = (typeof COORDINATION_TOOL_NAMES)[number];
21
+ type ProgressTool = PiWorkerTool | PiWorkerCoordinationTool | typeof REPORT_TOOL_NAME;
22
+ export interface PiWorkerProfile {
23
+ readonly provider: string;
24
+ readonly model: string;
25
+ readonly thinkingLevel: PiThinkingLevel;
26
+ readonly tools: readonly PiWorkerTool[];
27
+ }
28
+ /**
29
+ * The adapter reports the runtime's own usage shape; the alias keeps the
30
+ * transport-facing name without a second definition of it.
31
+ */
32
+ export type PiWorkerUsage = TaskUsage;
33
+ export type PiWorkerProgressPhase = "started" | "turn_completed" | "tool_started" | "tool_completed" | "finished";
34
+ export interface PiWorkerProgress {
35
+ readonly taskId: string;
36
+ readonly phase: PiWorkerProgressPhase;
37
+ readonly tool?: ProgressTool;
38
+ readonly status?: "succeeded" | "failed" | "aborted";
39
+ readonly usage: PiWorkerUsage;
40
+ }
41
+ export interface PiSubprocessExecutorOptions {
42
+ readonly profiles: Readonly<Record<string, PiWorkerProfile>>;
43
+ readonly command?: string;
44
+ readonly extensionPath?: string;
45
+ readonly onProgress?: (progress: PiWorkerProgress) => void;
46
+ }
47
+ export interface PiWorkerTaskPayload {
48
+ readonly assignment: string;
49
+ readonly profile: string;
50
+ readonly acceptanceCriteria?: readonly string[];
51
+ readonly expectedPaths?: readonly string[];
52
+ }
53
+ interface ProcessDependencies {
54
+ readonly spawnProcess?: typeof spawn;
55
+ readonly terminateProcessTree?: (child: ChildProcessWithoutNullStreams, force: boolean) => void;
56
+ readonly terminationGraceMs?: number;
57
+ }
58
+ /** Internal strict profile parser shared with the Pi configuration layer. */
59
+ export declare function parsePiWorkerProfiles(value: unknown): Readonly<Record<string, PiWorkerProfile>>;
60
+ /**
61
+ * The parent session's provider, model, and thinking level.
62
+ *
63
+ * This selects nothing to spawn. It names what the orchestrator session itself
64
+ * should run as while the mode is active, so it carries no tool allowlist: the
65
+ * parent's tools are governed by its own snapshot and the tools the mode
66
+ * suppresses.
67
+ */
68
+ export interface PiOrchestratorProfile {
69
+ readonly provider: string;
70
+ readonly model: string;
71
+ readonly thinkingLevel: PiSessionThinkingLevel;
72
+ }
73
+ /** Internal strict parent parser shared with the Pi configuration layer. */
74
+ export declare function parsePiOrchestratorProfile(value: unknown): PiOrchestratorProfile;
75
+ /**
76
+ * Internal fakeable subprocess boundary used by adapter tests.
77
+ *
78
+ * Rejects rather than throwing for every invalid input, so one `catch` covers
79
+ * both validation and execution.
80
+ */
81
+ export declare function runPiWorkerProcess(input: TaskExecutionInput, options: PiSubprocessExecutorOptions, dependencies?: ProcessDependencies): Promise<TaskExecutionResult>;
82
+ /**
83
+ * Builds a `TaskExecutor` that runs each task in its own Pi subprocess.
84
+ *
85
+ * Profile configuration is validated eagerly and throws, because it is a
86
+ * construction error in the caller's own configuration. Everything the executor
87
+ * itself rejects — an invalid assignment, an unknown profile, a failed worker —
88
+ * is reported by rejecting the returned promise.
89
+ */
90
+ export declare function createPiSubprocessExecutor(options: PiSubprocessExecutorOptions): TaskExecutor;
91
+ export {};
92
+ //# sourceMappingURL=pi-subprocess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-subprocess.d.ts","sourceRoot":"","sources":["../src/pi-subprocess.ts"],"names":[],"mappings":"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"}