@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.
- package/dist/{agent-https-DOELEug8.js → agent-https-Dnr_nIVx.js} +3 -723
- package/dist/{agent-https-CQA3W-3e.mjs → agent-https-Iw3RSQup.mjs} +4 -616
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
- package/dist/builtins/alerts/alerts.addon.js +5 -7
- package/dist/builtins/alerts/alerts.addon.mjs +5 -7
- package/dist/builtins/alerts/record-kinds.d.ts +1 -1
- package/dist/builtins/autotrack/index.js +1 -1
- package/dist/builtins/autotrack/index.mjs +1 -1
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +242 -4
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +240 -2
- package/dist/builtins/calendars/calendars.addon.js +2 -10
- package/dist/builtins/calendars/calendars.addon.mjs +2 -3
- package/dist/builtins/calendars/record-kinds.d.ts +1 -1
- package/dist/builtins/camera-grid/index.js +1 -1
- package/dist/builtins/camera-grid/index.mjs +1 -1
- package/dist/builtins/composer/composer.addon.js +2 -2
- package/dist/builtins/composer/composer.addon.mjs +2 -2
- package/dist/builtins/console-logging/index.js +1 -1
- package/dist/builtins/console-logging/index.mjs +1 -1
- package/dist/builtins/core-blocks/core-blocks.addon.js +4 -6
- package/dist/builtins/core-blocks/core-blocks.addon.mjs +4 -6
- package/dist/builtins/device-history/device-history.addon.js +1 -1
- package/dist/builtins/device-history/device-history.addon.mjs +1 -1
- package/dist/builtins/device-manager/device-manager.addon.js +2 -4
- package/dist/builtins/device-manager/device-manager.addon.mjs +2 -4
- package/dist/builtins/hub-forwarder/index.js +1 -1
- package/dist/builtins/hub-forwarder/index.mjs +1 -1
- package/dist/builtins/keychain/index.js +41 -43
- package/dist/builtins/keychain/index.mjs +41 -43
- package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
- package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
- package/dist/builtins/local-auth/local-auth.addon.js +24 -40
- package/dist/builtins/local-auth/local-auth.addon.mjs +24 -40
- package/dist/builtins/local-network/local-network.addon.js +2 -2
- package/dist/builtins/local-network/local-network.addon.mjs +2 -2
- package/dist/builtins/loki-logging/index.js +1 -1
- package/dist/builtins/loki-logging/index.mjs +1 -1
- package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
- package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
- package/dist/builtins/native-metrics/node-metrics-history-recorder.d.ts +1 -2
- package/dist/builtins/platform-probe/index.js +1 -1
- package/dist/builtins/platform-probe/index.mjs +1 -1
- package/dist/builtins/record-entries/index.js +1 -1
- package/dist/builtins/record-entries/index.mjs +1 -1
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
- package/dist/builtins/snapshot/index.js +1 -1
- package/dist/builtins/snapshot/index.mjs +1 -1
- package/dist/builtins/sqlite-storage/file-host-protocol.d.ts +0 -15
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
- package/dist/builtins/sqlite-storage/index.js +1 -1
- package/dist/builtins/sqlite-storage/index.mjs +1 -1
- package/dist/builtins/sqlite-storage/owned-sqlite-file.d.ts +0 -44
- package/dist/builtins/sqlite-storage/records/records-catalog.d.ts +0 -2
- package/dist/builtins/sqlite-storage/records/records-engine-types.d.ts +0 -21
- package/dist/builtins/sqlite-storage/records/records-engine.d.ts +3 -20
- package/dist/builtins/sqlite-storage/records/records-provider.d.ts +4 -18
- package/dist/builtins/sqlite-storage/records/records-sql.d.ts +1 -1
- package/dist/builtins/sqlite-storage/sqlite-settings-backend.d.ts +0 -17
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +21 -196
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +21 -196
- package/dist/builtins/sqlite-storage/storage-admin-provider.d.ts +6 -14
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.d.ts +2 -2
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +7 -9
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +7 -9
- package/dist/builtins/system-config/system-config.addon.js +667 -40
- package/dist/builtins/system-config/system-config.addon.mjs +625 -15
- package/dist/builtins/winston-logging/index.js +1 -1
- package/dist/builtins/winston-logging/index.mjs +1 -1
- package/dist/{composition-sources-BVguN7VV.mjs → composition-sources-DNRZWR1j.mjs} +1 -1
- package/dist/{composition-sources-DURQNDJ4.js → composition-sources-b0e_2I-D.js} +1 -1
- package/dist/{constants-Njka8Cv6.js → constants-6OeJiZgi.js} +1 -1
- package/dist/{constants-FGjnsE2x.mjs → constants-BnkOdj9Q.mjs} +1 -1
- package/dist/{device-ca-lEaAQ9Xi.mjs → device-ca-Bnkw8GyU.mjs} +1 -1
- package/dist/{device-ca-BrVK_5s3.js → device-ca-CPTDs--d.js} +1 -1
- package/dist/{dist-BZQjLPiz.js → dist-Bn-RNanh.js} +29 -130
- package/dist/{dist-B_GRPhnY.mjs → dist-Wy8cTxg6.mjs} +30 -113
- package/dist/file-host-worker.js +1 -1
- package/dist/file-host-worker.mjs +1 -1
- package/dist/{hub-mdns-ciao-Bg2HfTwP.mjs → hub-mdns-ciao-CJu0nhla.mjs} +2 -2
- package/dist/{hub-mdns-ciao-nce3TXs_.js → hub-mdns-ciao-CTBTlia4.js} +2 -2
- package/dist/index.js +27 -30
- package/dist/index.mjs +11 -14
- package/dist/{restore-archive-C7kLDI_0.mjs → restore-archive-CmP-iiG9.mjs} +84 -331
- package/dist/{restore-archive-FyfZ8YMC.js → restore-archive-DM1OBYq4.js} +89 -342
- package/dist/{wal-maintenance-DfSIOj24.js → wal-maintenance-DUHEp_09.js} +0 -0
- package/dist/{wal-maintenance-Duejh7Lx.mjs → wal-maintenance-NKbwWovZ.mjs} +0 -0
- package/package.json +1 -1
- package/dist/builtins/records/legacy-table-row-count.d.ts +0 -5
- package/dist/builtins/records/phase6-declare-gate.d.ts +0 -28
- package/dist/builtins/sqlite-storage/records/count-settings-array-legacy.d.ts +0 -5
- package/dist/builtins/sqlite-storage/records/count-settings-brokers-legacy.d.ts +0 -6
- package/dist/phase6-declare-gate-Dag1_WR2.js +0 -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,
|
|
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-
|
|
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
|
-
* - **
|
|
1302
|
-
*
|
|
1303
|
-
*
|
|
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:
|
|
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
|
|
1653
|
-
*
|
|
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)
|
|
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
|
|
4
|
-
*
|
|
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
|
|
19
|
+
/** The records provider the System -> Data methods delegate to (D881). */
|
|
19
20
|
private readonly records;
|
|
20
|
-
/** Non-settings files (`events.db`, `history.db`)
|
|
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"
|
|
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
|
|
108
|
-
private
|
|
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-
|
|
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
|
|
4657
|
-
async
|
|
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 (
|
|
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.
|
|
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,
|
|
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
|
|
4652
|
-
async
|
|
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 (
|
|
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.
|
|
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) } });
|