@cleocode/core 2026.4.11 → 2026.4.13

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 (184) hide show
  1. package/dist/codebase-map/analyzers/architecture.d.ts.map +1 -1
  2. package/dist/codebase-map/analyzers/architecture.js +0 -1
  3. package/dist/codebase-map/analyzers/architecture.js.map +1 -1
  4. package/dist/conduit/local-transport.d.ts +18 -8
  5. package/dist/conduit/local-transport.d.ts.map +1 -1
  6. package/dist/conduit/local-transport.js +23 -13
  7. package/dist/conduit/local-transport.js.map +1 -1
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +0 -1
  10. package/dist/config.js.map +1 -1
  11. package/dist/errors.d.ts +19 -0
  12. package/dist/errors.d.ts.map +1 -1
  13. package/dist/errors.js +6 -0
  14. package/dist/errors.js.map +1 -1
  15. package/dist/index.js +175 -68950
  16. package/dist/index.js.map +1 -7
  17. package/dist/init.d.ts +1 -2
  18. package/dist/init.d.ts.map +1 -1
  19. package/dist/init.js +1 -2
  20. package/dist/init.js.map +1 -1
  21. package/dist/internal.d.ts +8 -3
  22. package/dist/internal.d.ts.map +1 -1
  23. package/dist/internal.js +13 -6
  24. package/dist/internal.js.map +1 -1
  25. package/dist/memory/learnings.d.ts +2 -2
  26. package/dist/memory/patterns.d.ts +6 -6
  27. package/dist/output.d.ts +32 -11
  28. package/dist/output.d.ts.map +1 -1
  29. package/dist/output.js +67 -67
  30. package/dist/output.js.map +1 -1
  31. package/dist/paths.js +80 -14
  32. package/dist/paths.js.map +1 -1
  33. package/dist/skills/dynamic-skill-generator.d.ts +0 -2
  34. package/dist/skills/dynamic-skill-generator.d.ts.map +1 -1
  35. package/dist/skills/dynamic-skill-generator.js.map +1 -1
  36. package/dist/store/agent-registry-accessor.d.ts +203 -12
  37. package/dist/store/agent-registry-accessor.d.ts.map +1 -1
  38. package/dist/store/agent-registry-accessor.js +618 -100
  39. package/dist/store/agent-registry-accessor.js.map +1 -1
  40. package/dist/store/api-key-kdf.d.ts +73 -0
  41. package/dist/store/api-key-kdf.d.ts.map +1 -0
  42. package/dist/store/api-key-kdf.js +84 -0
  43. package/dist/store/api-key-kdf.js.map +1 -0
  44. package/dist/store/cleanup-legacy.js +171 -0
  45. package/dist/store/cleanup-legacy.js.map +1 -0
  46. package/dist/store/conduit-sqlite.d.ts +184 -0
  47. package/dist/store/conduit-sqlite.d.ts.map +1 -0
  48. package/dist/store/conduit-sqlite.js +570 -0
  49. package/dist/store/conduit-sqlite.js.map +1 -0
  50. package/dist/store/global-salt.d.ts +78 -0
  51. package/dist/store/global-salt.d.ts.map +1 -0
  52. package/dist/store/global-salt.js +147 -0
  53. package/dist/store/global-salt.js.map +1 -0
  54. package/dist/store/migrate-signaldock-to-conduit.d.ts +81 -0
  55. package/dist/store/migrate-signaldock-to-conduit.d.ts.map +1 -0
  56. package/dist/store/migrate-signaldock-to-conduit.js +555 -0
  57. package/dist/store/migrate-signaldock-to-conduit.js.map +1 -0
  58. package/dist/store/nexus-sqlite.js +28 -3
  59. package/dist/store/nexus-sqlite.js.map +1 -1
  60. package/dist/store/signaldock-sqlite.d.ts +122 -19
  61. package/dist/store/signaldock-sqlite.d.ts.map +1 -1
  62. package/dist/store/signaldock-sqlite.js +401 -251
  63. package/dist/store/signaldock-sqlite.js.map +1 -1
  64. package/dist/store/sqlite-backup.js +122 -4
  65. package/dist/store/sqlite-backup.js.map +1 -1
  66. package/dist/system/backup.d.ts +0 -26
  67. package/dist/system/backup.d.ts.map +1 -1
  68. package/dist/system/runtime.d.ts +0 -2
  69. package/dist/system/runtime.d.ts.map +1 -1
  70. package/dist/system/runtime.js +3 -3
  71. package/dist/system/runtime.js.map +1 -1
  72. package/dist/tasks/add.d.ts +1 -1
  73. package/dist/tasks/add.d.ts.map +1 -1
  74. package/dist/tasks/add.js +98 -23
  75. package/dist/tasks/add.js.map +1 -1
  76. package/dist/tasks/complete.d.ts.map +1 -1
  77. package/dist/tasks/complete.js +4 -1
  78. package/dist/tasks/complete.js.map +1 -1
  79. package/dist/tasks/find.d.ts.map +1 -1
  80. package/dist/tasks/find.js +4 -1
  81. package/dist/tasks/find.js.map +1 -1
  82. package/dist/tasks/labels.d.ts.map +1 -1
  83. package/dist/tasks/labels.js +4 -1
  84. package/dist/tasks/labels.js.map +1 -1
  85. package/dist/tasks/relates.d.ts.map +1 -1
  86. package/dist/tasks/relates.js +16 -4
  87. package/dist/tasks/relates.js.map +1 -1
  88. package/dist/tasks/show.d.ts.map +1 -1
  89. package/dist/tasks/show.js +4 -1
  90. package/dist/tasks/show.js.map +1 -1
  91. package/dist/tasks/update.d.ts.map +1 -1
  92. package/dist/tasks/update.js +32 -6
  93. package/dist/tasks/update.js.map +1 -1
  94. package/dist/validation/engine.d.ts.map +1 -1
  95. package/dist/validation/engine.js +16 -4
  96. package/dist/validation/engine.js.map +1 -1
  97. package/dist/validation/param-utils.d.ts +5 -3
  98. package/dist/validation/param-utils.d.ts.map +1 -1
  99. package/dist/validation/param-utils.js +8 -6
  100. package/dist/validation/param-utils.js.map +1 -1
  101. package/dist/validation/protocols/_shared.d.ts.map +1 -1
  102. package/dist/validation/protocols/_shared.js +13 -6
  103. package/dist/validation/protocols/_shared.js.map +1 -1
  104. package/package.json +9 -7
  105. package/src/adapters/__tests__/manager.test.ts +0 -1
  106. package/src/codebase-map/analyzers/architecture.ts +0 -1
  107. package/src/conduit/__tests__/local-credential-flow.test.ts +20 -18
  108. package/src/conduit/__tests__/local-transport.test.ts +14 -12
  109. package/src/conduit/local-transport.ts +23 -13
  110. package/src/config.ts +0 -1
  111. package/src/errors.ts +24 -0
  112. package/src/hooks/handlers/__tests__/hook-automation-e2e.test.ts +2 -5
  113. package/src/init.ts +1 -2
  114. package/src/internal.ts +96 -2
  115. package/src/lifecycle/cant/lifecycle-rcasd.cant +133 -0
  116. package/src/memory/__tests__/engine-compat.test.ts +2 -2
  117. package/src/memory/__tests__/pipeline-manifest-sqlite.test.ts +4 -4
  118. package/src/observability/__tests__/index.test.ts +4 -4
  119. package/src/observability/__tests__/log-filter.test.ts +4 -4
  120. package/src/output.ts +73 -75
  121. package/src/sessions/__tests__/session-grade.integration.test.ts +1 -1
  122. package/src/sessions/__tests__/session-grade.test.ts +2 -2
  123. package/src/skills/__tests__/dynamic-skill-generator.test.ts +0 -2
  124. package/src/skills/dynamic-skill-generator.ts +0 -2
  125. package/src/store/__tests__/agent-registry-accessor.test.ts +807 -0
  126. package/src/store/__tests__/api-key-kdf.test.ts +113 -0
  127. package/src/store/__tests__/backup-crypto.test.ts +101 -0
  128. package/src/store/__tests__/backup-pack.test.ts +491 -0
  129. package/src/store/__tests__/backup-unpack.test.ts +298 -0
  130. package/src/store/__tests__/conduit-sqlite.test.ts +413 -0
  131. package/src/store/__tests__/global-salt.test.ts +195 -0
  132. package/src/store/__tests__/migrate-signaldock-to-conduit.test.ts +715 -0
  133. package/src/store/__tests__/regenerators.test.ts +234 -0
  134. package/src/store/__tests__/restore-conflict-report.test.ts +274 -0
  135. package/src/store/__tests__/restore-json-merge.test.ts +521 -0
  136. package/src/store/__tests__/signaldock-sqlite.test.ts +652 -0
  137. package/src/store/__tests__/sqlite-backup-global.test.ts +307 -3
  138. package/src/store/__tests__/sqlite-backup.test.ts +5 -1
  139. package/src/store/__tests__/t310-integration.test.ts +1150 -0
  140. package/src/store/__tests__/t310-readiness.test.ts +111 -0
  141. package/src/store/__tests__/t311-integration.test.ts +661 -0
  142. package/src/store/agent-registry-accessor.ts +847 -140
  143. package/src/store/api-key-kdf.ts +104 -0
  144. package/src/store/backup-crypto.ts +209 -0
  145. package/src/store/backup-pack.ts +739 -0
  146. package/src/store/backup-unpack.ts +583 -0
  147. package/src/store/conduit-sqlite.ts +655 -0
  148. package/src/store/global-salt.ts +175 -0
  149. package/src/store/migrate-signaldock-to-conduit.ts +669 -0
  150. package/src/store/regenerators.ts +243 -0
  151. package/src/store/restore-conflict-report.ts +317 -0
  152. package/src/store/restore-json-merge.ts +653 -0
  153. package/src/store/signaldock-sqlite.ts +431 -254
  154. package/src/store/sqlite-backup.ts +185 -10
  155. package/src/store/t310-readiness.ts +119 -0
  156. package/src/system/backup.ts +2 -62
  157. package/src/system/runtime.ts +4 -6
  158. package/src/tasks/__tests__/error-hints.test.ts +256 -0
  159. package/src/tasks/add.ts +99 -9
  160. package/src/tasks/complete.ts +4 -1
  161. package/src/tasks/find.ts +4 -1
  162. package/src/tasks/labels.ts +4 -1
  163. package/src/tasks/relates.ts +16 -4
  164. package/src/tasks/show.ts +4 -1
  165. package/src/tasks/update.ts +32 -3
  166. package/src/validation/__tests__/error-hints.test.ts +97 -0
  167. package/src/validation/engine.ts +16 -1
  168. package/src/validation/param-utils.ts +10 -7
  169. package/src/validation/protocols/_shared.ts +14 -6
  170. package/src/validation/protocols/cant/architecture-decision.cant +80 -0
  171. package/src/validation/protocols/cant/artifact-publish.cant +95 -0
  172. package/src/validation/protocols/cant/consensus.cant +74 -0
  173. package/src/validation/protocols/cant/contribution.cant +82 -0
  174. package/src/validation/protocols/cant/decomposition.cant +92 -0
  175. package/src/validation/protocols/cant/implementation.cant +67 -0
  176. package/src/validation/protocols/cant/provenance.cant +88 -0
  177. package/src/validation/protocols/cant/release.cant +96 -0
  178. package/src/validation/protocols/cant/research.cant +66 -0
  179. package/src/validation/protocols/cant/specification.cant +67 -0
  180. package/src/validation/protocols/cant/testing.cant +88 -0
  181. package/src/validation/protocols/cant/validation.cant +65 -0
  182. package/src/validation/protocols/protocols-markdown/decomposition.md +0 -4
  183. package/templates/config.template.json +0 -1
  184. package/templates/global-config.template.json +0 -1
@@ -0,0 +1,555 @@
1
+ /**
2
+ * Automatic first-run migration executor: project-tier signaldock.db → conduit.db.
3
+ *
4
+ * Implements ADR-037 §8 — on the first cleo invocation after upgrading to
5
+ * v2026.4.12, if a project-tier `.cleo/signaldock.db` exists and
6
+ * `.cleo/conduit.db` does not, this module migrates all project-local data to
7
+ * conduit.db and copies global-identity rows to the global-tier signaldock.db.
8
+ *
9
+ * Key properties:
10
+ * - Idempotent: `needsSignaldockToConduitMigration` returns false once conduit.db exists.
11
+ * - Atomic per file: transactions are used for conduit.db and global signaldock.db writes.
12
+ * - Non-destructive: legacy signaldock.db is renamed to `.pre-t310.bak`, not deleted.
13
+ * - Multi-project safe: `INSERT OR IGNORE` prevents duplicate global rows when multiple
14
+ * projects migrate the same agent.
15
+ * - Migrated agents flagged `requires_reauth=1` (new KDF scheme, ADR-037 §5).
16
+ *
17
+ * @task T358
18
+ * @epic T310
19
+ * @why ADR-037 §8 — automatic first-run migration from the pre-T310 project-tier
20
+ * signaldock.db to the new T310 topology (conduit.db + global signaldock.db
21
+ * + global-salt). Runs once per project on first cleo invocation after upgrade.
22
+ */
23
+ import { existsSync, mkdirSync, renameSync, unlinkSync } from 'node:fs';
24
+ import { createRequire } from 'node:module';
25
+ import { join } from 'node:path';
26
+ import { getLogger } from '../logger.js';
27
+ import { getCleoHome } from '../paths.js';
28
+ import { ensureConduitDb } from './conduit-sqlite.js';
29
+ import { getGlobalSalt } from './global-salt.js';
30
+ import { ensureGlobalSignaldockDb } from './signaldock-sqlite.js';
31
+ const _require = createRequire(import.meta.url);
32
+ const { DatabaseSync } = _require('node:sqlite');
33
+ // ---------------------------------------------------------------------------
34
+ // Constants
35
+ // ---------------------------------------------------------------------------
36
+ /** Project-local tables to copy verbatim from legacy signaldock.db to conduit.db. */
37
+ const PROJECT_TIER_TABLES = [
38
+ 'messages',
39
+ 'conversations',
40
+ 'delivery_jobs',
41
+ 'dead_letters',
42
+ 'message_pins',
43
+ 'attachments',
44
+ 'attachment_versions',
45
+ 'attachment_approvals',
46
+ 'attachment_contributors',
47
+ ];
48
+ /** Global-identity tables to copy using INSERT OR IGNORE from legacy to global signaldock.db. */
49
+ const GLOBAL_IDENTITY_TABLES = [
50
+ 'agents',
51
+ 'capabilities',
52
+ 'skills',
53
+ 'agent_capabilities',
54
+ 'agent_skills',
55
+ 'agent_connections',
56
+ 'users',
57
+ 'accounts',
58
+ 'sessions',
59
+ 'verifications',
60
+ 'organization',
61
+ 'claim_codes',
62
+ 'org_agent_keys',
63
+ ];
64
+ // ---------------------------------------------------------------------------
65
+ // Detection
66
+ // ---------------------------------------------------------------------------
67
+ /**
68
+ * Returns true when the legacy migration is needed for the given project.
69
+ *
70
+ * Detection heuristic (ADR-037 §8):
71
+ * - `.cleo/signaldock.db` EXISTS AND `.cleo/conduit.db` DOES NOT EXIST
72
+ *
73
+ * Idempotent: returns false once conduit.db is present, regardless of .bak state.
74
+ *
75
+ * @param projectRoot - Absolute path to the project root directory.
76
+ * @returns True if migration is needed; false otherwise.
77
+ *
78
+ * @task T358
79
+ * @epic T310
80
+ */
81
+ export function needsSignaldockToConduitMigration(projectRoot) {
82
+ const legacyPath = join(projectRoot, '.cleo', 'signaldock.db');
83
+ const conduitPath = join(projectRoot, '.cleo', 'conduit.db');
84
+ return existsSync(legacyPath) && !existsSync(conduitPath);
85
+ }
86
+ // ---------------------------------------------------------------------------
87
+ // Helpers
88
+ // ---------------------------------------------------------------------------
89
+ /**
90
+ * Check whether a table exists in the given database.
91
+ *
92
+ * @param db - An open DatabaseSync handle.
93
+ * @param tableName - Name of the table to check.
94
+ * @returns True if the table exists in sqlite_master.
95
+ */
96
+ function tableExistsInDb(db, tableName) {
97
+ const row = db
98
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?")
99
+ .get(tableName);
100
+ return !!row;
101
+ }
102
+ /**
103
+ * Get column names from a table in the given database.
104
+ *
105
+ * @param db - An open DatabaseSync handle.
106
+ * @param tableName - Name of the table.
107
+ * @returns Array of column names.
108
+ */
109
+ function getTableColumns(db, tableName) {
110
+ const rows = db.prepare(`PRAGMA table_info("${tableName}")`).all();
111
+ return rows.map((r) => r.name);
112
+ }
113
+ /**
114
+ * Copy all rows from `tableName` in `srcDb` to the same table in `destDb`.
115
+ * Only columns that exist in both source and destination are copied (schema safety).
116
+ * Uses INSERT OR IGNORE to handle unique constraint conflicts gracefully.
117
+ *
118
+ * @param srcDb - Source database (legacy signaldock.db).
119
+ * @param destDb - Destination database (conduit.db or global signaldock.db).
120
+ * @param tableName - Table to copy.
121
+ * @param ignoreConflicts - When true uses INSERT OR IGNORE; when false uses INSERT.
122
+ * @returns Number of rows found in source (not necessarily inserted — some may have been ignored).
123
+ */
124
+ function copyTableRows(srcDb, destDb, tableName, ignoreConflicts = false) {
125
+ const srcCols = getTableColumns(srcDb, tableName);
126
+ const destCols = getTableColumns(destDb, tableName);
127
+ // Only copy columns that exist in both tables
128
+ const cols = srcCols.filter((c) => destCols.includes(c));
129
+ if (cols.length === 0)
130
+ return 0;
131
+ const colList = cols.map((c) => `"${c}"`).join(', ');
132
+ const placeholders = cols.map(() => '?').join(', ');
133
+ const conflictClause = ignoreConflicts ? 'OR IGNORE' : '';
134
+ const insertSql = `INSERT ${conflictClause} INTO "${tableName}" (${colList}) VALUES (${placeholders})`;
135
+ const rows = srcDb.prepare(`SELECT ${colList} FROM "${tableName}"`).all();
136
+ if (rows.length === 0)
137
+ return 0;
138
+ const stmt = destDb.prepare(insertSql);
139
+ for (const row of rows) {
140
+ const values = cols.map((c) => row[c] ?? null);
141
+ stmt.run(...values);
142
+ }
143
+ return rows.length;
144
+ }
145
+ /**
146
+ * Run PRAGMA integrity_check on `db` and return true if it passes.
147
+ *
148
+ * @param db - An open DatabaseSync handle.
149
+ * @returns True if integrity_check returns 'ok'.
150
+ */
151
+ function integrityCheckPasses(db) {
152
+ const rows = db.prepare('PRAGMA integrity_check').all();
153
+ return rows.length === 1 && rows[0]?.integrity_check === 'ok';
154
+ }
155
+ /**
156
+ * Generate a timestamp suffix for broken-file names: `YYYYMMDD-HHmmss-mmm`.
157
+ */
158
+ function brokenTimestamp() {
159
+ const now = new Date();
160
+ const pad2 = (n) => String(n).padStart(2, '0');
161
+ const pad3 = (n) => String(n).padStart(3, '0');
162
+ return (`${now.getFullYear()}${pad2(now.getMonth() + 1)}${pad2(now.getDate())}` +
163
+ `-${pad2(now.getHours())}${pad2(now.getMinutes())}${pad2(now.getSeconds())}` +
164
+ `-${pad3(now.getMilliseconds())}`);
165
+ }
166
+ // ---------------------------------------------------------------------------
167
+ // Main executor
168
+ // ---------------------------------------------------------------------------
169
+ /**
170
+ * Runs the signaldock.db → conduit.db migration for the given project.
171
+ *
172
+ * The migration is atomic per file (SQLite transactions for DB writes, atomic
173
+ * rename for the backup step). Failures are captured in `result.errors` and
174
+ * the function never throws — callers receive a `MigrationResult` with
175
+ * `status: 'failed'` on error.
176
+ *
177
+ * Safe to call when no migration is needed (returns `{status: 'no-op', ...}`).
178
+ * Safe to call on a partially-migrated install (idempotent via needsMigration check).
179
+ *
180
+ * @param projectRoot - Absolute path to the project root directory.
181
+ * @returns A `MigrationResult` describing what was done and any errors encountered.
182
+ *
183
+ * @task T358
184
+ * @epic T310
185
+ */
186
+ export function migrateSignaldockToConduit(projectRoot) {
187
+ const log = getLogger('migrate-signaldock-to-conduit');
188
+ const legacyPath = join(projectRoot, '.cleo', 'signaldock.db');
189
+ const conduitPath = join(projectRoot, '.cleo', 'conduit.db');
190
+ const globalSignaldockPath = join(getCleoHome(), 'signaldock.db');
191
+ const bakPath = `${legacyPath}.pre-t310.bak`;
192
+ const result = {
193
+ status: 'no-op',
194
+ projectRoot,
195
+ agentsCopied: 0,
196
+ conduitPath,
197
+ globalSignaldockPath,
198
+ bakPath: null,
199
+ errors: [],
200
+ };
201
+ // -----------------------------------------------------------------------
202
+ // Step 1: Check if migration is needed
203
+ // -----------------------------------------------------------------------
204
+ if (!needsSignaldockToConduitMigration(projectRoot)) {
205
+ return result;
206
+ }
207
+ log.info({ projectRoot, legacyPath }, 'T310 migration: starting signaldock.db → conduit.db');
208
+ // -----------------------------------------------------------------------
209
+ // Step 2: Open legacy signaldock.db in READ-ONLY mode
210
+ // -----------------------------------------------------------------------
211
+ let legacy = null;
212
+ try {
213
+ legacy = new DatabaseSync(legacyPath, { readonly: true });
214
+ }
215
+ catch (err) {
216
+ const message = err instanceof Error ? err.message : String(err);
217
+ log.error({ legacyPath, error: message }, 'T310 migration: cannot open legacy signaldock.db');
218
+ result.errors.push({ step: 'step-2-open-legacy', error: message });
219
+ result.status = 'failed';
220
+ return result;
221
+ }
222
+ // -----------------------------------------------------------------------
223
+ // Step 3: Verify legacy integrity
224
+ // -----------------------------------------------------------------------
225
+ try {
226
+ if (!integrityCheckPasses(legacy)) {
227
+ const msg = 'Legacy signaldock.db failed PRAGMA integrity_check. ' +
228
+ 'Migration aborted — no changes written. ' +
229
+ 'Recovery: inspect the database with sqlite3 and attempt manual repair before re-running.';
230
+ log.error({ legacyPath }, msg);
231
+ result.errors.push({ step: 'step-3-legacy-integrity', error: msg });
232
+ result.status = 'failed';
233
+ legacy.close();
234
+ return result;
235
+ }
236
+ }
237
+ catch (err) {
238
+ const message = err instanceof Error ? err.message : String(err);
239
+ log.error({ legacyPath, error: message }, 'T310 migration: integrity_check threw on legacy DB');
240
+ result.errors.push({ step: 'step-3-legacy-integrity', error: message });
241
+ result.status = 'failed';
242
+ legacy.close();
243
+ return result;
244
+ }
245
+ // -----------------------------------------------------------------------
246
+ // Steps 4–5: Ensure global cleo home + global signaldock.db exist
247
+ // -----------------------------------------------------------------------
248
+ const cleoHome = getCleoHome();
249
+ try {
250
+ if (!existsSync(cleoHome)) {
251
+ mkdirSync(cleoHome, { recursive: true });
252
+ }
253
+ // ensureGlobalSignaldockDb is async but we need it sync here; open directly.
254
+ // The global signaldock schema is applied by ensureGlobalSignaldockDb() when
255
+ // the CLI starts. For migration purposes we open the DB (creating it if needed)
256
+ // and rely on the schema already having been applied (or apply it inline).
257
+ // We call ensureGlobalSignaldockDb() in a fire-and-forget style here, and
258
+ // handle the open synchronously below with DatabaseSync.
259
+ void ensureGlobalSignaldockDb();
260
+ }
261
+ catch {
262
+ // Non-fatal: the global DB open below will create the file if needed.
263
+ }
264
+ // -----------------------------------------------------------------------
265
+ // Step 6: Ensure global-salt exists (generates if absent)
266
+ // -----------------------------------------------------------------------
267
+ try {
268
+ getGlobalSalt();
269
+ }
270
+ catch (err) {
271
+ const message = err instanceof Error ? err.message : String(err);
272
+ log.error({ error: message }, 'T310 migration: getGlobalSalt failed — migration aborted');
273
+ result.errors.push({ step: 'step-6-global-salt', error: message });
274
+ result.status = 'failed';
275
+ legacy.close();
276
+ return result;
277
+ }
278
+ // -----------------------------------------------------------------------
279
+ // Step 7: Create conduit.db via ensureConduitDb (applies full schema)
280
+ // -----------------------------------------------------------------------
281
+ let conduit = null;
282
+ try {
283
+ const ensureResult = ensureConduitDb(projectRoot);
284
+ // Open a direct handle for migration writes (ensureConduitDb returns singleton;
285
+ // we open a fresh handle to avoid interfering with any singleton state).
286
+ conduit = new DatabaseSync(ensureResult.path);
287
+ conduit.exec('PRAGMA journal_mode = WAL');
288
+ conduit.exec('PRAGMA foreign_keys = OFF'); // Disable FK checks during bulk copy
289
+ }
290
+ catch (err) {
291
+ const message = err instanceof Error ? err.message : String(err);
292
+ log.error({ conduitPath, error: message }, 'T310 migration: failed to create conduit.db');
293
+ result.errors.push({ step: 'step-7-create-conduit', error: message });
294
+ result.status = 'failed';
295
+ legacy.close();
296
+ return result;
297
+ }
298
+ // -----------------------------------------------------------------------
299
+ // Steps 8–9: Copy project-tier tables + derive project_agent_refs + COMMIT
300
+ // -----------------------------------------------------------------------
301
+ try {
302
+ conduit.exec('BEGIN TRANSACTION');
303
+ // Copy project-local messaging tables verbatim
304
+ for (const tableName of PROJECT_TIER_TABLES) {
305
+ if (tableExistsInDb(legacy, tableName) && tableExistsInDb(conduit, tableName)) {
306
+ copyTableRows(legacy, conduit, tableName, false);
307
+ }
308
+ }
309
+ // Rebuild FTS after message copy
310
+ if (tableExistsInDb(conduit, 'messages_fts')) {
311
+ try {
312
+ conduit.exec("INSERT INTO messages_fts(messages_fts) VALUES('rebuild')");
313
+ }
314
+ catch {
315
+ // FTS rebuild failure is non-fatal — the triggers will populate it over time
316
+ }
317
+ }
318
+ // Derive project_agent_refs from legacy agents table
319
+ let agentsCountForConduit = 0;
320
+ if (tableExistsInDb(legacy, 'agents')) {
321
+ const legacyAgents = legacy.prepare('SELECT * FROM agents').all();
322
+ const hasClassificationCol = getTableColumns(legacy, 'agents').includes('classification');
323
+ const hasLastUsedAtCol = getTableColumns(legacy, 'agents').includes('last_used_at');
324
+ const hasCreatedAtCol = getTableColumns(legacy, 'agents').includes('created_at');
325
+ const hasAgentIdCol = getTableColumns(legacy, 'agents').includes('agent_id');
326
+ for (const agent of legacyAgents) {
327
+ const agentId = hasAgentIdCol ? agent['agent_id'] : agent['id'];
328
+ if (!agentId)
329
+ continue;
330
+ const createdAtRaw = hasCreatedAtCol ? agent['created_at'] : null;
331
+ const attachedAt = createdAtRaw != null
332
+ ? new Date(createdAtRaw * 1000).toISOString()
333
+ : new Date().toISOString();
334
+ const role = hasClassificationCol ? agent['classification'] : null;
335
+ const lastUsedAtRaw = hasLastUsedAtCol ? agent['last_used_at'] : null;
336
+ const lastUsedAt = lastUsedAtRaw != null ? new Date(lastUsedAtRaw * 1000).toISOString() : null;
337
+ conduit
338
+ .prepare(`INSERT OR IGNORE INTO project_agent_refs
339
+ (agent_id, attached_at, role, capabilities_override, last_used_at, enabled)
340
+ VALUES (?, ?, ?, NULL, ?, 1)`)
341
+ .run(agentId, attachedAt, role, lastUsedAt);
342
+ agentsCountForConduit++;
343
+ }
344
+ }
345
+ conduit.exec('COMMIT');
346
+ result.agentsCopied = agentsCountForConduit;
347
+ }
348
+ catch (err) {
349
+ const message = err instanceof Error ? err.message : String(err);
350
+ log.error({ error: message }, 'T310 migration: conduit.db write failed — rolling back');
351
+ result.errors.push({ step: 'step-8-conduit-write', error: message });
352
+ result.status = 'failed';
353
+ try {
354
+ conduit.exec('ROLLBACK');
355
+ }
356
+ catch {
357
+ // Ignore rollback errors
358
+ }
359
+ conduit.close();
360
+ conduit = null;
361
+ // Delete partial conduit.db
362
+ try {
363
+ if (existsSync(conduitPath)) {
364
+ unlinkSync(conduitPath);
365
+ }
366
+ }
367
+ catch {
368
+ // Ignore deletion errors
369
+ }
370
+ legacy.close();
371
+ return result;
372
+ }
373
+ // -----------------------------------------------------------------------
374
+ // Step 10: PRAGMA integrity_check on conduit.db
375
+ // -----------------------------------------------------------------------
376
+ try {
377
+ if (!integrityCheckPasses(conduit)) {
378
+ const msg = 'conduit.db failed PRAGMA integrity_check after write';
379
+ log.error({ conduitPath }, msg);
380
+ result.errors.push({ step: 'step-10-conduit-integrity', error: msg });
381
+ result.status = 'failed';
382
+ conduit.close();
383
+ conduit = null;
384
+ // Move broken conduit.db
385
+ const brokenPath = `${conduitPath}.broken-${brokenTimestamp()}`;
386
+ try {
387
+ renameSync(conduitPath, brokenPath);
388
+ }
389
+ catch {
390
+ // Ignore rename errors
391
+ }
392
+ legacy.close();
393
+ return result;
394
+ }
395
+ }
396
+ catch (err) {
397
+ const message = err instanceof Error ? err.message : String(err);
398
+ log.error({ error: message }, 'T310 migration: conduit.db integrity_check threw');
399
+ result.errors.push({ step: 'step-10-conduit-integrity', error: message });
400
+ result.status = 'failed';
401
+ conduit.close();
402
+ conduit = null;
403
+ legacy.close();
404
+ return result;
405
+ }
406
+ // Close our migration handle for conduit; the singleton from ensureConduitDb is untouched
407
+ conduit.close();
408
+ conduit = null;
409
+ // -----------------------------------------------------------------------
410
+ // Steps 11–13: Copy global-identity rows to global signaldock.db
411
+ // -----------------------------------------------------------------------
412
+ let globalDb = null;
413
+ try {
414
+ if (!existsSync(globalSignaldockPath)) {
415
+ // Ensure the schema exists — open and apply minimal schema
416
+ // ensureGlobalSignaldockDb() was called above (async); give it a chance
417
+ // to complete by opening directly here.
418
+ mkdirSync(cleoHome, { recursive: true });
419
+ }
420
+ globalDb = new DatabaseSync(globalSignaldockPath);
421
+ globalDb.exec('PRAGMA journal_mode = WAL');
422
+ globalDb.exec('PRAGMA foreign_keys = OFF'); // Disable FK checks during bulk copy
423
+ }
424
+ catch (err) {
425
+ const message = err instanceof Error ? err.message : String(err);
426
+ log.error({ globalSignaldockPath, error: message }, 'T310 migration: cannot open global signaldock.db');
427
+ result.errors.push({ step: 'step-11-open-global', error: message });
428
+ result.status = 'failed';
429
+ legacy.close();
430
+ return result;
431
+ }
432
+ let agentsCopiedToGlobal = 0;
433
+ try {
434
+ globalDb.exec('BEGIN TRANSACTION');
435
+ // Copy all global-identity tables using INSERT OR IGNORE
436
+ for (const tableName of GLOBAL_IDENTITY_TABLES) {
437
+ if (tableExistsInDb(legacy, tableName) && tableExistsInDb(globalDb, tableName)) {
438
+ copyTableRows(legacy, globalDb, tableName, true /* ignoreConflicts */);
439
+ }
440
+ }
441
+ // Count agents actually in legacy
442
+ if (tableExistsInDb(legacy, 'agents')) {
443
+ const countRow = legacy.prepare('SELECT COUNT(*) as cnt FROM agents').get();
444
+ agentsCopiedToGlobal = countRow.cnt;
445
+ }
446
+ // Mark ALL migrated agents as requiring reauth (new KDF scheme)
447
+ // Only mark rows that came from THIS legacy (i.e., all rows — INSERT OR IGNORE
448
+ // means existing rows were skipped; their requires_reauth stays unchanged).
449
+ // We mark every agent we inserted (agent_id from legacy) as requires_reauth=1.
450
+ if (tableExistsInDb(legacy, 'agents') && tableExistsInDb(globalDb, 'agents')) {
451
+ const legacyAgentIds = legacy.prepare('SELECT agent_id FROM agents').all();
452
+ for (const { agent_id } of legacyAgentIds) {
453
+ // Only update if this is a newly-inserted row (requires_reauth=0 means it was
454
+ // either newly inserted or pre-existing with requires_reauth not set).
455
+ // We unconditionally set requires_reauth=1 for all agents from this migration;
456
+ // if the row was already present (INSERT OR IGNORE skipped it), we leave it.
457
+ // To detect new insertions: compare changes() or use a marker.
458
+ // Per spec: mark all migrated agents requires_reauth=1.
459
+ // We use a conservative approach: only update if the row was NOT pre-existing.
460
+ // Since INSERT OR IGNORE doesn't tell us if a row was inserted or ignored,
461
+ // we use the approach of: set requires_reauth=1 WHERE requires_reauth=0.
462
+ // This safely marks newly-inserted agents and leaves pre-existing ones unchanged.
463
+ globalDb
464
+ .prepare('UPDATE agents SET requires_reauth = 1 WHERE agent_id = ? AND requires_reauth = 0')
465
+ .run(agent_id);
466
+ }
467
+ }
468
+ globalDb.exec('COMMIT');
469
+ result.agentsCopied = agentsCopiedToGlobal;
470
+ }
471
+ catch (err) {
472
+ const message = err instanceof Error ? err.message : String(err);
473
+ log.error({ error: message }, 'T310 migration: global signaldock.db write failed — rolling back');
474
+ result.errors.push({ step: 'step-12-global-write', error: message });
475
+ result.status = 'failed';
476
+ try {
477
+ globalDb.exec('ROLLBACK');
478
+ }
479
+ catch {
480
+ // Ignore rollback errors
481
+ }
482
+ globalDb.close();
483
+ globalDb = null;
484
+ legacy.close();
485
+ // conduit.db is valid — leave it in place
486
+ return result;
487
+ }
488
+ // -----------------------------------------------------------------------
489
+ // Step 14: PRAGMA integrity_check on global signaldock.db
490
+ // -----------------------------------------------------------------------
491
+ try {
492
+ if (!integrityCheckPasses(globalDb)) {
493
+ const msg = 'Global signaldock.db failed PRAGMA integrity_check after write';
494
+ log.error({ globalSignaldockPath }, msg);
495
+ result.errors.push({ step: 'step-14-global-integrity', error: msg });
496
+ result.status = 'failed';
497
+ globalDb.close();
498
+ globalDb = null;
499
+ const brokenPath = `${globalSignaldockPath}.broken-${brokenTimestamp()}`;
500
+ try {
501
+ renameSync(globalSignaldockPath, brokenPath);
502
+ }
503
+ catch {
504
+ // Ignore rename errors
505
+ }
506
+ legacy.close();
507
+ return result;
508
+ }
509
+ }
510
+ catch (err) {
511
+ const message = err instanceof Error ? err.message : String(err);
512
+ log.error({ error: message }, 'T310 migration: global signaldock.db integrity_check threw');
513
+ result.errors.push({ step: 'step-14-global-integrity', error: message });
514
+ result.status = 'failed';
515
+ globalDb.close();
516
+ globalDb = null;
517
+ legacy.close();
518
+ return result;
519
+ }
520
+ globalDb.close();
521
+ globalDb = null;
522
+ // -----------------------------------------------------------------------
523
+ // Step 15: Ensure global-salt exists (already done in step 6, re-check)
524
+ // -----------------------------------------------------------------------
525
+ // Salt was already ensured in step 6 — no repeat action needed.
526
+ // -----------------------------------------------------------------------
527
+ // Step 16: Atomic rename legacy → .pre-t310.bak
528
+ // -----------------------------------------------------------------------
529
+ legacy.close();
530
+ legacy = null;
531
+ try {
532
+ renameSync(legacyPath, bakPath);
533
+ result.bakPath = bakPath;
534
+ }
535
+ catch (err) {
536
+ const message = err instanceof Error ? err.message : String(err);
537
+ // Non-fatal per spec §4.4: next run will re-attempt (conduit.db absent check
538
+ // handles idempotency). But here conduit.db IS present, so needsMigration
539
+ // returns false on next run — the legacy file stays around harmlessly.
540
+ log.error({ legacyPath, bakPath, error: message }, 'T310 migration: rename to .pre-t310.bak failed — legacy file left in place (harmless)');
541
+ result.errors.push({ step: 'step-16-rename-bak', error: message });
542
+ // Still consider the migration successful — conduit.db and global signaldock.db are valid.
543
+ }
544
+ // -----------------------------------------------------------------------
545
+ // Step 17: Success logs
546
+ // -----------------------------------------------------------------------
547
+ log.info({ projectRoot, agentsCopied: result.agentsCopied, conduitPath, bakPath: result.bakPath }, `T310 migration complete: ${result.agentsCopied} agents migrated to global, conduit.db created`);
548
+ log.warn({}, 'T310 migration: API keys have been re-keyed. External systems holding old API keys ' +
549
+ '(CI env vars, remote agent configs) must be updated.');
550
+ log.info({ legacyPath, bakPath: result.bakPath, conduitPath }, 'T310 migration recovery: if problems occur, rename .pre-t310.bak to signaldock.db ' +
551
+ 'and delete conduit.db to re-run migration.');
552
+ result.status = 'migrated';
553
+ return result;
554
+ }
555
+ //# sourceMappingURL=migrate-signaldock-to-conduit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-signaldock-to-conduit.js","sourceRoot":"","sources":["../../src/store/migrate-signaldock-to-conduit.ts"],"names":[],"mappings":"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"}
@@ -30,11 +30,36 @@ let _nexusDbPath = null;
30
30
  /** Guard against concurrent initialization (async migration). */
31
31
  let _nexusInitPromise = null;
32
32
  /**
33
- * Get the path to the nexus.db SQLite database file.
34
- * nexus.db lives in the global ~/.cleo/ directory.
33
+ * Returns the global-tier nexus.db path. ALWAYS under `getCleoHome()`.
34
+ *
35
+ * nexus.db is a cross-project registry and must live in the global CLEO
36
+ * home directory (`~/.local/share/cleo/` on Linux via XDG). It is NEVER
37
+ * written to a per-project `.cleo/` directory.
38
+ *
39
+ * @task T307
40
+ * @epic T299
41
+ * @why ADR-036 §Decision/Global-Tier: nexus.db is global-only. This guard
42
+ * throws immediately if path resolution ever drifts outside getCleoHome(),
43
+ * preventing silent creation of project-tier stray nexus.db files.
44
+ * @throws {Error} If the resolved path is not under `getCleoHome()` — this
45
+ * indicates a code path that bypasses canonical path resolution and is a
46
+ * bug that must be fixed rather than silently tolerated.
35
47
  */
36
48
  export function getNexusDbPath() {
37
- return join(getCleoHome(), DB_FILENAME);
49
+ const cleoHome = getCleoHome();
50
+ const nexusPath = join(cleoHome, DB_FILENAME);
51
+ // Guard: the resolved path MUST be under the global tier.
52
+ // Under normal operation this invariant is always satisfied because we
53
+ // build nexusPath from cleoHome above. The assertion catches hypothetical
54
+ // future regressions where getCleoHome() is monkey-patched or join()
55
+ // produces an unexpected result on exotic platforms.
56
+ if (!nexusPath.startsWith(cleoHome)) {
57
+ throw new Error(`BUG: getNexusDbPath() resolved to "${nexusPath}" which is NOT under ` +
58
+ `getCleoHome() ("${cleoHome}"). nexus.db is global-only per ADR-036. ` +
59
+ `This indicates a code path that bypasses canonical path resolution — ` +
60
+ `fix the caller, do not suppress this error.`);
61
+ }
62
+ return nexusPath;
38
63
  }
39
64
  /**
40
65
  * Resolve the path to the drizzle-nexus migrations folder.
@@ -1 +1 @@
1
- {"version":3,"file":"nexus-sqlite.js","sourceRoot":"","sources":["../../src/store/nexus-sqlite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE/D,oDAAoD;AACpD,MAAM,WAAW,GAAG,UAAU,CAAC;AAE/B,gFAAgF;AAChF,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAE5C,+CAA+C;AAC/C,IAAI,QAAQ,GAAkD,IAAI,CAAC;AACnE,IAAI,cAAc,GAAwB,IAAI,CAAC;AAC/C,IAAI,YAAY,GAAkB,IAAI,CAAC;AACvC,iEAAiE;AACjE,IAAI,iBAAiB,GAA2D,IAAI,CAAC;AAErF;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B;IAC1C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAChF,OAAO,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,QAAsB,EAAE,SAAiB;IAC5D,MAAM,MAAM,GAAG,QAAQ;SACpB,OAAO,CAAC,8DAA8D,CAAC;SACvE,GAAG,CAAC,SAAS,CAAwC,CAAC;IACzD,OAAO,CAAC,CAAC,MAAM,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,kBAAkB,CACzB,QAAsB,EACtB,EAA0C;IAE1C,MAAM,gBAAgB,GAAG,4BAA4B,EAAE,CAAC;IAExD,6EAA6E;IAC7E,IAAI,WAAW,CAAC,QAAQ,EAAE,kBAAkB,CAAC,IAAI,YAAY,EAAE,CAAC;QAC9D,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QACrE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,iEAAiE;IACjE,gCAAgC;IAChC,IAAI,WAAW,CAAC,QAAQ,EAAE,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,sBAAsB,CAAC,EAAE,CAAC;QAChG,MAAM,UAAU,GAAG,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ;iBACL,OAAO,CACN,mHAAmH,CACpH;iBACA,GAAG,EAAE,CAAC;YACT,QAAQ;iBACL,OAAO,CACN,sEAAsE,QAAQ,CAAC,IAAI,MAAM,QAAQ,CAAC,YAAY,GAAG,CAClH;iBACA,GAAG,EAAE,CAAC;QACX,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,MAAM,WAAW,GAAG,CAAC,CAAC;IACtB,MAAM,aAAa,GAAG,GAAG,CAAC;IAC1B,MAAM,YAAY,GAAG,IAAI,CAAC;IAC1B,IAAI,SAAkB,CAAC;IACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,OAAO,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,WAAW;gBAAE,MAAM,GAAG,CAAC;YAC7D,SAAS,GAAG,GAAG,CAAC;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,aAAa,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,EAC9D,YAAY,CACb,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IACD,oBAAoB;IACpB,MAAM,SAAS,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,aAAa,GAAG,cAAc,EAAE,CAAC;IAEvC,6DAA6D;IAC7D,IAAI,QAAQ,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;QAC/C,iBAAiB,EAAE,CAAC;IACtB,CAAC;IAED,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,uDAAuD;IACvD,IAAI,iBAAiB;QAAE,OAAO,iBAAiB,CAAC;IAEhD,iBAAiB,GAAG,CAAC,KAAK,IAAI,EAAE;QAC9B,MAAM,MAAM,GAAG,aAAa,CAAC;QAC7B,YAAY,GAAG,MAAM,CAAC;QAEtB,0BAA0B;QAC1B,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhD,yDAAyD;QACzD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC5C,cAAc,GAAG,QAAQ,CAAC;QAE1B,6CAA6C;QAC7C,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QAE9D,kDAAkD;QAClD,kBAAkB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAEjC,+DAA+D;QAC/D,QAAQ;aACL,OAAO,CACN,kFAAkF,oBAAoB,IAAI,CAC3G;aACA,GAAG,EAAE,CAAC;QAET,+CAA+C;QAC/C,QAAQ,GAAG,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,EAAE,CAAC;IAEL,IAAI,CAAC;QACH,OAAO,MAAM,iBAAiB,CAAC;IACjC,CAAC;YAAS,CAAC;QACT,iBAAiB,GAAG,IAAI,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;gBAC1B,cAAc,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;QACD,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;IACD,QAAQ,GAAG,IAAI,CAAC;IAChB,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;gBAC1B,cAAc,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;QACD,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;IACD,QAAQ,GAAG,IAAI,CAAC;IAChB,YAAY,GAAG,IAAI,CAAC;IACpB,iBAAiB,GAAG,IAAI,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,cAAc,CAAC;AACxB,CAAC;AAGD;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"nexus-sqlite.js","sourceRoot":"","sources":["../../src/store/nexus-sqlite.ts"],"names":[],"mappings":"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"}