@osolmaz/pi-workflows 0.13.4 → 0.15.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.
- package/README.md +146 -160
- package/dist/builtins/autoimplement.workflow.js +3 -1
- package/dist/builtins/autoimplement.workflow.js.map +1 -1
- package/dist/builtins/change-verification.workflow.js +7 -2
- package/dist/builtins/change-verification.workflow.js.map +1 -1
- package/dist/builtins/metadata.d.ts +22 -0
- package/dist/builtins/metadata.js +10 -0
- package/dist/builtins/metadata.js.map +1 -0
- package/dist/builtins/monitor.workflow.js +4 -1
- package/dist/builtins/monitor.workflow.js.map +1 -1
- package/dist/builtins/sanity-check.workflow.js +4 -1
- package/dist/builtins/sanity-check.workflow.js.map +1 -1
- package/dist/builtins/workspace-preparation.workflow.js +3 -1
- package/dist/builtins/workspace-preparation.workflow.js.map +1 -1
- package/dist/controllers/index.d.ts +1 -2
- package/dist/controllers/index.js +0 -1
- package/dist/controllers/index.js.map +1 -1
- package/dist/controllers/sqlite.d.ts +85 -31
- package/dist/controllers/sqlite.js +541 -126
- package/dist/controllers/sqlite.js.map +1 -1
- package/dist/controllers/store.d.ts +1 -0
- package/dist/extension/controller-command.d.ts +22 -0
- package/dist/extension/controller-command.js +32 -0
- package/dist/extension/controller-command.js.map +1 -0
- package/dist/extension/index.d.ts +2 -9
- package/dist/extension/index.js +876 -2928
- package/dist/extension/index.js.map +1 -1
- package/dist/extension/message-card.d.ts +13 -0
- package/dist/extension/message-card.js +46 -0
- package/dist/extension/message-card.js.map +1 -0
- package/dist/extension/step-message.d.ts +5 -6
- package/dist/extension/step-message.js +41 -52
- package/dist/extension/step-message.js.map +1 -1
- package/dist/host/child-worker-supervisor.d.ts +50 -0
- package/dist/host/child-worker-supervisor.js +159 -0
- package/dist/host/child-worker-supervisor.js.map +1 -0
- package/dist/host/client.d.ts +48 -0
- package/dist/host/client.js +216 -0
- package/dist/host/client.js.map +1 -0
- package/dist/host/controller-worker-entry.d.ts +2 -0
- package/dist/host/controller-worker-entry.js +244 -0
- package/dist/host/controller-worker-entry.js.map +1 -0
- package/dist/host/controller-worker-protocol.d.ts +36 -0
- package/dist/host/controller-worker-protocol.js +49 -0
- package/dist/host/controller-worker-protocol.js.map +1 -0
- package/dist/host/controller-worker-supervisor.d.ts +21 -0
- package/dist/host/controller-worker-supervisor.js +54 -0
- package/dist/host/controller-worker-supervisor.js.map +1 -0
- package/dist/host/host-entry.d.ts +2 -0
- package/dist/host/host-entry.js +23 -0
- package/dist/host/host-entry.js.map +1 -0
- package/dist/host/processes.d.ts +17 -12
- package/dist/host/processes.js +154 -50
- package/dist/host/processes.js.map +1 -1
- package/dist/host/protocol.d.ts +38 -0
- package/dist/host/protocol.js +156 -0
- package/dist/host/protocol.js.map +1 -0
- package/dist/host/resolver-entry.d.ts +49 -0
- package/dist/host/resolver-entry.js +149 -0
- package/dist/host/resolver-entry.js.map +1 -0
- package/dist/host/rpc-executor.d.ts +14 -3
- package/dist/host/rpc-executor.js +63 -30
- package/dist/host/rpc-executor.js.map +1 -1
- package/dist/host/runner.d.ts +95 -29
- package/dist/host/runner.js +2311 -348
- package/dist/host/runner.js.map +1 -1
- package/dist/host/state.d.ts +174 -0
- package/dist/host/state.js +689 -0
- package/dist/host/state.js.map +1 -0
- package/dist/host/worker-entry.d.ts +10 -0
- package/dist/host/worker-entry.js +446 -0
- package/dist/host/worker-entry.js.map +1 -0
- package/dist/host/worker-protocol.d.ts +31 -0
- package/dist/host/worker-protocol.js +122 -0
- package/dist/host/worker-protocol.js.map +1 -0
- package/dist/host/worker-store.d.ts +80 -0
- package/dist/host/worker-store.js +91 -0
- package/dist/host/worker-store.js.map +1 -0
- package/dist/host/worker-supervisor.d.ts +22 -0
- package/dist/host/worker-supervisor.js +54 -0
- package/dist/host/worker-supervisor.js.map +1 -0
- package/dist/render/canvas.d.ts +2 -1
- package/dist/render/canvas.js +40 -15
- package/dist/render/canvas.js.map +1 -1
- package/dist/render/graph-render.d.ts +7 -3
- package/dist/render/graph-render.js +125 -74
- package/dist/render/graph-render.js.map +1 -1
- package/dist/state/database.js +3 -1
- package/dist/state/database.js.map +1 -1
- package/dist/state/index.d.ts +1 -0
- package/dist/state/index.js +1 -0
- package/dist/state/index.js.map +1 -1
- package/dist/state/prune.js +36 -10
- package/dist/state/prune.js.map +1 -1
- package/dist/state/schema.d.ts +1 -1
- package/dist/state/schema.js +171 -3
- package/dist/state/schema.js.map +1 -1
- package/dist/state/viewer.d.ts +46 -0
- package/dist/state/viewer.js +249 -0
- package/dist/state/viewer.js.map +1 -0
- package/dist/viewer/cli.d.ts +1 -1
- package/dist/viewer/cli.js +47 -18
- package/dist/viewer/cli.js.map +1 -1
- package/dist/workflows/composition.js +25 -2
- package/dist/workflows/composition.js.map +1 -1
- package/dist/workflows/definition.d.ts +3 -1
- package/dist/workflows/definition.js +25 -0
- package/dist/workflows/definition.js.map +1 -1
- package/dist/workflows/engine.d.ts +1 -0
- package/dist/workflows/engine.js +157 -42
- package/dist/workflows/engine.js.map +1 -1
- package/dist/workflows/errors.d.ts +3 -1
- package/dist/workflows/errors.js +4 -7
- package/dist/workflows/errors.js.map +1 -1
- package/dist/workflows/human-decision.d.ts +3 -0
- package/dist/workflows/human-decision.js +31 -0
- package/dist/workflows/human-decision.js.map +1 -1
- package/dist/workflows/index.d.ts +1 -1
- package/dist/workflows/index.js +1 -1
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/schema.js +17 -6
- package/dist/workflows/schema.js.map +1 -1
- package/dist/{viewer → workflows}/session-reducer.d.ts +3 -1
- package/dist/{viewer → workflows}/session-reducer.js +4 -0
- package/dist/workflows/session-reducer.js.map +1 -0
- package/dist/workflows/store.d.ts +87 -1
- package/dist/workflows/store.js +892 -93
- package/dist/workflows/store.js.map +1 -1
- package/dist/workflows/tool-input.d.ts +0 -22
- package/dist/workflows/tool-input.js +1 -44
- package/dist/workflows/tool-input.js.map +1 -1
- package/dist/workflows/types.d.ts +36 -4
- package/docs/2026-08-25-workflow-follow-ups.md +8 -6
- package/docs/2026-08-30-out-of-process-workflow-host-plan.md +353 -0
- package/docs/CONTROLLERS.md +11 -11
- package/docs/DEFERRED_TURNS.md +61 -27
- package/docs/HUMAN_DECISIONS.md +12 -4
- package/docs/SQLITE_STATE.md +42 -8
- package/docs/WORKFLOW_HOST.md +452 -0
- package/docs/development.md +46 -30
- package/docs/live-replay-protocol.md +129 -100
- package/docs/plans/2026-08-19-human-decision-gates-plan.md +34 -8
- package/docs/plans/2026-08-27-workflow-terminal-restart-plan.md +399 -0
- package/docs/plans/2026-08-28-piw-incremental-viewer-plan.md +293 -0
- package/docs/plans/piw-viewer-experience-implementation-plan.md +11 -1
- package/docs/plans/tui-viewer-implementation-plan.md +5 -0
- package/docs/tui-viewer.md +18 -3
- package/docs/workflows.md +164 -156
- package/examples/workflows/command-batch.workflow.ts +2 -0
- package/examples/workflows/shell.workflow.ts +2 -1
- package/herdr-plugin.toml +1 -1
- package/package.json +1 -1
- package/skills/autodoc/SKILL.md +1 -1
- package/skills/autoimplement/SKILL.md +1 -1
- package/skills/autoplan/SKILL.md +1 -1
- package/skills/pi-workflows/SKILL.md +2 -0
- package/src/builtins/autoimplement.workflow.ts +3 -0
- package/src/builtins/change-verification.workflow.ts +7 -2
- package/src/builtins/metadata.ts +9 -0
- package/src/builtins/monitor.workflow.ts +4 -0
- package/src/builtins/sanity-check.workflow.ts +4 -0
- package/src/builtins/workspace-preparation.workflow.ts +3 -1
- package/src/controllers/index.ts +3 -5
- package/src/controllers/sqlite.ts +929 -225
- package/src/controllers/store.ts +1 -0
- package/src/extension/controller-command.ts +45 -0
- package/src/extension/index.ts +948 -3506
- package/src/extension/message-card.ts +61 -0
- package/src/extension/step-message.ts +58 -63
- package/src/host/child-worker-supervisor.ts +183 -0
- package/src/host/client.ts +293 -0
- package/src/host/controller-worker-entry.ts +311 -0
- package/src/host/controller-worker-protocol.ts +104 -0
- package/src/host/controller-worker-supervisor.ts +79 -0
- package/src/host/host-entry.ts +23 -0
- package/src/host/processes.ts +171 -54
- package/src/host/protocol.ts +196 -0
- package/src/host/resolver-entry.ts +241 -0
- package/src/host/rpc-executor.ts +76 -34
- package/src/host/runner.ts +2813 -422
- package/src/host/state.ts +1160 -0
- package/src/host/worker-entry.ts +533 -0
- package/src/host/worker-protocol.ts +165 -0
- package/src/host/worker-store.ts +229 -0
- package/src/host/worker-supervisor.ts +74 -0
- package/src/render/canvas.ts +44 -10
- package/src/render/graph-render.ts +145 -90
- package/src/state/database.ts +2 -1
- package/src/state/index.ts +14 -0
- package/src/state/prune.ts +35 -9
- package/src/state/schema.ts +171 -3
- package/src/state/viewer.ts +356 -0
- package/src/viewer/cli.ts +49 -17
- package/src/workflows/composition.ts +36 -2
- package/src/workflows/definition.ts +32 -0
- package/src/workflows/engine.ts +157 -54
- package/src/workflows/errors.ts +11 -2
- package/src/workflows/human-decision.ts +49 -0
- package/src/workflows/index.ts +2 -0
- package/src/workflows/schema.ts +19 -6
- package/src/{viewer → workflows}/session-reducer.ts +11 -1
- package/src/workflows/store.ts +1316 -108
- package/src/workflows/tool-input.ts +2 -60
- package/src/workflows/types.ts +32 -4
- package/dist/controllers/workflow-engine-scheduler.d.ts +0 -29
- package/dist/controllers/workflow-engine-scheduler.js +0 -175
- package/dist/controllers/workflow-engine-scheduler.js.map +0 -1
- package/dist/extension/controller-host.d.ts +0 -48
- package/dist/extension/controller-host.js +0 -110
- package/dist/extension/controller-host.js.map +0 -1
- package/dist/extension/deferred-turn-coordinator.d.ts +0 -32
- package/dist/extension/deferred-turn-coordinator.js +0 -143
- package/dist/extension/deferred-turn-coordinator.js.map +0 -1
- package/dist/extension/deferred-turn.d.ts +0 -44
- package/dist/extension/deferred-turn.js +0 -110
- package/dist/extension/deferred-turn.js.map +0 -1
- package/dist/extension/executor.d.ts +0 -86
- package/dist/extension/executor.js +0 -311
- package/dist/extension/executor.js.map +0 -1
- package/dist/extension/follow-up-coordinator.d.ts +0 -27
- package/dist/extension/follow-up-coordinator.js +0 -131
- package/dist/extension/follow-up-coordinator.js.map +0 -1
- package/dist/extension/recorder.d.ts +0 -84
- package/dist/extension/recorder.js +0 -528
- package/dist/extension/recorder.js.map +0 -1
- package/dist/extension/session-events.d.ts +0 -133
- package/dist/extension/session-events.js +0 -61
- package/dist/extension/session-events.js.map +0 -1
- package/dist/viewer/session-reducer.js.map +0 -1
- package/src/controllers/workflow-engine-scheduler.ts +0 -246
- package/src/extension/controller-host.ts +0 -167
- package/src/extension/deferred-turn-coordinator.ts +0 -171
- package/src/extension/deferred-turn.ts +0 -166
- package/src/extension/executor.ts +0 -411
- package/src/extension/follow-up-coordinator.ts +0 -151
- package/src/extension/recorder.ts +0 -655
- package/src/extension/session-events.ts +0 -121
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { once } from "node:events";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { jsonFingerprint } from "../controllers/json.js";
|
|
6
|
+
import { loadControllerFile } from "../controllers/loader.js";
|
|
7
|
+
import { createResultHelpers } from "../controllers/results.js";
|
|
8
|
+
import { parseJson } from "../state/json.js";
|
|
9
|
+
import { errorMessage } from "../workflows/errors.js";
|
|
10
|
+
import { CONTROLLER_WORKER_LAUNCH_SCHEMA, encodeControllerWorkerLine, parseControllerWorkerResponse, } from "./controller-worker-protocol.js";
|
|
11
|
+
const STARTUP_ENV = "PI_WORKFLOWS_CONTROLLER_WORKER_LAUNCH";
|
|
12
|
+
const MAX_FRAME_BYTES = 1024 * 1024;
|
|
13
|
+
class ControllerWorkerTransport {
|
|
14
|
+
launch;
|
|
15
|
+
pending = new Map();
|
|
16
|
+
buffered = Buffer.alloc(0);
|
|
17
|
+
constructor(launch) {
|
|
18
|
+
this.launch = launch;
|
|
19
|
+
process.stdin.on("data", (chunk) => this.onData(chunk));
|
|
20
|
+
process.stdin.on("error", (error) => this.failAll(error));
|
|
21
|
+
process.stdin.resume();
|
|
22
|
+
}
|
|
23
|
+
async request(operation, payload) {
|
|
24
|
+
const message = {
|
|
25
|
+
schema: "pi-workflows.controller-worker-message.v1",
|
|
26
|
+
launchSchema: this.launch.schema,
|
|
27
|
+
messageId: randomUUID(),
|
|
28
|
+
workerEpoch: this.launch.workerEpoch,
|
|
29
|
+
generation: this.launch.generation,
|
|
30
|
+
operation,
|
|
31
|
+
payload,
|
|
32
|
+
};
|
|
33
|
+
const response = await this.send(message);
|
|
34
|
+
if (response.outcome !== "accepted") {
|
|
35
|
+
throw new Error(response.error ?? `Controller worker ${response.outcome}`);
|
|
36
|
+
}
|
|
37
|
+
return response.result;
|
|
38
|
+
}
|
|
39
|
+
close() {
|
|
40
|
+
process.stdin.pause();
|
|
41
|
+
process.stdin.removeAllListeners("data");
|
|
42
|
+
process.stdin.removeAllListeners("error");
|
|
43
|
+
this.failAll(new Error("Controller worker transport closed"));
|
|
44
|
+
}
|
|
45
|
+
async send(message) {
|
|
46
|
+
const response = new Promise((resolve, reject) => {
|
|
47
|
+
this.pending.set(message.messageId, { resolve, reject });
|
|
48
|
+
});
|
|
49
|
+
if (!process.stdout.write(encodeControllerWorkerLine(message))) {
|
|
50
|
+
await once(process.stdout, "drain");
|
|
51
|
+
}
|
|
52
|
+
return await response;
|
|
53
|
+
}
|
|
54
|
+
onData(chunk) {
|
|
55
|
+
this.buffered = Buffer.concat([this.buffered, chunk]);
|
|
56
|
+
if (this.buffered.byteLength > MAX_FRAME_BYTES && !this.buffered.includes(0x0a)) {
|
|
57
|
+
this.failAll(new Error("Controller worker response exceeds 1 MiB"));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
for (;;) {
|
|
61
|
+
const newline = this.buffered.indexOf(0x0a);
|
|
62
|
+
if (newline < 0)
|
|
63
|
+
return;
|
|
64
|
+
const frame = this.buffered.subarray(0, newline);
|
|
65
|
+
this.buffered = this.buffered.subarray(newline + 1);
|
|
66
|
+
if (frame.byteLength === 0)
|
|
67
|
+
continue;
|
|
68
|
+
try {
|
|
69
|
+
const response = parseControllerWorkerResponse(frame);
|
|
70
|
+
const pending = this.pending.get(response.messageId);
|
|
71
|
+
if (pending === undefined)
|
|
72
|
+
throw new Error("Controller worker response is unexpected");
|
|
73
|
+
this.pending.delete(response.messageId);
|
|
74
|
+
pending.resolve(response);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
this.failAll(error instanceof Error ? error : new Error(String(error)));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
failAll(error) {
|
|
82
|
+
for (const pending of this.pending.values())
|
|
83
|
+
pending.reject(error);
|
|
84
|
+
this.pending.clear();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
class HostedControllerEffects {
|
|
88
|
+
transport;
|
|
89
|
+
signal;
|
|
90
|
+
used = false;
|
|
91
|
+
constructor(transport, signal) {
|
|
92
|
+
this.transport = transport;
|
|
93
|
+
this.signal = signal;
|
|
94
|
+
}
|
|
95
|
+
async ensure(definition) {
|
|
96
|
+
if (this.used)
|
|
97
|
+
throw new Error("A reconciliation pass may ensure only one external effect");
|
|
98
|
+
this.used = true;
|
|
99
|
+
const reservation = await this.transport.request("effect.reserve", {
|
|
100
|
+
key: definition.key,
|
|
101
|
+
kind: definition.kind,
|
|
102
|
+
requestFingerprint: jsonFingerprint(definition.request),
|
|
103
|
+
});
|
|
104
|
+
if (["applied", "rejected", "indeterminate"].includes(reservation.record.state)) {
|
|
105
|
+
return reservation.record;
|
|
106
|
+
}
|
|
107
|
+
if (!reservation.created) {
|
|
108
|
+
const observation = await definition.observe(this.signal);
|
|
109
|
+
if (observation.state !== "not_applied") {
|
|
110
|
+
return await this.settleObservation(definition.key, observation);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
let applied;
|
|
114
|
+
try {
|
|
115
|
+
applied = await definition.apply(this.signal);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
applied = { state: "indeterminate", error: boundedError(error) };
|
|
119
|
+
}
|
|
120
|
+
return await this.transport.request("effect.settle", {
|
|
121
|
+
key: definition.key,
|
|
122
|
+
state: applied.state,
|
|
123
|
+
...(applied.state === "applied" && applied.externalRef !== undefined
|
|
124
|
+
? { externalRef: applied.externalRef }
|
|
125
|
+
: {}),
|
|
126
|
+
...(applied.state !== "applied" && applied.error !== undefined
|
|
127
|
+
? { error: applied.error }
|
|
128
|
+
: {}),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
async settleObservation(key, observation) {
|
|
132
|
+
return await this.transport.request("effect.settle", {
|
|
133
|
+
key,
|
|
134
|
+
state: observation.state === "applied" ? "applied" : "indeterminate",
|
|
135
|
+
...(observation.state === "applied" && observation.externalRef !== undefined
|
|
136
|
+
? { externalRef: observation.externalRef }
|
|
137
|
+
: {}),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
class HostedControllerWorkflows {
|
|
142
|
+
transport;
|
|
143
|
+
constructor(transport) {
|
|
144
|
+
this.transport = transport;
|
|
145
|
+
}
|
|
146
|
+
async ensure(request) {
|
|
147
|
+
return await this.transport.request("workflow.ensure", request);
|
|
148
|
+
}
|
|
149
|
+
async changeSettings(request) {
|
|
150
|
+
return await this.transport.request("workflow.changeSettings", request);
|
|
151
|
+
}
|
|
152
|
+
async queueFollowUp(request) {
|
|
153
|
+
return await this.transport.request("workflow.queueFollowUp", request);
|
|
154
|
+
}
|
|
155
|
+
async removeFollowUp(request) {
|
|
156
|
+
return await this.transport.request("workflow.removeFollowUp", request);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
export async function runControllerWorker() {
|
|
160
|
+
const launch = readLaunchEnvelope();
|
|
161
|
+
const transport = new ControllerWorkerTransport(launch);
|
|
162
|
+
try {
|
|
163
|
+
const definition = await loadControllerFile(launch.definitionPath);
|
|
164
|
+
if (definition.name !== launch.controllerName) {
|
|
165
|
+
throw new Error(`Controller source name changed: expected ${launch.controllerName}, got ${definition.name}`);
|
|
166
|
+
}
|
|
167
|
+
await transport.request("worker.ready", {});
|
|
168
|
+
const abort = new AbortController();
|
|
169
|
+
const timeoutMs = definition.timeoutMs ?? launch.timeoutMs;
|
|
170
|
+
const timer = setTimeout(() => abort.abort(new Error(`Reconciliation timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
171
|
+
try {
|
|
172
|
+
const context = {
|
|
173
|
+
signal: abort.signal,
|
|
174
|
+
effects: new HostedControllerEffects(transport, abort.signal),
|
|
175
|
+
workflows: new HostedControllerWorkflows(transport),
|
|
176
|
+
...createResultHelpers(),
|
|
177
|
+
};
|
|
178
|
+
const result = await raceWithAbort(Promise.resolve(definition.reconcile(context, launch.resource)), abort.signal);
|
|
179
|
+
validateResult(result);
|
|
180
|
+
await transport.request("worker.finished", result);
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
await transport.request("worker.failed", { error: boundedError(error) });
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
clearTimeout(timer);
|
|
187
|
+
}
|
|
188
|
+
return 0;
|
|
189
|
+
}
|
|
190
|
+
finally {
|
|
191
|
+
transport.close();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
function readLaunchEnvelope() {
|
|
195
|
+
const encoded = process.env[STARTUP_ENV];
|
|
196
|
+
if (encoded === undefined)
|
|
197
|
+
throw new Error("Controller worker launch envelope is missing");
|
|
198
|
+
const value = parseJson(Buffer.from(encoded, "base64url").toString("utf8"));
|
|
199
|
+
if (typeof value !== "object" ||
|
|
200
|
+
value === null ||
|
|
201
|
+
Array.isArray(value) ||
|
|
202
|
+
value.schema !== CONTROLLER_WORKER_LAUNCH_SCHEMA) {
|
|
203
|
+
throw new Error("Controller worker launch envelope is invalid");
|
|
204
|
+
}
|
|
205
|
+
return value;
|
|
206
|
+
}
|
|
207
|
+
function validateResult(value) {
|
|
208
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
209
|
+
throw new Error("Controller reconcile result must be an object");
|
|
210
|
+
}
|
|
211
|
+
const result = value;
|
|
212
|
+
if (result.kind !== "settled" && result.kind !== "requeue") {
|
|
213
|
+
throw new Error("Controller reconcile result kind is invalid");
|
|
214
|
+
}
|
|
215
|
+
if (result.afterMs !== undefined &&
|
|
216
|
+
(!Number.isSafeInteger(result.afterMs) || result.afterMs < 0)) {
|
|
217
|
+
throw new Error("Controller reconcile afterMs must be a non-negative safe integer");
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function raceWithAbort(operation, signal) {
|
|
221
|
+
return new Promise((resolve, reject) => {
|
|
222
|
+
const onAbort = () => reject(signal.reason ?? new Error("Reconciliation aborted"));
|
|
223
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
224
|
+
operation.then(resolve, reject).finally(() => signal.removeEventListener("abort", onAbort));
|
|
225
|
+
if (signal.aborted)
|
|
226
|
+
onAbort();
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
function boundedError(error) {
|
|
230
|
+
const message = errorMessage(error);
|
|
231
|
+
return message.length <= 8_192 ? message : `${message.slice(0, 8_192)}…`;
|
|
232
|
+
}
|
|
233
|
+
async function main() {
|
|
234
|
+
try {
|
|
235
|
+
process.exitCode = await runControllerWorker();
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
process.stderr.write(`${errorMessage(error)}\n`);
|
|
239
|
+
process.exitCode = 1;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (process.argv[1] === fileURLToPath(import.meta.url))
|
|
243
|
+
void main();
|
|
244
|
+
//# sourceMappingURL=controller-worker-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller-worker-entry.js","sourceRoot":"","sources":["../../src/host/controller-worker-entry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ControllerResource } from "../controllers/types.js";
|
|
2
|
+
import { type JsonValue } from "../state/json.js";
|
|
3
|
+
export declare const CONTROLLER_WORKER_LAUNCH_SCHEMA: "pi-workflows.controller-worker-launch.v1";
|
|
4
|
+
export declare const CONTROLLER_WORKER_MESSAGE_SCHEMA: "pi-workflows.controller-worker-message.v1";
|
|
5
|
+
export declare const CONTROLLER_WORKER_RESPONSE_SCHEMA: "pi-workflows.controller-worker-response.v1";
|
|
6
|
+
export type ControllerWorkerLaunchEnvelope = {
|
|
7
|
+
schema: typeof CONTROLLER_WORKER_LAUNCH_SCHEMA;
|
|
8
|
+
workerEpoch: string;
|
|
9
|
+
hostEpoch: number;
|
|
10
|
+
generation: number;
|
|
11
|
+
projectPath: string;
|
|
12
|
+
definitionPath: string;
|
|
13
|
+
controllerName: string;
|
|
14
|
+
resource: ControllerResource;
|
|
15
|
+
timeoutMs: number;
|
|
16
|
+
};
|
|
17
|
+
export type ControllerWorkerOperation = "worker.ready" | "effect.reserve" | "effect.settle" | "workflow.ensure" | "workflow.changeSettings" | "workflow.queueFollowUp" | "workflow.removeFollowUp" | "worker.finished" | "worker.failed";
|
|
18
|
+
export type ControllerWorkerMessage = {
|
|
19
|
+
schema: typeof CONTROLLER_WORKER_MESSAGE_SCHEMA;
|
|
20
|
+
launchSchema: typeof CONTROLLER_WORKER_LAUNCH_SCHEMA;
|
|
21
|
+
messageId: string;
|
|
22
|
+
workerEpoch: string;
|
|
23
|
+
generation: number;
|
|
24
|
+
operation: ControllerWorkerOperation;
|
|
25
|
+
payload: JsonValue;
|
|
26
|
+
};
|
|
27
|
+
export type ControllerWorkerResponse = {
|
|
28
|
+
schema: typeof CONTROLLER_WORKER_RESPONSE_SCHEMA;
|
|
29
|
+
messageId: string;
|
|
30
|
+
outcome: "accepted" | "rejected" | "claimLost";
|
|
31
|
+
result?: JsonValue;
|
|
32
|
+
error?: string;
|
|
33
|
+
};
|
|
34
|
+
export declare function encodeControllerWorkerLine(value: ControllerWorkerMessage | ControllerWorkerResponse): Buffer;
|
|
35
|
+
export declare function parseControllerWorkerMessage(frame: Buffer): ControllerWorkerMessage;
|
|
36
|
+
export declare function parseControllerWorkerResponse(frame: Buffer): ControllerWorkerResponse;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { canonicalJson, parseJson } from "../state/json.js";
|
|
2
|
+
export const CONTROLLER_WORKER_LAUNCH_SCHEMA = "pi-workflows.controller-worker-launch.v1";
|
|
3
|
+
export const CONTROLLER_WORKER_MESSAGE_SCHEMA = "pi-workflows.controller-worker-message.v1";
|
|
4
|
+
export const CONTROLLER_WORKER_RESPONSE_SCHEMA = "pi-workflows.controller-worker-response.v1";
|
|
5
|
+
export function encodeControllerWorkerLine(value) {
|
|
6
|
+
return Buffer.from(`${canonicalJson(value)}\n`, "utf8");
|
|
7
|
+
}
|
|
8
|
+
export function parseControllerWorkerMessage(frame) {
|
|
9
|
+
const value = parseJson(frame.toString("utf8"));
|
|
10
|
+
if (!isRecord(value) || value.schema !== CONTROLLER_WORKER_MESSAGE_SCHEMA) {
|
|
11
|
+
throw new Error("Invalid controller worker message schema");
|
|
12
|
+
}
|
|
13
|
+
if (value.launchSchema !== CONTROLLER_WORKER_LAUNCH_SCHEMA ||
|
|
14
|
+
typeof value.messageId !== "string" ||
|
|
15
|
+
typeof value.workerEpoch !== "string" ||
|
|
16
|
+
!Number.isSafeInteger(value.generation) ||
|
|
17
|
+
typeof value.operation !== "string" ||
|
|
18
|
+
!OPERATIONS.has(value.operation) ||
|
|
19
|
+
!Object.hasOwn(value, "payload")) {
|
|
20
|
+
throw new Error("Invalid controller worker message");
|
|
21
|
+
}
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
export function parseControllerWorkerResponse(frame) {
|
|
25
|
+
const value = parseJson(frame.toString("utf8"));
|
|
26
|
+
if (!isRecord(value) || value.schema !== CONTROLLER_WORKER_RESPONSE_SCHEMA) {
|
|
27
|
+
throw new Error("Invalid controller worker response schema");
|
|
28
|
+
}
|
|
29
|
+
if (typeof value.messageId !== "string" ||
|
|
30
|
+
!["accepted", "rejected", "claimLost"].includes(String(value.outcome))) {
|
|
31
|
+
throw new Error("Invalid controller worker response");
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
const OPERATIONS = new Set([
|
|
36
|
+
"worker.ready",
|
|
37
|
+
"effect.reserve",
|
|
38
|
+
"effect.settle",
|
|
39
|
+
"workflow.ensure",
|
|
40
|
+
"workflow.changeSettings",
|
|
41
|
+
"workflow.queueFollowUp",
|
|
42
|
+
"workflow.removeFollowUp",
|
|
43
|
+
"worker.finished",
|
|
44
|
+
"worker.failed",
|
|
45
|
+
]);
|
|
46
|
+
function isRecord(value) {
|
|
47
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=controller-worker-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller-worker-protocol.js","sourceRoot":"","sources":["../../src/host/controller-worker-protocol.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAkB,MAAM,kBAAkB,CAAC;AAE5E,MAAM,CAAC,MAAM,+BAA+B,GAAG,0CAAmD,CAAC;AACnG,MAAM,CAAC,MAAM,gCAAgC,GAC3C,2CAAoD,CAAC;AACvD,MAAM,CAAC,MAAM,iCAAiC,GAC5C,4CAAqD,CAAC;AA2CxD,MAAM,UAAU,0BAA0B,CACxC,KAAyD;IAEzD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,KAAa;IACxD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,gCAAgC,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,IACE,KAAK,CAAC,YAAY,KAAK,+BAA+B;QACtD,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;QACrC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;QACvC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAsC,CAAC;QAC7D,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,EAChC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAAa;IACzD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,iCAAiC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,IACE,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EACtE,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,KAAiC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAA4B;IACpD,cAAc;IACd,gBAAgB;IAChB,eAAe;IACf,iBAAiB;IACjB,yBAAyB;IACzB,wBAAwB;IACxB,yBAAyB;IACzB,iBAAiB;IACjB,eAAe;CAChB,CAAC,CAAC;AAEH,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type SupervisedWorkerResult } from "./child-worker-supervisor.js";
|
|
2
|
+
import { type ControllerWorkerLaunchEnvelope, type ControllerWorkerMessage, type ControllerWorkerResponse } from "./controller-worker-protocol.js";
|
|
3
|
+
import { HostProcessRegistry, type ProcessIdentity } from "./processes.js";
|
|
4
|
+
import type { WorkerOutcome } from "./state.js";
|
|
5
|
+
export declare class ControllerWorkerSupervisor {
|
|
6
|
+
readonly envelope: ControllerWorkerLaunchEnvelope;
|
|
7
|
+
private readonly options;
|
|
8
|
+
private readonly supervisor;
|
|
9
|
+
constructor(envelope: ControllerWorkerLaunchEnvelope, options: {
|
|
10
|
+
registry: HostProcessRegistry;
|
|
11
|
+
onMessage: (message: ControllerWorkerMessage) => Promise<ControllerWorkerResponse>;
|
|
12
|
+
env?: Record<string, string>;
|
|
13
|
+
startupTimeoutMs?: number;
|
|
14
|
+
workerEntryPath?: string;
|
|
15
|
+
onSpawn?: (identity: ProcessIdentity) => void;
|
|
16
|
+
onDiagnostic?: (message: string) => void;
|
|
17
|
+
});
|
|
18
|
+
start(): Promise<void>;
|
|
19
|
+
wait(): Promise<SupervisedWorkerResult>;
|
|
20
|
+
stop(outcome?: WorkerOutcome): Promise<void>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { canonicalJson } from "../state/json.js";
|
|
5
|
+
import { ChildWorkerSupervisor } from "./child-worker-supervisor.js";
|
|
6
|
+
import { encodeControllerWorkerLine, parseControllerWorkerMessage, } from "./controller-worker-protocol.js";
|
|
7
|
+
import { HostProcessRegistry } from "./processes.js";
|
|
8
|
+
export class ControllerWorkerSupervisor {
|
|
9
|
+
envelope;
|
|
10
|
+
options;
|
|
11
|
+
supervisor;
|
|
12
|
+
constructor(envelope, options) {
|
|
13
|
+
this.envelope = envelope;
|
|
14
|
+
this.options = options;
|
|
15
|
+
this.supervisor = new ChildWorkerSupervisor({
|
|
16
|
+
label: "Controller worker",
|
|
17
|
+
registry: options.registry,
|
|
18
|
+
onMessage: options.onMessage,
|
|
19
|
+
parseMessage: parseControllerWorkerMessage,
|
|
20
|
+
encodeResponse: encodeControllerWorkerLine,
|
|
21
|
+
isReady: (message) => message.operation === "worker.ready",
|
|
22
|
+
isTerminal: (message) => message.operation === "worker.finished" || message.operation === "worker.failed",
|
|
23
|
+
...(options.startupTimeoutMs === undefined
|
|
24
|
+
? {}
|
|
25
|
+
: { startupTimeoutMs: options.startupTimeoutMs }),
|
|
26
|
+
...(options.onSpawn === undefined ? {} : { onSpawn: options.onSpawn }),
|
|
27
|
+
...(options.onDiagnostic === undefined ? {} : { onDiagnostic: options.onDiagnostic }),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
async start() {
|
|
31
|
+
const builtEntry = fileURLToPath(new URL("./controller-worker-entry.js", import.meta.url));
|
|
32
|
+
const sourceEntry = fileURLToPath(new URL("./controller-worker-entry.ts", import.meta.url));
|
|
33
|
+
const workerEntry = this.options.workerEntryPath ?? builtEntry;
|
|
34
|
+
const args = this.options.workerEntryPath === undefined && !fs.existsSync(builtEntry)
|
|
35
|
+
? ["--import", createRequire(import.meta.url).resolve("tsx"), sourceEntry]
|
|
36
|
+
: [workerEntry];
|
|
37
|
+
await this.supervisor.start({
|
|
38
|
+
args,
|
|
39
|
+
cwd: this.envelope.projectPath,
|
|
40
|
+
env: {
|
|
41
|
+
...process.env,
|
|
42
|
+
...this.options.env,
|
|
43
|
+
PI_WORKFLOWS_CONTROLLER_WORKER_LAUNCH: Buffer.from(canonicalJson(this.envelope)).toString("base64url"),
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async wait() {
|
|
48
|
+
return await this.supervisor.wait();
|
|
49
|
+
}
|
|
50
|
+
async stop(outcome = "cancelled") {
|
|
51
|
+
await this.supervisor.stop(outcome);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=controller-worker-supervisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller-worker-supervisor.js","sourceRoot":"","sources":["../../src/host/controller-worker-supervisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { errorMessage } from "../workflows/errors.js";
|
|
3
|
+
import { WorkflowHost } from "./runner.js";
|
|
4
|
+
async function main() {
|
|
5
|
+
const databaseIndex = process.argv.indexOf("--database");
|
|
6
|
+
const databasePath = databaseIndex < 0 ? undefined : process.argv[databaseIndex + 1];
|
|
7
|
+
const host = new WorkflowHost({
|
|
8
|
+
...(databasePath === undefined ? {} : { databasePath }),
|
|
9
|
+
onLog: (message) => process.stderr.write(`[pi-workflows host] ${message}\n`),
|
|
10
|
+
});
|
|
11
|
+
const shutdown = () => void host.stop();
|
|
12
|
+
process.once("SIGINT", shutdown);
|
|
13
|
+
process.once("SIGTERM", shutdown);
|
|
14
|
+
try {
|
|
15
|
+
await host.start();
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
process.stderr.write(`${errorMessage(error)}\n`);
|
|
19
|
+
process.exitCode = 1;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
void main();
|
|
23
|
+
//# sourceMappingURL=host-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-entry.js","sourceRoot":"","sources":["../../src/host/host-entry.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC;QAC5B,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;QACvD,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,OAAO,IAAI,CAAC;KAC7E,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;IACxC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACjC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,KAAK,IAAI,EAAE,CAAC"}
|
package/dist/host/processes.d.ts
CHANGED
|
@@ -1,24 +1,29 @@
|
|
|
1
|
+
export type ProcessIdentity = {
|
|
2
|
+
pid: number;
|
|
3
|
+
startIdentity: string;
|
|
4
|
+
};
|
|
1
5
|
/**
|
|
2
|
-
* Tracks
|
|
3
|
-
*
|
|
4
|
-
* process group; the registry file lets a later host reap leftovers by
|
|
5
|
-
* killing the whole group. The file lives next to the project store and is
|
|
6
|
-
* only ever touched by one host at a time (the advisory lock ensures it).
|
|
6
|
+
* Tracks supervised process groups by PID and operating-system start identity.
|
|
7
|
+
* A later host kills a recorded process only when both values still match.
|
|
7
8
|
*/
|
|
8
9
|
export declare class HostProcessRegistry {
|
|
9
10
|
private readonly filePath;
|
|
10
|
-
private readonly
|
|
11
|
+
private readonly processes;
|
|
11
12
|
constructor(storeDir: string);
|
|
12
|
-
register(pid: number):
|
|
13
|
+
register(pid: number): ProcessIdentity;
|
|
13
14
|
unregister(pid: number): void;
|
|
14
15
|
get size(): number;
|
|
15
|
-
/** Kill
|
|
16
|
+
/** Kill one exact registered process group and remove its durable record. */
|
|
17
|
+
kill(pid: number): boolean;
|
|
18
|
+
/** Kill every process that still has its registered start identity. */
|
|
16
19
|
killAll(): void;
|
|
17
|
-
/**
|
|
18
|
-
* Reap children recorded by a previous host that died without cleanup.
|
|
19
|
-
* Called once at host start, before the lock is taken.
|
|
20
|
-
*/
|
|
20
|
+
/** Reap only exact stale process identities recorded by an older host. */
|
|
21
21
|
reapOrphans(): number[];
|
|
22
22
|
private readFile;
|
|
23
23
|
private persist;
|
|
24
24
|
}
|
|
25
|
+
/** Return the operating-system parent PID for a live process. */
|
|
26
|
+
export declare function processParentPid(pid: number): number | undefined;
|
|
27
|
+
/** Return an operating-system process start value that fences PID reuse. */
|
|
28
|
+
export declare function processStartIdentity(pid: number): string | undefined;
|
|
29
|
+
export declare function matchesProcessIdentity(identity: ProcessIdentity): boolean;
|