@osolmaz/pi-workflows 0.14.0 → 0.15.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 +78 -110
- 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 +0 -1
- package/dist/controllers/index.js +0 -1
- package/dist/controllers/index.js.map +1 -1
- package/dist/controllers/sqlite.d.ts +51 -0
- package/dist/controllers/sqlite.js +433 -57
- 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 -3447
- 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/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 -26
- package/dist/workflows/tool-input.js +2 -50
- package/dist/workflows/tool-input.js.map +1 -1
- package/dist/workflows/types.d.ts +36 -4
- 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 +23 -2
- package/docs/SQLITE_STATE.md +41 -31
- 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-27-workflow-terminal-restart-plan.md +42 -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 +162 -210
- 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/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 +0 -5
- package/src/controllers/sqlite.ts +709 -76
- package/src/controllers/store.ts +1 -0
- package/src/extension/controller-command.ts +45 -0
- package/src/extension/index.ts +944 -4163
- 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/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 +3 -69
- 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/restart-policy.d.ts +0 -38
- package/dist/extension/restart-policy.js +0 -116
- package/dist/extension/restart-policy.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/extension/terminal-decision.d.ts +0 -51
- package/dist/extension/terminal-decision.js +0 -110
- package/dist/extension/terminal-decision.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/restart-policy.ts +0 -163
- package/src/extension/session-events.ts +0 -121
- package/src/extension/terminal-decision.ts +0 -172
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/host/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAkB,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,GAIlB,MAAM,eAAe,CAAC;AAOvB,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACjC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC,MAAM,OAAO,kBAAkB;IACpB,QAAQ,CAAS;IACjB,YAAY,CAAS;IACrB,QAAQ,CAAS;IAE1B,YACE,OAAO,GAKH,EAAE;QAEN,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,UAAU,UAAU,EAAE,EAAE,CAAC;QAC7D,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,iBAAiB,EAAE,CAAC;QAChE,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACzB,CAAC;IAEgB,aAAa,CAAqB;IAClC,GAAG,CAAqC;IAEzD,KAAK,CAAC,OAAO,CAAC,OAOb;QACC,MAAM,OAAO,GAAgB;YAC3B,MAAM,EAAE,8BAA8B;YACtC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,UAAU,EAAE;YAC5C,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,UAAU,EAAE;YACtD,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;YAChE,GAAG,CAAC,OAAO,CAAC,gBAAgB,KAAK,SAAS;gBACxC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC;YACnD,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;SAC/B,CAAC;QACF,OAAO,MAAM,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAIrB;QACC,OAAO,CAAC,MAAM,IAAI,CAAC,WAAW,CAC5B;YACE,MAAM,EAAE,iCAAiC;YACzC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,EACD,OAAO,CAAC,GAAG,EACX,iCAAiC,EACjC,OAAO,CAAC,SAAS,CAClB,CAAsC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,+BAA+B,CAAC,OAKrC;QACC,OAAO,CAAC,MAAM,IAAI,CAAC,WAAW,CAC5B;YACE,MAAM,EAAE,mDAAmD;YAC3D,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,EACD,OAAO,CAAC,GAAG,EACX,oDAAoD,EACpD,OAAO,CAAC,SAAS,CAClB,CAAgD,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,OAS3B;QACC,OAAO,CAAC,MAAM,IAAI,CAAC,WAAW,CAC5B;YACE,MAAM,EAAE,6CAA6C;YACrD,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,EACD,OAAO,CAAC,GAAG,EACX,0CAA0C,EAC1C,OAAO,CAAC,SAAS,CAClB,CAAsC,CAAC;IAC1C,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,OAAkB,EAClB,GAAW,EACX,cAAsB,EACtB,SAAS,GAAG,gBAAgB;QAE5B,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,qBAAqB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAClF,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,qBAAqB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACnF,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YACpC,CAAC,CAAC,CAAC,UAAU,CAAC;YACd,CAAC,CAAC,CAAC,UAAU,EAAE,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE;YAC1C,GAAG;YACH,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;YACtC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;SACrC,CAAC,CAAC;QACH,IAAI,MAAM,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,MAAM,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,WAA8B,CAAC;QACnC,MAAM,MAAM,GAAG,CAAC,OAAe,EAAE,KAAa,EAAU,EAAE;YACxD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAC7C,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;gBAClC,WAAW,GAAG,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBAClE,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5B,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QACF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;QACzE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAA2C,CAAC;QAC7F,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,IAAI,WAAW,KAAK,SAAS;YAAE,MAAM,WAAW,CAAC;QACjD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC9D,MAAM,IAAI,KAAK,CACb,MAAM,IAAI,oDAAoD,IAAI,YAAY,MAAM,GAAG,CACxF,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,KAAkB,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;gBACxB,SAAS,EAAE,aAAa;gBACxB,SAAS,EAAE,eAAe,UAAU,EAAE,EAAE;gBACxC,cAAc,EAAE,eAAe,UAAU,EAAE,EAAE;aAC9C,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC;QAC/C,IAAI,SAAkB,CAAC;QACvB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YACxD,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;oBACxB,SAAS,EAAE,aAAa;oBACxB,SAAS,EAAE,eAAe,UAAU,EAAE,EAAE;oBACxC,cAAc,EAAE,eAAe,UAAU,EAAE,EAAE;iBAC9C,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAK,CAAC;YACpB,CAAC;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CACb,uCAAuC,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAC5G,CAAC;IACJ,CAAC;IAEO,aAAa;QACnB,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9E,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,IAAI,UAAU,CAAC;QAC/C,MAAM,IAAI,GACR,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAC5D,CAAC,CAAC,CAAC,UAAU,EAAE,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;YAC1E,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACd,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE;YAChF,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;YACf,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;SACrC,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,GAAuB;IAC/C,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO;IAC9B,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;;YAC3D,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;AACH,CAAC;AAED,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;AAED,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,OAAoB;IAC/D,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACzC,IAAI,KAAgD,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,CAAC;YACjB,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;YACvB,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC/B,KAAK,GAAG,UAAU,CAChB,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,EAC7D,kBAAkB,CACnB,CAAC;gBACF,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YAClB,CAAC,CAAC;YACF,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SAC/D,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAAE,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5E,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnE,MAAM,OAAO,GAAG,UAAU,CACxB,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC,EAC3D,kBAAkB,CACnB,CAAC;YACF,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;YAClB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAClC,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrC,IAAI,KAAK,KAAK,SAAS;wBAAE,OAAO;oBAChC,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;gBACpC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC,CAAC,CAAC;QAC1F,CAAC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,KAAK,SAAS;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -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;
|