@camstack/system 1.2.390 → 1.2.391

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 (503) hide show
  1. package/dist/addon/addon-api-factory.d.ts +30 -30
  2. package/dist/addon-routes/addon-route-registry.d.ts +31 -31
  3. package/dist/addon-runner.js +1 -1
  4. package/dist/addon-runner.mjs +1 -1
  5. package/dist/addon-utils.d.ts +22 -22
  6. package/dist/auth/admin-token-manager.d.ts +37 -67
  7. package/dist/auth/api-key-manager.d.ts +8 -8
  8. package/dist/auth/auth-audit-log.d.ts +29 -49
  9. package/dist/auth/auth-manager.d.ts +127 -126
  10. package/dist/auth/cidr.d.ts +8 -8
  11. package/dist/auth/external-identity-manager.d.ts +46 -34
  12. package/dist/auth/jwt-signing-key.d.ts +14 -14
  13. package/dist/auth/login-session-manager.d.ts +95 -135
  14. package/dist/auth/parse-record.d.ts +13 -13
  15. package/dist/auth/scope-matcher.d.ts +7 -7
  16. package/dist/auth/scoped-token-manager.d.ts +62 -62
  17. package/dist/auth/token-expiry.d.ts +49 -26
  18. package/dist/auth/totp-manager.d.ts +48 -48
  19. package/dist/auth/user-management-internal.d.ts +67 -52
  20. package/dist/auth/user-manager.d.ts +58 -58
  21. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.d.ts +54 -54
  22. package/dist/builtins/addon-pages-aggregator/dedupe-pages.d.ts +22 -4
  23. package/dist/builtins/addon-pages-aggregator/index.d.ts +1 -1
  24. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.d.ts +54 -54
  25. package/dist/builtins/addon-widgets-aggregator/index.d.ts +1 -1
  26. package/dist/builtins/alerts/alerts.addon.d.ts +88 -87
  27. package/dist/builtins/alerts/device-label.d.ts +6 -6
  28. package/dist/builtins/alerts/index.d.ts +1 -1
  29. package/dist/builtins/alerts/prune-policy.d.ts +36 -36
  30. package/dist/builtins/autotrack/autotrack-cameras.d.ts +102 -79
  31. package/dist/builtins/autotrack/autotrack-config.d.ts +81 -81
  32. package/dist/builtins/autotrack/autotrack-decision.d.ts +69 -82
  33. package/dist/builtins/autotrack/autotrack-loop.d.ts +81 -61
  34. package/dist/builtins/autotrack/autotrack.addon.d.ts +103 -66
  35. package/dist/builtins/autotrack/frame-error.d.ts +38 -38
  36. package/dist/builtins/autotrack/frame-measurements.d.ts +79 -79
  37. package/dist/builtins/autotrack/index.d.ts +2 -2
  38. package/dist/builtins/autotrack/ptz-mirror.d.ts +46 -17
  39. package/dist/builtins/autotrack/target-selection.d.ts +33 -47
  40. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.d.ts +270 -269
  41. package/dist/builtins/backup-orchestrator/cron-helpers.d.ts +17 -17
  42. package/dist/builtins/backup-orchestrator/destination-policy.d.ts +99 -82
  43. package/dist/builtins/backup-orchestrator/download-helpers.d.ts +9 -9
  44. package/dist/builtins/backup-orchestrator/encryption-key-store.d.ts +40 -29
  45. package/dist/builtins/backup-orchestrator/index.d.ts +2 -2
  46. package/dist/builtins/backup-orchestrator/manifest-store.d.ts +88 -69
  47. package/dist/builtins/backup-orchestrator/restore-archive.d.ts +14 -14
  48. package/dist/builtins/backup-orchestrator/run-queue.d.ts +86 -86
  49. package/dist/builtins/backup-orchestrator/schedule-store.d.ts +53 -37
  50. package/dist/builtins/backup-orchestrator/staging-paths.d.ts +23 -23
  51. package/dist/builtins/backup-orchestrator/write-targets.d.ts +53 -53
  52. package/dist/builtins/calendars/calendar-color.d.ts +5 -1
  53. package/dist/builtins/calendars/calendar-prefs-store.d.ts +18 -12
  54. package/dist/builtins/calendars/calendars.addon.d.ts +16 -11
  55. package/dist/builtins/calendars/index.d.ts +1 -1
  56. package/dist/builtins/camera-grid/acquire-retry.d.ts +26 -26
  57. package/dist/builtins/camera-grid/addon.d.ts +200 -174
  58. package/dist/builtins/camera-grid/flv-join.d.ts +32 -58
  59. package/dist/builtins/camera-grid/grid-activity-mirror.d.ts +37 -37
  60. package/dist/builtins/camera-grid/grid-activity.d.ts +83 -42
  61. package/dist/builtins/camera-grid/grid-camera-declarations.d.ts +46 -46
  62. package/dist/builtins/camera-grid/grid-camera-device.d.ts +60 -34
  63. package/dist/builtins/camera-grid/grid-canvas-derivation.d.ts +50 -15
  64. package/dist/builtins/camera-grid/grid-canvas-seed.d.ts +96 -46
  65. package/dist/builtins/camera-grid/grid-canvas.d.ts +74 -74
  66. package/dist/builtins/camera-grid/grid-child.d.ts +29 -16
  67. package/dist/builtins/camera-grid/grid-compositor-child.d.ts +2 -2
  68. package/dist/builtins/camera-grid/grid-compositor-invocation.d.ts +39 -11
  69. package/dist/builtins/camera-grid/grid-compositor.d.ts +50 -50
  70. package/dist/builtins/camera-grid/grid-detection-mapping.d.ts +52 -22
  71. package/dist/builtins/camera-grid/grid-device-settings.d.ts +31 -7
  72. package/dist/builtins/camera-grid/grid-filter-graph.d.ts +41 -41
  73. package/dist/builtins/camera-grid/grid-frame-sample.d.ts +45 -19
  74. package/dist/builtins/camera-grid/grid-instances.d.ts +20 -50
  75. package/dist/builtins/camera-grid/grid-last-frame-store.d.ts +51 -51
  76. package/dist/builtins/camera-grid/grid-layout-native-provider.d.ts +30 -4
  77. package/dist/builtins/camera-grid/grid-plan.d.ts +30 -20
  78. package/dist/builtins/camera-grid/grid-profiles.d.ts +85 -45
  79. package/dist/builtins/camera-grid/grid-row-normalization.d.ts +6 -6
  80. package/dist/builtins/camera-grid/grid-sentry-sources.d.ts +57 -57
  81. package/dist/builtins/camera-grid/grid-snapshot.d.ts +41 -41
  82. package/dist/builtins/camera-grid/grid-stream-descriptor.d.ts +49 -21
  83. package/dist/builtins/camera-grid/grid-stream-invocation.d.ts +37 -22
  84. package/dist/builtins/camera-grid/grid-stream-relay.d.ts +26 -26
  85. package/dist/builtins/camera-grid/grid-stream-session.d.ts +123 -93
  86. package/dist/builtins/camera-grid/grid-tile-feed.d.ts +47 -47
  87. package/dist/builtins/camera-grid/grid-tile-plan.d.ts +55 -20
  88. package/dist/builtins/camera-grid/grid-wire-format.d.ts +22 -6
  89. package/dist/builtins/camera-grid/index.d.ts +44 -44
  90. package/dist/builtins/camera-grid/silence-analysis.d.ts +31 -14
  91. package/dist/builtins/composer/claim-gate.d.ts +54 -27
  92. package/dist/builtins/composer/composed-device-set.d.ts +40 -26
  93. package/dist/builtins/composer/composed-device.d.ts +39 -17
  94. package/dist/builtins/composer/composer-apply-waits.d.ts +20 -13
  95. package/dist/builtins/composer/composer-grafts.d.ts +57 -38
  96. package/dist/builtins/composer/composer-live-set.d.ts +15 -15
  97. package/dist/builtins/composer/composer-plan.d.ts +76 -60
  98. package/dist/builtins/composer/composer-runtime-factory.d.ts +21 -14
  99. package/dist/builtins/composer/composer-seeds.d.ts +20 -14
  100. package/dist/builtins/composer/composer-verdict.d.ts +28 -14
  101. package/dist/builtins/composer/composer.addon.d.ts +23 -9
  102. package/dist/builtins/composer/composer.d.ts +145 -100
  103. package/dist/builtins/composer/composition-declarations.d.ts +50 -39
  104. package/dist/builtins/composer/composition-evaluation.d.ts +38 -22
  105. package/dist/builtins/composer/composition-runtime.d.ts +178 -125
  106. package/dist/builtins/composer/composition-target.d.ts +38 -34
  107. package/dist/builtins/composer/confirmed-seed.d.ts +35 -23
  108. package/dist/builtins/composer/deadline-timer.d.ts +13 -13
  109. package/dist/builtins/composer/existing-target.d.ts +90 -73
  110. package/dist/builtins/composer/field-record.d.ts +26 -19
  111. package/dist/builtins/composer/graft-host.d.ts +56 -32
  112. package/dist/builtins/composer/held-claims.d.ts +26 -9
  113. package/dist/builtins/composer/index.d.ts +1 -1
  114. package/dist/builtins/composer/own-field-reads.d.ts +26 -15
  115. package/dist/builtins/composer/owned-fields-target.d.ts +75 -44
  116. package/dist/builtins/composer/slice-assembler.d.ts +19 -3
  117. package/dist/builtins/composer/source-readings.d.ts +67 -61
  118. package/dist/builtins/composer/source-tracker.d.ts +133 -69
  119. package/dist/builtins/console-logging/console-destination.d.ts +15 -8
  120. package/dist/builtins/console-logging/console-logging.addon.d.ts +20 -19
  121. package/dist/builtins/console-logging/index.d.ts +3 -3
  122. package/dist/builtins/core-blocks/block-package.d.ts +37 -37
  123. package/dist/builtins/core-blocks/block-settings-store.d.ts +34 -21
  124. package/dist/builtins/core-blocks/block-supervisor.d.ts +138 -117
  125. package/dist/builtins/core-blocks/block-type-defs.d.ts +21 -21
  126. package/dist/builtins/core-blocks/blocks-integration.d.ts +76 -49
  127. package/dist/builtins/core-blocks/compile-block.d.ts +37 -37
  128. package/dist/builtins/core-blocks/composition-api.d.ts +38 -24
  129. package/dist/builtins/core-blocks/composition-peers.d.ts +26 -4
  130. package/dist/builtins/core-blocks/composition-sources.d.ts +25 -10
  131. package/dist/builtins/core-blocks/core-block-store.d.ts +109 -109
  132. package/dist/builtins/core-blocks/core-blocks.addon.d.ts +72 -72
  133. package/dist/builtins/core-blocks/extract-settings-schema.d.ts +4 -4
  134. package/dist/builtins/core-blocks/index.d.ts +8 -8
  135. package/dist/builtins/device-manager/adoption-job-engine.d.ts +141 -98
  136. package/dist/builtins/device-manager/claimed-status-overlay.d.ts +42 -9
  137. package/dist/builtins/device-manager/contribution-cache.d.ts +56 -56
  138. package/dist/builtins/device-manager/day-night-config-schema.d.ts +26 -12
  139. package/dist/builtins/device-manager/device-aggregation-merge.d.ts +17 -17
  140. package/dist/builtins/device-manager/device-aggregation.d.ts +277 -254
  141. package/dist/builtins/device-manager/device-bindings-store.d.ts +232 -220
  142. package/dist/builtins/device-manager/device-config-contribution.d.ts +29 -29
  143. package/dist/builtins/device-manager/device-config-secrets.d.ts +32 -13
  144. package/dist/builtins/device-manager/device-event-propagator.d.ts +22 -22
  145. package/dist/builtins/device-manager/device-extension-linked-slot.d.ts +17 -17
  146. package/dist/builtins/device-manager/device-form-secrets.d.ts +14 -14
  147. package/dist/builtins/device-manager/device-linked-devices.d.ts +159 -98
  148. package/dist/builtins/device-manager/device-manager.addon.d.ts +223 -197
  149. package/dist/builtins/device-manager/device-meta-actions.d.ts +306 -305
  150. package/dist/builtins/device-manager/device-meta-store.d.ts +100 -90
  151. package/dist/builtins/device-manager/device-meta-types.d.ts +250 -241
  152. package/dist/builtins/device-manager/device-online-fallback.d.ts +30 -30
  153. package/dist/builtins/device-manager/device-projection.d.ts +53 -67
  154. package/dist/builtins/device-manager/device-provider-context.d.ts +109 -94
  155. package/dist/builtins/device-manager/device-queries.d.ts +63 -63
  156. package/dist/builtins/device-manager/device-row-store.d.ts +417 -365
  157. package/dist/builtins/device-manager/device-source-activation.d.ts +91 -49
  158. package/dist/builtins/device-manager/device-state-claim-views.d.ts +76 -61
  159. package/dist/builtins/device-manager/device-state-claims.d.ts +53 -30
  160. package/dist/builtins/device-manager/device-state-mirror.d.ts +256 -264
  161. package/dist/builtins/device-manager/device-sync-resolvers.d.ts +25 -25
  162. package/dist/builtins/device-manager/field-claims-index.d.ts +85 -58
  163. package/dist/builtins/device-manager/field-ownership.d.ts +54 -36
  164. package/dist/builtins/device-manager/fleet-read-census.d.ts +99 -61
  165. package/dist/builtins/device-manager/image-settings-config-schema.d.ts +18 -8
  166. package/dist/builtins/device-manager/index.d.ts +2 -2
  167. package/dist/builtins/device-manager/linked-devices-manual-backfill.d.ts +20 -9
  168. package/dist/builtins/device-manager/location-alignment.d.ts +46 -46
  169. package/dist/builtins/device-manager/migrate-device.d.ts +178 -101
  170. package/dist/builtins/device-manager/migrate-guard.d.ts +66 -34
  171. package/dist/builtins/device-manager/migrate-hardware-state.d.ts +59 -59
  172. package/dist/builtins/device-manager/migrate-reload.d.ts +42 -4
  173. package/dist/builtins/device-manager/migration-refused.d.ts +20 -20
  174. package/dist/builtins/device-manager/mirror-row-writer.d.ts +205 -179
  175. package/dist/builtins/device-manager/recording-onboard-config-schema.d.ts +56 -32
  176. package/dist/builtins/device-manager/removal-fence.d.ts +48 -48
  177. package/dist/builtins/device-manager/runtime-state-persist-gate.d.ts +54 -26
  178. package/dist/builtins/device-manager/secret-config-paths.d.ts +17 -17
  179. package/dist/builtins/device-manager/stale-wrapper-activations.d.ts +52 -25
  180. package/dist/builtins/device-manager/write-lock.d.ts +13 -13
  181. package/dist/builtins/hub-forwarder/hub-forwarder-destination.d.ts +41 -41
  182. package/dist/builtins/hub-forwarder/hub-forwarder.addon.d.ts +13 -12
  183. package/dist/builtins/hub-forwarder/index.d.ts +3 -3
  184. package/dist/builtins/keychain/index.d.ts +1 -1
  185. package/dist/builtins/keychain/key-sources.d.ts +19 -19
  186. package/dist/builtins/keychain/keychain-crypto.d.ts +4 -4
  187. package/dist/builtins/keychain/keychain-reset-trigger.d.ts +13 -13
  188. package/dist/builtins/keychain/keychain-service.d.ts +128 -128
  189. package/dist/builtins/keychain/keychain-store.d.ts +96 -87
  190. package/dist/builtins/keychain/keychain-usage.d.ts +13 -2
  191. package/dist/builtins/keychain/keychain.addon.d.ts +31 -6
  192. package/dist/builtins/keychain/platform-key-source.d.ts +15 -15
  193. package/dist/builtins/keychain/system-held-secrets.d.ts +17 -4
  194. package/dist/builtins/liveness-monitor/index.d.ts +2 -2
  195. package/dist/builtins/liveness-monitor/liveness-checks.d.ts +73 -52
  196. package/dist/builtins/liveness-monitor/liveness-monitor.addon.d.ts +57 -36
  197. package/dist/builtins/local-auth/admin-account-boot.d.ts +14 -14
  198. package/dist/builtins/local-auth/auth-config-reader.d.ts +34 -17
  199. package/dist/builtins/local-auth/auth-schema.d.ts +92 -69
  200. package/dist/builtins/local-auth/index.d.ts +1 -1
  201. package/dist/builtins/local-auth/jwt-signing-key-keeper.d.ts +22 -22
  202. package/dist/builtins/local-auth/local-auth.addon.d.ts +41 -40
  203. package/dist/builtins/local-auth/oauth-grants.d.ts +57 -57
  204. package/dist/builtins/local-auth/oauth-session-manager.d.ts +62 -62
  205. package/dist/builtins/local-network/address-book.d.ts +61 -36
  206. package/dist/builtins/local-network/index.d.ts +2 -2
  207. package/dist/builtins/local-network/ipv6-lan.d.ts +12 -17
  208. package/dist/builtins/local-network/local-hostname.d.ts +10 -10
  209. package/dist/builtins/local-network/local-network.addon.d.ts +259 -258
  210. package/dist/builtins/loki-logging/index.d.ts +4 -4
  211. package/dist/builtins/loki-logging/loki-destination.d.ts +113 -87
  212. package/dist/builtins/loki-logging/loki-logging.addon.d.ts +61 -42
  213. package/dist/builtins/loki-logging/loki-payload.d.ts +82 -39
  214. package/dist/builtins/loki-logging/retire-enabled-flag.d.ts +37 -12
  215. package/dist/builtins/native-metrics/cgroup-memory.d.ts +206 -159
  216. package/dist/builtins/native-metrics/cgroup-pids.d.ts +138 -91
  217. package/dist/builtins/native-metrics/container-memory-series.d.ts +212 -178
  218. package/dist/builtins/native-metrics/gpu-probe.d.ts +9 -9
  219. package/dist/builtins/native-metrics/index.d.ts +2 -2
  220. package/dist/builtins/native-metrics/load-series-config.d.ts +29 -57
  221. package/dist/builtins/native-metrics/load-series-reader.d.ts +52 -26
  222. package/dist/builtins/native-metrics/load-series-store.d.ts +237 -176
  223. package/dist/builtins/native-metrics/native-metrics-provider.d.ts +43 -43
  224. package/dist/builtins/native-metrics/native-metrics.addon.d.ts +230 -230
  225. package/dist/builtins/native-metrics/node-load-ring.d.ts +196 -196
  226. package/dist/builtins/native-metrics/proc-process-table.d.ts +12 -12
  227. package/dist/builtins/native-metrics/process-classification.d.ts +95 -36
  228. package/dist/builtins/native-metrics/thread-cpu-sampler.d.ts +95 -95
  229. package/dist/builtins/platform-probe/coral-accelerators.d.ts +17 -17
  230. package/dist/builtins/platform-probe/index.d.ts +38 -30
  231. package/dist/builtins/platform-probe/inference-config-resolver.d.ts +27 -27
  232. package/dist/builtins/platform-probe/intel-accelerators.d.ts +8 -8
  233. package/dist/builtins/platform-probe/intel-npu.d.ts +30 -30
  234. package/dist/builtins/platform-probe/platform-scorer.d.ts +35 -35
  235. package/dist/builtins/platform-probe/runtime-packages.d.ts +3 -3
  236. package/dist/builtins/remote-access-orchestrator/enabled-providers-reconcile.d.ts +87 -87
  237. package/dist/builtins/remote-access-orchestrator/index.d.ts +1 -1
  238. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.d.ts +66 -35
  239. package/dist/builtins/shared/device-state-changed.d.ts +9 -9
  240. package/dist/builtins/shared/settle-sources.d.ts +16 -16
  241. package/dist/builtins/snapshot/index.d.ts +2 -2
  242. package/dist/builtins/snapshot/snapshot-cache.d.ts +92 -92
  243. package/dist/builtins/snapshot/snapshot-coalescing.d.ts +108 -108
  244. package/dist/builtins/snapshot/snapshot-courtesy.d.ts +48 -48
  245. package/dist/builtins/snapshot/snapshot-durable-store.d.ts +32 -32
  246. package/dist/builtins/snapshot/snapshot-fatigue.d.ts +34 -34
  247. package/dist/builtins/snapshot/snapshot-grab-pick.d.ts +14 -14
  248. package/dist/builtins/snapshot/snapshot-link-url.d.ts +49 -49
  249. package/dist/builtins/snapshot/snapshot-media-handler.d.ts +97 -97
  250. package/dist/builtins/snapshot/snapshot-resize.d.ts +64 -103
  251. package/dist/builtins/snapshot/snapshot.addon.d.ts +569 -568
  252. package/dist/builtins/sqlite-storage/analyze-stats.d.ts +73 -29
  253. package/dist/builtins/sqlite-storage/config-store.d.ts +6 -6
  254. package/dist/builtins/sqlite-storage/device-store.d.ts +16 -16
  255. package/dist/builtins/sqlite-storage/filesystem-browse-provider.d.ts +23 -23
  256. package/dist/builtins/sqlite-storage/filesystem-storage-provider.d.ts +79 -79
  257. package/dist/builtins/sqlite-storage/filesystem-storage.addon.d.ts +27 -26
  258. package/dist/builtins/sqlite-storage/filter-compiler.d.ts +107 -107
  259. package/dist/builtins/sqlite-storage/index.d.ts +12 -12
  260. package/dist/builtins/sqlite-storage/integration-registry.d.ts +37 -37
  261. package/dist/builtins/sqlite-storage/path-guard.d.ts +5 -5
  262. package/dist/builtins/sqlite-storage/prefix-range.d.ts +44 -44
  263. package/dist/builtins/sqlite-storage/query-bounds.d.ts +100 -106
  264. package/dist/builtins/sqlite-storage/query-profiler.d.ts +217 -217
  265. package/dist/builtins/sqlite-storage/retired-collections.d.ts +124 -55
  266. package/dist/builtins/sqlite-storage/retired-settings-keys.d.ts +239 -189
  267. package/dist/builtins/sqlite-storage/shm-lock-canary.d.ts +41 -41
  268. package/dist/builtins/sqlite-storage/sqlite-pragmas.d.ts +162 -162
  269. package/dist/builtins/sqlite-storage/sqlite-settings-backend.d.ts +458 -458
  270. package/dist/builtins/sqlite-storage/sqlite-settings.addon.d.ts +59 -58
  271. package/dist/builtins/sqlite-storage/sqlite-snapshot-protocol.d.ts +37 -32
  272. package/dist/builtins/sqlite-storage/sqlite-snapshot-worker.d.ts +19 -19
  273. package/dist/builtins/sqlite-storage/sqlite-snapshotter.d.ts +76 -76
  274. package/dist/builtins/sqlite-storage/statement-shape.d.ts +54 -54
  275. package/dist/builtins/sqlite-storage/table-sizes.d.ts +71 -71
  276. package/dist/builtins/sqlite-storage/vector-index-shared.d.ts +63 -54
  277. package/dist/builtins/sqlite-storage/vector-index-vec.d.ts +133 -96
  278. package/dist/builtins/sqlite-storage/wal-checkpoint-policy.d.ts +161 -161
  279. package/dist/builtins/sqlite-storage/wal-checkpointer.d.ts +60 -60
  280. package/dist/builtins/sqlite-storage/wal-maintenance.d.ts +94 -94
  281. package/dist/builtins/storage-orchestrator/access-guards.d.ts +37 -26
  282. package/dist/builtins/storage-orchestrator/data-store-dispatch.d.ts +33 -18
  283. package/dist/builtins/storage-orchestrator/drain-ratchet.d.ts +85 -85
  284. package/dist/builtins/storage-orchestrator/drain-state-store.d.ts +20 -10
  285. package/dist/builtins/storage-orchestrator/hub-settings-forward.d.ts +113 -53
  286. package/dist/builtins/storage-orchestrator/index.d.ts +7 -7
  287. package/dist/builtins/storage-orchestrator/location-occupancy-slice.d.ts +64 -40
  288. package/dist/builtins/storage-orchestrator/location-occupancy.d.ts +14 -14
  289. package/dist/builtins/storage-orchestrator/location-protection.d.ts +13 -13
  290. package/dist/builtins/storage-orchestrator/location-repoint-move.d.ts +44 -44
  291. package/dist/builtins/storage-orchestrator/location-root-collision.d.ts +61 -25
  292. package/dist/builtins/storage-orchestrator/location-secrets.d.ts +99 -58
  293. package/dist/builtins/storage-orchestrator/location-store.d.ts +56 -47
  294. package/dist/builtins/storage-orchestrator/location-volume-capacity.d.ts +37 -37
  295. package/dist/builtins/storage-orchestrator/provider-discovery.d.ts +20 -6
  296. package/dist/builtins/storage-orchestrator/storage-cleanup-coordinator.d.ts +51 -51
  297. package/dist/builtins/storage-orchestrator/storage-migration-coordinator.d.ts +224 -224
  298. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.d.ts +292 -292
  299. package/dist/builtins/storage-orchestrator/storage-orchestrator.service.d.ts +431 -450
  300. package/dist/builtins/storage-orchestrator/storage-pressure-manager.d.ts +104 -104
  301. package/dist/builtins/system-backup/backup-encryption.d.ts +60 -23
  302. package/dist/builtins/system-backup/system-backup.service.d.ts +240 -240
  303. package/dist/builtins/system-config/cluster-secret-keeper.d.ts +54 -34
  304. package/dist/builtins/system-config/index.d.ts +2 -2
  305. package/dist/builtins/system-config/mesh-actions.d.ts +2 -30
  306. package/dist/builtins/system-config/system-config.addon.d.ts +57 -100
  307. package/dist/builtins/system-config/system-config.addon.js +37 -33
  308. package/dist/builtins/system-config/system-config.addon.mjs +37 -33
  309. package/dist/builtins/winston-logging/index.d.ts +3 -3
  310. package/dist/builtins/winston-logging/winston-destination.d.ts +15 -15
  311. package/dist/builtins/winston-logging/winston-logging.addon.d.ts +14 -13
  312. package/dist/{child-cap-dispatch-nURMuVTX.js → child-cap-dispatch-Bnr8brru.js} +18 -0
  313. package/dist/{child-cap-dispatch-B1gyE35b.mjs → child-cap-dispatch-mHO_6r0G.mjs} +1 -1
  314. package/dist/download/hosted-model-revisions.d.ts +8 -8
  315. package/dist/download/model-download-service.d.ts +32 -32
  316. package/dist/download/model-downloader.d.ts +88 -88
  317. package/dist/events/event-bus.d.ts +6 -6
  318. package/dist/events/system-event-bus.d.ts +11 -11
  319. package/dist/feature/feature-manager.d.ts +6 -6
  320. package/dist/http/asset-compression.d.ts +35 -73
  321. package/dist/http/authenticated-file-server.d.ts +32 -32
  322. package/dist/http/data-plane-registry.d.ts +49 -39
  323. package/dist/http/file-data-plane.d.ts +14 -14
  324. package/dist/http/lan-http-bind.d.ts +24 -13
  325. package/dist/http/reverse-proxy.d.ts +36 -24
  326. package/dist/index.d.ts +137 -137
  327. package/dist/index.js +4 -3
  328. package/dist/index.mjs +2 -4
  329. package/dist/kernel/addon-class-resolver.d.ts +1 -1
  330. package/dist/kernel/addon-engine-manager.d.ts +20 -20
  331. package/dist/kernel/addon-health-monitor.d.ts +151 -151
  332. package/dist/kernel/addon-installer.d.ts +609 -609
  333. package/dist/kernel/addon-loader.d.ts +133 -133
  334. package/dist/kernel/addon-manifest.d.ts +118 -118
  335. package/dist/kernel/addon-residue.d.ts +28 -32
  336. package/dist/kernel/array-buffer-census.d.ts +84 -88
  337. package/dist/kernel/bootstrap-config.d.ts +3 -3
  338. package/dist/kernel/cap-router-builder.d.ts +145 -101
  339. package/dist/kernel/capability-handle.d.ts +41 -41
  340. package/dist/kernel/capability-registry.d.ts +588 -576
  341. package/dist/kernel/config-manager.d.ts +199 -199
  342. package/dist/kernel/config-schema.d.ts +132 -128
  343. package/dist/kernel/custom-action-registry.d.ts +25 -25
  344. package/dist/kernel/deps/addon-deps-manager.d.ts +17 -17
  345. package/dist/kernel/deps/closure-dedupe.d.ts +76 -76
  346. package/dist/kernel/deps/ensure-addon-natives.d.ts +34 -34
  347. package/dist/kernel/deps/ensure-native-prebuilds.d.ts +25 -25
  348. package/dist/kernel/deps/manifest-native-deps.d.ts +38 -38
  349. package/dist/kernel/deps/manifest-python-deps.d.ts +18 -18
  350. package/dist/kernel/deps/manifest-system-deps.d.ts +13 -13
  351. package/dist/kernel/deps/npm-command.d.ts +45 -45
  352. package/dist/kernel/deps/system-package-allowlist.d.ts +9 -9
  353. package/dist/kernel/deps/system-package-broker.d.ts +20 -20
  354. package/dist/kernel/deps/system-package-client.d.ts +3 -3
  355. package/dist/kernel/device-registry.d.ts +27 -27
  356. package/dist/kernel/event-loop-stall-monitor.d.ts +33 -33
  357. package/dist/kernel/event-plane-report.d.ts +174 -174
  358. package/dist/kernel/fs-utils.d.ts +70 -70
  359. package/dist/kernel/gc-census.d.ts +119 -119
  360. package/dist/kernel/heap-spaces.d.ts +87 -87
  361. package/dist/kernel/heap-watch.d.ts +706 -706
  362. package/dist/kernel/host-externals.d.ts +8 -8
  363. package/dist/kernel/hwaccel/hwaccel-resolver.d.ts +27 -27
  364. package/dist/kernel/index.d.ts +115 -113
  365. package/dist/kernel/inference/inference-resolver.d.ts +13 -13
  366. package/dist/kernel/infra-capabilities.d.ts +7 -7
  367. package/dist/kernel/isolated-builtin-phase.d.ts +42 -42
  368. package/dist/kernel/lifecycle/job-journal.d.ts +17 -17
  369. package/dist/kernel/lifecycle/lifecycle-job-engine.d.ts +99 -99
  370. package/dist/kernel/lifecycle/staging-area.d.ts +22 -22
  371. package/dist/kernel/moleculer/addon-context-factory.d.ts +90 -89
  372. package/dist/kernel/moleculer/addon-data-plane-facility.d.ts +12 -12
  373. package/dist/kernel/moleculer/addon-deploy-source.d.ts +11 -11
  374. package/dist/kernel/moleculer/addon-peer-bytes-facility.d.ts +18 -18
  375. package/dist/kernel/moleculer/addon-service-factory.d.ts +41 -41
  376. package/dist/kernel/moleculer/agent-mesh-authenticator.d.ts +60 -33
  377. package/dist/kernel/moleculer/agent-ui-unlock.d.ts +30 -30
  378. package/dist/kernel/moleculer/broker-factory.d.ts +61 -61
  379. package/dist/kernel/moleculer/cap-usage-registry.d.ts +108 -153
  380. package/dist/kernel/moleculer/capabilities-access.d.ts +19 -19
  381. package/dist/kernel/moleculer/child-addon-call-dispatch.d.ts +43 -43
  382. package/dist/kernel/moleculer/child-cap-descriptors.d.ts +26 -26
  383. package/dist/kernel/moleculer/child-cap-dispatch.d.ts +52 -52
  384. package/dist/kernel/moleculer/children-batch-loader.d.ts +86 -34
  385. package/dist/kernel/moleculer/cluster-secret.d.ts +19 -19
  386. package/dist/kernel/moleculer/core-cap-service.d.ts +53 -53
  387. package/dist/kernel/moleculer/crash-supervisor.d.ts +39 -39
  388. package/dist/kernel/moleculer/device-cap-proxy.d.ts +51 -51
  389. package/dist/kernel/moleculer/device-event-ring.d.ts +117 -75
  390. package/dist/kernel/moleculer/event-bus-core.d.ts +171 -159
  391. package/dist/kernel/moleculer/event-bus.d.ts +73 -73
  392. package/dist/kernel/moleculer/hub-log-forwarder.d.ts +30 -30
  393. package/dist/kernel/moleculer/hub-service.d.ts +42 -42
  394. package/dist/kernel/moleculer/init-watchdog.d.ts +49 -49
  395. package/dist/kernel/moleculer/mesh-access-middleware.d.ts +36 -21
  396. package/dist/kernel/moleculer/mesh-auth-mode.d.ts +33 -39
  397. package/dist/kernel/moleculer/mesh-authenticator.d.ts +58 -58
  398. package/dist/kernel/moleculer/mesh-auto-enforce.d.ts +38 -18
  399. package/dist/kernel/moleculer/mesh-join-client.d.ts +67 -45
  400. package/dist/kernel/moleculer/mesh-join-proof.d.ts +8 -8
  401. package/dist/kernel/moleculer/mesh-mtls/constants.d.ts +1 -1
  402. package/dist/kernel/moleculer/mesh-mtls/index.d.ts +10 -10
  403. package/dist/kernel/moleculer/mesh-mtls/mesh-ca-keeper.d.ts +43 -38
  404. package/dist/kernel/moleculer/mesh-mtls/mesh-ca.d.ts +29 -20
  405. package/dist/kernel/moleculer/mesh-mtls/mesh-clear-port.d.ts +32 -32
  406. package/dist/kernel/moleculer/mesh-mtls/mesh-crl.d.ts +11 -11
  407. package/dist/kernel/moleculer/mesh-mtls/mesh-enroll.d.ts +19 -16
  408. package/dist/kernel/moleculer/mesh-mtls/mesh-join-token.d.ts +40 -40
  409. package/dist/kernel/moleculer/mesh-mtls/mesh-tls-enabler.d.ts +5 -1
  410. package/dist/kernel/moleculer/mesh-mtls/tls-tcp-transporter.d.ts +131 -130
  411. package/dist/kernel/moleculer/mesh-queue-report.d.ts +39 -39
  412. package/dist/kernel/moleculer/node-registry.d.ts +120 -120
  413. package/dist/kernel/moleculer/process-context.d.ts +2 -2
  414. package/dist/kernel/moleculer/process-service.d.ts +168 -168
  415. package/dist/kernel/moleculer/provider-registry.d.ts +9 -9
  416. package/dist/kernel/moleculer/readiness-context.d.ts +58 -58
  417. package/dist/kernel/moleculer/readiness-service.d.ts +31 -16
  418. package/dist/kernel/moleculer/register-framework-resolver.d.ts +6 -6
  419. package/dist/kernel/moleculer/register-node-client.d.ts +34 -27
  420. package/dist/kernel/moleculer/remote-logger.d.ts +29 -29
  421. package/dist/kernel/moleculer/resilient-cap-call.d.ts +21 -21
  422. package/dist/kernel/moleculer/runner-native-allocator.d.ts +95 -95
  423. package/dist/kernel/moleculer/runner-process-group.d.ts +57 -57
  424. package/dist/kernel/moleculer/runtime-state-load.d.ts +21 -11
  425. package/dist/kernel/moleculer/settings-read-guard.d.ts +39 -39
  426. package/dist/kernel/moleculer/stream-probe-service.d.ts +25 -6
  427. package/dist/kernel/moleculer/trpc-links.d.ts +203 -203
  428. package/dist/kernel/moleculer/typed-array-serde.d.ts +9 -20
  429. package/dist/kernel/moleculer/worker-device-restore.d.ts +8 -8
  430. package/dist/kernel/outbound-queue-watch.d.ts +74 -74
  431. package/dist/kernel/process-cpu-census.d.ts +55 -55
  432. package/dist/kernel/provider-kind-drift.d.ts +17 -8
  433. package/dist/kernel/restart-coordinator.d.ts +71 -71
  434. package/dist/kernel/settings-door-view.d.ts +36 -25
  435. package/dist/kernel/settings-read-error.d.ts +29 -31
  436. package/dist/kernel/settings-view-types.d.ts +100 -95
  437. package/dist/kernel/socket-plane-report.d.ts +214 -153
  438. package/dist/kernel/status-overlay.d.ts +31 -11
  439. package/dist/kernel/storage-location-registry.d.ts +50 -50
  440. package/dist/kernel/store-settings-view.d.ts +13 -13
  441. package/dist/kernel/system-settings-mirror.d.ts +40 -28
  442. package/dist/kernel/system-settings-policy.d.ts +15 -34
  443. package/dist/kernel/transport/cap-action-census.d.ts +183 -183
  444. package/dist/kernel/transport/cap-action-name.d.ts +84 -84
  445. package/dist/kernel/transport/cap-child-index.d.ts +41 -41
  446. package/dist/kernel/transport/cap-route-resolver.d.ts +237 -212
  447. package/dist/kernel/transport/cap-route.d.ts +139 -139
  448. package/dist/kernel/transport/cap-routing-hints.d.ts +37 -37
  449. package/dist/kernel/transport/child-cap-protocol.d.ts +245 -245
  450. package/dist/kernel/transport/claimed-get-status.d.ts +30 -6
  451. package/dist/kernel/transport/create-local-transport.d.ts +5 -5
  452. package/dist/kernel/transport/frame-codec.d.ts +109 -109
  453. package/dist/kernel/transport/hub-cap-forward.d.ts +81 -59
  454. package/dist/kernel/transport/index.d.ts +36 -36
  455. package/dist/kernel/transport/local-child-client.d.ts +184 -184
  456. package/dist/kernel/transport/local-child-registry.d.ts +592 -592
  457. package/dist/kernel/transport/local-endpoint-path.d.ts +4 -4
  458. package/dist/kernel/transport/local-transport.d.ts +92 -92
  459. package/dist/kernel/transport/parent-unowned-call.d.ts +266 -237
  460. package/dist/kernel/transport/peer-answered-error.d.ts +14 -14
  461. package/dist/kernel/transport/socket-channel.d.ts +110 -110
  462. package/dist/kernel/transport/socket-traffic.d.ts +96 -96
  463. package/dist/kernel/transport/uds-event-bridge.d.ts +77 -50
  464. package/dist/kernel/transport/uds-event-bus.d.ts +75 -26
  465. package/dist/kernel/transport/uds-local-transport.d.ts +14 -14
  466. package/dist/kernel/transport/uds-log-ingest.d.ts +38 -23
  467. package/dist/kernel/transport/uds-logger.d.ts +33 -33
  468. package/dist/kernel/utils/ring-buffer.d.ts +12 -12
  469. package/dist/kernel/workspace-detect.d.ts +7 -7
  470. package/dist/lifecycle/lifecycle-state-machine.d.ts +24 -24
  471. package/dist/logging/formatter.d.ts +52 -25
  472. package/dist/logging/log-manager.d.ts +133 -133
  473. package/dist/logging/log-redactor.d.ts +22 -1
  474. package/dist/logging/log-ring-buffer.d.ts +57 -57
  475. package/dist/logging/logging-gate.d.ts +69 -25
  476. package/dist/logging/logging-gate.singleton.d.ts +12 -1
  477. package/dist/logging/partitioned-log-buffer.d.ts +161 -161
  478. package/dist/logging/scoped-logger.d.ts +14 -14
  479. package/dist/network/network-quality.d.ts +8 -8
  480. package/dist/notification/notification-service.d.ts +37 -37
  481. package/dist/notification/toast-service.d.ts +18 -18
  482. package/dist/pipeline/engine-manager-resolver.d.ts +12 -12
  483. package/dist/pipeline/pipeline-runner.d.ts +6 -6
  484. package/dist/pipeline/pipeline-validator.d.ts +8 -8
  485. package/dist/process/proc-stat.d.ts +51 -51
  486. package/dist/process/resource-monitor.d.ts +19 -19
  487. package/dist/python/python-env-manager.d.ts +10 -10
  488. package/dist/repl/interfaces.d.ts +21 -21
  489. package/dist/repl/repl-engine.d.ts +6 -6
  490. package/dist/storage/fs-storage-backend.d.ts +35 -35
  491. package/dist/storage/storage-location-manager.d.ts +21 -21
  492. package/dist/storage/storage-manager.d.ts +68 -68
  493. package/dist/tls/boot-tls.d.ts +24 -24
  494. package/dist/tls/cert-evaluation.d.ts +25 -25
  495. package/dist/tls/cert-identity.d.ts +39 -39
  496. package/dist/tls/cert-issue.d.ts +37 -17
  497. package/dist/tls/cert-manager.d.ts +86 -84
  498. package/dist/tls/https-listener.d.ts +16 -16
  499. package/dist/tls/index.d.ts +8 -8
  500. package/dist/tls/tls-actions.d.ts +18 -18
  501. package/dist/tls/tls-status.d.ts +15 -15
  502. package/dist/tls/uploaded-cert.d.ts +9 -9
  503. package/package.json +9 -3
@@ -1,5 +1,17 @@
1
- import { CapabilityDeclaration, CapabilityDefinition, CapabilityInfo, CapabilityMode, CapabilityProviderMap, CollectionCapabilityMap, IEventBus, IScopedLogger, SingletonCapabilityMap } from '@camstack/types';
2
- import { StatusOverlay, StatusOverlayAnswer } from './status-overlay.js';
1
+ /**
2
+ * CapabilityRegistry — auto-mounts tRPC routers from CapabilityDefinitions.
3
+ *
4
+ * Responsibilities:
5
+ * - Register/unregister providers for capabilities
6
+ * - Auto-create tRPC routers for each registered capability (via factory function)
7
+ * - Emit lifecycle events on the EventBus
8
+ * - Provide typed getProvider() for consumers
9
+ *
10
+ * Does NOT contain tRPC code directly — receives a router factory function
11
+ * from the server layer (which owns @trpc/server).
12
+ */
13
+ import type { CapabilityDeclaration, CapabilityDefinition, CapabilityInfo, CapabilityMode, CapabilityProviderMap, CollectionCapabilityMap, IEventBus, IScopedLogger, SingletonCapabilityMap } from "@camstack/types";
14
+ import { type StatusOverlay, type StatusOverlayAnswer } from "./status-overlay.js";
3
15
  /** Result of creating a capability router (opaque to the kernel). */
4
16
  export type CapabilityRouter = unknown;
5
17
  /** Factory that creates a tRPC router from a capability definition + provider getter. */
@@ -7,585 +19,585 @@ export type CapabilityRouterFactory = (definition: CapabilityDefinition, getProv
7
19
  /** Reader function that resolves user's singleton preference for a capability. */
8
20
  export type ConfigReader = (capability: string) => string | undefined;
9
21
  /**
10
- * Reader function that resolves the persisted set of disabled addonIds for a
11
- * collection capability. Parallel to {@link ConfigReader} but for the
12
- * collection mode — returns the addonIds an operator has disabled so the
13
- * registry can restore them as disabled on a fresh boot. An empty array (or
14
- * `undefined`) means "nothing persisted, all providers enabled".
15
- *
16
- * Wired by the server layer in `addon-registry.service.ts` to read the same
17
- * `capabilities.collection.<cap>` ConfigService key the `capabilities` router
18
- * writes. Keeps the registry decoupled from `ConfigService` — exactly like
19
- * {@link ConfigReader} does for singletons.
20
- */
22
+ * Reader function that resolves the persisted set of disabled addonIds for a
23
+ * collection capability. Parallel to {@link ConfigReader} but for the
24
+ * collection mode — returns the addonIds an operator has disabled so the
25
+ * registry can restore them as disabled on a fresh boot. An empty array (or
26
+ * `undefined`) means "nothing persisted, all providers enabled".
27
+ *
28
+ * Wired by the server layer in `addon-registry.service.ts` to read the same
29
+ * `capabilities.collection.<cap>` ConfigService key the `capabilities` router
30
+ * writes. Keeps the registry decoupled from `ConfigService` — exactly like
31
+ * {@link ConfigReader} does for singletons.
32
+ */
21
33
  export type CollectionConfigReader = (capability: string) => readonly string[] | undefined;
22
34
  /**
23
- * Proof that an unregister owns the registration it is about to delete.
24
- *
25
- * A `(capability, addonId)` key is NOT unique over time: a runner replaced by
26
- * an update re-registers under the exact same key (`resolveRunnerId` is
27
- * deterministic), so the dead generation's teardown and the live generation's
28
- * registration are indistinguishable by key alone. The owner token names the
29
- * INCARNATION that made a registration — e.g. `hub/recorder#7` — and
30
- * {@link CapabilityRegistry.unregisterProvider} refuses any unregister that
31
- * cannot present it. See docs/decisions/adr-0188-an-unregister-carries-proof-of-ownership.md.
32
- */
35
+ * Proof that an unregister owns the registration it is about to delete.
36
+ *
37
+ * A `(capability, addonId)` key is NOT unique over time: a runner replaced by
38
+ * an update re-registers under the exact same key (`resolveRunnerId` is
39
+ * deterministic), so the dead generation's teardown and the live generation's
40
+ * registration are indistinguishable by key alone. The owner token names the
41
+ * INCARNATION that made a registration — e.g. `hub/recorder#7` — and
42
+ * {@link CapabilityRegistry.unregisterProvider} refuses any unregister that
43
+ * cannot present it. See docs/decisions/adr-0188-an-unregister-carries-proof-of-ownership.md.
44
+ */
33
45
  export type ProviderOwnerToken = string;
34
46
  /** What {@link CapabilityRegistry.applyPersistedPreferences} changed. */
35
47
  export interface PersistedPreferenceReplay {
36
- readonly singletons: ReadonlyArray<{
37
- readonly capability: string;
38
- readonly addonId: string;
39
- }>;
40
- readonly disabled: ReadonlyArray<{
41
- readonly capability: string;
42
- readonly addonId: string;
43
- }>;
48
+ readonly singletons: ReadonlyArray<{
49
+ readonly capability: string;
50
+ readonly addonId: string;
51
+ }>;
52
+ readonly disabled: ReadonlyArray<{
53
+ readonly capability: string;
54
+ readonly addonId: string;
55
+ }>;
44
56
  }
45
57
  export declare class CapabilityRegistry {
46
- private readonly capabilities;
47
- private readonly logger;
48
- private readonly eventBus;
49
- private routerFactory;
50
- private configReader;
51
- private collectionConfigReader;
52
- private _ready;
53
- /** Boot-time dependency graph: capability → dependsOn names (from CapabilityDeclaration) */
54
- private readonly capabilityDeps;
55
- /**
56
- * capability → addon ids whose MANIFEST declares it.
57
- *
58
- * Populated by {@link declareFromManifest}, which runs at addon-LOAD time —
59
- * before a forked addon's runner has spawned, let alone registered anything.
60
- * So this map answers a question `providers` cannot: **which addons still owe
61
- * this capability a provider**, i.e. is an absence final or merely early.
62
- *
63
- * It is not a second registry and nothing waits on it: it stores an argument
64
- * `declareFromManifest` was already being handed and dropping, and it is read
65
- * synchronously at the moment a caller needs the answer ([D3](../../../../docs/decisions/adr-0003.md)).
66
- */
67
- private readonly manifestDeclarers;
68
- /** Per-device singleton overrides: deviceId → (capability → addonId) */
69
- private readonly deviceOverrides;
70
- /** capName → (nodeId → bare addonId) per-node singleton overrides. */
71
- private readonly singletonNodeOverrides;
72
- /** Optional reader for persisted per-node overrides: (cap, nodeId) → addonId. */
73
- private nodeConfigReader;
74
- /**
75
- * Per-device SOURCE deactivations: deviceId → (capability → disabled addon ids).
76
- *
77
- * The in-memory PROJECTION of the persisted wrapper activation
78
- * (`deviceBindings[deviceId][capName].disabledSourceAddonIds`, written by
79
- * `setWrapperActive`), and never an authority of its own —
80
- * [D556](../../../../docs/decisions/adr-0556-a-per-device-source-switch-is-the-wrapper-activation-and-the-registry-holds-only-its-projection.md).
81
- * Nothing but `device-source-activation.ts` writes it: the operator's verb
82
- * is `deviceManager.setWrapperActive`, and a second writable surface here is
83
- * exactly the two-authorities defect D62 exists for.
84
- *
85
- * A DENY list, not an allow list, and that is the deliberate answer to what
86
- * "unset" means: a source nobody has ruled out is a source. An untouched
87
- * camera keeps every provider it has today, and a provider that registers
88
- * after the operator's last toggle needs no second write to be seen.
89
- */
90
- /** autoActivate flags per (capability, addonId) — from addon manifests */
91
- private readonly autoActivateFlags;
92
- /**
93
- * Per-device native providers: capName → deviceId (numeric) → { addonId, provider }.
94
- *
95
- * Backs `DeviceContext.registerNativeCap`. Lets device-driver addons
96
- * (OnvifCamera, RtspCamera, etc.) publish capability implementations
97
- * scoped to a single device; the device-proxy router resolves these by
98
- * `(capName, deviceId)` to dispatch incoming calls.
99
- *
100
- * Distinct from the `capabilities[].providers` map (system-wide providers
101
- * keyed by addonId) — native providers are device-instance-scoped and
102
- * never participate in singleton/collection resolution.
103
- */
104
- private readonly nativeProviders;
105
- /**
106
- * Wrapper provider registrations: capName → Set<addonId>. Tracked separately
107
- * from `capabilities[].providers` because wrappers aren't system-wide
108
- * providers — they're user-toggleable decorators addons declare via
109
- * `ProviderRegistration.kind === 'wrapper'`. Consumers query this map (via
110
- * `getWrappersForCap`) to render the "pick a wrapper for this device"
111
- * dropdown in the device-bindings UI.
112
- */
113
- private readonly wrapperProviders;
114
- /**
115
- * Wrapper registrations that declared `ProviderRegistration.defaultActive:
116
- * true`. Keyed by `capName` and valued by `addonId` — the first wrapper
117
- * flagged default-active wins per cap. Consumed by `device-manager.getBindings`
118
- * to synthesise a wrapper binding when no explicit activation has been
119
- * persisted for a (device, cap) pair and no native provider exists either —
120
- * otherwise the default wrapper would sit dormant waiting for a manual
121
- * `setWrapperActive({active: true})` that never comes.
122
- */
123
- private readonly wrapperDefaults;
124
- /**
125
- * Pending {@link waitForProvider} waiters, keyed by
126
- * `"${capabilityName}::${addonId}"`. Resolved by {@link registerProvider}
127
- * as soon as the matching pair is registered — the mechanism that replaces
128
- * the 100ms polling loop the device-management router used to run while
129
- * waiting for forked providers to finish announcing their Moleculer service.
130
- */
131
- private readonly pendingWaiters;
132
- /** Period for the "still waiting" log emitted by `waitForProvider`. */
133
- private static readonly WAIT_HEARTBEAT_INTERVAL_MS;
134
- constructor(logger: IScopedLogger, eventBus?: IEventBus);
135
- /** Set the config reader for singleton preference resolution. */
136
- setConfigReader(reader: ConfigReader): void;
137
- /**
138
- * Set the config reader for collection-provider enable/disable persistence.
139
- * Consulted by {@link registerProvider} so a provider an operator disabled
140
- * in a previous session comes back disabled after a hub reboot.
141
- */
142
- setCollectionConfigReader(reader: CollectionConfigReader): void;
143
- /** Register boot-time dependency edges (from CapabilityDeclaration.dependsOn). */
144
- setDependencies(capabilityName: string, dependsOn: readonly string[]): void;
145
- /** Set the router factory — called by the server layer once at boot. */
146
- setRouterFactory(factory: CapabilityRouterFactory): void;
147
- /** Mark boot complete. Before this, getProvider() returns null. */
148
- ready(): void;
149
- isReady(): boolean;
150
- /**
151
- * Declare a capability from its definition.
152
- * Creates the auto-mounted router (if factory is set).
153
- * Called during addon manifest loading, before providers are registered.
154
- */
155
- declareCapability(definition: CapabilityDefinition): void;
156
- /**
157
- * Register manifest metadata (dependsOn + autoActivate) for a capability,
158
- * and — when the capability's definition declares `kind: 'wrapper'` —
159
- * register the addon as a wrapper provider.
160
- *
161
- * The capability MUST already be declared via `declareCapability` from
162
- * its full `CapabilityDefinition`. Behavioural metadata (`mode`, `kind`,
163
- * `defaultActive`) is owned exclusively by the cap definition — never
164
- * the manifest (D4, base-layer rework; mirrors the Session 5 A5 `mode`
165
- * consolidation). The manifest declaration carries only the cap name,
166
- * `dependsOn`, `autoActivate`, and `optional`.
167
- */
168
- declareFromManifest(declaration: CapabilityDeclaration, addonId?: string): void;
169
- /**
170
- * Register a provider for a capability.
171
- * For singleton: auto-activates if user-preferred or first registered.
172
- * For collection: adds to the collection.
173
- *
174
- * Phase 12 (settings redesign follow-up): throws if the same
175
- * `(capabilityName, addonId)` pair is registered more than once.
176
- * Previously the second call would silently replace the first via
177
- * `state.providers.set(addonId, provider)` — that was the root cause
178
- * of the "analysis-pipeline registered three times" bug observed in
179
- * the kernel cleanup log (`analytics` addon called `registerProvider`
180
- * twice plus the `analysis-pipeline` addon called it a third time).
181
- *
182
- * Double-register of the same pair is always a programmer error —
183
- * two legitimately different addons implementing the same cap keep
184
- * using different `addonId`s and the user picks one via `configReader`.
185
- *
186
- * `owner` (optional) stamps the registration with the incarnation that made
187
- * it — see {@link ProviderOwnerToken}. Once stamped, only an unregister
188
- * presenting the SAME token can delete it. Registration paths whose key is
189
- * reused across process generations (the UDS child manifest, the D3
190
- * `registerNode` handshake) MUST pass one; ownerless registrations keep the
191
- * historical unconditional behaviour.
192
- */
193
- registerProvider(capabilityName: string, addonId: string, provider: unknown, owner?: ProviderOwnerToken): void;
194
- /**
195
- * Whether a provider for the exact `(capabilityName, addonId)` pair is
196
- * currently registered. Lets a re-registration path (e.g. the agent's
197
- * in-place group-runner reload) make {@link registerProvider} idempotent by
198
- * dropping a stale prior registration first — `registerProvider` itself
199
- * throws on a duplicate pair (a deliberate guard against a duplicate
200
- * `registerProvider` call inside one init path), so callers that legitimately
201
- * re-register the same pair must unregister first.
202
- */
203
- hasProvider(capabilityName: string, addonId: string): boolean;
204
- /**
205
- * Addon ids whose manifest declares `capabilityName`, whether or not they
206
- * have registered a provider yet.
207
- *
208
- * Pair it with {@link hasProvider} to separate "this capability's collection
209
- * is still filling up" from "this is everything there will ever be" — the
210
- * difference between a 503 a client should retry and a 400 it should not.
211
- * Every entry is an addon INSTALLED on this node; an addon that is installed
212
- * but disabled therefore stays listed, which is the honest answer (the
213
- * capability is owed by something that is not going to supply it, and naming
214
- * it is the diagnosis).
215
- */
216
- getManifestDeclarers(capabilityName: string): readonly string[];
217
- /**
218
- * The owner token a registration declared, or `null` when the pair is not
219
- * registered or was registered without one.
220
- */
221
- getProviderOwner(capabilityName: string, addonId: string): ProviderOwnerToken | null;
222
- /**
223
- * Hand an EXISTING registration to a new owner, without touching the provider
224
- * instance, the active-singleton selection or any event.
225
- *
226
- * The takeover case: a replacement runner handshakes with an UNCHANGED cap
227
- * set, so the manifest diff correctly leaves the registration alone — but the
228
- * registration is still stamped with the dead generation's token, and nothing
229
- * the LIVE generation can present would ever match it. Re-stamping keeps the
230
- * capability cleanable when the successor eventually dies.
231
- *
232
- * Returns `false` when the pair is not registered (nothing to hand over) —
233
- * the caller decides whether that is a register-instead or a diagnosis.
234
- */
235
- reassignProviderOwner(capabilityName: string, addonId: string, owner: ProviderOwnerToken): boolean;
236
- /**
237
- * Unregister a provider. For singleton: clears active. For collection:
238
- * removes from list.
239
- *
240
- * `owner` is the caller's PROOF that it owns the registration it is deleting.
241
- * When the registration declared an owner (see {@link ProviderOwnerToken})
242
- * and the caller presents a different one — or none at all — this is a
243
- * logged no-op: the caller belongs to a generation that no longer holds the
244
- * key. This is what stops a dead runner's teardown from erasing its
245
- * successor's live registration ([D188](../../../../docs/decisions/adr-0188-an-unregister-carries-proof-of-ownership.md)).
246
- */
247
- unregisterProvider(capabilityName: string, addonId: string, owner?: ProviderOwnerToken): void;
248
- /**
249
- * Re-apply the operator's PERSISTED preferences to providers that
250
- * registered before those preferences could be read — once, when the boot
251
- * read of them settles (D675).
252
- *
253
- * `registerProvider` consults the preference readers at the moment a
254
- * provider registers. With the settings engine isolated (D231) the
255
- * preferences arrive over an async door, so a provider can register before
256
- * they are known; the readers then answer "no preference" and the default
257
- * wins. This replays the answer the readers give NOW over every registered
258
- * provider: a singleton whose persisted choice is registered and not active
259
- * is switched to it, and a collection provider the operator disabled is
260
- * disabled again. It is one pass, triggered by the read settling — not a
261
- * wait, a poll or a retry (D3).
262
- *
263
- * `skip` names the capabilities that must not be switched live (infra caps
264
- * need a restart — the same rule `capabilities.setPreference` applies).
265
- */
266
- applyPersistedPreferences(skip: (capability: string) => boolean): PersistedPreferenceReplay;
267
- /** Enable a previously disabled collection provider. */
268
- enableCollectionProvider(capability: string, addonId: string): void;
269
- /** Disable a collection provider (keeps it registered but excluded from active list). */
270
- disableCollectionProvider(capability: string, addonId: string): void;
271
- /**
272
- * Register a native capability provider scoped to a single device.
273
- * Throws if the same `(capName, deviceId)` is registered twice — that is
274
- * always a programmer error: device-driver addons must call
275
- * `DeviceContext.registerNativeCap` exactly once per cap per device.
276
- */
277
- registerNativeProvider(capName: string, deviceId: number, addonId: string, provider: unknown): void;
278
- /** Remove a single native provider entry. No-op if absent. */
279
- unregisterNativeProvider(capName: string, deviceId: number): void;
280
- /** Remove every native provider entry for a device — called on device removal. */
281
- unregisterAllNativeForDevice(deviceId: number): void;
282
- /** Fallback resolver for native providers that aren't registered in-process. */
283
- private nativeFallback;
284
- /**
285
- * Install a fallback resolver for cross-process native caps. When a device's
286
- * live `IDevice` lives in a forked worker (e.g. `provider-rtsp`), the native
287
- * cap it published via `DeviceContext.registerNativeCap` is reachable over
288
- * the broker — but the hub's `nativeProviders` map never saw it. The fallback
289
- * is called by {@link getNativeProvider} on local-miss and is expected to
290
- * return a proxy object whose methods issue `broker.call` into the owning
291
- * worker. Set once at hub boot time.
292
- */
293
- setNativeFallback(resolver: (capName: string, deviceId: number) => unknown | null): void;
294
- /**
295
- * Resolve the native provider for `(capName, deviceId)` or null. A CLAIMED
296
- * cap's provider is handed back with its `getStatus` overlaid (D663, S3) —
297
- * on the in-process branch AND the `nativeFallback` branch, which is the
298
- * path the HA feeder's devices take.
299
- */
300
- getNativeProvider<T = unknown>(capName: string, deviceId: number): T | null;
301
- /** The device-manager's view over its mirror; `null` until installed. */
302
- private statusOverlay;
303
- /** `(cap, device)` pairs whose merged slice currently fails its status schema — one warn per transition. */
304
- private readonly overlayParseFailing;
305
- /**
306
- * Install (or remove, with `null`) the claimed-status overlay. Installed once
307
- * by the device-manager at init over its `DeviceStateMirror`; removed on its
308
- * shutdown. Wrappers already resolved re-read it at call time, so an
309
- * uninstall hands `getStatus` back to the native immediately.
310
- */
311
- setStatusOverlay(overlay: StatusOverlay | null): void;
312
- /**
313
- * THE question every `getStatus` awaits before it is answered (the registry's
314
- * own wrappers at call time, and the three transport entries through
315
- * `answerClaimedGetStatus`). The overlay resolves the device's claims first;
316
- * `unknown` survives only when its row cannot be read, and the caller then
317
- * answers "not reported", never the native (D315, D49).
318
- *
319
- * A claimed slice is parsed with the cap's `status.schema` — S4 makes
320
- * `status ⊆ runtimeState`, so the merged runtime slice parses and a
321
- * runtime-only key such as `lastFetchedAt` is stripped. A slice that does not
322
- * parse is `null`, logged once per `(cap, device)` transition with the device
323
- * tag; a held claim is `null` without a parse. A cap with no `status` block
324
- * passes its merged slice through as is.
325
- */
326
- resolveClaimedStatus(capName: string, deviceId: number): Promise<StatusOverlayAnswer>;
327
- private parseClaimed;
328
- /**
329
- * Hand `provider` back untouched when `(capName, deviceId)` is KNOWN to be
330
- * unclaimed; otherwise wrap it so `getStatus` awaits `resolveClaimedStatus`
331
- * (re-read at call time — the parse, and for an unknown device the row read,
332
- * happen only when `getStatus` is actually called) and everything else stays
333
- * the provider's own. An unclaimed device pays one in-memory lookup; with no
334
- * overlay installed it pays nothing.
335
- */
336
- private withOverlay;
337
- /** Resolve the addonId that registered the native provider for `(capName, deviceId)`. */
338
- getNativeAddonId(capName: string, deviceId: number): string | null;
339
- /** List the capability names for which this device has a native provider registered. */
340
- getNativeCapsForDevice(deviceId: number): readonly string[];
341
- /**
342
- * Mark `addonId` as providing a wrapper implementation for `capName`. Called
343
- * by `declareFromManifest` when the capability's `CapabilityDefinition` declares
344
- * `kind: 'wrapper'` (D4 — the cap definition is the single source of truth for wrapper behaviour).
345
- * Idempotent — re-registration keeps a single entry.
346
- */
347
- registerWrapper(capName: string, addonId: string, opts?: {
348
- defaultActive?: boolean;
349
- }): void;
350
- /** Remove a wrapper registration. No-op if absent. */
351
- unregisterWrapper(capName: string, addonId: string): void;
352
- /** Remove every wrapper registration owned by `addonId`. Called on addon stop. */
353
- unregisterAllWrappersForAddon(addonId: string): void;
354
- /** Return the addon ids that declared a wrapper for `capName`. */
355
- getWrappersForCap(capName: string): readonly string[];
356
- /**
357
- * Return the wrapper addon flagged `defaultActive: true` for `capName`, or
358
- * null when no wrapper declared itself the default. Used by
359
- * `device-manager.getBindings` to auto-bind default wrappers on devices
360
- * without an explicit user activation.
361
- */
362
- getDefaultWrapperForCap(capName: string): string | null;
363
- /** List capability names that have at least one wrapper flagged `defaultActive: true`. */
364
- getCapsWithDefaultWrapper(): readonly string[];
365
- /**
366
- * Get the active provider for a singleton capability.
367
- *
368
- * When called with a declared capability name (a key of
369
- * `CapabilityProviderMap`), the return type is inferred automatically —
370
- * no caller-side casts needed. Arbitrary string names fall back to
371
- * `unknown`.
372
- */
373
- getProvider<K extends keyof CapabilityProviderMap>(capabilityName: K): CapabilityProviderMap[K] | null;
374
- getProvider(capabilityName: string): unknown | null;
375
- /**
376
- * Unified per-device resolver (D13). Resolves a `(cap, device)` pair to
377
- * its provider transparently — native (per-device) first, then a
378
- * device-bound system provider. Callers no longer branch on
379
- * `kind: 'native' | 'wrapped'`; `kind` is metadata on the binding only.
380
- *
381
- * Resolution order:
382
- * 1. Native provider registered for the exact `(capName, deviceId)` pair.
383
- * 2. System provider: for singleton caps, honours per-device overrides and
384
- * activation via `resolveForDevice`; for collection caps, returns the
385
- * first registered provider.
386
- * 3. `null` when neither exists.
387
- */
388
- getProviderForDevice<T = unknown>(capName: string, deviceId: number): T | null;
389
- /** Get all providers for a collection capability. */
390
- getAllProviders<K extends keyof CapabilityProviderMap>(capabilityName: K): readonly CapabilityProviderMap[K][];
391
- getAllProviders(capabilityName: string): readonly unknown[];
392
- /** Get provider by addon ID (for per-device resolution). */
393
- getProviderByAddon<K extends keyof CapabilityProviderMap>(capabilityName: K, addonId: string): CapabilityProviderMap[K] | null;
394
- getProviderByAddon<T = unknown>(capabilityName: string, addonId: string): T | null;
395
- /**
396
- * Wait for a specific `(capabilityName, addonId)` provider to become
397
- * available, up to `timeoutMs`. Resolves synchronously with the live
398
- * provider if it is already registered; otherwise queues a waiter that
399
- * {@link registerProvider} fulfils as soon as the matching pair shows up.
400
- * Resolves to `null` on timeout instead of rejecting — the caller
401
- * ({@link device-management.router}) already branches on `null` to return
402
- * a user-facing "provider not available" error.
403
- *
404
- * Replaces the 100ms polling loop from the post-settings-redesign
405
- * `waitForDeviceProvider` helper. On the happy path there is zero
406
- * overhead and zero behavioural change; on the race path the wait
407
- * unblocks on the next `registerProvider` call without any intermediate
408
- * sleeps. See `[WAIT-EVENT]` in the 2026-04-12 handover.
409
- */
410
- waitForProvider<K extends keyof CapabilityProviderMap>(capabilityName: K, addonId: string, timeoutMs: number): Promise<CapabilityProviderMap[K] | null>;
411
- waitForProvider(capabilityName: string, addonId: string, timeoutMs: number): Promise<unknown | null>;
412
- /**
413
- * Get the active singleton provider for a capability.
414
- *
415
- * Declared capability names resolve to their typed provider via
416
- * `SingletonCapabilityMap` — a cap declared as `collection` in its
417
- * `.cap.ts` definition is rejected at the type level. Arbitrary strings
418
- * (non-declared capabilities) fall back to the caller-provided `T`
419
- * (default `unknown`) through the second overload for compatibility
420
- * with downstream packages that extend `CapabilityProviderMap` via
421
- * declaration merging.
422
- *
423
- * Hard-typed narrowing via `SingletonCapabilityMap` was introduced in
424
- * session 5 Sprint A5 — see audit addendum finding R6.
425
- */
426
- getSingleton<K extends keyof SingletonCapabilityMap>(capability: K): SingletonCapabilityMap[K] | null;
427
- getSingleton<T = unknown>(capability: string): T | null;
428
- /** Get the addon ID of the active singleton provider. */
429
- getSingletonAddonId(capability: string): string | null;
430
- /**
431
- * Override the active addon for a singleton capability. Called by the
432
- * pipeline-orchestrator binding system so future `getSingleton(cap)`
433
- * lookups return the addon the operator explicitly selected. If
434
- * `addonId` is `null` or no provider is registered under that id,
435
- * falls back to the cap-declared `preferredProvider` (when registered),
436
- * otherwise the first-registered provider (legacy behaviour).
437
- *
438
- * This helper is an internal hook for the UDS-preference race (it does
439
- * NOT read `configReader` — the operator's persisted choice is applied
440
- * by `registerProvider`/`unregisterProvider`). For consistency with those
441
- * paths the fallback still honours `preferredProvider` ahead of
442
- * insertion-order first-remaining.
443
- *
444
- * No-op when the capability isn't declared, isn't a singleton, or the
445
- * requested addon hasn't registered a provider for it yet.
446
- */
447
- setSingletonActiveAddon(capability: string, addonId: string | null): void;
448
- /**
449
- * Get all active collection providers for a capability.
450
- *
451
- * Declared capability names resolve to their typed provider via
452
- * `CollectionCapabilityMap` — a cap declared as `singleton` in its
453
- * `.cap.ts` definition is rejected at the type level. Arbitrary strings
454
- * fall back to the caller-provided `T` (default `unknown`) for
455
- * compatibility with declaration-merged extensions.
456
- */
457
- getCollection<K extends keyof CollectionCapabilityMap>(capability: K): readonly CollectionCapabilityMap[K][];
458
- getCollection<T = unknown>(capability: string): readonly T[];
459
- /**
460
- * Like {@link getCollection} but returns `[addonId, provider]` tuples so
461
- * callers can attribute work back to the contributing addon.
462
- *
463
- * Needed by the device-settings aggregator (`device-manager.addon.ts`) —
464
- * each contributed field must carry the writer's `addonId` so the
465
- * `deviceManager.updateDeviceField` mutation can route the write to the
466
- * correct addon-settings store without hardcoding any addon identity.
467
- */
468
- getCollectionEntries<K extends keyof CollectionCapabilityMap>(capability: K): readonly (readonly [string, CollectionCapabilityMap[K]])[];
469
- getCollectionEntries<T = unknown>(capability: string): readonly (readonly [string, T])[];
470
- /**
471
- * Is `addonId` currently DISABLED as a provider of `capability`?
472
- *
473
- * Exposed because the disabled set was write-only for `log-destination`:
474
- * the orchestrator toggle added the addon here and nothing ever read it, so
475
- * console and winston could not be turned off at all while the UI badge said
476
- * they were (audit 2026-07-30).
477
- */
478
- isProviderDisabled(capability: string, addonId: string): boolean;
479
- /** Get the full CapabilityDefinition for a declared capability. */
480
- getDefinition(capability: string): CapabilityDefinition | undefined;
481
- /** Get the mode declared for a capability. */
482
- getMode(capability: string): CapabilityMode | undefined;
483
- /** Get a specific addon's provider by addon ID. */
484
- getProviderByAddonId<K extends keyof CapabilityProviderMap>(capability: K, addonId: string): CapabilityProviderMap[K] | null;
485
- getProviderByAddonId<T = unknown>(capability: string, addonId: string): T | null;
486
- /**
487
- * Every registry KEY currently registered for `capability`, disabled ones
488
- * included — i.e. exactly the ids {@link getProviderByAddonId} can resolve.
489
- * Keys are bare (`homeassistant-export`) for hub-local providers and
490
- * `<addonId>@<nodeId>` for providers that registered from another node.
491
- *
492
- * Exists so an unresolvable `{ addonId }` pin can REFUSE with the valid ids
493
- * spelled out (the `addons.custom` unknown-id posture) instead of silently
494
- * degrading to another provider's answer — a fabricated `addonId` used to
495
- * return the first-registered provider's status, indistinguishable from
496
- * success (2026-08-09).
497
- */
498
- getProviderAddonIds(capability: string): readonly string[];
499
- /** Bare addonId from a registry key (`webrtc-native@dev-agent-0` → `webrtc-native`). */
500
- private bareAddonId;
501
- /** nodeId a provider key belongs to (bare → 'hub', `@node` → node). */
502
- private nodeOfKey;
503
- /** capName → (nodeId → bare addonId[]) availability derived from provider keys. */
504
- getProvidersByNode(capability: string): Map<string, string[]>;
505
- /**
506
- * Resolve the BARE addon id a node should use for a singleton cap.
507
- * Chain: per-node override → cluster-global default → first available.
508
- * Returns null when the node hosts no provider for the cap.
509
- */
510
- resolveSingletonAddonIdForNode(capability: string, nodeId: string): string | null;
511
- /** Resolve the in-process provider object for a node (hub-local only). */
512
- getSingletonForNode<T = unknown>(capability: string, nodeId: string): T | null;
513
- /** Per-node override accessor (for listCapabilities + tests). */
514
- getSingletonNodeOverrides(capability: string): Map<string, string>;
515
- /** Set the reader for persisted per-node overrides (boot restore). */
516
- setNodeConfigReader(reader: (capability: string, nodeId: string) => string | undefined): void;
517
- /** Clear a per-node override (UI "inherit global"). */
518
- clearSingletonNodeOverride(capability: string, nodeId: string): void;
519
- /**
520
- * Set which addon should be the active singleton for a capability.
521
- * Pass an optional `nodeId` to set a per-node override instead of the cluster-global default.
522
- */
523
- setActiveSingleton(capability: string, addonId: string, nodeId?: string): Promise<void>;
524
- /**
525
- * Check if a specific addon's capability is active.
526
- *
527
- * Resolution: the manifest's `autoActivate` flag, else active. There is no
528
- * persisted override layer — see D334: an activation map keyed by
529
- * `{capability}/{addonId}` is a second authority over a function some addon
530
- * already owns, which is what D62 forbids.
531
- */
532
- isActiveForSystem(capability: string, addonId: string): boolean;
533
- /**
534
- * Get all addon/capability activations at system level.
535
- * Returns every registered provider with its resolved active status.
536
- */
537
- getSystemActivations(): ReadonlyArray<{
538
- capability: string;
539
- addonId: string;
540
- active: boolean;
541
- }>;
542
- /** Set a per-device singleton override. */
543
- setDeviceOverride(deviceId: string, capability: string, addonId: string): void;
544
- /** Clear a per-device singleton override. */
545
- clearDeviceOverride(deviceId: string, capability: string): void;
546
- /** Get all per-device singleton overrides for a device. */
547
- getDeviceOverrides(deviceId: string): Map<string, string>;
548
- /**
549
- * Resolve a singleton provider for a specific device.
550
- * Checks activation (the manifest's autoActivate) then the per-device
551
- * singleton override — the in-memory provider pin, not a persisted flag.
552
- */
553
- resolveForDevice<T = unknown>(capability: string, deviceId: string): T | null;
554
- /**
555
- * Resolve collection providers for a specific device.
556
- *
557
- * Filters by activation (the manifest's autoActivate) and by nothing else.
558
- * The per-device DENY set that used to filter here is gone with the switch
559
- * it projected (2026-09-20): *"tutti i providers funzionano sempre"* [all the providers always work]. WHICH
560
- * providers a device has is now answered by its BINDINGS
561
- * (`device-bindings-store.ts` step 0), which is a different question from
562
- * which of them are registered and running — this one.
563
- *
564
- * `deviceId` is kept in the signature and deliberately unused: the resolution
565
- * is per-device by CONTRACT, and a caller that stops passing one is a caller
566
- * that has stopped asking about a device.
567
- */
568
- resolveCollectionForDevice<T = unknown>(capability: string, _deviceId: string): readonly T[];
569
- /** Check if all dependencies for a capability are satisfied. */
570
- areDependenciesMet(capabilityName: string): boolean;
571
- /** Get topologically sorted boot order based on dependsOn. */
572
- getBootOrder(): string[];
573
- /** Get all auto-mounted routers. Key = capability name. */
574
- getMountedRouters(): ReadonlyMap<string, CapabilityRouter>;
575
- /** Get a single mounted router by capability name. */
576
- getRouter(capabilityName: string): CapabilityRouter | null;
577
- /** List all declared capabilities (v1-compatible shape). */
578
- listCapabilities(): CapabilityInfo[];
579
- /** Check if a capability is declared. */
580
- has(capabilityName: string): boolean;
581
- /** Check if a capability has at least one provider. */
582
- isAvailable(capabilityName: string): boolean;
583
- /**
584
- * Return every declared device-scoped capability (`scope: 'device'`)
585
- * whose `deviceTypes` list includes the given type — or caps that declare
586
- * no explicit `deviceTypes` (treat as applies-to-all). Used by the
587
- * bindings UI to enumerate which caps the user can wire for a device.
588
- */
589
- listDeviceScopedCapsForType(deviceType: string): readonly string[];
590
- private emitEvent;
58
+ private readonly capabilities;
59
+ private readonly logger;
60
+ private readonly eventBus;
61
+ private routerFactory;
62
+ private configReader;
63
+ private collectionConfigReader;
64
+ private _ready;
65
+ /** Boot-time dependency graph: capability → dependsOn names (from CapabilityDeclaration) */
66
+ private readonly capabilityDeps;
67
+ /**
68
+ * capability → addon ids whose MANIFEST declares it.
69
+ *
70
+ * Populated by {@link declareFromManifest}, which runs at addon-LOAD time —
71
+ * before a forked addon's runner has spawned, let alone registered anything.
72
+ * So this map answers a question `providers` cannot: **which addons still owe
73
+ * this capability a provider**, i.e. is an absence final or merely early.
74
+ *
75
+ * It is not a second registry and nothing waits on it: it stores an argument
76
+ * `declareFromManifest` was already being handed and dropping, and it is read
77
+ * synchronously at the moment a caller needs the answer ([D3](../../../../docs/decisions/adr-0003.md)).
78
+ */
79
+ private readonly manifestDeclarers;
80
+ /** Per-device singleton overrides: deviceId → (capability → addonId) */
81
+ private readonly deviceOverrides;
82
+ /** capName → (nodeId → bare addonId) per-node singleton overrides. */
83
+ private readonly singletonNodeOverrides;
84
+ /** Optional reader for persisted per-node overrides: (cap, nodeId) → addonId. */
85
+ private nodeConfigReader;
86
+ /**
87
+ * Per-device SOURCE deactivations: deviceId → (capability → disabled addon ids).
88
+ *
89
+ * The in-memory PROJECTION of the persisted wrapper activation
90
+ * (`deviceBindings[deviceId][capName].disabledSourceAddonIds`, written by
91
+ * `setWrapperActive`), and never an authority of its own —
92
+ * [D556](../../../../docs/decisions/adr-0556-a-per-device-source-switch-is-the-wrapper-activation-and-the-registry-holds-only-its-projection.md).
93
+ * Nothing but `device-source-activation.ts` writes it: the operator's verb
94
+ * is `deviceManager.setWrapperActive`, and a second writable surface here is
95
+ * exactly the two-authorities defect D62 exists for.
96
+ *
97
+ * A DENY list, not an allow list, and that is the deliberate answer to what
98
+ * "unset" means: a source nobody has ruled out is a source. An untouched
99
+ * camera keeps every provider it has today, and a provider that registers
100
+ * after the operator's last toggle needs no second write to be seen.
101
+ */
102
+ /** autoActivate flags per (capability, addonId) — from addon manifests */
103
+ private readonly autoActivateFlags;
104
+ /**
105
+ * Per-device native providers: capName → deviceId (numeric) → { addonId, provider }.
106
+ *
107
+ * Backs `DeviceContext.registerNativeCap`. Lets device-driver addons
108
+ * (OnvifCamera, RtspCamera, etc.) publish capability implementations
109
+ * scoped to a single device; the device-proxy router resolves these by
110
+ * `(capName, deviceId)` to dispatch incoming calls.
111
+ *
112
+ * Distinct from the `capabilities[].providers` map (system-wide providers
113
+ * keyed by addonId) — native providers are device-instance-scoped and
114
+ * never participate in singleton/collection resolution.
115
+ */
116
+ private readonly nativeProviders;
117
+ /**
118
+ * Wrapper provider registrations: capName → Set<addonId>. Tracked separately
119
+ * from `capabilities[].providers` because wrappers aren't system-wide
120
+ * providers — they're user-toggleable decorators addons declare via
121
+ * `ProviderRegistration.kind === 'wrapper'`. Consumers query this map (via
122
+ * `getWrappersForCap`) to render the "pick a wrapper for this device"
123
+ * dropdown in the device-bindings UI.
124
+ */
125
+ private readonly wrapperProviders;
126
+ /**
127
+ * Wrapper registrations that declared `ProviderRegistration.defaultActive:
128
+ * true`. Keyed by `capName` and valued by `addonId` — the first wrapper
129
+ * flagged default-active wins per cap. Consumed by `device-manager.getBindings`
130
+ * to synthesise a wrapper binding when no explicit activation has been
131
+ * persisted for a (device, cap) pair and no native provider exists either —
132
+ * otherwise the default wrapper would sit dormant waiting for a manual
133
+ * `setWrapperActive({active: true})` that never comes.
134
+ */
135
+ private readonly wrapperDefaults;
136
+ /**
137
+ * Pending {@link waitForProvider} waiters, keyed by
138
+ * `"${capabilityName}::${addonId}"`. Resolved by {@link registerProvider}
139
+ * as soon as the matching pair is registered — the mechanism that replaces
140
+ * the 100ms polling loop the device-management router used to run while
141
+ * waiting for forked providers to finish announcing their Moleculer service.
142
+ */
143
+ private readonly pendingWaiters;
144
+ /** Period for the "still waiting" log emitted by `waitForProvider`. */
145
+ private static readonly WAIT_HEARTBEAT_INTERVAL_MS;
146
+ constructor(logger: IScopedLogger, eventBus?: IEventBus);
147
+ /** Set the config reader for singleton preference resolution. */
148
+ setConfigReader(reader: ConfigReader): void;
149
+ /**
150
+ * Set the config reader for collection-provider enable/disable persistence.
151
+ * Consulted by {@link registerProvider} so a provider an operator disabled
152
+ * in a previous session comes back disabled after a hub reboot.
153
+ */
154
+ setCollectionConfigReader(reader: CollectionConfigReader): void;
155
+ /** Register boot-time dependency edges (from CapabilityDeclaration.dependsOn). */
156
+ setDependencies(capabilityName: string, dependsOn: readonly string[]): void;
157
+ /** Set the router factory — called by the server layer once at boot. */
158
+ setRouterFactory(factory: CapabilityRouterFactory): void;
159
+ /** Mark boot complete. Before this, getProvider() returns null. */
160
+ ready(): void;
161
+ isReady(): boolean;
162
+ /**
163
+ * Declare a capability from its definition.
164
+ * Creates the auto-mounted router (if factory is set).
165
+ * Called during addon manifest loading, before providers are registered.
166
+ */
167
+ declareCapability(definition: CapabilityDefinition): void;
168
+ /**
169
+ * Register manifest metadata (dependsOn + autoActivate) for a capability,
170
+ * and — when the capability's definition declares `kind: 'wrapper'` —
171
+ * register the addon as a wrapper provider.
172
+ *
173
+ * The capability MUST already be declared via `declareCapability` from
174
+ * its full `CapabilityDefinition`. Behavioural metadata (`mode`, `kind`,
175
+ * `defaultActive`) is owned exclusively by the cap definition — never
176
+ * the manifest (D4, base-layer rework; mirrors the Session 5 A5 `mode`
177
+ * consolidation). The manifest declaration carries only the cap name,
178
+ * `dependsOn`, `autoActivate`, and `optional`.
179
+ */
180
+ declareFromManifest(declaration: CapabilityDeclaration, addonId?: string): void;
181
+ /**
182
+ * Register a provider for a capability.
183
+ * For singleton: auto-activates if user-preferred or first registered.
184
+ * For collection: adds to the collection.
185
+ *
186
+ * Phase 12 (settings redesign follow-up): throws if the same
187
+ * `(capabilityName, addonId)` pair is registered more than once.
188
+ * Previously the second call would silently replace the first via
189
+ * `state.providers.set(addonId, provider)` — that was the root cause
190
+ * of the "analysis-pipeline registered three times" bug observed in
191
+ * the kernel cleanup log (`analytics` addon called `registerProvider`
192
+ * twice plus the `analysis-pipeline` addon called it a third time).
193
+ *
194
+ * Double-register of the same pair is always a programmer error —
195
+ * two legitimately different addons implementing the same cap keep
196
+ * using different `addonId`s and the user picks one via `configReader`.
197
+ *
198
+ * `owner` (optional) stamps the registration with the incarnation that made
199
+ * it — see {@link ProviderOwnerToken}. Once stamped, only an unregister
200
+ * presenting the SAME token can delete it. Registration paths whose key is
201
+ * reused across process generations (the UDS child manifest, the D3
202
+ * `registerNode` handshake) MUST pass one; ownerless registrations keep the
203
+ * historical unconditional behaviour.
204
+ */
205
+ registerProvider(capabilityName: string, addonId: string, provider: unknown, owner?: ProviderOwnerToken): void;
206
+ /**
207
+ * Whether a provider for the exact `(capabilityName, addonId)` pair is
208
+ * currently registered. Lets a re-registration path (e.g. the agent's
209
+ * in-place group-runner reload) make {@link registerProvider} idempotent by
210
+ * dropping a stale prior registration first — `registerProvider` itself
211
+ * throws on a duplicate pair (a deliberate guard against a duplicate
212
+ * `registerProvider` call inside one init path), so callers that legitimately
213
+ * re-register the same pair must unregister first.
214
+ */
215
+ hasProvider(capabilityName: string, addonId: string): boolean;
216
+ /**
217
+ * Addon ids whose manifest declares `capabilityName`, whether or not they
218
+ * have registered a provider yet.
219
+ *
220
+ * Pair it with {@link hasProvider} to separate "this capability's collection
221
+ * is still filling up" from "this is everything there will ever be" — the
222
+ * difference between a 503 a client should retry and a 400 it should not.
223
+ * Every entry is an addon INSTALLED on this node; an addon that is installed
224
+ * but disabled therefore stays listed, which is the honest answer (the
225
+ * capability is owed by something that is not going to supply it, and naming
226
+ * it is the diagnosis).
227
+ */
228
+ getManifestDeclarers(capabilityName: string): readonly string[];
229
+ /**
230
+ * The owner token a registration declared, or `null` when the pair is not
231
+ * registered or was registered without one.
232
+ */
233
+ getProviderOwner(capabilityName: string, addonId: string): ProviderOwnerToken | null;
234
+ /**
235
+ * Hand an EXISTING registration to a new owner, without touching the provider
236
+ * instance, the active-singleton selection or any event.
237
+ *
238
+ * The takeover case: a replacement runner handshakes with an UNCHANGED cap
239
+ * set, so the manifest diff correctly leaves the registration alone — but the
240
+ * registration is still stamped with the dead generation's token, and nothing
241
+ * the LIVE generation can present would ever match it. Re-stamping keeps the
242
+ * capability cleanable when the successor eventually dies.
243
+ *
244
+ * Returns `false` when the pair is not registered (nothing to hand over) —
245
+ * the caller decides whether that is a register-instead or a diagnosis.
246
+ */
247
+ reassignProviderOwner(capabilityName: string, addonId: string, owner: ProviderOwnerToken): boolean;
248
+ /**
249
+ * Unregister a provider. For singleton: clears active. For collection:
250
+ * removes from list.
251
+ *
252
+ * `owner` is the caller's PROOF that it owns the registration it is deleting.
253
+ * When the registration declared an owner (see {@link ProviderOwnerToken})
254
+ * and the caller presents a different one — or none at all — this is a
255
+ * logged no-op: the caller belongs to a generation that no longer holds the
256
+ * key. This is what stops a dead runner's teardown from erasing its
257
+ * successor's live registration ([D188](../../../../docs/decisions/adr-0188-an-unregister-carries-proof-of-ownership.md)).
258
+ */
259
+ unregisterProvider(capabilityName: string, addonId: string, owner?: ProviderOwnerToken): void;
260
+ /**
261
+ * Re-apply the operator's PERSISTED preferences to providers that
262
+ * registered before those preferences could be read — once, when the boot
263
+ * read of them settles (D675).
264
+ *
265
+ * `registerProvider` consults the preference readers at the moment a
266
+ * provider registers. With the settings engine isolated (D231) the
267
+ * preferences arrive over an async door, so a provider can register before
268
+ * they are known; the readers then answer "no preference" and the default
269
+ * wins. This replays the answer the readers give NOW over every registered
270
+ * provider: a singleton whose persisted choice is registered and not active
271
+ * is switched to it, and a collection provider the operator disabled is
272
+ * disabled again. It is one pass, triggered by the read settling — not a
273
+ * wait, a poll or a retry (D3).
274
+ *
275
+ * `skip` names the capabilities that must not be switched live (infra caps
276
+ * need a restart — the same rule `capabilities.setPreference` applies).
277
+ */
278
+ applyPersistedPreferences(skip: (capability: string) => boolean): PersistedPreferenceReplay;
279
+ /** Enable a previously disabled collection provider. */
280
+ enableCollectionProvider(capability: string, addonId: string): void;
281
+ /** Disable a collection provider (keeps it registered but excluded from active list). */
282
+ disableCollectionProvider(capability: string, addonId: string): void;
283
+ /**
284
+ * Register a native capability provider scoped to a single device.
285
+ * Throws if the same `(capName, deviceId)` is registered twice — that is
286
+ * always a programmer error: device-driver addons must call
287
+ * `DeviceContext.registerNativeCap` exactly once per cap per device.
288
+ */
289
+ registerNativeProvider(capName: string, deviceId: number, addonId: string, provider: unknown): void;
290
+ /** Remove a single native provider entry. No-op if absent. */
291
+ unregisterNativeProvider(capName: string, deviceId: number): void;
292
+ /** Remove every native provider entry for a device — called on device removal. */
293
+ unregisterAllNativeForDevice(deviceId: number): void;
294
+ /** Fallback resolver for native providers that aren't registered in-process. */
295
+ private nativeFallback;
296
+ /**
297
+ * Install a fallback resolver for cross-process native caps. When a device's
298
+ * live `IDevice` lives in a forked worker (e.g. `provider-rtsp`), the native
299
+ * cap it published via `DeviceContext.registerNativeCap` is reachable over
300
+ * the broker — but the hub's `nativeProviders` map never saw it. The fallback
301
+ * is called by {@link getNativeProvider} on local-miss and is expected to
302
+ * return a proxy object whose methods issue `broker.call` into the owning
303
+ * worker. Set once at hub boot time.
304
+ */
305
+ setNativeFallback(resolver: (capName: string, deviceId: number) => unknown | null): void;
306
+ /**
307
+ * Resolve the native provider for `(capName, deviceId)` or null. A CLAIMED
308
+ * cap's provider is handed back with its `getStatus` overlaid (D663, S3) —
309
+ * on the in-process branch AND the `nativeFallback` branch, which is the
310
+ * path the HA feeder's devices take.
311
+ */
312
+ getNativeProvider<T = unknown>(capName: string, deviceId: number): T | null;
313
+ /** The device-manager's view over its mirror; `null` until installed. */
314
+ private statusOverlay;
315
+ /** `(cap, device)` pairs whose merged slice currently fails its status schema — one warn per transition. */
316
+ private readonly overlayParseFailing;
317
+ /**
318
+ * Install (or remove, with `null`) the claimed-status overlay. Installed once
319
+ * by the device-manager at init over its `DeviceStateMirror`; removed on its
320
+ * shutdown. Wrappers already resolved re-read it at call time, so an
321
+ * uninstall hands `getStatus` back to the native immediately.
322
+ */
323
+ setStatusOverlay(overlay: StatusOverlay | null): void;
324
+ /**
325
+ * THE question every `getStatus` awaits before it is answered (the registry's
326
+ * own wrappers at call time, and the three transport entries through
327
+ * `answerClaimedGetStatus`). The overlay resolves the device's claims first;
328
+ * `unknown` survives only when its row cannot be read, and the caller then
329
+ * answers "not reported", never the native (D315, D49).
330
+ *
331
+ * A claimed slice is parsed with the cap's `status.schema` — S4 makes
332
+ * `status ⊆ runtimeState`, so the merged runtime slice parses and a
333
+ * runtime-only key such as `lastFetchedAt` is stripped. A slice that does not
334
+ * parse is `null`, logged once per `(cap, device)` transition with the device
335
+ * tag; a held claim is `null` without a parse. A cap with no `status` block
336
+ * passes its merged slice through as is.
337
+ */
338
+ resolveClaimedStatus(capName: string, deviceId: number): Promise<StatusOverlayAnswer>;
339
+ private parseClaimed;
340
+ /**
341
+ * Hand `provider` back untouched when `(capName, deviceId)` is KNOWN to be
342
+ * unclaimed; otherwise wrap it so `getStatus` awaits `resolveClaimedStatus`
343
+ * (re-read at call time — the parse, and for an unknown device the row read,
344
+ * happen only when `getStatus` is actually called) and everything else stays
345
+ * the provider's own. An unclaimed device pays one in-memory lookup; with no
346
+ * overlay installed it pays nothing.
347
+ */
348
+ private withOverlay;
349
+ /** Resolve the addonId that registered the native provider for `(capName, deviceId)`. */
350
+ getNativeAddonId(capName: string, deviceId: number): string | null;
351
+ /** List the capability names for which this device has a native provider registered. */
352
+ getNativeCapsForDevice(deviceId: number): readonly string[];
353
+ /**
354
+ * Mark `addonId` as providing a wrapper implementation for `capName`. Called
355
+ * by `declareFromManifest` when the capability's `CapabilityDefinition` declares
356
+ * `kind: 'wrapper'` (D4 — the cap definition is the single source of truth for wrapper behaviour).
357
+ * Idempotent — re-registration keeps a single entry.
358
+ */
359
+ registerWrapper(capName: string, addonId: string, opts?: {
360
+ defaultActive?: boolean;
361
+ }): void;
362
+ /** Remove a wrapper registration. No-op if absent. */
363
+ unregisterWrapper(capName: string, addonId: string): void;
364
+ /** Remove every wrapper registration owned by `addonId`. Called on addon stop. */
365
+ unregisterAllWrappersForAddon(addonId: string): void;
366
+ /** Return the addon ids that declared a wrapper for `capName`. */
367
+ getWrappersForCap(capName: string): readonly string[];
368
+ /**
369
+ * Return the wrapper addon flagged `defaultActive: true` for `capName`, or
370
+ * null when no wrapper declared itself the default. Used by
371
+ * `device-manager.getBindings` to auto-bind default wrappers on devices
372
+ * without an explicit user activation.
373
+ */
374
+ getDefaultWrapperForCap(capName: string): string | null;
375
+ /** List capability names that have at least one wrapper flagged `defaultActive: true`. */
376
+ getCapsWithDefaultWrapper(): readonly string[];
377
+ /**
378
+ * Get the active provider for a singleton capability.
379
+ *
380
+ * When called with a declared capability name (a key of
381
+ * `CapabilityProviderMap`), the return type is inferred automatically —
382
+ * no caller-side casts needed. Arbitrary string names fall back to
383
+ * `unknown`.
384
+ */
385
+ getProvider<K extends keyof CapabilityProviderMap>(capabilityName: K): CapabilityProviderMap[K] | null;
386
+ getProvider(capabilityName: string): unknown | null;
387
+ /**
388
+ * Unified per-device resolver (D13). Resolves a `(cap, device)` pair to
389
+ * its provider transparently — native (per-device) first, then a
390
+ * device-bound system provider. Callers no longer branch on
391
+ * `kind: 'native' | 'wrapped'`; `kind` is metadata on the binding only.
392
+ *
393
+ * Resolution order:
394
+ * 1. Native provider registered for the exact `(capName, deviceId)` pair.
395
+ * 2. System provider: for singleton caps, honours per-device overrides and
396
+ * activation via `resolveForDevice`; for collection caps, returns the
397
+ * first registered provider.
398
+ * 3. `null` when neither exists.
399
+ */
400
+ getProviderForDevice<T = unknown>(capName: string, deviceId: number): T | null;
401
+ /** Get all providers for a collection capability. */
402
+ getAllProviders<K extends keyof CapabilityProviderMap>(capabilityName: K): readonly CapabilityProviderMap[K][];
403
+ getAllProviders(capabilityName: string): readonly unknown[];
404
+ /** Get provider by addon ID (for per-device resolution). */
405
+ getProviderByAddon<K extends keyof CapabilityProviderMap>(capabilityName: K, addonId: string): CapabilityProviderMap[K] | null;
406
+ getProviderByAddon<T = unknown>(capabilityName: string, addonId: string): T | null;
407
+ /**
408
+ * Wait for a specific `(capabilityName, addonId)` provider to become
409
+ * available, up to `timeoutMs`. Resolves synchronously with the live
410
+ * provider if it is already registered; otherwise queues a waiter that
411
+ * {@link registerProvider} fulfils as soon as the matching pair shows up.
412
+ * Resolves to `null` on timeout instead of rejecting — the caller
413
+ * ({@link device-management.router}) already branches on `null` to return
414
+ * a user-facing "provider not available" error.
415
+ *
416
+ * Replaces the 100ms polling loop from the post-settings-redesign
417
+ * `waitForDeviceProvider` helper. On the happy path there is zero
418
+ * overhead and zero behavioural change; on the race path the wait
419
+ * unblocks on the next `registerProvider` call without any intermediate
420
+ * sleeps. See `[WAIT-EVENT]` in the 2026-04-12 handover.
421
+ */
422
+ waitForProvider<K extends keyof CapabilityProviderMap>(capabilityName: K, addonId: string, timeoutMs: number): Promise<CapabilityProviderMap[K] | null>;
423
+ waitForProvider(capabilityName: string, addonId: string, timeoutMs: number): Promise<unknown | null>;
424
+ /**
425
+ * Get the active singleton provider for a capability.
426
+ *
427
+ * Declared capability names resolve to their typed provider via
428
+ * `SingletonCapabilityMap` — a cap declared as `collection` in its
429
+ * `.cap.ts` definition is rejected at the type level. Arbitrary strings
430
+ * (non-declared capabilities) fall back to the caller-provided `T`
431
+ * (default `unknown`) through the second overload for compatibility
432
+ * with downstream packages that extend `CapabilityProviderMap` via
433
+ * declaration merging.
434
+ *
435
+ * Hard-typed narrowing via `SingletonCapabilityMap` was introduced in
436
+ * session 5 Sprint A5 — see audit addendum finding R6.
437
+ */
438
+ getSingleton<K extends keyof SingletonCapabilityMap>(capability: K): SingletonCapabilityMap[K] | null;
439
+ getSingleton<T = unknown>(capability: string): T | null;
440
+ /** Get the addon ID of the active singleton provider. */
441
+ getSingletonAddonId(capability: string): string | null;
442
+ /**
443
+ * Override the active addon for a singleton capability. Called by the
444
+ * pipeline-orchestrator binding system so future `getSingleton(cap)`
445
+ * lookups return the addon the operator explicitly selected. If
446
+ * `addonId` is `null` or no provider is registered under that id,
447
+ * falls back to the cap-declared `preferredProvider` (when registered),
448
+ * otherwise the first-registered provider (legacy behaviour).
449
+ *
450
+ * This helper is an internal hook for the UDS-preference race (it does
451
+ * NOT read `configReader` — the operator's persisted choice is applied
452
+ * by `registerProvider`/`unregisterProvider`). For consistency with those
453
+ * paths the fallback still honours `preferredProvider` ahead of
454
+ * insertion-order first-remaining.
455
+ *
456
+ * No-op when the capability isn't declared, isn't a singleton, or the
457
+ * requested addon hasn't registered a provider for it yet.
458
+ */
459
+ setSingletonActiveAddon(capability: string, addonId: string | null): void;
460
+ /**
461
+ * Get all active collection providers for a capability.
462
+ *
463
+ * Declared capability names resolve to their typed provider via
464
+ * `CollectionCapabilityMap` — a cap declared as `singleton` in its
465
+ * `.cap.ts` definition is rejected at the type level. Arbitrary strings
466
+ * fall back to the caller-provided `T` (default `unknown`) for
467
+ * compatibility with declaration-merged extensions.
468
+ */
469
+ getCollection<K extends keyof CollectionCapabilityMap>(capability: K): readonly CollectionCapabilityMap[K][];
470
+ getCollection<T = unknown>(capability: string): readonly T[];
471
+ /**
472
+ * Like {@link getCollection} but returns `[addonId, provider]` tuples so
473
+ * callers can attribute work back to the contributing addon.
474
+ *
475
+ * Needed by the device-settings aggregator (`device-manager.addon.ts`) —
476
+ * each contributed field must carry the writer's `addonId` so the
477
+ * `deviceManager.updateDeviceField` mutation can route the write to the
478
+ * correct addon-settings store without hardcoding any addon identity.
479
+ */
480
+ getCollectionEntries<K extends keyof CollectionCapabilityMap>(capability: K): readonly (readonly [string, CollectionCapabilityMap[K]])[];
481
+ getCollectionEntries<T = unknown>(capability: string): readonly (readonly [string, T])[];
482
+ /**
483
+ * Is `addonId` currently DISABLED as a provider of `capability`?
484
+ *
485
+ * Exposed because the disabled set was write-only for `log-destination`:
486
+ * the orchestrator toggle added the addon here and nothing ever read it, so
487
+ * console and winston could not be turned off at all while the UI badge said
488
+ * they were (audit 2026-07-30).
489
+ */
490
+ isProviderDisabled(capability: string, addonId: string): boolean;
491
+ /** Get the full CapabilityDefinition for a declared capability. */
492
+ getDefinition(capability: string): CapabilityDefinition | undefined;
493
+ /** Get the mode declared for a capability. */
494
+ getMode(capability: string): CapabilityMode | undefined;
495
+ /** Get a specific addon's provider by addon ID. */
496
+ getProviderByAddonId<K extends keyof CapabilityProviderMap>(capability: K, addonId: string): CapabilityProviderMap[K] | null;
497
+ getProviderByAddonId<T = unknown>(capability: string, addonId: string): T | null;
498
+ /**
499
+ * Every registry KEY currently registered for `capability`, disabled ones
500
+ * included — i.e. exactly the ids {@link getProviderByAddonId} can resolve.
501
+ * Keys are bare (`homeassistant-export`) for hub-local providers and
502
+ * `<addonId>@<nodeId>` for providers that registered from another node.
503
+ *
504
+ * Exists so an unresolvable `{ addonId }` pin can REFUSE with the valid ids
505
+ * spelled out (the `addons.custom` unknown-id posture) instead of silently
506
+ * degrading to another provider's answer — a fabricated `addonId` used to
507
+ * return the first-registered provider's status, indistinguishable from
508
+ * success (2026-08-09).
509
+ */
510
+ getProviderAddonIds(capability: string): readonly string[];
511
+ /** Bare addonId from a registry key (`webrtc-native@dev-agent-0` → `webrtc-native`). */
512
+ private bareAddonId;
513
+ /** nodeId a provider key belongs to (bare → 'hub', `@node` → node). */
514
+ private nodeOfKey;
515
+ /** capName → (nodeId → bare addonId[]) availability derived from provider keys. */
516
+ getProvidersByNode(capability: string): Map<string, string[]>;
517
+ /**
518
+ * Resolve the BARE addon id a node should use for a singleton cap.
519
+ * Chain: per-node override → cluster-global default → first available.
520
+ * Returns null when the node hosts no provider for the cap.
521
+ */
522
+ resolveSingletonAddonIdForNode(capability: string, nodeId: string): string | null;
523
+ /** Resolve the in-process provider object for a node (hub-local only). */
524
+ getSingletonForNode<T = unknown>(capability: string, nodeId: string): T | null;
525
+ /** Per-node override accessor (for listCapabilities + tests). */
526
+ getSingletonNodeOverrides(capability: string): Map<string, string>;
527
+ /** Set the reader for persisted per-node overrides (boot restore). */
528
+ setNodeConfigReader(reader: (capability: string, nodeId: string) => string | undefined): void;
529
+ /** Clear a per-node override (UI "inherit global"). */
530
+ clearSingletonNodeOverride(capability: string, nodeId: string): void;
531
+ /**
532
+ * Set which addon should be the active singleton for a capability.
533
+ * Pass an optional `nodeId` to set a per-node override instead of the cluster-global default.
534
+ */
535
+ setActiveSingleton(capability: string, addonId: string, nodeId?: string): Promise<void>;
536
+ /**
537
+ * Check if a specific addon's capability is active.
538
+ *
539
+ * Resolution: the manifest's `autoActivate` flag, else active. There is no
540
+ * persisted override layer — see D334: an activation map keyed by
541
+ * `{capability}/{addonId}` is a second authority over a function some addon
542
+ * already owns, which is what D62 forbids.
543
+ */
544
+ isActiveForSystem(capability: string, addonId: string): boolean;
545
+ /**
546
+ * Get all addon/capability activations at system level.
547
+ * Returns every registered provider with its resolved active status.
548
+ */
549
+ getSystemActivations(): ReadonlyArray<{
550
+ capability: string;
551
+ addonId: string;
552
+ active: boolean;
553
+ }>;
554
+ /** Set a per-device singleton override. */
555
+ setDeviceOverride(deviceId: string, capability: string, addonId: string): void;
556
+ /** Clear a per-device singleton override. */
557
+ clearDeviceOverride(deviceId: string, capability: string): void;
558
+ /** Get all per-device singleton overrides for a device. */
559
+ getDeviceOverrides(deviceId: string): Map<string, string>;
560
+ /**
561
+ * Resolve a singleton provider for a specific device.
562
+ * Checks activation (the manifest's autoActivate) then the per-device
563
+ * singleton override — the in-memory provider pin, not a persisted flag.
564
+ */
565
+ resolveForDevice<T = unknown>(capability: string, deviceId: string): T | null;
566
+ /**
567
+ * Resolve collection providers for a specific device.
568
+ *
569
+ * Filters by activation (the manifest's autoActivate) and by nothing else.
570
+ * The per-device DENY set that used to filter here is gone with the switch
571
+ * it projected (2026-09-20): *"tutti i providers funzionano sempre"* [all the providers always work]. WHICH
572
+ * providers a device has is now answered by its BINDINGS
573
+ * (`device-bindings-store.ts` step 0), which is a different question from
574
+ * which of them are registered and running — this one.
575
+ *
576
+ * `deviceId` is kept in the signature and deliberately unused: the resolution
577
+ * is per-device by CONTRACT, and a caller that stops passing one is a caller
578
+ * that has stopped asking about a device.
579
+ */
580
+ resolveCollectionForDevice<T = unknown>(capability: string, _deviceId: string): readonly T[];
581
+ /** Check if all dependencies for a capability are satisfied. */
582
+ areDependenciesMet(capabilityName: string): boolean;
583
+ /** Get topologically sorted boot order based on dependsOn. */
584
+ getBootOrder(): string[];
585
+ /** Get all auto-mounted routers. Key = capability name. */
586
+ getMountedRouters(): ReadonlyMap<string, CapabilityRouter>;
587
+ /** Get a single mounted router by capability name. */
588
+ getRouter(capabilityName: string): CapabilityRouter | null;
589
+ /** List all declared capabilities (v1-compatible shape). */
590
+ listCapabilities(): CapabilityInfo[];
591
+ /** Check if a capability is declared. */
592
+ has(capabilityName: string): boolean;
593
+ /** Check if a capability has at least one provider. */
594
+ isAvailable(capabilityName: string): boolean;
595
+ /**
596
+ * Return every declared device-scoped capability (`scope: 'device'`)
597
+ * whose `deviceTypes` list includes the given type — or caps that declare
598
+ * no explicit `deviceTypes` (treat as applies-to-all). Used by the
599
+ * bindings UI to enumerate which caps the user can wire for a device.
600
+ */
601
+ listDeviceScopedCapsForType(deviceType: string): readonly string[];
602
+ private emitEvent;
591
603
  }