@osolmaz/pi-workflows 0.13.2 → 0.13.4
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.
- package/README.md +5 -3
- package/dist/builtins/autodoc.workflow.d.ts +5 -5
- package/dist/builtins/autoimplement.workflow.d.ts +77 -73
- package/dist/builtins/autoimplement.workflow.js +47 -8
- package/dist/builtins/autoimplement.workflow.js.map +1 -1
- package/dist/builtins/autoplan.workflow.d.ts +8 -8
- package/dist/builtins/autoplan.workflow.js +44 -35
- package/dist/builtins/autoplan.workflow.js.map +1 -1
- package/dist/builtins/catalog.js +2 -2
- package/dist/builtins/change-verification.workflow.d.ts +1 -1
- package/dist/builtins/plain-summary.workflow.d.ts +1 -1
- package/dist/builtins/plan-approval.workflow.d.ts +1 -1
- package/dist/builtins/plan-change.workflow.d.ts +29 -29
- package/dist/builtins/sanity-check.workflow.d.ts +3 -3
- package/dist/builtins/workspace-preparation.workflow.d.ts +1 -1
- package/dist/controllers/index.d.ts +2 -2
- package/dist/controllers/index.js.map +1 -1
- package/dist/controllers/sqlite.js +85 -23
- package/dist/controllers/sqlite.js.map +1 -1
- package/dist/controllers/types.d.ts +34 -0
- package/dist/controllers/workflow-engine-scheduler.d.ts +5 -1
- package/dist/controllers/workflow-engine-scheduler.js +83 -1
- package/dist/controllers/workflow-engine-scheduler.js.map +1 -1
- package/dist/controllers/workflows.d.ts +8 -1
- package/dist/controllers/workflows.js +36 -0
- package/dist/controllers/workflows.js.map +1 -1
- package/dist/extension/controller-host.d.ts +2 -1
- package/dist/extension/controller-host.js +1 -1
- package/dist/extension/controller-host.js.map +1 -1
- package/dist/extension/follow-up-coordinator.d.ts +27 -0
- package/dist/extension/follow-up-coordinator.js +131 -0
- package/dist/extension/follow-up-coordinator.js.map +1 -0
- package/dist/extension/index.d.ts +9 -0
- package/dist/extension/index.js +460 -75
- package/dist/extension/index.js.map +1 -1
- package/dist/extension/session-events.d.ts +2 -3
- package/dist/extension/session-events.js +11 -10
- package/dist/extension/session-events.js.map +1 -1
- package/dist/extension/widget.js +9 -0
- package/dist/extension/widget.js.map +1 -1
- package/dist/state/database.d.ts +2 -1
- package/dist/state/database.js +11 -13
- package/dist/state/database.js.map +1 -1
- package/dist/state/json.js +6 -1
- package/dist/state/json.js.map +1 -1
- package/dist/state/mutation.d.ts +1 -1
- package/dist/state/mutation.js.map +1 -1
- package/dist/state/prune.d.ts +18 -0
- package/dist/state/prune.js +373 -0
- package/dist/state/prune.js.map +1 -0
- package/dist/state/schema.d.ts +1 -1
- package/dist/state/schema.js +116 -18
- package/dist/state/schema.js.map +1 -1
- package/dist/viewer/cli.d.ts +3 -1
- package/dist/viewer/cli.js +55 -4
- package/dist/viewer/cli.js.map +1 -1
- package/dist/viewer/render.js +19 -1
- package/dist/viewer/render.js.map +1 -1
- package/dist/workflows/composition.d.ts +2 -0
- package/dist/workflows/composition.js +15 -0
- package/dist/workflows/composition.js.map +1 -1
- package/dist/workflows/definition.d.ts +6 -3
- package/dist/workflows/definition.js +3 -0
- package/dist/workflows/definition.js.map +1 -1
- package/dist/workflows/engine.d.ts +6 -1
- package/dist/workflows/engine.js +301 -35
- package/dist/workflows/engine.js.map +1 -1
- package/dist/workflows/human-decision.d.ts +1 -0
- package/dist/workflows/human-decision.js +25 -9
- package/dist/workflows/human-decision.js.map +1 -1
- package/dist/workflows/index.d.ts +3 -1
- package/dist/workflows/index.js +2 -0
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/json-patch.d.ts +47 -0
- package/dist/workflows/json-patch.js +298 -0
- package/dist/workflows/json-patch.js.map +1 -0
- package/dist/workflows/schema.js +29 -1
- package/dist/workflows/schema.js.map +1 -1
- package/dist/workflows/settings.d.ts +128 -0
- package/dist/workflows/settings.js +199 -0
- package/dist/workflows/settings.js.map +1 -0
- package/dist/workflows/store.d.ts +75 -2
- package/dist/workflows/store.js +1349 -89
- package/dist/workflows/store.js.map +1 -1
- package/dist/workflows/tool-input.d.ts +22 -0
- package/dist/workflows/tool-input.js +43 -0
- package/dist/workflows/tool-input.js.map +1 -1
- package/dist/workflows/types.d.ts +40 -5
- package/docs/2026-08-25-workflow-follow-ups.md +132 -0
- package/docs/2026-08-25-workflow-settings.md +169 -0
- package/docs/DEFERRED_TURNS.md +6 -0
- package/docs/DESIGN_PHILOSOPHY.md +2 -0
- package/docs/SQLITE_STATE.md +31 -18
- package/docs/WORKFLOW_COMPOSITION.md +16 -1
- package/docs/WORKFLOW_STEP_MESSAGES.md +4 -2
- package/docs/plans/2026-08-25-live-workflow-settings-plan.md +532 -0
- package/docs/plans/2026-08-25-workflow-run-storage-plan.md +67 -0
- package/docs/tui-viewer.md +7 -6
- package/docs/workflows.md +22 -1
- package/examples/workflows/live-settings.workflow.ts +93 -0
- package/herdr-plugin.toml +1 -1
- package/package.json +1 -1
- package/skills/autoplan/SKILL.md +6 -6
- package/src/builtins/autoimplement.workflow.ts +56 -8
- package/src/builtins/autoplan.workflow.ts +45 -37
- package/src/builtins/catalog.ts +2 -2
- package/src/controllers/index.ts +6 -0
- package/src/controllers/sqlite.ts +129 -35
- package/src/controllers/types.ts +40 -0
- package/src/controllers/workflow-engine-scheduler.ts +103 -1
- package/src/controllers/workflows.ts +68 -0
- package/src/extension/controller-host.ts +6 -1
- package/src/extension/follow-up-coordinator.ts +151 -0
- package/src/extension/index.ts +538 -88
- package/src/extension/session-events.ts +15 -13
- package/src/extension/widget.ts +8 -0
- package/src/state/database.ts +12 -12
- package/src/state/json.ts +6 -1
- package/src/state/mutation.ts +4 -1
- package/src/state/prune.ts +502 -0
- package/src/state/schema.ts +116 -18
- package/src/viewer/cli.ts +52 -5
- package/src/viewer/render.ts +43 -1
- package/src/workflows/composition.ts +19 -0
- package/src/workflows/definition.ts +19 -5
- package/src/workflows/engine.ts +363 -35
- package/src/workflows/human-decision.ts +41 -11
- package/src/workflows/index.ts +43 -0
- package/src/workflows/json-patch.ts +375 -0
- package/src/workflows/schema.ts +31 -1
- package/src/workflows/settings.ts +430 -0
- package/src/workflows/store.ts +1977 -184
- package/src/workflows/tool-input.ts +58 -0
- package/src/workflows/types.ts +43 -4
|
@@ -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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"}
|
package/dist/state/schema.d.ts
CHANGED
|
@@ -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.
|
|
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;
|
package/dist/state/schema.js
CHANGED
|
@@ -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.
|
|
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,15 +101,8 @@ 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
|
-
workflow_sources_hash BLOB REFERENCES blobs(blob_hash),
|
|
108
|
-
human_decision_hash BLOB REFERENCES blobs(blob_hash),
|
|
109
104
|
final_output_hash BLOB REFERENCES blobs(blob_hash),
|
|
110
105
|
error_hash BLOB REFERENCES blobs(blob_hash),
|
|
111
|
-
carried_step_count INTEGER NOT NULL DEFAULT 0 CHECK (carried_step_count >= 0),
|
|
112
|
-
current_node TEXT,
|
|
113
|
-
current_attempt_id TEXT,
|
|
114
|
-
current_node_started_at INTEGER,
|
|
115
|
-
waiting_on TEXT,
|
|
116
106
|
created_at INTEGER NOT NULL,
|
|
117
107
|
updated_at INTEGER NOT NULL,
|
|
118
108
|
finished_at INTEGER,
|
|
@@ -123,6 +113,15 @@ CREATE INDEX runs_project_idx ON runs(project_id, created_at DESC);
|
|
|
123
113
|
CREATE INDEX runs_status_idx ON runs(status, updated_at DESC);
|
|
124
114
|
CREATE INDEX runs_parent_idx ON runs(parent_run_id);
|
|
125
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
|
+
|
|
126
125
|
CREATE TABLE run_bindings (
|
|
127
126
|
run_id TEXT PRIMARY KEY REFERENCES runs(run_id) ON DELETE CASCADE,
|
|
128
127
|
origin_session_id TEXT NOT NULL,
|
|
@@ -132,6 +131,92 @@ CREATE TABLE run_bindings (
|
|
|
132
131
|
|
|
133
132
|
CREATE INDEX run_bindings_session_idx ON run_bindings(origin_session_id, created_at DESC);
|
|
134
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
|
+
|
|
135
220
|
CREATE TABLE run_queue (
|
|
136
221
|
run_id TEXT PRIMARY KEY REFERENCES runs(run_id) ON DELETE CASCADE,
|
|
137
222
|
status TEXT NOT NULL CHECK (status IN (
|
|
@@ -160,14 +245,16 @@ CREATE TABLE node_attempts (
|
|
|
160
245
|
attempt_number INTEGER NOT NULL CHECK (attempt_number > 0),
|
|
161
246
|
node_type TEXT NOT NULL,
|
|
162
247
|
status TEXT NOT NULL CHECK (status IN (
|
|
163
|
-
'pending', 'running', 'waiting', '
|
|
248
|
+
'pending', 'running', 'waiting', 'interrupted',
|
|
249
|
+
'completed', 'failed', 'timed_out', 'cancelled'
|
|
164
250
|
)),
|
|
165
|
-
input_hash BLOB REFERENCES blobs(blob_hash),
|
|
166
|
-
contract_hash BLOB REFERENCES blobs(blob_hash),
|
|
167
251
|
prompt_hash BLOB REFERENCES blobs(blob_hash),
|
|
168
252
|
output_hash BLOB REFERENCES blobs(blob_hash),
|
|
169
|
-
|
|
253
|
+
receipt_hash BLOB REFERENCES blobs(blob_hash),
|
|
170
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),
|
|
171
258
|
started_at INTEGER,
|
|
172
259
|
deadline_at INTEGER,
|
|
173
260
|
finished_at INTEGER,
|
|
@@ -233,6 +320,18 @@ CREATE TABLE session_entries (
|
|
|
233
320
|
UNIQUE (segment_id, entry_id)
|
|
234
321
|
) STRICT;
|
|
235
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
|
+
|
|
236
335
|
CREATE TABLE session_events (
|
|
237
336
|
segment_id TEXT NOT NULL REFERENCES session_segments(segment_id) ON DELETE CASCADE,
|
|
238
337
|
event_seq INTEGER NOT NULL CHECK (event_seq > 0),
|
|
@@ -304,7 +403,6 @@ CREATE TABLE continuations (
|
|
|
304
403
|
decision_id TEXT PRIMARY KEY REFERENCES human_decisions(decision_id) ON DELETE CASCADE,
|
|
305
404
|
parent_run_id TEXT NOT NULL UNIQUE REFERENCES runs(run_id),
|
|
306
405
|
continuation_run_id TEXT NOT NULL UNIQUE REFERENCES runs(run_id),
|
|
307
|
-
response_hash BLOB NOT NULL REFERENCES blobs(blob_hash),
|
|
308
406
|
created_at INTEGER NOT NULL
|
|
309
407
|
) STRICT;
|
|
310
408
|
|
package/dist/state/schema.js.map
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/viewer/cli.d.ts
CHANGED
|
@@ -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;
|