@osolmaz/pi-workflows 0.16.1 → 0.16.3
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 +41 -41
- package/dist/builtins/monitor.workflow.d.ts +1 -1
- package/dist/builtins/monitor.workflow.js +8 -8
- package/dist/builtins/pi-agent-group.js +3 -3
- package/dist/builtins/pi-agent-group.js.map +1 -1
- package/dist/channels/adapter-entry.js +14 -14
- package/dist/channels/adapter-entry.js.map +1 -1
- package/dist/client/client.d.ts +6 -6
- package/dist/client/client.js +27 -27
- package/dist/client/client.js.map +1 -1
- package/dist/client/protocol.d.ts +4 -1
- package/dist/client/protocol.js +17 -11
- package/dist/client/protocol.js.map +1 -1
- package/dist/client/resolver.d.ts +4 -4
- package/dist/client/view.d.ts +7 -1
- package/dist/client/view.js +1 -0
- package/dist/client/view.js.map +1 -1
- package/dist/extension/index.d.ts +1 -1
- package/dist/extension/index.js +66 -47
- package/dist/extension/index.js.map +1 -1
- package/dist/extension/recorder.d.ts +1 -1
- package/dist/extension/recorder.js +1 -1
- package/dist/extension/recorder.js.map +1 -1
- package/dist/extension/remote-recorder-store.d.ts +1 -1
- package/dist/extension/remote-recorder-store.js +2 -2
- package/dist/extension/remote-recorder-store.js.map +1 -1
- package/dist/extension/{controller-command.d.ts → resource-manager-command.d.ts} +6 -6
- package/dist/extension/{controller-command.js → resource-manager-command.js} +7 -7
- package/dist/extension/resource-manager-command.js.map +1 -0
- package/dist/extension/session-delivery.d.ts +1 -1
- package/dist/extension/session-delivery.js +2 -2
- package/dist/extension/session-delivery.js.map +1 -1
- package/dist/extension/session-view.d.ts +1 -1
- package/dist/extension/session-view.js +1 -1
- package/dist/extension/session-view.js.map +1 -1
- package/dist/extension/workflow-message-coordinator.d.ts +4 -3
- package/dist/extension/workflow-message-coordinator.js +81 -29
- package/dist/extension/workflow-message-coordinator.js.map +1 -1
- package/dist/resource-managers/conditions.d.ts +6 -0
- package/dist/{controllers → resource-managers}/conditions.js +3 -3
- package/dist/resource-managers/conditions.js.map +1 -0
- package/dist/resource-managers/definition.d.ts +6 -0
- package/dist/resource-managers/definition.js +45 -0
- package/dist/resource-managers/definition.js.map +1 -0
- package/dist/resource-managers/effects.d.ts +15 -0
- package/dist/{controllers → resource-managers}/effects.js +2 -2
- package/dist/resource-managers/effects.js.map +1 -0
- package/dist/resource-managers/errors.d.ts +12 -0
- package/dist/resource-managers/errors.js +25 -0
- package/dist/resource-managers/errors.js.map +1 -0
- package/dist/resource-managers/index.d.ts +12 -0
- package/dist/resource-managers/index.js +12 -0
- package/dist/resource-managers/index.js.map +1 -0
- package/dist/resource-managers/json.js.map +1 -0
- package/dist/resource-managers/loader.d.ts +23 -0
- package/dist/resource-managers/loader.js +75 -0
- package/dist/resource-managers/loader.js.map +1 -0
- package/dist/resource-managers/results.d.ts +5 -0
- package/dist/resource-managers/results.js.map +1 -0
- package/dist/resource-managers/runtime.d.ts +59 -0
- package/dist/{controllers/manager.js → resource-managers/runtime.js} +57 -57
- package/dist/resource-managers/runtime.js.map +1 -0
- package/dist/{controllers → resource-managers}/sqlite.d.ts +51 -43
- package/dist/{controllers → resource-managers}/sqlite.js +187 -125
- package/dist/resource-managers/sqlite.js.map +1 -0
- package/dist/{controllers → resource-managers}/store.d.ts +33 -33
- package/dist/{controllers → resource-managers}/store.js.map +1 -1
- package/dist/{controllers → resource-managers}/types.d.ts +41 -41
- package/dist/{controllers → resource-managers}/types.js.map +1 -1
- package/dist/resource-managers/workflows.d.ts +34 -0
- package/dist/{controllers → resource-managers}/workflows.js +15 -15
- package/dist/resource-managers/workflows.js.map +1 -0
- package/dist/server/channel-effects.js.map +1 -0
- package/dist/{host → server}/channel-supervisor.d.ts +6 -6
- package/dist/{host → server}/channel-supervisor.js +3 -3
- package/dist/server/channel-supervisor.js.map +1 -0
- package/dist/{host/child-worker-supervisor.d.ts → server/child-runner-supervisor.d.ts} +15 -13
- package/dist/{host/child-worker-supervisor.js → server/child-runner-supervisor.js} +6 -5
- package/dist/server/child-runner-supervisor.js.map +1 -0
- package/dist/{host → server}/processes.d.ts +3 -3
- package/dist/{host → server}/processes.js +3 -3
- package/dist/server/processes.js.map +1 -0
- package/dist/{host → server}/resolver-entry.d.ts +6 -6
- package/dist/{host → server}/resolver-entry.js +14 -14
- package/dist/server/resolver-entry.js.map +1 -0
- package/dist/server/resource-runner-entry.d.ts +2 -0
- package/dist/{host/controller-worker-entry.js → server/resource-runner-entry.js} +33 -33
- package/dist/server/resource-runner-entry.js.map +1 -0
- package/dist/server/resource-runner-protocol.d.ts +36 -0
- package/dist/server/resource-runner-protocol.js +49 -0
- package/dist/server/resource-runner-protocol.js.map +1 -0
- package/dist/server/resource-runner-supervisor.d.ts +21 -0
- package/dist/{host/worker-supervisor.js → server/resource-runner-supervisor.js} +17 -17
- package/dist/server/resource-runner-supervisor.js.map +1 -0
- package/dist/{host → server}/rpc-bridge.d.ts +3 -3
- package/dist/{host → server}/rpc-bridge.js +3 -3
- package/dist/server/rpc-bridge.js.map +1 -0
- package/dist/{host → server}/rpc-executor.d.ts +1 -1
- package/dist/{host → server}/rpc-executor.js +3 -3
- package/dist/server/rpc-executor.js.map +1 -0
- package/dist/{host/host-entry.js → server/server-entry.js} +6 -6
- package/dist/server/server-entry.js.map +1 -0
- package/dist/{host/runner.d.ts → server/server.d.ts} +47 -39
- package/dist/{host/runner.js → server/server.js} +624 -535
- package/dist/server/server.js.map +1 -0
- package/dist/{host → server}/state.d.ts +25 -25
- package/dist/{host → server}/state.js +49 -49
- package/dist/server/state.js.map +1 -0
- package/dist/{host → server}/view.d.ts +7 -7
- package/dist/{host → server}/view.js +19 -15
- package/dist/server/view.js.map +1 -0
- package/dist/server/workflow-runner-content.d.ts +6 -0
- package/dist/server/workflow-runner-content.js +96 -0
- package/dist/server/workflow-runner-content.js.map +1 -0
- package/dist/server/workflow-runner-entry.d.ts +13 -0
- package/dist/{host/worker-entry.js → server/workflow-runner-entry.js} +89 -57
- package/dist/server/workflow-runner-entry.js.map +1 -0
- package/dist/server/workflow-runner-protocol.d.ts +69 -0
- package/dist/server/workflow-runner-protocol.js +176 -0
- package/dist/server/workflow-runner-protocol.js.map +1 -0
- package/dist/{host/worker-store.d.ts → server/workflow-runner-store.d.ts} +11 -11
- package/dist/{host/worker-store.js → server/workflow-runner-store.js} +8 -8
- package/dist/server/workflow-runner-store.js.map +1 -0
- package/dist/server/workflow-runner-supervisor.d.ts +22 -0
- package/dist/server/workflow-runner-supervisor.js +56 -0
- package/dist/server/workflow-runner-supervisor.js.map +1 -0
- package/dist/state/prune.d.ts +1 -1
- package/dist/state/prune.js +17 -10
- package/dist/state/prune.js.map +1 -1
- package/dist/state/schema.js +2 -2
- package/dist/state/workflow-messages.d.ts +3 -1
- package/dist/state/workflow-messages.js +32 -1
- package/dist/state/workflow-messages.js.map +1 -1
- package/dist/viewer/backup.js +1 -1
- package/dist/viewer/backup.js.map +1 -1
- package/dist/viewer/cli.d.ts +2 -2
- package/dist/viewer/cli.js +46 -32
- package/dist/viewer/cli.js.map +1 -1
- package/dist/viewer/tui.d.ts +1 -1
- package/dist/viewer/tui.js +1 -1
- package/dist/viewer/tui.js.map +1 -1
- package/dist/workflows/command-batch.js +2 -2
- package/dist/workflows/composition.js +0 -4
- package/dist/workflows/composition.js.map +1 -1
- package/dist/workflows/definition.js +0 -8
- package/dist/workflows/definition.js.map +1 -1
- package/dist/workflows/engine.js +18 -20
- package/dist/workflows/engine.js.map +1 -1
- package/dist/workflows/schema.js +0 -4
- package/dist/workflows/schema.js.map +1 -1
- package/dist/workflows/store.d.ts +27 -11
- package/dist/workflows/store.js +66 -18
- package/dist/workflows/store.js.map +1 -1
- package/dist/workflows/types.d.ts +3 -5
- package/docs/2026-08-20-durable-workflow-launch-plan.md +12 -12
- package/docs/2026-08-25-workflow-follow-ups.md +7 -7
- package/docs/2026-08-25-workflow-settings.md +3 -3
- package/docs/2026-08-30-out-of-process-workflow-host-plan.md +3 -3
- package/docs/2026-09-01-restore-session-delivery-controls-plan.md +5 -5
- package/docs/2026-09-01-unified-workflow-client-plan.md +6 -6
- package/docs/2026-09-02-installed-live-e2e-plan.md +3 -3
- package/docs/2026-09-02-unify-workflow-messages-plan.md +8 -8
- package/docs/2026-09-04-workflow-run-state-plan.md +363 -0
- package/docs/DEFERRED_TURNS.md +7 -7
- package/docs/DESIGN_PHILOSOPHY.md +1 -1
- package/docs/HUMAN_DECISIONS.md +11 -11
- package/docs/HUMAN_DECISION_PRESENTATIONS.md +4 -4
- package/docs/MONITOR.md +1 -1
- package/docs/RESOURCE_MANAGERS.md +221 -0
- package/docs/SQLITE_STATE.md +40 -34
- package/docs/WORKFLOW_COMPOSITION.md +1 -1
- package/docs/{WORKFLOW_HOST.md → WORKFLOW_SERVER.md} +131 -116
- package/docs/WORKFLOW_STEP_MESSAGES.md +18 -18
- package/docs/WORKFLOW_UPDATES.md +16 -16
- package/docs/development.md +15 -14
- package/docs/live-replay-protocol.md +20 -20
- package/docs/plans/2026-08-04-controller-runtime-plan.md +25 -25
- package/docs/plans/2026-08-05-always-on-workflows-plan.md +8 -8
- package/docs/plans/2026-08-10-agent-managed-monitor-workflows-plan.md +2 -2
- package/docs/plans/2026-08-13-session-addressed-workflow-notifications-plan.md +1 -1
- package/docs/plans/2026-08-16-workflow-updates-plan.md +5 -5
- package/docs/plans/2026-08-19-human-decision-gates-plan.md +1 -1
- package/docs/plans/2026-08-20-bounded-command-batches-plan.md +1 -1
- package/docs/plans/2026-08-21-deferred-turn-intents-plan.md +3 -3
- package/docs/plans/2026-08-21-sanity-check-plan.md +2 -2
- package/docs/plans/2026-08-23-assistant-agent-completion-plan.md +5 -5
- package/docs/plans/2026-08-23-sqlite-state-plan.md +25 -25
- package/docs/plans/2026-08-25-live-workflow-settings-plan.md +4 -4
- package/docs/plans/2026-08-27-workflow-terminal-restart-plan.md +3 -3
- package/docs/plans/2026-09-04-workflow-runner-resume-state-plan.md +318 -0
- package/docs/plans/piw-viewer-experience-implementation-plan.md +1 -1
- package/docs/tui-viewer.md +9 -9
- package/docs/workflows.md +78 -63
- package/examples/{controllers/pull-request.controller.ts → resource-managers/pull-request.resource-manager.ts} +12 -12
- package/herdr-plugin.toml +1 -1
- package/package.json +5 -5
- package/protocol/client.v1.schema.json +7 -7
- package/protocol/fixtures/client-v1.json +1 -1
- package/src/builtins/monitor.workflow.ts +9 -9
- package/src/builtins/pi-agent-group.ts +3 -3
- package/src/channels/adapter-entry.ts +14 -14
- package/src/client/client.ts +33 -32
- package/src/client/protocol.ts +16 -11
- package/src/client/resolver.ts +4 -4
- package/src/client/view.ts +9 -1
- package/src/extension/index.ts +81 -53
- package/src/extension/recorder.ts +1 -1
- package/src/extension/remote-recorder-store.ts +2 -2
- package/src/extension/resource-manager-command.ts +45 -0
- package/src/extension/session-delivery.ts +2 -2
- package/src/extension/session-view.ts +1 -1
- package/src/extension/workflow-message-coordinator.ts +94 -30
- package/src/{controllers → resource-managers}/conditions.ts +23 -23
- package/src/resource-managers/definition.ts +71 -0
- package/src/{controllers → resource-managers}/effects.ts +9 -9
- package/src/resource-managers/errors.ts +27 -0
- package/src/resource-managers/index.ts +88 -0
- package/src/resource-managers/loader.ts +111 -0
- package/src/{controllers → resource-managers}/results.ts +4 -4
- package/src/{controllers/manager.ts → resource-managers/runtime.ts} +95 -92
- package/src/{controllers → resource-managers}/sqlite.ts +275 -181
- package/src/{controllers → resource-managers}/store.ts +46 -38
- package/src/{controllers → resource-managers}/types.ts +50 -41
- package/src/{controllers → resource-managers}/workflows.ts +43 -41
- package/src/{host → server}/channel-supervisor.ts +8 -8
- package/src/{host/child-worker-supervisor.ts → server/child-runner-supervisor.ts} +22 -18
- package/src/{host → server}/processes.ts +3 -3
- package/src/{host → server}/resolver-entry.ts +28 -25
- package/src/{host/controller-worker-entry.ts → server/resource-runner-entry.ts} +67 -65
- package/src/server/resource-runner-protocol.ts +103 -0
- package/src/server/resource-runner-supervisor.ts +76 -0
- package/src/{host → server}/rpc-bridge.ts +3 -3
- package/src/{host → server}/rpc-executor.ts +4 -4
- package/src/{host/host-entry.ts → server/server-entry.ts} +5 -5
- package/src/{host/runner.ts → server/server.ts} +786 -672
- package/src/{host → server}/state.ts +78 -67
- package/src/{host → server}/view.ts +21 -17
- package/src/server/workflow-runner-content.ts +119 -0
- package/src/{host/worker-entry.ts → server/workflow-runner-entry.ts} +131 -82
- package/src/server/workflow-runner-protocol.ts +241 -0
- package/src/{host/worker-store.ts → server/workflow-runner-store.ts} +18 -20
- package/src/server/workflow-runner-supervisor.ts +79 -0
- package/src/state/prune.ts +27 -9
- package/src/state/schema.ts +2 -2
- package/src/state/workflow-messages.ts +52 -1
- package/src/viewer/backup.ts +1 -1
- package/src/viewer/cli.ts +50 -36
- package/src/viewer/tui.ts +1 -1
- package/src/workflows/command-batch.ts +2 -2
- package/src/workflows/composition.ts +0 -5
- package/src/workflows/definition.ts +0 -8
- package/src/workflows/engine.ts +18 -21
- package/src/workflows/schema.ts +0 -6
- package/src/workflows/store.ts +95 -28
- package/src/workflows/types.ts +3 -5
- package/dist/controllers/conditions.d.ts +0 -6
- package/dist/controllers/conditions.js.map +0 -1
- package/dist/controllers/definition.d.ts +0 -6
- package/dist/controllers/definition.js +0 -45
- package/dist/controllers/definition.js.map +0 -1
- package/dist/controllers/effects.d.ts +0 -15
- package/dist/controllers/effects.js.map +0 -1
- package/dist/controllers/errors.d.ts +0 -12
- package/dist/controllers/errors.js +0 -25
- package/dist/controllers/errors.js.map +0 -1
- package/dist/controllers/index.d.ts +0 -12
- package/dist/controllers/index.js +0 -12
- package/dist/controllers/index.js.map +0 -1
- package/dist/controllers/json.js.map +0 -1
- package/dist/controllers/loader.d.ts +0 -23
- package/dist/controllers/loader.js +0 -74
- package/dist/controllers/loader.js.map +0 -1
- package/dist/controllers/manager.d.ts +0 -59
- package/dist/controllers/manager.js.map +0 -1
- package/dist/controllers/results.d.ts +0 -5
- package/dist/controllers/results.js.map +0 -1
- package/dist/controllers/sqlite.js.map +0 -1
- package/dist/controllers/workflows.d.ts +0 -34
- package/dist/controllers/workflows.js.map +0 -1
- package/dist/extension/controller-command.js.map +0 -1
- package/dist/host/channel-effects.js.map +0 -1
- package/dist/host/channel-supervisor.js.map +0 -1
- package/dist/host/child-worker-supervisor.js.map +0 -1
- package/dist/host/controller-worker-entry.d.ts +0 -2
- package/dist/host/controller-worker-entry.js.map +0 -1
- package/dist/host/controller-worker-protocol.d.ts +0 -36
- package/dist/host/controller-worker-protocol.js +0 -49
- package/dist/host/controller-worker-protocol.js.map +0 -1
- package/dist/host/controller-worker-supervisor.d.ts +0 -21
- package/dist/host/controller-worker-supervisor.js +0 -54
- package/dist/host/controller-worker-supervisor.js.map +0 -1
- package/dist/host/host-entry.js.map +0 -1
- package/dist/host/processes.js.map +0 -1
- package/dist/host/resolver-entry.js.map +0 -1
- package/dist/host/rpc-bridge.js.map +0 -1
- package/dist/host/rpc-executor.js.map +0 -1
- package/dist/host/runner.js.map +0 -1
- package/dist/host/state.js.map +0 -1
- package/dist/host/view.js.map +0 -1
- package/dist/host/worker-entry.d.ts +0 -10
- package/dist/host/worker-entry.js.map +0 -1
- package/dist/host/worker-protocol.d.ts +0 -31
- package/dist/host/worker-protocol.js +0 -122
- package/dist/host/worker-protocol.js.map +0 -1
- package/dist/host/worker-store.js.map +0 -1
- package/dist/host/worker-supervisor.d.ts +0 -22
- package/dist/host/worker-supervisor.js.map +0 -1
- package/docs/CONTROLLERS.md +0 -217
- package/src/controllers/definition.ts +0 -65
- package/src/controllers/errors.ts +0 -27
- package/src/controllers/index.ts +0 -88
- package/src/controllers/loader.ts +0 -104
- package/src/extension/controller-command.ts +0 -45
- package/src/host/controller-worker-protocol.ts +0 -104
- package/src/host/controller-worker-supervisor.ts +0 -79
- package/src/host/worker-protocol.ts +0 -165
- package/src/host/worker-supervisor.ts +0 -74
- /package/dist/{controllers → resource-managers}/json.d.ts +0 -0
- /package/dist/{controllers → resource-managers}/json.js +0 -0
- /package/dist/{controllers → resource-managers}/results.js +0 -0
- /package/dist/{controllers → resource-managers}/store.js +0 -0
- /package/dist/{controllers → resource-managers}/types.js +0 -0
- /package/dist/{host → server}/channel-effects.d.ts +0 -0
- /package/dist/{host → server}/channel-effects.js +0 -0
- /package/dist/{host/host-entry.d.ts → server/server-entry.d.ts} +0 -0
- /package/src/{controllers → resource-managers}/json.ts +0 -0
- /package/src/{host → server}/channel-effects.ts +0 -0
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import { createRequire } from "node:module";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
import { canonicalJson, type JsonValue } from "../state/json.js";
|
|
5
|
-
import { ChildWorkerSupervisor, type SupervisedWorkerResult } from "./child-worker-supervisor.js";
|
|
6
|
-
import {
|
|
7
|
-
encodeControllerWorkerLine,
|
|
8
|
-
parseControllerWorkerMessage,
|
|
9
|
-
type ControllerWorkerLaunchEnvelope,
|
|
10
|
-
type ControllerWorkerMessage,
|
|
11
|
-
type ControllerWorkerResponse,
|
|
12
|
-
} from "./controller-worker-protocol.js";
|
|
13
|
-
import { HostProcessRegistry, type ProcessIdentity } from "./processes.js";
|
|
14
|
-
import type { WorkerOutcome } from "./state.js";
|
|
15
|
-
|
|
16
|
-
export class ControllerWorkerSupervisor {
|
|
17
|
-
private readonly supervisor: ChildWorkerSupervisor<
|
|
18
|
-
ControllerWorkerMessage,
|
|
19
|
-
ControllerWorkerResponse
|
|
20
|
-
>;
|
|
21
|
-
|
|
22
|
-
constructor(
|
|
23
|
-
readonly envelope: ControllerWorkerLaunchEnvelope,
|
|
24
|
-
private readonly options: {
|
|
25
|
-
registry: HostProcessRegistry;
|
|
26
|
-
onMessage: (message: ControllerWorkerMessage) => Promise<ControllerWorkerResponse>;
|
|
27
|
-
env?: Record<string, string>;
|
|
28
|
-
startupTimeoutMs?: number;
|
|
29
|
-
workerEntryPath?: string;
|
|
30
|
-
onSpawn?: (identity: ProcessIdentity) => void;
|
|
31
|
-
onDiagnostic?: (message: string) => void;
|
|
32
|
-
},
|
|
33
|
-
) {
|
|
34
|
-
this.supervisor = new ChildWorkerSupervisor({
|
|
35
|
-
label: "Controller worker",
|
|
36
|
-
registry: options.registry,
|
|
37
|
-
onMessage: options.onMessage,
|
|
38
|
-
parseMessage: parseControllerWorkerMessage,
|
|
39
|
-
encodeResponse: encodeControllerWorkerLine,
|
|
40
|
-
isReady: (message) => message.operation === "worker.ready",
|
|
41
|
-
isTerminal: (message) =>
|
|
42
|
-
message.operation === "worker.finished" || message.operation === "worker.failed",
|
|
43
|
-
...(options.startupTimeoutMs === undefined
|
|
44
|
-
? {}
|
|
45
|
-
: { startupTimeoutMs: options.startupTimeoutMs }),
|
|
46
|
-
...(options.onSpawn === undefined ? {} : { onSpawn: options.onSpawn }),
|
|
47
|
-
...(options.onDiagnostic === undefined ? {} : { onDiagnostic: options.onDiagnostic }),
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async start(): Promise<void> {
|
|
52
|
-
const builtEntry = fileURLToPath(new URL("./controller-worker-entry.js", import.meta.url));
|
|
53
|
-
const sourceEntry = fileURLToPath(new URL("./controller-worker-entry.ts", import.meta.url));
|
|
54
|
-
const workerEntry = this.options.workerEntryPath ?? builtEntry;
|
|
55
|
-
const args =
|
|
56
|
-
this.options.workerEntryPath === undefined && !fs.existsSync(builtEntry)
|
|
57
|
-
? ["--import", createRequire(import.meta.url).resolve("tsx"), sourceEntry]
|
|
58
|
-
: [workerEntry];
|
|
59
|
-
await this.supervisor.start({
|
|
60
|
-
args,
|
|
61
|
-
cwd: this.envelope.projectPath,
|
|
62
|
-
env: {
|
|
63
|
-
...process.env,
|
|
64
|
-
...this.options.env,
|
|
65
|
-
PI_WORKFLOWS_CONTROLLER_WORKER_LAUNCH: Buffer.from(
|
|
66
|
-
canonicalJson(this.envelope as unknown as JsonValue),
|
|
67
|
-
).toString("base64url"),
|
|
68
|
-
},
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
async wait(): Promise<SupervisedWorkerResult> {
|
|
73
|
-
return await this.supervisor.wait();
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
async stop(outcome: WorkerOutcome = "cancelled"): Promise<void> {
|
|
77
|
-
await this.supervisor.stop(outcome);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import { MAX_PROTOCOL_MESSAGE_BYTES } from "../client/protocol.js";
|
|
2
|
-
import { canonicalJson, parseJson, type JsonValue } from "../state/json.js";
|
|
3
|
-
|
|
4
|
-
export const WORKER_MESSAGE_SCHEMA = "pi-workflows.worker-message.v1" as const;
|
|
5
|
-
export const WORKER_RESPONSE_SCHEMA = "pi-workflows.worker-response.v1" as const;
|
|
6
|
-
|
|
7
|
-
export const WORKER_MESSAGE_KINDS = [
|
|
8
|
-
"worker.ready",
|
|
9
|
-
"node.started",
|
|
10
|
-
"node.update",
|
|
11
|
-
"node.finished",
|
|
12
|
-
"node.failed",
|
|
13
|
-
"run.parked",
|
|
14
|
-
"run.finished",
|
|
15
|
-
"interaction.requested",
|
|
16
|
-
"interaction.accepted",
|
|
17
|
-
"interaction.rejected",
|
|
18
|
-
"notification.requested",
|
|
19
|
-
"presentation.requested",
|
|
20
|
-
"effect.reserve",
|
|
21
|
-
"effect.settle",
|
|
22
|
-
"worker.progress",
|
|
23
|
-
"worker.exiting",
|
|
24
|
-
] as const;
|
|
25
|
-
|
|
26
|
-
export type WorkerMessageKind = (typeof WORKER_MESSAGE_KINDS)[number];
|
|
27
|
-
export type WorkerStoreOperation =
|
|
28
|
-
| "store.initializeRun"
|
|
29
|
-
| "store.prepareRunResume"
|
|
30
|
-
| "store.readRun"
|
|
31
|
-
| "store.writeSnapshot"
|
|
32
|
-
| "store.publishUpdate"
|
|
33
|
-
| "store.findSettingsScope"
|
|
34
|
-
| "store.ensureSettingsScope"
|
|
35
|
-
| "store.getSettingsScopeAtChange"
|
|
36
|
-
| "store.createHumanDecisionRequest"
|
|
37
|
-
| "store.readResolvedHumanDecision"
|
|
38
|
-
| "store.reserveEffect"
|
|
39
|
-
| "store.settleEffect"
|
|
40
|
-
| "process.register"
|
|
41
|
-
| "process.unregister"
|
|
42
|
-
| "interaction.request"
|
|
43
|
-
| "interaction.accept"
|
|
44
|
-
| "interaction.reject"
|
|
45
|
-
| "notification.request"
|
|
46
|
-
| "presentation.request";
|
|
47
|
-
|
|
48
|
-
export type WorkerMessage = {
|
|
49
|
-
schema: typeof WORKER_MESSAGE_SCHEMA;
|
|
50
|
-
launchSchema: "pi-workflows.worker-launch.v1";
|
|
51
|
-
messageId: string;
|
|
52
|
-
kind: WorkerMessageKind;
|
|
53
|
-
operation: WorkerStoreOperation | "worker.ready" | "worker.exiting";
|
|
54
|
-
runId: string;
|
|
55
|
-
generation: number;
|
|
56
|
-
workerEpoch: string;
|
|
57
|
-
expectedRevision: number;
|
|
58
|
-
attemptId?: string;
|
|
59
|
-
payload: JsonValue;
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
export type WorkerResponse = {
|
|
63
|
-
schema: typeof WORKER_RESPONSE_SCHEMA;
|
|
64
|
-
messageId: string;
|
|
65
|
-
outcome: "accepted" | "adopted" | "rejected" | "claimLost";
|
|
66
|
-
revision?: number;
|
|
67
|
-
result?: JsonValue;
|
|
68
|
-
error?: string;
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
export function workerKindForOperation(
|
|
72
|
-
operation: WorkerStoreOperation,
|
|
73
|
-
payload: Record<string, unknown>,
|
|
74
|
-
): WorkerMessageKind {
|
|
75
|
-
if (operation === "store.publishUpdate") return "node.update";
|
|
76
|
-
if (operation === "store.reserveEffect") return "effect.reserve";
|
|
77
|
-
if (operation === "store.settleEffect") return "effect.settle";
|
|
78
|
-
if (operation === "store.createHumanDecisionRequest" || operation === "interaction.request") {
|
|
79
|
-
return "interaction.requested";
|
|
80
|
-
}
|
|
81
|
-
if (operation === "interaction.accept") return "interaction.accepted";
|
|
82
|
-
if (operation === "interaction.reject") return "interaction.rejected";
|
|
83
|
-
if (operation === "notification.request") return "notification.requested";
|
|
84
|
-
if (operation === "presentation.request") return "presentation.requested";
|
|
85
|
-
if (operation === "store.writeSnapshot") {
|
|
86
|
-
const event = payload.event;
|
|
87
|
-
const eventType = isRecord(event) && typeof event.type === "string" ? event.type : "";
|
|
88
|
-
if (eventType === "node_started") return "node.started";
|
|
89
|
-
if (eventType === "node_finished") return "node.finished";
|
|
90
|
-
if (eventType === "node_failed" || eventType === "node_timed_out") return "node.failed";
|
|
91
|
-
if (eventType === "run_waiting" || eventType.includes("park")) return "run.parked";
|
|
92
|
-
if (eventType.startsWith("run_") && eventType !== "run_started") return "run.finished";
|
|
93
|
-
}
|
|
94
|
-
return "worker.progress";
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
export function encodeWorkerLine(message: WorkerMessage | WorkerResponse): Buffer {
|
|
98
|
-
const encoded = Buffer.from(`${canonicalJson(message)}\n`, "utf8");
|
|
99
|
-
if (encoded.byteLength > MAX_PROTOCOL_MESSAGE_BYTES) {
|
|
100
|
-
throw new Error("Worker protocol message exceeds 1 MiB");
|
|
101
|
-
}
|
|
102
|
-
return encoded;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
export function parseWorkerMessage(line: Buffer | string): WorkerMessage {
|
|
106
|
-
const value = parseWorkerValue(line);
|
|
107
|
-
if (
|
|
108
|
-
value.schema !== WORKER_MESSAGE_SCHEMA ||
|
|
109
|
-
value.launchSchema !== "pi-workflows.worker-launch.v1"
|
|
110
|
-
) {
|
|
111
|
-
throw new Error("Invalid worker message schema");
|
|
112
|
-
}
|
|
113
|
-
requireText(value.messageId, "messageId");
|
|
114
|
-
requireText(value.runId, "runId");
|
|
115
|
-
requireText(value.workerEpoch, "workerEpoch");
|
|
116
|
-
if (!WORKER_MESSAGE_KINDS.includes(value.kind as WorkerMessageKind)) {
|
|
117
|
-
throw new Error("Invalid worker message kind");
|
|
118
|
-
}
|
|
119
|
-
if (!Number.isSafeInteger(value.generation) || (value.generation as number) <= 0) {
|
|
120
|
-
throw new Error("Worker generation must be positive");
|
|
121
|
-
}
|
|
122
|
-
if (!Number.isSafeInteger(value.expectedRevision) || (value.expectedRevision as number) < 0) {
|
|
123
|
-
throw new Error("Worker expectedRevision must be non-negative");
|
|
124
|
-
}
|
|
125
|
-
requireText(value.operation, "operation");
|
|
126
|
-
if (value.attemptId !== undefined) requireText(value.attemptId, "attemptId");
|
|
127
|
-
if (!Object.hasOwn(value, "payload")) throw new Error("Worker payload is required");
|
|
128
|
-
return value as WorkerMessage;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export function parseWorkerResponse(line: Buffer | string): WorkerResponse {
|
|
132
|
-
const value = parseWorkerValue(line);
|
|
133
|
-
if (value.schema !== WORKER_RESPONSE_SCHEMA) throw new Error("Invalid worker response schema");
|
|
134
|
-
requireText(value.messageId, "messageId");
|
|
135
|
-
if (!["accepted", "adopted", "rejected", "claimLost"].includes(value.outcome as string)) {
|
|
136
|
-
throw new Error("Invalid worker response outcome");
|
|
137
|
-
}
|
|
138
|
-
if (value.error !== undefined && typeof value.error !== "string") {
|
|
139
|
-
throw new Error("Worker response error must be text");
|
|
140
|
-
}
|
|
141
|
-
return value as WorkerResponse;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
function parseWorkerValue(line: Buffer | string): Record<string, unknown> {
|
|
145
|
-
const buffer = Buffer.isBuffer(line) ? line : Buffer.from(line, "utf8");
|
|
146
|
-
if (buffer.byteLength + 1 > MAX_PROTOCOL_MESSAGE_BYTES) {
|
|
147
|
-
throw new Error("Worker protocol message exceeds 1 MiB");
|
|
148
|
-
}
|
|
149
|
-
const text = buffer.toString("utf8");
|
|
150
|
-
const value = parseJson(text);
|
|
151
|
-
if (!isRecord(value) || canonicalJson(value) !== text) {
|
|
152
|
-
throw new Error("Worker protocol message must be a canonical JSON object");
|
|
153
|
-
}
|
|
154
|
-
return value;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
function requireText(value: unknown, field: string): asserts value is string {
|
|
158
|
-
if (typeof value !== "string" || value.length === 0 || value.length > 256) {
|
|
159
|
-
throw new Error(`Worker ${field} must be nonempty bounded text`);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
164
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
165
|
-
}
|
|
@@ -1,74 +0,0 @@
|
|
|
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, type SupervisedWorkerResult } from "./child-worker-supervisor.js";
|
|
6
|
-
import { HostProcessRegistry, type ProcessIdentity } from "./processes.js";
|
|
7
|
-
import type { WorkerLaunchEnvelope, WorkerOutcome } from "./state.js";
|
|
8
|
-
import {
|
|
9
|
-
encodeWorkerLine,
|
|
10
|
-
parseWorkerMessage,
|
|
11
|
-
type WorkerMessage,
|
|
12
|
-
type WorkerResponse,
|
|
13
|
-
} from "./worker-protocol.js";
|
|
14
|
-
|
|
15
|
-
export type WorkflowWorkerResult = SupervisedWorkerResult;
|
|
16
|
-
|
|
17
|
-
export class WorkflowWorkerSupervisor {
|
|
18
|
-
private readonly supervisor: ChildWorkerSupervisor<WorkerMessage, WorkerResponse>;
|
|
19
|
-
|
|
20
|
-
constructor(
|
|
21
|
-
readonly envelope: WorkerLaunchEnvelope,
|
|
22
|
-
private readonly options: {
|
|
23
|
-
registry: HostProcessRegistry;
|
|
24
|
-
onMessage: (message: WorkerMessage) => Promise<WorkerResponse>;
|
|
25
|
-
env?: Record<string, string>;
|
|
26
|
-
startupTimeoutMs?: number;
|
|
27
|
-
workerEntryPath?: string;
|
|
28
|
-
onSpawn?: (identity: ProcessIdentity) => void;
|
|
29
|
-
onDiagnostic?: (message: string) => void;
|
|
30
|
-
},
|
|
31
|
-
) {
|
|
32
|
-
this.supervisor = new ChildWorkerSupervisor({
|
|
33
|
-
label: "Workflow worker",
|
|
34
|
-
registry: options.registry,
|
|
35
|
-
onMessage: options.onMessage,
|
|
36
|
-
parseMessage: parseWorkerMessage,
|
|
37
|
-
encodeResponse: encodeWorkerLine,
|
|
38
|
-
isReady: (message) => message.kind === "worker.ready",
|
|
39
|
-
isTerminal: (message) => message.kind === "worker.exiting",
|
|
40
|
-
...(options.startupTimeoutMs === undefined
|
|
41
|
-
? {}
|
|
42
|
-
: { startupTimeoutMs: options.startupTimeoutMs }),
|
|
43
|
-
...(options.onSpawn === undefined ? {} : { onSpawn: options.onSpawn }),
|
|
44
|
-
...(options.onDiagnostic === undefined ? {} : { onDiagnostic: options.onDiagnostic }),
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
async start(): Promise<void> {
|
|
49
|
-
const builtEntry = fileURLToPath(new URL("./worker-entry.js", import.meta.url));
|
|
50
|
-
const sourceEntry = fileURLToPath(new URL("./worker-entry.ts", import.meta.url));
|
|
51
|
-
const workerEntry = this.options.workerEntryPath ?? builtEntry;
|
|
52
|
-
const args =
|
|
53
|
-
this.options.workerEntryPath === undefined && !fs.existsSync(builtEntry)
|
|
54
|
-
? ["--import", createRequire(import.meta.url).resolve("tsx"), sourceEntry]
|
|
55
|
-
: [workerEntry];
|
|
56
|
-
await this.supervisor.start({
|
|
57
|
-
args,
|
|
58
|
-
cwd: this.envelope.projectPath,
|
|
59
|
-
env: {
|
|
60
|
-
...process.env,
|
|
61
|
-
...this.options.env,
|
|
62
|
-
PI_WORKFLOWS_WORKER_LAUNCH: Buffer.from(canonicalJson(this.envelope)).toString("base64url"),
|
|
63
|
-
},
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
async wait(): Promise<WorkflowWorkerResult> {
|
|
68
|
-
return await this.supervisor.wait();
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
async stop(outcome: WorkerOutcome = "cancelled"): Promise<void> {
|
|
72
|
-
await this.supervisor.stop(outcome);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|