@camstack/system 1.2.458 → 1.2.460
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/addon-runner.js +26 -11
- package/dist/addon-runner.mjs +26 -11
- package/dist/addon-utils.mjs +1 -1
- 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 +4 -4
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +5 -5
- 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 +243 -5
- 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 +27 -43
- 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 +39 -4
- package/dist/builtins/native-metrics/native-metrics.addon.mjs +48 -13
- package/dist/builtins/native-metrics/node-metrics-history-recorder.d.ts +16 -2
- package/dist/builtins/platform-probe/coral-accelerators.d.ts +10 -1
- package/dist/builtins/platform-probe/index.js +7 -4
- package/dist/builtins/platform-probe/index.mjs +13 -10
- package/dist/builtins/platform-probe/platform-scorer.d.ts +4 -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 +20 -20
- 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-plan.d.ts +9 -4
- 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 +737 -127
- 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/{coral-accelerators-DcnZvctM.mjs → coral-accelerators-Qhn5TOYZ.mjs} +18 -15
- package/dist/{coral-accelerators-Bi_c3Rft.js → coral-accelerators-oUXmmbc2.js} +13 -10
- package/dist/{custom-action-registry-stpC3Zy-.mjs → custom-action-registry-DStvrQKI.mjs} +37 -37
- 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.d.ts +1 -0
- package/dist/index.js +56 -31
- package/dist/index.mjs +257 -233
- package/dist/kernel/deps/addon-deps-manager.d.ts +9 -0
- package/dist/{restore-archive-C7kLDI_0.mjs → restore-archive-CM23Pq9B.mjs} +177 -424
- package/dist/{restore-archive-FyfZ8YMC.js → restore-archive-DM1OBYq4.js} +89 -342
- package/dist/{wal-maintenance-Duejh7Lx.mjs → wal-maintenance-Bj_MmDkr.mjs} +0 -0
- package/dist/{wal-maintenance-DfSIOj24.js → wal-maintenance-CaJjuLHq.js} +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,5 @@
|
|
|
1
1
|
const require_chunk = require("./chunk-Cek0wNdY.js");
|
|
2
|
-
const require_dist = require("./dist-
|
|
3
|
-
const require_read_all_rows$1 = require("./read-all-rows-CVoO1ONM.js");
|
|
2
|
+
const require_dist = require("./dist-Bn-RNanh.js");
|
|
4
3
|
let zod = require("zod");
|
|
5
4
|
let node_crypto = require("node:crypto");
|
|
6
5
|
let buffer = require("buffer");
|
|
@@ -32,6 +31,88 @@ node_zlib = require_chunk.__toESM(node_zlib);
|
|
|
32
31
|
let node_stream_promises = require("node:stream/promises");
|
|
33
32
|
let node_assert = require("node:assert");
|
|
34
33
|
node_assert = require_chunk.__toESM(node_assert, 1);
|
|
34
|
+
var BackupScheduleBodySchema = zod.z.object({
|
|
35
|
+
label: zod.z.string(),
|
|
36
|
+
cron: zod.z.string(),
|
|
37
|
+
enabled: zod.z.boolean(),
|
|
38
|
+
locationIds: zod.z.array(zod.z.string()).readonly(),
|
|
39
|
+
retentionCount: zod.z.number(),
|
|
40
|
+
dataSources: zod.z.array(zod.z.string()).readonly().optional(),
|
|
41
|
+
databases: zod.z.array(require_dist.DataStoreDatabaseSchema).readonly().optional(),
|
|
42
|
+
lastAttemptAt: zod.z.number().optional(),
|
|
43
|
+
lastSuccessAt: zod.z.number().optional(),
|
|
44
|
+
lastError: zod.z.string().optional()
|
|
45
|
+
});
|
|
46
|
+
var BackupDestinationPolicyBodySchema = zod.z.object({
|
|
47
|
+
enabled: zod.z.boolean(),
|
|
48
|
+
retentionCount: zod.z.number(),
|
|
49
|
+
label: zod.z.string().optional(),
|
|
50
|
+
lastAttemptAt: zod.z.number().optional(),
|
|
51
|
+
lastError: zod.z.string().optional()
|
|
52
|
+
});
|
|
53
|
+
var BackupEncryptionKeyBodySchema = zod.z.object({
|
|
54
|
+
keyId: zod.z.string(),
|
|
55
|
+
publicKey: zod.z.string(),
|
|
56
|
+
createdAt: zod.z.number(),
|
|
57
|
+
retiredAt: zod.z.number().nullable()
|
|
58
|
+
});
|
|
59
|
+
var BackupSeedMarkerBodySchema = zod.z.object({ seededAt: zod.z.number() });
|
|
60
|
+
var _backupOrchestratorRecordKinds = require_dist.defineRecordKinds({
|
|
61
|
+
schedules: {
|
|
62
|
+
schema: BackupScheduleBodySchema,
|
|
63
|
+
class: "config",
|
|
64
|
+
writeTrigger: "operator upsert/delete; orchestrator stamps lastAttempt/success/error",
|
|
65
|
+
device: "none",
|
|
66
|
+
at: "none",
|
|
67
|
+
indexes: [{
|
|
68
|
+
name: "enabled",
|
|
69
|
+
fields: ["enabled"]
|
|
70
|
+
}],
|
|
71
|
+
retention: { none: "operator delete only" },
|
|
72
|
+
entry: {
|
|
73
|
+
title: "Backup schedules",
|
|
74
|
+
nameField: "label"
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"destination-policies": {
|
|
78
|
+
schema: BackupDestinationPolicyBodySchema,
|
|
79
|
+
class: "config",
|
|
80
|
+
writeTrigger: "ensureDefault, operator upsert, recordAttempt after each archive write",
|
|
81
|
+
device: "none",
|
|
82
|
+
at: "none",
|
|
83
|
+
retention: { none: "row outlives location; ensureDefault recreates" }
|
|
84
|
+
},
|
|
85
|
+
"encryption-keys": {
|
|
86
|
+
schema: BackupEncryptionKeyBodySchema,
|
|
87
|
+
class: "config",
|
|
88
|
+
writeTrigger: "setupEncryption activate; disableEncryption retires active row",
|
|
89
|
+
device: "none",
|
|
90
|
+
at: "none",
|
|
91
|
+
retention: { none: "retired keys kept for archive decryption hints" }
|
|
92
|
+
},
|
|
93
|
+
"seed-markers": {
|
|
94
|
+
schema: BackupSeedMarkerBodySchema,
|
|
95
|
+
class: "config",
|
|
96
|
+
writeTrigger: "mark() once per seed id after seed landed",
|
|
97
|
+
device: "none",
|
|
98
|
+
at: "none",
|
|
99
|
+
retention: { none: "one row per seed id ever" }
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
var backupOrchestratorRecordKinds = _backupOrchestratorRecordKinds;
|
|
103
|
+
var backupSchedulesRecordKind = _backupOrchestratorRecordKinds.schedules;
|
|
104
|
+
var backupDestinationPoliciesRecordKind = _backupOrchestratorRecordKinds["destination-policies"];
|
|
105
|
+
var backupEncryptionKeysRecordKind = _backupOrchestratorRecordKinds["encryption-keys"];
|
|
106
|
+
var backupSeedMarkersRecordKind = _backupOrchestratorRecordKinds["seed-markers"];
|
|
107
|
+
function backupRecordStoresOf(records) {
|
|
108
|
+
return {
|
|
109
|
+
schedules: records.kind(backupSchedulesRecordKind),
|
|
110
|
+
destinationPolicies: records.kind(backupDestinationPoliciesRecordKind),
|
|
111
|
+
encryptionKeys: records.kind(backupEncryptionKeysRecordKind),
|
|
112
|
+
seedMarkers: records.kind(backupSeedMarkersRecordKind)
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
//#endregion
|
|
35
116
|
//#region src/builtins/system-backup/backup-encryption.ts
|
|
36
117
|
/**
|
|
37
118
|
* Backup archive encryption — public key, streaming, chunked AEAD (D-backup
|
|
@@ -396,334 +477,6 @@ async function decryptBackupFile(input, output, secretKey) {
|
|
|
396
477
|
}
|
|
397
478
|
}
|
|
398
479
|
//#endregion
|
|
399
|
-
//#region src/builtins/backup-orchestrator/encryption-key-store.ts
|
|
400
|
-
var import_read_all_rows = require_read_all_rows$1.require_read_all_rows();
|
|
401
|
-
/**
|
|
402
|
-
* @durable class=config owner=backup-orchestrator
|
|
403
|
-
* write="`setupEncryption` inserts one row per generated key and retires the
|
|
404
|
-
* previous active row; `disableEncryption` retires the active row"
|
|
405
|
-
* retention="none — one small row per key ever generated; a retired row
|
|
406
|
-
* names the key older archives need"
|
|
407
|
-
*/
|
|
408
|
-
var BACKUP_ENCRYPTION_KEYS_COLLECTION = "backup_encryption_keys";
|
|
409
|
-
var COLUMNS$1 = [
|
|
410
|
-
{
|
|
411
|
-
name: "key_id",
|
|
412
|
-
type: "TEXT",
|
|
413
|
-
primaryKey: true
|
|
414
|
-
},
|
|
415
|
-
{
|
|
416
|
-
name: "public_key",
|
|
417
|
-
type: "TEXT",
|
|
418
|
-
notNull: true
|
|
419
|
-
},
|
|
420
|
-
{
|
|
421
|
-
name: "created_at",
|
|
422
|
-
type: "INTEGER",
|
|
423
|
-
notNull: true
|
|
424
|
-
},
|
|
425
|
-
{
|
|
426
|
-
name: "retired_at",
|
|
427
|
-
type: "INTEGER"
|
|
428
|
-
}
|
|
429
|
-
];
|
|
430
|
-
var BackupEncryptionKeyStore = class {
|
|
431
|
-
store;
|
|
432
|
-
now;
|
|
433
|
-
declared = false;
|
|
434
|
-
keysKind;
|
|
435
|
-
constructor(store, now = Date.now, keysKind = null) {
|
|
436
|
-
this.store = store;
|
|
437
|
-
this.now = now;
|
|
438
|
-
this.keysKind = keysKind;
|
|
439
|
-
}
|
|
440
|
-
async ensureDeclared() {
|
|
441
|
-
if (this.keysKind !== null) return;
|
|
442
|
-
if (this.declared) return;
|
|
443
|
-
await this.store.declareCollection({
|
|
444
|
-
collection: BACKUP_ENCRYPTION_KEYS_COLLECTION,
|
|
445
|
-
columns: COLUMNS$1
|
|
446
|
-
});
|
|
447
|
-
this.declared = true;
|
|
448
|
-
}
|
|
449
|
-
/** Every key, newest first. */
|
|
450
|
-
async list() {
|
|
451
|
-
await this.ensureDeclared();
|
|
452
|
-
const kind = this.keysKind;
|
|
453
|
-
if (kind !== null) {
|
|
454
|
-
const rows = await (0, import_read_all_rows.readAllRows)(kind);
|
|
455
|
-
rows.sort((a, b) => b.data.createdAt - a.data.createdAt);
|
|
456
|
-
const out = [];
|
|
457
|
-
for (const row of rows) {
|
|
458
|
-
const record = bodyToRecord(row.id, row.data);
|
|
459
|
-
if (record !== null) out.push(record);
|
|
460
|
-
}
|
|
461
|
-
return out;
|
|
462
|
-
}
|
|
463
|
-
const rows = await this.store.query({
|
|
464
|
-
collection: BACKUP_ENCRYPTION_KEYS_COLLECTION,
|
|
465
|
-
filter: { orderBy: {
|
|
466
|
-
field: "created_at",
|
|
467
|
-
direction: "desc"
|
|
468
|
-
} }
|
|
469
|
-
});
|
|
470
|
-
const out = [];
|
|
471
|
-
for (const row of rows) {
|
|
472
|
-
const record = toRecord(row.data);
|
|
473
|
-
if (record !== null) out.push(record);
|
|
474
|
-
}
|
|
475
|
-
return out;
|
|
476
|
-
}
|
|
477
|
-
/** The key new archives are encrypted to; `null` = encryption off. */
|
|
478
|
-
async active() {
|
|
479
|
-
return (await this.list()).find((k) => k.retiredAt === null) ?? null;
|
|
480
|
-
}
|
|
481
|
-
/** Make `publicKey` the active key; the previous one is retired, kept listed. */
|
|
482
|
-
async activate(input) {
|
|
483
|
-
const parsed = parseBackupPublicKey(input.publicKey);
|
|
484
|
-
const t = this.now();
|
|
485
|
-
await this.retireActive(t);
|
|
486
|
-
const record = {
|
|
487
|
-
keyId: parsed.keyId,
|
|
488
|
-
publicKey: input.publicKey.trim(),
|
|
489
|
-
createdAt: t,
|
|
490
|
-
retiredAt: null
|
|
491
|
-
};
|
|
492
|
-
await this.write(record);
|
|
493
|
-
return record;
|
|
494
|
-
}
|
|
495
|
-
/** Encryption off: the active key is retired. Archives already made keep needing it. */
|
|
496
|
-
async disable() {
|
|
497
|
-
await this.retireActive(this.now());
|
|
498
|
-
}
|
|
499
|
-
async retireActive(at) {
|
|
500
|
-
for (const key of await this.list()) if (key.retiredAt === null) await this.write({
|
|
501
|
-
...key,
|
|
502
|
-
retiredAt: at
|
|
503
|
-
});
|
|
504
|
-
}
|
|
505
|
-
async write(record) {
|
|
506
|
-
await this.ensureDeclared();
|
|
507
|
-
const kind = this.keysKind;
|
|
508
|
-
if (kind !== null) {
|
|
509
|
-
const body = {
|
|
510
|
-
keyId: record.keyId,
|
|
511
|
-
publicKey: record.publicKey,
|
|
512
|
-
createdAt: record.createdAt,
|
|
513
|
-
retiredAt: record.retiredAt
|
|
514
|
-
};
|
|
515
|
-
const data = backupOrchestratorRecordKinds["encryption-keys"].schema.parse(body);
|
|
516
|
-
await kind.put({
|
|
517
|
-
id: record.keyId,
|
|
518
|
-
data
|
|
519
|
-
});
|
|
520
|
-
return;
|
|
521
|
-
}
|
|
522
|
-
await this.store.deleteWhere({
|
|
523
|
-
collection: BACKUP_ENCRYPTION_KEYS_COLLECTION,
|
|
524
|
-
filter: { where: { key_id: record.keyId } }
|
|
525
|
-
});
|
|
526
|
-
await this.store.insert({
|
|
527
|
-
collection: BACKUP_ENCRYPTION_KEYS_COLLECTION,
|
|
528
|
-
record: {
|
|
529
|
-
id: record.keyId,
|
|
530
|
-
data: {
|
|
531
|
-
key_id: record.keyId,
|
|
532
|
-
public_key: record.publicKey,
|
|
533
|
-
created_at: record.createdAt,
|
|
534
|
-
retired_at: record.retiredAt
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
});
|
|
538
|
-
}
|
|
539
|
-
};
|
|
540
|
-
function bodyToRecord(keyId, body) {
|
|
541
|
-
if (!keyId) return null;
|
|
542
|
-
return {
|
|
543
|
-
keyId: body.keyId,
|
|
544
|
-
publicKey: body.publicKey,
|
|
545
|
-
createdAt: body.createdAt,
|
|
546
|
-
retiredAt: body.retiredAt
|
|
547
|
-
};
|
|
548
|
-
}
|
|
549
|
-
function toRecord(row) {
|
|
550
|
-
const keyId = row["key_id"];
|
|
551
|
-
const publicKey = row["public_key"];
|
|
552
|
-
const createdAt = row["created_at"];
|
|
553
|
-
if (typeof keyId !== "string" || typeof publicKey !== "string") return null;
|
|
554
|
-
const retired = row["retired_at"];
|
|
555
|
-
return {
|
|
556
|
-
keyId,
|
|
557
|
-
publicKey,
|
|
558
|
-
createdAt: typeof createdAt === "number" ? createdAt : Number(createdAt ?? 0),
|
|
559
|
-
retiredAt: typeof retired === "number" ? retired : null
|
|
560
|
-
};
|
|
561
|
-
}
|
|
562
|
-
//#endregion
|
|
563
|
-
//#region src/builtins/backup-orchestrator/seed-marker-store.ts
|
|
564
|
-
/**
|
|
565
|
-
* @durable class=config owner=backup-orchestrator
|
|
566
|
-
* write="the orchestrator inserts one row per seed id the first time that
|
|
567
|
-
* seed is created (or found already created); never updated"
|
|
568
|
-
* retention="none — one tiny row per seed ever made; deleting it lets the
|
|
569
|
-
* seed be re-created once more on the next boot"
|
|
570
|
-
*/
|
|
571
|
-
var BACKUP_SEED_MARKERS_COLLECTION = "backup_seed_markers";
|
|
572
|
-
var COLUMNS = [{
|
|
573
|
-
name: "seed_id",
|
|
574
|
-
type: "TEXT",
|
|
575
|
-
primaryKey: true
|
|
576
|
-
}, {
|
|
577
|
-
name: "seeded_at",
|
|
578
|
-
type: "INTEGER",
|
|
579
|
-
notNull: true
|
|
580
|
-
}];
|
|
581
|
-
var BackupSeedMarkerStore = class {
|
|
582
|
-
store;
|
|
583
|
-
now;
|
|
584
|
-
declared = false;
|
|
585
|
-
markersKind;
|
|
586
|
-
constructor(store, now = Date.now, markersKind = null) {
|
|
587
|
-
this.store = store;
|
|
588
|
-
this.now = now;
|
|
589
|
-
this.markersKind = markersKind;
|
|
590
|
-
}
|
|
591
|
-
async ensureDeclared() {
|
|
592
|
-
if (this.markersKind !== null) return;
|
|
593
|
-
if (this.declared) return;
|
|
594
|
-
await this.store.declareCollection({
|
|
595
|
-
collection: BACKUP_SEED_MARKERS_COLLECTION,
|
|
596
|
-
columns: COLUMNS
|
|
597
|
-
});
|
|
598
|
-
this.declared = true;
|
|
599
|
-
}
|
|
600
|
-
async has(seedId) {
|
|
601
|
-
await this.ensureDeclared();
|
|
602
|
-
const kind = this.markersKind;
|
|
603
|
-
if (kind !== null) return await kind.get(seedId) !== null;
|
|
604
|
-
return (await this.store.query({
|
|
605
|
-
collection: BACKUP_SEED_MARKERS_COLLECTION,
|
|
606
|
-
filter: {
|
|
607
|
-
where: { seed_id: seedId },
|
|
608
|
-
limit: 1
|
|
609
|
-
}
|
|
610
|
-
})).length > 0;
|
|
611
|
-
}
|
|
612
|
-
async mark(seedId) {
|
|
613
|
-
await this.ensureDeclared();
|
|
614
|
-
if (await this.has(seedId)) return;
|
|
615
|
-
const kind = this.markersKind;
|
|
616
|
-
if (kind !== null) {
|
|
617
|
-
const body = { seededAt: this.now() };
|
|
618
|
-
const data = backupOrchestratorRecordKinds["seed-markers"].schema.parse(body);
|
|
619
|
-
await kind.put({
|
|
620
|
-
id: seedId,
|
|
621
|
-
data
|
|
622
|
-
});
|
|
623
|
-
return;
|
|
624
|
-
}
|
|
625
|
-
await this.store.insert({
|
|
626
|
-
collection: BACKUP_SEED_MARKERS_COLLECTION,
|
|
627
|
-
record: {
|
|
628
|
-
id: seedId,
|
|
629
|
-
data: {
|
|
630
|
-
seed_id: seedId,
|
|
631
|
-
seeded_at: this.now()
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
});
|
|
635
|
-
}
|
|
636
|
-
};
|
|
637
|
-
//#endregion
|
|
638
|
-
//#region src/builtins/backup-orchestrator/record-kinds.ts
|
|
639
|
-
var BACKUP_SCHEDULES_LEGACY = "backup_schedules";
|
|
640
|
-
var BACKUP_DESTINATION_POLICIES_LEGACY = "backup_destination_policies";
|
|
641
|
-
var BackupScheduleBodySchema = zod.z.object({
|
|
642
|
-
label: zod.z.string(),
|
|
643
|
-
cron: zod.z.string(),
|
|
644
|
-
enabled: zod.z.boolean(),
|
|
645
|
-
locationIds: zod.z.array(zod.z.string()).readonly(),
|
|
646
|
-
retentionCount: zod.z.number(),
|
|
647
|
-
dataSources: zod.z.array(zod.z.string()).readonly().optional(),
|
|
648
|
-
databases: zod.z.array(require_dist.DataStoreDatabaseSchema).readonly().optional(),
|
|
649
|
-
lastAttemptAt: zod.z.number().optional(),
|
|
650
|
-
lastSuccessAt: zod.z.number().optional(),
|
|
651
|
-
lastError: zod.z.string().optional()
|
|
652
|
-
});
|
|
653
|
-
var BackupDestinationPolicyBodySchema = zod.z.object({
|
|
654
|
-
enabled: zod.z.boolean(),
|
|
655
|
-
retentionCount: zod.z.number(),
|
|
656
|
-
label: zod.z.string().optional(),
|
|
657
|
-
lastAttemptAt: zod.z.number().optional(),
|
|
658
|
-
lastError: zod.z.string().optional()
|
|
659
|
-
});
|
|
660
|
-
var BackupEncryptionKeyBodySchema = zod.z.object({
|
|
661
|
-
keyId: zod.z.string(),
|
|
662
|
-
publicKey: zod.z.string(),
|
|
663
|
-
createdAt: zod.z.number(),
|
|
664
|
-
retiredAt: zod.z.number().nullable()
|
|
665
|
-
});
|
|
666
|
-
var BackupSeedMarkerBodySchema = zod.z.object({ seededAt: zod.z.number() });
|
|
667
|
-
var _backupOrchestratorRecordKinds = require_dist.defineRecordKinds({
|
|
668
|
-
schedules: {
|
|
669
|
-
schema: BackupScheduleBodySchema,
|
|
670
|
-
class: "config",
|
|
671
|
-
writeTrigger: "operator upsert/delete; orchestrator stamps lastAttempt/success/error",
|
|
672
|
-
device: "none",
|
|
673
|
-
at: "none",
|
|
674
|
-
indexes: [{
|
|
675
|
-
name: "enabled",
|
|
676
|
-
fields: ["enabled"]
|
|
677
|
-
}],
|
|
678
|
-
retention: { none: "operator delete only" },
|
|
679
|
-
adoptsFrom: BACKUP_SCHEDULES_LEGACY,
|
|
680
|
-
entry: {
|
|
681
|
-
title: "Backup schedules",
|
|
682
|
-
nameField: "label"
|
|
683
|
-
}
|
|
684
|
-
},
|
|
685
|
-
"destination-policies": {
|
|
686
|
-
schema: BackupDestinationPolicyBodySchema,
|
|
687
|
-
class: "config",
|
|
688
|
-
writeTrigger: "ensureDefault, operator upsert, recordAttempt after each archive write",
|
|
689
|
-
device: "none",
|
|
690
|
-
at: "none",
|
|
691
|
-
retention: { none: "row outlives location; ensureDefault recreates" },
|
|
692
|
-
adoptsFrom: BACKUP_DESTINATION_POLICIES_LEGACY
|
|
693
|
-
},
|
|
694
|
-
"encryption-keys": {
|
|
695
|
-
schema: BackupEncryptionKeyBodySchema,
|
|
696
|
-
class: "config",
|
|
697
|
-
writeTrigger: "setupEncryption activate; disableEncryption retires active row",
|
|
698
|
-
device: "none",
|
|
699
|
-
at: "none",
|
|
700
|
-
retention: { none: "retired keys kept for archive decryption hints" },
|
|
701
|
-
adoptsFrom: BACKUP_ENCRYPTION_KEYS_COLLECTION
|
|
702
|
-
},
|
|
703
|
-
"seed-markers": {
|
|
704
|
-
schema: BackupSeedMarkerBodySchema,
|
|
705
|
-
class: "config",
|
|
706
|
-
writeTrigger: "mark() once per seed id after seed landed",
|
|
707
|
-
device: "none",
|
|
708
|
-
at: "none",
|
|
709
|
-
retention: { none: "one row per seed id ever" },
|
|
710
|
-
adoptsFrom: BACKUP_SEED_MARKERS_COLLECTION
|
|
711
|
-
}
|
|
712
|
-
});
|
|
713
|
-
var backupOrchestratorRecordKinds = _backupOrchestratorRecordKinds;
|
|
714
|
-
var backupSchedulesRecordKind = _backupOrchestratorRecordKinds.schedules;
|
|
715
|
-
var backupDestinationPoliciesRecordKind = _backupOrchestratorRecordKinds["destination-policies"];
|
|
716
|
-
var backupEncryptionKeysRecordKind = _backupOrchestratorRecordKinds["encryption-keys"];
|
|
717
|
-
var backupSeedMarkersRecordKind = _backupOrchestratorRecordKinds["seed-markers"];
|
|
718
|
-
function backupRecordStoresOf(records) {
|
|
719
|
-
return {
|
|
720
|
-
schedules: records.kind(backupSchedulesRecordKind),
|
|
721
|
-
destinationPolicies: records.kind(backupDestinationPoliciesRecordKind),
|
|
722
|
-
encryptionKeys: records.kind(backupEncryptionKeysRecordKind),
|
|
723
|
-
seedMarkers: records.kind(backupSeedMarkersRecordKind)
|
|
724
|
-
};
|
|
725
|
-
}
|
|
726
|
-
//#endregion
|
|
727
480
|
//#region node_modules/tar/dist/esm/index.min.js
|
|
728
481
|
var Mr = Object.defineProperty;
|
|
729
482
|
var Br = (s, t) => {
|
|
@@ -4480,12 +4233,6 @@ Object.defineProperty(exports, "BackupDecryptError", {
|
|
|
4480
4233
|
return BackupDecryptError;
|
|
4481
4234
|
}
|
|
4482
4235
|
});
|
|
4483
|
-
Object.defineProperty(exports, "BackupEncryptionKeyStore", {
|
|
4484
|
-
enumerable: true,
|
|
4485
|
-
get: function() {
|
|
4486
|
-
return BackupEncryptionKeyStore;
|
|
4487
|
-
}
|
|
4488
|
-
});
|
|
4489
4236
|
Object.defineProperty(exports, "BackupKeyFormatError", {
|
|
4490
4237
|
enumerable: true,
|
|
4491
4238
|
get: function() {
|
|
@@ -4504,12 +4251,6 @@ Object.defineProperty(exports, "BackupKeyRequiredError", {
|
|
|
4504
4251
|
return BackupKeyRequiredError;
|
|
4505
4252
|
}
|
|
4506
4253
|
});
|
|
4507
|
-
Object.defineProperty(exports, "BackupSeedMarkerStore", {
|
|
4508
|
-
enumerable: true,
|
|
4509
|
-
get: function() {
|
|
4510
|
-
return BackupSeedMarkerStore;
|
|
4511
|
-
}
|
|
4512
|
-
});
|
|
4513
4254
|
Object.defineProperty(exports, "BackupSnapshotRefusedError", {
|
|
4514
4255
|
enumerable: true,
|
|
4515
4256
|
get: function() {
|
|
@@ -4552,6 +4293,12 @@ Object.defineProperty(exports, "generateBackupKeyPair", {
|
|
|
4552
4293
|
return generateBackupKeyPair;
|
|
4553
4294
|
}
|
|
4554
4295
|
});
|
|
4296
|
+
Object.defineProperty(exports, "parseBackupPublicKey", {
|
|
4297
|
+
enumerable: true,
|
|
4298
|
+
get: function() {
|
|
4299
|
+
return parseBackupPublicKey;
|
|
4300
|
+
}
|
|
4301
|
+
});
|
|
4555
4302
|
Object.defineProperty(exports, "parseBackupSecretKey", {
|
|
4556
4303
|
enumerable: true,
|
|
4557
4304
|
get: function() {
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Phase 6 auth/alert builtins: do not call `ctx.records.declare` while legacy
|
|
3
|
-
* tables still hold rows unless every kind is already adopted, or the operator
|
|
4
|
-
* set {@link CAMSTACK_RECORDS_DECLARE_PHASE6} for the declare pass before
|
|
5
|
-
* `records-adopt.ts --apply`.
|
|
6
|
-
*/
|
|
7
|
-
import { type AddonContext, type DefinedRecordKind, type RecordsAccess, type StorageKind } from "@camstack/types";
|
|
8
|
-
/** Operator override: declare kinds even when adoption is still pending (legacy path until adopt completes). */
|
|
9
|
-
export declare const CAMSTACK_RECORDS_DECLARE_PHASE6 = "CAMSTACK_RECORDS_DECLARE_PHASE6";
|
|
10
|
-
export declare function isPhase6RecordsDeclareForced(): boolean;
|
|
11
|
-
export interface Phase6DeclareGateDeps {
|
|
12
|
-
readonly owner: string;
|
|
13
|
-
readonly records: RecordsAccess;
|
|
14
|
-
readonly kinds: Readonly<Record<string, DefinedRecordKind>>;
|
|
15
|
-
readonly legacyCollections: readonly string[];
|
|
16
|
-
readonly legacyRowCount: (collection: string) => Promise<number>;
|
|
17
|
-
readonly listKindsForOwner: (owner: string) => Promise<readonly StorageKind[]>;
|
|
18
|
-
readonly isAdoptedLegacyTable: (collection: string) => Promise<boolean>;
|
|
19
|
-
readonly log: {
|
|
20
|
-
info(message: string, meta?: Record<string, unknown>): void;
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* @returns `true` when stores should bind record kinds; `false` for legacy collections only.
|
|
25
|
-
*/
|
|
26
|
-
export declare function resolvePhase6UseRecordsPath(deps: Phase6DeclareGateDeps): Promise<boolean>;
|
|
27
|
-
/** Shared wiring for hub builtins (local-auth, keychain, alert-center). */
|
|
28
|
-
export declare function resolvePhase6UseRecordsPathForHub(ctx: Pick<AddonContext, "api" | "logger" | "records">, owner: string, kinds: Readonly<Record<string, DefinedRecordKind>>, legacyCollections: readonly string[]): Promise<boolean>;
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Boot guard (B3): addon-settings array fields block adoption until copied.
|
|
3
|
-
*/
|
|
4
|
-
import type { PlacementRouter } from "../placement-router.js";
|
|
5
|
-
export declare function countSettingsArrayLegacy(router: PlacementRouter, addonId: string, settingsKey: string): Promise<number>;
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Boot guard (B2): brokers still in addon-settings block adoption until
|
|
3
|
-
* `records-adopt` copies them into the entry kind.
|
|
4
|
-
*/
|
|
5
|
-
import type { PlacementRouter } from "../placement-router.js";
|
|
6
|
-
export declare function countSettingsBrokersLegacy(router: PlacementRouter, addonId: string): Promise<number>;
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
const require_dist = require("./dist-BZQjLPiz.js");
|
|
2
|
-
//#region src/builtins/records/legacy-table-row-count.ts
|
|
3
|
-
/** Row count for a physical settings-db table (matches the records engine `legacyRowCount`). */
|
|
4
|
-
function legacyTableRowCountFromList(tables, collection) {
|
|
5
|
-
return tables.find((t) => t.name === collection)?.rows ?? 0;
|
|
6
|
-
}
|
|
7
|
-
//#endregion
|
|
8
|
-
//#region src/builtins/records/phase6-declare-gate.ts
|
|
9
|
-
/**
|
|
10
|
-
* Phase 6 auth/alert builtins: do not call `ctx.records.declare` while legacy
|
|
11
|
-
* tables still hold rows unless every kind is already adopted, or the operator
|
|
12
|
-
* set {@link CAMSTACK_RECORDS_DECLARE_PHASE6} for the declare pass before
|
|
13
|
-
* `records-adopt.ts --apply`.
|
|
14
|
-
*/
|
|
15
|
-
/** Operator override: declare kinds even when adoption is still pending (legacy path until adopt completes). */
|
|
16
|
-
var CAMSTACK_RECORDS_DECLARE_PHASE6 = "CAMSTACK_RECORDS_DECLARE_PHASE6";
|
|
17
|
-
function isPhase6RecordsDeclareForced() {
|
|
18
|
-
const raw = process.env[CAMSTACK_RECORDS_DECLARE_PHASE6]?.trim().toLowerCase();
|
|
19
|
-
return raw === "1" || raw === "true" || raw === "yes";
|
|
20
|
-
}
|
|
21
|
-
async function legacyTablesHoldRows(collections, legacyRowCount) {
|
|
22
|
-
for (const collection of collections) if (await legacyRowCount(collection) > 0) return true;
|
|
23
|
-
return false;
|
|
24
|
-
}
|
|
25
|
-
async function catalogKindsFullyAdopted(owner, kindNames, declarations, listKindsForOwner, isAdoptedLegacyTable) {
|
|
26
|
-
const listed = await listKindsForOwner(owner);
|
|
27
|
-
const byKind = new Map(listed.map((k) => [k.kind, k]));
|
|
28
|
-
for (const name of kindNames) {
|
|
29
|
-
if (byKind.get(name) === void 0) return false;
|
|
30
|
-
const legacy = declarations[name]?.adoptsFrom;
|
|
31
|
-
if (typeof legacy !== "string") continue;
|
|
32
|
-
if (!await isAdoptedLegacyTable(legacy)) return false;
|
|
33
|
-
}
|
|
34
|
-
return true;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* @returns `true` when stores should bind record kinds; `false` for legacy collections only.
|
|
38
|
-
*/
|
|
39
|
-
async function resolvePhase6UseRecordsPath(deps) {
|
|
40
|
-
const declarations = require_dist.declarationsOf(deps.kinds);
|
|
41
|
-
const kindNames = Object.keys(deps.kinds);
|
|
42
|
-
if (await catalogKindsFullyAdopted(deps.owner, kindNames, declarations, deps.listKindsForOwner, deps.isAdoptedLegacyTable)) {
|
|
43
|
-
await deps.records.declare(deps.kinds);
|
|
44
|
-
return true;
|
|
45
|
-
}
|
|
46
|
-
if (!await legacyTablesHoldRows(deps.legacyCollections, deps.legacyRowCount)) {
|
|
47
|
-
await deps.records.declare(deps.kinds);
|
|
48
|
-
return true;
|
|
49
|
-
}
|
|
50
|
-
if (isPhase6RecordsDeclareForced()) {
|
|
51
|
-
try {
|
|
52
|
-
await deps.records.declare(deps.kinds);
|
|
53
|
-
} catch (err) {
|
|
54
|
-
if (!(err instanceof Error ? err.message : String(err)).startsWith("records/adoption-pending:")) throw err;
|
|
55
|
-
deps.log.info("phase 6: records kinds declared; legacy tables until adopt completes", { owner: deps.owner });
|
|
56
|
-
}
|
|
57
|
-
return false;
|
|
58
|
-
}
|
|
59
|
-
deps.log.info("phase 6: skipping records.declare — serving legacy collections until adopt completes", { owner: deps.owner });
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
/** Shared wiring for hub builtins (local-auth, keychain, alert-center). */
|
|
63
|
-
async function resolvePhase6UseRecordsPathForHub(ctx, owner, kinds, legacyCollections) {
|
|
64
|
-
const records = ctx.records;
|
|
65
|
-
const store = ctx.api?.settingsStore;
|
|
66
|
-
if (records === void 0 || store === void 0) return false;
|
|
67
|
-
const admin = ctx.api?.storageAdmin;
|
|
68
|
-
return resolvePhase6UseRecordsPath({
|
|
69
|
-
owner,
|
|
70
|
-
records,
|
|
71
|
-
kinds,
|
|
72
|
-
legacyCollections,
|
|
73
|
-
legacyRowCount: async (collection) => {
|
|
74
|
-
if (admin !== void 0) {
|
|
75
|
-
const fromEngine = legacyTableRowCountFromList((await admin.listTables.query({})).tables, collection);
|
|
76
|
-
if (fromEngine > 0) return fromEngine;
|
|
77
|
-
}
|
|
78
|
-
try {
|
|
79
|
-
return await store.count.query({ collection });
|
|
80
|
-
} catch {
|
|
81
|
-
return admin === void 0 ? 0 : legacyTableRowCountFromList((await admin.listTables.query({})).tables, collection);
|
|
82
|
-
}
|
|
83
|
-
},
|
|
84
|
-
listKindsForOwner: async (o) => admin === void 0 ? [] : (await admin.listKinds.query({
|
|
85
|
-
owner: o,
|
|
86
|
-
counts: false
|
|
87
|
-
})).kinds,
|
|
88
|
-
isAdoptedLegacyTable: async (collection) => admin === void 0 ? false : (await admin.isAdoptedLegacyTable.query({ collection })).adopted,
|
|
89
|
-
log: { info: (message, meta) => ctx.logger.info(message, meta ? { meta } : void 0) }
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
//#endregion
|
|
93
|
-
Object.defineProperty(exports, "resolvePhase6UseRecordsPathForHub", {
|
|
94
|
-
enumerable: true,
|
|
95
|
-
get: function() {
|
|
96
|
-
return resolvePhase6UseRecordsPathForHub;
|
|
97
|
-
}
|
|
98
|
-
});
|