@osolmaz/pi-workflows 0.12.1 → 0.13.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 (233) hide show
  1. package/README.md +59 -33
  2. package/dist/builtins/autodoc.workflow.d.ts +194 -7
  3. package/dist/builtins/autodoc.workflow.js +156 -30
  4. package/dist/builtins/autodoc.workflow.js.map +1 -1
  5. package/dist/builtins/autoimplement-command-batches.d.ts +1 -0
  6. package/dist/builtins/autoimplement-command-batches.js +29 -31
  7. package/dist/builtins/autoimplement-command-batches.js.map +1 -1
  8. package/dist/builtins/autoimplement.workflow.d.ts +1619 -97
  9. package/dist/builtins/autoimplement.workflow.js +416 -153
  10. package/dist/builtins/autoimplement.workflow.js.map +1 -1
  11. package/dist/builtins/autoplan.workflow.d.ts +126 -13
  12. package/dist/builtins/autoplan.workflow.js +200 -29
  13. package/dist/builtins/autoplan.workflow.js.map +1 -1
  14. package/dist/builtins/catalog.js +7 -5
  15. package/dist/builtins/catalog.js.map +1 -1
  16. package/dist/builtins/change-verification.workflow.d.ts +110 -0
  17. package/dist/builtins/change-verification.workflow.js +860 -0
  18. package/dist/builtins/change-verification.workflow.js.map +1 -0
  19. package/dist/builtins/index.d.ts +2 -1
  20. package/dist/builtins/index.js +1 -0
  21. package/dist/builtins/index.js.map +1 -1
  22. package/dist/builtins/monitor.workflow.d.ts +56 -21
  23. package/dist/builtins/monitor.workflow.js +499 -217
  24. package/dist/builtins/monitor.workflow.js.map +1 -1
  25. package/dist/builtins/plain-summary.workflow.d.ts +32 -0
  26. package/dist/builtins/plain-summary.workflow.js +134 -0
  27. package/dist/builtins/plain-summary.workflow.js.map +1 -0
  28. package/dist/builtins/plan-change.workflow.d.ts +527 -26
  29. package/dist/builtins/plan-change.workflow.js +26 -0
  30. package/dist/builtins/plan-change.workflow.js.map +1 -1
  31. package/dist/builtins/sanity-check.workflow.d.ts +45 -3
  32. package/dist/builtins/sanity-check.workflow.js +45 -7
  33. package/dist/builtins/sanity-check.workflow.js.map +1 -1
  34. package/dist/builtins/workspace-preparation.workflow.d.ts +75 -0
  35. package/dist/builtins/workspace-preparation.workflow.js +498 -0
  36. package/dist/builtins/workspace-preparation.workflow.js.map +1 -0
  37. package/dist/controllers/effects.d.ts +3 -2
  38. package/dist/controllers/effects.js +8 -1
  39. package/dist/controllers/effects.js.map +1 -1
  40. package/dist/controllers/index.d.ts +1 -1
  41. package/dist/controllers/index.js +1 -1
  42. package/dist/controllers/index.js.map +1 -1
  43. package/dist/controllers/manager.d.ts +1 -0
  44. package/dist/controllers/manager.js +41 -17
  45. package/dist/controllers/manager.js.map +1 -1
  46. package/dist/controllers/sqlite.d.ts +107 -85
  47. package/dist/controllers/sqlite.js +1611 -1486
  48. package/dist/controllers/sqlite.js.map +1 -1
  49. package/dist/controllers/store.d.ts +9 -8
  50. package/dist/controllers/store.js +1 -31
  51. package/dist/controllers/store.js.map +1 -1
  52. package/dist/controllers/types.d.ts +3 -0
  53. package/dist/controllers/workflow-engine-scheduler.d.ts +1 -1
  54. package/dist/controllers/workflow-engine-scheduler.js +3 -5
  55. package/dist/controllers/workflow-engine-scheduler.js.map +1 -1
  56. package/dist/controllers/workflows.d.ts +2 -2
  57. package/dist/controllers/workflows.js +11 -10
  58. package/dist/controllers/workflows.js.map +1 -1
  59. package/dist/extension/controller-host.js +2 -2
  60. package/dist/extension/controller-host.js.map +1 -1
  61. package/dist/extension/decision-channels.d.ts +2 -0
  62. package/dist/extension/decision-channels.js +311 -118
  63. package/dist/extension/decision-channels.js.map +1 -1
  64. package/dist/extension/executor.d.ts +9 -2
  65. package/dist/extension/executor.js +90 -6
  66. package/dist/extension/executor.js.map +1 -1
  67. package/dist/extension/herdr-viewer.d.ts +0 -1
  68. package/dist/extension/herdr-viewer.js +0 -4
  69. package/dist/extension/herdr-viewer.js.map +1 -1
  70. package/dist/extension/index.js +156 -117
  71. package/dist/extension/index.js.map +1 -1
  72. package/dist/extension/recorder.d.ts +3 -10
  73. package/dist/extension/recorder.js +13 -22
  74. package/dist/extension/recorder.js.map +1 -1
  75. package/dist/extension/step-message.d.ts +7 -2
  76. package/dist/extension/step-message.js +94 -2
  77. package/dist/extension/step-message.js.map +1 -1
  78. package/dist/extension/widget.js +6 -0
  79. package/dist/extension/widget.js.map +1 -1
  80. package/dist/host/rpc-executor.d.ts +3 -0
  81. package/dist/host/rpc-executor.js +2 -0
  82. package/dist/host/rpc-executor.js.map +1 -1
  83. package/dist/host/runner.d.ts +3 -6
  84. package/dist/host/runner.js +83 -32
  85. package/dist/host/runner.js.map +1 -1
  86. package/dist/render/graph-render.js +14 -8
  87. package/dist/render/graph-render.js.map +1 -1
  88. package/dist/state/database.d.ts +35 -0
  89. package/dist/state/database.js +287 -0
  90. package/dist/state/database.js.map +1 -0
  91. package/dist/state/index.d.ts +4 -0
  92. package/dist/state/index.js +5 -0
  93. package/dist/state/index.js.map +1 -0
  94. package/dist/state/json.d.ts +6 -0
  95. package/dist/state/json.js +38 -0
  96. package/dist/state/json.js.map +1 -0
  97. package/dist/state/mutation.d.ts +57 -0
  98. package/dist/state/mutation.js +255 -0
  99. package/dist/state/mutation.js.map +1 -0
  100. package/dist/state/schema.d.ts +6 -0
  101. package/dist/state/schema.js +473 -0
  102. package/dist/state/schema.js.map +1 -0
  103. package/dist/viewer/cli.d.ts +2 -2
  104. package/dist/viewer/cli.js +142 -122
  105. package/dist/viewer/cli.js.map +1 -1
  106. package/dist/viewer/render.d.ts +4 -4
  107. package/dist/viewer/render.js +2 -17
  108. package/dist/viewer/render.js.map +1 -1
  109. package/dist/viewer/session-reducer.d.ts +1 -1
  110. package/dist/viewer/session-reducer.js +1 -1
  111. package/dist/viewer/tui.d.ts +3 -3
  112. package/dist/viewer/tui.js +15 -13
  113. package/dist/viewer/tui.js.map +1 -1
  114. package/dist/viewer/watch.d.ts +2 -5
  115. package/dist/viewer/watch.js +13 -13
  116. package/dist/viewer/watch.js.map +1 -1
  117. package/dist/workflows/composition.js +12 -2
  118. package/dist/workflows/composition.js.map +1 -1
  119. package/dist/workflows/definition.d.ts +6 -2
  120. package/dist/workflows/definition.js +17 -0
  121. package/dist/workflows/definition.js.map +1 -1
  122. package/dist/workflows/engine.d.ts +6 -6
  123. package/dist/workflows/engine.js +183 -103
  124. package/dist/workflows/engine.js.map +1 -1
  125. package/dist/workflows/errors.d.ts +3 -3
  126. package/dist/workflows/errors.js +3 -3
  127. package/dist/workflows/human-decision.d.ts +29 -4
  128. package/dist/workflows/human-decision.js +547 -283
  129. package/dist/workflows/human-decision.js.map +1 -1
  130. package/dist/workflows/index.d.ts +4 -5
  131. package/dist/workflows/index.js +3 -4
  132. package/dist/workflows/index.js.map +1 -1
  133. package/dist/workflows/schema.js +17 -1
  134. package/dist/workflows/schema.js.map +1 -1
  135. package/dist/workflows/store.d.ts +83 -103
  136. package/dist/workflows/store.js +902 -951
  137. package/dist/workflows/store.js.map +1 -1
  138. package/dist/workflows/types.d.ts +55 -81
  139. package/docs/CONTROLLERS.md +10 -8
  140. package/docs/DEFERRED_TURNS.md +2 -2
  141. package/docs/DESIGN_PHILOSOPHY.md +4 -2
  142. package/docs/HUMAN_DECISIONS.md +13 -14
  143. package/docs/MONITOR.md +179 -231
  144. package/docs/SQLITE_STATE.md +219 -0
  145. package/docs/WORKFLOW_COMPOSITION.md +27 -19
  146. package/docs/WORKFLOW_STEP_MESSAGES.md +20 -18
  147. package/docs/WORKFLOW_UPDATES.md +10 -9
  148. package/docs/development.md +9 -9
  149. package/docs/live-replay-protocol.md +28 -37
  150. package/docs/plans/2026-08-16-workflow-updates-plan.md +1 -1
  151. package/docs/plans/2026-08-19-human-decision-gates-plan.md +1 -1
  152. package/docs/plans/2026-08-21-autoimplement-timeout-fallback-plan.md +1 -1
  153. package/docs/plans/2026-08-21-plan-change-approval-policy-plan.md +1 -1
  154. package/docs/plans/2026-08-21-sanity-check-plan.md +30 -16
  155. package/docs/plans/2026-08-22-goal-finishing-monitor-plan.md +200 -0
  156. package/docs/plans/2026-08-23-assistant-agent-completion-plan.md +701 -0
  157. package/docs/plans/2026-08-23-sqlite-state-plan.md +970 -0
  158. package/docs/plans/2026-08-24-change-scoped-verification-plan.md +419 -0
  159. package/docs/plans/replayable-run-bundles-implementation-plan.md +2 -2
  160. package/docs/plans/session-event-replay-implementation-plan.md +1 -1
  161. package/docs/plans/tui-viewer-implementation-plan.md +1 -1
  162. package/docs/session-event-journal.md +63 -434
  163. package/docs/tui-viewer.md +13 -15
  164. package/docs/workflows.md +111 -62
  165. package/examples/workflows/plain-summary.workflow.ts +1 -0
  166. package/herdr-plugin.toml +1 -1
  167. package/package.json +1 -1
  168. package/plugins/herdr/viewer.mjs +1 -11
  169. package/skills/autodoc/SKILL.md +7 -0
  170. package/skills/autoimplement/SKILL.md +4 -0
  171. package/skills/autoplan/SKILL.md +5 -4
  172. package/skills/monitor/SKILL.md +91 -163
  173. package/skills/pi-workflows/SKILL.md +7 -7
  174. package/skills/sanity-check/SKILL.md +1 -1
  175. package/src/builtins/autodoc.workflow.ts +184 -33
  176. package/src/builtins/autoimplement-command-batches.ts +39 -33
  177. package/src/builtins/autoimplement.workflow.ts +483 -175
  178. package/src/builtins/autoplan.workflow.ts +290 -40
  179. package/src/builtins/catalog.ts +7 -5
  180. package/src/builtins/change-verification.workflow.ts +1143 -0
  181. package/src/builtins/index.ts +7 -1
  182. package/src/builtins/monitor.workflow.ts +667 -250
  183. package/src/builtins/plain-summary.workflow.ts +185 -0
  184. package/src/builtins/plan-change.workflow.ts +35 -0
  185. package/src/builtins/sanity-check.workflow.ts +62 -7
  186. package/src/builtins/workspace-preparation.workflow.ts +668 -0
  187. package/src/controllers/effects.ts +7 -0
  188. package/src/controllers/index.ts +0 -6
  189. package/src/controllers/manager.ts +72 -32
  190. package/src/controllers/sqlite.ts +2420 -1948
  191. package/src/controllers/store.ts +17 -38
  192. package/src/controllers/types.ts +3 -0
  193. package/src/controllers/workflow-engine-scheduler.ts +4 -8
  194. package/src/controllers/workflows.ts +45 -21
  195. package/src/extension/controller-host.ts +1 -2
  196. package/src/extension/decision-channels.ts +427 -144
  197. package/src/extension/executor.ts +106 -6
  198. package/src/extension/herdr-viewer.ts +0 -5
  199. package/src/extension/index.ts +180 -132
  200. package/src/extension/recorder.ts +13 -22
  201. package/src/extension/step-message.ts +106 -4
  202. package/src/extension/widget.ts +8 -0
  203. package/src/host/rpc-executor.ts +4 -0
  204. package/src/host/runner.ts +93 -41
  205. package/src/render/graph-render.ts +11 -4
  206. package/src/state/database.ts +375 -0
  207. package/src/state/index.ts +29 -0
  208. package/src/state/json.ts +42 -0
  209. package/src/state/mutation.ts +435 -0
  210. package/src/state/schema.ts +475 -0
  211. package/src/viewer/cli.ts +151 -144
  212. package/src/viewer/render.ts +12 -24
  213. package/src/viewer/session-reducer.ts +1 -1
  214. package/src/viewer/tui.ts +18 -17
  215. package/src/viewer/watch.ts +13 -17
  216. package/src/workflows/composition.ts +12 -3
  217. package/src/workflows/definition.ts +36 -3
  218. package/src/workflows/engine.ts +212 -116
  219. package/src/workflows/errors.ts +3 -3
  220. package/src/workflows/human-decision.ts +795 -340
  221. package/src/workflows/index.ts +15 -19
  222. package/src/workflows/schema.ts +19 -1
  223. package/src/workflows/store.ts +1295 -1163
  224. package/src/workflows/types.ts +61 -81
  225. package/dist/workflows/artifacts.d.ts +0 -40
  226. package/dist/workflows/artifacts.js +0 -155
  227. package/dist/workflows/artifacts.js.map +0 -1
  228. package/dist/workflows/migrate-sources.d.ts +0 -42
  229. package/dist/workflows/migrate-sources.js +0 -133
  230. package/dist/workflows/migrate-sources.js.map +0 -1
  231. package/docs/run-bundles.md +0 -481
  232. package/src/workflows/artifacts.ts +0 -188
  233. package/src/workflows/migrate-sources.ts +0 -178
package/README.md CHANGED
@@ -11,11 +11,11 @@ live in a standalone terminal viewer.
11
11
 
12
12
  The workflow model is a port of [openclaw/acpx](https://github.com/openclaw/acpx)
13
13
  flows into pi itself. Agent steps run inside your current pi conversation, so
14
- the model keeps everything it already knows from the discussion. The model
15
- completes each step by calling a JSON `workflow` tool, which gives the engine
16
- structured, validated output to route on. See the
17
- [design philosophy](docs/DESIGN_PHILOSOPHY.md) for the principles behind the
18
- engine and its public parts. Running steps can publish durable [workflow
14
+ the model keeps everything it already knows from the discussion. A submitted
15
+ agent calls the JSON `workflow` tool with structured output. An assistant agent
16
+ writes a normal visible response that becomes the node output. See the [design
17
+ philosophy](docs/DESIGN_PHILOSOPHY.md) for the principles behind the engine and
18
+ its public parts. Running steps can publish durable [workflow
19
19
  updates](docs/WORKFLOW_UPDATES.md), including progress counts and ETA data.
20
20
  Agent instructions use compact [workflow step
21
21
  messages](docs/WORKFLOW_STEP_MESSAGES.md), and the built-in
@@ -79,6 +79,17 @@ The npm package also includes the simpler `pi-workflows` snapshot viewer. To
79
79
  link that command from a clone, run `npm install && npm run build && npm link`,
80
80
  or run it in place with `npx tsx src/viewer/cli.ts`.
81
81
 
82
+ All live workflow and controller state uses one local database:
83
+
84
+ ```text
85
+ ~/.pi/agent/workflows/state.sqlite
86
+ ```
87
+
88
+ Runs, decisions, queues, claims, controllers, session capture, notifications,
89
+ channel transport state, effects, and large text values share that database.
90
+ Reads are read-only. Every write checks its actor, expected revision, and owner
91
+ lease when required. See [SQLite state](docs/SQLITE_STATE.md).
92
+
82
93
  ## Herdr integration
83
94
 
84
95
  pi-workflows also ships as a [Herdr](https://herdr.dev) plugin. After installing
@@ -96,7 +107,7 @@ plan](docs/plans/2026-08-20-herdr-plugin-sync-plan.md) defines update and
96
107
  recovery behavior.
97
108
 
98
109
  When Pi runs inside Herdr, a workflow widget shows `Ctrl+Shift+R piw`. When the widget has hidden rows, this call to action shares the existing scroll-controls line instead of taking another line.
99
- The shortcut opens the exact run bundle and lets you choose a split, tab, or new
110
+ The shortcut opens the exact SQLite run state and lets you choose a split, tab, or new
100
111
  workspace. `/piw` opens the same menu, and `/piw right`, `/piw below`, `/piw
101
112
  left`, `/piw above`, `/piw tab`, or `/piw workspace` selects a placement
102
113
  directly. If a viewer for that run already exists, pi-workflows focuses it
@@ -156,8 +167,15 @@ While a run is on screen, the footer status bar shows a compact
156
167
 
157
168
  `presentationPrompt` is optional. When present, pi-workflows uses it after the
158
169
  structured run ends to request one normal, human-readable assistant response.
159
- Workflows without it remain silent after their final structured output, which
160
- keeps shell-only and machine-consumed workflows model-free.
170
+ Without it, pi-workflows does not request a separate final response. If the
171
+ model writes text after submitting its last agent step, that text stays visible.
172
+ Shell-only and machine-consumed workflows remain model-free.
173
+
174
+ Use `expectedOutput: assistantMessage()` when a normal assistant response must
175
+ be a node inside the graph rather than a presentation after the run. Its exact
176
+ visible text becomes the node output after the turn settles. The helper has no
177
+ default character limit; a workflow can set one explicitly with
178
+ `assistantMessage({ maxChars: 2_000 })`.
161
179
 
162
180
  ## Compose workflows
163
181
 
@@ -193,8 +211,9 @@ Direct imports check child input and exit names in TypeScript. Names and paths r
193
211
  ## Agent-managed workflows
194
212
 
195
213
  The model can use the same `workflow` tool to list, start, inspect, pause,
196
- resume, cancel, and answer workflows. Step contracts use the tool's `submit`
197
- action. Slash commands and model actions share one lifecycle implementation.
214
+ resume, cancel, and answer workflows. Submitted-step contracts use the tool's
215
+ `submit` action. Assistant-step contracts require a normal assistant response
216
+ instead. Slash commands and model actions share one lifecycle implementation.
198
217
 
199
218
  pi-workflows includes a `monitor` workflow for plain-language requests such as:
200
219
 
@@ -217,14 +236,15 @@ discussion first and then trigger a workflow that builds on it. The
217
236
  an elegant production-ready solution, and compares it with the holy grail. It
218
237
  then selects the best practical in-scope solution without asking the user to
219
238
  resolve the gap. The ideal can win when it is feasible, but work outside the
220
- current authority cannot block a valid practical solution. The workflow ends
221
- with a detailed implementation plan. `autoplan` replaces the earlier
222
- `autodevise` name; the old command and export are not retained.
239
+ current authority cannot block a valid practical solution. The workflow keeps
240
+ the detailed implementation plan and shows one short assistant response with
241
+ the selected plan and a gist of every rejected option. `autoplan` replaces the
242
+ earlier `autodevise` name; the old command and export are not retained.
223
243
 
224
244
  ## Watching a run
225
245
 
226
- Runs persist to `~/.pi/agent/workflows/runs/` as they execute. The viewer
227
- tails that directory and re-renders on every state change:
246
+ Runs persist in `~/.pi/agent/workflows/state.sqlite` as they execute. The
247
+ viewer reads that database and re-renders on every state change:
228
248
 
229
249
  ```bash
230
250
  pi-workflows view # interactive picker, live updates
@@ -281,20 +301,22 @@ full boxed graph and its edges.
281
301
  ## Node types
282
302
 
283
303
  A workflow is a graph of named nodes with exactly one entry point. Each node
284
- finishes with a JSON output, and edges decide what runs next.
285
-
286
- An `agent` node sends a prompt into the pi conversation and waits for the
287
- model to submit its output through the `workflow` tool. A `compute` node runs
288
- a pure TypeScript function. A `notify` node writes a durable message for the
289
- Pi session that started the run. An `action` node performs a side effect,
290
- either a TypeScript function (`action({ run })`) or a runtime-owned shell
291
- command (`shell({ exec, parse })`). A `checkpoint` node ends the run in a
292
- `waiting` state so a human can pick it up. On top of `agent`, the `decision` helper asks
304
+ finishes with an output, and edges decide what runs next.
305
+
306
+ An `agent` node sends a prompt into the pi conversation. By default, it waits
307
+ for structured output through the `workflow` tool. With
308
+ `expectedOutput: assistantMessage()`, it waits for a normal visible assistant
309
+ response and uses the exact text as its output. A `compute` node runs a pure
310
+ TypeScript function. A `notify` node writes a durable message for the Pi
311
+ session that started the run. An `action` node performs a side effect, either a
312
+ TypeScript function (`action({ run })`) or a runtime-owned shell command
313
+ (`shell({ exec, parse })`). A `checkpoint` node ends the run in a `waiting`
314
+ state so a human can pick it up. On top of `agent`, the `decision` helper asks
293
315
  the model to pick from a fixed set of choices and validates the answer, and
294
316
  `decisionEdge` routes on the result with compile-time case checking.
295
317
 
296
318
  See [docs/workflows.md](docs/workflows.md) for the full authoring reference
297
- and [docs/run-bundles.md](docs/run-bundles.md) for the on-disk run format.
319
+ and [docs/SQLITE_STATE.md](docs/SQLITE_STATE.md) for the on-disk run format.
298
320
 
299
321
  ## Controllers
300
322
 
@@ -330,7 +352,7 @@ The standalone CLI provides read-only views with `pi-workflows controllers` and
330
352
 
331
353
  Runs do not depend on the Pi window. Every `/workflow` run is claimed through a durable queue, so closing Pi mid-run **parks** the run instead of cancelling it. Another interactive session cannot claim it. Reopening the exact session that started the run resumes it. A standalone host can also resume it without changing where reports go. A checkpointed run waits durably until you answer it with `/workflow answer <json>`, which continues the graph in a linked run.
332
354
 
333
- Workflow reports use a durable session-addressed outbox. A report waits while its starting session is closed and is delivered only to that session when it opens again. Runs in the same directory do not broadcast messages to each other's conversations.
355
+ Workflow reports use a durable session-addressed outbox. A report waits while its starting session is closed and is delivered only to that session when it opens again. Runs in the same database do not broadcast messages to each other's conversations.
334
356
 
335
357
  For runs that must continue while Pi is closed, keep the standalone host running:
336
358
 
@@ -338,12 +360,12 @@ For runs that must continue while Pi is closed, keep the standalone host running
338
360
  pi-workflows host --project /path/to/project
339
361
  ```
340
362
 
341
- The host claims parked runs and reconciles controllers without a Pi session. Conversation nodes execute in headless `pi --mode rpc` children that expose the same `workflow` tool contract. It is a foreground process — stop it with Ctrl-C; a crashed host's leftovers are reaped by the next one. See [docs/workflows.md](docs/workflows.md#durable-runs-parking-and-resume) for the model and [docs/run-bundles.md](docs/run-bundles.md) for the on-disk rules.
363
+ The host claims parked runs and reconciles controllers without a Pi session. Conversation nodes execute in headless `pi --mode rpc` children that expose the same `workflow` tool contract. It is a foreground process — stop it with Ctrl-C; a crashed host's leftovers are reaped by the next one. See [docs/workflows.md](docs/workflows.md#durable-runs-parking-and-resume) for the model and [docs/SQLITE_STATE.md](docs/SQLITE_STATE.md) for the on-disk rules.
342
364
 
343
365
  ## Examples
344
366
 
345
- The [examples/workflows/](examples/workflows/) directory mirrors the acpx
346
- example set. Copy any of them into `.pi/workflows/` to use them:
367
+ The [examples/workflows/](examples/workflows/) directory contains complete
368
+ workflow examples. Copy any of them into `.pi/workflows/` to use them:
347
369
 
348
370
  - `echo` is the smallest possible workflow, one agent step.
349
371
  - `branch` classifies a task with a `decision` and routes to either a
@@ -353,12 +375,16 @@ example set. Copy any of them into `.pi/workflows/` to use them:
353
375
  while they run.
354
376
  - `two-turn` chains three agent steps that build on each other's outputs in
355
377
  the same conversation.
378
+ - `plain-summary` turns structured source data into one short visible assistant
379
+ response. It is also a built-in workflow that other workflows can include.
356
380
  - `autoplan` turns the current problem into a chosen practical solution and
357
381
  a detailed implementation plan, using the ideal end state as guidance rather
358
- than an out-of-scope requirement.
359
- - `autoimplement` finds a clear existing plan, documents it when needed,
360
- implements and verifies it, writes and runs the exact pi-reviewer command,
361
- tracks P0 through P2, handles PR comments and CI, and
382
+ than an out-of-scope requirement. It also shows a short assistant response
383
+ with the selected plan and each rejected option.
384
+ - `autoimplement` finds a clear existing plan, prepares a safe branch or
385
+ worktree before mutation, documents it when needed, and verifies the current
386
+ change against eligible base-branch failures. It writes and runs the exact
387
+ pi-reviewer command, tracks P0 through P2, handles PR comments and CI, and
362
388
  finalizes the PR. P0 and P1 fixes require another review. P2-only work is
363
389
  verified without another reviewer round. A five-minute CI wait routes to
364
390
  additional useful local testing. New evidence can route through autoplan
@@ -1,7 +1,15 @@
1
+ import { type ChangeVerificationInput, type ChangeVerificationResult, type VerificationCheck } from "./change-verification.workflow.js";
2
+ import { parsePreparedWorkspace, type PreparedWorkspace, type WorkspaceMode, type WorkspacePreparationInput } from "./workspace-preparation.workflow.js";
1
3
  export type AutodocInput = {
2
4
  task: string;
3
5
  plan?: unknown;
4
6
  repository?: string;
7
+ baseBranch?: string;
8
+ scope?: string;
9
+ workspaceMode?: WorkspaceMode;
10
+ directDefaultBranchAuthorized?: boolean;
11
+ preparedWorkspace?: PreparedWorkspace;
12
+ verificationChecks?: VerificationCheck[];
5
13
  documents?: string[];
6
14
  evidence?: unknown;
7
15
  };
@@ -16,13 +24,18 @@ export type DocumentedPlan = {
16
24
  digests: Record<string, string>;
17
25
  evidence: unknown;
18
26
  };
19
- verification: unknown;
27
+ verification: ChangeVerificationResult | {
28
+ route: "ready";
29
+ reason: string;
30
+ };
31
+ workspace?: PreparedWorkspace;
20
32
  };
21
33
  export type AutodocBlocked = {
22
34
  status: "blocked";
23
35
  task: string;
24
36
  reason: string;
25
37
  evidence: unknown;
38
+ sourceNode?: string;
26
39
  };
27
40
  export declare const autodocWorkflow: import("../workflows/types.js").WorkflowDefinition<AutodocInput, {
28
41
  readonly ready: {
@@ -33,17 +46,191 @@ export declare const autodocWorkflow: import("../workflows/types.js").WorkflowDe
33
46
  readonly from: "blocked";
34
47
  readonly validate: (value: unknown) => AutodocBlocked;
35
48
  };
36
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
49
+ }, {
50
+ readonly workspace: import("../workflows/types.js").WorkflowIncludeDefinition<import("../workflows/types.js").WorkflowDefinition<WorkspacePreparationInput, {
51
+ readonly ready: {
52
+ readonly from: "ready";
53
+ readonly validate: typeof parsePreparedWorkspace;
54
+ };
55
+ readonly blocked: {
56
+ readonly from: "blocked";
57
+ readonly validate: (value: unknown) => {
58
+ route: "ready" | "propose" | "blocked";
59
+ selectedMode?: import("./workspace-preparation.workflow.js").PreparedWorkspaceMode;
60
+ preparedWorkspace?: PreparedWorkspace;
61
+ repository: string;
62
+ baseBranch: string;
63
+ baseRevision?: string;
64
+ currentBranch?: string;
65
+ preExistingChangedPaths: string[];
66
+ reason: string;
67
+ evidence: string[];
68
+ };
69
+ };
70
+ }, import("../workflows/types.js").WorkflowIncludeMap> & {
71
+ nodes: {
72
+ readonly inspect: import("../workflows/types.js").FunctionActionNodeDefinition;
73
+ readonly propose: import("../workflows/types.js").SubmittedAgentNodeDefinition;
74
+ readonly apply: import("../workflows/types.js").FunctionActionNodeDefinition;
75
+ readonly ready: import("../workflows/types.js").ComputeNodeDefinition;
76
+ readonly blocked: import("../workflows/types.js").ComputeNodeDefinition;
77
+ };
78
+ includes?: import("../workflows/types.js").WorkflowIncludeMap;
79
+ exits?: {
80
+ readonly ready: {
81
+ readonly from: "ready";
82
+ readonly validate: typeof parsePreparedWorkspace;
83
+ };
84
+ readonly blocked: {
85
+ readonly from: "blocked";
86
+ readonly validate: (value: unknown) => {
87
+ route: "ready" | "propose" | "blocked";
88
+ selectedMode?: import("./workspace-preparation.workflow.js").PreparedWorkspaceMode;
89
+ preparedWorkspace?: PreparedWorkspace;
90
+ repository: string;
91
+ baseBranch: string;
92
+ baseRevision?: string;
93
+ currentBranch?: string;
94
+ preExistingChangedPaths: string[];
95
+ reason: string;
96
+ evidence: string[];
97
+ };
98
+ };
99
+ };
100
+ }>;
101
+ readonly verification: import("../workflows/types.js").WorkflowIncludeDefinition<import("../workflows/types.js").WorkflowDefinition<ChangeVerificationInput, {
102
+ readonly ready: {
103
+ readonly from: "ready";
104
+ readonly validate: (value: unknown) => ChangeVerificationResult;
105
+ };
106
+ readonly blocked: {
107
+ readonly from: "blocked";
108
+ readonly validate: (value: unknown) => ChangeVerificationResult;
109
+ };
110
+ }, import("../workflows/types.js").WorkflowIncludeMap> & {
111
+ nodes: {
112
+ readonly selectChecks: import("../workflows/types.js").ComputeNodeDefinition;
113
+ readonly planChecks: import("../workflows/types.js").SubmittedAgentNodeDefinition;
114
+ readonly runCandidate: import("../workflows/types.js").FunctionActionNodeDefinition;
115
+ readonly runBase: import("../workflows/types.js").FunctionActionNodeDefinition;
116
+ readonly classify: import("../workflows/types.js").ComputeNodeDefinition;
117
+ readonly repairGuard: import("../workflows/types.js").ComputeNodeDefinition;
118
+ readonly mechanicalRepair: import("../workflows/types.js").FunctionActionNodeDefinition;
119
+ readonly semanticRepair: import("../workflows/types.js").SubmittedAgentNodeDefinition;
120
+ readonly judge: import("../workflows/types.js").SubmittedAgentNodeDefinition;
121
+ readonly ready: import("../workflows/types.js").ComputeNodeDefinition;
122
+ readonly blocked: import("../workflows/types.js").ComputeNodeDefinition;
123
+ };
124
+ includes?: import("../workflows/types.js").WorkflowIncludeMap;
125
+ exits?: {
126
+ readonly ready: {
127
+ readonly from: "ready";
128
+ readonly validate: (value: unknown) => ChangeVerificationResult;
129
+ };
130
+ readonly blocked: {
131
+ readonly from: "blocked";
132
+ readonly validate: (value: unknown) => ChangeVerificationResult;
133
+ };
134
+ };
135
+ }>;
136
+ }> & {
37
137
  nodes: {
38
138
  readonly prepare: import("../workflows/types.js").ComputeNodeDefinition;
39
- readonly locatePlan: import("../workflows/types.js").AgentNodeDefinition;
40
- readonly inspectDocumentation: import("../workflows/types.js").AgentNodeDefinition;
41
- readonly updateDocumentation: import("../workflows/types.js").AgentNodeDefinition;
42
- readonly verifyDocumentation: import("../workflows/types.js").AgentNodeDefinition;
139
+ readonly locatePlan: import("../workflows/types.js").SubmittedAgentNodeDefinition;
140
+ readonly workspaceGuard: import("../workflows/types.js").ComputeNodeDefinition;
141
+ readonly inspectDocumentation: import("../workflows/types.js").SubmittedAgentNodeDefinition;
142
+ readonly updateDocumentation: import("../workflows/types.js").SubmittedAgentNodeDefinition;
43
143
  readonly finalize: import("../workflows/types.js").ComputeNodeDefinition;
44
144
  readonly blocked: import("../workflows/types.js").ComputeNodeDefinition;
45
145
  };
46
- includes?: import("../workflows/types.js").WorkflowIncludeMap;
146
+ includes?: {
147
+ readonly workspace: import("../workflows/types.js").WorkflowIncludeDefinition<import("../workflows/types.js").WorkflowDefinition<WorkspacePreparationInput, {
148
+ readonly ready: {
149
+ readonly from: "ready";
150
+ readonly validate: typeof parsePreparedWorkspace;
151
+ };
152
+ readonly blocked: {
153
+ readonly from: "blocked";
154
+ readonly validate: (value: unknown) => {
155
+ route: "ready" | "propose" | "blocked";
156
+ selectedMode?: import("./workspace-preparation.workflow.js").PreparedWorkspaceMode;
157
+ preparedWorkspace?: PreparedWorkspace;
158
+ repository: string;
159
+ baseBranch: string;
160
+ baseRevision?: string;
161
+ currentBranch?: string;
162
+ preExistingChangedPaths: string[];
163
+ reason: string;
164
+ evidence: string[];
165
+ };
166
+ };
167
+ }, import("../workflows/types.js").WorkflowIncludeMap> & {
168
+ nodes: {
169
+ readonly inspect: import("../workflows/types.js").FunctionActionNodeDefinition;
170
+ readonly propose: import("../workflows/types.js").SubmittedAgentNodeDefinition;
171
+ readonly apply: import("../workflows/types.js").FunctionActionNodeDefinition;
172
+ readonly ready: import("../workflows/types.js").ComputeNodeDefinition;
173
+ readonly blocked: import("../workflows/types.js").ComputeNodeDefinition;
174
+ };
175
+ includes?: import("../workflows/types.js").WorkflowIncludeMap;
176
+ exits?: {
177
+ readonly ready: {
178
+ readonly from: "ready";
179
+ readonly validate: typeof parsePreparedWorkspace;
180
+ };
181
+ readonly blocked: {
182
+ readonly from: "blocked";
183
+ readonly validate: (value: unknown) => {
184
+ route: "ready" | "propose" | "blocked";
185
+ selectedMode?: import("./workspace-preparation.workflow.js").PreparedWorkspaceMode;
186
+ preparedWorkspace?: PreparedWorkspace;
187
+ repository: string;
188
+ baseBranch: string;
189
+ baseRevision?: string;
190
+ currentBranch?: string;
191
+ preExistingChangedPaths: string[];
192
+ reason: string;
193
+ evidence: string[];
194
+ };
195
+ };
196
+ };
197
+ }>;
198
+ readonly verification: import("../workflows/types.js").WorkflowIncludeDefinition<import("../workflows/types.js").WorkflowDefinition<ChangeVerificationInput, {
199
+ readonly ready: {
200
+ readonly from: "ready";
201
+ readonly validate: (value: unknown) => ChangeVerificationResult;
202
+ };
203
+ readonly blocked: {
204
+ readonly from: "blocked";
205
+ readonly validate: (value: unknown) => ChangeVerificationResult;
206
+ };
207
+ }, import("../workflows/types.js").WorkflowIncludeMap> & {
208
+ nodes: {
209
+ readonly selectChecks: import("../workflows/types.js").ComputeNodeDefinition;
210
+ readonly planChecks: import("../workflows/types.js").SubmittedAgentNodeDefinition;
211
+ readonly runCandidate: import("../workflows/types.js").FunctionActionNodeDefinition;
212
+ readonly runBase: import("../workflows/types.js").FunctionActionNodeDefinition;
213
+ readonly classify: import("../workflows/types.js").ComputeNodeDefinition;
214
+ readonly repairGuard: import("../workflows/types.js").ComputeNodeDefinition;
215
+ readonly mechanicalRepair: import("../workflows/types.js").FunctionActionNodeDefinition;
216
+ readonly semanticRepair: import("../workflows/types.js").SubmittedAgentNodeDefinition;
217
+ readonly judge: import("../workflows/types.js").SubmittedAgentNodeDefinition;
218
+ readonly ready: import("../workflows/types.js").ComputeNodeDefinition;
219
+ readonly blocked: import("../workflows/types.js").ComputeNodeDefinition;
220
+ };
221
+ includes?: import("../workflows/types.js").WorkflowIncludeMap;
222
+ exits?: {
223
+ readonly ready: {
224
+ readonly from: "ready";
225
+ readonly validate: (value: unknown) => ChangeVerificationResult;
226
+ };
227
+ readonly blocked: {
228
+ readonly from: "blocked";
229
+ readonly validate: (value: unknown) => ChangeVerificationResult;
230
+ };
231
+ };
232
+ }>;
233
+ };
47
234
  exits?: {
48
235
  readonly ready: {
49
236
  readonly from: "finalize";