@osolmaz/pi-workflows 0.13.4 → 0.15.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 (237) hide show
  1. package/README.md +146 -160
  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 +1 -2
  16. package/dist/controllers/index.js +0 -1
  17. package/dist/controllers/index.js.map +1 -1
  18. package/dist/controllers/sqlite.d.ts +85 -31
  19. package/dist/controllers/sqlite.js +541 -126
  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 -2928
  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/prune.js +36 -10
  94. package/dist/state/prune.js.map +1 -1
  95. package/dist/state/schema.d.ts +1 -1
  96. package/dist/state/schema.js +171 -3
  97. package/dist/state/schema.js.map +1 -1
  98. package/dist/state/viewer.d.ts +46 -0
  99. package/dist/state/viewer.js +249 -0
  100. package/dist/state/viewer.js.map +1 -0
  101. package/dist/viewer/cli.d.ts +1 -1
  102. package/dist/viewer/cli.js +47 -18
  103. package/dist/viewer/cli.js.map +1 -1
  104. package/dist/workflows/composition.js +25 -2
  105. package/dist/workflows/composition.js.map +1 -1
  106. package/dist/workflows/definition.d.ts +3 -1
  107. package/dist/workflows/definition.js +25 -0
  108. package/dist/workflows/definition.js.map +1 -1
  109. package/dist/workflows/engine.d.ts +1 -0
  110. package/dist/workflows/engine.js +157 -42
  111. package/dist/workflows/engine.js.map +1 -1
  112. package/dist/workflows/errors.d.ts +3 -1
  113. package/dist/workflows/errors.js +4 -7
  114. package/dist/workflows/errors.js.map +1 -1
  115. package/dist/workflows/human-decision.d.ts +3 -0
  116. package/dist/workflows/human-decision.js +31 -0
  117. package/dist/workflows/human-decision.js.map +1 -1
  118. package/dist/workflows/index.d.ts +1 -1
  119. package/dist/workflows/index.js +1 -1
  120. package/dist/workflows/index.js.map +1 -1
  121. package/dist/workflows/schema.js +17 -6
  122. package/dist/workflows/schema.js.map +1 -1
  123. package/dist/{viewer → workflows}/session-reducer.d.ts +3 -1
  124. package/dist/{viewer → workflows}/session-reducer.js +4 -0
  125. package/dist/workflows/session-reducer.js.map +1 -0
  126. package/dist/workflows/store.d.ts +87 -1
  127. package/dist/workflows/store.js +892 -93
  128. package/dist/workflows/store.js.map +1 -1
  129. package/dist/workflows/tool-input.d.ts +0 -22
  130. package/dist/workflows/tool-input.js +1 -44
  131. package/dist/workflows/tool-input.js.map +1 -1
  132. package/dist/workflows/types.d.ts +36 -4
  133. package/docs/2026-08-25-workflow-follow-ups.md +8 -6
  134. package/docs/2026-08-30-out-of-process-workflow-host-plan.md +353 -0
  135. package/docs/CONTROLLERS.md +11 -11
  136. package/docs/DEFERRED_TURNS.md +61 -27
  137. package/docs/HUMAN_DECISIONS.md +12 -4
  138. package/docs/SQLITE_STATE.md +42 -8
  139. package/docs/WORKFLOW_HOST.md +452 -0
  140. package/docs/development.md +46 -30
  141. package/docs/live-replay-protocol.md +129 -100
  142. package/docs/plans/2026-08-19-human-decision-gates-plan.md +34 -8
  143. package/docs/plans/2026-08-27-workflow-terminal-restart-plan.md +399 -0
  144. package/docs/plans/2026-08-28-piw-incremental-viewer-plan.md +293 -0
  145. package/docs/plans/piw-viewer-experience-implementation-plan.md +11 -1
  146. package/docs/plans/tui-viewer-implementation-plan.md +5 -0
  147. package/docs/tui-viewer.md +18 -3
  148. package/docs/workflows.md +164 -156
  149. package/examples/workflows/command-batch.workflow.ts +2 -0
  150. package/examples/workflows/shell.workflow.ts +2 -1
  151. package/herdr-plugin.toml +1 -1
  152. package/package.json +1 -1
  153. package/skills/autodoc/SKILL.md +1 -1
  154. package/skills/autoimplement/SKILL.md +1 -1
  155. package/skills/autoplan/SKILL.md +1 -1
  156. package/skills/pi-workflows/SKILL.md +2 -0
  157. package/src/builtins/autoimplement.workflow.ts +3 -0
  158. package/src/builtins/change-verification.workflow.ts +7 -2
  159. package/src/builtins/metadata.ts +9 -0
  160. package/src/builtins/monitor.workflow.ts +4 -0
  161. package/src/builtins/sanity-check.workflow.ts +4 -0
  162. package/src/builtins/workspace-preparation.workflow.ts +3 -1
  163. package/src/controllers/index.ts +3 -5
  164. package/src/controllers/sqlite.ts +929 -225
  165. package/src/controllers/store.ts +1 -0
  166. package/src/extension/controller-command.ts +45 -0
  167. package/src/extension/index.ts +948 -3506
  168. package/src/extension/message-card.ts +61 -0
  169. package/src/extension/step-message.ts +58 -63
  170. package/src/host/child-worker-supervisor.ts +183 -0
  171. package/src/host/client.ts +293 -0
  172. package/src/host/controller-worker-entry.ts +311 -0
  173. package/src/host/controller-worker-protocol.ts +104 -0
  174. package/src/host/controller-worker-supervisor.ts +79 -0
  175. package/src/host/host-entry.ts +23 -0
  176. package/src/host/processes.ts +171 -54
  177. package/src/host/protocol.ts +196 -0
  178. package/src/host/resolver-entry.ts +241 -0
  179. package/src/host/rpc-executor.ts +76 -34
  180. package/src/host/runner.ts +2813 -422
  181. package/src/host/state.ts +1160 -0
  182. package/src/host/worker-entry.ts +533 -0
  183. package/src/host/worker-protocol.ts +165 -0
  184. package/src/host/worker-store.ts +229 -0
  185. package/src/host/worker-supervisor.ts +74 -0
  186. package/src/render/canvas.ts +44 -10
  187. package/src/render/graph-render.ts +145 -90
  188. package/src/state/database.ts +2 -1
  189. package/src/state/index.ts +14 -0
  190. package/src/state/prune.ts +35 -9
  191. package/src/state/schema.ts +171 -3
  192. package/src/state/viewer.ts +356 -0
  193. package/src/viewer/cli.ts +49 -17
  194. package/src/workflows/composition.ts +36 -2
  195. package/src/workflows/definition.ts +32 -0
  196. package/src/workflows/engine.ts +157 -54
  197. package/src/workflows/errors.ts +11 -2
  198. package/src/workflows/human-decision.ts +49 -0
  199. package/src/workflows/index.ts +2 -0
  200. package/src/workflows/schema.ts +19 -6
  201. package/src/{viewer → workflows}/session-reducer.ts +11 -1
  202. package/src/workflows/store.ts +1316 -108
  203. package/src/workflows/tool-input.ts +2 -60
  204. package/src/workflows/types.ts +32 -4
  205. package/dist/controllers/workflow-engine-scheduler.d.ts +0 -29
  206. package/dist/controllers/workflow-engine-scheduler.js +0 -175
  207. package/dist/controllers/workflow-engine-scheduler.js.map +0 -1
  208. package/dist/extension/controller-host.d.ts +0 -48
  209. package/dist/extension/controller-host.js +0 -110
  210. package/dist/extension/controller-host.js.map +0 -1
  211. package/dist/extension/deferred-turn-coordinator.d.ts +0 -32
  212. package/dist/extension/deferred-turn-coordinator.js +0 -143
  213. package/dist/extension/deferred-turn-coordinator.js.map +0 -1
  214. package/dist/extension/deferred-turn.d.ts +0 -44
  215. package/dist/extension/deferred-turn.js +0 -110
  216. package/dist/extension/deferred-turn.js.map +0 -1
  217. package/dist/extension/executor.d.ts +0 -86
  218. package/dist/extension/executor.js +0 -311
  219. package/dist/extension/executor.js.map +0 -1
  220. package/dist/extension/follow-up-coordinator.d.ts +0 -27
  221. package/dist/extension/follow-up-coordinator.js +0 -131
  222. package/dist/extension/follow-up-coordinator.js.map +0 -1
  223. package/dist/extension/recorder.d.ts +0 -84
  224. package/dist/extension/recorder.js +0 -528
  225. package/dist/extension/recorder.js.map +0 -1
  226. package/dist/extension/session-events.d.ts +0 -133
  227. package/dist/extension/session-events.js +0 -61
  228. package/dist/extension/session-events.js.map +0 -1
  229. package/dist/viewer/session-reducer.js.map +0 -1
  230. package/src/controllers/workflow-engine-scheduler.ts +0 -246
  231. package/src/extension/controller-host.ts +0 -167
  232. package/src/extension/deferred-turn-coordinator.ts +0 -171
  233. package/src/extension/deferred-turn.ts +0 -166
  234. package/src/extension/executor.ts +0 -411
  235. package/src/extension/follow-up-coordinator.ts +0 -151
  236. package/src/extension/recorder.ts +0 -655
  237. package/src/extension/session-events.ts +0 -121
@@ -11,7 +11,7 @@ import {
11
11
  type CommandBatchItemResult,
12
12
  type CommandBatchResult,
13
13
  } from "../workflows/command-batch.js";
14
- import { action, agent, compute, defineWorkflow } from "../workflows/definition.js";
14
+ import { action, agent, compute, defineWorkflow, manualEffect } from "../workflows/definition.js";
15
15
  import type { WorkflowActionContext, WorkflowNodeContext } from "../workflows/types.js";
16
16
  import { validateVerificationCommandSafety } from "./autoimplement-command-batches.js";
17
17
  import {
@@ -1027,16 +1027,21 @@ export const changeVerificationWorkflow = defineWorkflow({
1027
1027
  validate: parsePlannedChecks,
1028
1028
  }),
1029
1029
  runCandidate: action({
1030
+ effect: manualEffect("pi-workflows.change-verification.candidate"),
1030
1031
  run: async (context) =>
1031
1032
  await runCandidate(context, checksForContext(context as unknown as WorkflowNodeContext)),
1032
1033
  }),
1033
1034
  runBase: action({
1035
+ effect: manualEffect("pi-workflows.change-verification.base"),
1034
1036
  run: async (context) =>
1035
1037
  await runBase(context, checksForContext(context as unknown as WorkflowNodeContext)),
1036
1038
  }),
1037
1039
  classify: compute({ run: latestClassification }),
1038
1040
  repairGuard: compute({ run: repairGuard }),
1039
- mechanicalRepair: action({ run: runMechanicalRepair }),
1041
+ mechanicalRepair: action({
1042
+ effect: manualEffect("pi-workflows.change-verification.mechanical-repair"),
1043
+ run: runMechanicalRepair,
1044
+ }),
1040
1045
  semanticRepair: agent({
1041
1046
  prompt: (context) => {
1042
1047
  const input = context.input as ChangeVerificationInput;
@@ -0,0 +1,9 @@
1
+ export const BUILTIN_WORKFLOW_METADATA = [
2
+ { id: "plain-summary", revision: "3" },
3
+ { id: "autoplan", revision: "6" },
4
+ { id: "autodoc", revision: "2" },
5
+ { id: "autoimplement", revision: "11" },
6
+ { id: "plan-approval", revision: "4" },
7
+ { id: "sanity-check", revision: "6" },
8
+ { id: "monitor", revision: "11" },
9
+ ] as const;
@@ -3,6 +3,7 @@ import {
3
3
  agent,
4
4
  compute,
5
5
  defineWorkflow,
6
+ idempotentEffect,
6
7
  includeWorkflow,
7
8
  includedResult,
8
9
  notify,
@@ -855,6 +856,7 @@ const monitorWorkflow: WorkflowDefinition = defineWorkflow({
855
856
  guard: compute({ run: guardObservation }),
856
857
  estimate: compute({ run: ({ outputs }) => estimateTracks(outputs) }),
857
858
  publish_progress: action({
859
+ effect: idempotentEffect("pi-workflows.monitor.publish-progress"),
858
860
  statusDetail: "publishing monitor progress",
859
861
  run: async ({ outputs, publishUpdate, signal }) => {
860
862
  const observation = currentObservation(outputs);
@@ -944,6 +946,7 @@ const monitorWorkflow: WorkflowDefinition = defineWorkflow({
944
946
  },
945
947
  }),
946
948
  schedule: action({
949
+ effect: idempotentEffect("pi-workflows.monitor.schedule"),
947
950
  statusDetail: "scheduling next monitor observation",
948
951
  run: async ({ outputs, publishUpdate }) => {
949
952
  const config = configFrom(outputs);
@@ -965,6 +968,7 @@ const monitorWorkflow: WorkflowDefinition = defineWorkflow({
965
968
  },
966
969
  }),
967
970
  sleep: shell({
971
+ effect: idempotentEffect("pi-workflows.monitor.sleep"),
968
972
  statusDetail: "waiting for next monitor observation",
969
973
  timeoutMs: MAX_INTERVAL_MINUTES * 60_000 + NODE_TIMEOUT_MARGIN_MS,
970
974
  exec: ({ outputs }) => {
@@ -10,6 +10,7 @@ import {
10
10
  compute,
11
11
  defineWorkflow,
12
12
  includeWorkflow,
13
+ manualEffect,
13
14
  } from "../workflows/definition.js";
14
15
  import { extractJsonValue } from "../workflows/json.js";
15
16
  import type { WorkflowActionContext, WorkflowProgressStatus } from "../workflows/types.js";
@@ -780,6 +781,7 @@ export const sanityCheckWorkflow = defineWorkflow({
780
781
  run: ({ input }) => input as SanityCheckConfig,
781
782
  }),
782
783
  collectEvidence: action({
784
+ effect: manualEffect("pi-workflows.sanity-check.collect-evidence"),
783
785
  statusDetail: "collecting contribution evidence",
784
786
  timeoutMs: 2 * 60_000,
785
787
  run: async ({ outputs, signal }) =>
@@ -790,11 +792,13 @@ export const sanityCheckWorkflow = defineWorkflow({
790
792
  ),
791
793
  }),
792
794
  review: action({
795
+ effect: manualEffect("pi-workflows.sanity-check.review"),
793
796
  statusDetail: "reviewing contribution",
794
797
  timeoutMs: REVIEW_TIMEOUT_MS,
795
798
  run: runReviews,
796
799
  }),
797
800
  verify: action({
801
+ effect: manualEffect("pi-workflows.sanity-check.verify"),
798
802
  statusDetail: "verifying findings",
799
803
  timeoutMs: REVIEW_TIMEOUT_MS,
800
804
  run: verifyReviews,
@@ -1,7 +1,7 @@
1
1
  import { execFile } from "node:child_process";
2
2
  import path from "node:path";
3
3
  import { promisify } from "node:util";
4
- import { action, agent, compute, defineWorkflow } from "../workflows/definition.js";
4
+ import { action, agent, compute, defineWorkflow, manualEffect } from "../workflows/definition.js";
5
5
 
6
6
  const execFileAsync = promisify(execFile);
7
7
 
@@ -625,6 +625,7 @@ export const workspacePreparationWorkflow = defineWorkflow({
625
625
  },
626
626
  nodes: {
627
627
  inspect: action({
628
+ effect: manualEffect("pi-workflows.workspace-preparation.inspect"),
628
629
  run: async ({ input }) => await inspectWorkspace(input as WorkspacePreparationInput),
629
630
  }),
630
631
  propose: agent({
@@ -638,6 +639,7 @@ export const workspacePreparationWorkflow = defineWorkflow({
638
639
  validate: parseProposal,
639
640
  }),
640
641
  apply: action({
642
+ effect: manualEffect("pi-workflows.workspace-preparation.apply"),
641
643
  run: async ({ input, outputs }) =>
642
644
  await prepareWorkspace(
643
645
  input as WorkspacePreparationInput,
@@ -24,7 +24,10 @@ export {
24
24
  SqliteControllerStore,
25
25
  type RunEventRecord,
26
26
  type WorkflowNotificationRecord,
27
+ type WorkflowRunClaimOptions,
28
+ type WorkflowRunPreparationResult,
27
29
  type WorkflowRunQueueRecord,
30
+ type WorkflowRunReservationOptions,
28
31
  } from "./sqlite.js";
29
32
  export {
30
33
  type ControllerStore,
@@ -42,11 +45,6 @@ export {
42
45
  loadDiscoveredControllers,
43
46
  type DiscoveredController,
44
47
  } from "./loader.js";
45
- export {
46
- WorkflowEngineScheduler,
47
- type ResolvedChildWorkflow,
48
- type WorkflowEngineSchedulerOptions,
49
- } from "./workflow-engine-scheduler.js";
50
48
  export {
51
49
  ControllerWorkflowCoordinator,
52
50
  type ControllerWorkflowControlRequest,