@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,5 @@
1
1
  const require_chunk = require("./chunk-Cek0wNdY.js");
2
- const require_dist = require("./dist-BZQjLPiz.js");
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() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/system",
3
- "version": "1.2.458",
3
+ "version": "1.2.459",
4
4
  "description": "Core addon for CamStack — builtins, pipeline, process management, auth, logging, events",
5
5
  "keywords": [
6
6
  "camstack",
@@ -1,5 +0,0 @@
1
- /** Row count for a physical settings-db table (matches the records engine `legacyRowCount`). */
2
- export declare function legacyTableRowCountFromList(tables: readonly {
3
- readonly name: string;
4
- readonly rows: number;
5
- }[], collection: string): number;
@@ -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
- });