@camstack/system 1.0.2

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 (262) hide show
  1. package/dist/addon/addon-api-factory.d.ts +35 -0
  2. package/dist/addon-routes/addon-route-registry.d.ts +37 -0
  3. package/dist/addon-runner.js +599 -0
  4. package/dist/addon-runner.mjs +597 -0
  5. package/dist/auth/api-key-manager.d.ts +26 -0
  6. package/dist/auth/auth-manager.d.ts +109 -0
  7. package/dist/auth/parse-record.d.ts +18 -0
  8. package/dist/auth/scope-matcher.d.ts +7 -0
  9. package/dist/auth/scoped-token-manager.d.ts +40 -0
  10. package/dist/auth/totp-manager.d.ts +51 -0
  11. package/dist/auth/user-manager.d.ts +34 -0
  12. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.d.ts +53 -0
  13. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +259 -0
  14. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +251 -0
  15. package/dist/builtins/addon-pages-aggregator/dedupe-pages.d.ts +6 -0
  16. package/dist/builtins/addon-pages-aggregator/index.d.ts +1 -0
  17. package/dist/builtins/addon-pages-aggregator/index.js +8 -0
  18. package/dist/builtins/addon-pages-aggregator/index.mjs +2 -0
  19. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.d.ts +47 -0
  20. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +228 -0
  21. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +220 -0
  22. package/dist/builtins/addon-widgets-aggregator/index.d.ts +1 -0
  23. package/dist/builtins/addon-widgets-aggregator/index.js +8 -0
  24. package/dist/builtins/addon-widgets-aggregator/index.mjs +2 -0
  25. package/dist/builtins/alerts/alerts.addon.d.ts +81 -0
  26. package/dist/builtins/alerts/alerts.addon.js +601 -0
  27. package/dist/builtins/alerts/alerts.addon.mjs +595 -0
  28. package/dist/builtins/alerts/index.d.ts +1 -0
  29. package/dist/builtins/alerts/index.js +4 -0
  30. package/dist/builtins/alerts/index.mjs +2 -0
  31. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.d.ts +147 -0
  32. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +2229 -0
  33. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +2220 -0
  34. package/dist/builtins/backup-orchestrator/cron-helpers.d.ts +23 -0
  35. package/dist/builtins/backup-orchestrator/destination-policy.d.ts +72 -0
  36. package/dist/builtins/backup-orchestrator/download-helpers.d.ts +12 -0
  37. package/dist/builtins/backup-orchestrator/index.d.ts +2 -0
  38. package/dist/builtins/backup-orchestrator/index.js +8 -0
  39. package/dist/builtins/backup-orchestrator/index.mjs +2 -0
  40. package/dist/builtins/backup-orchestrator/manifest-store.d.ts +77 -0
  41. package/dist/builtins/console-logging/console-destination.d.ts +13 -0
  42. package/dist/builtins/console-logging/console-logging.addon.d.ts +25 -0
  43. package/dist/builtins/console-logging/index.d.ts +3 -0
  44. package/dist/builtins/console-logging/index.js +104 -0
  45. package/dist/builtins/console-logging/index.mjs +95 -0
  46. package/dist/builtins/device-manager/device-config-contribution.d.ts +32 -0
  47. package/dist/builtins/device-manager/device-event-propagator.d.ts +26 -0
  48. package/dist/builtins/device-manager/device-link-overlay.d.ts +23 -0
  49. package/dist/builtins/device-manager/device-link-resolver.d.ts +15 -0
  50. package/dist/builtins/device-manager/device-manager.addon.d.ts +452 -0
  51. package/dist/builtins/device-manager/device-manager.addon.js +3299 -0
  52. package/dist/builtins/device-manager/device-manager.addon.mjs +3292 -0
  53. package/dist/builtins/device-manager/index.d.ts +2 -0
  54. package/dist/builtins/device-manager/index.js +8 -0
  55. package/dist/builtins/device-manager/index.mjs +2 -0
  56. package/dist/builtins/hub-forwarder/hub-forwarder-destination.d.ts +44 -0
  57. package/dist/builtins/hub-forwarder/hub-forwarder.addon.d.ts +15 -0
  58. package/dist/builtins/hub-forwarder/index.d.ts +3 -0
  59. package/dist/builtins/hub-forwarder/index.js +154 -0
  60. package/dist/builtins/hub-forwarder/index.mjs +145 -0
  61. package/dist/builtins/local-auth/auth-schema.d.ts +26 -0
  62. package/dist/builtins/local-auth/index.d.ts +1 -0
  63. package/dist/builtins/local-auth/index.js +4 -0
  64. package/dist/builtins/local-auth/index.mjs +2 -0
  65. package/dist/builtins/local-auth/local-auth.addon.d.ts +18 -0
  66. package/dist/builtins/local-auth/local-auth.addon.js +8094 -0
  67. package/dist/builtins/local-auth/local-auth.addon.mjs +8063 -0
  68. package/dist/builtins/local-auth/oauth-grants.d.ts +45 -0
  69. package/dist/builtins/local-auth/oauth-session-manager.d.ts +50 -0
  70. package/dist/builtins/local-network/index.d.ts +2 -0
  71. package/dist/builtins/local-network/index.js +10 -0
  72. package/dist/builtins/local-network/index.mjs +2 -0
  73. package/dist/builtins/local-network/local-network.addon.d.ts +150 -0
  74. package/dist/builtins/local-network/local-network.addon.js +489 -0
  75. package/dist/builtins/local-network/local-network.addon.mjs +477 -0
  76. package/dist/builtins/native-metrics/index.d.ts +2 -0
  77. package/dist/builtins/native-metrics/native-metrics-provider.d.ts +48 -0
  78. package/dist/builtins/native-metrics/native-metrics.addon.d.ts +73 -0
  79. package/dist/builtins/native-metrics/native-metrics.addon.js +922 -0
  80. package/dist/builtins/native-metrics/native-metrics.addon.mjs +914 -0
  81. package/dist/builtins/platform-probe/hardware-decode-accel-probe.d.ts +37 -0
  82. package/dist/builtins/platform-probe/hardware-encoder-probe.d.ts +13 -0
  83. package/dist/builtins/platform-probe/index.d.ts +22 -0
  84. package/dist/builtins/platform-probe/index.js +834 -0
  85. package/dist/builtins/platform-probe/index.mjs +822 -0
  86. package/dist/builtins/platform-probe/inference-config-resolver.d.ts +29 -0
  87. package/dist/builtins/platform-probe/intel-accelerators.d.ts +11 -0
  88. package/dist/builtins/platform-probe/platform-scorer.d.ts +30 -0
  89. package/dist/builtins/platform-probe/runtime-packages.d.ts +6 -0
  90. package/dist/builtins/remote-access-orchestrator/enabled-providers-reconcile.d.ts +96 -0
  91. package/dist/builtins/remote-access-orchestrator/index.d.ts +1 -0
  92. package/dist/builtins/remote-access-orchestrator/index.js +8 -0
  93. package/dist/builtins/remote-access-orchestrator/index.mjs +2 -0
  94. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.d.ts +40 -0
  95. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +214 -0
  96. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +208 -0
  97. package/dist/builtins/shared/settle-sources.d.ts +22 -0
  98. package/dist/builtins/snapshot/index.d.ts +2 -0
  99. package/dist/builtins/snapshot/index.js +494 -0
  100. package/dist/builtins/snapshot/index.mjs +488 -0
  101. package/dist/builtins/snapshot/snapshot.addon.d.ts +120 -0
  102. package/dist/builtins/sqlite-storage/config-store.d.ts +8 -0
  103. package/dist/builtins/sqlite-storage/device-store.d.ts +23 -0
  104. package/dist/builtins/sqlite-storage/filesystem-browse-provider.d.ts +25 -0
  105. package/dist/builtins/sqlite-storage/filesystem-storage-provider.d.ts +83 -0
  106. package/dist/builtins/sqlite-storage/filesystem-storage.addon.d.ts +32 -0
  107. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +396 -0
  108. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +388 -0
  109. package/dist/builtins/sqlite-storage/index.d.ts +8 -0
  110. package/dist/builtins/sqlite-storage/index.js +62 -0
  111. package/dist/builtins/sqlite-storage/index.mjs +49 -0
  112. package/dist/builtins/sqlite-storage/integration-registry.d.ts +27 -0
  113. package/dist/builtins/sqlite-storage/path-guard.d.ts +4 -0
  114. package/dist/builtins/sqlite-storage/sqlite-settings-backend.d.ts +102 -0
  115. package/dist/builtins/sqlite-storage/sqlite-settings.addon.d.ts +14 -0
  116. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +644 -0
  117. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +636 -0
  118. package/dist/builtins/storage-orchestrator/index.d.ts +6 -0
  119. package/dist/builtins/storage-orchestrator/index.js +10 -0
  120. package/dist/builtins/storage-orchestrator/index.mjs +2 -0
  121. package/dist/builtins/storage-orchestrator/location-store.d.ts +49 -0
  122. package/dist/builtins/storage-orchestrator/provider-discovery.d.ts +10 -0
  123. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.d.ts +103 -0
  124. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1138 -0
  125. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1128 -0
  126. package/dist/builtins/storage-orchestrator/storage-orchestrator.service.d.ts +236 -0
  127. package/dist/builtins/storage-orchestrator/storage-pressure-manager.d.ts +38 -0
  128. package/dist/builtins/system-backup/system-backup.service.d.ts +137 -0
  129. package/dist/builtins/system-config/index.d.ts +1 -0
  130. package/dist/builtins/system-config/index.js +8 -0
  131. package/dist/builtins/system-config/index.mjs +2 -0
  132. package/dist/builtins/system-config/system-config.addon.d.ts +10 -0
  133. package/dist/builtins/system-config/system-config.addon.js +232 -0
  134. package/dist/builtins/system-config/system-config.addon.mjs +226 -0
  135. package/dist/builtins/winston-logging/index.d.ts +3 -0
  136. package/dist/builtins/winston-logging/index.js +156 -0
  137. package/dist/builtins/winston-logging/index.mjs +144 -0
  138. package/dist/builtins/winston-logging/winston-destination.d.ts +21 -0
  139. package/dist/builtins/winston-logging/winston-logging.addon.d.ts +19 -0
  140. package/dist/chunk-CNf5ZN-e.mjs +37 -0
  141. package/dist/chunk-Cek0wNdY.js +64 -0
  142. package/dist/download/model-download-service.d.ts +41 -0
  143. package/dist/download/model-downloader.d.ts +31 -0
  144. package/dist/events/event-bus.d.ts +10 -0
  145. package/dist/events/system-event-bus.d.ts +14 -0
  146. package/dist/feature/feature-manager.d.ts +11 -0
  147. package/dist/formatter-B7qW8bPJ.mjs +162 -0
  148. package/dist/formatter-DqAKDlvN.js +167 -0
  149. package/dist/http/authenticated-file-server.d.ts +53 -0
  150. package/dist/http/data-plane-registry.d.ts +23 -0
  151. package/dist/http/file-data-plane.d.ts +10 -0
  152. package/dist/http/reverse-proxy.d.ts +15 -0
  153. package/dist/index.d.ts +82 -0
  154. package/dist/index.js +93485 -0
  155. package/dist/index.mjs +93179 -0
  156. package/dist/intel-accelerators-Gg0P5mnl.js +20 -0
  157. package/dist/intel-accelerators-hGgpZ0pX.mjs +19 -0
  158. package/dist/kernel/addon-class-resolver.d.ts +4 -0
  159. package/dist/kernel/addon-engine-manager.d.ts +22 -0
  160. package/dist/kernel/addon-health-monitor.d.ts +154 -0
  161. package/dist/kernel/addon-installer.d.ts +208 -0
  162. package/dist/kernel/addon-loader.d.ts +106 -0
  163. package/dist/kernel/addon-manifest.d.ts +77 -0
  164. package/dist/kernel/capability-handle.d.ts +46 -0
  165. package/dist/kernel/capability-registry.d.ts +412 -0
  166. package/dist/kernel/config-manager.d.ts +212 -0
  167. package/dist/kernel/config-schema.d.ts +93 -0
  168. package/dist/kernel/custom-action-registry.d.ts +23 -0
  169. package/dist/kernel/deps/addon-deps-manager.d.ts +19 -0
  170. package/dist/kernel/deps/manifest-native-deps.d.ts +25 -0
  171. package/dist/kernel/deps/manifest-python-deps.d.ts +20 -0
  172. package/dist/kernel/device-registry.d.ts +29 -0
  173. package/dist/kernel/fs-utils.d.ts +41 -0
  174. package/dist/kernel/hwaccel/hwaccel-resolver.d.ts +19 -0
  175. package/dist/kernel/hwaccel/hwaccel-service.d.ts +4 -0
  176. package/dist/kernel/index.d.ts +74 -0
  177. package/dist/kernel/infra-capabilities.d.ts +13 -0
  178. package/dist/kernel/moleculer/addon-context-factory.d.ts +91 -0
  179. package/dist/kernel/moleculer/addon-data-plane-facility.d.ts +19 -0
  180. package/dist/kernel/moleculer/addon-runner.d.ts +1 -0
  181. package/dist/kernel/moleculer/addon-service-factory.d.ts +50 -0
  182. package/dist/kernel/moleculer/broker-factory.d.ts +50 -0
  183. package/dist/kernel/moleculer/cap-usage-registry.d.ts +46 -0
  184. package/dist/kernel/moleculer/capabilities-access.d.ts +21 -0
  185. package/dist/kernel/moleculer/child-addon-call-dispatch.d.ts +46 -0
  186. package/dist/kernel/moleculer/child-cap-dispatch.d.ts +20 -0
  187. package/dist/kernel/moleculer/cluster-secret.d.ts +15 -0
  188. package/dist/kernel/moleculer/core-cap-service.d.ts +50 -0
  189. package/dist/kernel/moleculer/crash-supervisor.d.ts +50 -0
  190. package/dist/kernel/moleculer/device-cap-proxy.d.ts +79 -0
  191. package/dist/kernel/moleculer/event-bus-core.d.ts +53 -0
  192. package/dist/kernel/moleculer/event-bus.d.ts +53 -0
  193. package/dist/kernel/moleculer/hub-log-forwarder.d.ts +36 -0
  194. package/dist/kernel/moleculer/hub-service.d.ts +35 -0
  195. package/dist/kernel/moleculer/node-registry.d.ts +126 -0
  196. package/dist/kernel/moleculer/process-context.d.ts +4 -0
  197. package/dist/kernel/moleculer/process-service.d.ts +72 -0
  198. package/dist/kernel/moleculer/provider-registry.d.ts +28 -0
  199. package/dist/kernel/moleculer/readiness-context.d.ts +62 -0
  200. package/dist/kernel/moleculer/readiness-service.d.ts +7 -0
  201. package/dist/kernel/moleculer/register-node-client.d.ts +35 -0
  202. package/dist/kernel/moleculer/remote-logger.d.ts +43 -0
  203. package/dist/kernel/moleculer/resilient-cap-call.d.ts +28 -0
  204. package/dist/kernel/moleculer/stream-probe-service.d.ts +9 -0
  205. package/dist/kernel/moleculer/trpc-links.d.ts +189 -0
  206. package/dist/kernel/moleculer/typed-array-serde.d.ts +25 -0
  207. package/dist/kernel/moleculer/worker-device-restore.d.ts +10 -0
  208. package/dist/kernel/provider-kind-drift.d.ts +12 -0
  209. package/dist/kernel/restart-coordinator.d.ts +90 -0
  210. package/dist/kernel/storage-location-registry.d.ts +40 -0
  211. package/dist/kernel/transport/cap-action-name.d.ts +100 -0
  212. package/dist/kernel/transport/cap-route-resolver.d.ts +148 -0
  213. package/dist/kernel/transport/cap-route.d.ts +148 -0
  214. package/dist/kernel/transport/child-cap-protocol.d.ts +136 -0
  215. package/dist/kernel/transport/create-local-transport.d.ts +7 -0
  216. package/dist/kernel/transport/frame-codec.d.ts +7 -0
  217. package/dist/kernel/transport/index.d.ts +27 -0
  218. package/dist/kernel/transport/local-child-client.d.ts +136 -0
  219. package/dist/kernel/transport/local-child-registry.d.ts +179 -0
  220. package/dist/kernel/transport/local-endpoint-path.d.ts +6 -0
  221. package/dist/kernel/transport/local-transport.d.ts +46 -0
  222. package/dist/kernel/transport/parent-unowned-call.d.ts +75 -0
  223. package/dist/kernel/transport/socket-channel.d.ts +27 -0
  224. package/dist/kernel/transport/uds-event-bridge.d.ts +36 -0
  225. package/dist/kernel/transport/uds-event-bus.d.ts +22 -0
  226. package/dist/kernel/transport/uds-local-transport.d.ts +18 -0
  227. package/dist/kernel/transport/uds-log-ingest.d.ts +28 -0
  228. package/dist/kernel/transport/uds-logger.d.ts +44 -0
  229. package/dist/kernel/utils/ring-buffer.d.ts +15 -0
  230. package/dist/kernel/workspace-detect.d.ts +9 -0
  231. package/dist/lifecycle/lifecycle-state-machine.d.ts +28 -0
  232. package/dist/logging/formatter.d.ts +30 -0
  233. package/dist/logging/log-manager.d.ts +54 -0
  234. package/dist/logging/log-ring-buffer.d.ts +47 -0
  235. package/dist/logging/partitioned-log-buffer.d.ts +35 -0
  236. package/dist/logging/scoped-logger.d.ts +17 -0
  237. package/dist/main-DNnMW7Z2.js +9983 -0
  238. package/dist/main-rtjOwPBR.mjs +9976 -0
  239. package/dist/manifest-python-deps-D1DbAQEv.js +6724 -0
  240. package/dist/manifest-python-deps-DZsKTbs1.mjs +6315 -0
  241. package/dist/network/network-quality.d.ts +11 -0
  242. package/dist/notification/notification-service.d.ts +37 -0
  243. package/dist/notification/toast-service.d.ts +22 -0
  244. package/dist/pipeline/engine-manager-resolver.d.ts +15 -0
  245. package/dist/pipeline/pipeline-runner.d.ts +8 -0
  246. package/dist/pipeline/pipeline-validator.d.ts +13 -0
  247. package/dist/process/resource-monitor.d.ts +11 -0
  248. package/dist/python/python-env-manager.d.ts +12 -0
  249. package/dist/repl/interfaces.d.ts +31 -0
  250. package/dist/repl/repl-engine.d.ts +8 -0
  251. package/dist/resource-monitor-ClDGFyf6.mjs +57 -0
  252. package/dist/resource-monitor-IIEanuJt.js +74 -0
  253. package/dist/settle-sources-Bhsy57y-.js +38 -0
  254. package/dist/settle-sources-CDtNC8ub.mjs +33 -0
  255. package/dist/storage/fs-storage-backend.d.ts +40 -0
  256. package/dist/storage/storage-location-manager.d.ts +23 -0
  257. package/dist/storage/storage-manager.d.ts +83 -0
  258. package/dist/tar-BgAEMRBR.js +5434 -0
  259. package/dist/tar-ByMOPNM0.mjs +5429 -0
  260. package/dist/tls/cert-manager.d.ts +26 -0
  261. package/dist/tls/index.d.ts +1 -0
  262. package/package.json +343 -0
@@ -0,0 +1,220 @@
1
+ import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
2
+ import * as fs from "node:fs";
3
+ import * as path$1 from "node:path";
4
+ import { BaseAddon, EventCategory, addonWidgetsCapability, errMsg } from "@camstack/types";
5
+ import { randomUUID } from "node:crypto";
6
+ //#region src/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.ts
7
+ /**
8
+ * Addon Widgets Aggregator — hub-local builtin that owns the singleton
9
+ * `addon-widgets` cap.
10
+ *
11
+ * Mirrors `addon-pages-aggregator` exactly: walks every registered
12
+ * `addon-widgets-source` (collection) provider and emits an enriched
13
+ * widget metadata list with versioned `bundleUrl`s pointing at
14
+ * `/api/addon-widgets/<addonId>/<bundle>?v=<mtime>`. The filesystem
15
+ * `mtime` cache-buster lets the browser pick up addon rebuilds without
16
+ * manual reload.
17
+ *
18
+ * The static file endpoint (`/api/addon-widgets/:addonId/*`) is served
19
+ * by `AddonWidgetsService.resolveBundle()` on the server side; this
20
+ * addon only owns the listing surface.
21
+ *
22
+ * Why a builtin: same reasoning as `addon-pages-aggregator`. The
23
+ * aggregator is the de-facto "addon-widgets provider" — addons own caps,
24
+ * not the server. Living in `@camstack/system/builtins` keeps the surface
25
+ * symmetrical with `system-config`, `local-auth`, etc.
26
+ */
27
+ /**
28
+ * Backoff schedule (ms) used to retry sources that failed during a
29
+ * `listWidgets()` round-trip — typically because the cap was just
30
+ * registered (provider connected via Moleculer) but the worker-side
31
+ * action registration hadn't propagated yet, so `Service '...listWidgets'
32
+ * is not found on '<node>'` raced ahead of the call.
33
+ *
34
+ * On success we re-emit `AddonWidgetReady` so admin-ui invalidates its
35
+ * `addonWidgets.listWidgets` query and the registry populates without a
36
+ * page reload.
37
+ */
38
+ var RETRY_BACKOFF_MS = [
39
+ 500,
40
+ 1500,
41
+ 4e3
42
+ ];
43
+ /**
44
+ * Per-source ceiling for a single `listWidgets()` round-trip. Mirrors the
45
+ * addon-pages aggregator: a slow/unreachable source (e.g. an agent-hosted
46
+ * widget source whose cap call sits in a Moleculer `waitForServices`) times
47
+ * out fast and serves its cached snapshot instead of blocking the dashboard.
48
+ */
49
+ var PER_SOURCE_TIMEOUT_MS = 2500;
50
+ var AddonWidgetsAggregatorAddon = class extends BaseAddon {
51
+ id = "addon-widgets-aggregator";
52
+ resolvedPaths = null;
53
+ /**
54
+ * Last successful `listWidgets()` snapshot per source. Used as the
55
+ * "stale-but-valid" fallback when a source transiently fails — drops
56
+ * happen often enough during boot (Moleculer service-discovery
57
+ * window) that swallowing the error and returning empty would leave
58
+ * the dashboard with nothing for several seconds. Keeping the
59
+ * previous good entry means a flake is invisible to the operator.
60
+ */
61
+ lastGood = /* @__PURE__ */ new Map();
62
+ /** In-flight retry guards keyed by sourceAddonId. Avoids double-scheduling. */
63
+ retryTimers = /* @__PURE__ */ new Map();
64
+ constructor() {
65
+ super({});
66
+ }
67
+ async onInitialize() {
68
+ this.resolvedPaths = await this.resolvePaths();
69
+ const provider = { listWidgets: async () => this.aggregate() };
70
+ this.ctx.logger.info("Initialized — aggregating addon-widgets-source providers");
71
+ return [{
72
+ capability: addonWidgetsCapability,
73
+ provider
74
+ }];
75
+ }
76
+ async onShutdown() {
77
+ for (const t of this.retryTimers.values()) clearTimeout(t);
78
+ this.retryTimers.clear();
79
+ this.lastGood.clear();
80
+ }
81
+ /**
82
+ * Strip the `@<nodeId>` suffix that the CapabilityBridge appends to
83
+ * collection-provider registry keys for cross-node addons (see
84
+ * `moleculer.service.ts` — `registryKey = ${addonId}@${nodeId}`).
85
+ *
86
+ * The widget bundle is hub-resident (the same npm package ships to
87
+ * every node and the hub keeps a copy on disk keyed by the bare
88
+ * manifest id), so both the static-file URL and the admin-ui widget
89
+ * namespace must use the bare addon id. Without this, a widget
90
+ * source running on a remote agent yields a `bundleUrl` like
91
+ * `/api/addon-widgets/pipeline-analytics@agent-0/pipeline-analytics/remoteEntry.js`
92
+ * — the embedded `@<node>/<group>` makes the static-file route's
93
+ * `:addonId` param mismatch the registered provider and 404.
94
+ */
95
+ bareAddonId(registryKey) {
96
+ const at = registryKey.indexOf("@");
97
+ return at === -1 ? registryKey : registryKey.slice(0, at);
98
+ }
99
+ async aggregate() {
100
+ const entries = this.capabilities?.getCollectionEntries("addon-widgets-source") ?? [];
101
+ const out = [];
102
+ const seenIds = /* @__PURE__ */ new Set();
103
+ const settled = await settleSourcesWithTimeout(entries.map(([registryKey, source]) => [registryKey, () => Promise.resolve(source.listWidgets())]), PER_SOURCE_TIMEOUT_MS);
104
+ for (const [addonId, result] of settled) {
105
+ const publicAddonId = this.bareAddonId(addonId);
106
+ seenIds.add(addonId);
107
+ if (result.ok) {
108
+ const enriched = result.value.map((w) => ({
109
+ ...w,
110
+ addonId: publicAddonId,
111
+ bundleUrl: this.makeBundleUrl(publicAddonId, w.bundle)
112
+ }));
113
+ for (const item of enriched) out.push(item);
114
+ this.lastGood.set(addonId, enriched);
115
+ } else {
116
+ this.ctx.logger.warn("addon-widgets-source provider failed", { meta: {
117
+ sourceId: addonId,
118
+ error: result.error.message
119
+ } });
120
+ const cached = this.lastGood.get(addonId);
121
+ if (cached !== void 0) {
122
+ for (const item of cached) out.push(item);
123
+ this.ctx.logger.info("addon-widgets-source falling back to cached snapshot", { meta: {
124
+ sourceId: addonId,
125
+ cachedWidgets: cached.length
126
+ } });
127
+ }
128
+ this.scheduleRetry(addonId);
129
+ }
130
+ }
131
+ for (const cachedId of this.lastGood.keys()) if (!seenIds.has(cachedId)) this.lastGood.delete(cachedId);
132
+ return out;
133
+ }
134
+ scheduleRetry(sourceId, attempt = 0) {
135
+ if (attempt >= RETRY_BACKOFF_MS.length) return;
136
+ if (this.retryTimers.has(sourceId)) return;
137
+ const delayMs = RETRY_BACKOFF_MS[attempt] ?? RETRY_BACKOFF_MS[RETRY_BACKOFF_MS.length - 1];
138
+ const timer = setTimeout(() => {
139
+ this.retryTimers.delete(sourceId);
140
+ this.retrySource(sourceId, attempt);
141
+ }, delayMs);
142
+ this.retryTimers.set(sourceId, timer);
143
+ }
144
+ async retrySource(sourceId, attempt) {
145
+ const found = (this.capabilities?.getCollectionEntries("addon-widgets-source") ?? []).find(([id]) => id === sourceId);
146
+ if (!found) return;
147
+ const [addonId, source] = found;
148
+ const publicAddonId = this.bareAddonId(addonId);
149
+ try {
150
+ const enriched = (await Promise.resolve(source.listWidgets())).map((w) => ({
151
+ ...w,
152
+ addonId: publicAddonId,
153
+ bundleUrl: this.makeBundleUrl(publicAddonId, w.bundle)
154
+ }));
155
+ this.lastGood.set(addonId, enriched);
156
+ this.ctx.logger.info("addon-widgets-source recovered after retry", { meta: {
157
+ sourceId: addonId,
158
+ attempt: attempt + 1,
159
+ widgets: enriched.length
160
+ } });
161
+ this.ctx.eventBus.emit({
162
+ id: randomUUID(),
163
+ timestamp: /* @__PURE__ */ new Date(),
164
+ source: {
165
+ type: "addon",
166
+ id: this.id
167
+ },
168
+ category: EventCategory.AddonWidgetReady,
169
+ data: {
170
+ addonId: publicAddonId,
171
+ recovered: true
172
+ }
173
+ });
174
+ } catch (err) {
175
+ this.ctx.logger.debug("addon-widgets-source retry failed", { meta: {
176
+ sourceId,
177
+ attempt: attempt + 1,
178
+ error: errMsg(err)
179
+ } });
180
+ this.scheduleRetry(sourceId, attempt + 1);
181
+ }
182
+ }
183
+ /**
184
+ * Build `/api/addon-widgets/<addonId>/<bundle>?v=<mtime>`. Falls back
185
+ * to `Date.now()` when the bundle path can't be stat'd (remote addon
186
+ * with no local file, addon not yet on disk, etc.) — the browser
187
+ * just gets a fresh URL on each call instead of cache-friendly mtime.
188
+ */
189
+ makeBundleUrl(addonId, bundle) {
190
+ const bundlePath = this.resolveBundlePath(addonId, bundle);
191
+ let mtime = Date.now();
192
+ if (bundlePath !== null) try {
193
+ mtime = fs.statSync(bundlePath).mtimeMs;
194
+ } catch {}
195
+ return `/api/addon-widgets/${addonId}/${bundle}?v=${Math.floor(mtime)}`;
196
+ }
197
+ resolveBundlePath(addonId, bundle) {
198
+ const paths = this.resolvedPaths;
199
+ if (!paths) return null;
200
+ const addonDistPath = path$1.join(paths.addonsDir, "@camstack", `addon-${addonId}`, "dist");
201
+ const resolvedBase = path$1.resolve(addonDistPath);
202
+ const resolvedFile = path$1.resolve(addonDistPath, bundle);
203
+ if (!resolvedFile.startsWith(resolvedBase + path$1.sep) && resolvedFile !== resolvedBase) return null;
204
+ return resolvedFile;
205
+ }
206
+ async resolvePaths() {
207
+ const fallback = { addonsDir: path$1.resolve("camstack-data", "addons") };
208
+ if (!this.ctx.settings) return fallback;
209
+ try {
210
+ const server = await this.ctx.settings.getSection("server");
211
+ const dataPath = typeof server["dataPath"] === "string" && server["dataPath"] ? server["dataPath"] : "camstack-data";
212
+ return { addonsDir: path$1.resolve(dataPath, "addons") };
213
+ } catch (err) {
214
+ this.ctx.logger.debug("Failed to read server.dataPath — falling back", { meta: { error: errMsg(err) } });
215
+ return fallback;
216
+ }
217
+ }
218
+ };
219
+ //#endregion
220
+ export { AddonWidgetsAggregatorAddon, AddonWidgetsAggregatorAddon as default };
@@ -0,0 +1 @@
1
+ export { AddonWidgetsAggregatorAddon, default } from './addon-widgets-aggregator.addon.js';
@@ -0,0 +1,8 @@
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
5
+ require("../../chunk-Cek0wNdY.js");
6
+ const require_builtins_addon_widgets_aggregator_addon_widgets_aggregator_addon = require("./addon-widgets-aggregator.addon.js");
7
+ exports.AddonWidgetsAggregatorAddon = require_builtins_addon_widgets_aggregator_addon_widgets_aggregator_addon.AddonWidgetsAggregatorAddon;
8
+ exports.default = require_builtins_addon_widgets_aggregator_addon_widgets_aggregator_addon.AddonWidgetsAggregatorAddon;
@@ -0,0 +1,2 @@
1
+ import { AddonWidgetsAggregatorAddon } from "./addon-widgets-aggregator.addon.mjs";
2
+ export { AddonWidgetsAggregatorAddon, AddonWidgetsAggregatorAddon as default };
@@ -0,0 +1,81 @@
1
+ import { ProviderRegistration, Alert, BaseAddon } from '@camstack/types';
2
+ interface AlertCenterConfig {
3
+ readonly maxAlerts: number;
4
+ readonly retentionDays: number;
5
+ }
6
+ /**
7
+ * Alert Center addon — core builtin that persists alerts in a
8
+ * structured SQLite table and serves them to the admin UI.
9
+ *
10
+ * Registers as an `alerts` collection provider and subscribes to
11
+ * important EventBus categories to create/update alerts automatically.
12
+ */
13
+ export declare class AlertCenterAddon extends BaseAddon<AlertCenterConfig> {
14
+ private unsubscribers;
15
+ constructor();
16
+ /**
17
+ * Per `(category, source.id)` counter used to rate-limit chatty
18
+ * events. Entries are pruned lazily when they age out of
19
+ * `RATE_LIMIT_WINDOW_MS`; see `shouldSuppressByRate()` below.
20
+ */
21
+ private readonly rateLimitCounters;
22
+ protected onInitialize(): Promise<ProviderRegistration[]>;
23
+ protected onShutdown(): Promise<void>;
24
+ protected globalSettingsSchema(): import('@camstack/types').ConfigUISchema;
25
+ listAlerts(filter?: {
26
+ unreadOnly?: boolean;
27
+ limit?: number;
28
+ }): Promise<readonly Alert[]>;
29
+ getUnreadCount(): Promise<number>;
30
+ markRead(alertId: string): Promise<void>;
31
+ markAllRead(): Promise<void>;
32
+ dismiss(alertId: string): Promise<void>;
33
+ private handleEvent;
34
+ private handleModelDownload;
35
+ /**
36
+ * `[ALERT-CENTER-EVENTS]` — rate limit a `(category, source.id)`
37
+ * tuple. Returns `true` when the caller should DROP this event
38
+ * without persisting an alert, and `false` when the alert should
39
+ * proceed normally.
40
+ *
41
+ * Heuristic: the first `RATE_LIMIT_MAX_PER_SOURCE` events within a
42
+ * `RATE_LIMIT_WINDOW_MS` window go through. Once the threshold is
43
+ * crossed, subsequent events are suppressed until the window rolls
44
+ * over. When the threshold is first crossed, the suppression is
45
+ * logged once so operators know why they're not seeing the follow-
46
+ * up alerts; after the window rolls over the next event is
47
+ * un-suppressed and starts a new window.
48
+ */
49
+ private shouldSuppressByRate;
50
+ /**
51
+ * AddonLoadFailed — kernel's AddonHealthMonitor has post-grace
52
+ * failed an addon load/init. Upsert a stable-id alert keyed by
53
+ * `addon-load-failed:<packageName>` so the recovery path can
54
+ * dismiss it. Severity=error, persistent until dismissed or
55
+ * auto-resolved.
56
+ *
57
+ * The action `retry` carries the package name so the admin UI can
58
+ * dispatch `addons.retryLoad(packageName)` directly from the alert
59
+ * card without the operator opening the Addons page.
60
+ */
61
+ private handleAddonLoadFailed;
62
+ /**
63
+ * AddonLoadRecovered — addon previously alerting is back to healthy.
64
+ * Dismiss the matching alert so the operator's badge count drops.
65
+ */
66
+ private handleAddonLoadRecovered;
67
+ private buildMessage;
68
+ private emitAlert;
69
+ private updateAlert;
70
+ /**
71
+ * Read-merge-write: SettingsBackend.update() replaces the entire `data` blob,
72
+ * so we must read the existing record, merge the patch, and write back.
73
+ */
74
+ private mergeUpdate;
75
+ private persistAlert;
76
+ private emitAlertCreatedEvent;
77
+ private emitAlertUpdatedEvent;
78
+ private enforceMaxAlerts;
79
+ private enforceRetention;
80
+ }
81
+ export default AlertCenterAddon;