@codetreker/daynight 0.27.2 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/README.md +165 -36
  2. package/dist/api/client.d.ts +5 -1
  3. package/dist/api/client.js +38 -14
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/api/index.d.ts +1 -0
  6. package/dist/api/index.js +1 -0
  7. package/dist/api/index.js.map +1 -1
  8. package/dist/api/json.js +27 -6
  9. package/dist/api/json.js.map +1 -1
  10. package/dist/api/parse.d.ts +1 -4
  11. package/dist/api/parse.js +8 -87
  12. package/dist/api/parse.js.map +1 -1
  13. package/dist/api/resource-path.d.ts +1 -0
  14. package/dist/api/resource-path.js +8 -0
  15. package/dist/api/resource-path.js.map +1 -0
  16. package/dist/api/task-properties.d.ts +8 -0
  17. package/dist/api/task-properties.js +86 -0
  18. package/dist/api/task-properties.js.map +1 -0
  19. package/dist/api/types.d.ts +24 -6
  20. package/dist/api/validation.d.ts +15 -0
  21. package/dist/api/validation.js +43 -0
  22. package/dist/api/validation.js.map +1 -0
  23. package/dist/cli/schema.d.ts +3 -0
  24. package/dist/cli/schema.js +14 -4
  25. package/dist/cli/schema.js.map +1 -1
  26. package/dist/commands/completion/bash.d.ts +1 -1
  27. package/dist/commands/completion/bash.js +6 -3
  28. package/dist/commands/completion/bash.js.map +1 -1
  29. package/dist/commands/completion/zsh.d.ts +1 -1
  30. package/dist/commands/completion/zsh.js +7 -7
  31. package/dist/commands/completion/zsh.js.map +1 -1
  32. package/dist/commands/controller/independent.js +31 -15
  33. package/dist/commands/controller/independent.js.map +1 -1
  34. package/dist/commands/controller/journal-format.d.ts +4 -0
  35. package/dist/commands/controller/journal-format.js +42 -0
  36. package/dist/commands/controller/journal-format.js.map +1 -0
  37. package/dist/commands/controller/lifecycle-store.d.ts +7 -5
  38. package/dist/commands/controller/lifecycle-store.js +114 -85
  39. package/dist/commands/controller/lifecycle-store.js.map +1 -1
  40. package/dist/commands/controller/local-content.d.ts +10 -5
  41. package/dist/commands/controller/local-content.js +8 -2
  42. package/dist/commands/controller/local-content.js.map +1 -1
  43. package/dist/commands/controller/resume-lease-format.d.ts +4 -0
  44. package/dist/commands/controller/resume-lease-format.js +35 -0
  45. package/dist/commands/controller/resume-lease-format.js.map +1 -0
  46. package/dist/commands/controller/resume.js +85 -21
  47. package/dist/commands/controller/resume.js.map +1 -1
  48. package/dist/commands/controller/sqlite/journal/001-baseline.sql +17 -0
  49. package/dist/commands/controller/sqlite/journal/002-projection.sql +8 -0
  50. package/dist/commands/controller/sqlite/journal/003-operation-acknowledgements.sql +1 -0
  51. package/dist/commands/controller/sqlite/journal/004-projection-gap.sql +1 -0
  52. package/dist/commands/controller/sqlite/journal/005-resources.sql +7 -0
  53. package/dist/commands/controller/sqlite/resume-lease/001-baseline.sql +7 -0
  54. package/dist/commands/review/listing.js +1 -1
  55. package/dist/commands/review/listing.js.map +1 -1
  56. package/dist/commands/review/runtime.js +3 -1
  57. package/dist/commands/review/runtime.js.map +1 -1
  58. package/dist/commands/review/sqlite/001-baseline.sql +65 -0
  59. package/dist/commands/review/sqlite/002-publications.sql +15 -0
  60. package/dist/commands/review/store-format.d.ts +2 -0
  61. package/dist/commands/review/store-format.js +35 -0
  62. package/dist/commands/review/store-format.js.map +1 -0
  63. package/dist/commands/review/store.d.ts +8 -1
  64. package/dist/commands/review/store.js +46 -176
  65. package/dist/commands/review/store.js.map +1 -1
  66. package/dist/commands/skill/skills/using-daynight/SKILL.md +2 -2
  67. package/dist/commands/skill/skills/using-daynight/references/autopilot-managed-task.md +19 -7
  68. package/dist/commands/skill/skills/using-daynight/references/handbook.md +2 -1
  69. package/dist/commands/skill/skills/using-daynight/references/task-execution.md +1 -1
  70. package/dist/commands/skill/skills/using-daynight/references/task-management.md +29 -2
  71. package/dist/commands/skill/skills/using-daynight/references/write-safety.md +1 -1
  72. package/dist/commands/task/command.js +7 -11
  73. package/dist/commands/task/command.js.map +1 -1
  74. package/dist/commands/task/definition.js +28 -11
  75. package/dist/commands/task/definition.js.map +1 -1
  76. package/dist/commands/task/property.d.ts +6 -0
  77. package/dist/commands/task/property.js +51 -0
  78. package/dist/commands/task/property.js.map +1 -0
  79. package/dist/commands/task/rendering.d.ts +3 -1
  80. package/dist/commands/task/rendering.js +25 -8
  81. package/dist/commands/task/rendering.js.map +1 -1
  82. package/dist/commands/worker/backends/sqlite/001-baseline.sql +4 -0
  83. package/dist/commands/worker/backends/web-process.js +6 -3
  84. package/dist/commands/worker/backends/web-process.js.map +1 -1
  85. package/dist/commands/worker/backends/web-record.d.ts +11 -0
  86. package/dist/commands/worker/backends/web-record.js +151 -0
  87. package/dist/commands/worker/backends/web-record.js.map +1 -0
  88. package/dist/commands/worker/backends/web-store-format.d.ts +2 -0
  89. package/dist/commands/worker/backends/web-store-format.js +33 -0
  90. package/dist/commands/worker/backends/web-store-format.js.map +1 -0
  91. package/dist/commands/worker/backends/web-store.d.ts +4 -1
  92. package/dist/commands/worker/backends/web-store.js +43 -170
  93. package/dist/commands/worker/backends/web-store.js.map +1 -1
  94. package/dist/commands/worker/backends/web.js +5 -4
  95. package/dist/commands/worker/backends/web.js.map +1 -1
  96. package/dist/commands/worker/cleanup.d.ts +1 -1
  97. package/dist/commands/worker/cleanup.js.map +1 -1
  98. package/dist/commands/worker/control.js +10 -6
  99. package/dist/commands/worker/control.js.map +1 -1
  100. package/dist/commands/worker/coordinator.js +15 -14
  101. package/dist/commands/worker/coordinator.js.map +1 -1
  102. package/dist/commands/worker/diagnostics.d.ts +3 -0
  103. package/dist/commands/worker/diagnostics.js +15 -0
  104. package/dist/commands/worker/diagnostics.js.map +1 -1
  105. package/dist/commands/worker/execution.d.ts +2 -0
  106. package/dist/commands/worker/execution.js +17 -4
  107. package/dist/commands/worker/execution.js.map +1 -1
  108. package/dist/commands/worker/herdr/agents.d.ts +6 -1
  109. package/dist/commands/worker/herdr/agents.js +8 -3
  110. package/dist/commands/worker/herdr/agents.js.map +1 -1
  111. package/dist/commands/worker/herdr.d.ts +2 -2
  112. package/dist/commands/worker/herdr.js.map +1 -1
  113. package/dist/commands/worker/prompts.js +7 -2
  114. package/dist/commands/worker/prompts.js.map +1 -1
  115. package/dist/commands/worker/remote.js +7 -6
  116. package/dist/commands/worker/remote.js.map +1 -1
  117. package/dist/commands/worker/runtime.js +8 -3
  118. package/dist/commands/worker/runtime.js.map +1 -1
  119. package/dist/commands/worker/sqlite/005-baseline.sql +18 -0
  120. package/dist/commands/worker/store-format.d.ts +2 -0
  121. package/dist/commands/worker/store-format.js +35 -0
  122. package/dist/commands/worker/store-format.js.map +1 -0
  123. package/dist/commands/worker/store.d.ts +2 -0
  124. package/dist/commands/worker/store.js +36 -69
  125. package/dist/commands/worker/store.js.map +1 -1
  126. package/dist/platform/diagnostics.js +3 -0
  127. package/dist/platform/diagnostics.js.map +1 -1
  128. package/dist/platform/instance-lock.d.ts +15 -0
  129. package/dist/platform/instance-lock.js +45 -3
  130. package/dist/platform/instance-lock.js.map +1 -1
  131. package/dist/platform/sqlite-access.d.ts +40 -0
  132. package/dist/platform/sqlite-access.js +333 -0
  133. package/dist/platform/sqlite-access.js.map +1 -0
  134. package/dist/platform/sqlite-error.d.ts +39 -0
  135. package/dist/platform/sqlite-error.js +36 -0
  136. package/dist/platform/sqlite-error.js.map +1 -0
  137. package/dist/platform/sqlite-format.d.ts +31 -0
  138. package/dist/platform/sqlite-format.js +98 -0
  139. package/dist/platform/sqlite-format.js.map +1 -0
  140. package/dist/platform/sqlite-sql.d.ts +12 -0
  141. package/dist/platform/sqlite-sql.js +61 -0
  142. package/dist/platform/sqlite-sql.js.map +1 -0
  143. package/package.json +3 -3
@@ -0,0 +1,333 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { lstatSync, statSync } from "node:fs";
3
+ import path from "node:path";
4
+ import Database from "better-sqlite3";
5
+ import { MaintenanceLockHeldError } from "./instance-lock.js";
6
+ import { currentSqliteVersion, inspectSqlite, upgradeSqlite } from "./sqlite-format.js";
7
+ import { SqliteAccessError, serializeSqliteError } from "./sqlite-error.js";
8
+ const outcomes = new WeakMap();
9
+ const phases = new WeakMap();
10
+ const markOutcome = (error, outcome, phase) => { if (typeof error === "object" && error !== null) {
11
+ outcomes.set(error, outcome);
12
+ if (phase !== undefined)
13
+ phases.set(error, phase);
14
+ } };
15
+ export const sqliteTransactionOutcome = (error) => typeof error === "object" && error !== null ? outcomes.get(error) ?? "unknown" : "unknown";
16
+ const thenable = (value) => typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
17
+ const runSqliteTransaction = (db, mode, action) => {
18
+ if (db.inTransaction)
19
+ throw new Error(`SQLite ${mode.toLowerCase()} boundary cannot nest an existing transaction.`);
20
+ let phase = "begin";
21
+ try {
22
+ db.exec(`BEGIN ${mode}`);
23
+ phase = "action";
24
+ const value = action();
25
+ if (thenable(value))
26
+ throw new TypeError("SQLite transaction callbacks must be synchronous.");
27
+ phase = "commit";
28
+ db.exec("COMMIT");
29
+ return value;
30
+ }
31
+ catch (primary) {
32
+ let outcome = phase === "begin" ? "not-started" : phase === "action" && !db.inTransaction ? "rolled-back" : "unknown";
33
+ if (db.inTransaction) {
34
+ try {
35
+ db.exec("ROLLBACK");
36
+ outcome = "rolled-back";
37
+ }
38
+ catch (rollback) {
39
+ const aggregate = new AggregateError([primary, rollback], "SQLite operation and rollback failed.");
40
+ markOutcome(aggregate, "unknown", "rollback");
41
+ throw aggregate;
42
+ }
43
+ }
44
+ markOutcome(primary, outcome, phase);
45
+ throw primary;
46
+ }
47
+ };
48
+ /** Migration boundaries own the whole transaction; domain savepoints remain outside this helper. */
49
+ export const runSqliteImmediate = (db, action) => runSqliteTransaction(db, "IMMEDIATE", action);
50
+ const missingError = (error) => error instanceof Error && "code" in error && error.code === "ENOENT";
51
+ export const sqliteDatabaseIsMissing = (file) => {
52
+ let candidate = file;
53
+ for (;;) {
54
+ let metadata;
55
+ try {
56
+ metadata = lstatSync(candidate);
57
+ }
58
+ catch (error) {
59
+ if (!missingError(error))
60
+ throw error;
61
+ const parent = path.dirname(candidate);
62
+ if (parent === candidate)
63
+ throw error;
64
+ candidate = parent;
65
+ continue;
66
+ }
67
+ if (candidate === file)
68
+ return false;
69
+ const ancestor = metadata.isSymbolicLink() ? statSync(candidate) : metadata;
70
+ if (!ancestor.isDirectory())
71
+ throw new Error("The SQLite database path ancestor is not a directory.");
72
+ return true;
73
+ }
74
+ };
75
+ const validateOptions = (options) => {
76
+ if (!path.isAbsolute(options.file))
77
+ throw new TypeError("The SQLite database path must be absolute.");
78
+ currentSqliteVersion(options.format);
79
+ const timeout = options.timeoutMs === undefined ? 5000 : options.timeoutMs;
80
+ if (!Number.isSafeInteger(timeout) || timeout < 1 || timeout > 60000)
81
+ throw new TypeError("SQLite busy timeout must be a safe integer between 1 and 60000 milliseconds.");
82
+ return timeout;
83
+ };
84
+ const stderrReporter = (event) => { process.stderr.write(`${JSON.stringify({ kind: `sqlite-migration-${event.kind}`, sqlite: event })}\n`); };
85
+ const context = (options, phase, fromVersion) => ({ database: options.format.name, file: options.file, phase, ...(fromVersion === undefined ? {} : { fromVersion }), toVersion: currentSqliteVersion(options.format) });
86
+ const accessContext = (error, depth = 0) => {
87
+ if (error instanceof SqliteAccessError)
88
+ return error;
89
+ if (depth < 6 && error instanceof AggregateError) {
90
+ for (const nested of error.errors) {
91
+ const found = accessContext(nested, depth + 1);
92
+ if (found !== undefined)
93
+ return found;
94
+ }
95
+ }
96
+ return undefined;
97
+ };
98
+ const wrap = (options, phase, cause, closed, outcome, fromVersion) => {
99
+ const original = accessContext(cause);
100
+ const kind = phase === "close" || phase === "report" || phase === "release" || phase === "restore-foreign-keys" ? "cleanup-failed" : original !== undefined ? original.kind : phase === "admission" ? "upgrade-blocked" : "migration-failed";
101
+ return new SqliteAccessError(kind, { ...context(options, phase, original?.context.fromVersion === undefined ? fromVersion : original.context.fromVersion), ...(original?.context.stepVersion === undefined ? {} : { stepVersion: original.context.stepVersion }) }, { cause, connectionClosed: closed, outcome });
102
+ };
103
+ export const closeSqliteDatabase = (db, options, outcome = "unknown") => {
104
+ try {
105
+ db.close();
106
+ }
107
+ catch (cause) {
108
+ throw new SqliteAccessError("cleanup-failed", context(options, "close"), { cause, outcome });
109
+ }
110
+ };
111
+ export const openSqliteDatabase = (options) => {
112
+ const timeout = validateOptions(options), report = options.onMigration === undefined ? stderrReporter : options.onMigration;
113
+ let db;
114
+ try {
115
+ db = new Database(options.file, { timeout, fileMustExist: !options.allowCreate });
116
+ }
117
+ catch (cause) {
118
+ throw wrap(options, "open", cause, true, "not-started");
119
+ }
120
+ let phase = "inspect", source, migrationId, started = 0, committed = false;
121
+ const event = (kind, eventPhase, outcome, transition) => ({ migrationId: migrationId, database: options.format.name, file: options.file, kind, phase: eventPhase, fromVersion: transition === null ? currentSqliteVersion(options.format) : transition?.fromVersion ?? source.version, toVersion: currentSqliteVersion(options.format), durationMs: Date.now() - started, outcome });
122
+ try {
123
+ source = runSqliteTransaction(db, "DEFERRED", () => {
124
+ const observed = inspectSqlite(db, options.format);
125
+ // Keep the observed version available if ending the read snapshot fails.
126
+ source = observed;
127
+ return observed;
128
+ });
129
+ if (source.kind !== "current") {
130
+ migrationId = randomUUID();
131
+ started = Date.now();
132
+ phase = "report";
133
+ report(event("started", "begin", "not-started"));
134
+ }
135
+ phase = "configure";
136
+ if (db.pragma("journal_mode = WAL", { simple: true }) !== "wal")
137
+ throw new Error("SQLite refused WAL mode.");
138
+ db.pragma("synchronous = FULL");
139
+ if (db.pragma("synchronous", { simple: true }) !== 2)
140
+ throw new Error("SQLite refused synchronous=FULL.");
141
+ const originalForeignKeys = db.pragma("foreign_keys", { simple: true });
142
+ const foreignKeysFor = (observed) => observed.kind === "unversioned" ? 0 : originalForeignKeys;
143
+ const configureForeignKeys = (mode) => {
144
+ db.pragma(`foreign_keys = ${mode}`);
145
+ if (db.pragma("foreign_keys", { simple: true }) !== mode)
146
+ throw new Error("SQLite refused the required foreign key mode.");
147
+ };
148
+ let foreignKeys = originalForeignKeys, transition = null;
149
+ // Foreign-key mode changes require a transaction boundary if a writer changed the inspected source.
150
+ for (let attempt = 0; attempt < 2; attempt++) {
151
+ phase = "configure";
152
+ const requiredForeignKeys = foreignKeysFor(source);
153
+ if (foreignKeys !== requiredForeignKeys) {
154
+ configureForeignKeys(requiredForeignKeys);
155
+ foreignKeys = requiredForeignKeys;
156
+ }
157
+ phase = "transaction";
158
+ const result = runSqliteImmediate(db, () => {
159
+ const fresh = inspectSqlite(db, options.format);
160
+ if (foreignKeysFor(fresh) !== foreignKeys) {
161
+ phase = "handoff";
162
+ if (attempt !== 0)
163
+ throw new Error("SQLite source changed repeatedly while selecting the foreign key mode.");
164
+ return { kind: "handoff", source: fresh };
165
+ }
166
+ if (fresh.kind !== "current") {
167
+ phase = "admission";
168
+ options.assertMigrationAllowed?.(db, fresh);
169
+ }
170
+ phase = "migrate";
171
+ const upgraded = upgradeSqlite(db, options.format);
172
+ phase = "startup";
173
+ options.onReady?.(db);
174
+ if (upgraded?.reset === true) {
175
+ phase = "foreign-key-check";
176
+ const violations = db.pragma("foreign_key_check");
177
+ if (violations.length !== 0)
178
+ throw new Error("SQLite foreign key validation failed after reset.");
179
+ }
180
+ return { kind: "committed", transition: upgraded };
181
+ });
182
+ if (result.kind === "handoff") {
183
+ source = result.source;
184
+ continue;
185
+ }
186
+ committed = true;
187
+ transition = result.transition;
188
+ break;
189
+ }
190
+ phase = "restore-foreign-keys";
191
+ if (foreignKeys !== originalForeignKeys)
192
+ configureForeignKeys(originalForeignKeys);
193
+ if (migrationId !== undefined) {
194
+ phase = "report";
195
+ report(event("completed", transition === null ? "already-current" : "commit", "committed", transition));
196
+ }
197
+ return db;
198
+ }
199
+ catch (primary) {
200
+ const outcome = committed ? "committed" : sqliteTransactionOutcome(primary);
201
+ const transactionPhase = typeof primary === "object" && primary !== null ? phases.get(primary) : undefined;
202
+ const failedPhase = transactionPhase === undefined || transactionPhase === "action" ? phase : transactionPhase;
203
+ let closed = false, failure = primary;
204
+ try {
205
+ db.close();
206
+ closed = true;
207
+ }
208
+ catch (close) {
209
+ failure = new AggregateError([primary, close], "SQLite operation and connection shutdown failed.");
210
+ }
211
+ const wrapped = wrap(options, failedPhase, failure, closed, phase === "inspect" && transactionPhase === undefined || phase === "configure" || phase === "report" && !committed ? "not-started" : outcome, source?.version);
212
+ if (migrationId !== undefined) {
213
+ try {
214
+ report({ ...event("failed", failedPhase, wrapped.outcome), ...(wrapped.context.stepVersion === undefined ? {} : { stepVersion: wrapped.context.stepVersion }) });
215
+ }
216
+ catch (reportError) {
217
+ throw wrap(options, "report", new AggregateError([wrapped, reportError], "SQLite operation and failure reporting failed."), closed, wrapped.outcome, source?.version);
218
+ }
219
+ }
220
+ if (phase === "startup" && transactionPhase === "action" && closed && failure === primary && primary instanceof Error && primary.constructor === Error && !(primary instanceof SqliteAccessError) && !("code" in primary && typeof primary.code === "string" && primary.code.startsWith("SQLITE_")))
221
+ throw primary;
222
+ throw wrapped;
223
+ }
224
+ };
225
+ const readAttempt = (options, read, allowUpgrade) => {
226
+ let missing;
227
+ try {
228
+ missing = sqliteDatabaseIsMissing(options.file);
229
+ }
230
+ catch (cause) {
231
+ throw wrap(options, "inspect-path", cause, true, "not-started");
232
+ }
233
+ if (missing)
234
+ return { kind: "value", value: options.onMissing() };
235
+ let db;
236
+ try {
237
+ db = new Database(options.file, { readonly: true, fileMustExist: true, timeout: validateOptions(options) });
238
+ }
239
+ catch (cause) {
240
+ try {
241
+ missing = sqliteDatabaseIsMissing(options.file);
242
+ }
243
+ catch (probe) {
244
+ throw wrap(options, "open-read", new AggregateError([cause, probe], "SQLite open and missing-path verification failed."), true, "not-started");
245
+ }
246
+ if (missing)
247
+ return { kind: "value", value: options.onMissing() };
248
+ throw wrap(options, "open-read", cause, true, "not-started");
249
+ }
250
+ let result, failed = false, failure;
251
+ try {
252
+ result = db.transaction(() => {
253
+ const source = inspectSqlite(db, options.format);
254
+ if (source.kind !== "current") {
255
+ if (allowUpgrade)
256
+ return { kind: "upgrade" };
257
+ throw new SqliteAccessError("invalid-format", context(options, "read-after-upgrade", source.version));
258
+ }
259
+ return { kind: "value", value: read(db) };
260
+ }).deferred();
261
+ }
262
+ catch (cause) {
263
+ failed = true;
264
+ failure = cause;
265
+ }
266
+ try {
267
+ db.close();
268
+ }
269
+ catch (close) {
270
+ throw wrap(options, "close", failed ? new AggregateError([failure, close], "SQLite read and connection shutdown failed.") : close, false, "not-started");
271
+ }
272
+ if (failed)
273
+ throw wrap(options, "read", failure, true, "not-started");
274
+ return result;
275
+ };
276
+ export const readSqliteDatabase = (options, read) => {
277
+ validateOptions(options);
278
+ const first = readAttempt(options, read, true);
279
+ if (first.kind === "value")
280
+ return first.value;
281
+ let permit;
282
+ try {
283
+ permit = options.acquireMaintenance?.();
284
+ }
285
+ catch (blocked) {
286
+ if (!(blocked instanceof MaintenanceLockHeldError))
287
+ throw wrap(options, "admission", blocked, false, "not-started");
288
+ const second = readAttempt(options, read, true);
289
+ if (second.kind === "value")
290
+ return second.value;
291
+ throw wrap(options, "admission", blocked, true, "not-started");
292
+ }
293
+ let db, closed = false, failed = false, failure, outcome = "unknown";
294
+ try {
295
+ db = openSqliteDatabase({ file: options.file, format: options.format, allowCreate: false, ...(options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs }), ...(options.onMigration === undefined ? {} : { onMigration: options.onMigration }), ...(options.assertMigrationAllowed === undefined ? {} : { assertMigrationAllowed: options.assertMigrationAllowed }) });
296
+ outcome = "committed";
297
+ closeSqliteDatabase(db, options, outcome);
298
+ closed = true;
299
+ }
300
+ catch (cause) {
301
+ failed = true;
302
+ failure = cause;
303
+ closed = cause instanceof SqliteAccessError && cause.connectionClosed;
304
+ outcome = cause instanceof SqliteAccessError ? cause.outcome : "unknown";
305
+ }
306
+ if (permit !== undefined && closed && outcome !== "unknown") {
307
+ try {
308
+ permit.release();
309
+ }
310
+ catch (release) {
311
+ throw wrap(options, "release", failed ? new AggregateError([failure, release], "SQLite migration and maintenance release failed.") : release, true, outcome);
312
+ }
313
+ }
314
+ if (failed) {
315
+ if (failure instanceof SqliteAccessError && failure.context.phase === "open" && failure.connectionClosed) {
316
+ let missing;
317
+ try {
318
+ missing = sqliteDatabaseIsMissing(options.file);
319
+ }
320
+ catch (probe) {
321
+ throw wrap(options, "inspect-path", new AggregateError([failure, probe], "SQLite migration open and missing-path verification failed."), true, "not-started");
322
+ }
323
+ if (missing)
324
+ return options.onMissing();
325
+ }
326
+ throw failure;
327
+ }
328
+ const final = readAttempt(options, read, false);
329
+ if (final.kind !== "value")
330
+ throw new Error("SQLite reader failed to produce a current snapshot.");
331
+ return final.value;
332
+ };
333
+ //# sourceMappingURL=sqlite-access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-access.js","sourceRoot":"","sources":["../../src/platform/sqlite-access.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export type SqliteErrorKind = "unsupported-version" | "invalid-format" | "upgrade-blocked" | "migration-failed" | "cleanup-failed";
2
+ export type SqliteOutcome = "not-started" | "committed" | "rolled-back" | "unknown";
3
+ export type SqliteErrorContext = {
4
+ database: string;
5
+ phase: string;
6
+ file?: string;
7
+ fromVersion?: number;
8
+ toVersion?: number;
9
+ stepVersion?: number;
10
+ };
11
+ export declare class SqliteAccessError extends Error {
12
+ readonly kind: SqliteErrorKind;
13
+ readonly context: SqliteErrorContext;
14
+ readonly outcome: SqliteOutcome;
15
+ readonly connectionClosed: boolean;
16
+ constructor(kind: SqliteErrorKind, context: SqliteErrorContext, options?: {
17
+ cause?: unknown;
18
+ outcome?: SqliteOutcome;
19
+ connectionClosed?: boolean;
20
+ });
21
+ }
22
+ export type SafeSqliteError = {
23
+ name: string;
24
+ kind?: SqliteErrorKind;
25
+ message?: string;
26
+ database?: string;
27
+ file?: string;
28
+ phase?: string;
29
+ fromVersion?: number;
30
+ toVersion?: number;
31
+ stepVersion?: number;
32
+ outcome?: SqliteOutcome;
33
+ sqliteCode?: string;
34
+ cause?: SafeSqliteError;
35
+ errors?: SafeSqliteError[];
36
+ };
37
+ /** Raw parser and SQLite messages can contain stored values; retain them only in memory. */
38
+ export declare const serializeSqliteError: (error: unknown, depth?: number) => SafeSqliteError;
39
+ export declare const formatSqliteError: (error: SqliteAccessError) => string;
@@ -0,0 +1,36 @@
1
+ export class SqliteAccessError extends Error {
2
+ kind;
3
+ context;
4
+ outcome;
5
+ connectionClosed;
6
+ constructor(kind, context, options = {}) {
7
+ const versions = context.fromVersion === undefined ? "" : ` from version ${context.fromVersion}${context.toVersion === undefined ? "" : ` to ${context.toVersion}`}`;
8
+ super(`SQLite ${context.database} ${context.phase}${versions}: ${kind}.`, options.cause === undefined ? undefined : { cause: options.cause });
9
+ this.name = "SqliteAccessError";
10
+ this.kind = kind;
11
+ this.context = context;
12
+ this.outcome = options.outcome === undefined ? "not-started" : options.outcome;
13
+ this.connectionClosed = options.connectionClosed === true;
14
+ }
15
+ }
16
+ const safeCode = (error) => {
17
+ if (typeof error !== "object" || error === null || !("code" in error) || typeof error.code !== "string")
18
+ return undefined;
19
+ return /^(SQLITE_[A-Z_]+|E[A-Z0-9]+)$/.test(error.code) ? error.code : undefined;
20
+ };
21
+ /** Raw parser and SQLite messages can contain stored values; retain them only in memory. */
22
+ export const serializeSqliteError = (error, depth = 0) => {
23
+ const code = safeCode(error);
24
+ const base = { name: error instanceof Error ? error.name : "UnknownError", ...(code === undefined ? {} : { sqliteCode: code }) };
25
+ if (error instanceof SqliteAccessError)
26
+ Object.assign(base, { kind: error.kind, message: error.message, ...error.context, outcome: error.outcome });
27
+ if (depth < 6 && error instanceof Error) {
28
+ if (error.cause !== undefined)
29
+ base.cause = serializeSqliteError(error.cause, depth + 1);
30
+ if (error instanceof AggregateError)
31
+ base.errors = error.errors.map((item) => serializeSqliteError(item, depth + 1));
32
+ }
33
+ return base;
34
+ };
35
+ export const formatSqliteError = (error) => JSON.stringify(serializeSqliteError(error));
36
+ //# sourceMappingURL=sqlite-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-error.js","sourceRoot":"","sources":["../../src/platform/sqlite-error.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type Database from "better-sqlite3";
2
+ export type SqliteMigration = {
3
+ readonly toVersion: number;
4
+ readonly up: (db: Database.Database) => undefined;
5
+ };
6
+ export type SqliteFormat = {
7
+ readonly name: string;
8
+ readonly baseline: {
9
+ readonly version: number;
10
+ readonly create: (db: Database.Database) => undefined;
11
+ };
12
+ readonly migrations: readonly SqliteMigration[];
13
+ readonly validateVersioned: (db: Database.Database, version: number) => undefined;
14
+ };
15
+ export type SqliteSource = {
16
+ readonly kind: "empty" | "unversioned";
17
+ readonly version: 0;
18
+ } | {
19
+ readonly kind: "outdated" | "current";
20
+ readonly version: number;
21
+ };
22
+ export type SqliteTransition = {
23
+ readonly fromVersion: number;
24
+ readonly toVersion: number;
25
+ readonly initialized: boolean;
26
+ readonly reset: boolean;
27
+ };
28
+ export declare const currentSqliteVersion: (format: SqliteFormat) => number;
29
+ export declare const inspectSqlite: (db: Database.Database, format: SqliteFormat) => SqliteSource;
30
+ export declare const assertCurrentSqlite: (db: Database.Database, format: SqliteFormat) => undefined;
31
+ export declare const upgradeSqlite: (db: Database.Database, format: SqliteFormat) => SqliteTransition | null;
@@ -0,0 +1,98 @@
1
+ import { SqliteAccessError } from "./sqlite-error.js";
2
+ const validVersion = (value) => Number.isInteger(value) && value > 0 && value <= 2_147_483_647;
3
+ export const currentSqliteVersion = (format) => {
4
+ if (!validVersion(format.baseline.version))
5
+ throw new TypeError("SQLite baseline must be a positive signed 32-bit integer.");
6
+ let current = format.baseline.version;
7
+ for (const migration of format.migrations) {
8
+ if (!validVersion(migration.toVersion) || migration.toVersion !== current + 1)
9
+ throw new TypeError("SQLite migration versions must be consecutive after the baseline.");
10
+ current = migration.toVersion;
11
+ }
12
+ return current;
13
+ };
14
+ const versionOf = (db) => db.pragma("user_version", { simple: true });
15
+ const invalid = (format, version, cause) => new SqliteAccessError("invalid-format", { database: format.name, phase: "inspect", fromVersion: version, toVersion: currentSqliteVersion(format) }, cause === undefined ? {} : { cause });
16
+ export const inspectSqlite = (db, format) => {
17
+ const target = currentSqliteVersion(format), version = versionOf(db);
18
+ if (!Number.isInteger(version) || version < 0 || version > target || version !== 0 && version < format.baseline.version)
19
+ throw new SqliteAccessError("unsupported-version", { database: format.name, phase: "inspect", fromVersion: version, toVersion: target });
20
+ try {
21
+ if (version === 0) {
22
+ const objects = db.prepare("SELECT name FROM sqlite_schema WHERE name NOT GLOB 'sqlite_*'").all();
23
+ return { kind: objects.length === 0 ? "empty" : "unversioned", version: 0 };
24
+ }
25
+ format.validateVersioned(db, version);
26
+ return { kind: version === target ? "current" : "outdated", version };
27
+ }
28
+ catch (cause) {
29
+ if (cause instanceof SqliteAccessError)
30
+ throw cause;
31
+ throw invalid(format, version, cause);
32
+ }
33
+ };
34
+ export const assertCurrentSqlite = (db, format) => {
35
+ if (!db.inTransaction)
36
+ throw new Error("SQLite format assertion requires a transaction.");
37
+ const version = versionOf(db), target = currentSqliteVersion(format);
38
+ if (version !== target)
39
+ throw new SqliteAccessError("unsupported-version", { database: format.name, phase: "assert-current", fromVersion: version, toVersion: target });
40
+ };
41
+ const quoteIdentifier = (name) => `"${name.replaceAll('"', '""')}"`;
42
+ const resetUnversionedSqlite = (db) => {
43
+ if (db.pragma("foreign_keys", { simple: true }) !== 0)
44
+ throw new Error("SQLite unversioned reset requires foreign_keys=OFF before beginning the transaction.");
45
+ const objects = db.prepare("SELECT name, type FROM main.sqlite_schema WHERE type IN ('trigger', 'view') AND name NOT GLOB 'sqlite_*' ORDER BY type, name").all();
46
+ for (const object of objects)
47
+ db.exec(`DROP ${object.type.toUpperCase()} main.${quoteIdentifier(object.name)}`);
48
+ const virtualTables = db.pragma("main.table_list")
49
+ .filter(table => table.schema === "main" && !table.name.startsWith("sqlite_") && table.type === "virtual");
50
+ for (const table of virtualTables)
51
+ db.exec(`DROP TABLE main.${quoteIdentifier(table.name)}`);
52
+ if (virtualTables.length !== 0) {
53
+ // FTS5 external content can retain its cached shadow flag after its virtual table is dropped.
54
+ // RESET reloads the schema and keeps schema writes disabled: https://sqlite.org/pragma.html#pragma_writable_schema
55
+ db.pragma("writable_schema = RESET");
56
+ }
57
+ const tables = db.pragma("main.table_list")
58
+ .filter(table => table.schema === "main" && !table.name.startsWith("sqlite_") && (table.type === "table" || table.type === "shadow"));
59
+ for (const table of tables)
60
+ db.exec(`DROP TABLE main.${quoteIdentifier(table.name)}`);
61
+ };
62
+ export const upgradeSqlite = (db, format) => {
63
+ if (!db.inTransaction)
64
+ throw new Error("SQLite migration requires an immediate transaction.");
65
+ const source = inspectSqlite(db, format);
66
+ if (source.kind === "current")
67
+ return null;
68
+ let version = source.version;
69
+ if (source.kind === "empty" || source.kind === "unversioned") {
70
+ try {
71
+ if (source.kind === "unversioned")
72
+ resetUnversionedSqlite(db);
73
+ format.baseline.create(db);
74
+ format.validateVersioned(db, format.baseline.version);
75
+ db.pragma(`user_version = ${format.baseline.version}`);
76
+ version = format.baseline.version;
77
+ }
78
+ catch (cause) {
79
+ throw new SqliteAccessError("migration-failed", { database: format.name, phase: source.kind === "empty" ? "initialize" : "reset", fromVersion: source.version, toVersion: currentSqliteVersion(format), stepVersion: format.baseline.version }, { cause, outcome: "unknown" });
80
+ }
81
+ }
82
+ for (const migration of format.migrations) {
83
+ if (migration.toVersion <= version)
84
+ continue;
85
+ try {
86
+ migration.up(db);
87
+ format.validateVersioned(db, migration.toVersion);
88
+ db.pragma(`user_version = ${migration.toVersion}`);
89
+ version = migration.toVersion;
90
+ }
91
+ catch (cause) {
92
+ throw new SqliteAccessError("migration-failed", { database: format.name, phase: "migrate", fromVersion: source.version, toVersion: currentSqliteVersion(format), stepVersion: migration.toVersion }, { cause, outcome: "unknown" });
93
+ }
94
+ }
95
+ format.validateVersioned(db, version);
96
+ return { fromVersion: source.version, toVersion: version, initialized: source.kind === "empty", reset: source.kind === "unversioned" };
97
+ };
98
+ //# sourceMappingURL=sqlite-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-format.js","sourceRoot":"","sources":["../../src/platform/sqlite-format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export type SqliteSchemaObject = {
2
+ readonly name: string;
3
+ readonly type: string;
4
+ readonly sql: string | null;
5
+ };
6
+ export type SqliteSchemaStep = {
7
+ readonly version: number;
8
+ readonly sql: string;
9
+ };
10
+ export declare const loadSqliteSql: (resource: URL) => string;
11
+ export declare const loadSqliteSequence: (directory: URL) => readonly [SqliteSchemaStep, ...SqliteSchemaStep[]];
12
+ export declare const sqliteSchemaSnapshots: (steps: readonly SqliteSchemaStep[]) => ReadonlyMap<number, readonly SqliteSchemaObject[]>;