@camstack/system 1.2.88 → 1.2.90

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 (53) hide show
  1. package/dist/addon-runner.js +52 -6
  2. package/dist/addon-runner.mjs +52 -6
  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 +1 -1
  8. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  9. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
  10. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
  11. package/dist/builtins/console-logging/index.js +1 -1
  12. package/dist/builtins/console-logging/index.mjs +1 -1
  13. package/dist/builtins/core-blocks/core-blocks.addon.js +1 -1
  14. package/dist/builtins/core-blocks/core-blocks.addon.mjs +1 -1
  15. package/dist/builtins/device-manager/device-manager.addon.js +1 -1
  16. package/dist/builtins/device-manager/device-manager.addon.mjs +1 -1
  17. package/dist/builtins/doorbell/virtual-doorbell.addon.js +1 -1
  18. package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +1 -1
  19. package/dist/builtins/hub-forwarder/index.js +1 -1
  20. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  21. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  22. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  23. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  24. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  25. package/dist/builtins/local-network/local-network.addon.js +1 -1
  26. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  27. package/dist/builtins/loki-logging/index.js +1 -1
  28. package/dist/builtins/loki-logging/index.mjs +1 -1
  29. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  30. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  31. package/dist/builtins/platform-probe/index.js +1 -1
  32. package/dist/builtins/platform-probe/index.mjs +1 -1
  33. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  34. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  35. package/dist/builtins/snapshot/index.js +1 -1
  36. package/dist/builtins/snapshot/index.mjs +1 -1
  37. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  38. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  39. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +1 -1
  40. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +1 -1
  41. package/dist/builtins/storage-orchestrator/index.mjs +1 -1
  42. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +47 -3
  43. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +46 -3
  44. package/dist/builtins/system-config/system-config.addon.js +1 -1
  45. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  46. package/dist/builtins/winston-logging/index.js +1 -1
  47. package/dist/builtins/winston-logging/index.mjs +1 -1
  48. package/dist/{dist-B4WyhfjH.js → dist-CYqL8oZq.js} +2121 -37
  49. package/dist/{dist-DlDY9mQO.mjs → dist-DMhxx5Kr.mjs} +2121 -37
  50. package/dist/index.js +2 -46
  51. package/dist/index.mjs +2 -46
  52. package/dist/kernel/moleculer/init-watchdog.d.ts +60 -0
  53. package/package.json +1 -1
@@ -108,6 +108,42 @@ function registerFrameworkResolver(frameworkDir) {
108
108
  data: { frameworkDir }
109
109
  });
110
110
  }
111
+ /**
112
+ * Start warning if `initialize()` has not returned within `firstMs`.
113
+ *
114
+ * The caller MUST `clear()` in a `finally`, so a throwing initialize (which the
115
+ * runner turns into `process.exit(1)`) does not keep the timer alive.
116
+ */
117
+ function startInitWatchdog(options) {
118
+ const now = options.now ?? Date.now;
119
+ const firstMs = options.firstMs ?? 6e4;
120
+ const repeatMs = options.repeatMs ?? 3e5;
121
+ const startedAt = now();
122
+ let timer;
123
+ let cleared = false;
124
+ const schedule = (ms) => {
125
+ timer = setTimeout(fire, ms);
126
+ timer.unref?.();
127
+ };
128
+ function fire() {
129
+ if (cleared) return;
130
+ const elapsedMs = now() - startedAt;
131
+ options.warn(`addon "${options.addonId}" initialize() has not returned after ${Math.round(elapsedMs / 1e3)}s — its capability manifest is NOT published, so every caller of ${options.declaredCapabilities.length > 0 ? options.declaredCapabilities.join(", ") : "(none declared)"} sees "no provider registered"`, {
132
+ addonId: options.addonId,
133
+ elapsedMs,
134
+ unpublishedCapabilities: [...options.declaredCapabilities]
135
+ });
136
+ schedule(repeatMs);
137
+ }
138
+ schedule(firstMs);
139
+ return { clear() {
140
+ cleared = true;
141
+ if (timer !== void 0) {
142
+ clearTimeout(timer);
143
+ timer = void 0;
144
+ }
145
+ } };
146
+ }
111
147
  //#endregion
112
148
  //#region src/kernel/moleculer/child-cap-dispatch.ts
113
149
  /** Type guard narrowing a dynamically-read provider member to a callable method. */
@@ -447,12 +483,10 @@ async function main() {
447
483
  "metrics-provider",
448
484
  "platform-probe"
449
485
  ]);
486
+ /** The capability names a manifest declares, whichever form it uses. */
487
+ const declaredCapabilityNames = (decl) => (decl.capabilities ?? []).map((cap) => typeof cap === "string" ? cap : cap.name);
450
488
  const infraPriority = (decl) => {
451
- const caps = decl.capabilities ?? [];
452
- for (const cap of caps) {
453
- const name = typeof cap === "string" ? cap : cap.name;
454
- if (INFRA_CAP_NAMES.has(name)) return 0;
455
- }
489
+ for (const name of declaredCapabilityNames(decl)) if (INFRA_CAP_NAMES.has(name)) return 0;
456
490
  return 1;
457
491
  };
458
492
  loadedModules.sort((a, b) => infraPriority(a.declaration) - infraPriority(b.declaration));
@@ -585,7 +619,19 @@ async function main() {
585
619
  }
586
620
  await require_manifest_python_deps.installManifestPythonDeps(declaration, spec.addonDir, context.deps, context.logger);
587
621
  const registeredProviders = /* @__PURE__ */ new Map();
588
- const initResult = (0, _camstack_types_addon.normalizeAddonInitResult)(await addon.initialize(context));
622
+ const initWatchdog = startInitWatchdog({
623
+ addonId: spec.addonId,
624
+ declaredCapabilities: declaredCapabilityNames(declaration),
625
+ warn: (message, meta) => {
626
+ runnerLog.warn(message, { meta });
627
+ }
628
+ });
629
+ let initResult;
630
+ try {
631
+ initResult = (0, _camstack_types_addon.normalizeAddonInitResult)(await addon.initialize(context));
632
+ } finally {
633
+ initWatchdog.clear();
634
+ }
589
635
  for (const reg of initResult?.providers ?? []) {
590
636
  const capName = reg.capability.name;
591
637
  registeredProviders.set(capName, reg.provider);
@@ -104,6 +104,42 @@ function registerFrameworkResolver(frameworkDir) {
104
104
  data: { frameworkDir }
105
105
  });
106
106
  }
107
+ /**
108
+ * Start warning if `initialize()` has not returned within `firstMs`.
109
+ *
110
+ * The caller MUST `clear()` in a `finally`, so a throwing initialize (which the
111
+ * runner turns into `process.exit(1)`) does not keep the timer alive.
112
+ */
113
+ function startInitWatchdog(options) {
114
+ const now = options.now ?? Date.now;
115
+ const firstMs = options.firstMs ?? 6e4;
116
+ const repeatMs = options.repeatMs ?? 3e5;
117
+ const startedAt = now();
118
+ let timer;
119
+ let cleared = false;
120
+ const schedule = (ms) => {
121
+ timer = setTimeout(fire, ms);
122
+ timer.unref?.();
123
+ };
124
+ function fire() {
125
+ if (cleared) return;
126
+ const elapsedMs = now() - startedAt;
127
+ options.warn(`addon "${options.addonId}" initialize() has not returned after ${Math.round(elapsedMs / 1e3)}s — its capability manifest is NOT published, so every caller of ${options.declaredCapabilities.length > 0 ? options.declaredCapabilities.join(", ") : "(none declared)"} sees "no provider registered"`, {
128
+ addonId: options.addonId,
129
+ elapsedMs,
130
+ unpublishedCapabilities: [...options.declaredCapabilities]
131
+ });
132
+ schedule(repeatMs);
133
+ }
134
+ schedule(firstMs);
135
+ return { clear() {
136
+ cleared = true;
137
+ if (timer !== void 0) {
138
+ clearTimeout(timer);
139
+ timer = void 0;
140
+ }
141
+ } };
142
+ }
107
143
  //#endregion
108
144
  //#region src/kernel/moleculer/child-cap-dispatch.ts
109
145
  /** Type guard narrowing a dynamically-read provider member to a callable method. */
@@ -443,12 +479,10 @@ async function main() {
443
479
  "metrics-provider",
444
480
  "platform-probe"
445
481
  ]);
482
+ /** The capability names a manifest declares, whichever form it uses. */
483
+ const declaredCapabilityNames = (decl) => (decl.capabilities ?? []).map((cap) => typeof cap === "string" ? cap : cap.name);
446
484
  const infraPriority = (decl) => {
447
- const caps = decl.capabilities ?? [];
448
- for (const cap of caps) {
449
- const name = typeof cap === "string" ? cap : cap.name;
450
- if (INFRA_CAP_NAMES.has(name)) return 0;
451
- }
485
+ for (const name of declaredCapabilityNames(decl)) if (INFRA_CAP_NAMES.has(name)) return 0;
452
486
  return 1;
453
487
  };
454
488
  loadedModules.sort((a, b) => infraPriority(a.declaration) - infraPriority(b.declaration));
@@ -581,7 +615,19 @@ async function main() {
581
615
  }
582
616
  await installManifestPythonDeps(declaration, spec.addonDir, context.deps, context.logger);
583
617
  const registeredProviders = /* @__PURE__ */ new Map();
584
- const initResult = normalizeAddonInitResult(await addon.initialize(context));
618
+ const initWatchdog = startInitWatchdog({
619
+ addonId: spec.addonId,
620
+ declaredCapabilities: declaredCapabilityNames(declaration),
621
+ warn: (message, meta) => {
622
+ runnerLog.warn(message, { meta });
623
+ }
624
+ });
625
+ let initResult;
626
+ try {
627
+ initResult = normalizeAddonInitResult(await addon.initialize(context));
628
+ } finally {
629
+ initWatchdog.clear();
630
+ }
585
631
  for (const reg of initResult?.providers ?? []) {
586
632
  const capName = reg.capability.name;
587
633
  registeredProviders.set(capName, reg.provider);
@@ -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-B4WyhfjH.js");
6
+ const require_dist = require("../../dist-CYqL8oZq.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 { Ut as EventCategory, _t as BaseAddon, gt as errMsg, v as addonPagesCapability } from "../../dist-DlDY9mQO.mjs";
1
+ import { Ut as EventCategory, _t as BaseAddon, gt as errMsg, v as addonPagesCapability } from "../../dist-DMhxx5Kr.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-B4WyhfjH.js");
6
+ const require_dist = require("../../dist-CYqL8oZq.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 { Ut as EventCategory, _t as BaseAddon, b as addonWidgetsCapability, gt as errMsg } from "../../dist-DlDY9mQO.mjs";
1
+ import { Ut as EventCategory, _t as BaseAddon, b as addonWidgetsCapability, gt as errMsg } from "../../dist-DMhxx5Kr.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
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-B4WyhfjH.js");
6
+ const require_dist = require("../../dist-CYqL8oZq.js");
7
7
  //#region src/builtins/alerts/prune-policy.ts
8
8
  /**
9
9
  * Ids older than `cutoffMs`, oldest first.
@@ -1,4 +1,4 @@
1
- import { At as createEvent, Ut as EventCategory, _t as BaseAddon, gt as errMsg, n as AlertSchema, x as alertsCapability } from "../../dist-DlDY9mQO.mjs";
1
+ import { At as createEvent, Ut as EventCategory, _t as BaseAddon, gt as errMsg, n as AlertSchema, x as alertsCapability } from "../../dist-DMhxx5Kr.mjs";
2
2
  //#region src/builtins/alerts/prune-policy.ts
3
3
  /**
4
4
  * Ids older than `cutoffMs`, oldest first.
@@ -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-B4WyhfjH.js");
6
+ const require_dist = require("../../dist-CYqL8oZq.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  let buffer = require("buffer");
9
9
  let node_fs_promises = require("node:fs/promises");
@@ -1,4 +1,4 @@
1
- import { C as backupCapability, Ut as EventCategory, _t as BaseAddon } from "../../dist-DlDY9mQO.mjs";
1
+ import { C as backupCapability, Ut as EventCategory, _t as BaseAddon } from "../../dist-DMhxx5Kr.mjs";
2
2
  import { randomBytes, randomUUID } from "node:crypto";
3
3
  import { Buffer as Buffer$1 } from "buffer";
4
4
  import * as fsp from "node:fs/promises";
@@ -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-B4WyhfjH.js");
6
+ const require_dist = require("../../dist-CYqL8oZq.js");
7
7
  const require_formatter = require("../../formatter-DqAKDlvN.js");
8
8
  //#region src/builtins/console-logging/console-destination.ts
9
9
  var LEVEL_RANK = {
@@ -1,4 +1,4 @@
1
- import { J as logDestinationCapability, _t as BaseAddon } from "../../dist-DlDY9mQO.mjs";
1
+ import { J as logDestinationCapability, _t as BaseAddon } from "../../dist-DMhxx5Kr.mjs";
2
2
  import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
3
3
  //#region src/builtins/console-logging/console-destination.ts
4
4
  var LEVEL_RANK = {
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_chunk = require("../../chunk-Cek0wNdY.js");
3
- const require_dist = require("../../dist-B4WyhfjH.js");
3
+ const require_dist = require("../../dist-CYqL8oZq.js");
4
4
  let node_crypto = require("node:crypto");
5
5
  let node_fs_promises = require("node:fs/promises");
6
6
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -1,4 +1,4 @@
1
- import { D as coreBlockIdFromAddonId, E as coreBlockAddonId, O as coreBlocksCapability, _t as BaseAddon, c as CoreBlockSchema, l as DeclaredDevices, o as CORE_BLOCKS_ADDON_ID, s as CORE_BLOCK_ADDON_PREFIX } from "../../dist-DlDY9mQO.mjs";
1
+ import { D as coreBlockIdFromAddonId, E as coreBlockAddonId, O as coreBlocksCapability, _t as BaseAddon, c as CoreBlockSchema, l as DeclaredDevices, o as CORE_BLOCKS_ADDON_ID, s as CORE_BLOCK_ADDON_PREFIX } from "../../dist-DMhxx5Kr.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import * as fs from "node:fs/promises";
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
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-B4WyhfjH.js");
6
+ const require_dist = require("../../dist-CYqL8oZq.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  let _camstack_types_node = require("@camstack/types/node");
9
9
  //#region src/builtins/device-manager/adoption-job-engine.ts
@@ -1,4 +1,4 @@
1
- import { Ct as DeviceType, Et as WELL_KNOWN_TAB_MAP, Ft as isDeviceConfigCap, Ht as sleep, I as enumerateItemArrayFields, L as enumerateSchemaFields, M as deviceStateCapability, N as deviceStatusCapability, Q as normalizeUnit, St as DeviceRole, T as buildStreamParamsConfigSchema, Ut as EventCategory, _t as BaseAddon, a as CAP_NAMES_WITH_STATUS, et as parseStreamParamsFormPatch, gt as errMsg, j as deviceManagerCapability, p as STREAM_PROFILE_META, rt as runtimeStatePolicyFor, t as ALL_CAPABILITY_DEFINITIONS, u as DeviceStatusSchema, xt as DeviceFeature } from "../../dist-DlDY9mQO.mjs";
1
+ import { Ct as DeviceType, Et as WELL_KNOWN_TAB_MAP, Ft as isDeviceConfigCap, Ht as sleep, I as enumerateItemArrayFields, L as enumerateSchemaFields, M as deviceStateCapability, N as deviceStatusCapability, Q as normalizeUnit, St as DeviceRole, T as buildStreamParamsConfigSchema, Ut as EventCategory, _t as BaseAddon, a as CAP_NAMES_WITH_STATUS, et as parseStreamParamsFormPatch, gt as errMsg, j as deviceManagerCapability, p as STREAM_PROFILE_META, rt as runtimeStatePolicyFor, t as ALL_CAPABILITY_DEFINITIONS, u as DeviceStatusSchema, xt as DeviceFeature } from "../../dist-DMhxx5Kr.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { canonicalDeviceFingerprint } from "@camstack/types/node";
4
4
  //#region src/builtins/device-manager/adoption-job-engine.ts
@@ -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-B4WyhfjH.js");
6
+ const require_dist = require("../../dist-CYqL8oZq.js");
7
7
  //#region src/builtins/doorbell/trigger-engine.ts
8
8
  /**
9
9
  * Pure trigger logic for the virtual-doorbell builtin — edge detection over
@@ -1,4 +1,4 @@
1
- import { At as createEvent, Ct as DeviceType, P as doorbellCapability, U as isSameAddonId, Ut as EventCategory, _t as BaseAddon, gt as errMsg, w as bareAddonId } from "../../dist-DlDY9mQO.mjs";
1
+ import { At as createEvent, Ct as DeviceType, P as doorbellCapability, U as isSameAddonId, Ut as EventCategory, _t as BaseAddon, gt as errMsg, w as bareAddonId } from "../../dist-DMhxx5Kr.mjs";
2
2
  //#region src/builtins/doorbell/trigger-engine.ts
3
3
  /**
4
4
  * Pure trigger logic for the virtual-doorbell builtin — edge detection over
@@ -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-B4WyhfjH.js");
6
+ const require_dist = require("../../dist-CYqL8oZq.js");
7
7
  const require_formatter = require("../../formatter-DqAKDlvN.js");
8
8
  //#region src/builtins/hub-forwarder/hub-forwarder-destination.ts
9
9
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
@@ -1,4 +1,4 @@
1
- import { J as logDestinationCapability, _t as BaseAddon } from "../../dist-DlDY9mQO.mjs";
1
+ import { J as logDestinationCapability, _t as BaseAddon } from "../../dist-DMhxx5Kr.mjs";
2
2
  import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
3
3
  //#region src/builtins/hub-forwarder/hub-forwarder-destination.ts
4
4
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../chunk-Cek0wNdY.js");
3
- const require_dist = require("../../dist-B4WyhfjH.js");
3
+ const require_dist = require("../../dist-CYqL8oZq.js");
4
4
  //#region src/builtins/liveness-monitor/liveness-checks.ts
5
5
  var NO_DEVICES = "liveness:no-devices";
6
6
  var ALL_OFFLINE = "liveness:all-devices-offline";
@@ -1,4 +1,4 @@
1
- import { At as createEvent, Ut as EventCategory, _t as BaseAddon, gt as errMsg } from "../../dist-DlDY9mQO.mjs";
1
+ import { At as createEvent, Ut as EventCategory, _t as BaseAddon, gt as errMsg } from "../../dist-DMhxx5Kr.mjs";
2
2
  //#region src/builtins/liveness-monitor/liveness-checks.ts
3
3
  var NO_DEVICES = "liveness:no-devices";
4
4
  var ALL_OFFLINE = "liveness:all-devices-offline";
@@ -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-B4WyhfjH.js");
6
+ const require_dist = require("../../dist-CYqL8oZq.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  node_crypto = require_chunk.__toESM(node_crypto);
9
9
  let crypto$1 = require("crypto");
@@ -1,5 +1,5 @@
1
1
  import { i as __require, o as __toESM, t as __commonJSMin } from "../../chunk-CNf5ZN-e.mjs";
2
- import { S as authProviderCapability, _ as UserRecordSchema, _t as BaseAddon, m as ScopedTokenSchema, pt as userManagementCapability, r as ApiKeyRecordSchema } from "../../dist-DlDY9mQO.mjs";
2
+ import { S as authProviderCapability, _ as UserRecordSchema, _t as BaseAddon, m as ScopedTokenSchema, pt as userManagementCapability, r as ApiKeyRecordSchema } from "../../dist-DMhxx5Kr.mjs";
3
3
  import * as crypto$2 from "node:crypto";
4
4
  import { createHash, randomUUID, timingSafeEqual } from "node:crypto";
5
5
  import nodeCrypto from "crypto";
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_chunk = require("../../chunk-Cek0wNdY.js");
3
- const require_dist = require("../../dist-B4WyhfjH.js");
3
+ const require_dist = require("../../dist-CYqL8oZq.js");
4
4
  let node_os = require("node:os");
5
5
  node_os = require_chunk.__toESM(node_os);
6
6
  //#region src/builtins/local-network/local-network.addon.ts
@@ -1,4 +1,4 @@
1
- import { Ut as EventCategory, _t as BaseAddon, q as localNetworkCapability } from "../../dist-DlDY9mQO.mjs";
1
+ import { Ut as EventCategory, _t as BaseAddon, q as localNetworkCapability } from "../../dist-DMhxx5Kr.mjs";
2
2
  import * as os from "node:os";
3
3
  //#region src/builtins/local-network/local-network.addon.ts
4
4
  /**
@@ -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-B4WyhfjH.js");
6
+ const require_dist = require("../../dist-CYqL8oZq.js");
7
7
  //#region src/builtins/loki-logging/loki-payload.ts
8
8
  /**
9
9
  * Loki rejects a label name that is not a valid Prometheus label
@@ -1,4 +1,4 @@
1
- import { J as logDestinationCapability, _t as BaseAddon } from "../../dist-DlDY9mQO.mjs";
1
+ import { J as logDestinationCapability, _t as BaseAddon } from "../../dist-DMhxx5Kr.mjs";
2
2
  //#region src/builtins/loki-logging/loki-payload.ts
3
3
  /**
4
4
  * Loki rejects a label name that is not a valid Prometheus label
@@ -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-B4WyhfjH.js");
6
+ const require_dist = require("../../dist-CYqL8oZq.js");
7
7
  let node_child_process = require("node:child_process");
8
8
  let node_util = require("node:util");
9
9
  let node_os = require("node:os");
@@ -1,4 +1,4 @@
1
- import { At as createEvent, Ut as EventCategory, Z as metricsProviderCapability, _t as BaseAddon } from "../../dist-DlDY9mQO.mjs";
1
+ import { At as createEvent, Ut as EventCategory, Z as metricsProviderCapability, _t as BaseAddon } from "../../dist-DMhxx5Kr.mjs";
2
2
  import { execFile, execFileSync } from "node:child_process";
3
3
  import { promisify } from "node:util";
4
4
  import * as os from "node:os";
@@ -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-B4WyhfjH.js");
6
+ const require_dist = require("../../dist-CYqL8oZq.js");
7
7
  let node_child_process = require("node:child_process");
8
8
  let node_util = require("node:util");
9
9
  let node_os = require("node:os");
@@ -1,5 +1,5 @@
1
1
  import { o as __toESM } from "../../chunk-CNf5ZN-e.mjs";
2
- import { F as enumerateInferenceDevices, Mt as emitReadiness, Ut as EventCategory, _t as BaseAddon, gt as errMsg, ot as scoreRuntimes, tt as platformProbeCapability } from "../../dist-DlDY9mQO.mjs";
2
+ import { F as enumerateInferenceDevices, Mt as emitReadiness, Ut as EventCategory, _t as BaseAddon, gt as errMsg, ot as scoreRuntimes, tt as platformProbeCapability } from "../../dist-DMhxx5Kr.mjs";
3
3
  import { execFile } from "node:child_process";
4
4
  import { promisify } from "node:util";
5
5
  import * as os from "node:os";
@@ -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-B4WyhfjH.js");
6
+ const require_dist = require("../../dist-CYqL8oZq.js");
7
7
  //#region src/builtins/remote-access-orchestrator/enabled-providers-reconcile.ts
8
8
  /**
9
9
  * Reconcile the durable `enabledProviders` set against authoritative
@@ -1,4 +1,4 @@
1
- import { Ut as EventCategory, _t as BaseAddon } from "../../dist-DlDY9mQO.mjs";
1
+ import { Ut as EventCategory, _t as BaseAddon } from "../../dist-DMhxx5Kr.mjs";
2
2
  //#region src/builtins/remote-access-orchestrator/enabled-providers-reconcile.ts
3
3
  /**
4
4
  * Reconcile the durable `enabledProviders` set against authoritative
@@ -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-B4WyhfjH.js");
6
+ const require_dist = require("../../dist-CYqL8oZq.js");
7
7
  let zod = require("zod");
8
8
  let node_crypto = require("node:crypto");
9
9
  let _camstack_types_node = require("@camstack/types/node");
@@ -1,4 +1,4 @@
1
- import { Ct as DeviceType, It as nodePin, Ut as EventCategory, _t as BaseAddon, ct as snapshotCapability, ft as streamQualityLabel, gt as errMsg, i as BatteryStatusSchema, w as bareAddonId, xt as DeviceFeature } from "../../dist-DlDY9mQO.mjs";
1
+ import { Ct as DeviceType, It as nodePin, Ut as EventCategory, _t as BaseAddon, ct as snapshotCapability, ft as streamQualityLabel, gt as errMsg, i as BatteryStatusSchema, w as bareAddonId, xt as DeviceFeature } from "../../dist-DMhxx5Kr.mjs";
2
2
  import { z } from "zod";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { signExpiringUrl, verifyExpiringUrl } from "@camstack/types/node";
@@ -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-B4WyhfjH.js");
6
+ const require_dist = require("../../dist-CYqL8oZq.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  let node_fs_promises = require("node:fs/promises");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { _t as BaseAddon, dt as storageProviderCapability, z as filesystemBrowseCapability } from "../../dist-DlDY9mQO.mjs";
1
+ import { _t as BaseAddon, dt as storageProviderCapability, z as filesystemBrowseCapability } from "../../dist-DMhxx5Kr.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { mkdir, readdir, realpath, statfs } from "node:fs/promises";
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-B4WyhfjH.js");
6
+ const require_dist = require("../../dist-CYqL8oZq.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  let node_fs = require("node:fs");
9
9
  let node_module = require("node:module");
@@ -1,4 +1,4 @@
1
- import { A as decodeVectorBase64, Dt as asJsonObject, Rt as parseJsonUnknown, _t as BaseAddon, f as RUNTIME_DEFAULTS, gt as errMsg, ht as vectorStoreCapability, k as dataStoreProviderCapability, mt as vectorDimFromBase64, w as bareAddonId } from "../../dist-DlDY9mQO.mjs";
1
+ import { A as decodeVectorBase64, Dt as asJsonObject, Rt as parseJsonUnknown, _t as BaseAddon, f as RUNTIME_DEFAULTS, gt as errMsg, ht as vectorStoreCapability, k as dataStoreProviderCapability, mt as vectorDimFromBase64, w as bareAddonId } from "../../dist-DMhxx5Kr.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { statSync } from "node:fs";
@@ -1,2 +1,2 @@
1
- import { StorageOrchestratorAddon, n as StorageMigrationCoordinator, r as SqliteLocationStore, t as StorageOrchestratorService } from "./storage-orchestrator.addon.mjs";
1
+ import { StorageOrchestratorAddon, i as SqliteLocationStore, r as StorageMigrationCoordinator, t as StorageOrchestratorService } from "./storage-orchestrator.addon.mjs";
2
2
  export { SqliteLocationStore, StorageMigrationCoordinator, StorageOrchestratorAddon, StorageOrchestratorAddon as default, StorageOrchestratorService };
@@ -3,13 +3,12 @@ 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-B4WyhfjH.js");
6
+ const require_dist = require("../../dist-CYqL8oZq.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  let node_fs_promises = require("node:fs/promises");
9
9
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
10
10
  let node_path = require("node:path");
11
11
  node_path = require_chunk.__toESM(node_path);
12
- let _camstack_system = require("@camstack/system");
13
12
  //#region src/builtins/storage-orchestrator/location-store.ts
14
13
  var STORAGE_LOCATIONS = "storage_locations";
15
14
  /**
@@ -577,6 +576,50 @@ function isTerminal(job) {
577
576
  return job.phase === "done" || job.phase === "failed" || job.phase === "cancelled";
578
577
  }
579
578
  //#endregion
579
+ //#region src/kernel/storage-location-registry.ts
580
+ /**
581
+ * Aggregates per-addon {@link StorageLocationDeclaration} arrays into a single
582
+ * {@link StorageLocationRegistry}.
583
+ *
584
+ * Merge rules:
585
+ * - Declarations are keyed by `id`; iteration order follows first occurrence.
586
+ * - **First declarer wins** for metadata (`displayName`, `description`,
587
+ * `defaultsTo`): if a later addon declares the same `id`, its metadata is
588
+ * silently ignored.
589
+ * - **Cardinality conflict throws**: if two addons declare the same `id` with
590
+ * different `cardinality` values an `Error` is thrown immediately (message
591
+ * contains the words "cardinality" and the conflicting `id`).
592
+ *
593
+ * @param perAddon - One entry per addon; each entry is that addon's
594
+ * `storageLocations` declaration array.
595
+ */
596
+ function buildStorageLocationRegistry(perAddon) {
597
+ const map = /* @__PURE__ */ new Map();
598
+ for (const addonDeclarations of perAddon) for (const declaration of addonDeclarations) {
599
+ const existing = map.get(declaration.id);
600
+ if (existing !== void 0) {
601
+ if (existing.cardinality !== declaration.cardinality) throw new Error(`Storage location cardinality conflict for id "${declaration.id}": "${existing.cardinality}" (first declarer) vs "${declaration.cardinality}" (later declarer). All addons declaring the same storage location id must agree on cardinality.`);
602
+ continue;
603
+ }
604
+ map.set(declaration.id, declaration);
605
+ }
606
+ const frozen = Object.freeze([...map.values()]);
607
+ return {
608
+ get(id) {
609
+ return map.get(id);
610
+ },
611
+ has(id) {
612
+ return map.has(id);
613
+ },
614
+ cardinalityOf(id) {
615
+ return map.get(id)?.cardinality ?? null;
616
+ },
617
+ list() {
618
+ return frozen;
619
+ }
620
+ };
621
+ }
622
+ //#endregion
580
623
  //#region src/builtins/storage-orchestrator/data-store-dispatch.ts
581
624
  /**
582
625
  * Pick the engine to serve a call.
@@ -1925,7 +1968,7 @@ var StorageOrchestratorAddon = class extends require_dist.BaseAddon {
1925
1968
  async seedFromDeclarations() {
1926
1969
  if (!this.service) return;
1927
1970
  await this.refreshNodeLocalCache();
1928
- const registry = (0, _camstack_system.buildStorageLocationRegistry)(this.ctx.kernel.listStorageLocationDeclarations?.() ?? []);
1971
+ const registry = buildStorageLocationRegistry(this.ctx.kernel.listStorageLocationDeclarations?.() ?? []);
1929
1972
  this.service.setRegistry(registry);
1930
1973
  this.service.pruneUndeclaredSystemLocations();
1931
1974
  const mediaRoot = process.env.CAMSTACK_MEDIA_ROOT?.trim();
@@ -1963,3 +2006,4 @@ exports.StorageMigrationCoordinator = StorageMigrationCoordinator;
1963
2006
  exports.StorageOrchestratorAddon = StorageOrchestratorAddon;
1964
2007
  exports.default = StorageOrchestratorAddon;
1965
2008
  exports.StorageOrchestratorService = StorageOrchestratorService;
2009
+ exports.buildStorageLocationRegistry = buildStorageLocationRegistry;