@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,178 +0,0 @@
1
- import { randomUUID } from "node:crypto";
2
- import fs from "node:fs/promises";
3
- import path from "node:path";
4
- import type { BuiltinWorkflowCatalog } from "./catalog.js";
5
- import { WorkflowRunStore, listRunBundles } from "./store.js";
6
- import type { WorkflowRunState, WorkflowSource } from "./types.js";
7
-
8
- export type LegacySourceMigrationQueue = {
9
- repairCanonicalWorkflowSourceRun(options: {
10
- runId: string;
11
- workflowName: string;
12
- workflowSourceRef: string;
13
- runnerId: string;
14
- claimToken: string;
15
- leaseMs: number;
16
- }): "unchanged" | "claimed" | false;
17
- claimLegacyWorkflowSourceRun(options: {
18
- runId: string;
19
- workflowName: string;
20
- oldWorkflowPath: string;
21
- workflowSourceRef: string;
22
- runnerId: string;
23
- claimToken: string;
24
- leaseMs: number;
25
- }): boolean;
26
- parkWorkflowRun(options: { runId: string; claimToken: string }): boolean;
27
- getWorkflowRun(runId: string):
28
- | {
29
- status: "queued" | "starting" | "running" | "parked" | "done" | "failed" | "cancelled";
30
- }
31
- | undefined;
32
- setWorkflowRunOriginSession?(runId: string, originSessionId: string): boolean;
33
- };
34
-
35
- const MIGRATION_LEASE_MS = 30_000;
36
-
37
- export type LegacySourceMigrationResult = {
38
- migratedRunIds: string[];
39
- blocked: { runId: string; reason: string }[];
40
- };
41
-
42
- /** One bounded migration for nonterminal runs created before canonical sources. */
43
- export async function migrateLegacyWorkflowSources(options: {
44
- catalog: BuiltinWorkflowCatalog;
45
- store?: WorkflowRunStore;
46
- queue?: LegacySourceMigrationQueue;
47
- }): Promise<LegacySourceMigrationResult> {
48
- const store = options.store ?? new WorkflowRunStore();
49
- const result: LegacySourceMigrationResult = { migratedRunIds: [], blocked: [] };
50
- for (const bundle of await listRunBundles(store.outputRoot)) {
51
- const state = bundle.state;
52
- if (state.status !== "running" && state.status !== "waiting") continue;
53
- if (
54
- options.queue?.setWorkflowRunOriginSession !== undefined &&
55
- bundle.sessionBinding !== null
56
- ) {
57
- options.queue.setWorkflowRunOriginSession(state.runId, bundle.sessionBinding.piSessionId);
58
- }
59
- if (state.workflowSource !== undefined) {
60
- if (options.queue === undefined) continue;
61
- const claimToken = randomUUID();
62
- const repaired = options.queue.repairCanonicalWorkflowSourceRun({
63
- runId: state.runId,
64
- workflowName: state.workflowName,
65
- workflowSourceRef: sourceRef(state.workflowSource),
66
- runnerId: `source-migration-${process.pid}`,
67
- claimToken,
68
- leaseMs: MIGRATION_LEASE_MS,
69
- });
70
- if (repaired === false) {
71
- // Another runner can own a canonical run during startup. Its source is
72
- // already safe; the normal queue lease will make it claimable later.
73
- } else if (
74
- repaired === "claimed" &&
75
- !options.queue.parkWorkflowRun({ runId: state.runId, claimToken })
76
- ) {
77
- result.blocked.push({
78
- runId: state.runId,
79
- reason: "canonical queue repair could not release its claim",
80
- });
81
- }
82
- continue;
83
- }
84
- if (state.workflowPath === undefined || state.workflowHash === undefined) {
85
- result.blocked.push({ runId: state.runId, reason: "legacy workflow identity is incomplete" });
86
- continue;
87
- }
88
- const legacyPath = {
89
- workflowName: state.workflowName,
90
- workflowPath: state.workflowPath,
91
- };
92
- const pathEntry = options.catalog.legacyPathEntry(legacyPath);
93
- let workflowSource: WorkflowSource;
94
- let workflowSourceRef: string;
95
- if (pathEntry === undefined) {
96
- workflowSource = {
97
- kind: "file",
98
- path: path.resolve(state.workflowPath),
99
- hash: state.workflowHash,
100
- };
101
- workflowSourceRef = workflowSource.path;
102
- } else {
103
- const legacy = options.catalog.matchLegacy({
104
- ...legacyPath,
105
- workflowHash: state.workflowHash,
106
- });
107
- if (legacy === undefined) {
108
- const reason = `legacy built-in ${pathEntry.id} has an unknown source revision`;
109
- result.blocked.push({ runId: state.runId, reason });
110
- continue;
111
- }
112
- workflowSource = {
113
- kind: "builtin",
114
- id: legacy.entry.id,
115
- revision: legacy.revision,
116
- };
117
- workflowSourceRef = legacy.entry.ref;
118
- }
119
- const claimToken = randomUUID();
120
- const queueIsDone = options.queue?.getWorkflowRun(state.runId)?.status === "done";
121
- if (
122
- options.queue !== undefined &&
123
- !queueIsDone &&
124
- !options.queue.claimLegacyWorkflowSourceRun({
125
- runId: state.runId,
126
- workflowName: state.workflowName,
127
- oldWorkflowPath: state.workflowPath,
128
- workflowSourceRef,
129
- runnerId: `source-migration-${process.pid}`,
130
- claimToken,
131
- leaseMs: MIGRATION_LEASE_MS,
132
- })
133
- ) {
134
- result.blocked.push({
135
- runId: state.runId,
136
- reason: "matching queue row is active or unavailable",
137
- });
138
- continue;
139
- }
140
- const migrated: WorkflowRunState = {
141
- ...state,
142
- workflowSource,
143
- };
144
- delete migrated.workflowPath;
145
- delete migrated.workflowHash;
146
- const migratedManifest = {
147
- ...bundle.manifest,
148
- workflowSource: migrated.workflowSource,
149
- };
150
- delete (migratedManifest as typeof migratedManifest & { workflowPath?: string }).workflowPath;
151
- // State is the migration commit point. Queue and manifest updates are
152
- // idempotent, so a crash before this write can safely retry.
153
- await writeJsonAtomic(path.join(bundle.runDir, "manifest.json"), migratedManifest);
154
- await writeJsonAtomic(path.join(bundle.runDir, "state.json"), migrated);
155
- if (
156
- options.queue !== undefined &&
157
- !queueIsDone &&
158
- !options.queue.parkWorkflowRun({ runId: state.runId, claimToken })
159
- ) {
160
- result.blocked.push({
161
- runId: state.runId,
162
- reason: "migration completed but its queue claim could not be released",
163
- });
164
- }
165
- result.migratedRunIds.push(state.runId);
166
- }
167
- return result;
168
- }
169
-
170
- function sourceRef(source: WorkflowSource): string {
171
- return source.kind === "builtin" ? `builtin:${source.id}` : source.path;
172
- }
173
-
174
- async function writeJsonAtomic(filePath: string, value: unknown): Promise<void> {
175
- const tempPath = `${filePath}.${process.pid}.${randomUUID()}.source-migration.tmp`;
176
- await fs.writeFile(tempPath, `${JSON.stringify(value, null, 2)}\n`, { mode: 0o600 });
177
- await fs.rename(tempPath, filePath);
178
- }