@camstack/system 1.2.455 → 1.2.457

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 (133) hide show
  1. package/dist/addon-runner.js +96 -10
  2. package/dist/addon-runner.mjs +96 -10
  3. package/dist/{agent-https-CLWrOO3o.mjs → agent-https-CK9Z4sSR.mjs} +32 -5
  4. package/dist/{agent-https-CCvlRQKV.js → agent-https-CoyOZ3pC.js} +37 -4
  5. package/dist/auth/auth-manager.d.ts +9 -0
  6. package/dist/auth/legacy-token-tables.d.ts +16 -0
  7. package/dist/auth/user-management-internal.d.ts +9 -28
  8. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  9. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  10. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  11. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  12. package/dist/builtins/alerts/alerts.addon.js +2 -2
  13. package/dist/builtins/alerts/alerts.addon.mjs +2 -2
  14. package/dist/builtins/autotrack/index.js +1 -1
  15. package/dist/builtins/autotrack/index.mjs +1 -1
  16. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +2 -2
  17. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +2 -2
  18. package/dist/builtins/calendars/calendars.addon.js +1 -1
  19. package/dist/builtins/calendars/calendars.addon.mjs +1 -1
  20. package/dist/builtins/camera-grid/index.js +1 -1
  21. package/dist/builtins/camera-grid/index.mjs +1 -1
  22. package/dist/builtins/composer/composer.addon.js +2 -2
  23. package/dist/builtins/composer/composer.addon.mjs +2 -2
  24. package/dist/builtins/console-logging/console-destination.d.ts +1 -2
  25. package/dist/builtins/console-logging/index.js +1 -4
  26. package/dist/builtins/console-logging/index.mjs +1 -4
  27. package/dist/builtins/core-blocks/core-blocks.addon.js +2 -2
  28. package/dist/builtins/core-blocks/core-blocks.addon.mjs +2 -2
  29. package/dist/builtins/device-history/capture/capture-engine.d.ts +6 -0
  30. package/dist/builtins/device-history/device-history.addon.js +441 -83
  31. package/dist/builtins/device-history/device-history.addon.mjs +441 -83
  32. package/dist/builtins/device-history/query/history-query.d.ts +35 -9
  33. package/dist/builtins/device-history/query/point-shape.d.ts +33 -0
  34. package/dist/builtins/device-history/retention/retention.d.ts +1 -1
  35. package/dist/builtins/device-history/rollup/rollup-engine.d.ts +2 -0
  36. package/dist/builtins/device-history/rollup/rollup-math.d.ts +6 -0
  37. package/dist/builtins/device-history/store/history-store.d.ts +7 -0
  38. package/dist/builtins/device-history/store/series-registry.d.ts +26 -1
  39. package/dist/builtins/device-manager/device-manager.addon.js +1 -1
  40. package/dist/builtins/device-manager/device-manager.addon.mjs +1 -1
  41. package/dist/builtins/hub-forwarder/hub-forwarder-destination.d.ts +1 -2
  42. package/dist/builtins/hub-forwarder/index.js +1 -4
  43. package/dist/builtins/hub-forwarder/index.mjs +1 -4
  44. package/dist/builtins/keychain/index.js +4 -4
  45. package/dist/builtins/keychain/index.mjs +4 -4
  46. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  47. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  48. package/dist/builtins/local-auth/auth-schema.d.ts +4 -7
  49. package/dist/builtins/local-auth/local-auth.addon.d.ts +7 -8
  50. package/dist/builtins/local-auth/local-auth.addon.js +1086 -1329
  51. package/dist/builtins/local-auth/local-auth.addon.mjs +1085 -1326
  52. package/dist/builtins/local-auth/preferences-record-kinds.d.ts +27 -0
  53. package/dist/builtins/local-auth/record-kinds.d.ts +4 -3
  54. package/dist/builtins/local-auth/user-preferences-store.d.ts +56 -0
  55. package/dist/builtins/local-network/local-network.addon.d.ts +8 -0
  56. package/dist/builtins/local-network/local-network.addon.js +30 -5
  57. package/dist/builtins/local-network/local-network.addon.mjs +30 -5
  58. package/dist/builtins/loki-logging/index.js +323 -7
  59. package/dist/builtins/loki-logging/index.mjs +323 -7
  60. package/dist/builtins/loki-logging/loki-destination.d.ts +20 -3
  61. package/dist/builtins/loki-logging/loki-read.d.ts +51 -0
  62. package/dist/builtins/native-metrics/native-metrics.addon.js +290 -112
  63. package/dist/builtins/native-metrics/native-metrics.addon.mjs +290 -112
  64. package/dist/builtins/native-metrics/node-metrics-history-recorder.d.ts +106 -35
  65. package/dist/builtins/platform-probe/index.js +1 -1
  66. package/dist/builtins/platform-probe/index.mjs +1 -1
  67. package/dist/builtins/record-entries/index.js +1 -1
  68. package/dist/builtins/record-entries/index.mjs +1 -1
  69. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  70. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  71. package/dist/builtins/snapshot/index.js +1 -1
  72. package/dist/builtins/snapshot/index.mjs +1 -1
  73. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  74. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  75. package/dist/builtins/sqlite-storage/index.js +1 -1
  76. package/dist/builtins/sqlite-storage/index.mjs +1 -1
  77. package/dist/builtins/sqlite-storage/records/records-engine-types.d.ts +1 -0
  78. package/dist/builtins/sqlite-storage/records/records-provider.d.ts +13 -0
  79. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +52 -6
  80. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +52 -6
  81. package/dist/builtins/storage-orchestrator/location-history-recorder.d.ts +76 -0
  82. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.d.ts +9 -0
  83. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +144 -1
  84. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +144 -1
  85. package/dist/builtins/system-config/system-config.addon.js +3 -3
  86. package/dist/builtins/system-config/system-config.addon.mjs +3 -3
  87. package/dist/builtins/winston-logging/index.js +165 -3
  88. package/dist/builtins/winston-logging/index.mjs +165 -3
  89. package/dist/builtins/winston-logging/log-file-cursor.d.ts +12 -0
  90. package/dist/builtins/winston-logging/log-file-index-store.d.ts +11 -0
  91. package/dist/builtins/winston-logging/log-file-index.d.ts +77 -0
  92. package/dist/builtins/winston-logging/log-file-read-client.d.ts +44 -0
  93. package/dist/builtins/winston-logging/log-file-read-protocol.d.ts +41 -0
  94. package/dist/builtins/winston-logging/log-file-read-worker.d.ts +1 -0
  95. package/dist/builtins/winston-logging/log-file-reader.d.ts +51 -0
  96. package/dist/builtins/winston-logging/winston-destination.d.ts +20 -2
  97. package/dist/{composition-sources-CSzD5_qX.mjs → composition-sources-B_jeZDRJ.mjs} +1 -1
  98. package/dist/{composition-sources-BxUkLNSo.js → composition-sources-qKyvMAvc.js} +1 -1
  99. package/dist/{constants-DruwCkfp.js → constants-B_X9cWEK.js} +1 -1
  100. package/dist/{constants-DOlYt1t1.mjs → constants-cxKcZRMi.mjs} +1 -1
  101. package/dist/{device-ca-uFbTyY_o.mjs → device-ca-BB6nHAL5.mjs} +1 -1
  102. package/dist/{device-ca-QPBgfqVY.js → device-ca-CVK3YcR_.js} +1 -1
  103. package/dist/{dist-DjQ8C-ku.js → dist-C89nqNnn.js} +721 -154
  104. package/dist/{dist-BpSENkRJ.mjs → dist-Dhux90yB.mjs} +668 -155
  105. package/dist/file-host-worker.js +1 -1
  106. package/dist/file-host-worker.mjs +1 -1
  107. package/dist/{hub-mdns-ciao-DlgkFJVY.mjs → hub-mdns-ciao-B8olZqqd.mjs} +20 -13
  108. package/dist/{hub-mdns-ciao-Bkrvgnma.js → hub-mdns-ciao-DB1Y9agt.js} +20 -13
  109. package/dist/index.d.ts +3 -4
  110. package/dist/index.js +145 -24
  111. package/dist/index.mjs +138 -22
  112. package/dist/kernel/config-schema.d.ts +5 -0
  113. package/dist/kernel/moleculer/accessory-prune-gate.d.ts +55 -0
  114. package/dist/log-file-read-protocol-B7M3X3bT.mjs +785 -0
  115. package/dist/log-file-read-protocol-D0WcLbIV.js +817 -0
  116. package/dist/log-file-read-worker.js +64 -0
  117. package/dist/log-file-read-worker.mjs +64 -0
  118. package/dist/log-read-filter-Bi066jwU.js +134 -0
  119. package/dist/log-read-filter-D7Ev3zm-.mjs +93 -0
  120. package/dist/logging/log-manager.d.ts +10 -6
  121. package/dist/logging/log-read-filter.d.ts +43 -0
  122. package/dist/{phase6-declare-gate-DrmTtz7F.js → phase6-declare-gate-BO-_jLh_.js} +1 -1
  123. package/dist/{phase6-declare-gate-JQUqgQgq.mjs → phase6-declare-gate-x9ZCbQJP.mjs} +1 -1
  124. package/dist/{restore-archive-4OP0EYg6.js → restore-archive-4DOUR5Gu.js} +1 -1
  125. package/dist/{restore-archive-YFSJRtKy.mjs → restore-archive-DyOaPeAr.mjs} +1 -1
  126. package/dist/tls/cert-issue.d.ts +16 -1
  127. package/dist/tls/cert-manager.d.ts +6 -0
  128. package/dist/tls/index.d.ts +1 -1
  129. package/dist/{wal-maintenance-TyuOEVy1.mjs → wal-maintenance-BMiX6UIa.mjs} +0 -0
  130. package/dist/{wal-maintenance-Bl0ZKjVR.js → wal-maintenance-DVN-DiVP.js} +0 -0
  131. package/package.json +1 -1
  132. package/dist/auth/admin-token-manager.d.ts +0 -51
  133. package/dist/auth/scoped-token-manager.d.ts +0 -25
@@ -5467,6 +5467,67 @@ function createChildrenBatchLoader(opts) {
5467
5467
  } };
5468
5468
  }
5469
5469
  //#endregion
5470
+ //#region src/kernel/moleculer/accessory-prune-gate.ts
5471
+ function isSpecList(answer) {
5472
+ return Array.isArray(answer);
5473
+ }
5474
+ function classifyAccessoryRead(answer, ctx) {
5475
+ if (isSpecList(answer)) {
5476
+ if (!ctx.online) return {
5477
+ kind: "unknown",
5478
+ reason: "parent offline",
5479
+ children: answer
5480
+ };
5481
+ if (ctx.probedAt === 0) return {
5482
+ kind: "unknown",
5483
+ reason: "probe not yet completed",
5484
+ children: answer
5485
+ };
5486
+ return {
5487
+ kind: "successful",
5488
+ children: answer
5489
+ };
5490
+ }
5491
+ if (answer.kind === "unknown") return {
5492
+ kind: "unknown",
5493
+ reason: answer.reason,
5494
+ children: answer.known ?? []
5495
+ };
5496
+ return {
5497
+ kind: "successful",
5498
+ children: answer.children
5499
+ };
5500
+ }
5501
+ /** One per parent registration; in-memory on purpose (a restart starts over — the safe direction). */
5502
+ var AccessoryShrinkGate = class {
5503
+ /** childId → the probe (`lastProbedAt`) of the first successful read that lacked it. */
5504
+ #firstMissing = /* @__PURE__ */ new Map();
5505
+ /**
5506
+ * `missing` = the managed children a SUCCESSFUL read no longer lists. Never
5507
+ * call this for an unknown read.
5508
+ */
5509
+ decide(missing, probedAt) {
5510
+ const missingSet = new Set(missing);
5511
+ for (const id of [...this.#firstMissing.keys()]) if (!missingSet.has(id)) this.#firstMissing.delete(id);
5512
+ const prune = [];
5513
+ const deferred = [];
5514
+ for (const id of missing) {
5515
+ const first = this.#firstMissing.get(id);
5516
+ if (first !== void 0 && probedAt > first) {
5517
+ prune.push(id);
5518
+ this.#firstMissing.delete(id);
5519
+ continue;
5520
+ }
5521
+ if (first === void 0) this.#firstMissing.set(id, probedAt);
5522
+ deferred.push(id);
5523
+ }
5524
+ return {
5525
+ prune,
5526
+ deferred
5527
+ };
5528
+ }
5529
+ };
5530
+ //#endregion
5470
5531
  //#region src/kernel/moleculer/runtime-state-load.ts
5471
5532
  /** A device build refused because its runtime state could not be loaded. */
5472
5533
  var RuntimeStateLoadError = class extends Error {
@@ -6200,6 +6261,7 @@ function createBrokerDeviceManagerApi(opts) {
6200
6261
  throw err;
6201
6262
  }
6202
6263
  const lifecycleHost = device;
6264
+ const shrinkGate = new AccessoryShrinkGate();
6203
6265
  const runReconcile = async () => {
6204
6266
  try {
6205
6267
  await callDeviceManager(api, "registerDevice", {
@@ -6223,7 +6285,12 @@ function createBrokerDeviceManagerApi(opts) {
6223
6285
  });
6224
6286
  }
6225
6287
  if (typeof lifecycleHost.getAccessoryChildren !== "function") return;
6226
- const specs = lifecycleHost.getAccessoryChildren();
6288
+ const probedAt = device.runtimeState?.getCapState("feature-probe")?.lastProbedAt ?? 0;
6289
+ const read = classifyAccessoryRead(lifecycleHost.getAccessoryChildren(), {
6290
+ online: device.online,
6291
+ probedAt
6292
+ });
6293
+ const specs = read.children;
6227
6294
  const expected = new Set(specs.map((s) => `${device.stableId}-${s.stableIdSuffix}`));
6228
6295
  await runBounded(specs, ACCESSORY_SPAWN_CONCURRENCY, async (spec) => {
6229
6296
  try {
@@ -6241,24 +6308,42 @@ function createBrokerDeviceManagerApi(opts) {
6241
6308
  });
6242
6309
  }
6243
6310
  });
6244
- if ((device.runtimeState?.getCapState("feature-probe")?.lastProbedAt ?? 0) === 0 && specs.length === 0) {
6245
- opts.logger.debug("Accessory orphan reconciliation skipped — probe not yet completed", { tags: {
6246
- parentDeviceId: device.id,
6247
- parentStableId: device.stableId
6248
- } });
6311
+ if (read.kind === "unknown") {
6312
+ opts.logger.info("Accessory orphan reconciliation skipped — child list unknown", {
6313
+ tags: {
6314
+ deviceId: device.id,
6315
+ parentStableId: device.stableId
6316
+ },
6317
+ meta: {
6318
+ reason: read.reason,
6319
+ probedAt
6320
+ }
6321
+ });
6249
6322
  return;
6250
6323
  }
6251
6324
  try {
6252
- const currentChildren = await childrenLoader.load(device.id);
6253
- for (const child of currentChildren) {
6254
- if (child.linkDeviceId !== device.id) continue;
6255
- if (expected.has(child.stableId)) continue;
6325
+ const missing = (await childrenLoader.load(device.id)).filter((child) => child.linkDeviceId === device.id && !expected.has(child.stableId));
6326
+ const decision = shrinkGate.decide(missing.map((child) => child.id), probedAt);
6327
+ if (decision.deferred.length > 0) opts.logger.info("Accessory children missing from a complete read — kept until a later probe agrees", {
6328
+ tags: {
6329
+ deviceId: device.id,
6330
+ parentStableId: device.stableId
6331
+ },
6332
+ meta: {
6333
+ childDeviceIds: [...decision.deferred],
6334
+ probedAt
6335
+ }
6336
+ });
6337
+ const confirmed = new Set(decision.prune);
6338
+ for (const child of missing) {
6339
+ if (!confirmed.has(child.id)) continue;
6256
6340
  const live = registry.getById(child.id);
6257
6341
  try {
6258
6342
  if (live) await deviceApi.remove(child.id);
6259
6343
  else await callDeviceManager(api, "removeDevice", { deviceId: child.id });
6260
6344
  opts.logger.info("Removed orphan accessory child no longer in parent specs", {
6261
6345
  tags: {
6346
+ deviceId: child.id,
6262
6347
  parentDeviceId: device.id,
6263
6348
  parentStableId: device.stableId
6264
6349
  },
@@ -6271,6 +6356,7 @@ function createBrokerDeviceManagerApi(opts) {
6271
6356
  } catch (err) {
6272
6357
  opts.logger.warn("Failed to remove orphan accessory child", {
6273
6358
  tags: {
6359
+ deviceId: child.id,
6274
6360
  parentDeviceId: device.id,
6275
6361
  parentStableId: device.stableId,
6276
6362
  childDeviceId: child.id
@@ -5443,6 +5443,67 @@ function createChildrenBatchLoader(opts) {
5443
5443
  } };
5444
5444
  }
5445
5445
  //#endregion
5446
+ //#region src/kernel/moleculer/accessory-prune-gate.ts
5447
+ function isSpecList(answer) {
5448
+ return Array.isArray(answer);
5449
+ }
5450
+ function classifyAccessoryRead(answer, ctx) {
5451
+ if (isSpecList(answer)) {
5452
+ if (!ctx.online) return {
5453
+ kind: "unknown",
5454
+ reason: "parent offline",
5455
+ children: answer
5456
+ };
5457
+ if (ctx.probedAt === 0) return {
5458
+ kind: "unknown",
5459
+ reason: "probe not yet completed",
5460
+ children: answer
5461
+ };
5462
+ return {
5463
+ kind: "successful",
5464
+ children: answer
5465
+ };
5466
+ }
5467
+ if (answer.kind === "unknown") return {
5468
+ kind: "unknown",
5469
+ reason: answer.reason,
5470
+ children: answer.known ?? []
5471
+ };
5472
+ return {
5473
+ kind: "successful",
5474
+ children: answer.children
5475
+ };
5476
+ }
5477
+ /** One per parent registration; in-memory on purpose (a restart starts over — the safe direction). */
5478
+ var AccessoryShrinkGate = class {
5479
+ /** childId → the probe (`lastProbedAt`) of the first successful read that lacked it. */
5480
+ #firstMissing = /* @__PURE__ */ new Map();
5481
+ /**
5482
+ * `missing` = the managed children a SUCCESSFUL read no longer lists. Never
5483
+ * call this for an unknown read.
5484
+ */
5485
+ decide(missing, probedAt) {
5486
+ const missingSet = new Set(missing);
5487
+ for (const id of [...this.#firstMissing.keys()]) if (!missingSet.has(id)) this.#firstMissing.delete(id);
5488
+ const prune = [];
5489
+ const deferred = [];
5490
+ for (const id of missing) {
5491
+ const first = this.#firstMissing.get(id);
5492
+ if (first !== void 0 && probedAt > first) {
5493
+ prune.push(id);
5494
+ this.#firstMissing.delete(id);
5495
+ continue;
5496
+ }
5497
+ if (first === void 0) this.#firstMissing.set(id, probedAt);
5498
+ deferred.push(id);
5499
+ }
5500
+ return {
5501
+ prune,
5502
+ deferred
5503
+ };
5504
+ }
5505
+ };
5506
+ //#endregion
5446
5507
  //#region src/kernel/moleculer/runtime-state-load.ts
5447
5508
  /** A device build refused because its runtime state could not be loaded. */
5448
5509
  var RuntimeStateLoadError = class extends Error {
@@ -6176,6 +6237,7 @@ function createBrokerDeviceManagerApi(opts) {
6176
6237
  throw err;
6177
6238
  }
6178
6239
  const lifecycleHost = device;
6240
+ const shrinkGate = new AccessoryShrinkGate();
6179
6241
  const runReconcile = async () => {
6180
6242
  try {
6181
6243
  await callDeviceManager(api, "registerDevice", {
@@ -6199,7 +6261,12 @@ function createBrokerDeviceManagerApi(opts) {
6199
6261
  });
6200
6262
  }
6201
6263
  if (typeof lifecycleHost.getAccessoryChildren !== "function") return;
6202
- const specs = lifecycleHost.getAccessoryChildren();
6264
+ const probedAt = device.runtimeState?.getCapState("feature-probe")?.lastProbedAt ?? 0;
6265
+ const read = classifyAccessoryRead(lifecycleHost.getAccessoryChildren(), {
6266
+ online: device.online,
6267
+ probedAt
6268
+ });
6269
+ const specs = read.children;
6203
6270
  const expected = new Set(specs.map((s) => `${device.stableId}-${s.stableIdSuffix}`));
6204
6271
  await runBounded(specs, ACCESSORY_SPAWN_CONCURRENCY, async (spec) => {
6205
6272
  try {
@@ -6217,24 +6284,42 @@ function createBrokerDeviceManagerApi(opts) {
6217
6284
  });
6218
6285
  }
6219
6286
  });
6220
- if ((device.runtimeState?.getCapState("feature-probe")?.lastProbedAt ?? 0) === 0 && specs.length === 0) {
6221
- opts.logger.debug("Accessory orphan reconciliation skipped — probe not yet completed", { tags: {
6222
- parentDeviceId: device.id,
6223
- parentStableId: device.stableId
6224
- } });
6287
+ if (read.kind === "unknown") {
6288
+ opts.logger.info("Accessory orphan reconciliation skipped — child list unknown", {
6289
+ tags: {
6290
+ deviceId: device.id,
6291
+ parentStableId: device.stableId
6292
+ },
6293
+ meta: {
6294
+ reason: read.reason,
6295
+ probedAt
6296
+ }
6297
+ });
6225
6298
  return;
6226
6299
  }
6227
6300
  try {
6228
- const currentChildren = await childrenLoader.load(device.id);
6229
- for (const child of currentChildren) {
6230
- if (child.linkDeviceId !== device.id) continue;
6231
- if (expected.has(child.stableId)) continue;
6301
+ const missing = (await childrenLoader.load(device.id)).filter((child) => child.linkDeviceId === device.id && !expected.has(child.stableId));
6302
+ const decision = shrinkGate.decide(missing.map((child) => child.id), probedAt);
6303
+ if (decision.deferred.length > 0) opts.logger.info("Accessory children missing from a complete read — kept until a later probe agrees", {
6304
+ tags: {
6305
+ deviceId: device.id,
6306
+ parentStableId: device.stableId
6307
+ },
6308
+ meta: {
6309
+ childDeviceIds: [...decision.deferred],
6310
+ probedAt
6311
+ }
6312
+ });
6313
+ const confirmed = new Set(decision.prune);
6314
+ for (const child of missing) {
6315
+ if (!confirmed.has(child.id)) continue;
6232
6316
  const live = registry.getById(child.id);
6233
6317
  try {
6234
6318
  if (live) await deviceApi.remove(child.id);
6235
6319
  else await callDeviceManager(api, "removeDevice", { deviceId: child.id });
6236
6320
  opts.logger.info("Removed orphan accessory child no longer in parent specs", {
6237
6321
  tags: {
6322
+ deviceId: child.id,
6238
6323
  parentDeviceId: device.id,
6239
6324
  parentStableId: device.stableId
6240
6325
  },
@@ -6247,6 +6332,7 @@ function createBrokerDeviceManagerApi(opts) {
6247
6332
  } catch (err) {
6248
6333
  opts.logger.warn("Failed to remove orphan accessory child", {
6249
6334
  tags: {
6335
+ deviceId: child.id,
6250
6336
  parentDeviceId: device.id,
6251
6337
  parentStableId: device.stableId,
6252
6338
  childDeviceId: child.id
@@ -1,6 +1,6 @@
1
- import { Li as defineRecordKinds } from "./dist-BpSENkRJ.mjs";
1
+ import { Ki as defineRecordKinds } from "./dist-Dhux90yB.mjs";
2
2
  import { S as backdatedNotBefore, _ as NameConstraints, a as KeyUsageFlags, c as Pkcs10CertificateRequest, d as SubjectKeyIdentifierExtension, f as X509Certificate$1, g as GeneralSubtrees, h as GeneralSubtree, i as Extension, l as Pkcs10CertificateRequestGenerator, m as cryptoProvider, n as BasicConstraintsExtension, o as KeyUsagesExtension, p as X509CertificateGenerator, r as ExtendedKeyUsageExtension, s as PemConverter, t as AuthorityKeyIdentifierExtension, u as SubjectAlternativeNameExtension, v as GeneralName, x as AsnConvert } from "./x509.es-DK__ETIe.mjs";
3
- import { c as SERVER_AUTH_OID$1, r as MESH_CA_COMMON_NAME, s as MESH_CA_VALIDITY_DAYS, t as CLIENT_AUTH_OID } from "./constants-DOlYt1t1.mjs";
3
+ import { c as SERVER_AUTH_OID$1, r as MESH_CA_COMMON_NAME, s as MESH_CA_VALIDITY_DAYS, t as CLIENT_AUTH_OID } from "./constants-cxKcZRMi.mjs";
4
4
  import { z } from "zod";
5
5
  import { X509Certificate, createHash, createPrivateKey, randomBytes, webcrypto } from "node:crypto";
6
6
  import { writeOwnerOnlyFileSync } from "@camstack/types/node";
@@ -1200,6 +1200,31 @@ function collectCertIdentity(options) {
1200
1200
  cryptoProvider.set(webcrypto);
1201
1201
  /** Subject of the local root. Distinct from the leaf's CN by construction. */
1202
1202
  var CA_COMMON_NAME = "CamStack Local CA";
1203
+ /** Between {@link CA_COMMON_NAME} and the hub's name in a new root's subject. */
1204
+ var CA_HUB_NAME_SEPARATOR = " — ";
1205
+ /** X.520 `ub-common-name`: the most characters a CN may carry. */
1206
+ var X509_COMMON_NAME_MAX_LENGTH = 64;
1207
+ /** C0 controls, DEL and the C1 range. */
1208
+ function isControlCodePoint(code) {
1209
+ return code <= 31 || code >= 127 && code <= 159;
1210
+ }
1211
+ /**
1212
+ * The subject CN of a NEW local root: `CamStack Local CA — <hub name>`, so two hubs'
1213
+ * roots installed on one phone can be told apart in its settings. The name is
1214
+ * sanitised for a CN (controls removed, whitespace collapsed) and cut so the whole
1215
+ * CN stays within 64 characters. An absent or unusable name, or one that is just
1216
+ * the product's own name, yields the plain {@link CA_COMMON_NAME}.
1217
+ *
1218
+ * Only a root being CREATED is named: an existing root is never reissued to rename
1219
+ * it, since every device that trusts it would have to install it again.
1220
+ */
1221
+ function localCaCommonName(hubName) {
1222
+ if (hubName === void 0) return CA_COMMON_NAME;
1223
+ const cleaned = [...hubName].map((char) => isControlCodePoint(char.codePointAt(0) ?? 0) ? " " : char).join("").replace(/\s+/gu, " ").trim();
1224
+ if (cleaned === "" || cleaned.toLowerCase() === "camstack") return CA_COMMON_NAME;
1225
+ const room = X509_COMMON_NAME_MAX_LENGTH - 17 - 3;
1226
+ return `${CA_COMMON_NAME}${CA_HUB_NAME_SEPARATOR}${[...cleaned].slice(0, room).join("").trimEnd()}`;
1227
+ }
1203
1228
  var MS_PER_DAY = 864e5;
1204
1229
  /**
1205
1230
  * Expiry of a served leaf. Browsers cap the TOTAL span (notBefore to notAfter) at 397 days, so
@@ -1261,8 +1286,10 @@ function subjectAltNames(identity) {
1261
1286
  * It carries a CRITICAL `nameConstraints` extension (D873): private address
1262
1287
  * ranges and local-only DNS names, plus `hostnames` (the hub's own single-label
1263
1288
  * names at creation). A leaked key therefore cannot vouch for a public site.
1289
+ *
1290
+ * `commonName` is the subject CN, from {@link localCaCommonName}.
1264
1291
  */
1265
- async function generateCa(now, hostnames = []) {
1292
+ async function generateCa(now, hostnames = [], commonName = CA_COMMON_NAME) {
1266
1293
  const keys = await webcrypto.subtle.generateKey(SIGNING_ALGORITHM, true, ["sign", "verify"]);
1267
1294
  const extensions = [
1268
1295
  new BasicConstraintsExtension(true, 0, true),
@@ -1272,7 +1299,7 @@ async function generateCa(now, hostnames = []) {
1272
1299
  ];
1273
1300
  const cert = await X509CertificateGenerator.createSelfSigned({
1274
1301
  serialNumber: freshSerial(),
1275
- name: `CN=${CA_COMMON_NAME}`,
1302
+ name: [{ CN: [commonName] }],
1276
1303
  notBefore: backdatedNotBefore(now),
1277
1304
  notAfter: new Date(now.getTime() + CA_VALIDITY_DAYS * MS_PER_DAY),
1278
1305
  keys,
@@ -1627,4 +1654,4 @@ function pemDigest(pem) {
1627
1654
  return createHash("sha256").update(pem).digest("hex").slice(0, 16);
1628
1655
  }
1629
1656
  //#endregion
1630
- export { generateMeshKeyPair as $, isConstrainedCa as A, systemConfigRecordKinds as B, MAX_LEAF_VALIDITY_DAYS as C, PERMITTED_DNS_SUFFIXES as D, reasonRequiresNewCa as E, AGENT_HTTPS_NAMES_COLLECTION as F, describeMeshLeaf as G, MESH_NODE_CERTIFICATES_COLUMNS as H, AGENT_HTTPS_NAMES_COLUMNS as I, caFingerprint as J, getProcessMeshCertificateRegistry as K, AgentHttpsNames as L, permitsIdentity as M, permitsName as N, PERMITTED_IP_RANGES as O, readNameConstraints as P, generateMeshCa as Q, getProcessAgentHttpsNames as R, LEAF_RENEWAL_WINDOW_DAYS as S, evaluateExistingCert as T, MeshCertificateRegistry as U, MESH_NODE_CERTIFICATES_COLLECTION as V, RENEWAL_ABANDONED as W, createMeshCsrPem as X, caFingerprintCompact as Y, exportMeshPrivateKeyPem as Z, issueLeaf as _, collectAgentNames as a, systemHostFacts as b, installAgentHttps as c, issueAgentHttpsLeaf as d, isValidAgentNodeId as et, loadAgentHttps as f, generateCa as g, CA_COMMON_NAME as h, certificateNames as i, subjectCn as it, isLocalOnlyHostname as j, buildNameConstraintSet as k, isContainerBridgeAddress as l, pinnedHttpsCaFingerprint as m, acceptAgentSans as n, issueMeshLeafFromCsr as nt, createAgentHttpsRequest as o, pemDigest as p, setProcessMeshCertificateRegistry as q, agentHttpsPaths as r, loadMeshCa as rt, describeHttpsLeaf as s, AgentHttpsInstallError as t, issueMeshLeafForNode as tt, isPrivateAddress as u, loadCa as v, SERVER_AUTH_OID as w, CA_VALIDITY_DAYS as x, collectCertIdentity as y, setProcessAgentHttpsNames as z };
1657
+ export { generateMeshCa as $, buildNameConstraintSet as A, setProcessAgentHttpsNames as B, LEAF_RENEWAL_WINDOW_DAYS as C, reasonRequiresNewCa as D, evaluateExistingCert as E, readNameConstraints as F, RENEWAL_ABANDONED as G, MESH_NODE_CERTIFICATES_COLLECTION as H, AGENT_HTTPS_NAMES_COLLECTION as I, setProcessMeshCertificateRegistry as J, describeMeshLeaf as K, AGENT_HTTPS_NAMES_COLUMNS as L, isLocalOnlyHostname as M, permitsIdentity as N, PERMITTED_DNS_SUFFIXES as O, permitsName as P, exportMeshPrivateKeyPem as Q, AgentHttpsNames as R, CA_VALIDITY_DAYS as S, SERVER_AUTH_OID as T, MESH_NODE_CERTIFICATES_COLUMNS as U, systemConfigRecordKinds as V, MeshCertificateRegistry as W, caFingerprintCompact as X, caFingerprint as Y, createMeshCsrPem as Z, issueLeaf as _, collectAgentNames as a, subjectCn as at, collectCertIdentity as b, installAgentHttps as c, issueAgentHttpsLeaf as d, generateMeshKeyPair as et, loadAgentHttps as f, generateCa as g, CA_COMMON_NAME as h, certificateNames as i, loadMeshCa as it, isConstrainedCa as j, PERMITTED_IP_RANGES as k, isContainerBridgeAddress as l, pinnedHttpsCaFingerprint as m, acceptAgentSans as n, issueMeshLeafForNode as nt, createAgentHttpsRequest as o, pemDigest as p, getProcessMeshCertificateRegistry as q, agentHttpsPaths as r, issueMeshLeafFromCsr as rt, describeHttpsLeaf as s, AgentHttpsInstallError as t, isValidAgentNodeId as tt, isPrivateAddress as u, loadCa as v, MAX_LEAF_VALIDITY_DAYS as w, systemHostFacts as x, localCaCommonName as y, getProcessAgentHttpsNames as z };
@@ -1,7 +1,7 @@
1
1
  const require_chunk = require("./chunk-Cek0wNdY.js");
2
- const require_dist = require("./dist-DjQ8C-ku.js");
2
+ const require_dist = require("./dist-C89nqNnn.js");
3
3
  const require_x509_es = require("./x509.es-C4cOo48M.js");
4
- const require_constants = require("./constants-DruwCkfp.js");
4
+ const require_constants = require("./constants-B_X9cWEK.js");
5
5
  let zod = require("zod");
6
6
  let node_crypto = require("node:crypto");
7
7
  let _camstack_types_node = require("@camstack/types/node");
@@ -1202,6 +1202,31 @@ function collectCertIdentity(options) {
1202
1202
  require_x509_es.cryptoProvider.set(node_crypto.webcrypto);
1203
1203
  /** Subject of the local root. Distinct from the leaf's CN by construction. */
1204
1204
  var CA_COMMON_NAME = "CamStack Local CA";
1205
+ /** Between {@link CA_COMMON_NAME} and the hub's name in a new root's subject. */
1206
+ var CA_HUB_NAME_SEPARATOR = " — ";
1207
+ /** X.520 `ub-common-name`: the most characters a CN may carry. */
1208
+ var X509_COMMON_NAME_MAX_LENGTH = 64;
1209
+ /** C0 controls, DEL and the C1 range. */
1210
+ function isControlCodePoint(code) {
1211
+ return code <= 31 || code >= 127 && code <= 159;
1212
+ }
1213
+ /**
1214
+ * The subject CN of a NEW local root: `CamStack Local CA — <hub name>`, so two hubs'
1215
+ * roots installed on one phone can be told apart in its settings. The name is
1216
+ * sanitised for a CN (controls removed, whitespace collapsed) and cut so the whole
1217
+ * CN stays within 64 characters. An absent or unusable name, or one that is just
1218
+ * the product's own name, yields the plain {@link CA_COMMON_NAME}.
1219
+ *
1220
+ * Only a root being CREATED is named: an existing root is never reissued to rename
1221
+ * it, since every device that trusts it would have to install it again.
1222
+ */
1223
+ function localCaCommonName(hubName) {
1224
+ if (hubName === void 0) return CA_COMMON_NAME;
1225
+ const cleaned = [...hubName].map((char) => isControlCodePoint(char.codePointAt(0) ?? 0) ? " " : char).join("").replace(/\s+/gu, " ").trim();
1226
+ if (cleaned === "" || cleaned.toLowerCase() === "camstack") return CA_COMMON_NAME;
1227
+ const room = X509_COMMON_NAME_MAX_LENGTH - 17 - 3;
1228
+ return `${CA_COMMON_NAME}${CA_HUB_NAME_SEPARATOR}${[...cleaned].slice(0, room).join("").trimEnd()}`;
1229
+ }
1205
1230
  var MS_PER_DAY = 864e5;
1206
1231
  /**
1207
1232
  * Expiry of a served leaf. Browsers cap the TOTAL span (notBefore to notAfter) at 397 days, so
@@ -1263,8 +1288,10 @@ function subjectAltNames(identity) {
1263
1288
  * It carries a CRITICAL `nameConstraints` extension (D873): private address
1264
1289
  * ranges and local-only DNS names, plus `hostnames` (the hub's own single-label
1265
1290
  * names at creation). A leaked key therefore cannot vouch for a public site.
1291
+ *
1292
+ * `commonName` is the subject CN, from {@link localCaCommonName}.
1266
1293
  */
1267
- async function generateCa(now, hostnames = []) {
1294
+ async function generateCa(now, hostnames = [], commonName = CA_COMMON_NAME) {
1268
1295
  const keys = await node_crypto.webcrypto.subtle.generateKey(SIGNING_ALGORITHM, true, ["sign", "verify"]);
1269
1296
  const extensions = [
1270
1297
  new require_x509_es.BasicConstraintsExtension(true, 0, true),
@@ -1274,7 +1301,7 @@ async function generateCa(now, hostnames = []) {
1274
1301
  ];
1275
1302
  const cert = await require_x509_es.X509CertificateGenerator.createSelfSigned({
1276
1303
  serialNumber: freshSerial(),
1277
- name: `CN=${CA_COMMON_NAME}`,
1304
+ name: [{ CN: [commonName] }],
1278
1305
  notBefore: require_x509_es.backdatedNotBefore(now),
1279
1306
  notAfter: new Date(now.getTime() + CA_VALIDITY_DAYS * MS_PER_DAY),
1280
1307
  keys,
@@ -1911,6 +1938,12 @@ Object.defineProperty(exports, "loadMeshCa", {
1911
1938
  return loadMeshCa;
1912
1939
  }
1913
1940
  });
1941
+ Object.defineProperty(exports, "localCaCommonName", {
1942
+ enumerable: true,
1943
+ get: function() {
1944
+ return localCaCommonName;
1945
+ }
1946
+ });
1914
1947
  Object.defineProperty(exports, "pemDigest", {
1915
1948
  enumerable: true,
1916
1949
  get: function() {
@@ -59,7 +59,16 @@ export declare class AuthManager {
59
59
  * before signing, so nothing outside the schema is ever signed.
60
60
  */
61
61
  signCredentialToken(claims: CredentialTokenClaims): string;
62
+ /**
63
+ * Verify a session-family JWT: a login session, an account link, a bridge or
64
+ * challenge token. A MINTED token is refused here even though it carries a
65
+ * valid signature (D895): every surface that calls this wants a person's
66
+ * session, and a share link or a script's token must never pass for one.
67
+ * Minted tokens verify only through {@link verifyCredentialToken}.
68
+ */
62
69
  verifyToken(token: string): TokenPayload;
70
+ /** Verify a minted token (`auth.mintToken`): its signature AND its audience. Throws when invalid. */
71
+ verifyCredentialToken(token: string): CredentialTokenClaims;
63
72
  hashPassword(password: string): Promise<string>;
64
73
  comparePassword(password: string, hash: string): Promise<boolean>;
65
74
  /**
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The pre-D892 admin-token table — its LAYOUT only (D895).
3
+ *
4
+ * Nothing mints, reads or validates an admin token of the old format any more:
5
+ * an admin token is a `core-auth` `credential-tokens` row whose scopes hold
6
+ * `'*'`. The table stays declared so the storage layout is unchanged; its rows
7
+ * stay on disk until the operator drops them by hand.
8
+ */
9
+ import type { CollectionColumn } from "@camstack/types";
10
+ /**
11
+ * @durable class=config owner=local-auth
12
+ * write="none since D895 — the pre-D892 rows are kept on disk, read by nothing"
13
+ * retention="the operator drops the table by hand"
14
+ */
15
+ export declare const ADMIN_TOKENS_COLLECTION = "admin_tokens";
16
+ export declare const ADMIN_TOKENS_COLUMNS: readonly CollectionColumn[];
@@ -13,10 +13,10 @@
13
13
  * construction: a remote proxy of the provider simply has no such key, and
14
14
  * {@link getUserManagementInternal} answers `null` (the caller fails closed).
15
15
  */
16
- import type { AdminTokenRecord } from "./admin-token-manager.js";
17
16
  import type { AuthAuditEvent, AuthAuditRecord } from "./auth-audit-log.js";
18
17
  import type { DeviceCredentialManager } from "./device-credential-manager.js";
19
18
  import type { LoginSessionManager } from "./login-session-manager.js";
19
+ import type { UserPreferencesStore } from "../builtins/local-auth/user-preferences-store.js";
20
20
  /** Process-global, so every bundled copy of this module agrees on the key. */
21
21
  export declare const USER_MANAGEMENT_INTERNAL: unique symbol;
22
22
  export interface LinkExternalIdentityInput {
@@ -56,13 +56,6 @@ export interface UserManagementInternal {
56
56
  readonly sessions: LoginSessionsInternal;
57
57
  /** Change a password and end the user's other sessions (and pre-session tokens). */
58
58
  setPassword(input: SetPasswordInput): Promise<void>;
59
- /** Admin tokens (`csa_`) — the hub router gates creation (admin + re-auth). */
60
- readonly adminTokens: AdminTokensInternal;
61
- /**
62
- * Scoped tokens (`cst_`) — hub bulk revoke (`auth.revokeCredentials`).
63
- * `revoke` deletes the row; `false` when the id was already gone.
64
- */
65
- readonly scopedTokens: ScopedTokensInternal;
66
59
  /**
67
60
  * OAuth account-link sessions — hub bulk revoke. Active → mark revoked;
68
61
  * already revoked → delete the row (so "Remove revoked" clears the list).
@@ -72,28 +65,16 @@ export interface UserManagementInternal {
72
65
  readonly audit: AuthAuditInternal;
73
66
  /** Device certificates: enrollment legs, challenge, proof, renewal, liveness check. */
74
67
  readonly deviceCredentials: DeviceCredentialsInternal;
75
- }
76
- export interface ScopedTokensInternal {
77
- revoke(id: string): Promise<boolean>;
78
- }
79
- export interface OauthSessionsInternal {
80
- revoke(id: string): Promise<boolean>;
81
- }
82
- export interface AdminTokensInternal {
83
- create(input: {
84
- readonly createdBy: string;
85
- readonly name: string;
86
- readonly expiresAt: number;
87
- }): Promise<{
88
- readonly token: string;
89
- readonly record: AdminTokenRecord;
90
- }>;
91
68
  /**
92
- * The live token behind `token` — `null` when unknown, revoked, expired, or
93
- * when its creator no longer exists or is no longer an admin.
69
+ * Per-user account preferences (D894). Every method takes the OWNER's id
70
+ * first; the hub's `preferences.*` router stamps it from the principal.
71
+ * Absent on a provider that keeps none.
94
72
  */
95
- validate(token: string): Promise<AdminTokenRecord | null>;
96
- list(): Promise<readonly AdminTokenRecord[]>;
73
+ readonly preferences?: UserPreferencesInternal;
74
+ }
75
+ /** The account-preferences store, as the hub router uses it. */
76
+ export type UserPreferencesInternal = Pick<UserPreferencesStore, "get" | "put" | "delete" | "changedSince">;
77
+ export interface OauthSessionsInternal {
97
78
  revoke(id: string): Promise<boolean>;
98
79
  }
99
80
  export interface AuthAuditInternal {
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DjQ8C-ku.js");
6
+ const require_dist = require("../../dist-C89nqNnn.js");
7
7
  const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
8
8
  let node_crypto = require("node:crypto");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Kr as errMsg, dt as addonPagesCapability, qr as BaseAddon, ya as EventCategory } from "../../dist-BpSENkRJ.mjs";
1
+ import { Oa as EventCategory, ni as BaseAddon, ti as errMsg, yt as addonPagesCapability } from "../../dist-Dhux90yB.mjs";
2
2
  import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
3
3
  import { createHash, randomUUID } from "node:crypto";
4
4
  import * as path$1 from "node:path";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DjQ8C-ku.js");
6
+ const require_dist = require("../../dist-C89nqNnn.js");
7
7
  const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
8
8
  let node_crypto = require("node:crypto");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Kr as errMsg, pt as addonWidgetsCapability, qr as BaseAddon, ya as EventCategory } from "../../dist-BpSENkRJ.mjs";
1
+ import { Oa as EventCategory, ni as BaseAddon, ti as errMsg, xt as addonWidgetsCapability } from "../../dist-Dhux90yB.mjs";
2
2
  import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
3
3
  import { createHash, randomUUID } from "node:crypto";
4
4
  import * as path$1 from "node:path";
@@ -3,9 +3,9 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DjQ8C-ku.js");
6
+ const require_dist = require("../../dist-C89nqNnn.js");
7
7
  const require_read_all_rows$1 = require("../../read-all-rows-CVoO1ONM.js");
8
- const require_phase6_declare_gate = require("../../phase6-declare-gate-DrmTtz7F.js");
8
+ const require_phase6_declare_gate = require("../../phase6-declare-gate-BO-_jLh_.js");
9
9
  //#region src/builtins/alerts/alert-episode-policy.ts
10
10
  /**
11
11
  * When does an alert open a new EPISODE, and which edge of it is announced?
@@ -1,6 +1,6 @@
1
- import { Kr as errMsg, Li as defineRecordKinds, Ni as createEvent, gt as alertsCapability, ht as alertEpisodePayload, i as AlertSchema, mn as isAlertEpisodeSeverity, mt as alertEpisodeId, pn as isAlertEpisodeOpen, qr as BaseAddon, ya as EventCategory } from "../../dist-BpSENkRJ.mjs";
1
+ import { Ct as alertEpisodePayload, Hi as createEvent, Ki as defineRecordKinds, Oa as EventCategory, Sn as isAlertEpisodeSeverity, St as alertEpisodeId, i as AlertSchema, ni as BaseAddon, ti as errMsg, wt as alertsCapability, xn as isAlertEpisodeOpen } from "../../dist-Dhux90yB.mjs";
2
2
  import { t as require_read_all_rows } from "../../read-all-rows-TaPqdWNF.mjs";
3
- import { t as resolvePhase6UseRecordsPathForHub } from "../../phase6-declare-gate-JQUqgQgq.mjs";
3
+ import { t as resolvePhase6UseRecordsPathForHub } from "../../phase6-declare-gate-x9ZCbQJP.mjs";
4
4
  //#region src/builtins/alerts/alert-episode-policy.ts
5
5
  /**
6
6
  * When does an alert open a new EPISODE, and which edge of it is announced?
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DjQ8C-ku.js");
6
+ const require_dist = require("../../dist-C89nqNnn.js");
7
7
  //#region src/builtins/autotrack/autotrack-config.ts
8
8
  var DEFAULT_AUTOTRACK_LOOP_CONFIG = {
9
9
  deadZoneFraction: .5,
@@ -1,4 +1,4 @@
1
- import { F as FIRST_LEVEL_MACRO_CLASSES, Jn as ptzAutotrackCapability, Kr as errMsg, Wi as isEvent, bt as bareAddonId, qr as BaseAddon, ya as EventCategory } from "../../dist-BpSENkRJ.mjs";
1
+ import { $i as isEvent, L as FIRST_LEVEL_MACRO_CLASSES, Oa as EventCategory, Ot as bareAddonId, ni as BaseAddon, rr as ptzAutotrackCapability, ti as errMsg } from "../../dist-Dhux90yB.mjs";
2
2
  //#region src/builtins/autotrack/autotrack-config.ts
3
3
  var DEFAULT_AUTOTRACK_LOOP_CONFIG = {
4
4
  deadZoneFraction: .5,
@@ -3,9 +3,9 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DjQ8C-ku.js");
6
+ const require_dist = require("../../dist-C89nqNnn.js");
7
7
  const require_read_all_rows$1 = require("../../read-all-rows-CVoO1ONM.js");
8
- const require_restore_archive = require("../../restore-archive-4OP0EYg6.js");
8
+ const require_restore_archive = require("../../restore-archive-4DOUR5Gu.js");
9
9
  let node_crypto = require("node:crypto");
10
10
  let node_fs_promises = require("node:fs/promises");
11
11
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -1,6 +1,6 @@
1
- import { Pn as mayWriteToLocation, Qi as nodePin, ma as toNodeId, qr as BaseAddon, ya as EventCategory, yr as storageOccupancyCapability, yt as backupCapability } from "../../dist-BpSENkRJ.mjs";
1
+ import { Ca as toNodeId, Dt as backupCapability, Oa as EventCategory, Or as storageOccupancyCapability, Un as mayWriteToLocation, ni as BaseAddon, sa as nodePin } from "../../dist-Dhux90yB.mjs";
2
2
  import { t as require_read_all_rows } from "../../read-all-rows-TaPqdWNF.mjs";
3
- import { _ as parseBackupSecretKey, a as BackupSnapshotRefusedError, c as backupOrchestratorRecordKinds, d as BackupEncryptionKeyStore, g as generateBackupKeyPair, h as ENCRYPTED_BACKUP_SUFFIX, i as BackupCancelledError, l as backupRecordStoresOf, n as precheckRestoreKey, o as DEFAULT_BACKUP_DATABASES, p as BackupKeyFormatError, r as prepareRestoreArchive, s as SystemBackupService, u as BackupSeedMarkerStore } from "../../restore-archive-YFSJRtKy.mjs";
3
+ import { _ as parseBackupSecretKey, a as BackupSnapshotRefusedError, c as backupOrchestratorRecordKinds, d as BackupEncryptionKeyStore, g as generateBackupKeyPair, h as ENCRYPTED_BACKUP_SUFFIX, i as BackupCancelledError, l as backupRecordStoresOf, n as precheckRestoreKey, o as DEFAULT_BACKUP_DATABASES, p as BackupKeyFormatError, r as prepareRestoreArchive, s as SystemBackupService, u as BackupSeedMarkerStore } from "../../restore-archive-DyOaPeAr.mjs";
4
4
  import { randomUUID } from "node:crypto";
5
5
  import * as fsp from "node:fs/promises";
6
6
  import * as path$1 from "node:path";