@osolmaz/pi-workflows 0.13.1 → 0.13.3

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 (152) hide show
  1. package/README.md +9 -7
  2. package/dist/builtins/autodoc.workflow.d.ts +5 -5
  3. package/dist/builtins/autoimplement.workflow.d.ts +69 -61
  4. package/dist/builtins/autoimplement.workflow.js +47 -8
  5. package/dist/builtins/autoimplement.workflow.js.map +1 -1
  6. package/dist/builtins/autoplan.workflow.d.ts +11 -5
  7. package/dist/builtins/autoplan.workflow.js +68 -32
  8. package/dist/builtins/autoplan.workflow.js.map +1 -1
  9. package/dist/builtins/catalog.js +4 -4
  10. package/dist/builtins/change-verification.workflow.d.ts +1 -1
  11. package/dist/builtins/plain-summary.workflow.d.ts +1 -1
  12. package/dist/builtins/plain-summary.workflow.js +35 -24
  13. package/dist/builtins/plain-summary.workflow.js.map +1 -1
  14. package/dist/builtins/plan-approval.workflow.d.ts +1 -1
  15. package/dist/builtins/plan-change.workflow.d.ts +25 -23
  16. package/dist/builtins/sanity-check.workflow.d.ts +3 -3
  17. package/dist/builtins/sanity-check.workflow.js +19 -22
  18. package/dist/builtins/sanity-check.workflow.js.map +1 -1
  19. package/dist/builtins/workspace-preparation.workflow.d.ts +1 -1
  20. package/dist/controllers/index.d.ts +2 -2
  21. package/dist/controllers/index.js.map +1 -1
  22. package/dist/controllers/sqlite.js +88 -61
  23. package/dist/controllers/sqlite.js.map +1 -1
  24. package/dist/controllers/types.d.ts +34 -0
  25. package/dist/controllers/workflow-engine-scheduler.d.ts +5 -1
  26. package/dist/controllers/workflow-engine-scheduler.js +83 -1
  27. package/dist/controllers/workflow-engine-scheduler.js.map +1 -1
  28. package/dist/controllers/workflows.d.ts +8 -1
  29. package/dist/controllers/workflows.js +36 -0
  30. package/dist/controllers/workflows.js.map +1 -1
  31. package/dist/extension/controller-host.d.ts +2 -1
  32. package/dist/extension/controller-host.js +1 -1
  33. package/dist/extension/controller-host.js.map +1 -1
  34. package/dist/extension/decision-channels.js +45 -7
  35. package/dist/extension/decision-channels.js.map +1 -1
  36. package/dist/extension/follow-up-coordinator.d.ts +27 -0
  37. package/dist/extension/follow-up-coordinator.js +131 -0
  38. package/dist/extension/follow-up-coordinator.js.map +1 -0
  39. package/dist/extension/index.d.ts +9 -0
  40. package/dist/extension/index.js +462 -76
  41. package/dist/extension/index.js.map +1 -1
  42. package/dist/extension/recorder.d.ts +1 -1
  43. package/dist/extension/recorder.js +8 -8
  44. package/dist/extension/recorder.js.map +1 -1
  45. package/dist/extension/session-events.d.ts +2 -3
  46. package/dist/extension/session-events.js +11 -10
  47. package/dist/extension/session-events.js.map +1 -1
  48. package/dist/extension/widget.js +9 -0
  49. package/dist/extension/widget.js.map +1 -1
  50. package/dist/state/database.d.ts +2 -1
  51. package/dist/state/database.js +11 -13
  52. package/dist/state/database.js.map +1 -1
  53. package/dist/state/json.js +6 -1
  54. package/dist/state/json.js.map +1 -1
  55. package/dist/state/mutation.d.ts +1 -1
  56. package/dist/state/mutation.js.map +1 -1
  57. package/dist/state/prune.d.ts +18 -0
  58. package/dist/state/prune.js +373 -0
  59. package/dist/state/prune.js.map +1 -0
  60. package/dist/state/schema.d.ts +1 -1
  61. package/dist/state/schema.js +130 -13
  62. package/dist/state/schema.js.map +1 -1
  63. package/dist/viewer/cli.d.ts +3 -1
  64. package/dist/viewer/cli.js +55 -4
  65. package/dist/viewer/cli.js.map +1 -1
  66. package/dist/viewer/render.js +19 -1
  67. package/dist/viewer/render.js.map +1 -1
  68. package/dist/viewer/session-reducer.d.ts +0 -1
  69. package/dist/viewer/session-reducer.js +2 -24
  70. package/dist/viewer/session-reducer.js.map +1 -1
  71. package/dist/workflows/composition.d.ts +2 -0
  72. package/dist/workflows/composition.js +15 -0
  73. package/dist/workflows/composition.js.map +1 -1
  74. package/dist/workflows/definition.d.ts +6 -3
  75. package/dist/workflows/definition.js +3 -0
  76. package/dist/workflows/definition.js.map +1 -1
  77. package/dist/workflows/engine.d.ts +6 -1
  78. package/dist/workflows/engine.js +303 -36
  79. package/dist/workflows/engine.js.map +1 -1
  80. package/dist/workflows/human-decision.d.ts +1 -0
  81. package/dist/workflows/human-decision.js +25 -9
  82. package/dist/workflows/human-decision.js.map +1 -1
  83. package/dist/workflows/index.d.ts +3 -1
  84. package/dist/workflows/index.js +2 -0
  85. package/dist/workflows/index.js.map +1 -1
  86. package/dist/workflows/json-patch.d.ts +47 -0
  87. package/dist/workflows/json-patch.js +298 -0
  88. package/dist/workflows/json-patch.js.map +1 -0
  89. package/dist/workflows/schema.js +29 -1
  90. package/dist/workflows/schema.js.map +1 -1
  91. package/dist/workflows/settings.d.ts +128 -0
  92. package/dist/workflows/settings.js +199 -0
  93. package/dist/workflows/settings.js.map +1 -0
  94. package/dist/workflows/store.d.ts +81 -3
  95. package/dist/workflows/store.js +1563 -50
  96. package/dist/workflows/store.js.map +1 -1
  97. package/dist/workflows/tool-input.d.ts +22 -0
  98. package/dist/workflows/tool-input.js +43 -0
  99. package/dist/workflows/tool-input.js.map +1 -1
  100. package/dist/workflows/types.d.ts +41 -6
  101. package/docs/2026-08-25-workflow-follow-ups.md +132 -0
  102. package/docs/2026-08-25-workflow-settings.md +169 -0
  103. package/docs/DEFERRED_TURNS.md +6 -0
  104. package/docs/DESIGN_PHILOSOPHY.md +2 -0
  105. package/docs/SQLITE_STATE.md +36 -17
  106. package/docs/WORKFLOW_COMPOSITION.md +15 -0
  107. package/docs/WORKFLOW_STEP_MESSAGES.md +4 -2
  108. package/docs/plans/2026-08-25-autoplan-user-intent-capture-plan.md +107 -0
  109. package/docs/plans/2026-08-25-live-workflow-settings-plan.md +532 -0
  110. package/docs/plans/2026-08-25-workflow-run-storage-plan.md +67 -0
  111. package/docs/session-event-journal.md +2 -3
  112. package/docs/tui-viewer.md +7 -6
  113. package/docs/workflows.md +58 -10
  114. package/examples/workflows/live-settings.workflow.ts +93 -0
  115. package/herdr-plugin.toml +1 -1
  116. package/package.json +1 -1
  117. package/src/builtins/autoimplement.workflow.ts +56 -8
  118. package/src/builtins/autoplan.workflow.ts +80 -32
  119. package/src/builtins/catalog.ts +4 -4
  120. package/src/builtins/plain-summary.workflow.ts +38 -40
  121. package/src/builtins/sanity-check.workflow.ts +19 -22
  122. package/src/controllers/index.ts +6 -0
  123. package/src/controllers/sqlite.ts +132 -72
  124. package/src/controllers/types.ts +40 -0
  125. package/src/controllers/workflow-engine-scheduler.ts +103 -1
  126. package/src/controllers/workflows.ts +68 -0
  127. package/src/extension/controller-host.ts +6 -1
  128. package/src/extension/decision-channels.ts +47 -7
  129. package/src/extension/follow-up-coordinator.ts +151 -0
  130. package/src/extension/index.ts +540 -89
  131. package/src/extension/recorder.ts +10 -8
  132. package/src/extension/session-events.ts +15 -13
  133. package/src/extension/widget.ts +8 -0
  134. package/src/state/database.ts +12 -12
  135. package/src/state/json.ts +6 -1
  136. package/src/state/mutation.ts +4 -1
  137. package/src/state/prune.ts +502 -0
  138. package/src/state/schema.ts +130 -13
  139. package/src/viewer/cli.ts +52 -5
  140. package/src/viewer/render.ts +43 -1
  141. package/src/viewer/session-reducer.ts +2 -29
  142. package/src/workflows/composition.ts +19 -0
  143. package/src/workflows/definition.ts +19 -5
  144. package/src/workflows/engine.ts +365 -36
  145. package/src/workflows/human-decision.ts +41 -11
  146. package/src/workflows/index.ts +43 -0
  147. package/src/workflows/json-patch.ts +375 -0
  148. package/src/workflows/schema.ts +31 -1
  149. package/src/workflows/settings.ts +430 -0
  150. package/src/workflows/store.ts +2268 -121
  151. package/src/workflows/tool-input.ts +58 -0
  152. package/src/workflows/types.ts +43 -5
@@ -0,0 +1,373 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { StateDatabase } from "./database.js";
4
+ const TERMINAL_RUN_STATUSES = new Set(["completed", "failed", "timed_out", "cancelled"]);
5
+ const LIVE_QUEUE_STATUSES = ["queued", "starting", "running", "parked"];
6
+ const UNSETTLED_EFFECT_STATUSES = ["pending", "applying", "ambiguous"];
7
+ export async function pruneState(databasePath, options) {
8
+ const cutoff = parseCutoff(options.before);
9
+ if (options.apply && options.backupPath === undefined) {
10
+ throw new Error("state prune --apply requires --backup <absolute-path>");
11
+ }
12
+ if (options.backupPath !== undefined && !path.isAbsolute(options.backupPath)) {
13
+ throw new Error("state prune backup path must be absolute");
14
+ }
15
+ const lockPath = `${databasePath}.maintenance.lock`;
16
+ const lock = options.apply ? acquireMaintenanceLock(lockPath) : undefined;
17
+ let state;
18
+ try {
19
+ state = new StateDatabase({
20
+ filePath: databasePath,
21
+ mode: options.apply ? "read-write" : "read-only",
22
+ });
23
+ const selection = selectRunTrees(state.connection, cutoff);
24
+ const sizeBefore = databaseBytes(databasePath);
25
+ const base = {
26
+ cutoff: new Date(cutoff).toISOString(),
27
+ candidateTrees: selection.candidateTrees,
28
+ blockedTrees: selection.blockedTrees,
29
+ selectedRuns: selection.runIds.length,
30
+ databaseBytesBefore: sizeBefore,
31
+ };
32
+ if (!options.apply) {
33
+ return {
34
+ ...base,
35
+ deletedRows: 0,
36
+ deletedBlobs: 0,
37
+ deletedBlobBytes: 0,
38
+ databaseBytesAfter: sizeBefore,
39
+ applied: false,
40
+ };
41
+ }
42
+ const backupPath = path.resolve(options.backupPath);
43
+ if (fs.existsSync(backupPath)) {
44
+ throw new Error(`Backup destination already exists: ${backupPath}`);
45
+ }
46
+ await state.backup(backupPath);
47
+ let deletedRows = 0;
48
+ let deletedBlobs = 0;
49
+ let deletedBlobBytes = 0;
50
+ state.connection.exec("BEGIN EXCLUSIVE");
51
+ try {
52
+ const checked = selectRunTrees(state.connection, cutoff);
53
+ if (checked.runIds.join("\0") !== selection.runIds.join("\0") ||
54
+ checked.signature !== selection.signature) {
55
+ throw new Error("Prune selection changed after backup; run the command again");
56
+ }
57
+ const beforeChanges = totalChanges(state.connection);
58
+ if (checked.runIds.length !== 0) {
59
+ deleteRunAggregates(state.connection, checked.runIds);
60
+ }
61
+ state.connection
62
+ .prepare(`DELETE FROM workflow_definitions
63
+ WHERE NOT EXISTS (
64
+ SELECT 1 FROM runs WHERE runs.definition_digest = workflow_definitions.definition_digest
65
+ )`)
66
+ .run();
67
+ state.connection
68
+ .prepare(`DELETE FROM projects
69
+ WHERE NOT EXISTS (SELECT 1 FROM runs WHERE runs.project_id = projects.project_id)
70
+ AND NOT EXISTS (
71
+ SELECT 1 FROM controller_resources
72
+ WHERE controller_resources.project_id = projects.project_id
73
+ )`)
74
+ .run();
75
+ const blobStats = unreferencedBlobStats(state.connection);
76
+ deleteUnreferencedBlobs(state.connection);
77
+ deletedRows = totalChanges(state.connection) - beforeChanges;
78
+ deletedBlobs = blobStats.count;
79
+ deletedBlobBytes = blobStats.bytes;
80
+ state.connection.exec("COMMIT");
81
+ }
82
+ catch (error) {
83
+ if (state.connection.inTransaction)
84
+ state.connection.exec("ROLLBACK");
85
+ throw error;
86
+ }
87
+ state.connection.pragma("wal_checkpoint(TRUNCATE)");
88
+ state.connection.exec("VACUUM");
89
+ state.connection.pragma("wal_checkpoint(TRUNCATE)");
90
+ state.integrityCheck();
91
+ return {
92
+ ...base,
93
+ deletedRows,
94
+ deletedBlobs,
95
+ deletedBlobBytes,
96
+ databaseBytesAfter: databaseBytes(databasePath),
97
+ applied: true,
98
+ };
99
+ }
100
+ finally {
101
+ state?.close();
102
+ if (lock !== undefined)
103
+ releaseMaintenanceLock(lockPath, lock);
104
+ }
105
+ }
106
+ function selectRunTrees(database, cutoff) {
107
+ const rows = database
108
+ .prepare(`SELECT run_id AS runId, parent_run_id AS parentRunId, status, finished_at AS finishedAt
109
+ FROM runs ORDER BY created_at, run_id`)
110
+ .all()
111
+ .filter(isRunAgeRow);
112
+ const eligible = new Set(rows
113
+ .filter((row) => TERMINAL_RUN_STATUSES.has(row.status) &&
114
+ row.finishedAt !== null &&
115
+ row.finishedAt < cutoff)
116
+ .map((row) => row.runId));
117
+ const children = new Map();
118
+ for (const row of rows) {
119
+ if (row.parentRunId === null)
120
+ continue;
121
+ const values = children.get(row.parentRunId) ?? [];
122
+ values.push(row.runId);
123
+ children.set(row.parentRunId, values);
124
+ }
125
+ const roots = rows.filter((row) => eligible.has(row.runId) && (row.parentRunId === null || !eligible.has(row.parentRunId)));
126
+ const selected = new Set();
127
+ let blockedTrees = 0;
128
+ for (const root of roots) {
129
+ const tree = descendants(root.runId, children);
130
+ if (tree.some((runId) => !eligible.has(runId)) || treeHasBlocker(database, tree)) {
131
+ blockedTrees += 1;
132
+ continue;
133
+ }
134
+ for (const runId of tree)
135
+ selected.add(runId);
136
+ }
137
+ const runIds = [...selected].sort();
138
+ return {
139
+ candidateTrees: roots.length,
140
+ blockedTrees,
141
+ runIds,
142
+ signature: selectionSignature(database, runIds),
143
+ };
144
+ }
145
+ function treeHasBlocker(database, runIds) {
146
+ const values = placeholders(runIds);
147
+ if (hasRow(database, `SELECT 1 FROM run_queue WHERE run_id IN (${values}) AND status IN (${placeholders(LIVE_QUEUE_STATUSES)})`, [...runIds, ...LIVE_QUEUE_STATUSES]) ||
148
+ hasRow(database, `SELECT 1 FROM workflow_follow_ups
149
+ WHERE run_id IN (${values}) AND status IN ('queued', 'pending_presentation', 'ready')`, runIds) ||
150
+ hasRow(database, `SELECT 1 FROM workflow_follow_up_queues
151
+ WHERE run_id IN (${values}) AND presentation_state = 'pending'`, runIds) ||
152
+ hasRow(database, `SELECT 1 FROM controller_workflows
153
+ WHERE run_id IN (${values}) OR reserved_run_id IN (${values})`, [...runIds, ...runIds]) ||
154
+ hasRow(database, `SELECT 1 FROM run_steps s JOIN node_attempts a ON a.attempt_id = s.attempt_id
155
+ WHERE a.run_id IN (${values}) AND s.run_id NOT IN (${values})`, [...runIds, ...runIds]) ||
156
+ hasRow(database, `SELECT 1 FROM continuations
157
+ WHERE (parent_run_id IN (${values}) AND continuation_run_id NOT IN (${values}))
158
+ OR (continuation_run_id IN (${values}) AND parent_run_id NOT IN (${values}))`, [...runIds, ...runIds, ...runIds, ...runIds]) ||
159
+ hasRow(database, `SELECT 1 FROM workflow_settings
160
+ WHERE (origin_run_id IN (${values}) AND active_run_id NOT IN (${values}))
161
+ OR (active_run_id IN (${values}) AND origin_run_id NOT IN (${values}))`, [...runIds, ...runIds, ...runIds, ...runIds])) {
162
+ return true;
163
+ }
164
+ const resources = relatedResourceIds(database, runIds);
165
+ const resourceValues = placeholders(resources);
166
+ if (hasRow(database, `SELECT 1 FROM leases
167
+ WHERE resource_id IN (${resourceValues}) AND owner_id IS NOT NULL AND expires_at > ?`, [...resources, Date.now()]) ||
168
+ hasRow(database, `SELECT 1 FROM effects
169
+ WHERE source_resource_id IN (${resourceValues})
170
+ AND status IN (${placeholders(UNSETTLED_EFFECT_STATUSES)})`, [...resources, ...UNSETTLED_EFFECT_STATUSES]) ||
171
+ hasRow(database, `SELECT 1 FROM channel_messages m JOIN human_decisions d ON d.decision_id = m.decision_id
172
+ WHERE d.run_id IN (${values})`, runIds)) {
173
+ return true;
174
+ }
175
+ return false;
176
+ }
177
+ function deleteRunAggregates(database, runIds) {
178
+ const values = placeholders(runIds);
179
+ const resources = relatedResourceIds(database, runIds);
180
+ const effectRows = database
181
+ .prepare(`SELECT effect_id AS effectId, resource_id AS resourceId
182
+ FROM effects WHERE source_resource_id IN (${placeholders(resources)})`)
183
+ .all(...resources)
184
+ .filter(isEffectResourceRow);
185
+ const effectIds = effectRows.map((row) => row.effectId);
186
+ if (effectIds.length !== 0) {
187
+ const effectValues = placeholders(effectIds);
188
+ database
189
+ .prepare(`DELETE FROM notifications WHERE effect_id IN (${effectValues})`)
190
+ .run(...effectIds);
191
+ database
192
+ .prepare(`DELETE FROM turn_intents WHERE effect_id IN (${effectValues})`)
193
+ .run(...effectIds);
194
+ database.prepare(`DELETE FROM effects WHERE effect_id IN (${effectValues})`).run(...effectIds);
195
+ }
196
+ database.prepare(`DELETE FROM turn_intents WHERE run_id IN (${values})`).run(...runIds);
197
+ database
198
+ .prepare(`DELETE FROM continuations
199
+ WHERE parent_run_id IN (${values}) OR continuation_run_id IN (${values})`)
200
+ .run(...runIds, ...runIds);
201
+ const allResources = [...new Set([...resources, ...effectRows.map((row) => row.resourceId)])];
202
+ if (allResources.length !== 0) {
203
+ database
204
+ .prepare(`DELETE FROM events WHERE resource_id IN (${placeholders(allResources)})`)
205
+ .run(...allResources);
206
+ }
207
+ database.prepare(`DELETE FROM runs WHERE run_id IN (${values})`).run(...runIds);
208
+ if (allResources.length !== 0) {
209
+ database
210
+ .prepare(`DELETE FROM resources WHERE resource_id IN (${placeholders(allResources)})`)
211
+ .run(...allResources);
212
+ }
213
+ }
214
+ function relatedResourceIds(database, runIds) {
215
+ if (runIds.length === 0)
216
+ return [];
217
+ const values = placeholders(runIds);
218
+ const rows = database
219
+ .prepare(`SELECT resource_id AS resourceId FROM runs WHERE run_id IN (${values})
220
+ UNION SELECT resource_id FROM session_segments WHERE run_id IN (${values})
221
+ UNION SELECT resource_id FROM human_decisions WHERE run_id IN (${values})
222
+ UNION SELECT resource_id FROM turn_intents WHERE run_id IN (${values})
223
+ UNION SELECT resource_id FROM workflow_settings
224
+ WHERE origin_run_id IN (${values}) OR active_run_id IN (${values})
225
+ UNION SELECT resource_id FROM workflow_follow_up_queues WHERE run_id IN (${values})
226
+ UNION SELECT resource_id FROM workflow_follow_ups WHERE run_id IN (${values})`)
227
+ .all(...runIds, ...runIds, ...runIds, ...runIds, ...runIds, ...runIds, ...runIds, ...runIds)
228
+ .filter(isResourceRow);
229
+ const resources = rows.map((row) => row.resourceId);
230
+ if (resources.length === 0)
231
+ return [];
232
+ const effectResources = database
233
+ .prepare(`SELECT resource_id AS resourceId FROM effects
234
+ WHERE source_resource_id IN (${placeholders(resources)})`)
235
+ .all(...resources)
236
+ .filter(isResourceRow)
237
+ .map((row) => row.resourceId);
238
+ const notificationResources = database
239
+ .prepare(`SELECT resource.resource_id AS resourceId
240
+ FROM notifications notification
241
+ JOIN effects effect ON effect.effect_id = notification.effect_id
242
+ JOIN resources resource
243
+ ON resource.resource_type = 'notification'
244
+ AND resource.aggregate_key = notification.notification_id
245
+ WHERE effect.source_resource_id IN (${placeholders(resources)})`)
246
+ .all(...resources)
247
+ .filter(isResourceRow)
248
+ .map((row) => row.resourceId);
249
+ return [...new Set([...resources, ...effectResources, ...notificationResources])];
250
+ }
251
+ function selectionSignature(database, runIds) {
252
+ if (runIds.length === 0)
253
+ return "";
254
+ const resources = relatedResourceIds(database, runIds);
255
+ const resourceRows = database
256
+ .prepare(`SELECT resource_id AS resourceId, revision, updated_at AS updatedAt
257
+ FROM resources WHERE resource_id IN (${placeholders(resources)})
258
+ ORDER BY resource_id`)
259
+ .all(...resources);
260
+ const queueRows = database
261
+ .prepare(`SELECT run_id AS runId, status, updated_at AS updatedAt
262
+ FROM run_queue WHERE run_id IN (${placeholders(runIds)}) ORDER BY run_id`)
263
+ .all(...runIds);
264
+ return JSON.stringify([resourceRows, queueRows]);
265
+ }
266
+ function unreferencedBlobStats(database) {
267
+ const predicate = blobReferencePredicate(database);
268
+ const row = database
269
+ .prepare(`SELECT count(*) AS count, COALESCE(sum(byte_length), 0) AS bytes FROM blobs WHERE ${predicate}`)
270
+ .get();
271
+ return isBlobStatsRow(row) ? row : { count: 0, bytes: 0 };
272
+ }
273
+ function deleteUnreferencedBlobs(database) {
274
+ database.prepare(`DELETE FROM blobs WHERE ${blobReferencePredicate(database)}`).run();
275
+ }
276
+ function blobReferencePredicate(database) {
277
+ const tables = database
278
+ .prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'")
279
+ .all()
280
+ .filter(isTableRow);
281
+ const references = [];
282
+ for (const table of tables) {
283
+ const foreignKeys = database.pragma(`foreign_key_list(${quoteIdentifier(table.name)})`);
284
+ if (!Array.isArray(foreignKeys))
285
+ continue;
286
+ for (const value of foreignKeys) {
287
+ if (!isForeignKeyRow(value) || value.table !== "blobs" || value.to !== "blob_hash")
288
+ continue;
289
+ references.push(`SELECT ${quoteIdentifier(value.from)} FROM ${quoteIdentifier(table.name)} ` +
290
+ `WHERE ${quoteIdentifier(value.from)} IS NOT NULL`);
291
+ }
292
+ }
293
+ return references.length === 0 ? "1 = 1" : `blob_hash NOT IN (${references.join(" UNION ")})`;
294
+ }
295
+ function descendants(root, children) {
296
+ const result = [];
297
+ const pending = [root];
298
+ while (pending.length !== 0) {
299
+ const runId = pending.pop();
300
+ result.push(runId);
301
+ pending.push(...(children.get(runId) ?? []));
302
+ }
303
+ return result;
304
+ }
305
+ function parseCutoff(value) {
306
+ const cutoff = Date.parse(value);
307
+ if (!Number.isFinite(cutoff))
308
+ throw new Error("state prune --before requires a valid timestamp");
309
+ return cutoff;
310
+ }
311
+ function databaseBytes(databasePath) {
312
+ return [databasePath, `${databasePath}-wal`]
313
+ .filter((filePath) => fs.existsSync(filePath))
314
+ .reduce((total, filePath) => total + fs.statSync(filePath).size, 0);
315
+ }
316
+ function acquireMaintenanceLock(lockPath) {
317
+ try {
318
+ return fs.openSync(lockPath, "wx", 0o600);
319
+ }
320
+ catch (error) {
321
+ if (error.code === "EEXIST") {
322
+ throw new Error(`State maintenance is already active: ${lockPath}`);
323
+ }
324
+ throw error;
325
+ }
326
+ }
327
+ function releaseMaintenanceLock(lockPath, descriptor) {
328
+ fs.closeSync(descriptor);
329
+ fs.unlinkSync(lockPath);
330
+ }
331
+ function hasRow(database, sql, values) {
332
+ return database.prepare(sql).get(...values) !== undefined;
333
+ }
334
+ function totalChanges(database) {
335
+ const row = database.prepare("SELECT total_changes() AS count").get();
336
+ return isCountRow(row) ? row.count : 0;
337
+ }
338
+ function placeholders(values) {
339
+ if (values.length === 0)
340
+ return "NULL";
341
+ return values.map(() => "?").join(", ");
342
+ }
343
+ function quoteIdentifier(value) {
344
+ return `"${value.replaceAll('"', '""')}"`;
345
+ }
346
+ function isRecord(value) {
347
+ return typeof value === "object" && value !== null && !Array.isArray(value);
348
+ }
349
+ function isRunAgeRow(value) {
350
+ return isRecord(value);
351
+ }
352
+ function isResourceRow(value) {
353
+ return isRecord(value) && typeof value.resourceId === "string";
354
+ }
355
+ function isEffectResourceRow(value) {
356
+ return (isRecord(value) && typeof value.effectId === "string" && typeof value.resourceId === "string");
357
+ }
358
+ function isBlobStatsRow(value) {
359
+ return isRecord(value) && typeof value.count === "number" && typeof value.bytes === "number";
360
+ }
361
+ function isCountRow(value) {
362
+ return isRecord(value) && typeof value.count === "number";
363
+ }
364
+ function isTableRow(value) {
365
+ return isRecord(value) && typeof value.name === "string";
366
+ }
367
+ function isForeignKeyRow(value) {
368
+ return (isRecord(value) &&
369
+ typeof value.table === "string" &&
370
+ typeof value.from === "string" &&
371
+ typeof value.to === "string");
372
+ }
373
+ //# sourceMappingURL=prune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.js","sourceRoot":"","sources":["../../src/state/prune.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  export declare const STATE_APPLICATION_ID = 1346983750;
2
2
  export declare const STATE_SCHEMA_NAME = "pi-workflows-state";
3
3
  export declare const STATE_SCHEMA_VERSION = 1;
4
- export declare const STATE_APP_VERSION = "0.12.1";
4
+ export declare const STATE_APP_VERSION = "0.13.3";
5
5
  export declare const STATE_SCHEMA_SQL: string;
6
6
  export declare const STATE_SCHEMA_DIGEST: NonSharedBuffer;
@@ -2,7 +2,7 @@ import { createHash } from "node:crypto";
2
2
  export const STATE_APPLICATION_ID = 0x50495746;
3
3
  export const STATE_SCHEMA_NAME = "pi-workflows-state";
4
4
  export const STATE_SCHEMA_VERSION = 1;
5
- export const STATE_APP_VERSION = "0.12.1";
5
+ export const STATE_APP_VERSION = "0.13.3";
6
6
  export const STATE_SCHEMA_SQL = String.raw `
7
7
  CREATE TABLE schema_meta (
8
8
  id INTEGER PRIMARY KEY CHECK (id = 1),
@@ -32,7 +32,8 @@ CREATE TABLE blobs (
32
32
  CREATE TABLE resources (
33
33
  resource_id TEXT PRIMARY KEY,
34
34
  resource_type TEXT NOT NULL CHECK (resource_type IN (
35
- 'run', 'session', 'decision', 'controller', 'effect', 'channel', 'notification', 'turn_intent'
35
+ 'run', 'session', 'decision', 'controller', 'effect', 'channel', 'notification', 'turn_intent',
36
+ 'settings', 'follow_up_queue', 'follow_up'
36
37
  )),
37
38
  aggregate_key TEXT NOT NULL,
38
39
  revision INTEGER NOT NULL DEFAULT 0 CHECK (revision >= 0),
@@ -92,11 +93,7 @@ CREATE TABLE runs (
92
93
  parent_run_id TEXT REFERENCES runs(run_id),
93
94
  definition_digest BLOB NOT NULL REFERENCES workflow_definitions(definition_digest),
94
95
  workflow_ref TEXT NOT NULL,
95
- workflow_source_hash BLOB NOT NULL REFERENCES blobs(blob_hash),
96
96
  launch_options_hash BLOB NOT NULL REFERENCES blobs(blob_hash),
97
- source_type TEXT NOT NULL CHECK (source_type IN ('builtin', 'file')),
98
- source_ref TEXT NOT NULL,
99
- source_revision TEXT NOT NULL,
100
97
  title TEXT,
101
98
  status TEXT NOT NULL CHECK (status IN (
102
99
  'queued', 'running', 'waiting', 'completed', 'failed', 'timed_out', 'cancelled'
@@ -104,7 +101,7 @@ CREATE TABLE runs (
104
101
  paused INTEGER NOT NULL DEFAULT 0 CHECK (paused IN (0, 1)),
105
102
  status_detail TEXT,
106
103
  input_hash BLOB NOT NULL REFERENCES blobs(blob_hash),
107
- output_hash BLOB REFERENCES blobs(blob_hash),
104
+ final_output_hash BLOB REFERENCES blobs(blob_hash),
108
105
  error_hash BLOB REFERENCES blobs(blob_hash),
109
106
  created_at INTEGER NOT NULL,
110
107
  updated_at INTEGER NOT NULL,
@@ -116,6 +113,15 @@ CREATE INDEX runs_project_idx ON runs(project_id, created_at DESC);
116
113
  CREATE INDEX runs_status_idx ON runs(status, updated_at DESC);
117
114
  CREATE INDEX runs_parent_idx ON runs(parent_run_id);
118
115
 
116
+ CREATE TABLE run_sources (
117
+ run_id TEXT NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,
118
+ mount_path TEXT NOT NULL,
119
+ source_type TEXT NOT NULL CHECK (source_type IN ('builtin', 'file')),
120
+ source_ref TEXT NOT NULL,
121
+ source_revision TEXT NOT NULL,
122
+ PRIMARY KEY (run_id, mount_path)
123
+ ) STRICT;
124
+
119
125
  CREATE TABLE run_bindings (
120
126
  run_id TEXT PRIMARY KEY REFERENCES runs(run_id) ON DELETE CASCADE,
121
127
  origin_session_id TEXT NOT NULL,
@@ -125,6 +131,92 @@ CREATE TABLE run_bindings (
125
131
 
126
132
  CREATE INDEX run_bindings_session_idx ON run_bindings(origin_session_id, created_at DESC);
127
133
 
134
+ CREATE TABLE workflow_settings (
135
+ scope_id TEXT PRIMARY KEY,
136
+ resource_id TEXT NOT NULL UNIQUE REFERENCES resources(resource_id) ON DELETE CASCADE,
137
+ origin_run_id TEXT NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,
138
+ active_run_id TEXT NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,
139
+ mount_path TEXT NOT NULL,
140
+ invocation INTEGER NOT NULL CHECK (invocation > 0),
141
+ initial_hash BLOB NOT NULL REFERENCES blobs(blob_hash),
142
+ current_hash BLOB NOT NULL REFERENCES blobs(blob_hash),
143
+ created_at INTEGER NOT NULL,
144
+ updated_at INTEGER NOT NULL,
145
+ UNIQUE (origin_run_id, mount_path, invocation)
146
+ ) STRICT;
147
+
148
+ CREATE INDEX workflow_settings_active_run_idx ON workflow_settings(active_run_id, mount_path, invocation);
149
+
150
+ CREATE TABLE workflow_setting_changes (
151
+ change_id TEXT PRIMARY KEY,
152
+ scope_id TEXT NOT NULL REFERENCES workflow_settings(scope_id) ON DELETE CASCADE,
153
+ request_id TEXT NOT NULL,
154
+ change_number INTEGER NOT NULL CHECK (change_number > 0),
155
+ actor_type TEXT NOT NULL CHECK (actor_type IN (
156
+ 'session', 'host', 'controller', 'channel', 'human', 'policy', 'control', 'system'
157
+ )),
158
+ actor_id TEXT,
159
+ source_type TEXT NOT NULL,
160
+ patch_hash BLOB NOT NULL REFERENCES blobs(blob_hash),
161
+ before_hash BLOB NOT NULL REFERENCES blobs(blob_hash),
162
+ after_hash BLOB NOT NULL REFERENCES blobs(blob_hash),
163
+ accepted_at INTEGER NOT NULL,
164
+ UNIQUE (scope_id, request_id),
165
+ UNIQUE (scope_id, change_number)
166
+ ) STRICT;
167
+
168
+ CREATE TABLE workflow_follow_up_queues (
169
+ run_id TEXT PRIMARY KEY REFERENCES runs(run_id) ON DELETE CASCADE,
170
+ resource_id TEXT NOT NULL UNIQUE REFERENCES resources(resource_id) ON DELETE CASCADE,
171
+ origin_session_id TEXT,
172
+ presentation_state TEXT NOT NULL DEFAULT 'none' CHECK (presentation_state IN (
173
+ 'none', 'not-needed', 'pending', 'settled', 'unavailable'
174
+ )),
175
+ presentation_entry_id TEXT,
176
+ presentation_assistant_entry_id TEXT,
177
+ presentation_reason_hash BLOB REFERENCES blobs(blob_hash),
178
+ presentation_updated_at INTEGER,
179
+ created_at INTEGER NOT NULL,
180
+ updated_at INTEGER NOT NULL,
181
+ CHECK (
182
+ (presentation_state IN ('none', 'not-needed', 'pending') AND presentation_assistant_entry_id IS NULL AND presentation_reason_hash IS NULL)
183
+ OR
184
+ (presentation_state = 'unavailable' AND presentation_assistant_entry_id IS NULL AND presentation_reason_hash IS NOT NULL)
185
+ OR
186
+ (presentation_state = 'settled' AND presentation_entry_id IS NOT NULL AND presentation_assistant_entry_id IS NOT NULL AND presentation_reason_hash IS NULL)
187
+ )
188
+ ) STRICT;
189
+
190
+ CREATE TABLE workflow_follow_ups (
191
+ follow_up_id TEXT PRIMARY KEY,
192
+ resource_id TEXT NOT NULL UNIQUE REFERENCES resources(resource_id) ON DELETE CASCADE,
193
+ queue_resource_id TEXT NOT NULL REFERENCES resources(resource_id),
194
+ run_id TEXT NOT NULL REFERENCES workflow_follow_up_queues(run_id) ON DELETE CASCADE,
195
+ request_id TEXT NOT NULL,
196
+ order_number INTEGER NOT NULL CHECK (order_number > 0),
197
+ target_session_id TEXT NOT NULL,
198
+ actor_type TEXT NOT NULL CHECK (actor_type IN (
199
+ 'session', 'host', 'controller', 'channel', 'human', 'policy', 'control', 'system'
200
+ )),
201
+ actor_id TEXT,
202
+ source_type TEXT NOT NULL,
203
+ prompt_hash BLOB NOT NULL REFERENCES blobs(blob_hash),
204
+ status TEXT NOT NULL CHECK (status IN (
205
+ 'queued', 'pending_presentation', 'ready', 'sent', 'removed', 'cancelled'
206
+ )),
207
+ session_entry_id TEXT,
208
+ reason_hash BLOB REFERENCES blobs(blob_hash),
209
+ created_at INTEGER NOT NULL,
210
+ updated_at INTEGER NOT NULL,
211
+ sent_at INTEGER,
212
+ UNIQUE (run_id, request_id),
213
+ UNIQUE (run_id, order_number),
214
+ CHECK ((status = 'sent') = (session_entry_id IS NOT NULL AND sent_at IS NOT NULL)),
215
+ CHECK ((status IN ('removed', 'cancelled')) = (reason_hash IS NOT NULL))
216
+ ) STRICT;
217
+
218
+ CREATE INDEX workflow_follow_ups_delivery_idx ON workflow_follow_ups(target_session_id, status, order_number);
219
+
128
220
  CREATE TABLE run_queue (
129
221
  run_id TEXT PRIMARY KEY REFERENCES runs(run_id) ON DELETE CASCADE,
130
222
  status TEXT NOT NULL CHECK (status IN (
@@ -153,14 +245,16 @@ CREATE TABLE node_attempts (
153
245
  attempt_number INTEGER NOT NULL CHECK (attempt_number > 0),
154
246
  node_type TEXT NOT NULL,
155
247
  status TEXT NOT NULL CHECK (status IN (
156
- 'pending', 'running', 'waiting', 'completed', 'failed', 'timed_out', 'cancelled'
248
+ 'pending', 'running', 'waiting', 'interrupted',
249
+ 'completed', 'failed', 'timed_out', 'cancelled'
157
250
  )),
158
- input_hash BLOB REFERENCES blobs(blob_hash),
159
- contract_hash BLOB REFERENCES blobs(blob_hash),
160
- presentation_hash BLOB REFERENCES blobs(blob_hash),
251
+ prompt_hash BLOB REFERENCES blobs(blob_hash),
161
252
  output_hash BLOB REFERENCES blobs(blob_hash),
162
- result_hash BLOB REFERENCES blobs(blob_hash),
253
+ receipt_hash BLOB REFERENCES blobs(blob_hash),
163
254
  error_hash BLOB REFERENCES blobs(blob_hash),
255
+ settings_scope_id TEXT REFERENCES workflow_settings(scope_id),
256
+ settings_change_number INTEGER CHECK (settings_change_number IS NULL OR settings_change_number >= 0),
257
+ settings_hash BLOB REFERENCES blobs(blob_hash),
164
258
  started_at INTEGER,
165
259
  deadline_at INTEGER,
166
260
  finished_at INTEGER,
@@ -173,10 +267,22 @@ CREATE UNIQUE INDEX node_attempts_active_idx ON node_attempts(run_id)
173
267
  WHERE status IN ('pending', 'running', 'waiting');
174
268
  CREATE INDEX node_attempts_run_idx ON node_attempts(run_id, created_at);
175
269
 
270
+ CREATE TABLE run_steps (
271
+ run_id TEXT NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,
272
+ step_index INTEGER NOT NULL CHECK (step_index >= 0),
273
+ attempt_id TEXT NOT NULL REFERENCES node_attempts(attempt_id),
274
+ output_override_hash BLOB REFERENCES blobs(blob_hash),
275
+ PRIMARY KEY (run_id, step_index),
276
+ UNIQUE (run_id, attempt_id)
277
+ ) STRICT;
278
+
279
+ CREATE INDEX run_steps_attempt_idx ON run_steps(attempt_id);
280
+
176
281
  CREATE TABLE workflow_updates (
177
282
  update_id TEXT PRIMARY KEY,
178
283
  attempt_id TEXT NOT NULL REFERENCES node_attempts(attempt_id) ON DELETE CASCADE,
179
284
  update_seq INTEGER NOT NULL CHECK (update_seq > 0),
285
+ run_revision INTEGER NOT NULL CHECK (run_revision > 0),
180
286
  update_type TEXT NOT NULL,
181
287
  update_key TEXT NOT NULL,
182
288
  data_hash BLOB NOT NULL REFERENCES blobs(blob_hash),
@@ -214,6 +320,18 @@ CREATE TABLE session_entries (
214
320
  UNIQUE (segment_id, entry_id)
215
321
  ) STRICT;
216
322
 
323
+ CREATE TABLE attempt_entries (
324
+ attempt_id TEXT NOT NULL REFERENCES node_attempts(attempt_id) ON DELETE CASCADE,
325
+ role TEXT NOT NULL CHECK (role IN ('prompt', 'response', 'first', 'last')),
326
+ segment_id TEXT NOT NULL,
327
+ entry_id TEXT NOT NULL,
328
+ PRIMARY KEY (attempt_id, role),
329
+ FOREIGN KEY (segment_id, entry_id)
330
+ REFERENCES session_entries(segment_id, entry_id) ON DELETE CASCADE
331
+ ) STRICT;
332
+
333
+ CREATE INDEX attempt_entries_entry_idx ON attempt_entries(segment_id, entry_id);
334
+
217
335
  CREATE TABLE session_events (
218
336
  segment_id TEXT NOT NULL REFERENCES session_segments(segment_id) ON DELETE CASCADE,
219
337
  event_seq INTEGER NOT NULL CHECK (event_seq > 0),
@@ -285,7 +403,6 @@ CREATE TABLE continuations (
285
403
  decision_id TEXT PRIMARY KEY REFERENCES human_decisions(decision_id) ON DELETE CASCADE,
286
404
  parent_run_id TEXT NOT NULL UNIQUE REFERENCES runs(run_id),
287
405
  continuation_run_id TEXT NOT NULL UNIQUE REFERENCES runs(run_id),
288
- response_hash BLOB NOT NULL REFERENCES blobs(blob_hash),
289
406
  created_at INTEGER NOT NULL
290
407
  ) STRICT;
291
408
 
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/state/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAC;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AACtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAE1C,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAidzC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/state/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAC;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AACtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAE1C,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAskBzC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,MAAM,EAAE,CAAC"}
@@ -5,8 +5,10 @@ export type CliArgs = {
5
5
  controllerName?: string;
6
6
  resourceKey?: string;
7
7
  herdrAction?: string;
8
- stateAction?: "status" | "verify" | "backup";
8
+ stateAction?: "status" | "verify" | "backup" | "prune";
9
9
  backupDestination?: string;
10
+ pruneBefore?: string;
11
+ pruneApply?: boolean;
10
12
  once: boolean;
11
13
  json: boolean;
12
14
  project?: string | undefined;