@osolmaz/pi-workflows 0.12.1 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/README.md +52 -28
  2. package/dist/builtins/autodoc.workflow.d.ts +4 -4
  3. package/dist/builtins/autoimplement.workflow.d.ts +369 -73
  4. package/dist/builtins/autoplan.workflow.d.ts +126 -13
  5. package/dist/builtins/autoplan.workflow.js +200 -29
  6. package/dist/builtins/autoplan.workflow.js.map +1 -1
  7. package/dist/builtins/catalog.js +6 -4
  8. package/dist/builtins/catalog.js.map +1 -1
  9. package/dist/builtins/index.d.ts +2 -1
  10. package/dist/builtins/index.js +1 -0
  11. package/dist/builtins/index.js.map +1 -1
  12. package/dist/builtins/monitor.workflow.d.ts +56 -21
  13. package/dist/builtins/monitor.workflow.js +497 -216
  14. package/dist/builtins/monitor.workflow.js.map +1 -1
  15. package/dist/builtins/plain-summary.workflow.d.ts +32 -0
  16. package/dist/builtins/plain-summary.workflow.js +134 -0
  17. package/dist/builtins/plain-summary.workflow.js.map +1 -0
  18. package/dist/builtins/plan-change.workflow.d.ts +170 -22
  19. package/dist/builtins/sanity-check.workflow.d.ts +45 -3
  20. package/dist/builtins/sanity-check.workflow.js +45 -7
  21. package/dist/builtins/sanity-check.workflow.js.map +1 -1
  22. package/dist/controllers/effects.d.ts +3 -2
  23. package/dist/controllers/effects.js +8 -1
  24. package/dist/controllers/effects.js.map +1 -1
  25. package/dist/controllers/index.d.ts +1 -1
  26. package/dist/controllers/index.js +1 -1
  27. package/dist/controllers/index.js.map +1 -1
  28. package/dist/controllers/manager.d.ts +1 -0
  29. package/dist/controllers/manager.js +41 -17
  30. package/dist/controllers/manager.js.map +1 -1
  31. package/dist/controllers/sqlite.d.ts +107 -85
  32. package/dist/controllers/sqlite.js +1611 -1486
  33. package/dist/controllers/sqlite.js.map +1 -1
  34. package/dist/controllers/store.d.ts +9 -8
  35. package/dist/controllers/store.js +1 -31
  36. package/dist/controllers/store.js.map +1 -1
  37. package/dist/controllers/types.d.ts +3 -0
  38. package/dist/controllers/workflow-engine-scheduler.d.ts +1 -1
  39. package/dist/controllers/workflow-engine-scheduler.js +3 -5
  40. package/dist/controllers/workflow-engine-scheduler.js.map +1 -1
  41. package/dist/controllers/workflows.d.ts +2 -2
  42. package/dist/controllers/workflows.js +11 -10
  43. package/dist/controllers/workflows.js.map +1 -1
  44. package/dist/extension/controller-host.js +2 -2
  45. package/dist/extension/controller-host.js.map +1 -1
  46. package/dist/extension/decision-channels.d.ts +2 -0
  47. package/dist/extension/decision-channels.js +311 -118
  48. package/dist/extension/decision-channels.js.map +1 -1
  49. package/dist/extension/executor.d.ts +9 -2
  50. package/dist/extension/executor.js +89 -2
  51. package/dist/extension/executor.js.map +1 -1
  52. package/dist/extension/herdr-viewer.d.ts +0 -1
  53. package/dist/extension/herdr-viewer.js +0 -4
  54. package/dist/extension/herdr-viewer.js.map +1 -1
  55. package/dist/extension/index.js +156 -103
  56. package/dist/extension/index.js.map +1 -1
  57. package/dist/extension/recorder.d.ts +3 -10
  58. package/dist/extension/recorder.js +13 -22
  59. package/dist/extension/recorder.js.map +1 -1
  60. package/dist/extension/step-message.d.ts +7 -2
  61. package/dist/extension/step-message.js +94 -2
  62. package/dist/extension/step-message.js.map +1 -1
  63. package/dist/extension/widget.js +6 -0
  64. package/dist/extension/widget.js.map +1 -1
  65. package/dist/host/rpc-executor.d.ts +3 -0
  66. package/dist/host/rpc-executor.js +2 -0
  67. package/dist/host/rpc-executor.js.map +1 -1
  68. package/dist/host/runner.d.ts +3 -6
  69. package/dist/host/runner.js +83 -32
  70. package/dist/host/runner.js.map +1 -1
  71. package/dist/render/graph-render.js +14 -8
  72. package/dist/render/graph-render.js.map +1 -1
  73. package/dist/state/database.d.ts +35 -0
  74. package/dist/state/database.js +287 -0
  75. package/dist/state/database.js.map +1 -0
  76. package/dist/state/index.d.ts +4 -0
  77. package/dist/state/index.js +5 -0
  78. package/dist/state/index.js.map +1 -0
  79. package/dist/state/json.d.ts +6 -0
  80. package/dist/state/json.js +38 -0
  81. package/dist/state/json.js.map +1 -0
  82. package/dist/state/mutation.d.ts +57 -0
  83. package/dist/state/mutation.js +255 -0
  84. package/dist/state/mutation.js.map +1 -0
  85. package/dist/state/schema.d.ts +6 -0
  86. package/dist/state/schema.js +473 -0
  87. package/dist/state/schema.js.map +1 -0
  88. package/dist/viewer/cli.d.ts +2 -2
  89. package/dist/viewer/cli.js +142 -122
  90. package/dist/viewer/cli.js.map +1 -1
  91. package/dist/viewer/render.d.ts +4 -4
  92. package/dist/viewer/render.js +2 -17
  93. package/dist/viewer/render.js.map +1 -1
  94. package/dist/viewer/session-reducer.d.ts +1 -1
  95. package/dist/viewer/session-reducer.js +1 -1
  96. package/dist/viewer/tui.d.ts +3 -3
  97. package/dist/viewer/tui.js +15 -13
  98. package/dist/viewer/tui.js.map +1 -1
  99. package/dist/viewer/watch.d.ts +2 -5
  100. package/dist/viewer/watch.js +13 -13
  101. package/dist/viewer/watch.js.map +1 -1
  102. package/dist/workflows/composition.js +12 -2
  103. package/dist/workflows/composition.js.map +1 -1
  104. package/dist/workflows/definition.d.ts +6 -2
  105. package/dist/workflows/definition.js +17 -0
  106. package/dist/workflows/definition.js.map +1 -1
  107. package/dist/workflows/engine.d.ts +6 -6
  108. package/dist/workflows/engine.js +183 -103
  109. package/dist/workflows/engine.js.map +1 -1
  110. package/dist/workflows/errors.d.ts +3 -3
  111. package/dist/workflows/errors.js +3 -3
  112. package/dist/workflows/human-decision.d.ts +29 -4
  113. package/dist/workflows/human-decision.js +547 -283
  114. package/dist/workflows/human-decision.js.map +1 -1
  115. package/dist/workflows/index.d.ts +4 -5
  116. package/dist/workflows/index.js +3 -4
  117. package/dist/workflows/index.js.map +1 -1
  118. package/dist/workflows/schema.js +17 -1
  119. package/dist/workflows/schema.js.map +1 -1
  120. package/dist/workflows/store.d.ts +83 -103
  121. package/dist/workflows/store.js +902 -951
  122. package/dist/workflows/store.js.map +1 -1
  123. package/dist/workflows/types.d.ts +55 -81
  124. package/docs/CONTROLLERS.md +10 -8
  125. package/docs/DEFERRED_TURNS.md +2 -2
  126. package/docs/DESIGN_PHILOSOPHY.md +4 -2
  127. package/docs/HUMAN_DECISIONS.md +13 -14
  128. package/docs/MONITOR.md +179 -231
  129. package/docs/SQLITE_STATE.md +219 -0
  130. package/docs/WORKFLOW_COMPOSITION.md +19 -19
  131. package/docs/WORKFLOW_STEP_MESSAGES.md +20 -18
  132. package/docs/WORKFLOW_UPDATES.md +10 -9
  133. package/docs/development.md +9 -9
  134. package/docs/live-replay-protocol.md +28 -37
  135. package/docs/plans/2026-08-16-workflow-updates-plan.md +1 -1
  136. package/docs/plans/2026-08-19-human-decision-gates-plan.md +1 -1
  137. package/docs/plans/2026-08-21-autoimplement-timeout-fallback-plan.md +1 -1
  138. package/docs/plans/2026-08-21-plan-change-approval-policy-plan.md +1 -1
  139. package/docs/plans/2026-08-21-sanity-check-plan.md +30 -16
  140. package/docs/plans/2026-08-22-goal-finishing-monitor-plan.md +200 -0
  141. package/docs/plans/2026-08-23-assistant-agent-completion-plan.md +701 -0
  142. package/docs/plans/2026-08-23-sqlite-state-plan.md +970 -0
  143. package/docs/plans/replayable-run-bundles-implementation-plan.md +2 -2
  144. package/docs/plans/session-event-replay-implementation-plan.md +1 -1
  145. package/docs/plans/tui-viewer-implementation-plan.md +1 -1
  146. package/docs/session-event-journal.md +63 -434
  147. package/docs/tui-viewer.md +13 -15
  148. package/docs/workflows.md +104 -50
  149. package/examples/workflows/plain-summary.workflow.ts +1 -0
  150. package/herdr-plugin.toml +1 -1
  151. package/package.json +1 -1
  152. package/plugins/herdr/viewer.mjs +1 -11
  153. package/skills/autoplan/SKILL.md +5 -4
  154. package/skills/monitor/SKILL.md +91 -163
  155. package/skills/pi-workflows/SKILL.md +7 -7
  156. package/skills/sanity-check/SKILL.md +1 -1
  157. package/src/builtins/autoplan.workflow.ts +290 -40
  158. package/src/builtins/catalog.ts +6 -4
  159. package/src/builtins/index.ts +7 -1
  160. package/src/builtins/monitor.workflow.ts +663 -249
  161. package/src/builtins/plain-summary.workflow.ts +185 -0
  162. package/src/builtins/sanity-check.workflow.ts +62 -7
  163. package/src/controllers/effects.ts +7 -0
  164. package/src/controllers/index.ts +0 -6
  165. package/src/controllers/manager.ts +72 -32
  166. package/src/controllers/sqlite.ts +2420 -1948
  167. package/src/controllers/store.ts +17 -38
  168. package/src/controllers/types.ts +3 -0
  169. package/src/controllers/workflow-engine-scheduler.ts +4 -8
  170. package/src/controllers/workflows.ts +45 -21
  171. package/src/extension/controller-host.ts +1 -2
  172. package/src/extension/decision-channels.ts +427 -144
  173. package/src/extension/executor.ts +105 -2
  174. package/src/extension/herdr-viewer.ts +0 -5
  175. package/src/extension/index.ts +180 -118
  176. package/src/extension/recorder.ts +13 -22
  177. package/src/extension/step-message.ts +106 -4
  178. package/src/extension/widget.ts +8 -0
  179. package/src/host/rpc-executor.ts +4 -0
  180. package/src/host/runner.ts +93 -41
  181. package/src/render/graph-render.ts +11 -4
  182. package/src/state/database.ts +375 -0
  183. package/src/state/index.ts +29 -0
  184. package/src/state/json.ts +42 -0
  185. package/src/state/mutation.ts +435 -0
  186. package/src/state/schema.ts +475 -0
  187. package/src/viewer/cli.ts +151 -144
  188. package/src/viewer/render.ts +12 -24
  189. package/src/viewer/session-reducer.ts +1 -1
  190. package/src/viewer/tui.ts +18 -17
  191. package/src/viewer/watch.ts +13 -17
  192. package/src/workflows/composition.ts +12 -3
  193. package/src/workflows/definition.ts +36 -3
  194. package/src/workflows/engine.ts +212 -116
  195. package/src/workflows/errors.ts +3 -3
  196. package/src/workflows/human-decision.ts +795 -340
  197. package/src/workflows/index.ts +15 -19
  198. package/src/workflows/schema.ts +19 -1
  199. package/src/workflows/store.ts +1295 -1163
  200. package/src/workflows/types.ts +61 -81
  201. package/dist/workflows/artifacts.d.ts +0 -40
  202. package/dist/workflows/artifacts.js +0 -155
  203. package/dist/workflows/artifacts.js.map +0 -1
  204. package/dist/workflows/migrate-sources.d.ts +0 -42
  205. package/dist/workflows/migrate-sources.js +0 -133
  206. package/dist/workflows/migrate-sources.js.map +0 -1
  207. package/docs/run-bundles.md +0 -481
  208. package/src/workflows/artifacts.ts +0 -188
  209. package/src/workflows/migrate-sources.ts +0 -178
@@ -1,28 +1,25 @@
1
1
  import fs from "node:fs";
2
+ import path from "node:path";
2
3
 
3
4
  export type Unsubscribe = () => void;
4
5
 
5
- /**
6
- * Watch a directory tree for changes with a polling fallback. `onChange` is
7
- * debounced so bursts of writes trigger one refresh.
8
- */
9
- export function watchRunsDir(
10
- dir: string,
6
+ /** Watch the canonical database and its WAL with a polling fallback. */
7
+ export function watchStateDatabase(
8
+ databasePath: string,
11
9
  onChange: () => void,
12
10
  options: { pollMs?: number; debounceMs?: number } = {},
13
11
  ): Unsubscribe {
14
12
  const pollMs = options.pollMs ?? 1_000;
15
13
  const debounceMs = options.debounceMs ?? 80;
14
+ const directory = path.dirname(databasePath);
15
+ const base = path.basename(databasePath);
16
+ const relevant = new Set([base, `${base}-wal`, `${base}-shm`]);
16
17
  let debounceTimer: NodeJS.Timeout | null = null;
17
18
  let closed = false;
18
19
 
19
20
  const fire = () => {
20
- if (closed) {
21
- return;
22
- }
23
- if (debounceTimer) {
24
- clearTimeout(debounceTimer);
25
- }
21
+ if (closed) return;
22
+ if (debounceTimer !== null) clearTimeout(debounceTimer);
26
23
  debounceTimer = setTimeout(() => {
27
24
  debounceTimer = null;
28
25
  onChange();
@@ -31,7 +28,9 @@ export function watchRunsDir(
31
28
 
32
29
  let watcher: fs.FSWatcher | null = null;
33
30
  try {
34
- watcher = fs.watch(dir, { recursive: true }, fire);
31
+ watcher = fs.watch(directory, (_event, filename) => {
32
+ if (filename === null || relevant.has(filename.toString())) fire();
33
+ });
35
34
  watcher.on("error", () => {
36
35
  watcher?.close();
37
36
  watcher = null;
@@ -40,15 +39,12 @@ export function watchRunsDir(
40
39
  watcher = null;
41
40
  }
42
41
 
43
- // Polling fallback covers platforms without recursive fs.watch and missed events.
44
42
  const poller = setInterval(fire, pollMs);
45
43
  poller.unref?.();
46
44
 
47
45
  return () => {
48
46
  closed = true;
49
- if (debounceTimer) {
50
- clearTimeout(debounceTimer);
51
- }
47
+ if (debounceTimer !== null) clearTimeout(debounceTimer);
52
48
  clearInterval(poller);
53
49
  watcher?.close();
54
50
  };
@@ -3,7 +3,6 @@ import { readFileSync } from "node:fs";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import type {
5
5
  ActionNodeDefinition,
6
- AgentNodeDefinition,
7
6
  CheckpointNodeDefinition,
8
7
  ComputeNodeDefinition,
9
8
  FunctionActionNodeDefinition,
@@ -451,11 +450,20 @@ function wrapNode(
451
450
  ...(node.statusDetail !== undefined ? { statusDetail: node.statusDetail } : {}),
452
451
  };
453
452
  switch (node.nodeType) {
454
- case "agent":
453
+ case "agent": {
454
+ const prompt = (context: WorkflowNodeContext) => node.prompt(project(context));
455
+ if (typeof node.expectedOutput === "object") {
456
+ return {
457
+ ...common,
458
+ nodeType: "agent",
459
+ prompt,
460
+ expectedOutput: node.expectedOutput,
461
+ };
462
+ }
455
463
  return {
456
464
  ...common,
457
465
  nodeType: "agent",
458
- prompt: (context) => (node as AgentNodeDefinition).prompt(project(context)),
466
+ prompt,
459
467
  ...(node.expectedOutput !== undefined ? { expectedOutput: node.expectedOutput } : {}),
460
468
  ...(node.validate !== undefined
461
469
  ? {
@@ -464,6 +472,7 @@ function wrapNode(
464
472
  }
465
473
  : {}),
466
474
  };
475
+ }
467
476
  case "compute":
468
477
  return {
469
478
  ...common,
@@ -9,6 +9,9 @@ import {
9
9
  } from "./schema.js";
10
10
  import type {
11
11
  AgentNodeDefinition,
12
+ AssistantAgentNodeDefinition,
13
+ AssistantMessageOutput,
14
+ SubmittedAgentNodeDefinition,
12
15
  ActionNodeDefinition,
13
16
  CheckpointNodeDefinition,
14
17
  ComputeNodeDefinition,
@@ -154,11 +157,41 @@ export function isWorkflowDefinition(value: unknown): value is WorkflowDefinitio
154
157
  );
155
158
  }
156
159
 
160
+ export function assistantMessage(options: { maxChars?: number } = {}): AssistantMessageOutput {
161
+ if (options === null || typeof options !== "object" || Array.isArray(options)) {
162
+ throw new Error("Invalid workflow definition: assistantMessage options must be an object");
163
+ }
164
+ const unknown = Object.keys(options).filter((key) => key !== "maxChars");
165
+ if (unknown.length > 0) {
166
+ throw new Error(
167
+ `Invalid workflow definition: assistantMessage has unknown option ${JSON.stringify(unknown[0])}`,
168
+ );
169
+ }
170
+ if (
171
+ options.maxChars !== undefined &&
172
+ (!Number.isInteger(options.maxChars) || options.maxChars <= 0)
173
+ ) {
174
+ throw new Error(
175
+ "Invalid workflow definition: assistantMessage maxChars must be a positive integer",
176
+ );
177
+ }
178
+ return Object.freeze({
179
+ kind: "assistant-message" as const,
180
+ ...(options.maxChars !== undefined ? { maxChars: options.maxChars } : {}),
181
+ });
182
+ }
183
+
184
+ export function agent(
185
+ definition: Omit<SubmittedAgentNodeDefinition, "nodeType">,
186
+ ): SubmittedAgentNodeDefinition;
187
+ export function agent(
188
+ definition: Omit<AssistantAgentNodeDefinition, "nodeType">,
189
+ ): AssistantAgentNodeDefinition;
157
190
  export function agent(definition: Omit<AgentNodeDefinition, "nodeType">): AgentNodeDefinition {
158
- const node: AgentNodeDefinition = {
159
- nodeType: "agent",
191
+ const node = {
192
+ nodeType: "agent" as const,
160
193
  ...definition,
161
- };
194
+ } as AgentNodeDefinition;
162
195
  assertValidAgentNode(node);
163
196
  return node;
164
197
  }