@osolmaz/pi-workflows 0.12.0 → 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 (257) hide show
  1. package/README.md +56 -31
  2. package/dist/builtins/autodoc.workflow.d.ts +4 -4
  3. package/dist/builtins/autoimplement.workflow.d.ts +797 -142
  4. package/dist/builtins/autoimplement.workflow.js +17 -105
  5. package/dist/builtins/autoimplement.workflow.js.map +1 -1
  6. package/dist/builtins/autoplan.workflow.d.ts +126 -13
  7. package/dist/builtins/autoplan.workflow.js +200 -29
  8. package/dist/builtins/autoplan.workflow.js.map +1 -1
  9. package/dist/builtins/catalog.js +7 -5
  10. package/dist/builtins/catalog.js.map +1 -1
  11. package/dist/builtins/index.d.ts +4 -2
  12. package/dist/builtins/index.js +3 -1
  13. package/dist/builtins/index.js.map +1 -1
  14. package/dist/builtins/monitor.workflow.d.ts +56 -23
  15. package/dist/builtins/monitor.workflow.js +508 -329
  16. package/dist/builtins/monitor.workflow.js.map +1 -1
  17. package/dist/builtins/pi-agent-group.d.ts +72 -0
  18. package/dist/builtins/pi-agent-group.js +1087 -0
  19. package/dist/builtins/pi-agent-group.js.map +1 -0
  20. package/dist/builtins/plain-summary.workflow.d.ts +32 -0
  21. package/dist/builtins/plain-summary.workflow.js +134 -0
  22. package/dist/builtins/plain-summary.workflow.js.map +1 -0
  23. package/dist/builtins/plan-approval.workflow.d.ts +39 -5
  24. package/dist/builtins/plan-approval.workflow.js +92 -14
  25. package/dist/builtins/plan-approval.workflow.js.map +1 -1
  26. package/dist/builtins/plan-change.workflow.d.ts +449 -0
  27. package/dist/builtins/plan-change.workflow.js +256 -0
  28. package/dist/builtins/plan-change.workflow.js.map +1 -0
  29. package/dist/builtins/plan-presentation.js +2 -2
  30. package/dist/builtins/plan-presentation.js.map +1 -1
  31. package/dist/builtins/sanity-check.workflow.d.ts +50 -6
  32. package/dist/builtins/sanity-check.workflow.js +150 -28
  33. package/dist/builtins/sanity-check.workflow.js.map +1 -1
  34. package/dist/controllers/effects.d.ts +3 -2
  35. package/dist/controllers/effects.js +8 -1
  36. package/dist/controllers/effects.js.map +1 -1
  37. package/dist/controllers/index.d.ts +1 -1
  38. package/dist/controllers/index.js +1 -1
  39. package/dist/controllers/index.js.map +1 -1
  40. package/dist/controllers/manager.d.ts +1 -0
  41. package/dist/controllers/manager.js +41 -17
  42. package/dist/controllers/manager.js.map +1 -1
  43. package/dist/controllers/sqlite.d.ts +107 -85
  44. package/dist/controllers/sqlite.js +1611 -1486
  45. package/dist/controllers/sqlite.js.map +1 -1
  46. package/dist/controllers/store.d.ts +9 -8
  47. package/dist/controllers/store.js +1 -31
  48. package/dist/controllers/store.js.map +1 -1
  49. package/dist/controllers/types.d.ts +3 -0
  50. package/dist/controllers/workflow-engine-scheduler.d.ts +1 -1
  51. package/dist/controllers/workflow-engine-scheduler.js +3 -5
  52. package/dist/controllers/workflow-engine-scheduler.js.map +1 -1
  53. package/dist/controllers/workflows.d.ts +2 -2
  54. package/dist/controllers/workflows.js +11 -10
  55. package/dist/controllers/workflows.js.map +1 -1
  56. package/dist/extension/controller-host.js +2 -2
  57. package/dist/extension/controller-host.js.map +1 -1
  58. package/dist/extension/decision-channels.d.ts +4 -2
  59. package/dist/extension/decision-channels.js +333 -146
  60. package/dist/extension/decision-channels.js.map +1 -1
  61. package/dist/extension/executor.d.ts +9 -2
  62. package/dist/extension/executor.js +89 -2
  63. package/dist/extension/executor.js.map +1 -1
  64. package/dist/extension/herdr-viewer.d.ts +0 -1
  65. package/dist/extension/herdr-viewer.js +0 -4
  66. package/dist/extension/herdr-viewer.js.map +1 -1
  67. package/dist/extension/index.js +209 -127
  68. package/dist/extension/index.js.map +1 -1
  69. package/dist/extension/recorder.d.ts +3 -10
  70. package/dist/extension/recorder.js +13 -22
  71. package/dist/extension/recorder.js.map +1 -1
  72. package/dist/extension/session-events.d.ts +2 -2
  73. package/dist/extension/step-message.d.ts +7 -2
  74. package/dist/extension/step-message.js +94 -2
  75. package/dist/extension/step-message.js.map +1 -1
  76. package/dist/extension/widget.js +29 -3
  77. package/dist/extension/widget.js.map +1 -1
  78. package/dist/host/rpc-executor.d.ts +3 -0
  79. package/dist/host/rpc-executor.js +2 -0
  80. package/dist/host/rpc-executor.js.map +1 -1
  81. package/dist/host/runner.d.ts +3 -6
  82. package/dist/host/runner.js +83 -32
  83. package/dist/host/runner.js.map +1 -1
  84. package/dist/render/graph-render.js +15 -10
  85. package/dist/render/graph-render.js.map +1 -1
  86. package/dist/state/database.d.ts +35 -0
  87. package/dist/state/database.js +287 -0
  88. package/dist/state/database.js.map +1 -0
  89. package/dist/state/index.d.ts +4 -0
  90. package/dist/state/index.js +5 -0
  91. package/dist/state/index.js.map +1 -0
  92. package/dist/state/json.d.ts +6 -0
  93. package/dist/state/json.js +38 -0
  94. package/dist/state/json.js.map +1 -0
  95. package/dist/state/mutation.d.ts +57 -0
  96. package/dist/state/mutation.js +255 -0
  97. package/dist/state/mutation.js.map +1 -0
  98. package/dist/state/schema.d.ts +6 -0
  99. package/dist/state/schema.js +473 -0
  100. package/dist/state/schema.js.map +1 -0
  101. package/dist/viewer/cli.d.ts +2 -2
  102. package/dist/viewer/cli.js +142 -122
  103. package/dist/viewer/cli.js.map +1 -1
  104. package/dist/viewer/render.d.ts +4 -4
  105. package/dist/viewer/render.js +9 -23
  106. package/dist/viewer/render.js.map +1 -1
  107. package/dist/viewer/session-reducer.d.ts +1 -1
  108. package/dist/viewer/session-reducer.js +1 -1
  109. package/dist/viewer/tui.d.ts +3 -3
  110. package/dist/viewer/tui.js +15 -13
  111. package/dist/viewer/tui.js.map +1 -1
  112. package/dist/viewer/watch.d.ts +2 -5
  113. package/dist/viewer/watch.js +13 -13
  114. package/dist/viewer/watch.js.map +1 -1
  115. package/dist/workflows/catalog.js +7 -2
  116. package/dist/workflows/catalog.js.map +1 -1
  117. package/dist/workflows/composition.js +20 -2
  118. package/dist/workflows/composition.js.map +1 -1
  119. package/dist/workflows/decision-presentation.d.ts +1 -1
  120. package/dist/workflows/decision-presentation.js +51 -38
  121. package/dist/workflows/decision-presentation.js.map +1 -1
  122. package/dist/workflows/definition.d.ts +6 -2
  123. package/dist/workflows/definition.js +17 -0
  124. package/dist/workflows/definition.js.map +1 -1
  125. package/dist/workflows/engine.d.ts +7 -7
  126. package/dist/workflows/engine.js +196 -115
  127. package/dist/workflows/engine.js.map +1 -1
  128. package/dist/workflows/errors.d.ts +16 -3
  129. package/dist/workflows/errors.js +18 -3
  130. package/dist/workflows/errors.js.map +1 -1
  131. package/dist/workflows/human-decision.d.ts +45 -8
  132. package/dist/workflows/human-decision.js +641 -274
  133. package/dist/workflows/human-decision.js.map +1 -1
  134. package/dist/workflows/index.d.ts +5 -6
  135. package/dist/workflows/index.js +4 -5
  136. package/dist/workflows/index.js.map +1 -1
  137. package/dist/workflows/progress.d.ts +1 -0
  138. package/dist/workflows/progress.js +15 -3
  139. package/dist/workflows/progress.js.map +1 -1
  140. package/dist/workflows/schema.js +27 -1
  141. package/dist/workflows/schema.js.map +1 -1
  142. package/dist/workflows/store.d.ts +83 -103
  143. package/dist/workflows/store.js +907 -951
  144. package/dist/workflows/store.js.map +1 -1
  145. package/dist/workflows/types.d.ts +88 -126
  146. package/docs/CONTROLLERS.md +10 -8
  147. package/docs/DEFERRED_TURNS.md +2 -2
  148. package/docs/DESIGN_PHILOSOPHY.md +4 -2
  149. package/docs/HUMAN_DECISIONS.md +36 -47
  150. package/docs/HUMAN_DECISION_PRESENTATIONS.md +14 -24
  151. package/docs/MONITOR.md +179 -237
  152. package/docs/SQLITE_STATE.md +219 -0
  153. package/docs/WORKFLOW_COMPOSITION.md +27 -26
  154. package/docs/WORKFLOW_STEP_MESSAGES.md +20 -18
  155. package/docs/WORKFLOW_UPDATES.md +10 -9
  156. package/docs/development.md +9 -9
  157. package/docs/live-replay-protocol.md +28 -37
  158. package/docs/plans/2026-08-16-workflow-updates-plan.md +1 -1
  159. package/docs/plans/2026-08-19-human-decision-gates-plan.md +1 -1
  160. package/docs/plans/2026-08-21-autoimplement-timeout-fallback-plan.md +1 -1
  161. package/docs/plans/2026-08-21-plan-change-approval-policy-plan.md +322 -0
  162. package/docs/plans/2026-08-21-sanity-check-plan.md +217 -95
  163. package/docs/plans/2026-08-22-goal-finishing-monitor-plan.md +200 -0
  164. package/docs/plans/2026-08-23-assistant-agent-completion-plan.md +701 -0
  165. package/docs/plans/2026-08-23-sqlite-state-plan.md +970 -0
  166. package/docs/plans/replayable-run-bundles-implementation-plan.md +2 -2
  167. package/docs/plans/session-event-replay-implementation-plan.md +1 -1
  168. package/docs/plans/tui-viewer-implementation-plan.md +1 -1
  169. package/docs/session-event-journal.md +63 -434
  170. package/docs/tui-viewer.md +13 -15
  171. package/docs/workflows.md +127 -53
  172. package/examples/workflows/approved-plan.workflow.ts +19 -46
  173. package/examples/workflows/plain-summary.workflow.ts +1 -0
  174. package/herdr-plugin.toml +1 -1
  175. package/package.json +7 -7
  176. package/plugins/herdr/viewer.mjs +1 -11
  177. package/schemas/human-decision-accepted-v1.schema.json +15 -3
  178. package/schemas/human-decision-continuation-v1.schema.json +10 -1
  179. package/schemas/human-decision-delivery-v1.schema.json +8 -0
  180. package/schemas/human-decision-receipt-v1.schema.json +8 -0
  181. package/schemas/human-decision-request-v1.schema.json +24 -4
  182. package/skills/autoimplement/SKILL.md +27 -0
  183. package/skills/autoplan/SKILL.md +5 -4
  184. package/skills/monitor/SKILL.md +91 -135
  185. package/skills/pi-workflows/SKILL.md +9 -8
  186. package/skills/sanity-check/SKILL.md +44 -0
  187. package/src/builtins/autoimplement.workflow.ts +19 -118
  188. package/src/builtins/autoplan.workflow.ts +290 -40
  189. package/src/builtins/catalog.ts +7 -5
  190. package/src/builtins/index.ts +18 -1
  191. package/src/builtins/monitor.workflow.ts +673 -382
  192. package/src/builtins/pi-agent-group.ts +1407 -0
  193. package/src/builtins/plain-summary.workflow.ts +185 -0
  194. package/src/builtins/plan-approval.workflow.ts +157 -24
  195. package/src/builtins/plan-change.workflow.ts +321 -0
  196. package/src/builtins/plan-presentation.ts +2 -2
  197. package/src/builtins/sanity-check.workflow.ts +248 -48
  198. package/src/controllers/effects.ts +7 -0
  199. package/src/controllers/index.ts +0 -6
  200. package/src/controllers/manager.ts +72 -32
  201. package/src/controllers/sqlite.ts +2420 -1948
  202. package/src/controllers/store.ts +17 -38
  203. package/src/controllers/types.ts +3 -0
  204. package/src/controllers/workflow-engine-scheduler.ts +4 -8
  205. package/src/controllers/workflows.ts +45 -21
  206. package/src/extension/controller-host.ts +1 -2
  207. package/src/extension/decision-channels.ts +456 -203
  208. package/src/extension/executor.ts +105 -2
  209. package/src/extension/herdr-viewer.ts +0 -5
  210. package/src/extension/index.ts +251 -151
  211. package/src/extension/recorder.ts +13 -22
  212. package/src/extension/session-events.ts +2 -2
  213. package/src/extension/step-message.ts +106 -4
  214. package/src/extension/widget.ts +32 -5
  215. package/src/host/rpc-executor.ts +4 -0
  216. package/src/host/runner.ts +93 -41
  217. package/src/render/graph-render.ts +12 -6
  218. package/src/state/database.ts +375 -0
  219. package/src/state/index.ts +29 -0
  220. package/src/state/json.ts +42 -0
  221. package/src/state/mutation.ts +435 -0
  222. package/src/state/schema.ts +475 -0
  223. package/src/viewer/cli.ts +151 -144
  224. package/src/viewer/render.ts +19 -30
  225. package/src/viewer/session-reducer.ts +1 -1
  226. package/src/viewer/tui.ts +18 -17
  227. package/src/viewer/watch.ts +13 -17
  228. package/src/workflows/catalog.ts +7 -2
  229. package/src/workflows/composition.ts +21 -3
  230. package/src/workflows/decision-presentation.ts +56 -43
  231. package/src/workflows/definition.ts +36 -3
  232. package/src/workflows/engine.ts +228 -130
  233. package/src/workflows/errors.ts +27 -3
  234. package/src/workflows/human-decision.ts +921 -349
  235. package/src/workflows/index.ts +20 -30
  236. package/src/workflows/progress.ts +18 -3
  237. package/src/workflows/schema.ts +36 -1
  238. package/src/workflows/store.ts +1300 -1163
  239. package/src/workflows/types.ts +100 -137
  240. package/dist/builtins/sanity-check-session.d.ts +0 -17
  241. package/dist/builtins/sanity-check-session.js +0 -168
  242. package/dist/builtins/sanity-check-session.js.map +0 -1
  243. package/dist/workflows/artifacts.d.ts +0 -40
  244. package/dist/workflows/artifacts.js +0 -155
  245. package/dist/workflows/artifacts.js.map +0 -1
  246. package/dist/workflows/migrate-sources.d.ts +0 -42
  247. package/dist/workflows/migrate-sources.js +0 -133
  248. package/dist/workflows/migrate-sources.js.map +0 -1
  249. package/docs/run-bundles.md +0 -481
  250. package/schemas/human-decision-accepted-v2.schema.json +0 -50
  251. package/schemas/human-decision-delivery-v2.schema.json +0 -36
  252. package/schemas/human-decision-receipt-v2.schema.json +0 -39
  253. package/schemas/human-decision-request-v2.schema.json +0 -69
  254. package/schemas/human-decision-resolution-v2.schema.json +0 -27
  255. package/src/builtins/sanity-check-session.ts +0 -205
  256. package/src/workflows/artifacts.ts +0 -188
  257. package/src/workflows/migrate-sources.ts +0 -178
@@ -1,155 +0,0 @@
1
- import { createHash } from "node:crypto";
2
- import fs from "node:fs/promises";
3
- import path from "node:path";
4
- /**
5
- * Value externalization for run bundles (see docs/run-bundles.md): string
6
- * leaves larger than the threshold are written once, content-addressed, under
7
- * `artifacts/` and replaced by `{ "$artifact": ref }`. Because artifacts are
8
- * immutable and deduplicated by hash, the same output appearing in `outputs`,
9
- * `results`, `steps`, and the trace costs one file plus small references.
10
- */
11
- export const ARTIFACT_THRESHOLD_BYTES = 4096;
12
- export const ARTIFACTS_DIR = "artifacts";
13
- const ARTIFACT_KEY = "$artifact";
14
- const ESCAPED_KEY = "$escaped";
15
- export function isArtifactValue(value) {
16
- return (typeof value === "object" &&
17
- value !== null &&
18
- !Array.isArray(value) &&
19
- Object.keys(value).length === 1 &&
20
- ARTIFACT_KEY in value);
21
- }
22
- function isEscapedValue(value) {
23
- return (typeof value === "object" &&
24
- value !== null &&
25
- !Array.isArray(value) &&
26
- Object.keys(value).length === 1 &&
27
- ESCAPED_KEY in value);
28
- }
29
- /** True for a single-key object that would be misread as a sentinel. */
30
- function needsEscape(value) {
31
- const keys = Object.keys(value);
32
- return keys.length === 1 && (keys[0] === ARTIFACT_KEY || keys[0] === ESCAPED_KEY);
33
- }
34
- /**
35
- * Writes externalized string leaves for one run bundle. Instances serialize
36
- * their writes and deduplicate by content hash, so encoding the same large
37
- * string in several value positions touches the filesystem once.
38
- */
39
- export class ArtifactWriter {
40
- runDir;
41
- written = new Set();
42
- chain = Promise.resolve();
43
- dirCreated = false;
44
- constructor(runDir) {
45
- this.runDir = runDir;
46
- }
47
- /** True once any artifact exists for this run. */
48
- get hasArtifacts() {
49
- return this.written.size > 0;
50
- }
51
- async externalize(text) {
52
- const bytes = Buffer.from(text, "utf8");
53
- const sha256 = createHash("sha256").update(bytes).digest("hex");
54
- const relativePath = `${ARTIFACTS_DIR}/sha256-${sha256}.txt`;
55
- const task = this.chain.then(async () => {
56
- if (this.written.has(sha256)) {
57
- return;
58
- }
59
- if (!this.dirCreated) {
60
- await fs.mkdir(path.join(this.runDir, ARTIFACTS_DIR), { recursive: true, mode: 0o700 });
61
- this.dirCreated = true;
62
- }
63
- const filePath = path.join(this.runDir, relativePath);
64
- // Content-addressed files are immutable; an existing file is complete
65
- // unless a previous crash left a partial write, which the temp-rename
66
- // pattern prevents.
67
- const tempPath = `${filePath}.${process.pid}.tmp`;
68
- await fs.writeFile(tempPath, bytes, { mode: 0o600 });
69
- await fs.rename(tempPath, filePath);
70
- this.written.add(sha256);
71
- });
72
- this.chain = task.catch(() => undefined);
73
- await task;
74
- return {
75
- $artifact: {
76
- path: relativePath,
77
- mediaType: "text/plain",
78
- bytes: bytes.byteLength,
79
- sha256,
80
- },
81
- };
82
- }
83
- }
84
- /**
85
- * Encode a persisted value: externalize large string leaves and escape
86
- * single-key `$artifact`/`$escaped` objects so the sentinel stays
87
- * unambiguous. Returns the original value when nothing changed.
88
- */
89
- export async function encodeValue(value, writer, thresholdBytes = ARTIFACT_THRESHOLD_BYTES) {
90
- if (typeof value === "string") {
91
- if (Buffer.byteLength(value, "utf8") <= thresholdBytes) {
92
- return value;
93
- }
94
- return await writer.externalize(value);
95
- }
96
- if (Array.isArray(value)) {
97
- const encoded = await Promise.all(value.map((item) => encodeValue(item, writer, thresholdBytes)));
98
- return encoded.some((item, index) => item !== value[index]) ? encoded : value;
99
- }
100
- if (typeof value === "object" && value !== null) {
101
- const record = value;
102
- const entries = await Promise.all(Object.entries(record).map(async ([key, item]) => [key, await encodeValue(item, writer, thresholdBytes)]));
103
- const changed = entries.some(([key, item]) => item !== record[key]);
104
- const encoded = changed ? Object.fromEntries(entries) : record;
105
- return needsEscape(record) ? { [ESCAPED_KEY]: encoded } : encoded;
106
- }
107
- return value;
108
- }
109
- /**
110
- * Walk a persisted value, replacing every `$artifact` sentinel via `resolve`
111
- * and unwrapping `$escaped` objects. `resolve` may return the artifact
112
- * contents or a placeholder; it receives the reference untouched.
113
- */
114
- export function decodeValueWith(value, resolve) {
115
- if (isArtifactValue(value)) {
116
- return resolve(value.$artifact);
117
- }
118
- if (isEscapedValue(value)) {
119
- // The unwrapped object is user data: process its children but do not
120
- // re-test the object itself as a sentinel.
121
- return decodeChildren(value.$escaped, resolve);
122
- }
123
- if (Array.isArray(value)) {
124
- return value.map((item) => decodeValueWith(item, resolve));
125
- }
126
- if (typeof value === "object" && value !== null) {
127
- return decodeChildren(value, resolve);
128
- }
129
- return value;
130
- }
131
- function decodeChildren(record, resolve) {
132
- return Object.fromEntries(Object.entries(record).map(([key, item]) => [key, decodeValueWith(item, resolve)]));
133
- }
134
- /** Resolve every artifact reference in `value` by reading the bundle files. */
135
- export async function resolveArtifacts(value, runDir) {
136
- const refs = [];
137
- decodeValueWith(value, (ref) => {
138
- refs.push(ref);
139
- return null;
140
- });
141
- const contents = new Map();
142
- for (const ref of refs) {
143
- if (contents.has(ref.path)) {
144
- continue;
145
- }
146
- const resolved = path.resolve(runDir, ref.path);
147
- // A reference must never escape the bundle directory.
148
- if (!resolved.startsWith(path.resolve(runDir) + path.sep)) {
149
- throw new Error(`Artifact path escapes the bundle: ${ref.path}`);
150
- }
151
- contents.set(ref.path, await fs.readFile(resolved, "utf8"));
152
- }
153
- return decodeValueWith(value, (ref) => contents.get(ref.path) ?? null);
154
- }
155
- //# sourceMappingURL=artifacts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/workflows/artifacts.ts"],"names":[],"mappings":"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"}
@@ -1,42 +0,0 @@
1
- import type { BuiltinWorkflowCatalog } from "./catalog.js";
2
- import { WorkflowRunStore } from "./store.js";
3
- export type LegacySourceMigrationQueue = {
4
- repairCanonicalWorkflowSourceRun(options: {
5
- runId: string;
6
- workflowName: string;
7
- workflowSourceRef: string;
8
- runnerId: string;
9
- claimToken: string;
10
- leaseMs: number;
11
- }): "unchanged" | "claimed" | false;
12
- claimLegacyWorkflowSourceRun(options: {
13
- runId: string;
14
- workflowName: string;
15
- oldWorkflowPath: string;
16
- workflowSourceRef: string;
17
- runnerId: string;
18
- claimToken: string;
19
- leaseMs: number;
20
- }): boolean;
21
- parkWorkflowRun(options: {
22
- runId: string;
23
- claimToken: string;
24
- }): boolean;
25
- getWorkflowRun(runId: string): {
26
- status: "queued" | "starting" | "running" | "parked" | "done" | "failed" | "cancelled";
27
- } | undefined;
28
- setWorkflowRunOriginSession?(runId: string, originSessionId: string): boolean;
29
- };
30
- export type LegacySourceMigrationResult = {
31
- migratedRunIds: string[];
32
- blocked: {
33
- runId: string;
34
- reason: string;
35
- }[];
36
- };
37
- /** One bounded migration for nonterminal runs created before canonical sources. */
38
- export declare function migrateLegacyWorkflowSources(options: {
39
- catalog: BuiltinWorkflowCatalog;
40
- store?: WorkflowRunStore;
41
- queue?: LegacySourceMigrationQueue;
42
- }): Promise<LegacySourceMigrationResult>;
@@ -1,133 +0,0 @@
1
- import { randomUUID } from "node:crypto";
2
- import fs from "node:fs/promises";
3
- import path from "node:path";
4
- import { WorkflowRunStore, listRunBundles } from "./store.js";
5
- const MIGRATION_LEASE_MS = 30_000;
6
- /** One bounded migration for nonterminal runs created before canonical sources. */
7
- export async function migrateLegacyWorkflowSources(options) {
8
- const store = options.store ?? new WorkflowRunStore();
9
- const result = { migratedRunIds: [], blocked: [] };
10
- for (const bundle of await listRunBundles(store.outputRoot)) {
11
- const state = bundle.state;
12
- if (state.status !== "running" && state.status !== "waiting")
13
- continue;
14
- if (options.queue?.setWorkflowRunOriginSession !== undefined &&
15
- bundle.sessionBinding !== null) {
16
- options.queue.setWorkflowRunOriginSession(state.runId, bundle.sessionBinding.piSessionId);
17
- }
18
- if (state.workflowSource !== undefined) {
19
- if (options.queue === undefined)
20
- continue;
21
- const claimToken = randomUUID();
22
- const repaired = options.queue.repairCanonicalWorkflowSourceRun({
23
- runId: state.runId,
24
- workflowName: state.workflowName,
25
- workflowSourceRef: sourceRef(state.workflowSource),
26
- runnerId: `source-migration-${process.pid}`,
27
- claimToken,
28
- leaseMs: MIGRATION_LEASE_MS,
29
- });
30
- if (repaired === false) {
31
- // Another runner can own a canonical run during startup. Its source is
32
- // already safe; the normal queue lease will make it claimable later.
33
- }
34
- else if (repaired === "claimed" &&
35
- !options.queue.parkWorkflowRun({ runId: state.runId, claimToken })) {
36
- result.blocked.push({
37
- runId: state.runId,
38
- reason: "canonical queue repair could not release its claim",
39
- });
40
- }
41
- continue;
42
- }
43
- if (state.workflowPath === undefined || state.workflowHash === undefined) {
44
- result.blocked.push({ runId: state.runId, reason: "legacy workflow identity is incomplete" });
45
- continue;
46
- }
47
- const legacyPath = {
48
- workflowName: state.workflowName,
49
- workflowPath: state.workflowPath,
50
- };
51
- const pathEntry = options.catalog.legacyPathEntry(legacyPath);
52
- let workflowSource;
53
- let workflowSourceRef;
54
- if (pathEntry === undefined) {
55
- workflowSource = {
56
- kind: "file",
57
- path: path.resolve(state.workflowPath),
58
- hash: state.workflowHash,
59
- };
60
- workflowSourceRef = workflowSource.path;
61
- }
62
- else {
63
- const legacy = options.catalog.matchLegacy({
64
- ...legacyPath,
65
- workflowHash: state.workflowHash,
66
- });
67
- if (legacy === undefined) {
68
- const reason = `legacy built-in ${pathEntry.id} has an unknown source revision`;
69
- result.blocked.push({ runId: state.runId, reason });
70
- continue;
71
- }
72
- workflowSource = {
73
- kind: "builtin",
74
- id: legacy.entry.id,
75
- revision: legacy.revision,
76
- };
77
- workflowSourceRef = legacy.entry.ref;
78
- }
79
- const claimToken = randomUUID();
80
- const queueIsDone = options.queue?.getWorkflowRun(state.runId)?.status === "done";
81
- if (options.queue !== undefined &&
82
- !queueIsDone &&
83
- !options.queue.claimLegacyWorkflowSourceRun({
84
- runId: state.runId,
85
- workflowName: state.workflowName,
86
- oldWorkflowPath: state.workflowPath,
87
- workflowSourceRef,
88
- runnerId: `source-migration-${process.pid}`,
89
- claimToken,
90
- leaseMs: MIGRATION_LEASE_MS,
91
- })) {
92
- result.blocked.push({
93
- runId: state.runId,
94
- reason: "matching queue row is active or unavailable",
95
- });
96
- continue;
97
- }
98
- const migrated = {
99
- ...state,
100
- workflowSource,
101
- };
102
- delete migrated.workflowPath;
103
- delete migrated.workflowHash;
104
- const migratedManifest = {
105
- ...bundle.manifest,
106
- workflowSource: migrated.workflowSource,
107
- };
108
- delete migratedManifest.workflowPath;
109
- // State is the migration commit point. Queue and manifest updates are
110
- // idempotent, so a crash before this write can safely retry.
111
- await writeJsonAtomic(path.join(bundle.runDir, "manifest.json"), migratedManifest);
112
- await writeJsonAtomic(path.join(bundle.runDir, "state.json"), migrated);
113
- if (options.queue !== undefined &&
114
- !queueIsDone &&
115
- !options.queue.parkWorkflowRun({ runId: state.runId, claimToken })) {
116
- result.blocked.push({
117
- runId: state.runId,
118
- reason: "migration completed but its queue claim could not be released",
119
- });
120
- }
121
- result.migratedRunIds.push(state.runId);
122
- }
123
- return result;
124
- }
125
- function sourceRef(source) {
126
- return source.kind === "builtin" ? `builtin:${source.id}` : source.path;
127
- }
128
- async function writeJsonAtomic(filePath, value) {
129
- const tempPath = `${filePath}.${process.pid}.${randomUUID()}.source-migration.tmp`;
130
- await fs.writeFile(tempPath, `${JSON.stringify(value, null, 2)}\n`, { mode: 0o600 });
131
- await fs.rename(tempPath, filePath);
132
- }
133
- //# sourceMappingURL=migrate-sources.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate-sources.js","sourceRoot":"","sources":["../../src/workflows/migrate-sources.ts"],"names":[],"mappings":"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"}