@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.
Files changed (327) hide show
  1. package/README.md +41 -41
  2. package/dist/builtins/monitor.workflow.d.ts +1 -1
  3. package/dist/builtins/monitor.workflow.js +8 -8
  4. package/dist/builtins/pi-agent-group.js +3 -3
  5. package/dist/builtins/pi-agent-group.js.map +1 -1
  6. package/dist/channels/adapter-entry.js +14 -14
  7. package/dist/channels/adapter-entry.js.map +1 -1
  8. package/dist/client/client.d.ts +6 -6
  9. package/dist/client/client.js +27 -27
  10. package/dist/client/client.js.map +1 -1
  11. package/dist/client/protocol.d.ts +4 -1
  12. package/dist/client/protocol.js +17 -11
  13. package/dist/client/protocol.js.map +1 -1
  14. package/dist/client/resolver.d.ts +4 -4
  15. package/dist/client/view.d.ts +7 -1
  16. package/dist/client/view.js +1 -0
  17. package/dist/client/view.js.map +1 -1
  18. package/dist/extension/index.d.ts +1 -1
  19. package/dist/extension/index.js +66 -47
  20. package/dist/extension/index.js.map +1 -1
  21. package/dist/extension/recorder.d.ts +1 -1
  22. package/dist/extension/recorder.js +1 -1
  23. package/dist/extension/recorder.js.map +1 -1
  24. package/dist/extension/remote-recorder-store.d.ts +1 -1
  25. package/dist/extension/remote-recorder-store.js +2 -2
  26. package/dist/extension/remote-recorder-store.js.map +1 -1
  27. package/dist/extension/{controller-command.d.ts → resource-manager-command.d.ts} +6 -6
  28. package/dist/extension/{controller-command.js → resource-manager-command.js} +7 -7
  29. package/dist/extension/resource-manager-command.js.map +1 -0
  30. package/dist/extension/session-delivery.d.ts +1 -1
  31. package/dist/extension/session-delivery.js +2 -2
  32. package/dist/extension/session-delivery.js.map +1 -1
  33. package/dist/extension/session-view.d.ts +1 -1
  34. package/dist/extension/session-view.js +1 -1
  35. package/dist/extension/session-view.js.map +1 -1
  36. package/dist/extension/workflow-message-coordinator.d.ts +4 -3
  37. package/dist/extension/workflow-message-coordinator.js +81 -29
  38. package/dist/extension/workflow-message-coordinator.js.map +1 -1
  39. package/dist/resource-managers/conditions.d.ts +6 -0
  40. package/dist/{controllers → resource-managers}/conditions.js +3 -3
  41. package/dist/resource-managers/conditions.js.map +1 -0
  42. package/dist/resource-managers/definition.d.ts +6 -0
  43. package/dist/resource-managers/definition.js +45 -0
  44. package/dist/resource-managers/definition.js.map +1 -0
  45. package/dist/resource-managers/effects.d.ts +15 -0
  46. package/dist/{controllers → resource-managers}/effects.js +2 -2
  47. package/dist/resource-managers/effects.js.map +1 -0
  48. package/dist/resource-managers/errors.d.ts +12 -0
  49. package/dist/resource-managers/errors.js +25 -0
  50. package/dist/resource-managers/errors.js.map +1 -0
  51. package/dist/resource-managers/index.d.ts +12 -0
  52. package/dist/resource-managers/index.js +12 -0
  53. package/dist/resource-managers/index.js.map +1 -0
  54. package/dist/resource-managers/json.js.map +1 -0
  55. package/dist/resource-managers/loader.d.ts +23 -0
  56. package/dist/resource-managers/loader.js +75 -0
  57. package/dist/resource-managers/loader.js.map +1 -0
  58. package/dist/resource-managers/results.d.ts +5 -0
  59. package/dist/resource-managers/results.js.map +1 -0
  60. package/dist/resource-managers/runtime.d.ts +59 -0
  61. package/dist/{controllers/manager.js → resource-managers/runtime.js} +57 -57
  62. package/dist/resource-managers/runtime.js.map +1 -0
  63. package/dist/{controllers → resource-managers}/sqlite.d.ts +51 -43
  64. package/dist/{controllers → resource-managers}/sqlite.js +187 -125
  65. package/dist/resource-managers/sqlite.js.map +1 -0
  66. package/dist/{controllers → resource-managers}/store.d.ts +33 -33
  67. package/dist/{controllers → resource-managers}/store.js.map +1 -1
  68. package/dist/{controllers → resource-managers}/types.d.ts +41 -41
  69. package/dist/{controllers → resource-managers}/types.js.map +1 -1
  70. package/dist/resource-managers/workflows.d.ts +34 -0
  71. package/dist/{controllers → resource-managers}/workflows.js +15 -15
  72. package/dist/resource-managers/workflows.js.map +1 -0
  73. package/dist/server/channel-effects.js.map +1 -0
  74. package/dist/{host → server}/channel-supervisor.d.ts +6 -6
  75. package/dist/{host → server}/channel-supervisor.js +3 -3
  76. package/dist/server/channel-supervisor.js.map +1 -0
  77. package/dist/{host/child-worker-supervisor.d.ts → server/child-runner-supervisor.d.ts} +15 -13
  78. package/dist/{host/child-worker-supervisor.js → server/child-runner-supervisor.js} +6 -5
  79. package/dist/server/child-runner-supervisor.js.map +1 -0
  80. package/dist/{host → server}/processes.d.ts +3 -3
  81. package/dist/{host → server}/processes.js +3 -3
  82. package/dist/server/processes.js.map +1 -0
  83. package/dist/{host → server}/resolver-entry.d.ts +6 -6
  84. package/dist/{host → server}/resolver-entry.js +14 -14
  85. package/dist/server/resolver-entry.js.map +1 -0
  86. package/dist/server/resource-runner-entry.d.ts +2 -0
  87. package/dist/{host/controller-worker-entry.js → server/resource-runner-entry.js} +33 -33
  88. package/dist/server/resource-runner-entry.js.map +1 -0
  89. package/dist/server/resource-runner-protocol.d.ts +36 -0
  90. package/dist/server/resource-runner-protocol.js +49 -0
  91. package/dist/server/resource-runner-protocol.js.map +1 -0
  92. package/dist/server/resource-runner-supervisor.d.ts +21 -0
  93. package/dist/{host/worker-supervisor.js → server/resource-runner-supervisor.js} +17 -17
  94. package/dist/server/resource-runner-supervisor.js.map +1 -0
  95. package/dist/{host → server}/rpc-bridge.d.ts +3 -3
  96. package/dist/{host → server}/rpc-bridge.js +3 -3
  97. package/dist/server/rpc-bridge.js.map +1 -0
  98. package/dist/{host → server}/rpc-executor.d.ts +1 -1
  99. package/dist/{host → server}/rpc-executor.js +3 -3
  100. package/dist/server/rpc-executor.js.map +1 -0
  101. package/dist/{host/host-entry.js → server/server-entry.js} +6 -6
  102. package/dist/server/server-entry.js.map +1 -0
  103. package/dist/{host/runner.d.ts → server/server.d.ts} +47 -39
  104. package/dist/{host/runner.js → server/server.js} +624 -535
  105. package/dist/server/server.js.map +1 -0
  106. package/dist/{host → server}/state.d.ts +25 -25
  107. package/dist/{host → server}/state.js +49 -49
  108. package/dist/server/state.js.map +1 -0
  109. package/dist/{host → server}/view.d.ts +7 -7
  110. package/dist/{host → server}/view.js +19 -15
  111. package/dist/server/view.js.map +1 -0
  112. package/dist/server/workflow-runner-content.d.ts +6 -0
  113. package/dist/server/workflow-runner-content.js +96 -0
  114. package/dist/server/workflow-runner-content.js.map +1 -0
  115. package/dist/server/workflow-runner-entry.d.ts +13 -0
  116. package/dist/{host/worker-entry.js → server/workflow-runner-entry.js} +89 -57
  117. package/dist/server/workflow-runner-entry.js.map +1 -0
  118. package/dist/server/workflow-runner-protocol.d.ts +69 -0
  119. package/dist/server/workflow-runner-protocol.js +176 -0
  120. package/dist/server/workflow-runner-protocol.js.map +1 -0
  121. package/dist/{host/worker-store.d.ts → server/workflow-runner-store.d.ts} +11 -11
  122. package/dist/{host/worker-store.js → server/workflow-runner-store.js} +8 -8
  123. package/dist/server/workflow-runner-store.js.map +1 -0
  124. package/dist/server/workflow-runner-supervisor.d.ts +22 -0
  125. package/dist/server/workflow-runner-supervisor.js +56 -0
  126. package/dist/server/workflow-runner-supervisor.js.map +1 -0
  127. package/dist/state/prune.d.ts +1 -1
  128. package/dist/state/prune.js +17 -10
  129. package/dist/state/prune.js.map +1 -1
  130. package/dist/state/schema.js +2 -2
  131. package/dist/state/workflow-messages.d.ts +3 -1
  132. package/dist/state/workflow-messages.js +32 -1
  133. package/dist/state/workflow-messages.js.map +1 -1
  134. package/dist/viewer/backup.js +1 -1
  135. package/dist/viewer/backup.js.map +1 -1
  136. package/dist/viewer/cli.d.ts +2 -2
  137. package/dist/viewer/cli.js +46 -32
  138. package/dist/viewer/cli.js.map +1 -1
  139. package/dist/viewer/tui.d.ts +1 -1
  140. package/dist/viewer/tui.js +1 -1
  141. package/dist/viewer/tui.js.map +1 -1
  142. package/dist/workflows/command-batch.js +2 -2
  143. package/dist/workflows/composition.js +0 -4
  144. package/dist/workflows/composition.js.map +1 -1
  145. package/dist/workflows/definition.js +0 -8
  146. package/dist/workflows/definition.js.map +1 -1
  147. package/dist/workflows/engine.js +18 -20
  148. package/dist/workflows/engine.js.map +1 -1
  149. package/dist/workflows/schema.js +0 -4
  150. package/dist/workflows/schema.js.map +1 -1
  151. package/dist/workflows/store.d.ts +27 -11
  152. package/dist/workflows/store.js +66 -18
  153. package/dist/workflows/store.js.map +1 -1
  154. package/dist/workflows/types.d.ts +3 -5
  155. package/docs/2026-08-20-durable-workflow-launch-plan.md +12 -12
  156. package/docs/2026-08-25-workflow-follow-ups.md +7 -7
  157. package/docs/2026-08-25-workflow-settings.md +3 -3
  158. package/docs/2026-08-30-out-of-process-workflow-host-plan.md +3 -3
  159. package/docs/2026-09-01-restore-session-delivery-controls-plan.md +5 -5
  160. package/docs/2026-09-01-unified-workflow-client-plan.md +6 -6
  161. package/docs/2026-09-02-installed-live-e2e-plan.md +3 -3
  162. package/docs/2026-09-02-unify-workflow-messages-plan.md +8 -8
  163. package/docs/2026-09-04-workflow-run-state-plan.md +363 -0
  164. package/docs/DEFERRED_TURNS.md +7 -7
  165. package/docs/DESIGN_PHILOSOPHY.md +1 -1
  166. package/docs/HUMAN_DECISIONS.md +11 -11
  167. package/docs/HUMAN_DECISION_PRESENTATIONS.md +4 -4
  168. package/docs/MONITOR.md +1 -1
  169. package/docs/RESOURCE_MANAGERS.md +221 -0
  170. package/docs/SQLITE_STATE.md +40 -34
  171. package/docs/WORKFLOW_COMPOSITION.md +1 -1
  172. package/docs/{WORKFLOW_HOST.md → WORKFLOW_SERVER.md} +131 -116
  173. package/docs/WORKFLOW_STEP_MESSAGES.md +18 -18
  174. package/docs/WORKFLOW_UPDATES.md +16 -16
  175. package/docs/development.md +15 -14
  176. package/docs/live-replay-protocol.md +20 -20
  177. package/docs/plans/2026-08-04-controller-runtime-plan.md +25 -25
  178. package/docs/plans/2026-08-05-always-on-workflows-plan.md +8 -8
  179. package/docs/plans/2026-08-10-agent-managed-monitor-workflows-plan.md +2 -2
  180. package/docs/plans/2026-08-13-session-addressed-workflow-notifications-plan.md +1 -1
  181. package/docs/plans/2026-08-16-workflow-updates-plan.md +5 -5
  182. package/docs/plans/2026-08-19-human-decision-gates-plan.md +1 -1
  183. package/docs/plans/2026-08-20-bounded-command-batches-plan.md +1 -1
  184. package/docs/plans/2026-08-21-deferred-turn-intents-plan.md +3 -3
  185. package/docs/plans/2026-08-21-sanity-check-plan.md +2 -2
  186. package/docs/plans/2026-08-23-assistant-agent-completion-plan.md +5 -5
  187. package/docs/plans/2026-08-23-sqlite-state-plan.md +25 -25
  188. package/docs/plans/2026-08-25-live-workflow-settings-plan.md +4 -4
  189. package/docs/plans/2026-08-27-workflow-terminal-restart-plan.md +3 -3
  190. package/docs/plans/2026-09-04-workflow-runner-resume-state-plan.md +318 -0
  191. package/docs/plans/piw-viewer-experience-implementation-plan.md +1 -1
  192. package/docs/tui-viewer.md +9 -9
  193. package/docs/workflows.md +78 -63
  194. package/examples/{controllers/pull-request.controller.ts → resource-managers/pull-request.resource-manager.ts} +12 -12
  195. package/herdr-plugin.toml +1 -1
  196. package/package.json +5 -5
  197. package/protocol/client.v1.schema.json +7 -7
  198. package/protocol/fixtures/client-v1.json +1 -1
  199. package/src/builtins/monitor.workflow.ts +9 -9
  200. package/src/builtins/pi-agent-group.ts +3 -3
  201. package/src/channels/adapter-entry.ts +14 -14
  202. package/src/client/client.ts +33 -32
  203. package/src/client/protocol.ts +16 -11
  204. package/src/client/resolver.ts +4 -4
  205. package/src/client/view.ts +9 -1
  206. package/src/extension/index.ts +81 -53
  207. package/src/extension/recorder.ts +1 -1
  208. package/src/extension/remote-recorder-store.ts +2 -2
  209. package/src/extension/resource-manager-command.ts +45 -0
  210. package/src/extension/session-delivery.ts +2 -2
  211. package/src/extension/session-view.ts +1 -1
  212. package/src/extension/workflow-message-coordinator.ts +94 -30
  213. package/src/{controllers → resource-managers}/conditions.ts +23 -23
  214. package/src/resource-managers/definition.ts +71 -0
  215. package/src/{controllers → resource-managers}/effects.ts +9 -9
  216. package/src/resource-managers/errors.ts +27 -0
  217. package/src/resource-managers/index.ts +88 -0
  218. package/src/resource-managers/loader.ts +111 -0
  219. package/src/{controllers → resource-managers}/results.ts +4 -4
  220. package/src/{controllers/manager.ts → resource-managers/runtime.ts} +95 -92
  221. package/src/{controllers → resource-managers}/sqlite.ts +275 -181
  222. package/src/{controllers → resource-managers}/store.ts +46 -38
  223. package/src/{controllers → resource-managers}/types.ts +50 -41
  224. package/src/{controllers → resource-managers}/workflows.ts +43 -41
  225. package/src/{host → server}/channel-supervisor.ts +8 -8
  226. package/src/{host/child-worker-supervisor.ts → server/child-runner-supervisor.ts} +22 -18
  227. package/src/{host → server}/processes.ts +3 -3
  228. package/src/{host → server}/resolver-entry.ts +28 -25
  229. package/src/{host/controller-worker-entry.ts → server/resource-runner-entry.ts} +67 -65
  230. package/src/server/resource-runner-protocol.ts +103 -0
  231. package/src/server/resource-runner-supervisor.ts +76 -0
  232. package/src/{host → server}/rpc-bridge.ts +3 -3
  233. package/src/{host → server}/rpc-executor.ts +4 -4
  234. package/src/{host/host-entry.ts → server/server-entry.ts} +5 -5
  235. package/src/{host/runner.ts → server/server.ts} +786 -672
  236. package/src/{host → server}/state.ts +78 -67
  237. package/src/{host → server}/view.ts +21 -17
  238. package/src/server/workflow-runner-content.ts +119 -0
  239. package/src/{host/worker-entry.ts → server/workflow-runner-entry.ts} +131 -82
  240. package/src/server/workflow-runner-protocol.ts +241 -0
  241. package/src/{host/worker-store.ts → server/workflow-runner-store.ts} +18 -20
  242. package/src/server/workflow-runner-supervisor.ts +79 -0
  243. package/src/state/prune.ts +27 -9
  244. package/src/state/schema.ts +2 -2
  245. package/src/state/workflow-messages.ts +52 -1
  246. package/src/viewer/backup.ts +1 -1
  247. package/src/viewer/cli.ts +50 -36
  248. package/src/viewer/tui.ts +1 -1
  249. package/src/workflows/command-batch.ts +2 -2
  250. package/src/workflows/composition.ts +0 -5
  251. package/src/workflows/definition.ts +0 -8
  252. package/src/workflows/engine.ts +18 -21
  253. package/src/workflows/schema.ts +0 -6
  254. package/src/workflows/store.ts +95 -28
  255. package/src/workflows/types.ts +3 -5
  256. package/dist/controllers/conditions.d.ts +0 -6
  257. package/dist/controllers/conditions.js.map +0 -1
  258. package/dist/controllers/definition.d.ts +0 -6
  259. package/dist/controllers/definition.js +0 -45
  260. package/dist/controllers/definition.js.map +0 -1
  261. package/dist/controllers/effects.d.ts +0 -15
  262. package/dist/controllers/effects.js.map +0 -1
  263. package/dist/controllers/errors.d.ts +0 -12
  264. package/dist/controllers/errors.js +0 -25
  265. package/dist/controllers/errors.js.map +0 -1
  266. package/dist/controllers/index.d.ts +0 -12
  267. package/dist/controllers/index.js +0 -12
  268. package/dist/controllers/index.js.map +0 -1
  269. package/dist/controllers/json.js.map +0 -1
  270. package/dist/controllers/loader.d.ts +0 -23
  271. package/dist/controllers/loader.js +0 -74
  272. package/dist/controllers/loader.js.map +0 -1
  273. package/dist/controllers/manager.d.ts +0 -59
  274. package/dist/controllers/manager.js.map +0 -1
  275. package/dist/controllers/results.d.ts +0 -5
  276. package/dist/controllers/results.js.map +0 -1
  277. package/dist/controllers/sqlite.js.map +0 -1
  278. package/dist/controllers/workflows.d.ts +0 -34
  279. package/dist/controllers/workflows.js.map +0 -1
  280. package/dist/extension/controller-command.js.map +0 -1
  281. package/dist/host/channel-effects.js.map +0 -1
  282. package/dist/host/channel-supervisor.js.map +0 -1
  283. package/dist/host/child-worker-supervisor.js.map +0 -1
  284. package/dist/host/controller-worker-entry.d.ts +0 -2
  285. package/dist/host/controller-worker-entry.js.map +0 -1
  286. package/dist/host/controller-worker-protocol.d.ts +0 -36
  287. package/dist/host/controller-worker-protocol.js +0 -49
  288. package/dist/host/controller-worker-protocol.js.map +0 -1
  289. package/dist/host/controller-worker-supervisor.d.ts +0 -21
  290. package/dist/host/controller-worker-supervisor.js +0 -54
  291. package/dist/host/controller-worker-supervisor.js.map +0 -1
  292. package/dist/host/host-entry.js.map +0 -1
  293. package/dist/host/processes.js.map +0 -1
  294. package/dist/host/resolver-entry.js.map +0 -1
  295. package/dist/host/rpc-bridge.js.map +0 -1
  296. package/dist/host/rpc-executor.js.map +0 -1
  297. package/dist/host/runner.js.map +0 -1
  298. package/dist/host/state.js.map +0 -1
  299. package/dist/host/view.js.map +0 -1
  300. package/dist/host/worker-entry.d.ts +0 -10
  301. package/dist/host/worker-entry.js.map +0 -1
  302. package/dist/host/worker-protocol.d.ts +0 -31
  303. package/dist/host/worker-protocol.js +0 -122
  304. package/dist/host/worker-protocol.js.map +0 -1
  305. package/dist/host/worker-store.js.map +0 -1
  306. package/dist/host/worker-supervisor.d.ts +0 -22
  307. package/dist/host/worker-supervisor.js.map +0 -1
  308. package/docs/CONTROLLERS.md +0 -217
  309. package/src/controllers/definition.ts +0 -65
  310. package/src/controllers/errors.ts +0 -27
  311. package/src/controllers/index.ts +0 -88
  312. package/src/controllers/loader.ts +0 -104
  313. package/src/extension/controller-command.ts +0 -45
  314. package/src/host/controller-worker-protocol.ts +0 -104
  315. package/src/host/controller-worker-supervisor.ts +0 -79
  316. package/src/host/worker-protocol.ts +0 -165
  317. package/src/host/worker-supervisor.ts +0 -74
  318. /package/dist/{controllers → resource-managers}/json.d.ts +0 -0
  319. /package/dist/{controllers → resource-managers}/json.js +0 -0
  320. /package/dist/{controllers → resource-managers}/results.js +0 -0
  321. /package/dist/{controllers → resource-managers}/store.js +0 -0
  322. /package/dist/{controllers → resource-managers}/types.js +0 -0
  323. /package/dist/{host → server}/channel-effects.d.ts +0 -0
  324. /package/dist/{host → server}/channel-effects.js +0 -0
  325. /package/dist/{host/host-entry.d.ts → server/server-entry.d.ts} +0 -0
  326. /package/src/{controllers → resource-managers}/json.ts +0 -0
  327. /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