@osolmaz/pi-workflows 0.16.3 → 0.16.5

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.
@@ -1,4 +1,9 @@
1
+ import type Database from "better-sqlite3";
1
2
  import { StateDatabase } from "./database.js";
3
+ export declare const AUTOMATIC_STATE_RETENTION_MS: number;
4
+ export declare const AUTOMATIC_STATE_PRUNE_INTERVAL_MS: number;
5
+ export declare const AUTOMATIC_STATE_VACUUM_MIN_BYTES: number;
6
+ export declare const AUTOMATIC_STATE_VACUUM_MIN_FREE_RATIO = 0.2;
2
7
  export type StatePruneOptions = {
3
8
  before: string;
4
9
  apply: boolean;
@@ -16,5 +21,28 @@ export type StatePruneReport = {
16
21
  databaseBytesAfter: number;
17
22
  applied: boolean;
18
23
  };
24
+ export type AutomaticStatePruneOptions = {
25
+ now?: number;
26
+ activeBlobHashes?: () => readonly Buffer[];
27
+ shouldContinue?: () => boolean;
28
+ yieldControl?: () => Promise<void>;
29
+ vacuumMinBytes?: number;
30
+ vacuumMinFreeRatio?: number;
31
+ vacuum?: (database: Database.Database) => void;
32
+ };
33
+ export type AutomaticStatePruneReport = StatePruneReport & {
34
+ completed: boolean;
35
+ compacted: boolean;
36
+ pageCount: number;
37
+ freePageCount: number;
38
+ pageSize: number;
39
+ reclaimableBytes: number;
40
+ freePageRatio: number;
41
+ compactionError?: string;
42
+ };
43
+ type DatabasePageMetrics = Pick<AutomaticStatePruneReport, "pageCount" | "freePageCount" | "pageSize" | "reclaimableBytes" | "freePageRatio">;
19
44
  export declare function validateStatePruneOptions(options: StatePruneOptions): void;
20
45
  export declare function pruneState(state: StateDatabase, databasePath: string, options: StatePruneOptions, activeBlobHashes?: () => readonly Buffer[]): Promise<StatePruneReport>;
46
+ export declare function pruneStateAutomatically(state: StateDatabase, databasePath: string, options?: AutomaticStatePruneOptions): Promise<AutomaticStatePruneReport>;
47
+ export declare function shouldVacuumStateAutomatically(metrics: DatabasePageMetrics, minimumBytes?: number, minimumFreeRatio?: number): boolean;
48
+ export {};
@@ -3,7 +3,13 @@ import path from "node:path";
3
3
  import { StateDatabase } from "./database.js";
4
4
  const TERMINAL_RUN_STATUSES = new Set(["completed", "failed", "timed_out", "cancelled"]);
5
5
  const LIVE_QUEUE_STATUSES = ["queued", "starting", "running", "parked"];
6
+ const ACTIVE_RUNNER_STATUSES = ["starting", "ready", "running"];
7
+ const ACTIVE_ATTEMPT_STATUSES = ["pending", "running", "waiting", "interrupted"];
6
8
  const UNSETTLED_EFFECT_STATUSES = ["pending", "applying", "ambiguous"];
9
+ export const AUTOMATIC_STATE_RETENTION_MS = 30 * 24 * 60 * 60 * 1_000;
10
+ export const AUTOMATIC_STATE_PRUNE_INTERVAL_MS = 24 * 60 * 60 * 1_000;
11
+ export const AUTOMATIC_STATE_VACUUM_MIN_BYTES = 64 * 1024 * 1024;
12
+ export const AUTOMATIC_STATE_VACUUM_MIN_FREE_RATIO = 0.2;
7
13
  export function validateStatePruneOptions(options) {
8
14
  parseCutoff(options.before);
9
15
  if (options.apply && options.backupPath === undefined) {
@@ -21,13 +27,7 @@ export async function pruneState(state, databasePath, options, activeBlobHashes
21
27
  try {
22
28
  const selection = selectRunTrees(state, cutoff);
23
29
  const sizeBefore = databaseBytes(databasePath);
24
- const base = {
25
- cutoff: new Date(cutoff).toISOString(),
26
- candidateTrees: selection.candidateTrees,
27
- blockedTrees: selection.blockedTrees,
28
- selectedRuns: selection.runIds.length,
29
- databaseBytesBefore: sizeBefore,
30
- };
30
+ const base = reportBase(cutoff, selection, sizeBefore);
31
31
  if (!options.apply) {
32
32
  return {
33
33
  ...base,
@@ -43,40 +43,14 @@ export async function pruneState(state, databasePath, options, activeBlobHashes
43
43
  throw new Error(`Backup destination already exists: ${backupPath}`);
44
44
  }
45
45
  await state.backup(backupPath);
46
- let deletedRows = 0;
47
- let deletedBlobs = 0;
48
- let deletedBlobBytes = 0;
46
+ let deleted;
49
47
  state.connection.exec("BEGIN EXCLUSIVE");
50
48
  try {
51
49
  const checked = selectRunTrees(state, cutoff);
52
- if (checked.runIds.join("\0") !== selection.runIds.join("\0") ||
53
- checked.signature !== selection.signature) {
50
+ if (!sameSelection(checked, selection)) {
54
51
  throw new Error("Prune selection changed after backup; run the command again");
55
52
  }
56
- const beforeChanges = totalChanges(state.connection);
57
- if (checked.runIds.length !== 0) {
58
- deleteRunAggregates(state.connection, checked.runIds);
59
- }
60
- state.connection
61
- .prepare(`DELETE FROM workflow_definitions
62
- WHERE NOT EXISTS (
63
- SELECT 1 FROM runs WHERE runs.definition_digest = workflow_definitions.definition_digest
64
- )`)
65
- .run();
66
- state.connection
67
- .prepare(`DELETE FROM projects
68
- WHERE NOT EXISTS (SELECT 1 FROM runs WHERE runs.project_id = projects.project_id)
69
- AND NOT EXISTS (
70
- SELECT 1 FROM controller_resources
71
- WHERE controller_resources.project_id = projects.project_id
72
- )`)
73
- .run();
74
- const retainedBlobHashes = activeBlobHashes();
75
- const blobStats = unreferencedBlobStats(state.connection, retainedBlobHashes);
76
- deleteUnreferencedBlobs(state.connection, retainedBlobHashes);
77
- deletedRows = totalChanges(state.connection) - beforeChanges;
78
- deletedBlobs = blobStats.count;
79
- deletedBlobBytes = blobStats.bytes;
53
+ deleted = deleteSelectedState(state.connection, checked.runIds, activeBlobHashes());
80
54
  state.connection.exec("COMMIT");
81
55
  }
82
56
  catch (error) {
@@ -90,22 +64,140 @@ export async function pruneState(state, databasePath, options, activeBlobHashes
90
64
  state.integrityCheck();
91
65
  return {
92
66
  ...base,
67
+ ...deleted,
68
+ databaseBytesAfter: databaseBytes(databasePath),
69
+ applied: true,
70
+ };
71
+ }
72
+ finally {
73
+ if (lock !== undefined)
74
+ releaseMaintenanceLock(lockPath, lock);
75
+ }
76
+ }
77
+ export async function pruneStateAutomatically(state, databasePath, options = {}) {
78
+ const now = options.now ?? Date.now();
79
+ const cutoff = now - AUTOMATIC_STATE_RETENTION_MS;
80
+ const shouldContinue = options.shouldContinue ?? (() => true);
81
+ const yieldControl = options.yieldControl ?? yieldToEventLoop;
82
+ const activeBlobHashes = options.activeBlobHashes ?? (() => []);
83
+ const sizeBefore = databaseBytes(databasePath);
84
+ const lockPath = `${databasePath}.maintenance.lock`;
85
+ const lock = acquireMaintenanceLock(lockPath);
86
+ let initial = emptySelection();
87
+ let deletedRows = 0;
88
+ let deletedBlobs = 0;
89
+ let deletedBlobBytes = 0;
90
+ let completed = true;
91
+ let compacted = false;
92
+ let compactionError;
93
+ let metrics = {
94
+ pageCount: 0,
95
+ freePageCount: 0,
96
+ pageSize: 0,
97
+ reclaimableBytes: 0,
98
+ freePageRatio: 0,
99
+ };
100
+ try {
101
+ metrics = databasePageMetrics(state.connection);
102
+ initial = selectRunTrees(state, cutoff, now);
103
+ for (const selectedTree of initial.trees) {
104
+ if (!shouldContinue()) {
105
+ completed = false;
106
+ break;
107
+ }
108
+ state.connection.exec("BEGIN IMMEDIATE");
109
+ try {
110
+ const checked = selectRunTrees(state, cutoff, now).trees.find((tree) => tree.rootRunId === selectedTree.rootRunId);
111
+ if (checked === undefined || !sameTree(checked, selectedTree)) {
112
+ completed = false;
113
+ state.connection.exec("ROLLBACK");
114
+ break;
115
+ }
116
+ const beforeChanges = totalChanges(state.connection);
117
+ deleteRunAggregates(state.connection, checked.runIds);
118
+ deleteUnusedDefinitionsAndProjects(state.connection);
119
+ deletedRows += totalChanges(state.connection) - beforeChanges;
120
+ state.connection.exec("COMMIT");
121
+ }
122
+ catch (error) {
123
+ if (state.connection.inTransaction)
124
+ state.connection.exec("ROLLBACK");
125
+ throw error;
126
+ }
127
+ await yieldControl();
128
+ }
129
+ if (completed && shouldContinue()) {
130
+ state.connection.exec("BEGIN IMMEDIATE");
131
+ try {
132
+ const beforeChanges = totalChanges(state.connection);
133
+ deleteUnusedDefinitionsAndProjects(state.connection);
134
+ const retainedBlobHashes = activeBlobHashes();
135
+ const blobStats = unreferencedBlobStats(state.connection, retainedBlobHashes);
136
+ deleteUnreferencedBlobs(state.connection, retainedBlobHashes);
137
+ deletedRows += totalChanges(state.connection) - beforeChanges;
138
+ deletedBlobs = blobStats.count;
139
+ deletedBlobBytes = blobStats.bytes;
140
+ state.connection.exec("COMMIT");
141
+ }
142
+ catch (error) {
143
+ if (state.connection.inTransaction)
144
+ state.connection.exec("ROLLBACK");
145
+ throw error;
146
+ }
147
+ }
148
+ else {
149
+ completed = false;
150
+ }
151
+ if (completed && shouldContinue()) {
152
+ try {
153
+ state.connection.pragma("wal_checkpoint(TRUNCATE)");
154
+ metrics = databasePageMetrics(state.connection);
155
+ if (shouldContinue() &&
156
+ shouldVacuumStateAutomatically(metrics, options.vacuumMinBytes ?? AUTOMATIC_STATE_VACUUM_MIN_BYTES, options.vacuumMinFreeRatio ?? AUTOMATIC_STATE_VACUUM_MIN_FREE_RATIO)) {
157
+ (options.vacuum ?? vacuumDatabase)(state.connection);
158
+ compacted = true;
159
+ state.connection.pragma("wal_checkpoint(TRUNCATE)");
160
+ metrics = databasePageMetrics(state.connection);
161
+ }
162
+ }
163
+ catch (error) {
164
+ compactionError = errorMessage(error);
165
+ metrics = databasePageMetrics(state.connection);
166
+ }
167
+ }
168
+ return {
169
+ ...reportBase(cutoff, initial, sizeBefore),
93
170
  deletedRows,
94
171
  deletedBlobs,
95
172
  deletedBlobBytes,
96
173
  databaseBytesAfter: databaseBytes(databasePath),
97
174
  applied: true,
175
+ completed,
176
+ compacted,
177
+ ...metrics,
178
+ ...(compactionError === undefined ? {} : { compactionError }),
98
179
  };
99
180
  }
100
181
  finally {
101
- if (lock !== undefined)
102
- releaseMaintenanceLock(lockPath, lock);
182
+ releaseMaintenanceLock(lockPath, lock);
103
183
  }
104
184
  }
105
- function selectRunTrees(state, cutoff) {
185
+ export function shouldVacuumStateAutomatically(metrics, minimumBytes = AUTOMATIC_STATE_VACUUM_MIN_BYTES, minimumFreeRatio = AUTOMATIC_STATE_VACUUM_MIN_FREE_RATIO) {
186
+ return metrics.reclaimableBytes >= minimumBytes && metrics.freePageRatio >= minimumFreeRatio;
187
+ }
188
+ function reportBase(cutoff, selection, databaseBytesBefore) {
189
+ return {
190
+ cutoff: new Date(cutoff).toISOString(),
191
+ candidateTrees: selection.candidateTrees,
192
+ blockedTrees: selection.blockedTrees,
193
+ selectedRuns: selection.runIds.length,
194
+ databaseBytesBefore,
195
+ };
196
+ }
197
+ function selectRunTrees(state, cutoff, observedAt = Date.now()) {
106
198
  const { connection: database } = state;
107
199
  const rows = database
108
- .prepare(`SELECT run_id AS runId, parent_run_id AS parentRunId,
200
+ .prepare(`SELECT run_id AS runId, parent_run_id AS parentRunId, root_run_id AS rootRunId,
109
201
  launch_options_hash AS launchOptionsHash, status, finished_at AS finishedAt
110
202
  FROM runs ORDER BY created_at, run_id`)
111
203
  .all()
@@ -115,52 +207,79 @@ function selectRunTrees(state, cutoff) {
115
207
  row.finishedAt !== null &&
116
208
  row.finishedAt < cutoff)
117
209
  .map((row) => row.runId));
118
- const children = new Map();
119
- const parents = new Map();
210
+ const rowIds = new Set(rows.map((row) => row.runId));
211
+ const links = new Map(rows.map((row) => [row.runId, new Set()]));
120
212
  for (const row of rows) {
121
- const runParents = new Set();
122
- if (row.parentRunId !== null)
123
- runParents.add(row.parentRunId);
124
- const restartParentRunId = restartParentFromLaunchOptions(state.readJson(row.launchOptionsHash));
125
- if (restartParentRunId !== null)
126
- runParents.add(restartParentRunId);
127
- parents.set(row.runId, [...runParents]);
128
- for (const parentRunId of runParents) {
129
- const values = children.get(parentRunId) ?? [];
130
- values.push(row.runId);
131
- children.set(parentRunId, values);
132
- }
213
+ linkRuns(links, rowIds, row.runId, row.parentRunId);
214
+ linkRuns(links, rowIds, row.runId, row.rootRunId);
215
+ linkRuns(links, rowIds, row.runId, restartParentFromLaunchOptions(state.readJson(row.launchOptionsHash)));
133
216
  }
134
- const roots = rows.filter((row) => eligible.has(row.runId) &&
135
- (parents.get(row.runId) ?? []).every((parentRunId) => !eligible.has(parentRunId)));
136
- const selected = new Set();
217
+ const components = [];
218
+ const visited = new Set();
219
+ for (const row of rows) {
220
+ if (visited.has(row.runId))
221
+ continue;
222
+ const component = descendants(row.runId, links);
223
+ for (const runId of component)
224
+ visited.add(runId);
225
+ components.push(component.sort());
226
+ }
227
+ const trees = [];
228
+ let candidateTrees = 0;
137
229
  let blockedTrees = 0;
138
- for (const root of roots) {
139
- const tree = descendants(root.runId, children);
140
- if (tree.some((runId) => !eligible.has(runId)) || treeHasBlocker(database, tree)) {
230
+ for (const runIds of components) {
231
+ if (!runIds.some((runId) => eligible.has(runId)))
232
+ continue;
233
+ candidateTrees += 1;
234
+ if (runIds.some((runId) => !eligible.has(runId)) ||
235
+ treeHasBlocker(database, runIds, observedAt)) {
141
236
  blockedTrees += 1;
142
237
  continue;
143
238
  }
144
- for (const runId of tree)
145
- selected.add(runId);
239
+ const rootRunId = chooseRootRunId(rows, runIds);
240
+ trees.push({
241
+ rootRunId,
242
+ runIds,
243
+ signature: selectionSignature(database, runIds),
244
+ });
146
245
  }
147
- const runIds = [...selected].sort();
246
+ trees.sort((left, right) => left.rootRunId.localeCompare(right.rootRunId));
247
+ const runIds = trees.flatMap((tree) => tree.runIds).sort();
148
248
  return {
149
- candidateTrees: roots.length,
249
+ candidateTrees,
150
250
  blockedTrees,
251
+ trees,
151
252
  runIds,
152
- signature: selectionSignature(database, runIds),
253
+ signature: JSON.stringify(trees),
153
254
  };
154
255
  }
155
- function treeHasBlocker(database, runIds) {
256
+ function treeHasBlocker(database, runIds, observedAt) {
156
257
  const values = placeholders(runIds);
157
258
  if (hasRow(database, `SELECT 1 FROM run_queue WHERE run_id IN (${values}) AND status IN (${placeholders(LIVE_QUEUE_STATUSES)})`, [...runIds, ...LIVE_QUEUE_STATUSES]) ||
259
+ hasRow(database, `SELECT 1 FROM run_workers
260
+ WHERE run_id IN (${values}) AND status IN (${placeholders(ACTIVE_RUNNER_STATUSES)})`, [...runIds, ...ACTIVE_RUNNER_STATUSES]) ||
261
+ hasRow(database, `SELECT 1 FROM node_attempts
262
+ WHERE run_id IN (${values}) AND status IN (${placeholders(ACTIVE_ATTEMPT_STATUSES)})`, [...runIds, ...ACTIVE_ATTEMPT_STATUSES]) ||
263
+ hasRow(database, `SELECT 1 FROM session_segments WHERE run_id IN (${values}) AND status = 'recording'`, runIds) ||
264
+ hasRow(database, `SELECT 1 FROM interactive_requests WHERE run_id IN (${values}) AND status = 'pending'`, runIds) ||
265
+ hasRow(database, `SELECT 1 FROM human_decisions d
266
+ LEFT JOIN human_decision_resolutions r ON r.decision_id = d.decision_id
267
+ WHERE d.run_id IN (${values}) AND r.decision_id IS NULL`, runIds) ||
268
+ hasRow(database, `SELECT 1 FROM workflow_messages WHERE run_id IN (${values}) AND status = 'pending'`, runIds) ||
269
+ hasRow(database, `SELECT 1 FROM workflow_turns WHERE run_id IN (${values}) AND state = 'started'`, runIds) ||
270
+ hasRow(database, `SELECT 1 FROM run_bindings b
271
+ WHERE b.run_id IN (${values}) AND b.execution_mode = 'interactive'
272
+ AND NOT EXISTS (
273
+ SELECT 1 FROM workflow_messages m
274
+ WHERE m.run_id = b.run_id AND m.kind = 'terminal' AND m.status = 'sent'
275
+ )`, runIds) ||
158
276
  hasRow(database, `SELECT 1 FROM workflow_follow_ups
159
277
  WHERE run_id IN (${values}) AND status = 'queued'`, runIds) ||
160
278
  hasRow(database, `SELECT 1 FROM controller_workflows
161
279
  WHERE run_id IN (${values}) OR reserved_run_id IN (${values})`, [...runIds, ...runIds]) ||
162
280
  hasRow(database, `SELECT 1 FROM run_steps s JOIN node_attempts a ON a.attempt_id = s.attempt_id
163
- WHERE a.run_id IN (${values}) AND s.run_id NOT IN (${values})`, [...runIds, ...runIds]) ||
281
+ WHERE (a.run_id IN (${values}) AND s.run_id NOT IN (${values}))
282
+ OR (s.run_id IN (${values}) AND a.run_id NOT IN (${values}))`, [...runIds, ...runIds, ...runIds, ...runIds]) ||
164
283
  hasRow(database, `SELECT 1 FROM continuations
165
284
  WHERE (parent_run_id IN (${values}) AND continuation_run_id NOT IN (${values}))
166
285
  OR (continuation_run_id IN (${values}) AND parent_run_id NOT IN (${values}))`, [...runIds, ...runIds, ...runIds, ...runIds]) ||
@@ -171,16 +290,42 @@ function treeHasBlocker(database, runIds) {
171
290
  }
172
291
  const resources = relatedResourceIds(database, runIds);
173
292
  const resourceValues = placeholders(resources);
174
- if (hasRow(database, `SELECT 1 FROM leases
175
- WHERE resource_id IN (${resourceValues}) AND owner_id IS NOT NULL AND expires_at > ?`, [...resources, Date.now()]) ||
293
+ return (hasRow(database, `SELECT 1 FROM leases
294
+ WHERE resource_id IN (${resourceValues}) AND owner_id IS NOT NULL AND expires_at > ?`, [...resources, observedAt]) ||
176
295
  hasRow(database, `SELECT 1 FROM effects
177
296
  WHERE source_resource_id IN (${resourceValues})
178
297
  AND status IN (${placeholders(UNSETTLED_EFFECT_STATUSES)})`, [...resources, ...UNSETTLED_EFFECT_STATUSES]) ||
179
298
  hasRow(database, `SELECT 1 FROM channel_messages m JOIN human_decisions d ON d.decision_id = m.decision_id
180
- WHERE d.run_id IN (${values})`, runIds)) {
181
- return true;
182
- }
183
- return false;
299
+ WHERE d.run_id IN (${values})`, runIds));
300
+ }
301
+ function deleteSelectedState(database, runIds, retainedBlobHashes) {
302
+ const beforeChanges = totalChanges(database);
303
+ if (runIds.length !== 0)
304
+ deleteRunAggregates(database, runIds);
305
+ deleteUnusedDefinitionsAndProjects(database);
306
+ const blobStats = unreferencedBlobStats(database, retainedBlobHashes);
307
+ deleteUnreferencedBlobs(database, retainedBlobHashes);
308
+ return {
309
+ deletedRows: totalChanges(database) - beforeChanges,
310
+ deletedBlobs: blobStats.count,
311
+ deletedBlobBytes: blobStats.bytes,
312
+ };
313
+ }
314
+ function deleteUnusedDefinitionsAndProjects(database) {
315
+ database
316
+ .prepare(`DELETE FROM workflow_definitions
317
+ WHERE NOT EXISTS (
318
+ SELECT 1 FROM runs WHERE runs.definition_digest = workflow_definitions.definition_digest
319
+ )`)
320
+ .run();
321
+ database
322
+ .prepare(`DELETE FROM projects
323
+ WHERE NOT EXISTS (SELECT 1 FROM runs WHERE runs.project_id = projects.project_id)
324
+ AND NOT EXISTS (
325
+ SELECT 1 FROM controller_resources
326
+ WHERE controller_resources.project_id = projects.project_id
327
+ )`)
328
+ .run();
184
329
  }
185
330
  function deleteRunAggregates(database, runIds) {
186
331
  const values = placeholders(runIds);
@@ -286,7 +431,49 @@ function blobReferencePredicate(database, retainedBlobCount) {
286
431
  const retainedPlaceholders = placeholders(Array.from({ length: retainedBlobCount }, () => undefined));
287
432
  return `${unreferenced} AND blob_hash NOT IN (${retainedPlaceholders})`;
288
433
  }
289
- function descendants(root, children) {
434
+ function vacuumDatabase(database) {
435
+ database.exec("VACUUM");
436
+ }
437
+ function databasePageMetrics(database) {
438
+ const pageCount = pragmaNumber(database, "page_count");
439
+ const freePageCount = pragmaNumber(database, "freelist_count");
440
+ const pageSize = pragmaNumber(database, "page_size");
441
+ return {
442
+ pageCount,
443
+ freePageCount,
444
+ pageSize,
445
+ reclaimableBytes: freePageCount * pageSize,
446
+ freePageRatio: pageCount === 0 ? 0 : freePageCount / pageCount,
447
+ };
448
+ }
449
+ function pragmaNumber(database, name) {
450
+ const value = database.pragma(name, { simple: true });
451
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0) {
452
+ throw new Error(`SQLite ${name} returned an invalid value`);
453
+ }
454
+ return value;
455
+ }
456
+ function sameSelection(left, right) {
457
+ return left.runIds.join("\0") === right.runIds.join("\0") && left.signature === right.signature;
458
+ }
459
+ function sameTree(left, right) {
460
+ return left.runIds.join("\0") === right.runIds.join("\0") && left.signature === right.signature;
461
+ }
462
+ function chooseRootRunId(rows, runIds) {
463
+ const runIdSet = new Set(runIds);
464
+ const candidates = rows
465
+ .filter((row) => runIdSet.has(row.runId) && row.rootRunId === row.runId)
466
+ .map((row) => row.runId)
467
+ .sort();
468
+ return candidates[0] ?? runIds[0] ?? "";
469
+ }
470
+ function linkRuns(links, rowIds, left, right) {
471
+ if (right === null || right === left || !rowIds.has(right))
472
+ return;
473
+ links.get(left)?.add(right);
474
+ links.get(right)?.add(left);
475
+ }
476
+ function descendants(root, links) {
290
477
  const result = [];
291
478
  const seen = new Set();
292
479
  const pending = [root];
@@ -296,7 +483,7 @@ function descendants(root, children) {
296
483
  continue;
297
484
  seen.add(runId);
298
485
  result.push(runId);
299
- pending.push(...(children.get(runId) ?? []));
486
+ pending.push(...(links.get(runId) ?? []));
300
487
  }
301
488
  return result;
302
489
  }
@@ -322,6 +509,9 @@ function databaseBytes(databasePath) {
322
509
  .filter((filePath) => fs.existsSync(filePath))
323
510
  .reduce((total, filePath) => total + fs.statSync(filePath).size, 0);
324
511
  }
512
+ function emptySelection() {
513
+ return { candidateTrees: 0, blockedTrees: 0, trees: [], runIds: [], signature: "" };
514
+ }
325
515
  function acquireMaintenanceLock(lockPath) {
326
516
  try {
327
517
  return fs.openSync(lockPath, "wx", 0o600);
@@ -352,11 +542,23 @@ function placeholders(values) {
352
542
  function quoteIdentifier(value) {
353
543
  return `"${value.replaceAll('"', '""')}"`;
354
544
  }
545
+ function errorMessage(error) {
546
+ return error instanceof Error ? error.message : String(error);
547
+ }
548
+ async function yieldToEventLoop() {
549
+ await new Promise((resolve) => setImmediate(resolve));
550
+ }
355
551
  function isRecord(value) {
356
552
  return typeof value === "object" && value !== null && !Array.isArray(value);
357
553
  }
358
554
  function isRunAgeRow(value) {
359
- return isRecord(value);
555
+ return (isRecord(value) &&
556
+ typeof value.runId === "string" &&
557
+ (value.parentRunId === null || typeof value.parentRunId === "string") &&
558
+ typeof value.rootRunId === "string" &&
559
+ Buffer.isBuffer(value.launchOptionsHash) &&
560
+ typeof value.status === "string" &&
561
+ (value.finishedAt === null || typeof value.finishedAt === "number"));
360
562
  }
361
563
  function isResourceRow(value) {
362
564
  return isRecord(value) && typeof value.resourceId === "string";
@@ -1 +1 @@
1
- {"version":3,"file":"prune.js","sourceRoot":"","sources":["../../src/state/prune.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prune.js","sourceRoot":"","sources":["../../src/state/prune.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  # SQLite state
2
2
 
3
- Status: this is the implemented single-server database contract. The [workflow-message plan](2026-09-02-unify-workflow-messages-plan.md) records the schema version 1 hard cut that unified Pi message state and restored hosted behavior.
3
+ Status: this is the implemented single-server database contract. The [workflow-message plan](2026-09-02-unify-workflow-messages-plan.md) records the schema version 1 hard cut that unified Pi message state and restored hosted behavior. The [automatic state-retention plan](plans/2026-09-04-automatic-state-retention-plan.md) records the approved 30-day cleanup contract.
4
4
 
5
5
  Pi Workflows stores all live durable state in one database:
6
6
 
@@ -156,7 +156,7 @@ state-changing child messages.
156
156
 
157
157
  `blobs` stores canonical JSON and UTF-8 text as bytes. Its primary key is the 32-byte SHA-256 digest of the bytes. An oversized required runner result uses this same content-addressed store, and the runner reads and verifies it in bounded parts. It does not copy session history into runner resume state. `run_view_content` separately keeps server-generated large view values reachable for the life of the run, including aggregate outputs that do not exist as one source record. The server creates this link before it sends a content reference. Deleting the run removes the link, and normal blob pruning can then remove unreferenced content.
158
158
 
159
- Insertion verifies the digest, media type, byte length, and exact bytes. Repeated content adopts the existing row. This replaces separate artifact files while keeping outputs, errors, settled Pi entries, and rendered channel text deduplicated. Opening the database never deletes blobs. The explicit prune command removes unreferenced blobs after it deletes safe old run trees. It retains each blob referenced by an active runner transfer until that runner exits.
159
+ Insertion verifies the digest, media type, byte length, and exact bytes. Repeated content adopts the existing row. This replaces separate artifact files while keeping outputs, errors, settled Pi entries, and rendered channel text deduplicated. Automatic retention and explicit prune remove unreferenced blobs after they delete safe old run trees. They retain each blob referenced by a database foreign key or active runner transfer.
160
160
 
161
161
  Runs do not store a nested `WorkflowRunState` blob. `runs` stores run-level facts and hashes for independent values. `run_sources` stores source identity without source JSON blobs. `node_attempts` stores structured workflow outputs and small execution receipts. `session_entries` is the only stored copy of each settled Pi entry. `attempt_entries` links an attempt to its prompt, response, first, and last Pi entries. `run_steps` stores ordered attempt membership and only stores an output override when a continuation changes a carried checkpoint answer.
162
162
 
@@ -247,6 +247,24 @@ SQLite WAL keeps bounded projection reads consistent with commits. Writers are s
247
247
 
248
248
  This contract is for local storage on one machine. It does not claim distributed consensus or network-filesystem safety.
249
249
 
250
+ ## Automatic retention
251
+
252
+ The server keeps terminal root-run trees for 30 days from `finished_at`. A tree is eligible only when every restart or continuation descendant is terminal, older than the cutoff, free of protected work, and free of references from outside the tree.
253
+
254
+ Automatic cleanup keeps a tree when it has a waiting or parked run, a live queue row, a pending workflow message, an open workflow turn, a pending interaction or human decision, a recording session segment, a queued follow-up, an active lease, an unsettled effect, controller ownership, an active runner content hash, a resumable checkpoint, an undelivered terminal result, or a continuation or step reference from outside the tree. Unknown or conflicting ownership also blocks deletion.
255
+
256
+ The server requests cleanup after startup recovery and after workflow runners exit. It also schedules the next daily check after a completed sweep. Overlapping requests use one in-process task. Cleanup starts only while there is no active or pending workflow runner, resource-manager runner, state-maintenance command, or shutdown. One server process completes no more than one sweep in 24 hours. A due sweep that finds work active or stops between trees remains due. The next idle lifecycle trigger or a five-minute idle retry continues it.
257
+
258
+ Automatic cleanup does not create a backup. It rechecks and deletes one complete root tree in one transaction, yields, and checks for new work before it selects another tree. Manual prune uses the same selection and deletion code, but keeps its backup requirement.
259
+
260
+ After logical deletion, the server truncates the WAL while idle and measures `page_count`, `freelist_count`, and `page_size`. SQLite can reuse free pages without shrinking the main file. Automatic cleanup runs `VACUUM` only while the server remains idle, at least 64 MiB is reclaimable, and at least 20 percent of pages are free. A skipped or failed `VACUUM` does not undo committed deletion. The server reports the result and leaves the free pages available for reuse.
261
+
262
+ A cleanup error does not fail a workflow or stop the server. The server records one bounded diagnostic and waits five minutes before another safe attempt. It does not retry in a tight loop.
263
+
264
+ Retained runs keep their current resume, viewer, content-reference, and terminal-result behavior. A deleted run is absent from run lists and direct views. Cleanup never edits Pi session history.
265
+
266
+ The retention policy does not promise a hard database-size limit. Recent or protected work can be large, and physical file shrink depends on a safe, successful `VACUUM`.
267
+
250
268
  ## Backup and verification
251
269
 
252
270
  An active database must be backed up with the SQLite backup API. Copying only `state.sqlite` while WAL writes are active is not supported.
@@ -275,7 +293,7 @@ These commands send maintenance operations to the server when they target the ac
275
293
  `status` reports only safe counts, file size, active leases, and unsettled effects.
276
294
  It does not print actor IDs, channel references, payloads, or credentials.
277
295
 
278
- `prune --dry-run` reports complete terminal run trees older than the cutoff and the trees that safety checks block. It does not change the database. `prune --apply` requires a new absolute backup path. It verifies the backup, locks maintenance, rechecks the same selection in an exclusive transaction, and refuses trees with live queues, active leases, unsettled effects, managed resource references, channel references, or step links from runs outside the tree. It deletes the safe aggregates, removes blobs with no remaining foreign-key reference, checkpoints the WAL, vacuums the file, and runs integrity and foreign-key checks. Pi Workflows never runs prune at startup.
296
+ `prune --dry-run` reports complete terminal run trees older than the cutoff and the trees that safety checks block. It does not change the database. `prune --apply` requires a new absolute backup path. It verifies the backup, locks maintenance, rechecks the same selection in an exclusive transaction, deletes safe aggregates and unreferenced blobs, checkpoints the WAL, vacuums the file, and runs integrity and foreign-key checks. The manual command and automatic retention use the same blocker rules. Automatic retention starts after server recovery and does not create a backup.
279
297
 
280
298
  ## Alpha cutover
281
299