@camstack/system 1.2.458 → 1.2.459

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 (98) hide show
  1. package/dist/{agent-https-DOELEug8.js → agent-https-Dnr_nIVx.js} +3 -723
  2. package/dist/{agent-https-CQA3W-3e.mjs → agent-https-Iw3RSQup.mjs} +4 -616
  3. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  4. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  5. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  6. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  7. package/dist/builtins/alerts/alerts.addon.js +5 -7
  8. package/dist/builtins/alerts/alerts.addon.mjs +5 -7
  9. package/dist/builtins/alerts/record-kinds.d.ts +1 -1
  10. package/dist/builtins/autotrack/index.js +1 -1
  11. package/dist/builtins/autotrack/index.mjs +1 -1
  12. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +242 -4
  13. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +240 -2
  14. package/dist/builtins/calendars/calendars.addon.js +2 -10
  15. package/dist/builtins/calendars/calendars.addon.mjs +2 -3
  16. package/dist/builtins/calendars/record-kinds.d.ts +1 -1
  17. package/dist/builtins/camera-grid/index.js +1 -1
  18. package/dist/builtins/camera-grid/index.mjs +1 -1
  19. package/dist/builtins/composer/composer.addon.js +2 -2
  20. package/dist/builtins/composer/composer.addon.mjs +2 -2
  21. package/dist/builtins/console-logging/index.js +1 -1
  22. package/dist/builtins/console-logging/index.mjs +1 -1
  23. package/dist/builtins/core-blocks/core-blocks.addon.js +4 -6
  24. package/dist/builtins/core-blocks/core-blocks.addon.mjs +4 -6
  25. package/dist/builtins/device-history/device-history.addon.js +1 -1
  26. package/dist/builtins/device-history/device-history.addon.mjs +1 -1
  27. package/dist/builtins/device-manager/device-manager.addon.js +2 -4
  28. package/dist/builtins/device-manager/device-manager.addon.mjs +2 -4
  29. package/dist/builtins/hub-forwarder/index.js +1 -1
  30. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  31. package/dist/builtins/keychain/index.js +41 -43
  32. package/dist/builtins/keychain/index.mjs +41 -43
  33. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  34. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  35. package/dist/builtins/local-auth/local-auth.addon.js +24 -40
  36. package/dist/builtins/local-auth/local-auth.addon.mjs +24 -40
  37. package/dist/builtins/local-network/local-network.addon.js +2 -2
  38. package/dist/builtins/local-network/local-network.addon.mjs +2 -2
  39. package/dist/builtins/loki-logging/index.js +1 -1
  40. package/dist/builtins/loki-logging/index.mjs +1 -1
  41. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  42. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  43. package/dist/builtins/native-metrics/node-metrics-history-recorder.d.ts +1 -2
  44. package/dist/builtins/platform-probe/index.js +1 -1
  45. package/dist/builtins/platform-probe/index.mjs +1 -1
  46. package/dist/builtins/record-entries/index.js +1 -1
  47. package/dist/builtins/record-entries/index.mjs +1 -1
  48. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  49. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  50. package/dist/builtins/snapshot/index.js +1 -1
  51. package/dist/builtins/snapshot/index.mjs +1 -1
  52. package/dist/builtins/sqlite-storage/file-host-protocol.d.ts +0 -15
  53. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  54. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  55. package/dist/builtins/sqlite-storage/index.js +1 -1
  56. package/dist/builtins/sqlite-storage/index.mjs +1 -1
  57. package/dist/builtins/sqlite-storage/owned-sqlite-file.d.ts +0 -44
  58. package/dist/builtins/sqlite-storage/records/records-catalog.d.ts +0 -2
  59. package/dist/builtins/sqlite-storage/records/records-engine-types.d.ts +0 -21
  60. package/dist/builtins/sqlite-storage/records/records-engine.d.ts +3 -20
  61. package/dist/builtins/sqlite-storage/records/records-provider.d.ts +4 -18
  62. package/dist/builtins/sqlite-storage/records/records-sql.d.ts +1 -1
  63. package/dist/builtins/sqlite-storage/sqlite-settings-backend.d.ts +0 -17
  64. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +21 -196
  65. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +21 -196
  66. package/dist/builtins/sqlite-storage/storage-admin-provider.d.ts +6 -14
  67. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.d.ts +2 -2
  68. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +7 -9
  69. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +7 -9
  70. package/dist/builtins/system-config/system-config.addon.js +667 -40
  71. package/dist/builtins/system-config/system-config.addon.mjs +625 -15
  72. package/dist/builtins/winston-logging/index.js +1 -1
  73. package/dist/builtins/winston-logging/index.mjs +1 -1
  74. package/dist/{composition-sources-BVguN7VV.mjs → composition-sources-DNRZWR1j.mjs} +1 -1
  75. package/dist/{composition-sources-DURQNDJ4.js → composition-sources-b0e_2I-D.js} +1 -1
  76. package/dist/{constants-Njka8Cv6.js → constants-6OeJiZgi.js} +1 -1
  77. package/dist/{constants-FGjnsE2x.mjs → constants-BnkOdj9Q.mjs} +1 -1
  78. package/dist/{device-ca-lEaAQ9Xi.mjs → device-ca-Bnkw8GyU.mjs} +1 -1
  79. package/dist/{device-ca-BrVK_5s3.js → device-ca-CPTDs--d.js} +1 -1
  80. package/dist/{dist-BZQjLPiz.js → dist-Bn-RNanh.js} +29 -130
  81. package/dist/{dist-B_GRPhnY.mjs → dist-Wy8cTxg6.mjs} +30 -113
  82. package/dist/file-host-worker.js +1 -1
  83. package/dist/file-host-worker.mjs +1 -1
  84. package/dist/{hub-mdns-ciao-Bg2HfTwP.mjs → hub-mdns-ciao-CJu0nhla.mjs} +2 -2
  85. package/dist/{hub-mdns-ciao-nce3TXs_.js → hub-mdns-ciao-CTBTlia4.js} +2 -2
  86. package/dist/index.js +27 -30
  87. package/dist/index.mjs +11 -14
  88. package/dist/{restore-archive-C7kLDI_0.mjs → restore-archive-CmP-iiG9.mjs} +84 -331
  89. package/dist/{restore-archive-FyfZ8YMC.js → restore-archive-DM1OBYq4.js} +89 -342
  90. package/dist/{wal-maintenance-DfSIOj24.js → wal-maintenance-DUHEp_09.js} +0 -0
  91. package/dist/{wal-maintenance-Duejh7Lx.mjs → wal-maintenance-NKbwWovZ.mjs} +0 -0
  92. package/package.json +1 -1
  93. package/dist/builtins/records/legacy-table-row-count.d.ts +0 -5
  94. package/dist/builtins/records/phase6-declare-gate.d.ts +0 -28
  95. package/dist/builtins/sqlite-storage/records/count-settings-array-legacy.d.ts +0 -5
  96. package/dist/builtins/sqlite-storage/records/count-settings-brokers-legacy.d.ts +0 -6
  97. package/dist/phase6-declare-gate-Dag1_WR2.js +0 -98
  98. package/dist/phase6-declare-gate-Lb-mrVvz.mjs +0 -93
@@ -1,6 +1,6 @@
1
- import { C as DATABASE_SNAPSHOT_TIMEOUT_MS, Jt as databaseSnapshotCapability, Ot as bareAddonId, Rr as vectorStoreCapability, S as DATABASE_SNAPSHOT_SUFFIX, Tr as storageAdminCapability, ar as recordsCapability, ci as DeclarationRefusedError, ji as UnknownRecordKindError, la as normalizeSecretOwner, ma as parseSettingsBrokersAdoptsFrom, ni as BaseAddon, ot as STORAGE_ADMIN_MOVED_COLLECTIONS, pa as parseSettingsArrayAdoptsFrom, pi as NoCallerError, qt as dataStoreProviderCapability, st as STORAGE_ADMIN_SCOPED_BASES, ti as errMsg, vi as RECORD_SWEEP_INTERVAL_MS, w as DATA_STORE_DATABASES, wi as RecordKindDeclarationSchema, x as DATABASE_SNAPSHOT_PARTIAL_SUFFIX, xi as RUNTIME_DEFAULTS } from "../../dist-B_GRPhnY.mjs";
1
+ import { C as DATABASE_SNAPSHOT_TIMEOUT_MS, Jt as databaseSnapshotCapability, Ot as bareAddonId, Rr as vectorStoreCapability, S as DATABASE_SNAPSHOT_SUFFIX, Tr as storageAdminCapability, ar as recordsCapability, ca as normalizeSecretOwner, ci as DeclarationRefusedError, ji as UnknownRecordKindError, ni as BaseAddon, ot as STORAGE_ADMIN_MOVED_COLLECTIONS, pi as NoCallerError, qt as dataStoreProviderCapability, st as STORAGE_ADMIN_SCOPED_BASES, ti as errMsg, vi as RECORD_SWEEP_INTERVAL_MS, w as DATA_STORE_DATABASES, wi as RecordKindDeclarationSchema, x as DATABASE_SNAPSHOT_PARTIAL_SUFFIX, xi as RUNTIME_DEFAULTS } from "../../dist-Wy8cTxg6.mjs";
2
2
  import { i as retiredKeyStoreOf, n as purgeRetiredSettingsKeys } from "../../retired-settings-keys-Bhwe4ymb.mjs";
3
- import { C as RecordsEngine, D as callVector, E as callRecords, O as controlTargetOf, S as trustResult, T as callData, _ as collectTransferables, a as WalMaintenance, c as vectorProviderOfOwnedFile, d as CrossDatabaseTransactError, f as DatabaseBusyError, l as SqliteSettingsBackend, m as rehydrateError, o as createVectorIndex, p as DuplicatePlacementError, s as vectorProviderOf, u as CollectionPlacementError, v as isFileHostMessage, w as callControl } from "../../wal-maintenance-Duejh7Lx.mjs";
3
+ import { C as RecordsEngine, D as callVector, E as callRecords, O as controlTargetOf, S as trustResult, T as callData, _ as collectTransferables, a as WalMaintenance, c as vectorProviderOfOwnedFile, d as CrossDatabaseTransactError, f as DatabaseBusyError, l as SqliteSettingsBackend, m as rehydrateError, o as createVectorIndex, p as DuplicatePlacementError, s as vectorProviderOf, u as CollectionPlacementError, v as isFileHostMessage, w as callControl } from "../../wal-maintenance-NKbwWovZ.mjs";
4
4
  import { r as isSnapshotWorkerMessage } from "../../sqlite-snapshot-protocol-2QaTouWV.mjs";
5
5
  import { a as isWorkerMessage, t as WAL_CHECKPOINT_LARGE_PASS_FRAMES } from "../../wal-checkpoint-policy-BahrTtyD.mjs";
6
6
  import { createRequire } from "node:module";
@@ -931,9 +931,6 @@ var InlineOwnedFile = class extends OwnedFileBase {
931
931
  listPhysicalTables(ownerPrefix) {
932
932
  return Promise.resolve(callControl(controlTargetOf(this.backend, 0), "listPhysicalTables", { ownerPrefix }));
933
933
  }
934
- readLegacyCollection(input) {
935
- return Promise.resolve(callControl(controlTargetOf(this.backend, 0), "readLegacyCollection", input));
936
- }
937
934
  async dropRetiredTable(name) {
938
935
  return callControl(controlTargetOf(this.backend, 0), "dropRetiredTable", { name });
939
936
  }
@@ -991,9 +988,6 @@ var WorkerOwnedFile = class extends OwnedFileBase {
991
988
  listPhysicalTables(ownerPrefix) {
992
989
  return this.client.control("listPhysicalTables", { ownerPrefix });
993
990
  }
994
- readLegacyCollection(input) {
995
- return this.client.control("readLegacyCollection", input);
996
- }
997
991
  dropRetiredTable(name) {
998
992
  return this.client.control("dropRetiredTable", { name });
999
993
  }
@@ -1238,54 +1232,6 @@ var PlacementRouter = class {
1238
1232
  }
1239
1233
  };
1240
1234
  //#endregion
1241
- //#region src/builtins/sqlite-storage/records/count-settings-array-legacy.ts
1242
- function isRecord$1(value) {
1243
- return typeof value === "object" && value !== null && !Array.isArray(value);
1244
- }
1245
- function unwrapValue$1(raw) {
1246
- if (isRecord$1(raw) && "value" in raw) return raw["value"];
1247
- return raw;
1248
- }
1249
- function legacyRowId(item) {
1250
- const id = item["id"];
1251
- if (typeof id === "string" && id.length > 0) return id;
1252
- const username = item["username"];
1253
- if (typeof username === "string" && username.length > 0) return username;
1254
- return null;
1255
- }
1256
- async function countSettingsArrayLegacy(router, addonId, settingsKey) {
1257
- const list = unwrapValue$1(await router.get({
1258
- collection: "addon-settings",
1259
- key: `${addonId}.${settingsKey}`
1260
- }));
1261
- if (!Array.isArray(list)) return 0;
1262
- let n = 0;
1263
- for (const item of list) {
1264
- if (!isRecord$1(item)) continue;
1265
- if (legacyRowId(item) !== null) n += 1;
1266
- }
1267
- return n;
1268
- }
1269
- //#endregion
1270
- //#region src/builtins/sqlite-storage/records/count-settings-brokers-legacy.ts
1271
- function isRecord(value) {
1272
- return typeof value === "object" && value !== null && !Array.isArray(value);
1273
- }
1274
- function unwrapValue(raw) {
1275
- if (isRecord(raw) && "value" in raw) return raw["value"];
1276
- return raw;
1277
- }
1278
- async function countSettingsBrokersLegacy(router, addonId) {
1279
- const list = unwrapValue(await router.get({
1280
- collection: "addon-settings",
1281
- key: `${addonId}.brokers`
1282
- }));
1283
- if (!Array.isArray(list)) return 0;
1284
- let n = 0;
1285
- for (const item of list) if (isRecord(item) && typeof item["id"] === "string") n += 1;
1286
- return n;
1287
- }
1288
- //#endregion
1289
1235
  //#region src/builtins/sqlite-storage/records/records-provider.ts
1290
1236
  /**
1291
1237
  * The `records` capability of the engine (D881): resolves WHO is calling and
@@ -1298,9 +1244,9 @@ async function countSettingsBrokersLegacy(router, addonId) {
1298
1244
  * rebuilt from each open file's own `_record_kinds` at boot and updated on
1299
1245
  * declaration. A kind declared for another file than the one it lives in is
1300
1246
  * refused (the engine never moves data, D853).
1301
- * - **The boot guard**: after a declaration, a kind with `adoptsFrom` that is
1302
- * EMPTY while its legacy table still holds rows is reported `adoptionPending`;
1303
- * `ctx.records.declare` turns that into a refusal to start.
1247
+ * - **No adoption** (D900): the records migration is closed. A declaration
1248
+ * reads no legacy table, and a retired `adoptsFrom` an older addon still
1249
+ * sends is dropped before the catalog stores the declaration.
1304
1250
  */
1305
1251
  /** The caller the transport stamped, or a refusal. */
1306
1252
  function recordsCallerOf(input) {
@@ -1311,6 +1257,16 @@ function recordsCallerOf(input) {
1311
1257
  function keyOf(owner, kind) {
1312
1258
  return `${owner}\u0000${kind}`;
1313
1259
  }
1260
+ /**
1261
+ * A declaration as the catalog stores it: the retired `adoptsFrom` (D900) left
1262
+ * out, so the row an older addon's redeclaration writes no longer carries it.
1263
+ */
1264
+ function withoutRetiredKeys(declaration) {
1265
+ return {
1266
+ ...declaration,
1267
+ adoptsFrom: void 0
1268
+ };
1269
+ }
1314
1270
  var RecordsProvider = class {
1315
1271
  router;
1316
1272
  logger;
@@ -1344,7 +1300,7 @@ var RecordsProvider = class {
1344
1300
  const owner = recordsCallerOf(input);
1345
1301
  const byDatabase = /* @__PURE__ */ new Map();
1346
1302
  const parsed = /* @__PURE__ */ new Map();
1347
- for (const [kind, raw] of Object.entries(input.kinds)) parsed.set(kind, RecordKindDeclarationSchema.parse(raw));
1303
+ for (const [kind, raw] of Object.entries(input.kinds)) parsed.set(kind, withoutRetiredKeys(RecordKindDeclarationSchema.parse(raw)));
1348
1304
  await this.assertFamiliesInOneFile(owner, parsed);
1349
1305
  for (const [kind, declaration] of parsed) {
1350
1306
  const known = this.placement.get(keyOf(owner, kind));
@@ -1366,22 +1322,7 @@ var RecordsProvider = class {
1366
1322
  merged[kind] = result;
1367
1323
  }
1368
1324
  }
1369
- return { kinds: await this.withAdoption(owner, input.kinds, merged) };
1370
- }
1371
- /**
1372
- * Rows of a legacy table in EVERY open records-capable file. A legacy table lives
1373
- * in one file, but which one is the layout's business: the phase-3 NC ledgers moved
1374
- * to `events.db` with the P5 split, and a guard that asked `camstack.db` alone
1375
- * answered "no legacy rows" for 522 outbox rows (2026-10-20 audit).
1376
- */
1377
- async legacyRowsAnywhere(table) {
1378
- let total = 0;
1379
- for (const file of this.router.openFiles()) {
1380
- if (file.databaseId === "history") continue;
1381
- const rows = await file.records("legacyRowCount", { table });
1382
- if (rows !== null) total += rows;
1383
- }
1384
- return total;
1325
+ return { kinds: merged };
1385
1326
  }
1386
1327
  /**
1387
1328
  * `transactFamily` (plan risk 8): kinds that must agree through one `transact` sit
@@ -1412,52 +1353,6 @@ var RecordsProvider = class {
1412
1353
  throw new DeclarationRefusedError(`transactFamily "${family}" of "${owner}" is split across files (${[...members.entries()].map(([k, db]) => `${k}@${db}`).join(", ")}); a family lives in ONE file`);
1413
1354
  }
1414
1355
  }
1415
- /** The boot guard: empty kind + a legacy table that still has rows = adoption pending. */
1416
- async withAdoption(owner, declared, results) {
1417
- const out = { ...results };
1418
- for (const [kind, raw] of Object.entries(declared)) {
1419
- const legacy = raw.adoptsFrom;
1420
- const result = results[kind];
1421
- if (legacy === void 0 || result === void 0) continue;
1422
- if ((await (await this.fileOf(owner, kind)).records("adoptionState", {
1423
- owner,
1424
- kind
1425
- })).adoptedAt !== null) continue;
1426
- const settingsBrokersAddon = parseSettingsBrokersAdoptsFrom(legacy);
1427
- if (settingsBrokersAddon !== null) {
1428
- const legacyRows = await countSettingsBrokersLegacy(this.router, settingsBrokersAddon);
1429
- if (legacyRows > 0) out[kind] = {
1430
- ...result,
1431
- adoptionPending: {
1432
- legacyTable: legacy,
1433
- legacyRows
1434
- }
1435
- };
1436
- continue;
1437
- }
1438
- const settingsArray = parseSettingsArrayAdoptsFrom(legacy);
1439
- if (settingsArray !== null) {
1440
- const legacyRows = await countSettingsArrayLegacy(this.router, settingsArray.addonId, settingsArray.settingsKey);
1441
- if (legacyRows > 0) out[kind] = {
1442
- ...result,
1443
- adoptionPending: {
1444
- legacyTable: legacy,
1445
- legacyRows
1446
- }
1447
- };
1448
- continue;
1449
- }
1450
- const legacyRows = await this.legacyRowsAnywhere(legacy);
1451
- if (legacyRows > 0) out[kind] = {
1452
- ...result,
1453
- adoptionPending: {
1454
- legacyTable: legacy,
1455
- legacyRows
1456
- }
1457
- };
1458
- }
1459
- return out;
1460
- }
1461
1356
  async get(input) {
1462
1357
  const owner = recordsCallerOf(input);
1463
1358
  return (await this.fileOf(owner, input.kind)).records("get", {
@@ -1591,50 +1486,6 @@ var RecordsProvider = class {
1591
1486
  } });
1592
1487
  return (await this.fileOf(input.owner, input.kind)).records("query", input);
1593
1488
  }
1594
- /** True when a declared kind lists `collection` as `adoptsFrom` and adoption finished. */
1595
- async isAdoptedLegacyTable(collection) {
1596
- const { kinds } = await this.listKinds({ counts: false });
1597
- for (const k of kinds) {
1598
- if (k.state === "dropped") continue;
1599
- if (k.declaration.adoptsFrom !== collection) continue;
1600
- const { adoptedAt } = await (await this.fileOf(k.owner, k.kind)).records("adoptionState", {
1601
- owner: k.owner,
1602
- kind: k.kind
1603
- });
1604
- if (adoptedAt !== null) return true;
1605
- }
1606
- return false;
1607
- }
1608
- async adoptRecords(input) {
1609
- const file = await this.fileOf(input.owner, input.kind);
1610
- if (input.records.length > 0) {
1611
- const { adoptedAt } = await file.records("adoptionState", {
1612
- owner: input.owner,
1613
- kind: input.kind
1614
- });
1615
- if (adoptedAt !== null) {
1616
- if ((await file.records("count", {
1617
- owner: input.owner,
1618
- kind: input.kind
1619
- })).count === 0) await file.records("revokeAdopted", {
1620
- owner: input.owner,
1621
- kind: input.kind
1622
- });
1623
- }
1624
- }
1625
- const result = await file.records("putMany", input);
1626
- if (input.complete === true) await file.records("markAdopted", {
1627
- owner: input.owner,
1628
- kind: input.kind
1629
- });
1630
- this.logger.warn("records: ADOPTED rows as their declared owner", { meta: {
1631
- owner: input.owner,
1632
- kind: input.kind,
1633
- count: result.count,
1634
- complete: input.complete === true
1635
- } });
1636
- return { adopted: result.count };
1637
- }
1638
1489
  /** Housekeeping: delete rows past `expires_at` in every file that hosts kinds. */
1639
1490
  async sweepExpired() {
1640
1491
  let deleted = 0;
@@ -1649,8 +1500,9 @@ var RecordsProvider = class {
1649
1500
  //#region src/builtins/sqlite-storage/storage-admin-provider.ts
1650
1501
  /**
1651
1502
  * The `storage-admin` provider of the SQLite engine (D870): the operator's
1652
- * maintenance reach into the settings database - list its tables, drop one that
1653
- * nothing owns any more. Every call is logged with its table and counts.
1503
+ * maintenance reach into the settings database - list its tables and record
1504
+ * kinds, read a kind for diagnosis, drop a table that nothing owns any more.
1505
+ * Every call is logged with its table and counts.
1654
1506
  *
1655
1507
  * `dropCollection` is a one-shot of the D870 migration: remove it, and the
1656
1508
  * capability's method, once the last hub ran `migrate-device-store.ts --drop`.
@@ -1674,32 +1526,6 @@ var StorageAdminProvider = class {
1674
1526
  readRecords(input) {
1675
1527
  return this.records.readRecords(input);
1676
1528
  }
1677
- adoptRecords(input) {
1678
- return this.records.adoptRecords(input);
1679
- }
1680
- isAdoptedLegacyTable(input) {
1681
- return this.records.isAdoptedLegacyTable(input.collection).then((adopted) => ({ adopted }));
1682
- }
1683
- async readLegacyCollection(input) {
1684
- if (this.backend.hasTable(input.collection)) {
1685
- const page = this.backend.readLegacyCollection(input);
1686
- return {
1687
- rows: [...page.rows],
1688
- nextCursor: page.nextCursor
1689
- };
1690
- }
1691
- for (const file of await this.peerFiles()) if (await file.hasTable(input.collection)) {
1692
- const page = await file.readLegacyCollection(input);
1693
- return {
1694
- rows: [...page.rows],
1695
- nextCursor: page.nextCursor
1696
- };
1697
- }
1698
- return {
1699
- rows: [],
1700
- nextCursor: null
1701
- };
1702
- }
1703
1529
  /** May this table be dropped AT ALL? Throws with the reason when not. */
1704
1530
  async assertDroppable(collection) {
1705
1531
  const colon = collection.indexOf(":");
@@ -1711,7 +1537,7 @@ var StorageAdminProvider = class {
1711
1537
  throw new Error(`drop refused: the installed addons could not be read (${err instanceof Error ? err.message : String(err)})`);
1712
1538
  });
1713
1539
  const owner = collection.slice(0, colon);
1714
- if (installed.has(owner) && !await this.records.isAdoptedLegacyTable(collection)) throw new Error(`drop refused: "${collection}" belongs to the installed addon "${owner}"`);
1540
+ if (installed.has(owner)) throw new Error(`drop refused: "${collection}" belongs to the installed addon "${owner}"`);
1715
1541
  }
1716
1542
  async listTables(input) {
1717
1543
  const tables = [...this.backend.listTables(input.ownerPrefix)];
@@ -1726,7 +1552,6 @@ var StorageAdminProvider = class {
1726
1552
  async dropCollection(input) {
1727
1553
  try {
1728
1554
  await this.assertDroppable(input.collection);
1729
- if (await this.records.isAdoptedLegacyTable(input.collection)) this.backend.forgetDeclaredThisBoot(input.collection);
1730
1555
  const rows = this.backend.dropTable(input.collection, input.expectRows);
1731
1556
  this.logger.warn("storage-admin: DROPPED a table", { meta: {
1732
1557
  collection: input.collection,
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * The `storage-admin` provider of the SQLite engine (D870): the operator's
3
- * maintenance reach into the settings database - list its tables, drop one that
4
- * nothing owns any more. Every call is logged with its table and counts.
3
+ * maintenance reach into the settings database - list its tables and record
4
+ * kinds, read a kind for diagnosis, drop a table that nothing owns any more.
5
+ * Every call is logged with its table and counts.
5
6
  *
6
7
  * `dropCollection` is a one-shot of the D870 migration: remove it, and the
7
8
  * capability's method, once the last hub ran `migrate-device-store.ts --drop`.
@@ -15,22 +16,13 @@ export declare class StorageAdminProvider implements IStorageAdminProvider {
15
16
  private readonly logger;
16
17
  /** The addon ids installed on this hub; a throw means "cannot tell" and refuses the drop. */
17
18
  private readonly installedOwners;
18
- /** The records provider the System -> Data and migration methods delegate to (D881). */
19
+ /** The records provider the System -> Data methods delegate to (D881). */
19
20
  private readonly records;
20
- /** Non-settings files (`events.db`, `history.db`) for legacy table listing and reads. */
21
+ /** Non-settings files (`events.db`, `history.db`) whose tables `listTables` lists too. */
21
22
  private readonly peerFiles;
22
- constructor(backend: SqliteSettingsBackend, logger: IScopedLogger, installedOwners: () => Promise<ReadonlySet<string>>, records: Pick<RecordsProvider, "listKinds" | "readRecords" | "adoptRecords" | "isAdoptedLegacyTable">, peerFiles?: () => Promise<readonly OwnedSqliteFile[]>);
23
+ constructor(backend: SqliteSettingsBackend, logger: IScopedLogger, installedOwners: () => Promise<ReadonlySet<string>>, records: Pick<RecordsProvider, "listKinds" | "readRecords">, peerFiles?: () => Promise<readonly OwnedSqliteFile[]>);
23
24
  listKinds(input: Parameters<IStorageAdminProvider["listKinds"]>[0]): ReturnType<IStorageAdminProvider["listKinds"]>;
24
25
  readRecords(input: Parameters<IStorageAdminProvider["readRecords"]>[0]): ReturnType<IStorageAdminProvider["readRecords"]>;
25
- adoptRecords(input: Parameters<IStorageAdminProvider["adoptRecords"]>[0]): ReturnType<IStorageAdminProvider["adoptRecords"]>;
26
- isAdoptedLegacyTable(input: {
27
- collection: string;
28
- }): ReturnType<IStorageAdminProvider["isAdoptedLegacyTable"]>;
29
- readLegacyCollection(input: {
30
- collection: string;
31
- cursor?: string | undefined;
32
- limit?: number | undefined;
33
- }): ReturnType<IStorageAdminProvider["readLegacyCollection"]>;
34
26
  /** May this table be dropped AT ALL? Throws with the reason when not. */
35
27
  private assertDroppable;
36
28
  listTables(input: {
@@ -104,8 +104,8 @@ export declare class StorageOrchestratorAddon extends BaseAddon<StorageOrchestra
104
104
  * restart — the service never hydrates from / persists to SQLite.
105
105
  */
106
106
  private storeWireInFlight;
107
- /** True while the locations kind is empty and its legacy table still holds rows. */
108
- private adoptionIsPending;
107
+ /** True while the locations kind cannot be declared: its empty answer is not authoritative. */
108
+ private locationsKindNotReady;
109
109
  private ensureStoreWired;
110
110
  private storageProviders;
111
111
  /** Single-flighted pressure sweep — never overlaps a slow eviction round. */
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-BZQjLPiz.js");
6
+ const require_dist = require("../../dist-Bn-RNanh.js");
7
7
  const require_read_all_rows$1 = require("../../read-all-rows-CVoO1ONM.js");
8
8
  let zod = require("zod");
9
9
  let node_crypto = require("node:crypto");
@@ -53,8 +53,7 @@ var _storageOrchestratorRecordKinds = require_dist.defineRecordKinds({
53
53
  name: "type",
54
54
  fields: ["type"]
55
55
  }],
56
- retention: { none: "operator delete or declaration prune only" },
57
- adoptsFrom: STORAGE_LOCATIONS
56
+ retention: { none: "operator delete or declaration prune only" }
58
57
  },
59
58
  "seed-markers": {
60
59
  schema: StorageSeedMarkerBodySchema,
@@ -74,8 +73,7 @@ var _storageOrchestratorRecordKinds = require_dist.defineRecordKinds({
74
73
  name: "location_id",
75
74
  fields: ["locationId"]
76
75
  }],
77
- retention: { none: "row deleted when location leaves drain" },
78
- adoptsFrom: STORAGE_DRAIN_STATE_LEGACY
76
+ retention: { none: "row deleted when location leaves drain" }
79
77
  }
80
78
  });
81
79
  var storageOrchestratorRecordKinds = _storageOrchestratorRecordKinds;
@@ -4653,8 +4651,8 @@ var StorageOrchestratorAddon = class extends require_dist.BaseAddon {
4653
4651
  * restart — the service never hydrates from / persists to SQLite.
4654
4652
  */
4655
4653
  storeWireInFlight = null;
4656
- /** True while the locations kind is empty and its legacy table still holds rows. */
4657
- async adoptionIsPending() {
4654
+ /** True while the locations kind cannot be declared: its empty answer is not authoritative. */
4655
+ async locationsKindNotReady() {
4658
4656
  const records = this.ctx.records;
4659
4657
  if (records === void 0 || this.locationsKind === null) return false;
4660
4658
  try {
@@ -4662,7 +4660,7 @@ var StorageOrchestratorAddon = class extends require_dist.BaseAddon {
4662
4660
  return false;
4663
4661
  } catch (err) {
4664
4662
  const message = err instanceof Error ? err.message : String(err);
4665
- this.ctx.logger.warn("storage-orchestrator: persistence NOT wired — the storage-locations kind is not authoritative yet (adoption pending or the check failed); seeding is deferred", { meta: { error: message } });
4663
+ this.ctx.logger.warn("storage-orchestrator: persistence NOT wired — the storage-locations kind is not authoritative yet (its declaration failed); seeding is deferred", { meta: { error: message } });
4666
4664
  return true;
4667
4665
  }
4668
4666
  }
@@ -4672,7 +4670,7 @@ var StorageOrchestratorAddon = class extends require_dist.BaseAddon {
4672
4670
  if (this.storeWireInFlight) return this.storeWireInFlight;
4673
4671
  const store = this.resolveLocationStore(true);
4674
4672
  if (!store) return;
4675
- if (await this.adoptionIsPending()) return;
4673
+ if (await this.locationsKindNotReady()) return;
4676
4674
  this.ctx.logger.info("storage-orchestrator: data-store engine now available — wiring persistence");
4677
4675
  this.storeWireInFlight = service.attachStore(store).then(() => this.seedFromDeclarations()).catch((err) => {
4678
4676
  this.ctx.logger.error("storage-orchestrator: attachStore failed", { meta: { error: err instanceof Error ? err.message : String(err) } });
@@ -1,4 +1,4 @@
1
- import { Dr as storageMigrationCapability, Er as storageCapability, Fn as legacyModeOf, Hn as mayReadLocation, Ki as defineRecordKinds, Kn as modeMayWrite, Oa as EventCategory, On as isLocationEnabled, Ri as collectSecretConfigKeys, Ta as transformSecretWrite, Un as mayWriteToLocation, ba as secretTreeFromPaths, br as settingsStoreCapability, ca as normalizeNodeId, dn as evictionPolicyOfLocation, ft as StorageCleanupJobSchema, ht as StorageMigrationJobSchema, mt as StorageLocationTypeSchema, na as isSecretMarker, ni as BaseAddon, pr as resolveLocationMode, pt as StorageLocationModeSchema, q as LegacyStorageLocationDefaultSchema, ua as parseJsonObject, va as resolveSecretMarkers, yi as REDACTED_SECRET, yn as gbToBytes, zr as withLocationMode } from "../../dist-B_GRPhnY.mjs";
1
+ import { Dr as storageMigrationCapability, Er as storageCapability, Fn as legacyModeOf, Gi as defineRecordKinds, Hn as mayReadLocation, Kn as modeMayWrite, On as isLocationEnabled, Ri as collectSecretConfigKeys, Sa as transformSecretWrite, Ta as EventCategory, Un as mayWriteToLocation, _a as secretTreeFromPaths, br as settingsStoreCapability, dn as evictionPolicyOfLocation, ft as StorageCleanupJobSchema, ha as resolveSecretMarkers, ht as StorageMigrationJobSchema, la as parseJsonObject, mt as StorageLocationTypeSchema, ni as BaseAddon, pr as resolveLocationMode, pt as StorageLocationModeSchema, q as LegacyStorageLocationDefaultSchema, sa as normalizeNodeId, ta as isSecretMarker, yi as REDACTED_SECRET, yn as gbToBytes, zr as withLocationMode } from "../../dist-Wy8cTxg6.mjs";
2
2
  import { t as require_read_all_rows } from "../../read-all-rows-TaPqdWNF.mjs";
3
3
  import { z } from "zod";
4
4
  import { randomUUID } from "node:crypto";
@@ -48,8 +48,7 @@ var _storageOrchestratorRecordKinds = defineRecordKinds({
48
48
  name: "type",
49
49
  fields: ["type"]
50
50
  }],
51
- retention: { none: "operator delete or declaration prune only" },
52
- adoptsFrom: STORAGE_LOCATIONS
51
+ retention: { none: "operator delete or declaration prune only" }
53
52
  },
54
53
  "seed-markers": {
55
54
  schema: StorageSeedMarkerBodySchema,
@@ -69,8 +68,7 @@ var _storageOrchestratorRecordKinds = defineRecordKinds({
69
68
  name: "location_id",
70
69
  fields: ["locationId"]
71
70
  }],
72
- retention: { none: "row deleted when location leaves drain" },
73
- adoptsFrom: STORAGE_DRAIN_STATE_LEGACY
71
+ retention: { none: "row deleted when location leaves drain" }
74
72
  }
75
73
  });
76
74
  var storageOrchestratorRecordKinds = _storageOrchestratorRecordKinds;
@@ -4648,8 +4646,8 @@ var StorageOrchestratorAddon = class extends BaseAddon {
4648
4646
  * restart — the service never hydrates from / persists to SQLite.
4649
4647
  */
4650
4648
  storeWireInFlight = null;
4651
- /** True while the locations kind is empty and its legacy table still holds rows. */
4652
- async adoptionIsPending() {
4649
+ /** True while the locations kind cannot be declared: its empty answer is not authoritative. */
4650
+ async locationsKindNotReady() {
4653
4651
  const records = this.ctx.records;
4654
4652
  if (records === void 0 || this.locationsKind === null) return false;
4655
4653
  try {
@@ -4657,7 +4655,7 @@ var StorageOrchestratorAddon = class extends BaseAddon {
4657
4655
  return false;
4658
4656
  } catch (err) {
4659
4657
  const message = err instanceof Error ? err.message : String(err);
4660
- this.ctx.logger.warn("storage-orchestrator: persistence NOT wired — the storage-locations kind is not authoritative yet (adoption pending or the check failed); seeding is deferred", { meta: { error: message } });
4658
+ this.ctx.logger.warn("storage-orchestrator: persistence NOT wired — the storage-locations kind is not authoritative yet (its declaration failed); seeding is deferred", { meta: { error: message } });
4661
4659
  return true;
4662
4660
  }
4663
4661
  }
@@ -4667,7 +4665,7 @@ var StorageOrchestratorAddon = class extends BaseAddon {
4667
4665
  if (this.storeWireInFlight) return this.storeWireInFlight;
4668
4666
  const store = this.resolveLocationStore(true);
4669
4667
  if (!store) return;
4670
- if (await this.adoptionIsPending()) return;
4668
+ if (await this.locationsKindNotReady()) return;
4671
4669
  this.ctx.logger.info("storage-orchestrator: data-store engine now available — wiring persistence");
4672
4670
  this.storeWireInFlight = service.attachStore(store).then(() => this.seedFromDeclarations()).catch((err) => {
4673
4671
  this.ctx.logger.error("storage-orchestrator: attachStore failed", { meta: { error: err instanceof Error ? err.message : String(err) } });