@camstack/system 1.2.444 → 1.2.446

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 (144) hide show
  1. package/dist/addon-runner.js +40 -31
  2. package/dist/addon-runner.mjs +41 -32
  3. package/dist/{agent-https-DlpTMDqA.js → agent-https-5DYAOJMO.js} +810 -12
  4. package/dist/{agent-https-U0d4uvn2.mjs → agent-https-BWUEf6ev.mjs} +697 -13
  5. package/dist/auth/admin-token-manager.d.ts +9 -3
  6. package/dist/auth/api-key-manager.d.ts +9 -3
  7. package/dist/auth/auth-audit-log.d.ts +9 -3
  8. package/dist/auth/device-credential-manager.d.ts +5 -1
  9. package/dist/auth/external-identity-manager.d.ts +8 -21
  10. package/dist/auth/login-session-manager.d.ts +11 -3
  11. package/dist/auth/scoped-token-manager.d.ts +8 -52
  12. package/dist/auth/totp-manager.d.ts +11 -3
  13. package/dist/auth/user-manager.d.ts +10 -17
  14. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  15. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  16. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  17. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  18. package/dist/builtins/alerts/alert-store.d.ts +32 -0
  19. package/dist/builtins/alerts/alerts.addon.d.ts +9 -2
  20. package/dist/builtins/alerts/alerts.addon.js +373 -154
  21. package/dist/builtins/alerts/alerts.addon.mjs +372 -154
  22. package/dist/builtins/alerts/critical-push.d.ts +4 -0
  23. package/dist/builtins/alerts/emit-alert-policy.d.ts +28 -0
  24. package/dist/builtins/alerts/record-kinds.d.ts +15 -0
  25. package/dist/builtins/autotrack/index.js +1 -1
  26. package/dist/builtins/autotrack/index.mjs +1 -1
  27. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.d.ts +1 -0
  28. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +134 -193
  29. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +134 -193
  30. package/dist/builtins/backup-orchestrator/destination-policy.d.ts +4 -2
  31. package/dist/builtins/backup-orchestrator/encryption-key-store.d.ts +4 -2
  32. package/dist/builtins/backup-orchestrator/record-kinds.d.ts +58 -0
  33. package/dist/builtins/backup-orchestrator/schedule-store.d.ts +4 -2
  34. package/dist/builtins/backup-orchestrator/seed-marker-store.d.ts +4 -2
  35. package/dist/builtins/calendars/calendar-prefs-store.d.ts +13 -5
  36. package/dist/builtins/calendars/calendars.addon.d.ts +2 -2
  37. package/dist/builtins/calendars/calendars.addon.js +67 -64
  38. package/dist/builtins/calendars/calendars.addon.mjs +59 -64
  39. package/dist/builtins/calendars/record-kinds.d.ts +18 -0
  40. package/dist/builtins/camera-grid/index.js +1 -1
  41. package/dist/builtins/camera-grid/index.mjs +1 -1
  42. package/dist/builtins/cluster-agent/record-kinds.d.ts +36 -0
  43. package/dist/builtins/composer/composer.addon.js +2 -2
  44. package/dist/builtins/composer/composer.addon.mjs +2 -2
  45. package/dist/builtins/console-logging/index.js +1 -1
  46. package/dist/builtins/console-logging/index.mjs +1 -1
  47. package/dist/builtins/core-blocks/block-settings-store.d.ts +8 -4
  48. package/dist/builtins/core-blocks/core-block-store.d.ts +8 -16
  49. package/dist/builtins/core-blocks/core-blocks.addon.js +85 -112
  50. package/dist/builtins/core-blocks/core-blocks.addon.mjs +86 -113
  51. package/dist/builtins/core-blocks/index.mjs +1 -1
  52. package/dist/builtins/core-blocks/record-kinds.d.ts +26 -0
  53. package/dist/builtins/device-manager/device-manager.addon.js +111 -187
  54. package/dist/builtins/device-manager/device-manager.addon.mjs +110 -187
  55. package/dist/builtins/device-manager/device-tombstone-store.d.ts +9 -48
  56. package/dist/builtins/device-manager/record-kinds.d.ts +14 -0
  57. package/dist/builtins/hub-forwarder/index.js +1 -1
  58. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  59. package/dist/builtins/keychain/index.js +152 -22
  60. package/dist/builtins/keychain/index.mjs +152 -22
  61. package/dist/builtins/keychain/keychain-service.d.ts +3 -2
  62. package/dist/builtins/keychain/keychain-store.d.ts +13 -2
  63. package/dist/builtins/keychain/record-kinds.d.ts +16 -0
  64. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  65. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  66. package/dist/builtins/local-auth/auth-schema.d.ts +3 -1
  67. package/dist/builtins/local-auth/local-auth.addon.js +2903 -2123
  68. package/dist/builtins/local-auth/local-auth.addon.mjs +2904 -2124
  69. package/dist/builtins/local-auth/oauth-session-manager.d.ts +8 -48
  70. package/dist/builtins/local-auth/record-kinds.d.ts +141 -0
  71. package/dist/builtins/local-network/local-network.addon.js +2 -2
  72. package/dist/builtins/local-network/local-network.addon.mjs +2 -2
  73. package/dist/builtins/loki-logging/index.js +1 -1
  74. package/dist/builtins/loki-logging/index.mjs +1 -1
  75. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  76. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  77. package/dist/builtins/platform-probe/index.js +1 -1
  78. package/dist/builtins/platform-probe/index.mjs +1 -1
  79. package/dist/builtins/record-entries/index.js +1 -1
  80. package/dist/builtins/record-entries/index.mjs +1 -1
  81. package/dist/builtins/records/legacy-table-row-count.d.ts +5 -0
  82. package/dist/builtins/records/phase6-declare-gate.d.ts +28 -0
  83. package/dist/builtins/records-isolated.d.ts +10 -0
  84. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  85. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  86. package/dist/builtins/snapshot/index.js +1 -1
  87. package/dist/builtins/snapshot/index.mjs +1 -1
  88. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  89. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  90. package/dist/builtins/sqlite-storage/index.js +1 -1
  91. package/dist/builtins/sqlite-storage/index.mjs +1 -1
  92. package/dist/builtins/sqlite-storage/integration-record-kinds.d.ts +30 -0
  93. package/dist/builtins/sqlite-storage/integration-registry.d.ts +10 -16
  94. package/dist/builtins/sqlite-storage/records/count-settings-array-legacy.d.ts +5 -0
  95. package/dist/builtins/sqlite-storage/records/count-settings-brokers-legacy.d.ts +6 -0
  96. package/dist/builtins/sqlite-storage/records/records-engine-types.d.ts +5 -0
  97. package/dist/builtins/sqlite-storage/records/records-engine.d.ts +4 -0
  98. package/dist/builtins/sqlite-storage/records/records-provider.d.ts +5 -1
  99. package/dist/builtins/sqlite-storage/sqlite-settings-backend.d.ts +17 -0
  100. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +111 -3
  101. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +111 -3
  102. package/dist/builtins/sqlite-storage/storage-admin-provider.d.ts +9 -1
  103. package/dist/builtins/storage-orchestrator/drain-state-store.d.ts +5 -2
  104. package/dist/builtins/storage-orchestrator/location-store.d.ts +7 -2
  105. package/dist/builtins/storage-orchestrator/record-kinds.d.ts +38 -0
  106. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.d.ts +2 -0
  107. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +196 -5
  108. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +195 -6
  109. package/dist/builtins/system-config/record-kinds.d.ts +32 -0
  110. package/dist/builtins/system-config/system-config.addon.js +53 -618
  111. package/dist/builtins/system-config/system-config.addon.mjs +29 -577
  112. package/dist/builtins/winston-logging/index.js +1 -1
  113. package/dist/builtins/winston-logging/index.mjs +1 -1
  114. package/dist/{composition-sources-C3rKncIF.mjs → composition-sources-BmC5jAUv.mjs} +1 -1
  115. package/dist/{composition-sources-NAPZddic.js → composition-sources-BwIIltnZ.js} +1 -1
  116. package/dist/{constants-BKX2QnIg.mjs → constants-6XHGmEUF.mjs} +1 -1
  117. package/dist/{constants-BXiNEIeV.js → constants-DA_tjzIk.js} +1 -1
  118. package/dist/{device-ca-jxjSL8Ov.mjs → device-ca-Bh_ClxMO.mjs} +1 -1
  119. package/dist/{device-ca-DT9X2S6d.js → device-ca-CnbrgfmW.js} +1 -1
  120. package/dist/{dist-D1vECb_6.js → dist-BkNfEJKa.js} +521 -64
  121. package/dist/{dist-DERK-gP5.mjs → dist-CkZIrsAP.mjs} +462 -65
  122. package/dist/file-host-worker.js +1 -1
  123. package/dist/file-host-worker.mjs +1 -1
  124. package/dist/{hub-mdns-ciao-CRaC97V0.mjs → hub-mdns-ciao-CoyIUWHC.mjs} +2 -2
  125. package/dist/{hub-mdns-ciao-Cah9GCIg.js → hub-mdns-ciao-m5LIr4oA.js} +2 -2
  126. package/dist/index.d.ts +7 -0
  127. package/dist/index.js +3095 -2821
  128. package/dist/index.mjs +3067 -2810
  129. package/dist/kernel/index.d.ts +2 -0
  130. package/dist/kernel/moleculer/event-bus.d.ts +3 -1
  131. package/dist/kernel/moleculer/mesh-mtls/mesh-certificate-registry.d.ts +5 -1
  132. package/dist/kernel/moleculer/remote-logger.d.ts +2 -2
  133. package/dist/kernel/transport/cap-route-resolver.d.ts +9 -38
  134. package/dist/phase6-declare-gate-BDWZuB2n.mjs +93 -0
  135. package/dist/phase6-declare-gate-Bl7KocEs.js +98 -0
  136. package/dist/read-all-rows-CVoO1ONM.js +29 -0
  137. package/dist/read-all-rows-TaPqdWNF.mjs +25 -0
  138. package/dist/records/read-all-rows.d.ts +6 -0
  139. package/dist/{restore-archive-Dy-qKTdF.js → restore-archive-B57xI5Ue.js} +353 -5
  140. package/dist/{restore-archive-daKyE24F.mjs → restore-archive-CMr4V7Fi.mjs} +339 -9
  141. package/dist/tls/agent-https-names.d.ts +9 -13
  142. package/dist/{wal-maintenance-zRc24mOC.mjs → wal-maintenance-Bqm4zrNA.mjs} +0 -0
  143. package/dist/{wal-maintenance-dAv4IdzC.js → wal-maintenance-CuG1DUca.js} +0 -0
  144. package/package.json +1 -1
@@ -1,9 +1,11 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_chunk = require("../../chunk-Cek0wNdY.js");
3
- const require_dist = require("../../dist-D1vECb_6.js");
4
- const require_composition_sources = require("../../composition-sources-NAPZddic.js");
3
+ const require_dist = require("../../dist-BkNfEJKa.js");
4
+ const require_read_all_rows$1 = require("../../read-all-rows-CVoO1ONM.js");
5
+ const require_composition_sources = require("../../composition-sources-BwIIltnZ.js");
5
6
  const require_prefix_range = require("../../prefix-range-D_KueXbQ.js");
6
7
  const require_prefix_walk = require("../../prefix-walk-Dv6MLZlM.js");
8
+ let zod = require("zod");
7
9
  let node_crypto = require("node:crypto");
8
10
  let _camstack_types_node = require("@camstack/types/node");
9
11
  let node_fs_promises = require("node:fs/promises");
@@ -502,6 +504,50 @@ var BlockSupervisor = class {
502
504
  }
503
505
  };
504
506
  //#endregion
507
+ //#region src/builtins/core-blocks/record-kinds.ts
508
+ var import_read_all_rows = require_read_all_rows$1.require_read_all_rows();
509
+ /**
510
+ * Record kinds owned by core-blocks (phase 4).
511
+ */
512
+ var CORE_BLOCKS_COLLECTION = "core_blocks";
513
+ var CORE_BLOCK_SETTINGS_COLLECTION = "core-blocks:settings";
514
+ var CoreBlockRowBodySchema = zod.z.object({
515
+ name: zod.z.string(),
516
+ enabled: zod.z.boolean(),
517
+ placement: zod.z.string(),
518
+ updatedAt: zod.z.number(),
519
+ block: zod.z.record(zod.z.string(), zod.z.unknown())
520
+ });
521
+ var CoreBlockSettingsBodySchema = zod.z.object({ values: zod.z.record(zod.z.string(), zod.z.unknown()) });
522
+ var _coreBlocksRecordKinds = require_dist.defineRecordKinds({
523
+ blocks: {
524
+ schema: CoreBlockRowBodySchema,
525
+ class: "config",
526
+ writeTrigger: "create / update / setStatus after compile",
527
+ device: "none",
528
+ at: "none",
529
+ indexes: [{
530
+ name: "enabled",
531
+ fields: ["enabled"]
532
+ }],
533
+ retention: { none: "operator delete only" },
534
+ maxDataBytes: 256 * 1024,
535
+ adoptsFrom: CORE_BLOCKS_COLLECTION
536
+ },
537
+ settings: {
538
+ schema: CoreBlockSettingsBodySchema,
539
+ class: "config",
540
+ writeTrigger: "legacy only — migrateRawSecrets reads then deletes rows (D880)",
541
+ device: "none",
542
+ at: "none",
543
+ retention: { none: "rows deleted by migrateRawSecrets" },
544
+ adoptsFrom: CORE_BLOCK_SETTINGS_COLLECTION
545
+ }
546
+ });
547
+ var coreBlocksRecordKinds = _coreBlocksRecordKinds;
548
+ _coreBlocksRecordKinds.blocks;
549
+ _coreBlocksRecordKinds.settings;
550
+ //#endregion
505
551
  //#region src/kernel/addon-settings-store.ts
506
552
  /** The collection every addon's settings share. Named nowhere else (with sections' own module). */
507
553
  var ADDON_SETTINGS_COLLECTION = "addon-settings";
@@ -593,23 +639,6 @@ function createAddonSettingsStore(door, addonId) {
593
639
  * now LEGACY - read only by {@link BlockSettingsStore.migrateRawSecrets}, which
594
640
  * moves the secrets, copies any key the rows lack, and deletes the blob.
595
641
  */
596
- /**
597
- * @durable class=config owner=core-blocks
598
- * write="NOTHING since D880 - the values live in the block addon's `addon-settings` rows. Only the one-shot `migrateRawSecrets` reads it, then deletes each row."
599
- * retention="legacy: every row is deleted by the verified operator migration; the declaration goes with it once every hub ran it."
600
- */
601
- var CORE_BLOCK_SETTINGS_COLLECTION = "core-blocks:settings";
602
- var CORE_BLOCK_SETTINGS_COLUMNS = [{
603
- name: "id",
604
- type: "TEXT",
605
- primaryKey: true,
606
- notNull: true
607
- }, {
608
- name: "values",
609
- type: "JSON",
610
- notNull: true,
611
- defaultValue: "{}"
612
- }];
613
642
  /** The block declares a secret, but this process has no keychain door to put it in. */
614
643
  var BlockSecretsUnavailableError = class extends Error {
615
644
  blockId;
@@ -693,19 +722,17 @@ function legacyValuesOf(row) {
693
722
  }
694
723
  var BlockSettingsStore = class {
695
724
  store;
725
+ legacySettings;
696
726
  keychainFor;
697
727
  onOrphaned;
698
728
  constructor(deps) {
699
729
  this.store = deps.store;
730
+ this.legacySettings = deps.legacySettings;
700
731
  this.keychainFor = deps.keychainFor;
701
732
  this.onOrphaned = deps.onOrphaned ?? (() => void 0);
702
733
  }
703
- /** Declares the LEGACY collection, so the migration can read it. */
704
- static async declare(store) {
705
- await store.declareCollection.mutate({
706
- collection: CORE_BLOCK_SETTINGS_COLLECTION,
707
- columns: [...CORE_BLOCK_SETTINGS_COLUMNS]
708
- });
734
+ static legacyKindOf(records) {
735
+ return records.kind(coreBlocksRecordKinds.settings);
709
736
  }
710
737
  rows(blockId) {
711
738
  const store = this.store;
@@ -757,10 +784,7 @@ var BlockSettingsStore = class {
757
784
  const removal = {};
758
785
  for (const key of Object.keys(stored)) removal[key] = void 0;
759
786
  await this.rows(blockId).merge(removal);
760
- await this.store.delete.mutate({
761
- collection: CORE_BLOCK_SETTINGS_COLLECTION,
762
- key: blockId
763
- });
787
+ await this.legacySettings.delete(blockId);
764
788
  if (refs.length === 0) return;
765
789
  const secrets = this.keychainFor(owner);
766
790
  try {
@@ -782,9 +806,8 @@ var BlockSettingsStore = class {
782
806
  * only - never a value, a ref or a block id.
783
807
  */
784
808
  async migrateRawSecrets(blocks, apply) {
785
- const legacyRows = await this.store.query.query({ collection: CORE_BLOCK_SETTINGS_COLLECTION });
786
809
  const legacyById = /* @__PURE__ */ new Map();
787
- for (const row of legacyRows) legacyById.set(row.id, legacyValuesOf(row.data));
810
+ for (const row of await (0, import_read_all_rows.readAllRows)(this.legacySettings)) legacyById.set(row.id, legacyValuesOf({ values: row.data.values }));
788
811
  const tally = {
789
812
  rows: 0,
790
813
  raw: 0,
@@ -856,10 +879,7 @@ var BlockSettingsStore = class {
856
879
  };
857
880
  }
858
881
  async dropLegacy(blockId) {
859
- await this.store.delete.mutate({
860
- collection: CORE_BLOCK_SETTINGS_COLLECTION,
861
- key: blockId
862
- });
882
+ await this.legacySettings.delete(blockId);
863
883
  }
864
884
  /** put -> read back -> compare -> only then the marker rows. */
865
885
  async moveBlock(block, tree, rest, effective, stored) {
@@ -905,7 +925,7 @@ var BlockSettingsStore = class {
905
925
  let remainingRaw = 0;
906
926
  let unresolvedMarkers = 0;
907
927
  const legacyById = /* @__PURE__ */ new Map();
908
- for (const row of await this.store.query.query({ collection: CORE_BLOCK_SETTINGS_COLLECTION })) legacyById.set(row.id, legacyValuesOf(row.data));
928
+ for (const row of await (0, import_read_all_rows.readAllRows)(this.legacySettings)) legacyById.set(row.id, legacyValuesOf({ values: row.data.values }));
909
929
  for (const block of subjects) {
910
930
  const tree = require_dist.secretTreeFromSchema(block.settingsSchema ?? null);
911
931
  const after = await this.readStored(block.id);
@@ -1332,47 +1352,6 @@ async function compileFiles(transpiler, files, entryPath) {
1332
1352
  * shape, or a new PK/UNIQUE/NOT-NULL-without-default column — which drops the
1333
1353
  * table and takes the operator's source code with it."
1334
1354
  */
1335
- var CORE_BLOCKS_COLLECTION = "core_blocks";
1336
- var CORE_BLOCKS_COLUMNS = [
1337
- {
1338
- name: "id",
1339
- type: "TEXT",
1340
- primaryKey: true,
1341
- notNull: true
1342
- },
1343
- {
1344
- name: "name",
1345
- type: "TEXT",
1346
- notNull: true
1347
- },
1348
- {
1349
- name: "enabled",
1350
- type: "BOOLEAN",
1351
- notNull: true
1352
- },
1353
- {
1354
- name: "placement",
1355
- type: "TEXT",
1356
- notNull: true
1357
- },
1358
- {
1359
- name: "updatedAt",
1360
- type: "INTEGER",
1361
- notNull: true
1362
- },
1363
- (
1364
- /** The FULL block, Zod-validated on read; the scalars above are indexed
1365
- * projections for the list view. */
1366
- {
1367
- name: "block",
1368
- type: "JSON",
1369
- notNull: true
1370
- })
1371
- ];
1372
- var CORE_BLOCKS_INDEXES = [{
1373
- name: "idx_core_blocks_enabled",
1374
- columns: ["enabled"]
1375
- }];
1376
1355
  /**
1377
1356
  * Rows one read asks for. A read that ANSWERS this many is not a loaded table:
1378
1357
  * rows past the limit would be absent, and an absent composition reads as a
@@ -1398,11 +1377,11 @@ function mayBeComposition(raw) {
1398
1377
  function parseErrorText(issues) {
1399
1378
  return issues.map((i) => `${i.path.map(String).join(".")}: ${i.message}`).join("; ");
1400
1379
  }
1401
- var CoreBlockStore = class {
1380
+ var CoreBlockStore = class CoreBlockStore {
1402
1381
  byId = /* @__PURE__ */ new Map();
1403
1382
  /** Rows that exist but do not parse and may be compositions — held for the composer, never dropped (D49). */
1404
1383
  unreadable = [];
1405
- store;
1384
+ blocks;
1406
1385
  logger;
1407
1386
  now;
1408
1387
  newId;
@@ -1410,16 +1389,15 @@ var CoreBlockStore = class {
1410
1389
  /** Consecutive failed reads — the warn is once per run of them, not once per retry. */
1411
1390
  failedLoads = 0;
1412
1391
  constructor(deps) {
1413
- this.store = deps.store;
1392
+ this.blocks = deps.blocks;
1414
1393
  this.logger = deps.logger;
1415
1394
  this.now = deps.now ?? (() => Date.now());
1416
1395
  this.newId = deps.newId ?? (() => (0, node_crypto.randomUUID)());
1417
1396
  }
1418
- static async declare(store) {
1419
- await store.declareCollection.mutate({
1420
- collection: CORE_BLOCKS_COLLECTION,
1421
- columns: [...CORE_BLOCKS_COLUMNS],
1422
- indexes: [...CORE_BLOCKS_INDEXES]
1397
+ static of(records, logger) {
1398
+ return new CoreBlockStore({
1399
+ blocks: records.kind(coreBlocksRecordKinds.blocks),
1400
+ logger
1423
1401
  });
1424
1402
  }
1425
1403
  /** True only after a `load()` that READ the table. The composer withdraws nothing otherwise (D49). */
@@ -1444,11 +1422,8 @@ var CoreBlockStore = class {
1444
1422
  */
1445
1423
  async load() {
1446
1424
  try {
1447
- const rows = await this.store.query.query({
1448
- collection: CORE_BLOCKS_COLLECTION,
1449
- filter: { limit: CORE_BLOCKS_LOAD_LIMIT }
1450
- });
1451
- if (rows.length >= 1e3) throw new Error(`core_blocks answered ${rows.length} rows, the read limit — rows past it would read as deleted`);
1425
+ const rows = (await this.blocks.query({ limit: CORE_BLOCKS_LOAD_LIMIT })).records;
1426
+ if (rows.length >= 1e3) throw new Error(`${CORE_BLOCKS_COLLECTION} answered ${rows.length} rows, the read limit — rows past it would read as deleted`);
1452
1427
  this.byId.clear();
1453
1428
  this.loaded = true;
1454
1429
  if (this.failedLoads > 0) {
@@ -1458,12 +1433,12 @@ var CoreBlockStore = class {
1458
1433
  let skipped = 0;
1459
1434
  const unreadable = [];
1460
1435
  for (const row of rows) {
1461
- const raw = row.data["block"];
1436
+ const raw = row.data.block;
1462
1437
  const parsed = require_dist.CoreBlockSchema.safeParse(raw);
1463
1438
  if (!parsed.success) {
1464
1439
  skipped += 1;
1465
1440
  if (mayBeComposition(raw)) {
1466
- const name = row.data["name"];
1441
+ const name = row.data.name;
1467
1442
  unreadable.push({
1468
1443
  id: row.id,
1469
1444
  name: typeof name === "string" ? name : null,
@@ -1623,22 +1598,21 @@ var CoreBlockStore = class {
1623
1598
  async delete(blockId) {
1624
1599
  this.byId.delete(blockId);
1625
1600
  this.unreadable = this.unreadable.filter((u) => u.id !== blockId);
1626
- await this.store.delete.mutate({
1627
- collection: CORE_BLOCKS_COLLECTION,
1628
- key: blockId
1629
- });
1601
+ await this.blocks.delete(blockId);
1630
1602
  }
1631
1603
  async persist(block) {
1632
- await this.store.set.mutate({
1633
- collection: CORE_BLOCKS_COLLECTION,
1634
- key: block.id,
1635
- value: {
1636
- name: block.name,
1637
- enabled: block.enabled,
1638
- placement: block.placement,
1639
- updatedAt: block.updatedAt,
1640
- block
1641
- }
1604
+ const body = {
1605
+ name: block.name,
1606
+ enabled: block.enabled,
1607
+ placement: block.placement,
1608
+ updatedAt: block.updatedAt,
1609
+ block
1610
+ };
1611
+ const parsed = coreBlocksRecordKinds.blocks.schema.safeParse(body);
1612
+ if (!parsed.success) return;
1613
+ await this.blocks.put({
1614
+ id: block.id,
1615
+ data: parsed.data
1642
1616
  });
1643
1617
  }
1644
1618
  /**
@@ -2262,14 +2236,13 @@ var CoreBlocksAddon = class extends require_dist.BaseAddon {
2262
2236
  async onInitialize() {
2263
2237
  const settingsStore = this.ctx.api?.settingsStore;
2264
2238
  if (!settingsStore) throw new Error("core-blocks: settings-store API not available — refusing to register the cap");
2265
- await CoreBlockStore.declare(settingsStore);
2266
- await BlockSettingsStore.declare(settingsStore);
2267
- this.store = new CoreBlockStore({
2268
- store: settingsStore,
2269
- logger: this.ctx.logger.child("store")
2270
- });
2239
+ const records = this.ctx.records;
2240
+ if (records === void 0) throw new Error("core-blocks needs ctx.records on the hub");
2241
+ await records.declare(coreBlocksRecordKinds);
2242
+ this.store = CoreBlockStore.of(records, this.ctx.logger.child("store"));
2271
2243
  this.prefs = new BlockSettingsStore({
2272
2244
  store: settingsStore,
2245
+ legacySettings: BlockSettingsStore.legacyKindOf(records),
2273
2246
  keychainFor: (owner) => this.ctx.secrets?.forOwner?.(owner) ?? null,
2274
2247
  onOrphaned: (blockId, refs) => this.ctx.logger.warn("core block settings: dropped keychain refs could not be deleted", { meta: {
2275
2248
  blockId,
@@ -1,8 +1,10 @@
1
- import { Ct as compositionSourceRefs, Dr as compositionSourceKey, Dt as coreBlockSourceKind, Ei as hydrateSchema, En as normalizeCoreBlockWrite, Et as coreBlockIdFromAddonId, Fr as BaseAddon, Hn as resolveCoreBlockEntry, It as describeComposableCaps, Mn as planComposition, Ni as isSecretRefOwnedBy, Ot as coreBlocksCapability, Pr as errMsg, Sr as composedDeviceRef, Tt as coreBlockComposition, Un as resolveCoreBlockFiles, Wi as resolveSecretMarkers, Zi as transformSecretWrite, _i as collectSecretMarkerRefs, fr as validateComposition, g as CORE_BLOCK_ADDON_PREFIX, h as CORE_BLOCKS_ADDON_ID, j as DeclaredDevices, ji as isSecretMarker, m as COMPOSER_RUNNER_ID, pt as buildCapabilityLookup, qi as secretTreeFromSchema, r as ALL_CAPABILITY_DEFINITIONS, wt as coreBlockAddonId, y as CoreBlockSchema, zn as replacedFieldKeys } from "../../dist-DERK-gP5.mjs";
2
- import { t as describeCompositionSources } from "../../composition-sources-C3rKncIF.mjs";
1
+ import { $i as resolveSecretMarkers, An as normalizeCoreBlockWrite, Ar as compositionSourceKey, At as coreBlockIdFromAddonId, Bt as describeComposableCaps, Di as defineRecordKinds, Dt as compositionSourceRefs, In as planComposition, Kn as resolveCoreBlockEntry, Li as isSecretMarker, Lr as errMsg, Mi as hydrateSchema, Mt as coreBlocksCapability, Ot as coreBlockAddonId, Rr as BaseAddon, Tr as composedDeviceRef, Un as replacedFieldKeys, _t as buildCapabilityLookup, gr as validateComposition, h as CORE_BLOCK_ADDON_PREFIX, j as DeclaredDevices, jt as coreBlockSourceKind, kt as coreBlockComposition, m as CORE_BLOCKS_ADDON_ID, na as secretTreeFromSchema, oa as transformSecretWrite, p as COMPOSER_RUNNER_ID, qn as resolveCoreBlockFiles, r as ALL_CAPABILITY_DEFINITIONS, v as CoreBlockSchema, xi as collectSecretMarkerRefs, zi as isSecretRefOwnedBy } from "../../dist-CkZIrsAP.mjs";
2
+ import { t as require_read_all_rows } from "../../read-all-rows-TaPqdWNF.mjs";
3
+ import { t as describeCompositionSources } from "../../composition-sources-BmC5jAUv.mjs";
3
4
  import { t as prefixRange } from "../../prefix-range-Dl0znowN.mjs";
4
5
  import { n as unwrapStoredValue, t as loadPrefixed } from "../../prefix-walk-DAOBSyH1.mjs";
5
6
  import { createRequire } from "node:module";
7
+ import { z } from "zod";
6
8
  import { randomUUID } from "node:crypto";
7
9
  import { customizationBlockName } from "@camstack/types/node";
8
10
  import * as fs from "node:fs/promises";
@@ -497,6 +499,50 @@ var BlockSupervisor = class {
497
499
  }
498
500
  };
499
501
  //#endregion
502
+ //#region src/builtins/core-blocks/record-kinds.ts
503
+ var import_read_all_rows = require_read_all_rows();
504
+ /**
505
+ * Record kinds owned by core-blocks (phase 4).
506
+ */
507
+ var CORE_BLOCKS_COLLECTION = "core_blocks";
508
+ var CORE_BLOCK_SETTINGS_COLLECTION = "core-blocks:settings";
509
+ var CoreBlockRowBodySchema = z.object({
510
+ name: z.string(),
511
+ enabled: z.boolean(),
512
+ placement: z.string(),
513
+ updatedAt: z.number(),
514
+ block: z.record(z.string(), z.unknown())
515
+ });
516
+ var CoreBlockSettingsBodySchema = z.object({ values: z.record(z.string(), z.unknown()) });
517
+ var _coreBlocksRecordKinds = defineRecordKinds({
518
+ blocks: {
519
+ schema: CoreBlockRowBodySchema,
520
+ class: "config",
521
+ writeTrigger: "create / update / setStatus after compile",
522
+ device: "none",
523
+ at: "none",
524
+ indexes: [{
525
+ name: "enabled",
526
+ fields: ["enabled"]
527
+ }],
528
+ retention: { none: "operator delete only" },
529
+ maxDataBytes: 256 * 1024,
530
+ adoptsFrom: CORE_BLOCKS_COLLECTION
531
+ },
532
+ settings: {
533
+ schema: CoreBlockSettingsBodySchema,
534
+ class: "config",
535
+ writeTrigger: "legacy only — migrateRawSecrets reads then deletes rows (D880)",
536
+ device: "none",
537
+ at: "none",
538
+ retention: { none: "rows deleted by migrateRawSecrets" },
539
+ adoptsFrom: CORE_BLOCK_SETTINGS_COLLECTION
540
+ }
541
+ });
542
+ var coreBlocksRecordKinds = _coreBlocksRecordKinds;
543
+ _coreBlocksRecordKinds.blocks;
544
+ _coreBlocksRecordKinds.settings;
545
+ //#endregion
500
546
  //#region src/kernel/addon-settings-store.ts
501
547
  /** The collection every addon's settings share. Named nowhere else (with sections' own module). */
502
548
  var ADDON_SETTINGS_COLLECTION = "addon-settings";
@@ -588,23 +634,6 @@ function createAddonSettingsStore(door, addonId) {
588
634
  * now LEGACY - read only by {@link BlockSettingsStore.migrateRawSecrets}, which
589
635
  * moves the secrets, copies any key the rows lack, and deletes the blob.
590
636
  */
591
- /**
592
- * @durable class=config owner=core-blocks
593
- * write="NOTHING since D880 - the values live in the block addon's `addon-settings` rows. Only the one-shot `migrateRawSecrets` reads it, then deletes each row."
594
- * retention="legacy: every row is deleted by the verified operator migration; the declaration goes with it once every hub ran it."
595
- */
596
- var CORE_BLOCK_SETTINGS_COLLECTION = "core-blocks:settings";
597
- var CORE_BLOCK_SETTINGS_COLUMNS = [{
598
- name: "id",
599
- type: "TEXT",
600
- primaryKey: true,
601
- notNull: true
602
- }, {
603
- name: "values",
604
- type: "JSON",
605
- notNull: true,
606
- defaultValue: "{}"
607
- }];
608
637
  /** The block declares a secret, but this process has no keychain door to put it in. */
609
638
  var BlockSecretsUnavailableError = class extends Error {
610
639
  blockId;
@@ -688,19 +717,17 @@ function legacyValuesOf(row) {
688
717
  }
689
718
  var BlockSettingsStore = class {
690
719
  store;
720
+ legacySettings;
691
721
  keychainFor;
692
722
  onOrphaned;
693
723
  constructor(deps) {
694
724
  this.store = deps.store;
725
+ this.legacySettings = deps.legacySettings;
695
726
  this.keychainFor = deps.keychainFor;
696
727
  this.onOrphaned = deps.onOrphaned ?? (() => void 0);
697
728
  }
698
- /** Declares the LEGACY collection, so the migration can read it. */
699
- static async declare(store) {
700
- await store.declareCollection.mutate({
701
- collection: CORE_BLOCK_SETTINGS_COLLECTION,
702
- columns: [...CORE_BLOCK_SETTINGS_COLUMNS]
703
- });
729
+ static legacyKindOf(records) {
730
+ return records.kind(coreBlocksRecordKinds.settings);
704
731
  }
705
732
  rows(blockId) {
706
733
  const store = this.store;
@@ -752,10 +779,7 @@ var BlockSettingsStore = class {
752
779
  const removal = {};
753
780
  for (const key of Object.keys(stored)) removal[key] = void 0;
754
781
  await this.rows(blockId).merge(removal);
755
- await this.store.delete.mutate({
756
- collection: CORE_BLOCK_SETTINGS_COLLECTION,
757
- key: blockId
758
- });
782
+ await this.legacySettings.delete(blockId);
759
783
  if (refs.length === 0) return;
760
784
  const secrets = this.keychainFor(owner);
761
785
  try {
@@ -777,9 +801,8 @@ var BlockSettingsStore = class {
777
801
  * only - never a value, a ref or a block id.
778
802
  */
779
803
  async migrateRawSecrets(blocks, apply) {
780
- const legacyRows = await this.store.query.query({ collection: CORE_BLOCK_SETTINGS_COLLECTION });
781
804
  const legacyById = /* @__PURE__ */ new Map();
782
- for (const row of legacyRows) legacyById.set(row.id, legacyValuesOf(row.data));
805
+ for (const row of await (0, import_read_all_rows.readAllRows)(this.legacySettings)) legacyById.set(row.id, legacyValuesOf({ values: row.data.values }));
783
806
  const tally = {
784
807
  rows: 0,
785
808
  raw: 0,
@@ -851,10 +874,7 @@ var BlockSettingsStore = class {
851
874
  };
852
875
  }
853
876
  async dropLegacy(blockId) {
854
- await this.store.delete.mutate({
855
- collection: CORE_BLOCK_SETTINGS_COLLECTION,
856
- key: blockId
857
- });
877
+ await this.legacySettings.delete(blockId);
858
878
  }
859
879
  /** put -> read back -> compare -> only then the marker rows. */
860
880
  async moveBlock(block, tree, rest, effective, stored) {
@@ -900,7 +920,7 @@ var BlockSettingsStore = class {
900
920
  let remainingRaw = 0;
901
921
  let unresolvedMarkers = 0;
902
922
  const legacyById = /* @__PURE__ */ new Map();
903
- for (const row of await this.store.query.query({ collection: CORE_BLOCK_SETTINGS_COLLECTION })) legacyById.set(row.id, legacyValuesOf(row.data));
923
+ for (const row of await (0, import_read_all_rows.readAllRows)(this.legacySettings)) legacyById.set(row.id, legacyValuesOf({ values: row.data.values }));
904
924
  for (const block of subjects) {
905
925
  const tree = secretTreeFromSchema(block.settingsSchema ?? null);
906
926
  const after = await this.readStored(block.id);
@@ -1327,47 +1347,6 @@ async function compileFiles(transpiler, files, entryPath) {
1327
1347
  * shape, or a new PK/UNIQUE/NOT-NULL-without-default column — which drops the
1328
1348
  * table and takes the operator's source code with it."
1329
1349
  */
1330
- var CORE_BLOCKS_COLLECTION = "core_blocks";
1331
- var CORE_BLOCKS_COLUMNS = [
1332
- {
1333
- name: "id",
1334
- type: "TEXT",
1335
- primaryKey: true,
1336
- notNull: true
1337
- },
1338
- {
1339
- name: "name",
1340
- type: "TEXT",
1341
- notNull: true
1342
- },
1343
- {
1344
- name: "enabled",
1345
- type: "BOOLEAN",
1346
- notNull: true
1347
- },
1348
- {
1349
- name: "placement",
1350
- type: "TEXT",
1351
- notNull: true
1352
- },
1353
- {
1354
- name: "updatedAt",
1355
- type: "INTEGER",
1356
- notNull: true
1357
- },
1358
- (
1359
- /** The FULL block, Zod-validated on read; the scalars above are indexed
1360
- * projections for the list view. */
1361
- {
1362
- name: "block",
1363
- type: "JSON",
1364
- notNull: true
1365
- })
1366
- ];
1367
- var CORE_BLOCKS_INDEXES = [{
1368
- name: "idx_core_blocks_enabled",
1369
- columns: ["enabled"]
1370
- }];
1371
1350
  /**
1372
1351
  * Rows one read asks for. A read that ANSWERS this many is not a loaded table:
1373
1352
  * rows past the limit would be absent, and an absent composition reads as a
@@ -1393,11 +1372,11 @@ function mayBeComposition(raw) {
1393
1372
  function parseErrorText(issues) {
1394
1373
  return issues.map((i) => `${i.path.map(String).join(".")}: ${i.message}`).join("; ");
1395
1374
  }
1396
- var CoreBlockStore = class {
1375
+ var CoreBlockStore = class CoreBlockStore {
1397
1376
  byId = /* @__PURE__ */ new Map();
1398
1377
  /** Rows that exist but do not parse and may be compositions — held for the composer, never dropped (D49). */
1399
1378
  unreadable = [];
1400
- store;
1379
+ blocks;
1401
1380
  logger;
1402
1381
  now;
1403
1382
  newId;
@@ -1405,16 +1384,15 @@ var CoreBlockStore = class {
1405
1384
  /** Consecutive failed reads — the warn is once per run of them, not once per retry. */
1406
1385
  failedLoads = 0;
1407
1386
  constructor(deps) {
1408
- this.store = deps.store;
1387
+ this.blocks = deps.blocks;
1409
1388
  this.logger = deps.logger;
1410
1389
  this.now = deps.now ?? (() => Date.now());
1411
1390
  this.newId = deps.newId ?? (() => randomUUID());
1412
1391
  }
1413
- static async declare(store) {
1414
- await store.declareCollection.mutate({
1415
- collection: CORE_BLOCKS_COLLECTION,
1416
- columns: [...CORE_BLOCKS_COLUMNS],
1417
- indexes: [...CORE_BLOCKS_INDEXES]
1392
+ static of(records, logger) {
1393
+ return new CoreBlockStore({
1394
+ blocks: records.kind(coreBlocksRecordKinds.blocks),
1395
+ logger
1418
1396
  });
1419
1397
  }
1420
1398
  /** True only after a `load()` that READ the table. The composer withdraws nothing otherwise (D49). */
@@ -1439,11 +1417,8 @@ var CoreBlockStore = class {
1439
1417
  */
1440
1418
  async load() {
1441
1419
  try {
1442
- const rows = await this.store.query.query({
1443
- collection: CORE_BLOCKS_COLLECTION,
1444
- filter: { limit: CORE_BLOCKS_LOAD_LIMIT }
1445
- });
1446
- if (rows.length >= 1e3) throw new Error(`core_blocks answered ${rows.length} rows, the read limit — rows past it would read as deleted`);
1420
+ const rows = (await this.blocks.query({ limit: CORE_BLOCKS_LOAD_LIMIT })).records;
1421
+ if (rows.length >= 1e3) throw new Error(`${CORE_BLOCKS_COLLECTION} answered ${rows.length} rows, the read limit — rows past it would read as deleted`);
1447
1422
  this.byId.clear();
1448
1423
  this.loaded = true;
1449
1424
  if (this.failedLoads > 0) {
@@ -1453,12 +1428,12 @@ var CoreBlockStore = class {
1453
1428
  let skipped = 0;
1454
1429
  const unreadable = [];
1455
1430
  for (const row of rows) {
1456
- const raw = row.data["block"];
1431
+ const raw = row.data.block;
1457
1432
  const parsed = CoreBlockSchema.safeParse(raw);
1458
1433
  if (!parsed.success) {
1459
1434
  skipped += 1;
1460
1435
  if (mayBeComposition(raw)) {
1461
- const name = row.data["name"];
1436
+ const name = row.data.name;
1462
1437
  unreadable.push({
1463
1438
  id: row.id,
1464
1439
  name: typeof name === "string" ? name : null,
@@ -1618,22 +1593,21 @@ var CoreBlockStore = class {
1618
1593
  async delete(blockId) {
1619
1594
  this.byId.delete(blockId);
1620
1595
  this.unreadable = this.unreadable.filter((u) => u.id !== blockId);
1621
- await this.store.delete.mutate({
1622
- collection: CORE_BLOCKS_COLLECTION,
1623
- key: blockId
1624
- });
1596
+ await this.blocks.delete(blockId);
1625
1597
  }
1626
1598
  async persist(block) {
1627
- await this.store.set.mutate({
1628
- collection: CORE_BLOCKS_COLLECTION,
1629
- key: block.id,
1630
- value: {
1631
- name: block.name,
1632
- enabled: block.enabled,
1633
- placement: block.placement,
1634
- updatedAt: block.updatedAt,
1635
- block
1636
- }
1599
+ const body = {
1600
+ name: block.name,
1601
+ enabled: block.enabled,
1602
+ placement: block.placement,
1603
+ updatedAt: block.updatedAt,
1604
+ block
1605
+ };
1606
+ const parsed = coreBlocksRecordKinds.blocks.schema.safeParse(body);
1607
+ if (!parsed.success) return;
1608
+ await this.blocks.put({
1609
+ id: block.id,
1610
+ data: parsed.data
1637
1611
  });
1638
1612
  }
1639
1613
  /**
@@ -2257,14 +2231,13 @@ var CoreBlocksAddon = class extends BaseAddon {
2257
2231
  async onInitialize() {
2258
2232
  const settingsStore = this.ctx.api?.settingsStore;
2259
2233
  if (!settingsStore) throw new Error("core-blocks: settings-store API not available — refusing to register the cap");
2260
- await CoreBlockStore.declare(settingsStore);
2261
- await BlockSettingsStore.declare(settingsStore);
2262
- this.store = new CoreBlockStore({
2263
- store: settingsStore,
2264
- logger: this.ctx.logger.child("store")
2265
- });
2234
+ const records = this.ctx.records;
2235
+ if (records === void 0) throw new Error("core-blocks needs ctx.records on the hub");
2236
+ await records.declare(coreBlocksRecordKinds);
2237
+ this.store = CoreBlockStore.of(records, this.ctx.logger.child("store"));
2266
2238
  this.prefs = new BlockSettingsStore({
2267
2239
  store: settingsStore,
2240
+ legacySettings: BlockSettingsStore.legacyKindOf(records),
2268
2241
  keychainFor: (owner) => this.ctx.secrets?.forOwner?.(owner) ?? null,
2269
2242
  onOrphaned: (blockId, refs) => this.ctx.logger.warn("core block settings: dropped keychain refs could not be deleted", { meta: {
2270
2243
  blockId,
@@ -2650,4 +2623,4 @@ async function loadTranspiler(logger) {
2650
2623
  }
2651
2624
  }
2652
2625
  //#endregion
2653
- export { CoreBlocksAddon, loadBlockTypeDefs as a, createAddonSettingsStore as c, blockAddonId as d, blockIdFromAddonId as f, compileBlock as i, BlockSupervisor as l, removeBlockPackage as m, CORE_BLOCKS_COLLECTION as n, BlockSettingsStore as o, materializeBlock as p, CoreBlockStore as r, CORE_BLOCK_SETTINGS_COLLECTION as s, extractSettingsSchema as t, BLOCK_ADDON_PREFIX as u };
2626
+ export { CoreBlocksAddon, BlockSettingsStore as a, CORE_BLOCK_SETTINGS_COLLECTION as c, blockAddonId as d, blockIdFromAddonId as f, loadBlockTypeDefs as i, BlockSupervisor as l, removeBlockPackage as m, CoreBlockStore as n, createAddonSettingsStore as o, materializeBlock as p, compileBlock as r, CORE_BLOCKS_COLLECTION as s, extractSettingsSchema as t, BLOCK_ADDON_PREFIX as u };
@@ -1,2 +1,2 @@
1
- import { CoreBlocksAddon, a as loadBlockTypeDefs, d as blockAddonId, f as blockIdFromAddonId, i as compileBlock, l as BlockSupervisor, m as removeBlockPackage, n as CORE_BLOCKS_COLLECTION, o as BlockSettingsStore, p as materializeBlock, r as CoreBlockStore, s as CORE_BLOCK_SETTINGS_COLLECTION, t as extractSettingsSchema, u as BLOCK_ADDON_PREFIX } from "./core-blocks.addon.mjs";
1
+ import { CoreBlocksAddon, a as BlockSettingsStore, c as CORE_BLOCK_SETTINGS_COLLECTION, d as blockAddonId, f as blockIdFromAddonId, i as loadBlockTypeDefs, l as BlockSupervisor, m as removeBlockPackage, n as CoreBlockStore, p as materializeBlock, r as compileBlock, s as CORE_BLOCKS_COLLECTION, t as extractSettingsSchema, u as BLOCK_ADDON_PREFIX } from "./core-blocks.addon.mjs";
2
2
  export { BLOCK_ADDON_PREFIX, BlockSettingsStore, BlockSupervisor, CORE_BLOCKS_COLLECTION, CORE_BLOCK_SETTINGS_COLLECTION, CoreBlockStore, CoreBlocksAddon, CoreBlocksAddon as default, blockAddonId, blockIdFromAddonId, compileBlock, extractSettingsSchema, loadBlockTypeDefs, materializeBlock, removeBlockPackage };