@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.
Files changed (235) hide show
  1. package/README.md +78 -110
  2. package/dist/builtins/autoimplement.workflow.js +3 -1
  3. package/dist/builtins/autoimplement.workflow.js.map +1 -1
  4. package/dist/builtins/change-verification.workflow.js +7 -2
  5. package/dist/builtins/change-verification.workflow.js.map +1 -1
  6. package/dist/builtins/metadata.d.ts +22 -0
  7. package/dist/builtins/metadata.js +10 -0
  8. package/dist/builtins/metadata.js.map +1 -0
  9. package/dist/builtins/monitor.workflow.js +4 -1
  10. package/dist/builtins/monitor.workflow.js.map +1 -1
  11. package/dist/builtins/sanity-check.workflow.js +4 -1
  12. package/dist/builtins/sanity-check.workflow.js.map +1 -1
  13. package/dist/builtins/workspace-preparation.workflow.js +3 -1
  14. package/dist/builtins/workspace-preparation.workflow.js.map +1 -1
  15. package/dist/controllers/index.d.ts +0 -1
  16. package/dist/controllers/index.js +0 -1
  17. package/dist/controllers/index.js.map +1 -1
  18. package/dist/controllers/sqlite.d.ts +51 -0
  19. package/dist/controllers/sqlite.js +433 -57
  20. package/dist/controllers/sqlite.js.map +1 -1
  21. package/dist/controllers/store.d.ts +1 -0
  22. package/dist/extension/controller-command.d.ts +22 -0
  23. package/dist/extension/controller-command.js +32 -0
  24. package/dist/extension/controller-command.js.map +1 -0
  25. package/dist/extension/index.d.ts +2 -9
  26. package/dist/extension/index.js +876 -3447
  27. package/dist/extension/index.js.map +1 -1
  28. package/dist/extension/message-card.d.ts +13 -0
  29. package/dist/extension/message-card.js +46 -0
  30. package/dist/extension/message-card.js.map +1 -0
  31. package/dist/extension/step-message.d.ts +5 -6
  32. package/dist/extension/step-message.js +41 -52
  33. package/dist/extension/step-message.js.map +1 -1
  34. package/dist/host/child-worker-supervisor.d.ts +50 -0
  35. package/dist/host/child-worker-supervisor.js +159 -0
  36. package/dist/host/child-worker-supervisor.js.map +1 -0
  37. package/dist/host/client.d.ts +48 -0
  38. package/dist/host/client.js +216 -0
  39. package/dist/host/client.js.map +1 -0
  40. package/dist/host/controller-worker-entry.d.ts +2 -0
  41. package/dist/host/controller-worker-entry.js +244 -0
  42. package/dist/host/controller-worker-entry.js.map +1 -0
  43. package/dist/host/controller-worker-protocol.d.ts +36 -0
  44. package/dist/host/controller-worker-protocol.js +49 -0
  45. package/dist/host/controller-worker-protocol.js.map +1 -0
  46. package/dist/host/controller-worker-supervisor.d.ts +21 -0
  47. package/dist/host/controller-worker-supervisor.js +54 -0
  48. package/dist/host/controller-worker-supervisor.js.map +1 -0
  49. package/dist/host/host-entry.d.ts +2 -0
  50. package/dist/host/host-entry.js +23 -0
  51. package/dist/host/host-entry.js.map +1 -0
  52. package/dist/host/processes.d.ts +17 -12
  53. package/dist/host/processes.js +154 -50
  54. package/dist/host/processes.js.map +1 -1
  55. package/dist/host/protocol.d.ts +38 -0
  56. package/dist/host/protocol.js +156 -0
  57. package/dist/host/protocol.js.map +1 -0
  58. package/dist/host/resolver-entry.d.ts +49 -0
  59. package/dist/host/resolver-entry.js +149 -0
  60. package/dist/host/resolver-entry.js.map +1 -0
  61. package/dist/host/rpc-executor.d.ts +14 -3
  62. package/dist/host/rpc-executor.js +63 -30
  63. package/dist/host/rpc-executor.js.map +1 -1
  64. package/dist/host/runner.d.ts +95 -29
  65. package/dist/host/runner.js +2311 -348
  66. package/dist/host/runner.js.map +1 -1
  67. package/dist/host/state.d.ts +174 -0
  68. package/dist/host/state.js +689 -0
  69. package/dist/host/state.js.map +1 -0
  70. package/dist/host/worker-entry.d.ts +10 -0
  71. package/dist/host/worker-entry.js +446 -0
  72. package/dist/host/worker-entry.js.map +1 -0
  73. package/dist/host/worker-protocol.d.ts +31 -0
  74. package/dist/host/worker-protocol.js +122 -0
  75. package/dist/host/worker-protocol.js.map +1 -0
  76. package/dist/host/worker-store.d.ts +80 -0
  77. package/dist/host/worker-store.js +91 -0
  78. package/dist/host/worker-store.js.map +1 -0
  79. package/dist/host/worker-supervisor.d.ts +22 -0
  80. package/dist/host/worker-supervisor.js +54 -0
  81. package/dist/host/worker-supervisor.js.map +1 -0
  82. package/dist/render/canvas.d.ts +2 -1
  83. package/dist/render/canvas.js +40 -15
  84. package/dist/render/canvas.js.map +1 -1
  85. package/dist/render/graph-render.d.ts +7 -3
  86. package/dist/render/graph-render.js +125 -74
  87. package/dist/render/graph-render.js.map +1 -1
  88. package/dist/state/database.js +3 -1
  89. package/dist/state/database.js.map +1 -1
  90. package/dist/state/index.d.ts +1 -0
  91. package/dist/state/index.js +1 -0
  92. package/dist/state/index.js.map +1 -1
  93. package/dist/state/schema.d.ts +1 -1
  94. package/dist/state/schema.js +171 -3
  95. package/dist/state/schema.js.map +1 -1
  96. package/dist/state/viewer.d.ts +46 -0
  97. package/dist/state/viewer.js +249 -0
  98. package/dist/state/viewer.js.map +1 -0
  99. package/dist/viewer/cli.d.ts +1 -1
  100. package/dist/viewer/cli.js +47 -18
  101. package/dist/viewer/cli.js.map +1 -1
  102. package/dist/workflows/composition.js +25 -2
  103. package/dist/workflows/composition.js.map +1 -1
  104. package/dist/workflows/definition.d.ts +3 -1
  105. package/dist/workflows/definition.js +25 -0
  106. package/dist/workflows/definition.js.map +1 -1
  107. package/dist/workflows/engine.d.ts +1 -0
  108. package/dist/workflows/engine.js +157 -42
  109. package/dist/workflows/engine.js.map +1 -1
  110. package/dist/workflows/errors.d.ts +3 -1
  111. package/dist/workflows/errors.js +4 -7
  112. package/dist/workflows/errors.js.map +1 -1
  113. package/dist/workflows/human-decision.d.ts +3 -0
  114. package/dist/workflows/human-decision.js +31 -0
  115. package/dist/workflows/human-decision.js.map +1 -1
  116. package/dist/workflows/index.d.ts +1 -1
  117. package/dist/workflows/index.js +1 -1
  118. package/dist/workflows/index.js.map +1 -1
  119. package/dist/workflows/schema.js +17 -6
  120. package/dist/workflows/schema.js.map +1 -1
  121. package/dist/{viewer → workflows}/session-reducer.d.ts +3 -1
  122. package/dist/{viewer → workflows}/session-reducer.js +4 -0
  123. package/dist/workflows/session-reducer.js.map +1 -0
  124. package/dist/workflows/store.d.ts +87 -1
  125. package/dist/workflows/store.js +892 -93
  126. package/dist/workflows/store.js.map +1 -1
  127. package/dist/workflows/tool-input.d.ts +0 -26
  128. package/dist/workflows/tool-input.js +2 -50
  129. package/dist/workflows/tool-input.js.map +1 -1
  130. package/dist/workflows/types.d.ts +36 -4
  131. package/docs/2026-08-30-out-of-process-workflow-host-plan.md +353 -0
  132. package/docs/CONTROLLERS.md +11 -11
  133. package/docs/DEFERRED_TURNS.md +23 -2
  134. package/docs/SQLITE_STATE.md +41 -31
  135. package/docs/WORKFLOW_HOST.md +452 -0
  136. package/docs/development.md +46 -30
  137. package/docs/live-replay-protocol.md +129 -100
  138. package/docs/plans/2026-08-27-workflow-terminal-restart-plan.md +42 -0
  139. package/docs/plans/2026-08-28-piw-incremental-viewer-plan.md +293 -0
  140. package/docs/plans/piw-viewer-experience-implementation-plan.md +11 -1
  141. package/docs/plans/tui-viewer-implementation-plan.md +5 -0
  142. package/docs/tui-viewer.md +18 -3
  143. package/docs/workflows.md +162 -210
  144. package/examples/workflows/command-batch.workflow.ts +2 -0
  145. package/examples/workflows/shell.workflow.ts +2 -1
  146. package/herdr-plugin.toml +1 -1
  147. package/package.json +1 -1
  148. package/src/builtins/autoimplement.workflow.ts +3 -0
  149. package/src/builtins/change-verification.workflow.ts +7 -2
  150. package/src/builtins/metadata.ts +9 -0
  151. package/src/builtins/monitor.workflow.ts +4 -0
  152. package/src/builtins/sanity-check.workflow.ts +4 -0
  153. package/src/builtins/workspace-preparation.workflow.ts +3 -1
  154. package/src/controllers/index.ts +0 -5
  155. package/src/controllers/sqlite.ts +709 -76
  156. package/src/controllers/store.ts +1 -0
  157. package/src/extension/controller-command.ts +45 -0
  158. package/src/extension/index.ts +944 -4163
  159. package/src/extension/message-card.ts +61 -0
  160. package/src/extension/step-message.ts +58 -63
  161. package/src/host/child-worker-supervisor.ts +183 -0
  162. package/src/host/client.ts +293 -0
  163. package/src/host/controller-worker-entry.ts +311 -0
  164. package/src/host/controller-worker-protocol.ts +104 -0
  165. package/src/host/controller-worker-supervisor.ts +79 -0
  166. package/src/host/host-entry.ts +23 -0
  167. package/src/host/processes.ts +171 -54
  168. package/src/host/protocol.ts +196 -0
  169. package/src/host/resolver-entry.ts +241 -0
  170. package/src/host/rpc-executor.ts +76 -34
  171. package/src/host/runner.ts +2813 -422
  172. package/src/host/state.ts +1160 -0
  173. package/src/host/worker-entry.ts +533 -0
  174. package/src/host/worker-protocol.ts +165 -0
  175. package/src/host/worker-store.ts +229 -0
  176. package/src/host/worker-supervisor.ts +74 -0
  177. package/src/render/canvas.ts +44 -10
  178. package/src/render/graph-render.ts +145 -90
  179. package/src/state/database.ts +2 -1
  180. package/src/state/index.ts +14 -0
  181. package/src/state/schema.ts +171 -3
  182. package/src/state/viewer.ts +356 -0
  183. package/src/viewer/cli.ts +49 -17
  184. package/src/workflows/composition.ts +36 -2
  185. package/src/workflows/definition.ts +32 -0
  186. package/src/workflows/engine.ts +157 -54
  187. package/src/workflows/errors.ts +11 -2
  188. package/src/workflows/human-decision.ts +49 -0
  189. package/src/workflows/index.ts +2 -0
  190. package/src/workflows/schema.ts +19 -6
  191. package/src/{viewer → workflows}/session-reducer.ts +11 -1
  192. package/src/workflows/store.ts +1316 -108
  193. package/src/workflows/tool-input.ts +3 -69
  194. package/src/workflows/types.ts +32 -4
  195. package/dist/controllers/workflow-engine-scheduler.d.ts +0 -29
  196. package/dist/controllers/workflow-engine-scheduler.js +0 -175
  197. package/dist/controllers/workflow-engine-scheduler.js.map +0 -1
  198. package/dist/extension/controller-host.d.ts +0 -48
  199. package/dist/extension/controller-host.js +0 -110
  200. package/dist/extension/controller-host.js.map +0 -1
  201. package/dist/extension/deferred-turn-coordinator.d.ts +0 -32
  202. package/dist/extension/deferred-turn-coordinator.js +0 -143
  203. package/dist/extension/deferred-turn-coordinator.js.map +0 -1
  204. package/dist/extension/deferred-turn.d.ts +0 -44
  205. package/dist/extension/deferred-turn.js +0 -110
  206. package/dist/extension/deferred-turn.js.map +0 -1
  207. package/dist/extension/executor.d.ts +0 -86
  208. package/dist/extension/executor.js +0 -311
  209. package/dist/extension/executor.js.map +0 -1
  210. package/dist/extension/follow-up-coordinator.d.ts +0 -27
  211. package/dist/extension/follow-up-coordinator.js +0 -131
  212. package/dist/extension/follow-up-coordinator.js.map +0 -1
  213. package/dist/extension/recorder.d.ts +0 -84
  214. package/dist/extension/recorder.js +0 -528
  215. package/dist/extension/recorder.js.map +0 -1
  216. package/dist/extension/restart-policy.d.ts +0 -38
  217. package/dist/extension/restart-policy.js +0 -116
  218. package/dist/extension/restart-policy.js.map +0 -1
  219. package/dist/extension/session-events.d.ts +0 -133
  220. package/dist/extension/session-events.js +0 -61
  221. package/dist/extension/session-events.js.map +0 -1
  222. package/dist/extension/terminal-decision.d.ts +0 -51
  223. package/dist/extension/terminal-decision.js +0 -110
  224. package/dist/extension/terminal-decision.js.map +0 -1
  225. package/dist/viewer/session-reducer.js.map +0 -1
  226. package/src/controllers/workflow-engine-scheduler.ts +0 -246
  227. package/src/extension/controller-host.ts +0 -167
  228. package/src/extension/deferred-turn-coordinator.ts +0 -171
  229. package/src/extension/deferred-turn.ts +0 -166
  230. package/src/extension/executor.ts +0 -411
  231. package/src/extension/follow-up-coordinator.ts +0 -151
  232. package/src/extension/recorder.ts +0 -655
  233. package/src/extension/restart-policy.ts +0 -163
  234. package/src/extension/session-events.ts +0 -121
  235. package/src/extension/terminal-decision.ts +0 -172
@@ -1,103 +1,207 @@
1
+ import { execFileSync } from "node:child_process";
1
2
  import fs from "node:fs";
2
3
  import path from "node:path";
3
4
  /**
4
- * Tracks headless child processes (spawned `pi --mode rpc` sessions) so a
5
- * killed host never leaves orphans working. Children spawn in their own
6
- * process group; the registry file lets a later host reap leftovers by
7
- * killing the whole group. The file lives next to the project store and is
8
- * only ever touched by one host at a time (the advisory lock ensures it).
5
+ * Tracks supervised process groups by PID and operating-system start identity.
6
+ * A later host kills a recorded process only when both values still match.
9
7
  */
10
8
  export class HostProcessRegistry {
11
9
  filePath;
12
- pids = new Set();
10
+ processes = new Map();
13
11
  constructor(storeDir) {
14
12
  this.filePath = path.join(storeDir, "host.children.json");
15
13
  }
16
14
  register(pid) {
17
- this.pids.add(pid);
15
+ const startIdentity = processStartIdentity(pid);
16
+ if (startIdentity === undefined) {
17
+ throw new Error(`Cannot attest supervised process start identity: ${pid}`);
18
+ }
19
+ const identity = { pid, startIdentity };
20
+ this.processes.set(pid, identity);
18
21
  this.persist();
22
+ return identity;
19
23
  }
20
24
  unregister(pid) {
21
- this.pids.delete(pid);
25
+ this.processes.delete(pid);
22
26
  this.persist();
23
27
  }
24
28
  get size() {
25
- return this.pids.size;
29
+ return this.processes.size;
30
+ }
31
+ /** Kill one exact registered process group and remove its durable record. */
32
+ kill(pid) {
33
+ const identity = this.processes.get(pid);
34
+ if (identity === undefined)
35
+ return false;
36
+ if (matchesProcessIdentity(identity)) {
37
+ killProcessGroup(identity.pid, "SIGTERM");
38
+ if (matchesProcessIdentity(identity))
39
+ killProcessGroup(identity.pid, "SIGKILL");
40
+ }
41
+ this.processes.delete(pid);
42
+ this.persist();
43
+ return true;
26
44
  }
27
- /** Kill every registered child's process group, escalating to SIGKILL. */
45
+ /** Kill every process that still has its registered start identity. */
28
46
  killAll() {
29
- for (const pid of this.pids) {
30
- killProcessGroup(pid, "SIGTERM");
47
+ for (const identity of this.processes.values()) {
48
+ if (matchesProcessIdentity(identity))
49
+ killProcessGroup(identity.pid, "SIGTERM");
31
50
  }
32
- for (const pid of this.pids) {
33
- killProcessGroup(pid, "SIGKILL");
51
+ for (const identity of this.processes.values()) {
52
+ if (matchesProcessIdentity(identity))
53
+ killProcessGroup(identity.pid, "SIGKILL");
34
54
  }
35
- this.pids.clear();
55
+ this.processes.clear();
36
56
  this.persist();
37
57
  }
38
- /**
39
- * Reap children recorded by a previous host that died without cleanup.
40
- * Called once at host start, before the lock is taken.
41
- */
58
+ /** Reap only exact stale process identities recorded by an older host. */
42
59
  reapOrphans() {
43
60
  const recorded = this.readFile();
44
61
  const reaped = [];
45
62
  const stillAlive = [];
46
- for (const pid of recorded) {
47
- if (isAlive(pid)) {
48
- killProcessGroup(pid, "SIGKILL");
49
- reaped.push(pid);
50
- if (isAlive(pid)) {
51
- // A group kill that left the leader alive stays registered so a
52
- // later start tries again instead of forgetting it.
53
- stillAlive.push(pid);
54
- }
55
- }
56
- }
57
- this.pids.clear();
58
- for (const pid of stillAlive) {
59
- this.pids.add(pid);
63
+ for (const identity of recorded) {
64
+ if (!matchesProcessIdentity(identity))
65
+ continue;
66
+ killProcessGroup(identity.pid, "SIGKILL");
67
+ reaped.push(identity.pid);
68
+ if (matchesProcessIdentity(identity))
69
+ stillAlive.push(identity);
60
70
  }
71
+ this.processes.clear();
72
+ for (const identity of stillAlive)
73
+ this.processes.set(identity.pid, identity);
61
74
  this.persist();
62
75
  return reaped;
63
76
  }
64
77
  readFile() {
65
78
  try {
66
79
  const parsed = JSON.parse(fs.readFileSync(this.filePath, "utf8"));
67
- if (!Array.isArray(parsed)) {
80
+ if (!isRegistryFile(parsed))
68
81
  return [];
69
- }
70
- return parsed.filter((pid) => Number.isSafeInteger(pid) && pid > 0);
82
+ return parsed.processes;
71
83
  }
72
84
  catch {
73
85
  return [];
74
86
  }
75
87
  }
76
88
  persist() {
89
+ fs.mkdirSync(path.dirname(this.filePath), { recursive: true, mode: 0o700 });
90
+ const file = {
91
+ schema: "pi-workflows.process-registry.v1",
92
+ processes: [...this.processes.values()].sort((left, right) => left.pid - right.pid),
93
+ };
94
+ const temporary = `${this.filePath}.${process.pid}.tmp`;
95
+ fs.writeFileSync(temporary, `${JSON.stringify(file)}\n`, { encoding: "utf8", mode: 0o600 });
96
+ fs.renameSync(temporary, this.filePath);
97
+ fs.chmodSync(this.filePath, 0o600);
98
+ }
99
+ }
100
+ /** Return the operating-system parent PID for a live process. */
101
+ export function processParentPid(pid) {
102
+ if (!Number.isSafeInteger(pid) || pid <= 0)
103
+ return undefined;
104
+ if (process.platform === "linux") {
77
105
  try {
78
- fs.mkdirSync(path.dirname(this.filePath), { recursive: true, mode: 0o700 });
79
- // Write exactly the live set. Unioning with the previous file would
80
- // resurrect exited pids, and a later host reaping them could kill an
81
- // unrelated process group that reused one.
82
- fs.writeFileSync(this.filePath, `${JSON.stringify([...this.pids])}\n`, {
83
- encoding: "utf8",
84
- mode: 0o600,
85
- });
106
+ const fields = linuxStatFields(pid);
107
+ const parentPid = Number(fields[1]);
108
+ return Number.isSafeInteger(parentPid) && parentPid > 0 ? parentPid : undefined;
86
109
  }
87
110
  catch {
88
- // Registry bookkeeping is best-effort; orphan reaping is the backstop.
111
+ return undefined;
89
112
  }
90
113
  }
114
+ if (process.platform === "win32") {
115
+ try {
116
+ const parentPid = Number(execFileSync("powershell.exe", [
117
+ "-NoProfile",
118
+ "-NonInteractive",
119
+ "-Command",
120
+ `(Get-CimInstance Win32_Process -Filter "ProcessId = ${pid}").ParentProcessId`,
121
+ ], { encoding: "utf8", timeout: 2_000, windowsHide: true }).trim());
122
+ return Number.isSafeInteger(parentPid) && parentPid > 0 ? parentPid : undefined;
123
+ }
124
+ catch {
125
+ return undefined;
126
+ }
127
+ }
128
+ try {
129
+ const parentPid = Number(execFileSync("ps", ["-o", "ppid=", "-p", String(pid)], {
130
+ encoding: "utf8",
131
+ timeout: 2_000,
132
+ }).trim());
133
+ return Number.isSafeInteger(parentPid) && parentPid > 0 ? parentPid : undefined;
134
+ }
135
+ catch {
136
+ return undefined;
137
+ }
91
138
  }
92
- function isAlive(pid) {
139
+ /** Return an operating-system process start value that fences PID reuse. */
140
+ export function processStartIdentity(pid) {
141
+ if (!Number.isSafeInteger(pid) || pid <= 0)
142
+ return undefined;
143
+ if (process.platform === "linux") {
144
+ try {
145
+ const startTicks = linuxStatFields(pid)[19];
146
+ if (startTicks !== undefined)
147
+ return `linux-proc-start:${startTicks}`;
148
+ }
149
+ catch {
150
+ return undefined;
151
+ }
152
+ }
153
+ if (process.platform === "win32") {
154
+ try {
155
+ const ticks = execFileSync("powershell.exe", [
156
+ "-NoProfile",
157
+ "-NonInteractive",
158
+ "-Command",
159
+ `(Get-Process -Id ${pid} -ErrorAction Stop).StartTime.ToUniversalTime().Ticks`,
160
+ ], { encoding: "utf8", timeout: 2_000, windowsHide: true }).trim();
161
+ return ticks.length === 0 ? undefined : `windows-start-ticks:${ticks}`;
162
+ }
163
+ catch {
164
+ return undefined;
165
+ }
166
+ }
93
167
  try {
94
- process.kill(pid, 0);
95
- return true;
168
+ const started = execFileSync("ps", ["-o", "lstart=", "-p", String(pid)], {
169
+ encoding: "utf8",
170
+ timeout: 2_000,
171
+ }).trim();
172
+ return started.length === 0 ? undefined : `${process.platform}-ps-start:${started}`;
96
173
  }
97
174
  catch {
98
- return false;
175
+ return undefined;
99
176
  }
100
177
  }
178
+ function linuxStatFields(pid) {
179
+ const stat = fs.readFileSync(`/proc/${pid}/stat`, "utf8");
180
+ const commandEnd = stat.lastIndexOf(")");
181
+ if (commandEnd < 0)
182
+ throw new Error(`Linux process stat is invalid: ${pid}`);
183
+ return stat
184
+ .slice(commandEnd + 2)
185
+ .trim()
186
+ .split(/\s+/);
187
+ }
188
+ export function matchesProcessIdentity(identity) {
189
+ return processStartIdentity(identity.pid) === identity.startIdentity;
190
+ }
191
+ function isRegistryFile(value) {
192
+ if (!isRecord(value) || value.schema !== "pi-workflows.process-registry.v1")
193
+ return false;
194
+ if (!Array.isArray(value.processes))
195
+ return false;
196
+ return value.processes.every((entry) => isRecord(entry) &&
197
+ Number.isSafeInteger(entry.pid) &&
198
+ entry.pid > 0 &&
199
+ typeof entry.startIdentity === "string" &&
200
+ entry.startIdentity.length > 0);
201
+ }
202
+ function isRecord(value) {
203
+ return typeof value === "object" && value !== null && !Array.isArray(value);
204
+ }
101
205
  function killProcessGroup(pid, signal) {
102
206
  try {
103
207
  process.kill(-pid, signal);
@@ -107,7 +211,7 @@ function killProcessGroup(pid, signal) {
107
211
  process.kill(pid, signal);
108
212
  }
109
213
  catch {
110
- // Already gone.
214
+ // The exact process has already exited.
111
215
  }
112
216
  }
113
217
  }
@@ -1 +1 @@
1
- {"version":3,"file":"processes.js","sourceRoot":"","sources":["../../src/host/processes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"processes.js","sourceRoot":"","sources":["../../src/host/processes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type JsonValue } from "../state/json.js";
2
+ export declare const HOST_PROTOCOL_VERSION = 1;
3
+ export declare const HOST_REQUEST_SCHEMA: "pi-workflows.host-request.v1";
4
+ export declare const HOST_RESPONSE_SCHEMA: "pi-workflows.host-response.v1";
5
+ export declare const MAX_PROTOCOL_MESSAGE_BYTES: number;
6
+ export declare const HOST_OPERATIONS: readonly ["run.start", "run.pause", "run.resume", "run.cancel", "run.status", "run.list", "checkpoint.answer", "decision.answer", "interaction.submit", "interaction.update", "notification.claim", "notification.deliver", "turn.claim", "turn.resolve", "controller.list", "controller.get", "controller.apply", "controller.reconcile", "controller.delete", "host.status", "host.stop"];
7
+ export type HostOperation = (typeof HOST_OPERATIONS)[number];
8
+ export type HostOutcome = "accepted" | "adopted" | "rejected" | "conflict" | "notFound" | "claimLost" | "unavailable";
9
+ export type HostRequest = {
10
+ schema: typeof HOST_REQUEST_SCHEMA;
11
+ requestId: string;
12
+ clientId: string;
13
+ operation: HostOperation;
14
+ idempotencyKey: string;
15
+ runId?: string;
16
+ expectedRevision?: number;
17
+ payload: JsonValue;
18
+ };
19
+ export type HostResponse = {
20
+ schema: typeof HOST_RESPONSE_SCHEMA;
21
+ requestId: string;
22
+ outcome: HostOutcome;
23
+ revision?: number;
24
+ receipt?: JsonValue;
25
+ error?: string;
26
+ };
27
+ export declare class HostProtocolError extends Error {
28
+ constructor(message: string);
29
+ }
30
+ export declare function encodeProtocolLine(message: HostRequest | HostResponse): Buffer;
31
+ export declare function parseHostRequest(line: string | Buffer): HostRequest;
32
+ export declare function parseHostResponse(line: string | Buffer): HostResponse;
33
+ export declare function requestFingerprint(request: HostRequest): Buffer;
34
+ export declare function hostSocketPath(databasePath: string): string;
35
+ export declare class NdjsonFrameDecoder {
36
+ private buffered;
37
+ push(chunk: Buffer): Buffer[];
38
+ }
@@ -0,0 +1,156 @@
1
+ import { createHash } from "node:crypto";
2
+ import path from "node:path";
3
+ import { canonicalJson, parseJson } from "../state/json.js";
4
+ export const HOST_PROTOCOL_VERSION = 1;
5
+ export const HOST_REQUEST_SCHEMA = "pi-workflows.host-request.v1";
6
+ export const HOST_RESPONSE_SCHEMA = "pi-workflows.host-response.v1";
7
+ export const MAX_PROTOCOL_MESSAGE_BYTES = 1024 * 1024;
8
+ export const HOST_OPERATIONS = [
9
+ "run.start",
10
+ "run.pause",
11
+ "run.resume",
12
+ "run.cancel",
13
+ "run.status",
14
+ "run.list",
15
+ "checkpoint.answer",
16
+ "decision.answer",
17
+ "interaction.submit",
18
+ "interaction.update",
19
+ "notification.claim",
20
+ "notification.deliver",
21
+ "turn.claim",
22
+ "turn.resolve",
23
+ "controller.list",
24
+ "controller.get",
25
+ "controller.apply",
26
+ "controller.reconcile",
27
+ "controller.delete",
28
+ "host.status",
29
+ "host.stop",
30
+ ];
31
+ export class HostProtocolError extends Error {
32
+ constructor(message) {
33
+ super(message);
34
+ this.name = "HostProtocolError";
35
+ }
36
+ }
37
+ export function encodeProtocolLine(message) {
38
+ const encoded = Buffer.from(`${canonicalJson(message)}\n`, "utf8");
39
+ if (encoded.byteLength > MAX_PROTOCOL_MESSAGE_BYTES) {
40
+ throw new HostProtocolError("Host protocol message exceeds 1 MiB");
41
+ }
42
+ return encoded;
43
+ }
44
+ export function parseHostRequest(line) {
45
+ const value = parseProtocolValue(line);
46
+ if (value.schema !== HOST_REQUEST_SCHEMA)
47
+ throw new HostProtocolError("Invalid host request schema");
48
+ requireOpaqueId(value.requestId, "requestId");
49
+ requireOpaqueId(value.clientId, "clientId");
50
+ requireOpaqueId(value.idempotencyKey, "idempotencyKey");
51
+ if (!HOST_OPERATIONS.includes(value.operation)) {
52
+ throw new HostProtocolError("Invalid host request operation");
53
+ }
54
+ if (value.runId !== undefined)
55
+ requireOpaqueId(value.runId, "runId");
56
+ if (value.expectedRevision !== undefined &&
57
+ (!Number.isSafeInteger(value.expectedRevision) || value.expectedRevision < 0)) {
58
+ throw new HostProtocolError("Host request expectedRevision must be a non-negative integer");
59
+ }
60
+ if (!Object.hasOwn(value, "payload"))
61
+ throw new HostProtocolError("Host request payload is required");
62
+ canonicalJson(value.payload);
63
+ return value;
64
+ }
65
+ export function parseHostResponse(line) {
66
+ const value = parseProtocolValue(line);
67
+ if (value.schema !== HOST_RESPONSE_SCHEMA) {
68
+ throw new HostProtocolError("Invalid host response schema");
69
+ }
70
+ requireOpaqueId(value.requestId, "requestId");
71
+ const outcomes = [
72
+ "accepted",
73
+ "adopted",
74
+ "rejected",
75
+ "conflict",
76
+ "notFound",
77
+ "claimLost",
78
+ "unavailable",
79
+ ];
80
+ if (!outcomes.includes(value.outcome)) {
81
+ throw new HostProtocolError("Invalid host response outcome");
82
+ }
83
+ if (value.revision !== undefined &&
84
+ (!Number.isSafeInteger(value.revision) || value.revision < 0)) {
85
+ throw new HostProtocolError("Host response revision must be a non-negative integer");
86
+ }
87
+ if (value.error !== undefined && typeof value.error !== "string") {
88
+ throw new HostProtocolError("Host response error must be text");
89
+ }
90
+ if (value.receipt !== undefined)
91
+ canonicalJson(value.receipt);
92
+ return value;
93
+ }
94
+ export function requestFingerprint(request) {
95
+ return createHash("sha256").update(canonicalJson(request)).digest();
96
+ }
97
+ export function hostSocketPath(databasePath) {
98
+ const stateDirectory = path.dirname(path.resolve(databasePath));
99
+ if (process.platform === "win32") {
100
+ const suffix = createHash("sha256").update(stateDirectory).digest("hex").slice(0, 24);
101
+ return `\\\\.\\pipe\\pi-workflows-${suffix}`;
102
+ }
103
+ return path.join(stateDirectory, "host", "host.sock");
104
+ }
105
+ export class NdjsonFrameDecoder {
106
+ buffered = Buffer.alloc(0);
107
+ push(chunk) {
108
+ this.buffered = Buffer.concat([this.buffered, chunk]);
109
+ if (this.buffered.byteLength > MAX_PROTOCOL_MESSAGE_BYTES && !this.buffered.includes(0x0a)) {
110
+ throw new HostProtocolError("Host protocol message exceeds 1 MiB");
111
+ }
112
+ const frames = [];
113
+ for (;;) {
114
+ const newline = this.buffered.indexOf(0x0a);
115
+ if (newline < 0)
116
+ break;
117
+ const frame = this.buffered.subarray(0, newline);
118
+ this.buffered = this.buffered.subarray(newline + 1);
119
+ if (frame.byteLength === 0)
120
+ continue;
121
+ if (frame.byteLength + 1 > MAX_PROTOCOL_MESSAGE_BYTES) {
122
+ throw new HostProtocolError("Host protocol message exceeds 1 MiB");
123
+ }
124
+ frames.push(frame);
125
+ }
126
+ return frames;
127
+ }
128
+ }
129
+ function parseProtocolValue(line) {
130
+ const buffer = Buffer.isBuffer(line) ? line : Buffer.from(line, "utf8");
131
+ if (buffer.byteLength + 1 > MAX_PROTOCOL_MESSAGE_BYTES) {
132
+ throw new HostProtocolError("Host protocol message exceeds 1 MiB");
133
+ }
134
+ let value;
135
+ try {
136
+ value = parseJson(buffer.toString("utf8"));
137
+ }
138
+ catch {
139
+ throw new HostProtocolError("Host protocol message is not valid canonical JSON");
140
+ }
141
+ if (!isRecord(value))
142
+ throw new HostProtocolError("Host protocol message must be an object");
143
+ if (canonicalJson(value) !== buffer.toString("utf8")) {
144
+ throw new HostProtocolError("Host protocol message must use canonical JSON");
145
+ }
146
+ return value;
147
+ }
148
+ function requireOpaqueId(value, field) {
149
+ if (typeof value !== "string" || value.length === 0 || value.length > 256) {
150
+ throw new HostProtocolError(`Host request ${field} must be nonempty text of at most 256 bytes`);
151
+ }
152
+ }
153
+ function isRecord(value) {
154
+ return typeof value === "object" && value !== null && !Array.isArray(value);
155
+ }
156
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/host/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env node
2
+ import { type JsonValue } from "../state/json.js";
3
+ export type ResolvedWorkflowLaunch = {
4
+ schema: "pi-workflows.resolved-launch.v1";
5
+ workflowName: string;
6
+ workflowSourceRef: string;
7
+ workflowSource: JsonValue;
8
+ definitionDigest: string;
9
+ definitionSnapshot: JsonValue;
10
+ };
11
+ export type ResolvedControllerInitialization = {
12
+ schema: "pi-workflows.resolved-controller-initialization.v1";
13
+ controllerName: string;
14
+ controllerPath: string;
15
+ sourceHash: string;
16
+ initialStatus: JsonValue;
17
+ };
18
+ export type ResolvedSettingsChange = {
19
+ schema: "pi-workflows.resolved-settings-change.v1";
20
+ definitionDigest: string;
21
+ patch: JsonValue;
22
+ settings: JsonValue;
23
+ paths: JsonValue;
24
+ };
25
+ type ResolverRequest = {
26
+ schema: "pi-workflows.resolve-request.v1";
27
+ cwd: string;
28
+ workflowRef: string;
29
+ };
30
+ type SettingsValidationRequest = {
31
+ schema: "pi-workflows.settings-validation-request.v1";
32
+ cwd: string;
33
+ workflowRef: string;
34
+ definitionDigest: string;
35
+ mountPath: string;
36
+ current: JsonValue;
37
+ patch: JsonValue;
38
+ actorId: string;
39
+ };
40
+ type ControllerInitializationRequest = {
41
+ schema: "pi-workflows.controller-initialization-request.v1";
42
+ cwd: string;
43
+ controllerName: string;
44
+ spec: JsonValue;
45
+ };
46
+ export declare function resolveWorkflowLaunch(request: ResolverRequest): Promise<ResolvedWorkflowLaunch>;
47
+ export declare function resolveControllerInitialization(request: ControllerInitializationRequest): Promise<ResolvedControllerInitialization>;
48
+ export declare function resolveSettingsChange(request: SettingsValidationRequest): Promise<ResolvedSettingsChange>;
49
+ export {};