@osolmaz/pi-workflows 0.12.1 → 0.13.1

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 (233) hide show
  1. package/README.md +59 -33
  2. package/dist/builtins/autodoc.workflow.d.ts +194 -7
  3. package/dist/builtins/autodoc.workflow.js +156 -30
  4. package/dist/builtins/autodoc.workflow.js.map +1 -1
  5. package/dist/builtins/autoimplement-command-batches.d.ts +1 -0
  6. package/dist/builtins/autoimplement-command-batches.js +29 -31
  7. package/dist/builtins/autoimplement-command-batches.js.map +1 -1
  8. package/dist/builtins/autoimplement.workflow.d.ts +1619 -97
  9. package/dist/builtins/autoimplement.workflow.js +416 -153
  10. package/dist/builtins/autoimplement.workflow.js.map +1 -1
  11. package/dist/builtins/autoplan.workflow.d.ts +126 -13
  12. package/dist/builtins/autoplan.workflow.js +200 -29
  13. package/dist/builtins/autoplan.workflow.js.map +1 -1
  14. package/dist/builtins/catalog.js +7 -5
  15. package/dist/builtins/catalog.js.map +1 -1
  16. package/dist/builtins/change-verification.workflow.d.ts +110 -0
  17. package/dist/builtins/change-verification.workflow.js +860 -0
  18. package/dist/builtins/change-verification.workflow.js.map +1 -0
  19. package/dist/builtins/index.d.ts +2 -1
  20. package/dist/builtins/index.js +1 -0
  21. package/dist/builtins/index.js.map +1 -1
  22. package/dist/builtins/monitor.workflow.d.ts +56 -21
  23. package/dist/builtins/monitor.workflow.js +499 -217
  24. package/dist/builtins/monitor.workflow.js.map +1 -1
  25. package/dist/builtins/plain-summary.workflow.d.ts +32 -0
  26. package/dist/builtins/plain-summary.workflow.js +134 -0
  27. package/dist/builtins/plain-summary.workflow.js.map +1 -0
  28. package/dist/builtins/plan-change.workflow.d.ts +527 -26
  29. package/dist/builtins/plan-change.workflow.js +26 -0
  30. package/dist/builtins/plan-change.workflow.js.map +1 -1
  31. package/dist/builtins/sanity-check.workflow.d.ts +45 -3
  32. package/dist/builtins/sanity-check.workflow.js +45 -7
  33. package/dist/builtins/sanity-check.workflow.js.map +1 -1
  34. package/dist/builtins/workspace-preparation.workflow.d.ts +75 -0
  35. package/dist/builtins/workspace-preparation.workflow.js +498 -0
  36. package/dist/builtins/workspace-preparation.workflow.js.map +1 -0
  37. package/dist/controllers/effects.d.ts +3 -2
  38. package/dist/controllers/effects.js +8 -1
  39. package/dist/controllers/effects.js.map +1 -1
  40. package/dist/controllers/index.d.ts +1 -1
  41. package/dist/controllers/index.js +1 -1
  42. package/dist/controllers/index.js.map +1 -1
  43. package/dist/controllers/manager.d.ts +1 -0
  44. package/dist/controllers/manager.js +41 -17
  45. package/dist/controllers/manager.js.map +1 -1
  46. package/dist/controllers/sqlite.d.ts +107 -85
  47. package/dist/controllers/sqlite.js +1611 -1486
  48. package/dist/controllers/sqlite.js.map +1 -1
  49. package/dist/controllers/store.d.ts +9 -8
  50. package/dist/controllers/store.js +1 -31
  51. package/dist/controllers/store.js.map +1 -1
  52. package/dist/controllers/types.d.ts +3 -0
  53. package/dist/controllers/workflow-engine-scheduler.d.ts +1 -1
  54. package/dist/controllers/workflow-engine-scheduler.js +3 -5
  55. package/dist/controllers/workflow-engine-scheduler.js.map +1 -1
  56. package/dist/controllers/workflows.d.ts +2 -2
  57. package/dist/controllers/workflows.js +11 -10
  58. package/dist/controllers/workflows.js.map +1 -1
  59. package/dist/extension/controller-host.js +2 -2
  60. package/dist/extension/controller-host.js.map +1 -1
  61. package/dist/extension/decision-channels.d.ts +2 -0
  62. package/dist/extension/decision-channels.js +311 -118
  63. package/dist/extension/decision-channels.js.map +1 -1
  64. package/dist/extension/executor.d.ts +9 -2
  65. package/dist/extension/executor.js +90 -6
  66. package/dist/extension/executor.js.map +1 -1
  67. package/dist/extension/herdr-viewer.d.ts +0 -1
  68. package/dist/extension/herdr-viewer.js +0 -4
  69. package/dist/extension/herdr-viewer.js.map +1 -1
  70. package/dist/extension/index.js +156 -117
  71. package/dist/extension/index.js.map +1 -1
  72. package/dist/extension/recorder.d.ts +3 -10
  73. package/dist/extension/recorder.js +13 -22
  74. package/dist/extension/recorder.js.map +1 -1
  75. package/dist/extension/step-message.d.ts +7 -2
  76. package/dist/extension/step-message.js +94 -2
  77. package/dist/extension/step-message.js.map +1 -1
  78. package/dist/extension/widget.js +6 -0
  79. package/dist/extension/widget.js.map +1 -1
  80. package/dist/host/rpc-executor.d.ts +3 -0
  81. package/dist/host/rpc-executor.js +2 -0
  82. package/dist/host/rpc-executor.js.map +1 -1
  83. package/dist/host/runner.d.ts +3 -6
  84. package/dist/host/runner.js +83 -32
  85. package/dist/host/runner.js.map +1 -1
  86. package/dist/render/graph-render.js +14 -8
  87. package/dist/render/graph-render.js.map +1 -1
  88. package/dist/state/database.d.ts +35 -0
  89. package/dist/state/database.js +287 -0
  90. package/dist/state/database.js.map +1 -0
  91. package/dist/state/index.d.ts +4 -0
  92. package/dist/state/index.js +5 -0
  93. package/dist/state/index.js.map +1 -0
  94. package/dist/state/json.d.ts +6 -0
  95. package/dist/state/json.js +38 -0
  96. package/dist/state/json.js.map +1 -0
  97. package/dist/state/mutation.d.ts +57 -0
  98. package/dist/state/mutation.js +255 -0
  99. package/dist/state/mutation.js.map +1 -0
  100. package/dist/state/schema.d.ts +6 -0
  101. package/dist/state/schema.js +473 -0
  102. package/dist/state/schema.js.map +1 -0
  103. package/dist/viewer/cli.d.ts +2 -2
  104. package/dist/viewer/cli.js +142 -122
  105. package/dist/viewer/cli.js.map +1 -1
  106. package/dist/viewer/render.d.ts +4 -4
  107. package/dist/viewer/render.js +2 -17
  108. package/dist/viewer/render.js.map +1 -1
  109. package/dist/viewer/session-reducer.d.ts +1 -1
  110. package/dist/viewer/session-reducer.js +1 -1
  111. package/dist/viewer/tui.d.ts +3 -3
  112. package/dist/viewer/tui.js +15 -13
  113. package/dist/viewer/tui.js.map +1 -1
  114. package/dist/viewer/watch.d.ts +2 -5
  115. package/dist/viewer/watch.js +13 -13
  116. package/dist/viewer/watch.js.map +1 -1
  117. package/dist/workflows/composition.js +12 -2
  118. package/dist/workflows/composition.js.map +1 -1
  119. package/dist/workflows/definition.d.ts +6 -2
  120. package/dist/workflows/definition.js +17 -0
  121. package/dist/workflows/definition.js.map +1 -1
  122. package/dist/workflows/engine.d.ts +6 -6
  123. package/dist/workflows/engine.js +183 -103
  124. package/dist/workflows/engine.js.map +1 -1
  125. package/dist/workflows/errors.d.ts +3 -3
  126. package/dist/workflows/errors.js +3 -3
  127. package/dist/workflows/human-decision.d.ts +29 -4
  128. package/dist/workflows/human-decision.js +547 -283
  129. package/dist/workflows/human-decision.js.map +1 -1
  130. package/dist/workflows/index.d.ts +4 -5
  131. package/dist/workflows/index.js +3 -4
  132. package/dist/workflows/index.js.map +1 -1
  133. package/dist/workflows/schema.js +17 -1
  134. package/dist/workflows/schema.js.map +1 -1
  135. package/dist/workflows/store.d.ts +83 -103
  136. package/dist/workflows/store.js +902 -951
  137. package/dist/workflows/store.js.map +1 -1
  138. package/dist/workflows/types.d.ts +55 -81
  139. package/docs/CONTROLLERS.md +10 -8
  140. package/docs/DEFERRED_TURNS.md +2 -2
  141. package/docs/DESIGN_PHILOSOPHY.md +4 -2
  142. package/docs/HUMAN_DECISIONS.md +13 -14
  143. package/docs/MONITOR.md +179 -231
  144. package/docs/SQLITE_STATE.md +219 -0
  145. package/docs/WORKFLOW_COMPOSITION.md +27 -19
  146. package/docs/WORKFLOW_STEP_MESSAGES.md +20 -18
  147. package/docs/WORKFLOW_UPDATES.md +10 -9
  148. package/docs/development.md +9 -9
  149. package/docs/live-replay-protocol.md +28 -37
  150. package/docs/plans/2026-08-16-workflow-updates-plan.md +1 -1
  151. package/docs/plans/2026-08-19-human-decision-gates-plan.md +1 -1
  152. package/docs/plans/2026-08-21-autoimplement-timeout-fallback-plan.md +1 -1
  153. package/docs/plans/2026-08-21-plan-change-approval-policy-plan.md +1 -1
  154. package/docs/plans/2026-08-21-sanity-check-plan.md +30 -16
  155. package/docs/plans/2026-08-22-goal-finishing-monitor-plan.md +200 -0
  156. package/docs/plans/2026-08-23-assistant-agent-completion-plan.md +701 -0
  157. package/docs/plans/2026-08-23-sqlite-state-plan.md +970 -0
  158. package/docs/plans/2026-08-24-change-scoped-verification-plan.md +419 -0
  159. package/docs/plans/replayable-run-bundles-implementation-plan.md +2 -2
  160. package/docs/plans/session-event-replay-implementation-plan.md +1 -1
  161. package/docs/plans/tui-viewer-implementation-plan.md +1 -1
  162. package/docs/session-event-journal.md +63 -434
  163. package/docs/tui-viewer.md +13 -15
  164. package/docs/workflows.md +111 -62
  165. package/examples/workflows/plain-summary.workflow.ts +1 -0
  166. package/herdr-plugin.toml +1 -1
  167. package/package.json +1 -1
  168. package/plugins/herdr/viewer.mjs +1 -11
  169. package/skills/autodoc/SKILL.md +7 -0
  170. package/skills/autoimplement/SKILL.md +4 -0
  171. package/skills/autoplan/SKILL.md +5 -4
  172. package/skills/monitor/SKILL.md +91 -163
  173. package/skills/pi-workflows/SKILL.md +7 -7
  174. package/skills/sanity-check/SKILL.md +1 -1
  175. package/src/builtins/autodoc.workflow.ts +184 -33
  176. package/src/builtins/autoimplement-command-batches.ts +39 -33
  177. package/src/builtins/autoimplement.workflow.ts +483 -175
  178. package/src/builtins/autoplan.workflow.ts +290 -40
  179. package/src/builtins/catalog.ts +7 -5
  180. package/src/builtins/change-verification.workflow.ts +1143 -0
  181. package/src/builtins/index.ts +7 -1
  182. package/src/builtins/monitor.workflow.ts +667 -250
  183. package/src/builtins/plain-summary.workflow.ts +185 -0
  184. package/src/builtins/plan-change.workflow.ts +35 -0
  185. package/src/builtins/sanity-check.workflow.ts +62 -7
  186. package/src/builtins/workspace-preparation.workflow.ts +668 -0
  187. package/src/controllers/effects.ts +7 -0
  188. package/src/controllers/index.ts +0 -6
  189. package/src/controllers/manager.ts +72 -32
  190. package/src/controllers/sqlite.ts +2420 -1948
  191. package/src/controllers/store.ts +17 -38
  192. package/src/controllers/types.ts +3 -0
  193. package/src/controllers/workflow-engine-scheduler.ts +4 -8
  194. package/src/controllers/workflows.ts +45 -21
  195. package/src/extension/controller-host.ts +1 -2
  196. package/src/extension/decision-channels.ts +427 -144
  197. package/src/extension/executor.ts +106 -6
  198. package/src/extension/herdr-viewer.ts +0 -5
  199. package/src/extension/index.ts +180 -132
  200. package/src/extension/recorder.ts +13 -22
  201. package/src/extension/step-message.ts +106 -4
  202. package/src/extension/widget.ts +8 -0
  203. package/src/host/rpc-executor.ts +4 -0
  204. package/src/host/runner.ts +93 -41
  205. package/src/render/graph-render.ts +11 -4
  206. package/src/state/database.ts +375 -0
  207. package/src/state/index.ts +29 -0
  208. package/src/state/json.ts +42 -0
  209. package/src/state/mutation.ts +435 -0
  210. package/src/state/schema.ts +475 -0
  211. package/src/viewer/cli.ts +151 -144
  212. package/src/viewer/render.ts +12 -24
  213. package/src/viewer/session-reducer.ts +1 -1
  214. package/src/viewer/tui.ts +18 -17
  215. package/src/viewer/watch.ts +13 -17
  216. package/src/workflows/composition.ts +12 -3
  217. package/src/workflows/definition.ts +36 -3
  218. package/src/workflows/engine.ts +212 -116
  219. package/src/workflows/errors.ts +3 -3
  220. package/src/workflows/human-decision.ts +795 -340
  221. package/src/workflows/index.ts +15 -19
  222. package/src/workflows/schema.ts +19 -1
  223. package/src/workflows/store.ts +1295 -1163
  224. package/src/workflows/types.ts +61 -81
  225. package/dist/workflows/artifacts.d.ts +0 -40
  226. package/dist/workflows/artifacts.js +0 -155
  227. package/dist/workflows/artifacts.js.map +0 -1
  228. package/dist/workflows/migrate-sources.d.ts +0 -42
  229. package/dist/workflows/migrate-sources.js +0 -133
  230. package/dist/workflows/migrate-sources.js.map +0 -1
  231. package/docs/run-bundles.md +0 -481
  232. package/src/workflows/artifacts.ts +0 -188
  233. package/src/workflows/migrate-sources.ts +0 -178
@@ -0,0 +1,287 @@
1
+ import { createHash } from "node:crypto";
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import Database from "better-sqlite3";
6
+ import { canonicalJson, parseJson } from "./json.js";
7
+ import { STATE_APPLICATION_ID, STATE_APP_VERSION, STATE_SCHEMA_DIGEST, STATE_SCHEMA_NAME, STATE_SCHEMA_SQL, STATE_SCHEMA_VERSION, } from "./schema.js";
8
+ const DATABASE_FILE = "state.sqlite";
9
+ const BUSY_TIMEOUT_MS = 5_000;
10
+ const JOURNAL_SIZE_LIMIT = 64 * 1024 * 1024;
11
+ const RESET_INSTRUCTION = "Pi Workflows durable state is incompatible. Move or remove the old workflow state, then create a new state.sqlite database.";
12
+ let expectedShape;
13
+ export function workflowStatePath(homeDir = os.homedir()) {
14
+ return path.join(homeDir, ".pi", "agent", "workflows", DATABASE_FILE);
15
+ }
16
+ export class StateDatabase {
17
+ filePath;
18
+ mode;
19
+ connection;
20
+ constructor(options = {}) {
21
+ this.filePath = path.resolve(options.filePath ?? workflowStatePath(options.homeDir));
22
+ this.mode = options.mode ?? "read-write";
23
+ const existed = fs.existsSync(this.filePath);
24
+ if (this.mode === "read-only" && !existed) {
25
+ throw new Error(`Pi Workflows state database does not exist: ${this.filePath}`);
26
+ }
27
+ if (!existed && this.mode === "read-write") {
28
+ if (options.checkLegacyState ?? options.filePath === undefined) {
29
+ assertNoLegacyState(this.filePath, options.homeDir ?? os.homedir());
30
+ }
31
+ fs.mkdirSync(path.dirname(this.filePath), { recursive: true, mode: 0o700 });
32
+ fs.chmodSync(path.dirname(this.filePath), 0o700);
33
+ }
34
+ this.connection = new Database(this.filePath, {
35
+ readonly: this.mode === "read-only",
36
+ fileMustExist: this.mode === "read-only",
37
+ timeout: BUSY_TIMEOUT_MS,
38
+ });
39
+ try {
40
+ this.configure(existed);
41
+ if (this.mode === "read-write") {
42
+ this.prepareSchema(!existed);
43
+ }
44
+ this.verifySchema();
45
+ if (this.mode === "read-only") {
46
+ this.connection.pragma("query_only = ON");
47
+ }
48
+ else {
49
+ fs.chmodSync(this.filePath, 0o600);
50
+ }
51
+ }
52
+ catch (error) {
53
+ this.connection.close();
54
+ throw error;
55
+ }
56
+ }
57
+ close() {
58
+ this.connection.close();
59
+ }
60
+ transaction(operation) {
61
+ if (this.mode === "read-only") {
62
+ throw new Error("Cannot mutate a read-only Pi Workflows database");
63
+ }
64
+ this.connection.exec("BEGIN IMMEDIATE");
65
+ try {
66
+ const result = operation();
67
+ this.connection.exec("COMMIT");
68
+ return result;
69
+ }
70
+ catch (error) {
71
+ if (this.connection.inTransaction) {
72
+ this.connection.exec("ROLLBACK");
73
+ }
74
+ throw error;
75
+ }
76
+ }
77
+ putJson(value, now = Date.now()) {
78
+ return this.putBlob(Buffer.from(canonicalJson(value), "utf8"), "application/json", now);
79
+ }
80
+ putText(value, now = Date.now()) {
81
+ return this.putBlob(Buffer.from(value, "utf8"), "text/plain", now);
82
+ }
83
+ putBlob(content, mediaType, now = Date.now()) {
84
+ if (this.mode === "read-only") {
85
+ throw new Error("Cannot write a blob through a read-only Pi Workflows database");
86
+ }
87
+ const hash = createHash("sha256").update(content).digest();
88
+ this.connection
89
+ .prepare(`INSERT INTO blobs(blob_hash, media_type, byte_length, content, created_at)
90
+ VALUES (?, ?, ?, ?, ?)
91
+ ON CONFLICT(blob_hash) DO NOTHING`)
92
+ .run(hash, mediaType, content.byteLength, content, now);
93
+ const stored = this.readBlob(hash);
94
+ if (stored === undefined ||
95
+ stored.mediaType !== mediaType ||
96
+ stored.byteLength !== content.byteLength ||
97
+ !stored.content.equals(content)) {
98
+ throw new Error("Content-addressed blob conflict");
99
+ }
100
+ return hash;
101
+ }
102
+ readBlob(hash) {
103
+ const row = this.connection
104
+ .prepare(`SELECT blob_hash AS blobHash, media_type AS mediaType,
105
+ byte_length AS byteLength, content
106
+ FROM blobs WHERE blob_hash = ?`)
107
+ .get(hash);
108
+ if (!isBlobRow(row)) {
109
+ return undefined;
110
+ }
111
+ return {
112
+ hash: row.blobHash,
113
+ mediaType: row.mediaType,
114
+ byteLength: row.byteLength,
115
+ content: row.content,
116
+ };
117
+ }
118
+ readJson(hash) {
119
+ const blob = this.readBlob(hash);
120
+ if (blob === undefined || blob.mediaType !== "application/json") {
121
+ throw new Error("JSON blob is missing or has the wrong media type");
122
+ }
123
+ return parseJson(blob.content.toString("utf8"));
124
+ }
125
+ integrityCheck() {
126
+ const result = this.connection.pragma("integrity_check", { simple: true });
127
+ if (result !== "ok") {
128
+ throw new Error(`Pi Workflows SQLite integrity check failed: ${String(result)}`);
129
+ }
130
+ const foreignKeys = this.connection.pragma("foreign_key_check");
131
+ if (!Array.isArray(foreignKeys) || foreignKeys.length !== 0) {
132
+ throw new Error("Pi Workflows SQLite foreign-key check failed");
133
+ }
134
+ }
135
+ async backup(destination) {
136
+ if (path.resolve(destination) === this.filePath) {
137
+ throw new Error("Backup destination must differ from the live database");
138
+ }
139
+ fs.mkdirSync(path.dirname(path.resolve(destination)), { recursive: true, mode: 0o700 });
140
+ this.integrityCheck();
141
+ await this.connection.backup(destination);
142
+ fs.chmodSync(destination, 0o600);
143
+ const backup = new StateDatabase({ filePath: destination, mode: "read-only" });
144
+ try {
145
+ backup.integrityCheck();
146
+ }
147
+ finally {
148
+ backup.close();
149
+ }
150
+ }
151
+ configure(existed) {
152
+ this.connection.pragma("foreign_keys = ON");
153
+ this.connection.pragma(`busy_timeout = ${BUSY_TIMEOUT_MS}`);
154
+ if (this.mode === "read-write") {
155
+ this.connection.pragma("journal_mode = WAL");
156
+ this.connection.pragma("synchronous = FULL");
157
+ this.connection.pragma("wal_autocheckpoint = 1000");
158
+ this.connection.pragma(`journal_size_limit = ${JOURNAL_SIZE_LIMIT}`);
159
+ }
160
+ else if (existed) {
161
+ this.connection.pragma("synchronous = FULL");
162
+ }
163
+ }
164
+ prepareSchema(allowInitialize) {
165
+ this.connection.exec("BEGIN EXCLUSIVE");
166
+ try {
167
+ const schema = this.connection
168
+ .prepare("SELECT 1 AS present FROM sqlite_master WHERE type = 'table' AND name = 'schema_meta'")
169
+ .get();
170
+ if (schema === undefined) {
171
+ if (!allowInitialize)
172
+ throw new Error(RESET_INSTRUCTION);
173
+ this.initialize();
174
+ }
175
+ this.connection.exec("COMMIT");
176
+ }
177
+ catch (error) {
178
+ if (this.connection.inTransaction)
179
+ this.connection.exec("ROLLBACK");
180
+ throw error;
181
+ }
182
+ }
183
+ initialize() {
184
+ this.connection.exec(STATE_SCHEMA_SQL);
185
+ this.connection.pragma(`application_id = ${STATE_APPLICATION_ID}`);
186
+ this.connection.pragma(`user_version = ${STATE_SCHEMA_VERSION}`);
187
+ const now = Date.now();
188
+ this.connection
189
+ .prepare(`INSERT INTO schema_meta(
190
+ id, schema_name, schema_version, schema_digest, app_version, created_at, updated_at
191
+ ) VALUES (1, ?, ?, ?, ?, ?, ?)`)
192
+ .run(STATE_SCHEMA_NAME, STATE_SCHEMA_VERSION, STATE_SCHEMA_DIGEST, STATE_APP_VERSION, now, now);
193
+ }
194
+ verifySchema() {
195
+ const applicationId = this.connection.pragma("application_id", { simple: true });
196
+ const userVersion = this.connection.pragma("user_version", { simple: true });
197
+ if (applicationId !== STATE_APPLICATION_ID || userVersion !== STATE_SCHEMA_VERSION) {
198
+ throw new Error(RESET_INSTRUCTION);
199
+ }
200
+ const row = this.connection
201
+ .prepare(`SELECT schema_name AS schemaName, schema_version AS schemaVersion,
202
+ schema_digest AS schemaDigest, app_version AS appVersion
203
+ FROM schema_meta WHERE id = 1`)
204
+ .get();
205
+ if (!isSchemaMetaRow(row) ||
206
+ row.schemaName !== STATE_SCHEMA_NAME ||
207
+ row.schemaVersion !== STATE_SCHEMA_VERSION ||
208
+ !row.schemaDigest.equals(STATE_SCHEMA_DIGEST) ||
209
+ row.appVersion !== STATE_APP_VERSION) {
210
+ throw new Error(RESET_INSTRUCTION);
211
+ }
212
+ if (schemaShape(this.connection) !== expectedSchemaShape()) {
213
+ throw new Error(RESET_INSTRUCTION);
214
+ }
215
+ }
216
+ }
217
+ function expectedSchemaShape() {
218
+ if (expectedShape !== undefined) {
219
+ return expectedShape;
220
+ }
221
+ const database = new Database(":memory:");
222
+ try {
223
+ database.pragma("foreign_keys = ON");
224
+ database.exec(STATE_SCHEMA_SQL);
225
+ expectedShape = schemaShape(database);
226
+ return expectedShape;
227
+ }
228
+ finally {
229
+ database.close();
230
+ }
231
+ }
232
+ function schemaShape(database) {
233
+ const rows = database
234
+ .prepare(`SELECT type, name, tbl_name AS tableName, sql
235
+ FROM sqlite_schema
236
+ WHERE name NOT LIKE 'sqlite_%'
237
+ ORDER BY type, name`)
238
+ .all();
239
+ const normalized = [];
240
+ for (const row of rows) {
241
+ if (!isSchemaObjectRow(row)) {
242
+ throw new Error("Pi Workflows database contains an invalid schema object");
243
+ }
244
+ normalized.push(row);
245
+ }
246
+ return createHash("sha256").update(canonicalJson(normalized)).digest("hex");
247
+ }
248
+ function assertNoLegacyState(databasePath, homeDir) {
249
+ const root = path.dirname(databasePath);
250
+ const legacy = [
251
+ path.join(root, "runs"),
252
+ path.join(root, "decisions"),
253
+ path.join(root, "controllers"),
254
+ ];
255
+ const telegramState = path.join(homeDir, ".config", "pi-workflows", "telegram-state.sqlite");
256
+ if (legacy.some((candidate) => fs.existsSync(candidate)) || fs.existsSync(telegramState)) {
257
+ throw new Error(RESET_INSTRUCTION);
258
+ }
259
+ }
260
+ function isSchemaObjectRow(value) {
261
+ if (!isRecord(value))
262
+ return false;
263
+ return (typeof value.type === "string" &&
264
+ typeof value.name === "string" &&
265
+ typeof value.tableName === "string" &&
266
+ typeof value.sql === "string");
267
+ }
268
+ function isSchemaMetaRow(value) {
269
+ if (!isRecord(value))
270
+ return false;
271
+ return (typeof value.schemaName === "string" &&
272
+ typeof value.schemaVersion === "number" &&
273
+ Buffer.isBuffer(value.schemaDigest) &&
274
+ typeof value.appVersion === "string");
275
+ }
276
+ function isBlobRow(value) {
277
+ if (!isRecord(value))
278
+ return false;
279
+ return (Buffer.isBuffer(value.blobHash) &&
280
+ typeof value.mediaType === "string" &&
281
+ typeof value.byteLength === "number" &&
282
+ Buffer.isBuffer(value.content));
283
+ }
284
+ function isRecord(value) {
285
+ return typeof value === "object" && value !== null && !Array.isArray(value);
286
+ }
287
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/state/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { StateDatabase, workflowStatePath, type BlobRecord, type OpenStateDatabaseOptions, type StateDatabaseMode, } from "./database.js";
2
+ export { canonicalJson, parseJson, type JsonPrimitive, type JsonValue } from "./json.js";
3
+ export { StateMutationStore, StaleResourceError, resourceIdFor, tokenHash, type ActorType, type LeaseClaim, type MutationActor, type MutationResult, type OwnerType, type ResourceType, type WritePermit, } from "./mutation.js";
4
+ export { STATE_APPLICATION_ID, STATE_APP_VERSION, STATE_SCHEMA_DIGEST, STATE_SCHEMA_NAME, STATE_SCHEMA_SQL, STATE_SCHEMA_VERSION, } from "./schema.js";
@@ -0,0 +1,5 @@
1
+ export { StateDatabase, workflowStatePath, } from "./database.js";
2
+ export { canonicalJson, parseJson } from "./json.js";
3
+ export { StateMutationStore, StaleResourceError, resourceIdFor, tokenHash, } from "./mutation.js";
4
+ export { STATE_APPLICATION_ID, STATE_APP_VERSION, STATE_SCHEMA_DIGEST, STATE_SCHEMA_NAME, STATE_SCHEMA_SQL, STATE_SCHEMA_VERSION, } from "./schema.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,iBAAiB,GAIlB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,SAAS,EAAsC,MAAM,WAAW,CAAC;AACzF,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,SAAS,GAQV,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type JsonPrimitive = string | number | boolean | null;
2
+ export type JsonValue = JsonPrimitive | JsonValue[] | {
3
+ [key: string]: JsonValue;
4
+ };
5
+ export declare function canonicalJson(value: unknown): string;
6
+ export declare function parseJson(text: string): JsonValue;
@@ -0,0 +1,38 @@
1
+ export function canonicalJson(value) {
2
+ return JSON.stringify(normalizeJson(value));
3
+ }
4
+ export function parseJson(text) {
5
+ return normalizeJson(JSON.parse(text));
6
+ }
7
+ function normalizeJson(value) {
8
+ if (value === null || typeof value === "string" || typeof value === "boolean") {
9
+ return value;
10
+ }
11
+ if (typeof value === "number") {
12
+ if (!Number.isFinite(value)) {
13
+ throw new Error("JSON numbers must be finite");
14
+ }
15
+ return Object.is(value, -0) ? 0 : value;
16
+ }
17
+ if (Array.isArray(value)) {
18
+ return value.map((item) => normalizeJson(item));
19
+ }
20
+ if (typeof value === "object") {
21
+ const prototype = Object.getPrototypeOf(value);
22
+ if (prototype !== Object.prototype && prototype !== null) {
23
+ throw new Error("Only plain objects can be stored as canonical JSON");
24
+ }
25
+ const input = value;
26
+ const output = {};
27
+ for (const key of Object.keys(input).sort()) {
28
+ const item = input[key];
29
+ if (item === undefined) {
30
+ continue;
31
+ }
32
+ output[key] = normalizeJson(item);
33
+ }
34
+ return output;
35
+ }
36
+ throw new Error(`Unsupported JSON value type: ${typeof value}`);
37
+ }
38
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/state/json.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1C,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAkB,CAAC;QAChE,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,KAAK,GAAG,KAAgC,CAAC;QAC/C,MAAM,MAAM,GAAiC,EAAE,CAAC;QAChD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,SAAS;YACX,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,KAAK,EAAE,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { StateDatabase } from "./database.js";
2
+ export type ResourceType = "run" | "session" | "decision" | "controller" | "effect" | "channel" | "notification" | "turn_intent";
3
+ export type ActorType = "session" | "host" | "controller" | "channel" | "human" | "policy" | "control" | "system";
4
+ export type OwnerType = "session" | "host" | "controller" | "channel" | "system";
5
+ export type MutationActor = {
6
+ type: ActorType;
7
+ id?: string;
8
+ };
9
+ export type LeaseClaim = {
10
+ resourceId: string;
11
+ ownerType: OwnerType;
12
+ ownerId: string;
13
+ token: string;
14
+ generation: number;
15
+ expiresAt: number;
16
+ resourceRevision: number;
17
+ };
18
+ export type WritePermit = {
19
+ resourceId: string;
20
+ operation: string;
21
+ actor: MutationActor;
22
+ expectedRevision: number;
23
+ lease?: LeaseClaim;
24
+ };
25
+ export type MutationResult<T> = {
26
+ value: T;
27
+ revision: number;
28
+ eventId: string;
29
+ };
30
+ export declare class StaleResourceError extends Error {
31
+ constructor(message: string);
32
+ }
33
+ export declare class StateMutationStore {
34
+ readonly state: StateDatabase;
35
+ constructor(state: StateDatabase);
36
+ ensureResource(type: ResourceType, aggregateKey: string, now?: number): string;
37
+ claim(options: {
38
+ resourceId: string;
39
+ ownerType: OwnerType;
40
+ ownerId: string;
41
+ expectedRevision: number;
42
+ leaseMs: number;
43
+ now?: number;
44
+ }): LeaseClaim | undefined;
45
+ renew(claim: LeaseClaim, expectedRevision: number, leaseMs: number, now?: number): LeaseClaim;
46
+ release(claim: LeaseClaim, expectedRevision: number, now?: number): number;
47
+ mutate<T>(permit: WritePermit, eventType: string, apply: (context: {
48
+ database: StateDatabase;
49
+ nextRevision: number;
50
+ now: number;
51
+ }) => T, options?: {
52
+ payload?: unknown;
53
+ now?: number;
54
+ }): MutationResult<T>;
55
+ }
56
+ export declare function resourceIdFor(type: ResourceType, aggregateKey: string): string;
57
+ export declare function tokenHash(token: string): Buffer;