@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
@@ -2895,9 +2895,10 @@ var PeerAnsweredError = class extends Error {
2895
2895
  * keychain owner-checks on this field, and until 2026-10-08 an unstamped
2896
2896
  * call let a child's own `callerAddonId` through untouched.
2897
2897
  *
2898
- * A hub in-process caller never reaches this function (`localProviderLink`
2899
- * calls the provider directly), which is the one place a stated identity is
2900
- * trusted. A non-object `args` (or `null`/array) is returned unchanged: there
2898
+ * Hub-main in-process contexts that bypass tRPC (addon-registry's stated
2899
+ * transports) never reach this function. Co-located broker/agent callers
2900
+ * stamp here inside `localProviderLink` before the zero-copy invoke.
2901
+ * A non-object `args` (or `null`/array) is returned unchanged: there
2901
2902
  * is nowhere to attach a key, and nowhere one could hide.
2902
2903
  */
2903
2904
  function stampCallerAddonId(args, callerAddonId) {
@@ -5690,6 +5691,9 @@ function getWorkerNativeCapProvider(capName, deviceId) {
5690
5691
  if (typeof raw !== "object" || Array.isArray(raw)) return void 0;
5691
5692
  return raw;
5692
5693
  }
5694
+ function deviceHasStreamSources(device) {
5695
+ return typeof Reflect.get(device, "getStreamSources") === "function";
5696
+ }
5693
5697
  function buildDeviceOpsProvider(device) {
5694
5698
  const assertMatch = (incoming) => {
5695
5699
  if (incoming !== device.id) throw new Error(`device-ops: deviceId mismatch — expected '${device.id}', got '${incoming}'`);
@@ -5697,9 +5701,8 @@ function buildDeviceOpsProvider(device) {
5697
5701
  return {
5698
5702
  getStreamSources: async (input) => {
5699
5703
  assertMatch(input.deviceId);
5700
- const maybeCamera = device;
5701
- if (typeof maybeCamera.getStreamSources !== "function") return [];
5702
- return [...await maybeCamera.getStreamSources()];
5704
+ if (!deviceHasStreamSources(device)) return [];
5705
+ return [...await device.getStreamSources()];
5703
5706
  },
5704
5707
  getConfigEntries: async (input) => {
5705
5708
  assertMatch(input.deviceId);
@@ -5749,7 +5752,7 @@ function createBrokerDeviceManagerApi(opts) {
5749
5752
  const { api, addonId, nodeId, eventBus, registry } = opts;
5750
5753
  const deviceSliceSource = (0, _camstack_types_addon.createEventBusSliceSource)({
5751
5754
  eventBus,
5752
- api
5755
+ api: (0, _camstack_types_addon.addonSliceHandleApi)(api)
5753
5756
  });
5754
5757
  let selfApi;
5755
5758
  const childrenLoader = createChildrenBatchLoader({
@@ -5837,15 +5840,14 @@ function createBrokerDeviceManagerApi(opts) {
5837
5840
  }
5838
5841
  const finalProvider = (() => {
5839
5842
  if (!cap.status || !cap.runtimeState || !runtimeStateRef) return provider;
5840
- const asRecord = provider;
5841
- if (typeof asRecord["getStatus"] === "function") return provider;
5843
+ if (typeof Reflect.get(provider, "getStatus") === "function") return provider;
5842
5844
  const rsRef = runtimeStateRef;
5843
5845
  const defaultGetStatus = async ({ deviceId: dId }) => {
5844
5846
  if (typeof dId === "number" && dId !== id) return null;
5845
5847
  return rsRef.getCapState(cap.name) ?? null;
5846
5848
  };
5847
5849
  return {
5848
- ...asRecord,
5850
+ ...provider,
5849
5851
  getStatus: defaultGetStatus
5850
5852
  };
5851
5853
  })();
@@ -7403,8 +7405,9 @@ function localProviderLink(resolver, observerOpts) {
7403
7405
  const fn = Reflect.get(provider, parsed.method);
7404
7406
  if (typeof fn !== "function") return next(opWithDefaults);
7405
7407
  if (observerOpts) recordCapUsage(observerOpts, parsed.capName, parsed.method);
7408
+ const localInput = _camstack_types_addon.CALLER_STAMPED_CAPABILITIES.includes(parsed.capName) ? stampCallerAddonId(opWithDefaults.input, observerOpts?.callerAddonId) : opWithDefaults.input;
7406
7409
  return observable((observer) => {
7407
- Promise.resolve(fn.call(provider, opWithDefaults.input)).then((data) => {
7410
+ Promise.resolve(fn.call(provider, localInput)).then((data) => {
7408
7411
  observer.next({ result: {
7409
7412
  type: "data",
7410
7413
  data
@@ -7421,7 +7424,7 @@ function localProviderLink(resolver, observerOpts) {
7421
7424
  function findServiceCandidates(broker, capName, method, forceServiceName) {
7422
7425
  const actionSuffix = capActionSuffix(capName, method);
7423
7426
  const bareAction = capBareAction(capName, method);
7424
- const services = broker.registry?.getServiceList?.({
7427
+ const services = Reflect.get(broker, "registry")?.getServiceList?.({
7425
7428
  onlyAvailable: true,
7426
7429
  withActions: true
7427
7430
  }) ?? [];
@@ -8455,7 +8458,11 @@ function createAddonPeerBytesFacility(args) {
8455
8458
  res.destroy();
8456
8459
  }, Math.max(1e3, Math.floor(stallMs / 4)));
8457
8460
  stallTimer.unref();
8458
- const ended = await Promise.race([(0, node_events.once)(stream, "end").then(() => true), (0, node_events.once)(res, "close").then(() => false)]).catch(() => false);
8461
+ const ended = await Promise.race([(0, node_events.once)(stream, "end").then(() => true), new Promise((resolve) => {
8462
+ res.once("close", () => {
8463
+ resolve(false);
8464
+ });
8465
+ })]).catch(() => false);
8459
8466
  clearInterval(stallTimer);
8460
8467
  if (ended) {
8461
8468
  args.logger.info("peer-bytes: body sent", {
@@ -8765,6 +8772,10 @@ var AddonDepsManager = class {
8765
8772
  };
8766
8773
  //#endregion
8767
8774
  //#region src/kernel/moleculer/event-bus.ts
8775
+ /** Documented boundary: CamStack brokers are always `createBroker` products. */
8776
+ function asBrokerLike(broker) {
8777
+ return broker;
8778
+ }
8768
8779
  /**
8769
8780
  * Topic prefix for clustered EventBus broadcasts. The `camstack.evt.`
8770
8781
  * namespace keeps our events disjoint from Moleculer internal events
@@ -8937,14 +8948,13 @@ function acceptInboundCrossNode(broker, category) {
8937
8948
  function registerEventBusService(broker) {
8938
8949
  if (eventBusServiceInstalled.has(broker)) return;
8939
8950
  eventBusServiceInstalled.add(broker);
8940
- const bkr = broker;
8941
8951
  try {
8942
- bkr.createService({
8952
+ broker.createService({
8943
8953
  name: "$event-bus",
8944
8954
  events: { [EVENT_TOPIC_WILDCARD](ctx) {
8945
8955
  const event = ctx.params;
8946
8956
  if (!event) return;
8947
- if (event.sourceNodeId === bkr.nodeID) return;
8957
+ if (event.sourceNodeId === broker.nodeID) return;
8948
8958
  if (!acceptInboundCrossNode(broker, event.category)) return;
8949
8959
  deliverShared(getSharedBusState(broker), event);
8950
8960
  } }
@@ -8952,7 +8962,7 @@ function registerEventBusService(broker) {
8952
8962
  } catch (err) {
8953
8963
  const msg = err instanceof Error ? err.message : String(err);
8954
8964
  try {
8955
- bkr.logger?.warn?.(`[event-bus] failed to register $event-bus service: ${msg}`);
8965
+ broker.logger?.warn?.(`[event-bus] failed to register $event-bus service: ${msg}`);
8956
8966
  } catch {}
8957
8967
  }
8958
8968
  }
@@ -8964,7 +8974,6 @@ function registerEventBusService(broker) {
8964
8974
  * nothing and `getRecent` returns `[]`. Events are one-shot everywhere else.
8965
8975
  */
8966
8976
  function getBrokerEventBus(broker, options) {
8967
- const bkr = broker;
8968
8977
  const state = getSharedBusState(broker, options?.retainRecent ?? false);
8969
8978
  registerEventBusService(broker);
8970
8979
  const warnTimestamps = (() => {
@@ -8979,19 +8988,19 @@ function getBrokerEventBus(broker, options) {
8979
8988
  emit(event) {
8980
8989
  const enriched = {
8981
8990
  ...event,
8982
- sourceNodeId: bkr.nodeID
8991
+ sourceNodeId: broker.nodeID
8983
8992
  };
8984
8993
  deliverShared(state, enriched);
8985
8994
  const topic = clusterEventTopic(event.category);
8986
8995
  try {
8987
- bkr.broadcast(topic, enriched);
8996
+ broker.broadcast(topic, enriched);
8988
8997
  } catch (err) {
8989
8998
  const cat = event.category;
8990
8999
  const now = Date.now();
8991
9000
  if (now - (warnTimestamps.get(`broadcast:${cat}`) ?? 0) > 6e4) {
8992
9001
  warnTimestamps.set(`broadcast:${cat}`, now);
8993
9002
  try {
8994
- bkr.logger?.warn?.(`[event-bus] broker.broadcast('${topic}') failed for category="${cat}" nodeID="${bkr.nodeID}": ${err instanceof Error ? err.message : String(err)}`);
9003
+ broker.logger?.warn?.(`[event-bus] broker.broadcast('${topic}') failed for category="${cat}" nodeID="${broker.nodeID}": ${err instanceof Error ? err.message : String(err)}`);
8995
9004
  } catch {}
8996
9005
  }
8997
9006
  }
@@ -9141,7 +9150,7 @@ function setPreferredProvider(capabilityName, addonId, brokerNodeId = "hub") {
9141
9150
  */
9142
9151
  var bindingSubscriberInstalled = /* @__PURE__ */ new Set();
9143
9152
  function ensureBindingSubscription(broker) {
9144
- const bkr = broker;
9153
+ const bkr = asBrokerLike(broker);
9145
9154
  if (bindingSubscriberInstalled.has(bkr.nodeID)) return;
9146
9155
  bindingSubscriberInstalled.add(bkr.nodeID);
9147
9156
  const handler = (payload) => {
@@ -9201,7 +9210,7 @@ var READINESS_RECONCILE_INTERVAL_MS = 6e4;
9201
9210
  * entries already observed locally.
9202
9211
  */
9203
9212
  function getOrInitReadinessRegistry(broker, eventBus, logger) {
9204
- const bkr = broker;
9213
+ const bkr = asBrokerLike(broker);
9205
9214
  const existing = brokerReadinessRegistries.get(broker);
9206
9215
  if (existing) return existing;
9207
9216
  const registry = new _camstack_types_addon.ReadinessRegistry({
@@ -9329,8 +9338,8 @@ function getOrInitReadinessRegistryForClient(client, eventBus, logger, nodeId) {
9329
9338
  function buildCapabilitiesAccess(broker, localRegs) {
9330
9339
  const collectRemoteEntries = (capName) => {
9331
9340
  if (broker === void 0) return [];
9332
- const bkr = broker;
9333
- const rawRegistry = Reflect.get(bkr, "registry");
9341
+ const bkr = asBrokerLike(broker);
9342
+ const rawRegistry = Reflect.get(broker, "registry");
9334
9343
  if (rawRegistry === null || typeof rawRegistry !== "object" || !("getServiceList" in rawRegistry)) return [];
9335
9344
  const services = rawRegistry.getServiceList({
9336
9345
  onlyAvailable: true,
@@ -9413,7 +9422,7 @@ function buildCapabilitiesAccess(broker, localRegs) {
9413
9422
  * consumers (e.g. `await maybeProxy` mustn't hang).
9414
9423
  */
9415
9424
  function createRemoteProviderProxy(broker, serviceName, capName, nodeId, methods) {
9416
- const bkr = broker;
9425
+ const bkr = asBrokerLike(broker);
9417
9426
  const dispatcher = Object.create(null);
9418
9427
  for (const method of methods) dispatcher[method] = (input) => {
9419
9428
  return bkr.call(`${serviceName}.${capName}.${method}`, serializeTypedArrays(input), {
@@ -10152,7 +10161,7 @@ function createRunnerDeviceSettings(client, addonId, before = async () => {}) {
10152
10161
  //#region src/kernel/moleculer/addon-context-factory.ts
10153
10162
  /** This runtime's node id, regardless of mode (broker.nodeID or the UDS child nodeId). */
10154
10163
  function runtimeNodeId(runtime) {
10155
- return runtime.mode === "broker" ? runtime.broker.nodeID : runtime.nodeId;
10164
+ return runtime.mode === "broker" ? asBrokerLike(runtime.broker).nodeID : runtime.nodeId;
10156
10165
  }
10157
10166
  /**
10158
10167
  * Adapt a Moleculer ServiceBroker to the camstack-types `IClusterBroker`
@@ -10162,7 +10171,7 @@ function runtimeNodeId(runtime) {
10162
10171
  * forward through a thin object instead of casting at the boundary.
10163
10172
  */
10164
10173
  function adaptBrokerToCluster(broker) {
10165
- const bkr = broker;
10174
+ const bkr = asBrokerLike(broker);
10166
10175
  return {
10167
10176
  get nodeID() {
10168
10177
  return bkr.nodeID;
@@ -10306,7 +10315,7 @@ async function buildAddonContext(runtime, declaration, dataDir, options) {
10306
10315
  const scopedEventBus = runtime.mode === "broker" ? createBrokerEventBus(runtime.broker, addonId) : createUdsEventBus(runtime.client, addonId);
10307
10316
  const deviceSliceSource = (0, _camstack_types_addon.createEventBusSliceSource)({
10308
10317
  eventBus: scopedEventBus,
10309
- api
10318
+ api: (0, _camstack_types_addon.addonSliceHandleApi)(api)
10310
10319
  });
10311
10320
  const workerDisposerChain = new _camstack_types_addon.DisposerChain({ onError: (err, index) => {
10312
10321
  scopedLogger.error(`Disposer #${index} threw during teardown`, { meta: { error: err instanceof Error ? err.message : String(err) } });
@@ -10499,11 +10508,11 @@ async function buildAddonContext(runtime, declaration, dataDir, options) {
10499
10508
  }),
10500
10509
  kernel: (() => {
10501
10510
  const streamProbe = runtime.mode === "broker" ? {
10502
- probe: (url, probeOptions) => runtime.broker.call("$stream-probe.probe", {
10511
+ probe: (url, probeOptions) => asBrokerLike(runtime.broker).call("$stream-probe.probe", {
10503
10512
  url,
10504
10513
  force: probeOptions?.force ?? false
10505
10514
  }),
10506
- probeField: (key, value) => runtime.broker.call("$stream-probe.probeField", {
10515
+ probeField: (key, value) => asBrokerLike(runtime.broker).call("$stream-probe.probeField", {
10507
10516
  key,
10508
10517
  value
10509
10518
  })
@@ -3,7 +3,7 @@ import * as fs from "node:fs";
3
3
  import { createReadStream, createWriteStream, existsSync, readFileSync, readdirSync } from "node:fs";
4
4
  import * as path from "node:path";
5
5
  import { dirname, isAbsolute, join } from "node:path";
6
- import { BOOT_RECOVERY_BACKOFF_MS, DATAPLANE_SECRET_HEADER, DEVICE_CHILDREN_BATCH_MAX, DeviceType, DisposerChain, ErrorI18nPayloadSchema, EventCategory, PEER_BYTES_CHUNK_BYTES, PEER_BYTES_MAX_OUTSTANDING, PEER_BYTES_STALL_MS, PEER_BYTES_TICKET_TTL_MS, ReadinessRegistry, ReadinessTimeoutError, asJsonObject, asString, collectZodSecretPaths, createDeviceProxy, createEventBusSliceSource, createRecordsAccess, createSecretsAccess, describeCustomActions, deviceOpsCapability, emitReadiness, errMsg, expandCapMethods, isCollectionArrayMethodName, isProviderOptionalMethodName, maskUrlCredentials, normalizeAddonInitResult, readErrorI18n, readNodePin, resolveSecretViewsIn, scopeKey, scrubKnownSecrets, withCapInputDefaults } from "@camstack/types/addon";
6
+ import { BOOT_RECOVERY_BACKOFF_MS, CALLER_STAMPED_CAPABILITIES, DATAPLANE_SECRET_HEADER, DEVICE_CHILDREN_BATCH_MAX, DeviceType, DisposerChain, ErrorI18nPayloadSchema, EventCategory, PEER_BYTES_CHUNK_BYTES, PEER_BYTES_MAX_OUTSTANDING, PEER_BYTES_STALL_MS, PEER_BYTES_TICKET_TTL_MS, ReadinessRegistry, ReadinessTimeoutError, addonSliceHandleApi, asJsonObject, asString, collectZodSecretPaths, createDeviceProxy, createEventBusSliceSource, createRecordsAccess, createSecretsAccess, describeCustomActions, deviceOpsCapability, emitReadiness, errMsg, expandCapMethods, isCollectionArrayMethodName, isProviderOptionalMethodName, maskUrlCredentials, normalizeAddonInitResult, readErrorI18n, readNodePin, resolveSecretViewsIn, scopeKey, scrubKnownSecrets, withCapInputDefaults } from "@camstack/types/addon";
7
7
  import { execFile } from "node:child_process";
8
8
  import { promisify } from "node:util";
9
9
  import * as os from "node:os";
@@ -2871,9 +2871,10 @@ var PeerAnsweredError = class extends Error {
2871
2871
  * keychain owner-checks on this field, and until 2026-10-08 an unstamped
2872
2872
  * call let a child's own `callerAddonId` through untouched.
2873
2873
  *
2874
- * A hub in-process caller never reaches this function (`localProviderLink`
2875
- * calls the provider directly), which is the one place a stated identity is
2876
- * trusted. A non-object `args` (or `null`/array) is returned unchanged: there
2874
+ * Hub-main in-process contexts that bypass tRPC (addon-registry's stated
2875
+ * transports) never reach this function. Co-located broker/agent callers
2876
+ * stamp here inside `localProviderLink` before the zero-copy invoke.
2877
+ * A non-object `args` (or `null`/array) is returned unchanged: there
2877
2878
  * is nowhere to attach a key, and nowhere one could hide.
2878
2879
  */
2879
2880
  function stampCallerAddonId(args, callerAddonId) {
@@ -5666,6 +5667,9 @@ function getWorkerNativeCapProvider(capName, deviceId) {
5666
5667
  if (typeof raw !== "object" || Array.isArray(raw)) return void 0;
5667
5668
  return raw;
5668
5669
  }
5670
+ function deviceHasStreamSources(device) {
5671
+ return typeof Reflect.get(device, "getStreamSources") === "function";
5672
+ }
5669
5673
  function buildDeviceOpsProvider(device) {
5670
5674
  const assertMatch = (incoming) => {
5671
5675
  if (incoming !== device.id) throw new Error(`device-ops: deviceId mismatch — expected '${device.id}', got '${incoming}'`);
@@ -5673,9 +5677,8 @@ function buildDeviceOpsProvider(device) {
5673
5677
  return {
5674
5678
  getStreamSources: async (input) => {
5675
5679
  assertMatch(input.deviceId);
5676
- const maybeCamera = device;
5677
- if (typeof maybeCamera.getStreamSources !== "function") return [];
5678
- return [...await maybeCamera.getStreamSources()];
5680
+ if (!deviceHasStreamSources(device)) return [];
5681
+ return [...await device.getStreamSources()];
5679
5682
  },
5680
5683
  getConfigEntries: async (input) => {
5681
5684
  assertMatch(input.deviceId);
@@ -5725,7 +5728,7 @@ function createBrokerDeviceManagerApi(opts) {
5725
5728
  const { api, addonId, nodeId, eventBus, registry } = opts;
5726
5729
  const deviceSliceSource = createEventBusSliceSource({
5727
5730
  eventBus,
5728
- api
5731
+ api: addonSliceHandleApi(api)
5729
5732
  });
5730
5733
  let selfApi;
5731
5734
  const childrenLoader = createChildrenBatchLoader({
@@ -5813,15 +5816,14 @@ function createBrokerDeviceManagerApi(opts) {
5813
5816
  }
5814
5817
  const finalProvider = (() => {
5815
5818
  if (!cap.status || !cap.runtimeState || !runtimeStateRef) return provider;
5816
- const asRecord = provider;
5817
- if (typeof asRecord["getStatus"] === "function") return provider;
5819
+ if (typeof Reflect.get(provider, "getStatus") === "function") return provider;
5818
5820
  const rsRef = runtimeStateRef;
5819
5821
  const defaultGetStatus = async ({ deviceId: dId }) => {
5820
5822
  if (typeof dId === "number" && dId !== id) return null;
5821
5823
  return rsRef.getCapState(cap.name) ?? null;
5822
5824
  };
5823
5825
  return {
5824
- ...asRecord,
5826
+ ...provider,
5825
5827
  getStatus: defaultGetStatus
5826
5828
  };
5827
5829
  })();
@@ -7379,8 +7381,9 @@ function localProviderLink(resolver, observerOpts) {
7379
7381
  const fn = Reflect.get(provider, parsed.method);
7380
7382
  if (typeof fn !== "function") return next(opWithDefaults);
7381
7383
  if (observerOpts) recordCapUsage(observerOpts, parsed.capName, parsed.method);
7384
+ const localInput = CALLER_STAMPED_CAPABILITIES.includes(parsed.capName) ? stampCallerAddonId(opWithDefaults.input, observerOpts?.callerAddonId) : opWithDefaults.input;
7382
7385
  return observable((observer) => {
7383
- Promise.resolve(fn.call(provider, opWithDefaults.input)).then((data) => {
7386
+ Promise.resolve(fn.call(provider, localInput)).then((data) => {
7384
7387
  observer.next({ result: {
7385
7388
  type: "data",
7386
7389
  data
@@ -7397,7 +7400,7 @@ function localProviderLink(resolver, observerOpts) {
7397
7400
  function findServiceCandidates(broker, capName, method, forceServiceName) {
7398
7401
  const actionSuffix = capActionSuffix(capName, method);
7399
7402
  const bareAction = capBareAction(capName, method);
7400
- const services = broker.registry?.getServiceList?.({
7403
+ const services = Reflect.get(broker, "registry")?.getServiceList?.({
7401
7404
  onlyAvailable: true,
7402
7405
  withActions: true
7403
7406
  }) ?? [];
@@ -8431,7 +8434,11 @@ function createAddonPeerBytesFacility(args) {
8431
8434
  res.destroy();
8432
8435
  }, Math.max(1e3, Math.floor(stallMs / 4)));
8433
8436
  stallTimer.unref();
8434
- const ended = await Promise.race([once(stream, "end").then(() => true), once(res, "close").then(() => false)]).catch(() => false);
8437
+ const ended = await Promise.race([once(stream, "end").then(() => true), new Promise((resolve) => {
8438
+ res.once("close", () => {
8439
+ resolve(false);
8440
+ });
8441
+ })]).catch(() => false);
8435
8442
  clearInterval(stallTimer);
8436
8443
  if (ended) {
8437
8444
  args.logger.info("peer-bytes: body sent", {
@@ -8741,6 +8748,10 @@ var AddonDepsManager = class {
8741
8748
  };
8742
8749
  //#endregion
8743
8750
  //#region src/kernel/moleculer/event-bus.ts
8751
+ /** Documented boundary: CamStack brokers are always `createBroker` products. */
8752
+ function asBrokerLike(broker) {
8753
+ return broker;
8754
+ }
8744
8755
  /**
8745
8756
  * Topic prefix for clustered EventBus broadcasts. The `camstack.evt.`
8746
8757
  * namespace keeps our events disjoint from Moleculer internal events
@@ -8913,14 +8924,13 @@ function acceptInboundCrossNode(broker, category) {
8913
8924
  function registerEventBusService(broker) {
8914
8925
  if (eventBusServiceInstalled.has(broker)) return;
8915
8926
  eventBusServiceInstalled.add(broker);
8916
- const bkr = broker;
8917
8927
  try {
8918
- bkr.createService({
8928
+ broker.createService({
8919
8929
  name: "$event-bus",
8920
8930
  events: { [EVENT_TOPIC_WILDCARD](ctx) {
8921
8931
  const event = ctx.params;
8922
8932
  if (!event) return;
8923
- if (event.sourceNodeId === bkr.nodeID) return;
8933
+ if (event.sourceNodeId === broker.nodeID) return;
8924
8934
  if (!acceptInboundCrossNode(broker, event.category)) return;
8925
8935
  deliverShared(getSharedBusState(broker), event);
8926
8936
  } }
@@ -8928,7 +8938,7 @@ function registerEventBusService(broker) {
8928
8938
  } catch (err) {
8929
8939
  const msg = err instanceof Error ? err.message : String(err);
8930
8940
  try {
8931
- bkr.logger?.warn?.(`[event-bus] failed to register $event-bus service: ${msg}`);
8941
+ broker.logger?.warn?.(`[event-bus] failed to register $event-bus service: ${msg}`);
8932
8942
  } catch {}
8933
8943
  }
8934
8944
  }
@@ -8940,7 +8950,6 @@ function registerEventBusService(broker) {
8940
8950
  * nothing and `getRecent` returns `[]`. Events are one-shot everywhere else.
8941
8951
  */
8942
8952
  function getBrokerEventBus(broker, options) {
8943
- const bkr = broker;
8944
8953
  const state = getSharedBusState(broker, options?.retainRecent ?? false);
8945
8954
  registerEventBusService(broker);
8946
8955
  const warnTimestamps = (() => {
@@ -8955,19 +8964,19 @@ function getBrokerEventBus(broker, options) {
8955
8964
  emit(event) {
8956
8965
  const enriched = {
8957
8966
  ...event,
8958
- sourceNodeId: bkr.nodeID
8967
+ sourceNodeId: broker.nodeID
8959
8968
  };
8960
8969
  deliverShared(state, enriched);
8961
8970
  const topic = clusterEventTopic(event.category);
8962
8971
  try {
8963
- bkr.broadcast(topic, enriched);
8972
+ broker.broadcast(topic, enriched);
8964
8973
  } catch (err) {
8965
8974
  const cat = event.category;
8966
8975
  const now = Date.now();
8967
8976
  if (now - (warnTimestamps.get(`broadcast:${cat}`) ?? 0) > 6e4) {
8968
8977
  warnTimestamps.set(`broadcast:${cat}`, now);
8969
8978
  try {
8970
- bkr.logger?.warn?.(`[event-bus] broker.broadcast('${topic}') failed for category="${cat}" nodeID="${bkr.nodeID}": ${err instanceof Error ? err.message : String(err)}`);
8979
+ broker.logger?.warn?.(`[event-bus] broker.broadcast('${topic}') failed for category="${cat}" nodeID="${broker.nodeID}": ${err instanceof Error ? err.message : String(err)}`);
8971
8980
  } catch {}
8972
8981
  }
8973
8982
  }
@@ -9117,7 +9126,7 @@ function setPreferredProvider(capabilityName, addonId, brokerNodeId = "hub") {
9117
9126
  */
9118
9127
  var bindingSubscriberInstalled = /* @__PURE__ */ new Set();
9119
9128
  function ensureBindingSubscription(broker) {
9120
- const bkr = broker;
9129
+ const bkr = asBrokerLike(broker);
9121
9130
  if (bindingSubscriberInstalled.has(bkr.nodeID)) return;
9122
9131
  bindingSubscriberInstalled.add(bkr.nodeID);
9123
9132
  const handler = (payload) => {
@@ -9177,7 +9186,7 @@ var READINESS_RECONCILE_INTERVAL_MS = 6e4;
9177
9186
  * entries already observed locally.
9178
9187
  */
9179
9188
  function getOrInitReadinessRegistry(broker, eventBus, logger) {
9180
- const bkr = broker;
9189
+ const bkr = asBrokerLike(broker);
9181
9190
  const existing = brokerReadinessRegistries.get(broker);
9182
9191
  if (existing) return existing;
9183
9192
  const registry = new ReadinessRegistry({
@@ -9305,8 +9314,8 @@ function getOrInitReadinessRegistryForClient(client, eventBus, logger, nodeId) {
9305
9314
  function buildCapabilitiesAccess(broker, localRegs) {
9306
9315
  const collectRemoteEntries = (capName) => {
9307
9316
  if (broker === void 0) return [];
9308
- const bkr = broker;
9309
- const rawRegistry = Reflect.get(bkr, "registry");
9317
+ const bkr = asBrokerLike(broker);
9318
+ const rawRegistry = Reflect.get(broker, "registry");
9310
9319
  if (rawRegistry === null || typeof rawRegistry !== "object" || !("getServiceList" in rawRegistry)) return [];
9311
9320
  const services = rawRegistry.getServiceList({
9312
9321
  onlyAvailable: true,
@@ -9389,7 +9398,7 @@ function buildCapabilitiesAccess(broker, localRegs) {
9389
9398
  * consumers (e.g. `await maybeProxy` mustn't hang).
9390
9399
  */
9391
9400
  function createRemoteProviderProxy(broker, serviceName, capName, nodeId, methods) {
9392
- const bkr = broker;
9401
+ const bkr = asBrokerLike(broker);
9393
9402
  const dispatcher = Object.create(null);
9394
9403
  for (const method of methods) dispatcher[method] = (input) => {
9395
9404
  return bkr.call(`${serviceName}.${capName}.${method}`, serializeTypedArrays(input), {
@@ -10128,7 +10137,7 @@ function createRunnerDeviceSettings(client, addonId, before = async () => {}) {
10128
10137
  //#region src/kernel/moleculer/addon-context-factory.ts
10129
10138
  /** This runtime's node id, regardless of mode (broker.nodeID or the UDS child nodeId). */
10130
10139
  function runtimeNodeId(runtime) {
10131
- return runtime.mode === "broker" ? runtime.broker.nodeID : runtime.nodeId;
10140
+ return runtime.mode === "broker" ? asBrokerLike(runtime.broker).nodeID : runtime.nodeId;
10132
10141
  }
10133
10142
  /**
10134
10143
  * Adapt a Moleculer ServiceBroker to the camstack-types `IClusterBroker`
@@ -10138,7 +10147,7 @@ function runtimeNodeId(runtime) {
10138
10147
  * forward through a thin object instead of casting at the boundary.
10139
10148
  */
10140
10149
  function adaptBrokerToCluster(broker) {
10141
- const bkr = broker;
10150
+ const bkr = asBrokerLike(broker);
10142
10151
  return {
10143
10152
  get nodeID() {
10144
10153
  return bkr.nodeID;
@@ -10282,7 +10291,7 @@ async function buildAddonContext(runtime, declaration, dataDir, options) {
10282
10291
  const scopedEventBus = runtime.mode === "broker" ? createBrokerEventBus(runtime.broker, addonId) : createUdsEventBus(runtime.client, addonId);
10283
10292
  const deviceSliceSource = createEventBusSliceSource({
10284
10293
  eventBus: scopedEventBus,
10285
- api
10294
+ api: addonSliceHandleApi(api)
10286
10295
  });
10287
10296
  const workerDisposerChain = new DisposerChain({ onError: (err, index) => {
10288
10297
  scopedLogger.error(`Disposer #${index} threw during teardown`, { meta: { error: err instanceof Error ? err.message : String(err) } });
@@ -10475,11 +10484,11 @@ async function buildAddonContext(runtime, declaration, dataDir, options) {
10475
10484
  }),
10476
10485
  kernel: (() => {
10477
10486
  const streamProbe = runtime.mode === "broker" ? {
10478
- probe: (url, probeOptions) => runtime.broker.call("$stream-probe.probe", {
10487
+ probe: (url, probeOptions) => asBrokerLike(runtime.broker).call("$stream-probe.probe", {
10479
10488
  url,
10480
10489
  force: probeOptions?.force ?? false
10481
10490
  }),
10482
- probeField: (key, value) => runtime.broker.call("$stream-probe.probeField", {
10491
+ probeField: (key, value) => asBrokerLike(runtime.broker).call("$stream-probe.probeField", {
10483
10492
  key,
10484
10493
  value
10485
10494
  })