@camstack/core 0.1.15 → 0.1.16

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 (382) hide show
  1. package/dist/addon/addon-api-factory.d.ts +36 -0
  2. package/dist/addon/addon-api-factory.d.ts.map +1 -0
  3. package/dist/addon-routes/addon-route-registry.d.ts +38 -0
  4. package/dist/addon-routes/addon-route-registry.d.ts.map +1 -0
  5. package/dist/auth/api-key-manager.d.ts +27 -0
  6. package/dist/auth/api-key-manager.d.ts.map +1 -0
  7. package/dist/auth/auth-manager.d.ts +47 -0
  8. package/dist/auth/auth-manager.d.ts.map +1 -0
  9. package/dist/auth/parse-record.d.ts +19 -0
  10. package/dist/auth/parse-record.d.ts.map +1 -0
  11. package/dist/auth/scoped-token-manager.d.ts +18 -0
  12. package/dist/auth/scoped-token-manager.d.ts.map +1 -0
  13. package/dist/auth/user-manager.d.ts +34 -0
  14. package/dist/auth/user-manager.d.ts.map +1 -0
  15. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.d.ts +54 -0
  16. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.d.ts.map +1 -0
  17. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +223 -217
  18. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js.map +1 -1
  19. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +216 -7
  20. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs.map +1 -1
  21. package/dist/builtins/addon-pages-aggregator/index.d.ts +2 -0
  22. package/dist/builtins/addon-pages-aggregator/index.d.ts.map +1 -0
  23. package/dist/builtins/addon-pages-aggregator/index.js +6 -221
  24. package/dist/builtins/addon-pages-aggregator/index.mjs +2 -9
  25. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.d.ts +33 -0
  26. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.d.ts.map +1 -0
  27. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +199 -197
  28. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js.map +1 -1
  29. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +192 -7
  30. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs.map +1 -1
  31. package/dist/builtins/addon-widgets-aggregator/index.d.ts +2 -0
  32. package/dist/builtins/addon-widgets-aggregator/index.d.ts.map +1 -0
  33. package/dist/builtins/addon-widgets-aggregator/index.js +6 -201
  34. package/dist/builtins/addon-widgets-aggregator/index.mjs +2 -9
  35. package/dist/builtins/alerts/alerts.addon.d.ts +82 -0
  36. package/dist/builtins/alerts/alerts.addon.d.ts.map +1 -0
  37. package/dist/builtins/alerts/alerts.addon.js +590 -430
  38. package/dist/builtins/alerts/alerts.addon.js.map +1 -1
  39. package/dist/builtins/alerts/alerts.addon.mjs +595 -7
  40. package/dist/builtins/alerts/alerts.addon.mjs.map +1 -1
  41. package/dist/builtins/alerts/index.d.ts +2 -0
  42. package/dist/builtins/alerts/index.d.ts.map +1 -0
  43. package/dist/builtins/alerts/index.js +3 -443
  44. package/dist/builtins/alerts/index.mjs +2 -8
  45. package/dist/builtins/auth-orchestrator/auth-orchestrator.addon.d.ts +8 -0
  46. package/dist/builtins/auth-orchestrator/auth-orchestrator.addon.d.ts.map +1 -0
  47. package/dist/builtins/auth-orchestrator/auth-orchestrator.addon.js +56 -0
  48. package/dist/builtins/auth-orchestrator/auth-orchestrator.addon.js.map +1 -0
  49. package/dist/builtins/auth-orchestrator/auth-orchestrator.addon.mjs +50 -0
  50. package/dist/builtins/auth-orchestrator/auth-orchestrator.addon.mjs.map +1 -0
  51. package/dist/builtins/auth-orchestrator/index.d.ts +2 -0
  52. package/dist/builtins/auth-orchestrator/index.d.ts.map +1 -0
  53. package/dist/builtins/auth-orchestrator/index.js +7 -0
  54. package/dist/builtins/auth-orchestrator/index.mjs +2 -0
  55. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.d.ts +148 -0
  56. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.d.ts.map +1 -0
  57. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +7639 -0
  58. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js.map +1 -0
  59. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +7627 -0
  60. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs.map +1 -0
  61. package/dist/builtins/backup-orchestrator/cron-helpers.d.ts +24 -0
  62. package/dist/builtins/backup-orchestrator/cron-helpers.d.ts.map +1 -0
  63. package/dist/builtins/backup-orchestrator/destination-policy.d.ts +73 -0
  64. package/dist/builtins/backup-orchestrator/destination-policy.d.ts.map +1 -0
  65. package/dist/builtins/backup-orchestrator/download-helpers.d.ts +13 -0
  66. package/dist/builtins/backup-orchestrator/download-helpers.d.ts.map +1 -0
  67. package/dist/builtins/backup-orchestrator/index.d.ts +3 -0
  68. package/dist/builtins/backup-orchestrator/index.d.ts.map +1 -0
  69. package/dist/builtins/backup-orchestrator/index.js +7 -0
  70. package/dist/builtins/backup-orchestrator/index.mjs +2 -0
  71. package/dist/builtins/backup-orchestrator/manifest-store.d.ts +78 -0
  72. package/dist/builtins/backup-orchestrator/manifest-store.d.ts.map +1 -0
  73. package/dist/builtins/console-logging/console-destination.d.ts +14 -0
  74. package/dist/builtins/console-logging/console-destination.d.ts.map +1 -0
  75. package/dist/builtins/console-logging/console-logging.addon.d.ts +26 -0
  76. package/dist/builtins/console-logging/console-logging.addon.d.ts.map +1 -0
  77. package/dist/builtins/console-logging/index.d.ts +4 -0
  78. package/dist/builtins/console-logging/index.d.ts.map +1 -0
  79. package/dist/builtins/console-logging/index.js +99 -235
  80. package/dist/builtins/console-logging/index.js.map +1 -1
  81. package/dist/builtins/console-logging/index.mjs +95 -9
  82. package/dist/builtins/console-logging/index.mjs.map +1 -1
  83. package/dist/builtins/device-manager/device-event-propagator.d.ts +27 -0
  84. package/dist/builtins/device-manager/device-event-propagator.d.ts.map +1 -0
  85. package/dist/builtins/device-manager/device-manager.addon.d.ts +259 -0
  86. package/dist/builtins/device-manager/device-manager.addon.d.ts.map +1 -0
  87. package/dist/builtins/device-manager/device-manager.addon.js +2125 -2127
  88. package/dist/builtins/device-manager/device-manager.addon.js.map +1 -1
  89. package/dist/builtins/device-manager/device-manager.addon.mjs +2145 -7
  90. package/dist/builtins/device-manager/device-manager.addon.mjs.map +1 -1
  91. package/dist/builtins/device-manager/index.d.ts +3 -0
  92. package/dist/builtins/device-manager/index.d.ts.map +1 -0
  93. package/dist/builtins/device-manager/index.js +6 -2156
  94. package/dist/builtins/device-manager/index.mjs +2 -10
  95. package/dist/builtins/hub-forwarder/hub-forwarder-destination.d.ts +45 -0
  96. package/dist/builtins/hub-forwarder/hub-forwarder-destination.d.ts.map +1 -0
  97. package/dist/builtins/hub-forwarder/hub-forwarder.addon.d.ts +16 -0
  98. package/dist/builtins/hub-forwarder/hub-forwarder.addon.d.ts.map +1 -0
  99. package/dist/builtins/hub-forwarder/index.d.ts +4 -0
  100. package/dist/builtins/hub-forwarder/index.d.ts.map +1 -0
  101. package/dist/builtins/hub-forwarder/index.js +150 -291
  102. package/dist/builtins/hub-forwarder/index.js.map +1 -1
  103. package/dist/builtins/hub-forwarder/index.mjs +145 -9
  104. package/dist/builtins/hub-forwarder/index.mjs.map +1 -1
  105. package/dist/builtins/local-auth/auth-schema.d.ts +12 -0
  106. package/dist/builtins/local-auth/auth-schema.d.ts.map +1 -0
  107. package/dist/builtins/local-auth/index.d.ts +2 -0
  108. package/dist/builtins/local-auth/index.d.ts.map +1 -0
  109. package/dist/builtins/local-auth/index.js +3 -623
  110. package/dist/builtins/local-auth/index.mjs +2 -8
  111. package/dist/builtins/local-auth/local-auth.addon.d.ts +17 -0
  112. package/dist/builtins/local-auth/local-auth.addon.d.ts.map +1 -0
  113. package/dist/builtins/local-auth/local-auth.addon.js +6861 -589
  114. package/dist/builtins/local-auth/local-auth.addon.js.map +1 -1
  115. package/dist/builtins/local-auth/local-auth.addon.mjs +6883 -7
  116. package/dist/builtins/local-auth/local-auth.addon.mjs.map +1 -1
  117. package/dist/builtins/local-network/index.d.ts +3 -0
  118. package/dist/builtins/local-network/index.d.ts.map +1 -0
  119. package/dist/builtins/local-network/index.js +9 -0
  120. package/dist/builtins/local-network/index.mjs +2 -0
  121. package/dist/builtins/local-network/local-network.addon.d.ts +102 -0
  122. package/dist/builtins/local-network/local-network.addon.d.ts.map +1 -0
  123. package/dist/builtins/local-network/local-network.addon.js +404 -0
  124. package/dist/builtins/local-network/local-network.addon.js.map +1 -0
  125. package/dist/builtins/local-network/local-network.addon.mjs +392 -0
  126. package/dist/builtins/local-network/local-network.addon.mjs.map +1 -0
  127. package/dist/builtins/mesh-orchestrator/index.d.ts +2 -0
  128. package/dist/builtins/mesh-orchestrator/index.d.ts.map +1 -0
  129. package/dist/builtins/mesh-orchestrator/index.js +7 -0
  130. package/dist/builtins/mesh-orchestrator/index.mjs +2 -0
  131. package/dist/builtins/mesh-orchestrator/mesh-orchestrator.addon.d.ts +9 -0
  132. package/dist/builtins/mesh-orchestrator/mesh-orchestrator.addon.d.ts.map +1 -0
  133. package/dist/builtins/mesh-orchestrator/mesh-orchestrator.addon.js +83 -0
  134. package/dist/builtins/mesh-orchestrator/mesh-orchestrator.addon.js.map +1 -0
  135. package/dist/builtins/mesh-orchestrator/mesh-orchestrator.addon.mjs +77 -0
  136. package/dist/builtins/mesh-orchestrator/mesh-orchestrator.addon.mjs.map +1 -0
  137. package/dist/builtins/native-metrics/index.d.ts +3 -0
  138. package/dist/builtins/native-metrics/index.d.ts.map +1 -0
  139. package/dist/builtins/native-metrics/native-metrics-provider.d.ts +49 -0
  140. package/dist/builtins/native-metrics/native-metrics-provider.d.ts.map +1 -0
  141. package/dist/builtins/native-metrics/native-metrics.addon.d.ts +74 -0
  142. package/dist/builtins/native-metrics/native-metrics.addon.d.ts.map +1 -0
  143. package/dist/builtins/native-metrics/native-metrics.addon.js +887 -861
  144. package/dist/builtins/native-metrics/native-metrics.addon.js.map +1 -1
  145. package/dist/builtins/native-metrics/native-metrics.addon.mjs +914 -5
  146. package/dist/builtins/native-metrics/native-metrics.addon.mjs.map +1 -1
  147. package/dist/builtins/platform-probe/index.d.ts +12 -0
  148. package/dist/builtins/platform-probe/index.d.ts.map +1 -0
  149. package/dist/builtins/platform-probe/index.js +539 -0
  150. package/dist/builtins/platform-probe/index.js.map +1 -0
  151. package/dist/builtins/platform-probe/index.mjs +530 -0
  152. package/dist/builtins/platform-probe/index.mjs.map +1 -0
  153. package/dist/builtins/platform-probe/inference-config-resolver.d.ts +30 -0
  154. package/dist/builtins/platform-probe/inference-config-resolver.d.ts.map +1 -0
  155. package/dist/builtins/platform-probe/platform-scorer.d.ts +22 -0
  156. package/dist/builtins/platform-probe/platform-scorer.d.ts.map +1 -0
  157. package/dist/builtins/remote-access-orchestrator/index.d.ts +2 -0
  158. package/dist/builtins/remote-access-orchestrator/index.d.ts.map +1 -0
  159. package/dist/builtins/remote-access-orchestrator/index.js +7 -0
  160. package/dist/builtins/remote-access-orchestrator/index.mjs +2 -0
  161. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.d.ts +9 -0
  162. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.d.ts.map +1 -0
  163. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +72 -0
  164. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js.map +1 -0
  165. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +66 -0
  166. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs.map +1 -0
  167. package/dist/builtins/snapshot/index.d.ts +3 -0
  168. package/dist/builtins/snapshot/index.d.ts.map +1 -0
  169. package/dist/builtins/snapshot/index.js +481 -491
  170. package/dist/builtins/snapshot/index.js.map +1 -1
  171. package/dist/builtins/snapshot/index.mjs +475 -464
  172. package/dist/builtins/snapshot/index.mjs.map +1 -1
  173. package/dist/builtins/snapshot/snapshot.addon.d.ts +121 -0
  174. package/dist/builtins/snapshot/snapshot.addon.d.ts.map +1 -0
  175. package/dist/builtins/sqlite-storage/config-store.d.ts +9 -0
  176. package/dist/builtins/sqlite-storage/config-store.d.ts.map +1 -0
  177. package/dist/builtins/sqlite-storage/device-store.d.ts +24 -0
  178. package/dist/builtins/sqlite-storage/device-store.d.ts.map +1 -0
  179. package/dist/builtins/sqlite-storage/filesystem-storage-provider.d.ts +87 -0
  180. package/dist/builtins/sqlite-storage/filesystem-storage-provider.d.ts.map +1 -0
  181. package/dist/builtins/sqlite-storage/filesystem-storage.addon.d.ts +32 -0
  182. package/dist/builtins/sqlite-storage/filesystem-storage.addon.d.ts.map +1 -0
  183. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +312 -56
  184. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js.map +1 -1
  185. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +305 -7
  186. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs.map +1 -1
  187. package/dist/builtins/sqlite-storage/index.d.ts +12 -0
  188. package/dist/builtins/sqlite-storage/index.d.ts.map +1 -0
  189. package/dist/builtins/sqlite-storage/index.js +229 -1001
  190. package/dist/builtins/sqlite-storage/index.js.map +1 -1
  191. package/dist/builtins/sqlite-storage/index.mjs +268 -26
  192. package/dist/builtins/sqlite-storage/index.mjs.map +1 -1
  193. package/dist/builtins/sqlite-storage/integration-registry.d.ts +28 -0
  194. package/dist/builtins/sqlite-storage/integration-registry.d.ts.map +1 -0
  195. package/dist/builtins/sqlite-storage/settings-store.d.ts +40 -0
  196. package/dist/builtins/sqlite-storage/settings-store.d.ts.map +1 -0
  197. package/dist/builtins/sqlite-storage/sql-schema.d.ts +33 -0
  198. package/dist/builtins/sqlite-storage/sql-schema.d.ts.map +1 -0
  199. package/dist/builtins/sqlite-storage/sqlite-settings-backend.d.ts +94 -0
  200. package/dist/builtins/sqlite-storage/sqlite-settings-backend.d.ts.map +1 -0
  201. package/dist/builtins/sqlite-storage/sqlite-settings.addon.d.ts +15 -0
  202. package/dist/builtins/sqlite-storage/sqlite-settings.addon.d.ts.map +1 -0
  203. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +586 -653
  204. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js.map +1 -1
  205. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +582 -7
  206. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs.map +1 -1
  207. package/dist/builtins/storage-orchestrator/index.d.ts +7 -0
  208. package/dist/builtins/storage-orchestrator/index.d.ts.map +1 -0
  209. package/dist/builtins/storage-orchestrator/index.js +9 -0
  210. package/dist/builtins/storage-orchestrator/index.mjs +2 -0
  211. package/dist/builtins/storage-orchestrator/location-store.d.ts +50 -0
  212. package/dist/builtins/storage-orchestrator/location-store.d.ts.map +1 -0
  213. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.d.ts +60 -0
  214. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.d.ts.map +1 -0
  215. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +755 -0
  216. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js.map +1 -0
  217. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +746 -0
  218. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs.map +1 -0
  219. package/dist/builtins/storage-orchestrator/storage-orchestrator.service.d.ts +121 -0
  220. package/dist/builtins/storage-orchestrator/storage-orchestrator.service.d.ts.map +1 -0
  221. package/dist/builtins/system-backup/system-backup.service.d.ts +138 -0
  222. package/dist/builtins/system-backup/system-backup.service.d.ts.map +1 -0
  223. package/dist/builtins/system-config/index.d.ts +2 -0
  224. package/dist/builtins/system-config/index.d.ts.map +1 -0
  225. package/dist/builtins/system-config/index.js +6 -188
  226. package/dist/builtins/system-config/index.mjs +2 -10
  227. package/dist/builtins/system-config/system-config.addon.d.ts +11 -0
  228. package/dist/builtins/system-config/system-config.addon.d.ts.map +1 -0
  229. package/dist/builtins/system-config/system-config.addon.js +227 -180
  230. package/dist/builtins/system-config/system-config.addon.js.map +1 -1
  231. package/dist/builtins/system-config/system-config.addon.mjs +226 -7
  232. package/dist/builtins/system-config/system-config.addon.mjs.map +1 -1
  233. package/dist/builtins/turn-orchestrator/index.d.ts +2 -0
  234. package/dist/builtins/turn-orchestrator/index.d.ts.map +1 -0
  235. package/dist/builtins/turn-orchestrator/index.js +7 -0
  236. package/dist/builtins/turn-orchestrator/index.mjs +2 -0
  237. package/dist/builtins/turn-orchestrator/turn-orchestrator.addon.d.ts +10 -0
  238. package/dist/builtins/turn-orchestrator/turn-orchestrator.addon.d.ts.map +1 -0
  239. package/dist/builtins/turn-orchestrator/turn-orchestrator.addon.js +78 -0
  240. package/dist/builtins/turn-orchestrator/turn-orchestrator.addon.js.map +1 -0
  241. package/dist/builtins/turn-orchestrator/turn-orchestrator.addon.mjs +72 -0
  242. package/dist/builtins/turn-orchestrator/turn-orchestrator.addon.mjs.map +1 -0
  243. package/dist/builtins/winston-logging/index.d.ts +4 -0
  244. package/dist/builtins/winston-logging/index.d.ts.map +1 -0
  245. package/dist/builtins/winston-logging/index.js +153 -300
  246. package/dist/builtins/winston-logging/index.js.map +1 -1
  247. package/dist/builtins/winston-logging/index.mjs +144 -9
  248. package/dist/builtins/winston-logging/index.mjs.map +1 -1
  249. package/dist/builtins/winston-logging/winston-destination.d.ts +22 -0
  250. package/dist/builtins/winston-logging/winston-destination.d.ts.map +1 -0
  251. package/dist/builtins/winston-logging/winston-logging.addon.d.ts +20 -0
  252. package/dist/builtins/winston-logging/winston-logging.addon.d.ts.map +1 -0
  253. package/dist/chunk-C13QxCFV.js +50 -0
  254. package/dist/chunk-hT5z_Zn9.mjs +35 -0
  255. package/dist/download/model-download-service.d.ts +42 -0
  256. package/dist/download/model-download-service.d.ts.map +1 -0
  257. package/dist/download/model-downloader.d.ts +32 -0
  258. package/dist/download/model-downloader.d.ts.map +1 -0
  259. package/dist/events/event-bus.d.ts +11 -0
  260. package/dist/events/event-bus.d.ts.map +1 -0
  261. package/dist/events/system-event-bus.d.ts +15 -0
  262. package/dist/events/system-event-bus.d.ts.map +1 -0
  263. package/dist/feature/feature-manager.d.ts +12 -0
  264. package/dist/feature/feature-manager.d.ts.map +1 -0
  265. package/dist/formatter-C-5An4Bl.mjs +164 -0
  266. package/dist/formatter-C-5An4Bl.mjs.map +1 -0
  267. package/dist/formatter-Dr_6NNZc.js +169 -0
  268. package/dist/formatter-Dr_6NNZc.js.map +1 -0
  269. package/dist/index.d.ts +76 -1696
  270. package/dist/index.d.ts.map +1 -0
  271. package/dist/index.js +7780 -8035
  272. package/dist/index.js.map +1 -1
  273. package/dist/index.mjs +7707 -2148
  274. package/dist/index.mjs.map +1 -1
  275. package/dist/lifecycle/lifecycle-state-machine.d.ts +29 -0
  276. package/dist/lifecycle/lifecycle-state-machine.d.ts.map +1 -0
  277. package/dist/logging/formatter.d.ts +31 -0
  278. package/dist/logging/formatter.d.ts.map +1 -0
  279. package/dist/logging/log-manager.d.ts +52 -0
  280. package/dist/logging/log-manager.d.ts.map +1 -0
  281. package/dist/logging/log-ring-buffer.d.ts +48 -0
  282. package/dist/logging/log-ring-buffer.d.ts.map +1 -0
  283. package/dist/logging/scoped-logger.d.ts +18 -0
  284. package/dist/logging/scoped-logger.d.ts.map +1 -0
  285. package/dist/network/network-quality.d.ts +12 -0
  286. package/dist/network/network-quality.d.ts.map +1 -0
  287. package/dist/notification/notification-service.d.ts +38 -0
  288. package/dist/notification/notification-service.d.ts.map +1 -0
  289. package/dist/notification/toast-service.d.ts +23 -0
  290. package/dist/notification/toast-service.d.ts.map +1 -0
  291. package/dist/pipeline/engine-manager-resolver.d.ts +16 -0
  292. package/dist/pipeline/engine-manager-resolver.d.ts.map +1 -0
  293. package/dist/pipeline/pipeline-runner.d.ts +9 -0
  294. package/dist/pipeline/pipeline-runner.d.ts.map +1 -0
  295. package/dist/pipeline/pipeline-validator.d.ts +14 -0
  296. package/dist/pipeline/pipeline-validator.d.ts.map +1 -0
  297. package/dist/process/resource-monitor.d.ts +12 -0
  298. package/dist/process/resource-monitor.d.ts.map +1 -0
  299. package/dist/python/python-env-manager.d.ts +13 -0
  300. package/dist/python/python-env-manager.d.ts.map +1 -0
  301. package/dist/repl/interfaces.d.ts +32 -0
  302. package/dist/repl/interfaces.d.ts.map +1 -0
  303. package/dist/repl/repl-engine.d.ts +9 -0
  304. package/dist/repl/repl-engine.d.ts.map +1 -0
  305. package/dist/resource-monitor-CmuWlmap.js +76 -0
  306. package/dist/resource-monitor-CmuWlmap.js.map +1 -0
  307. package/dist/resource-monitor-DcQdKGYU.mjs +59 -0
  308. package/dist/resource-monitor-DcQdKGYU.mjs.map +1 -0
  309. package/dist/storage/fs-storage-backend.d.ts +41 -0
  310. package/dist/storage/fs-storage-backend.d.ts.map +1 -0
  311. package/dist/storage/storage-location-manager.d.ts +24 -0
  312. package/dist/storage/storage-location-manager.d.ts.map +1 -0
  313. package/dist/storage/storage-manager.d.ts +77 -0
  314. package/dist/storage/storage-manager.d.ts.map +1 -0
  315. package/dist/tls/cert-manager.d.ts +27 -0
  316. package/dist/tls/cert-manager.d.ts.map +1 -0
  317. package/dist/tls/index.d.ts +2 -0
  318. package/dist/tls/index.d.ts.map +1 -0
  319. package/package.json +119 -23
  320. package/dist/builtins/addon-pages-aggregator/index.js.map +0 -1
  321. package/dist/builtins/addon-pages-aggregator/index.mjs.map +0 -1
  322. package/dist/builtins/addon-widgets-aggregator/index.js.map +0 -1
  323. package/dist/builtins/addon-widgets-aggregator/index.mjs.map +0 -1
  324. package/dist/builtins/alerts/index.js.map +0 -1
  325. package/dist/builtins/alerts/index.mjs.map +0 -1
  326. package/dist/builtins/device-manager/index.js.map +0 -1
  327. package/dist/builtins/device-manager/index.mjs.map +0 -1
  328. package/dist/builtins/local-auth/index.js.map +0 -1
  329. package/dist/builtins/local-auth/index.mjs.map +0 -1
  330. package/dist/builtins/local-backup/index.js +0 -173
  331. package/dist/builtins/local-backup/index.js.map +0 -1
  332. package/dist/builtins/local-backup/index.mjs +0 -10
  333. package/dist/builtins/local-backup/index.mjs.map +0 -1
  334. package/dist/builtins/system-config/index.js.map +0 -1
  335. package/dist/builtins/system-config/index.mjs.map +0 -1
  336. package/dist/chunk-2CIYKDRN.mjs +0 -1
  337. package/dist/chunk-2CIYKDRN.mjs.map +0 -1
  338. package/dist/chunk-2F76X6NL.mjs +0 -136
  339. package/dist/chunk-2F76X6NL.mjs.map +0 -1
  340. package/dist/chunk-2QUFBZ7M.mjs +0 -1
  341. package/dist/chunk-2QUFBZ7M.mjs.map +0 -1
  342. package/dist/chunk-3BK2Y7GY.mjs +0 -593
  343. package/dist/chunk-3BK2Y7GY.mjs.map +0 -1
  344. package/dist/chunk-4OOHFJHT.mjs +0 -421
  345. package/dist/chunk-4OOHFJHT.mjs.map +0 -1
  346. package/dist/chunk-4XHB7IHT.mjs +0 -809
  347. package/dist/chunk-4XHB7IHT.mjs.map +0 -1
  348. package/dist/chunk-6M2HSSTQ.mjs +0 -98
  349. package/dist/chunk-6M2HSSTQ.mjs.map +0 -1
  350. package/dist/chunk-7FI7SQS7.mjs +0 -135
  351. package/dist/chunk-7FI7SQS7.mjs.map +0 -1
  352. package/dist/chunk-ED57RCQE.mjs +0 -171
  353. package/dist/chunk-ED57RCQE.mjs.map +0 -1
  354. package/dist/chunk-FZN56HGQ.mjs +0 -626
  355. package/dist/chunk-FZN56HGQ.mjs.map +0 -1
  356. package/dist/chunk-GL4OOB25.mjs +0 -51
  357. package/dist/chunk-GL4OOB25.mjs.map +0 -1
  358. package/dist/chunk-KDG2NTDB.mjs +0 -137
  359. package/dist/chunk-KDG2NTDB.mjs.map +0 -1
  360. package/dist/chunk-NRBQWBDM.mjs +0 -191
  361. package/dist/chunk-NRBQWBDM.mjs.map +0 -1
  362. package/dist/chunk-O4V246GG.mjs +0 -2137
  363. package/dist/chunk-O4V246GG.mjs.map +0 -1
  364. package/dist/chunk-QT57H266.mjs +0 -163
  365. package/dist/chunk-QT57H266.mjs.map +0 -1
  366. package/dist/chunk-QX4RH25I.mjs +0 -141
  367. package/dist/chunk-QX4RH25I.mjs.map +0 -1
  368. package/dist/chunk-TB562PZX.mjs +0 -86
  369. package/dist/chunk-TB562PZX.mjs.map +0 -1
  370. package/dist/chunk-TDYPZXK5.mjs +0 -1
  371. package/dist/chunk-TDYPZXK5.mjs.map +0 -1
  372. package/dist/chunk-UJI4LN5P.mjs +0 -36
  373. package/dist/chunk-UJI4LN5P.mjs.map +0 -1
  374. package/dist/chunk-W6RTHQGP.mjs +0 -1
  375. package/dist/chunk-W6RTHQGP.mjs.map +0 -1
  376. package/dist/chunk-ZELBCPDC.mjs +0 -369
  377. package/dist/chunk-ZELBCPDC.mjs.map +0 -1
  378. package/dist/index.d.mts +0 -1696
  379. package/dist/resource-monitor-UZUGPIAU.mjs +0 -9
  380. package/dist/resource-monitor-UZUGPIAU.mjs.map +0 -1
  381. package/dist/storage-location-manager-HFNB3PCS.mjs +0 -7
  382. package/dist/storage-location-manager-HFNB3PCS.mjs.map +0 -1
@@ -1,200 +1,202 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.ts
31
- var addon_widgets_aggregator_addon_exports = {};
32
- __export(addon_widgets_aggregator_addon_exports, {
33
- AddonWidgetsAggregatorAddon: () => AddonWidgetsAggregatorAddon,
34
- default: () => addon_widgets_aggregator_addon_default
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
35
4
  });
36
- module.exports = __toCommonJS(addon_widgets_aggregator_addon_exports);
37
- var path = __toESM(require("path"));
38
- var fs = __toESM(require("fs"));
39
- var import_node_crypto = require("crypto");
40
- var import_types = require("@camstack/types");
41
- var RETRY_BACKOFF_MS = [500, 1500, 4e3];
42
- var AddonWidgetsAggregatorAddon = class extends import_types.BaseAddon {
43
- id = "addon-widgets-aggregator";
44
- resolvedPaths = null;
45
- /**
46
- * Last successful `listWidgets()` snapshot per source. Used as the
47
- * "stale-but-valid" fallback when a source transiently fails — drops
48
- * happen often enough during boot (Moleculer service-discovery
49
- * window) that swallowing the error and returning empty would leave
50
- * the dashboard with nothing for several seconds. Keeping the
51
- * previous good entry means a flake is invisible to the operator.
52
- */
53
- lastGood = /* @__PURE__ */ new Map();
54
- /** In-flight retry guards keyed by sourceAddonId. Avoids double-scheduling. */
55
- retryTimers = /* @__PURE__ */ new Map();
56
- constructor() {
57
- super({});
58
- }
59
- async onInitialize() {
60
- this.resolvedPaths = await this.resolvePaths();
61
- const provider = {
62
- listWidgets: async () => this.aggregate()
63
- };
64
- this.ctx.logger.info("Initialized \u2014 aggregating addon-widgets-source providers");
65
- return [{ capability: import_types.addonWidgetsCapability, provider }];
66
- }
67
- async onShutdown() {
68
- for (const t of this.retryTimers.values()) clearTimeout(t);
69
- this.retryTimers.clear();
70
- this.lastGood.clear();
71
- }
72
- // ── Aggregation ───────────────────────────────────────────────────
73
- async aggregate() {
74
- const entries = this.capabilities?.getCollectionEntries("addon-widgets-source") ?? [];
75
- const out = [];
76
- const seenIds = /* @__PURE__ */ new Set();
77
- for (const [addonId, source] of entries) {
78
- seenIds.add(addonId);
79
- try {
80
- const widgets = await Promise.resolve(source.listWidgets());
81
- const enriched = widgets.map((w) => ({
82
- ...w,
83
- addonId,
84
- bundleUrl: this.makeBundleUrl(addonId, w.bundle)
85
- }));
86
- for (const item of enriched) out.push(item);
87
- this.lastGood.set(addonId, enriched);
88
- } catch (err) {
89
- const message = (0, import_types.errMsg)(err);
90
- this.ctx.logger.warn("addon-widgets-source provider failed", {
91
- meta: { sourceId: addonId, error: message }
92
- });
93
- const cached = this.lastGood.get(addonId);
94
- if (cached !== void 0) {
95
- for (const item of cached) out.push(item);
96
- this.ctx.logger.info("addon-widgets-source falling back to cached snapshot", {
97
- meta: { sourceId: addonId, cachedWidgets: cached.length }
98
- });
99
- }
100
- this.scheduleRetry(addonId);
101
- }
102
- }
103
- for (const cachedId of this.lastGood.keys()) {
104
- if (!seenIds.has(cachedId)) this.lastGood.delete(cachedId);
105
- }
106
- return out;
107
- }
108
- // ── Retry on transient Moleculer race ─────────────────────────────
109
- scheduleRetry(sourceId, attempt = 0) {
110
- if (attempt >= RETRY_BACKOFF_MS.length) return;
111
- if (this.retryTimers.has(sourceId)) return;
112
- const delayMs = RETRY_BACKOFF_MS[attempt] ?? RETRY_BACKOFF_MS[RETRY_BACKOFF_MS.length - 1];
113
- const timer = setTimeout(() => {
114
- this.retryTimers.delete(sourceId);
115
- void this.retrySource(sourceId, attempt);
116
- }, delayMs);
117
- this.retryTimers.set(sourceId, timer);
118
- }
119
- async retrySource(sourceId, attempt) {
120
- const entries = this.capabilities?.getCollectionEntries("addon-widgets-source") ?? [];
121
- const found = entries.find(([id]) => id === sourceId);
122
- if (!found) return;
123
- const [addonId, source] = found;
124
- try {
125
- const widgets = await Promise.resolve(source.listWidgets());
126
- const enriched = widgets.map((w) => ({
127
- ...w,
128
- addonId,
129
- bundleUrl: this.makeBundleUrl(addonId, w.bundle)
130
- }));
131
- this.lastGood.set(addonId, enriched);
132
- this.ctx.logger.info("addon-widgets-source recovered after retry", {
133
- meta: { sourceId: addonId, attempt: attempt + 1, widgets: enriched.length }
134
- });
135
- this.ctx.eventBus.emit({
136
- id: (0, import_node_crypto.randomUUID)(),
137
- timestamp: /* @__PURE__ */ new Date(),
138
- source: { type: "addon", id: this.id },
139
- category: import_types.EventCategory.AddonWidgetReady,
140
- data: { addonId, recovered: true }
141
- });
142
- } catch (err) {
143
- this.ctx.logger.debug("addon-widgets-source retry failed", {
144
- meta: { sourceId, attempt: attempt + 1, error: (0, import_types.errMsg)(err) }
145
- });
146
- this.scheduleRetry(sourceId, attempt + 1);
147
- }
148
- }
149
- // ── Bundle URL stamping ──────────────────────────────────────────
150
- /**
151
- * Build `/api/addon-widgets/<addonId>/<bundle>?v=<mtime>`. Falls back
152
- * to `Date.now()` when the bundle path can't be stat'd (remote addon
153
- * with no local file, addon not yet on disk, etc.) — the browser
154
- * just gets a fresh URL on each call instead of cache-friendly mtime.
155
- */
156
- makeBundleUrl(addonId, bundle) {
157
- const bundlePath = this.resolveBundlePath(addonId, bundle);
158
- let mtime = Date.now();
159
- if (bundlePath !== null) {
160
- try {
161
- mtime = fs.statSync(bundlePath).mtimeMs;
162
- } catch {
163
- }
164
- }
165
- const v = Math.floor(mtime);
166
- return `/api/addon-widgets/${addonId}/${bundle}?v=${v}`;
167
- }
168
- resolveBundlePath(addonId, bundle) {
169
- const paths = this.resolvedPaths;
170
- if (!paths) return null;
171
- const addonDistPath = path.join(paths.addonsDir, "@camstack", `addon-${addonId}`, "dist");
172
- const resolvedBase = path.resolve(addonDistPath);
173
- const resolvedFile = path.resolve(addonDistPath, bundle);
174
- if (!resolvedFile.startsWith(resolvedBase + path.sep) && resolvedFile !== resolvedBase) {
175
- return null;
176
- }
177
- return resolvedFile;
178
- }
179
- // ── Path resolution ──────────────────────────────────────────────
180
- async resolvePaths() {
181
- const fallback = { addonsDir: path.resolve("camstack-data", "addons") };
182
- if (!this.ctx.settings) return fallback;
183
- try {
184
- const server = await this.ctx.settings.getSection("server");
185
- const dataPath = typeof server["dataPath"] === "string" && server["dataPath"] ? server["dataPath"] : "camstack-data";
186
- return { addonsDir: path.resolve(dataPath, "addons") };
187
- } catch (err) {
188
- this.ctx.logger.debug("Failed to read server.dataPath \u2014 falling back", {
189
- meta: { error: (0, import_types.errMsg)(err) }
190
- });
191
- return fallback;
192
- }
193
- }
5
+ const require_chunk = require("../../chunk-C13QxCFV.js");
6
+ let node_fs = require("node:fs");
7
+ node_fs = require_chunk.__toESM(node_fs);
8
+ let node_path = require("node:path");
9
+ node_path = require_chunk.__toESM(node_path);
10
+ let node_crypto = require("node:crypto");
11
+ let _camstack_types = require("@camstack/types");
12
+ //#region src/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.ts
13
+ /**
14
+ * Addon Widgets Aggregator — hub-local builtin that owns the singleton
15
+ * `addon-widgets` cap.
16
+ *
17
+ * Mirrors `addon-pages-aggregator` exactly: walks every registered
18
+ * `addon-widgets-source` (collection) provider and emits an enriched
19
+ * widget metadata list with versioned `bundleUrl`s pointing at
20
+ * `/api/addon-widgets/<addonId>/<bundle>?v=<mtime>`. The filesystem
21
+ * `mtime` cache-buster lets the browser pick up addon rebuilds without
22
+ * manual reload.
23
+ *
24
+ * The static file endpoint (`/api/addon-widgets/:addonId/*`) is served
25
+ * by `AddonWidgetsService.resolveBundle()` on the server side; this
26
+ * addon only owns the listing surface.
27
+ *
28
+ * Why a builtin: same reasoning as `addon-pages-aggregator`. The
29
+ * aggregator is the de-facto "addon-widgets provider" — addons own caps,
30
+ * not the server. Living in `@camstack/core/builtins` keeps the surface
31
+ * symmetrical with `system-config`, `local-auth`, etc.
32
+ */
33
+ /**
34
+ * Backoff schedule (ms) used to retry sources that failed during a
35
+ * `listWidgets()` round-trip — typically because the cap was just
36
+ * registered (provider connected via Moleculer) but the worker-side
37
+ * action registration hadn't propagated yet, so `Service '...listWidgets'
38
+ * is not found on '<node>'` raced ahead of the call.
39
+ *
40
+ * On success we re-emit `AddonWidgetReady` so admin-ui invalidates its
41
+ * `addonWidgets.listWidgets` query and the registry populates without a
42
+ * page reload.
43
+ */
44
+ var RETRY_BACKOFF_MS = [
45
+ 500,
46
+ 1500,
47
+ 4e3
48
+ ];
49
+ var AddonWidgetsAggregatorAddon = class extends _camstack_types.BaseAddon {
50
+ id = "addon-widgets-aggregator";
51
+ resolvedPaths = null;
52
+ /**
53
+ * Last successful `listWidgets()` snapshot per source. Used as the
54
+ * "stale-but-valid" fallback when a source transiently fails — drops
55
+ * happen often enough during boot (Moleculer service-discovery
56
+ * window) that swallowing the error and returning empty would leave
57
+ * the dashboard with nothing for several seconds. Keeping the
58
+ * previous good entry means a flake is invisible to the operator.
59
+ */
60
+ lastGood = /* @__PURE__ */ new Map();
61
+ /** In-flight retry guards keyed by sourceAddonId. Avoids double-scheduling. */
62
+ retryTimers = /* @__PURE__ */ new Map();
63
+ constructor() {
64
+ super({});
65
+ }
66
+ async onInitialize() {
67
+ this.resolvedPaths = await this.resolvePaths();
68
+ const provider = { listWidgets: async () => this.aggregate() };
69
+ this.ctx.logger.info("Initialized — aggregating addon-widgets-source providers");
70
+ return [{
71
+ capability: _camstack_types.addonWidgetsCapability,
72
+ provider
73
+ }];
74
+ }
75
+ async onShutdown() {
76
+ for (const t of this.retryTimers.values()) clearTimeout(t);
77
+ this.retryTimers.clear();
78
+ this.lastGood.clear();
79
+ }
80
+ async aggregate() {
81
+ const entries = this.capabilities?.getCollectionEntries("addon-widgets-source") ?? [];
82
+ const out = [];
83
+ const seenIds = /* @__PURE__ */ new Set();
84
+ for (const [addonId, source] of entries) {
85
+ seenIds.add(addonId);
86
+ try {
87
+ const enriched = (await Promise.resolve(source.listWidgets())).map((w) => ({
88
+ ...w,
89
+ addonId,
90
+ bundleUrl: this.makeBundleUrl(addonId, w.bundle)
91
+ }));
92
+ for (const item of enriched) out.push(item);
93
+ this.lastGood.set(addonId, enriched);
94
+ } catch (err) {
95
+ const message = (0, _camstack_types.errMsg)(err);
96
+ this.ctx.logger.warn("addon-widgets-source provider failed", { meta: {
97
+ sourceId: addonId,
98
+ error: message
99
+ } });
100
+ const cached = this.lastGood.get(addonId);
101
+ if (cached !== void 0) {
102
+ for (const item of cached) out.push(item);
103
+ this.ctx.logger.info("addon-widgets-source falling back to cached snapshot", { meta: {
104
+ sourceId: addonId,
105
+ cachedWidgets: cached.length
106
+ } });
107
+ }
108
+ this.scheduleRetry(addonId);
109
+ }
110
+ }
111
+ for (const cachedId of this.lastGood.keys()) if (!seenIds.has(cachedId)) this.lastGood.delete(cachedId);
112
+ return out;
113
+ }
114
+ scheduleRetry(sourceId, attempt = 0) {
115
+ if (attempt >= RETRY_BACKOFF_MS.length) return;
116
+ if (this.retryTimers.has(sourceId)) return;
117
+ const delayMs = RETRY_BACKOFF_MS[attempt] ?? RETRY_BACKOFF_MS[RETRY_BACKOFF_MS.length - 1];
118
+ const timer = setTimeout(() => {
119
+ this.retryTimers.delete(sourceId);
120
+ this.retrySource(sourceId, attempt);
121
+ }, delayMs);
122
+ this.retryTimers.set(sourceId, timer);
123
+ }
124
+ async retrySource(sourceId, attempt) {
125
+ const found = (this.capabilities?.getCollectionEntries("addon-widgets-source") ?? []).find(([id]) => id === sourceId);
126
+ if (!found) return;
127
+ const [addonId, source] = found;
128
+ try {
129
+ const enriched = (await Promise.resolve(source.listWidgets())).map((w) => ({
130
+ ...w,
131
+ addonId,
132
+ bundleUrl: this.makeBundleUrl(addonId, w.bundle)
133
+ }));
134
+ this.lastGood.set(addonId, enriched);
135
+ this.ctx.logger.info("addon-widgets-source recovered after retry", { meta: {
136
+ sourceId: addonId,
137
+ attempt: attempt + 1,
138
+ widgets: enriched.length
139
+ } });
140
+ this.ctx.eventBus.emit({
141
+ id: (0, node_crypto.randomUUID)(),
142
+ timestamp: /* @__PURE__ */ new Date(),
143
+ source: {
144
+ type: "addon",
145
+ id: this.id
146
+ },
147
+ category: _camstack_types.EventCategory.AddonWidgetReady,
148
+ data: {
149
+ addonId,
150
+ recovered: true
151
+ }
152
+ });
153
+ } catch (err) {
154
+ this.ctx.logger.debug("addon-widgets-source retry failed", { meta: {
155
+ sourceId,
156
+ attempt: attempt + 1,
157
+ error: (0, _camstack_types.errMsg)(err)
158
+ } });
159
+ this.scheduleRetry(sourceId, attempt + 1);
160
+ }
161
+ }
162
+ /**
163
+ * Build `/api/addon-widgets/<addonId>/<bundle>?v=<mtime>`. Falls back
164
+ * to `Date.now()` when the bundle path can't be stat'd (remote addon
165
+ * with no local file, addon not yet on disk, etc.) — the browser
166
+ * just gets a fresh URL on each call instead of cache-friendly mtime.
167
+ */
168
+ makeBundleUrl(addonId, bundle) {
169
+ const bundlePath = this.resolveBundlePath(addonId, bundle);
170
+ let mtime = Date.now();
171
+ if (bundlePath !== null) try {
172
+ mtime = node_fs.statSync(bundlePath).mtimeMs;
173
+ } catch {}
174
+ return `/api/addon-widgets/${addonId}/${bundle}?v=${Math.floor(mtime)}`;
175
+ }
176
+ resolveBundlePath(addonId, bundle) {
177
+ const paths = this.resolvedPaths;
178
+ if (!paths) return null;
179
+ const addonDistPath = node_path.join(paths.addonsDir, "@camstack", `addon-${addonId}`, "dist");
180
+ const resolvedBase = node_path.resolve(addonDistPath);
181
+ const resolvedFile = node_path.resolve(addonDistPath, bundle);
182
+ if (!resolvedFile.startsWith(resolvedBase + node_path.sep) && resolvedFile !== resolvedBase) return null;
183
+ return resolvedFile;
184
+ }
185
+ async resolvePaths() {
186
+ const fallback = { addonsDir: node_path.resolve("camstack-data", "addons") };
187
+ if (!this.ctx.settings) return fallback;
188
+ try {
189
+ const server = await this.ctx.settings.getSection("server");
190
+ const dataPath = typeof server["dataPath"] === "string" && server["dataPath"] ? server["dataPath"] : "camstack-data";
191
+ return { addonsDir: node_path.resolve(dataPath, "addons") };
192
+ } catch (err) {
193
+ this.ctx.logger.debug("Failed to read server.dataPath — falling back", { meta: { error: (0, _camstack_types.errMsg)(err) } });
194
+ return fallback;
195
+ }
196
+ }
194
197
  };
195
- var addon_widgets_aggregator_addon_default = AddonWidgetsAggregatorAddon;
196
- // Annotate the CommonJS export names for ESM import in node:
197
- 0 && (module.exports = {
198
- AddonWidgetsAggregatorAddon
199
- });
198
+ //#endregion
199
+ exports.AddonWidgetsAggregatorAddon = AddonWidgetsAggregatorAddon;
200
+ exports.default = AddonWidgetsAggregatorAddon;
201
+
200
202
  //# sourceMappingURL=addon-widgets-aggregator.addon.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.ts"],"sourcesContent":["/**\n * Addon Widgets Aggregator — hub-local builtin that owns the singleton\n * `addon-widgets` cap.\n *\n * Mirrors `addon-pages-aggregator` exactly: walks every registered\n * `addon-widgets-source` (collection) provider and emits an enriched\n * widget metadata list with versioned `bundleUrl`s pointing at\n * `/api/addon-widgets/<addonId>/<bundle>?v=<mtime>`. The filesystem\n * `mtime` cache-buster lets the browser pick up addon rebuilds without\n * manual reload.\n *\n * The static file endpoint (`/api/addon-widgets/:addonId/*`) is served\n * by `AddonWidgetsService.resolveBundle()` on the server side; this\n * addon only owns the listing surface.\n *\n * Why a builtin: same reasoning as `addon-pages-aggregator`. The\n * aggregator is the de-facto \"addon-widgets provider\" — addons own caps,\n * not the server. Living in `@camstack/core/builtins` keeps the surface\n * symmetrical with `system-config`, `local-auth`, etc.\n */\nimport * as path from 'node:path'\nimport * as fs from 'node:fs'\nimport { randomUUID } from 'node:crypto'\nimport {\n BaseAddon,\n EventCategory,\n addonWidgetsCapability,\n errMsg,\n type IAddonWidgetsAggregatorProvider,\n type IAddonWidgetsSourceProvider,\n type ProviderRegistration,\n} from '@camstack/types'\n\ninterface ResolvedPaths {\n readonly addonsDir: string\n}\n\n/**\n * Inferred from the cap definition — equivalent to:\n * `z.infer<typeof EnrichedWidgetMetadataSchema>` but reuses the\n * provider's return type so the aggregator stays in lockstep with the\n * cap if its shape evolves.\n */\ntype EnrichedWidget = Awaited<ReturnType<IAddonWidgetsAggregatorProvider['listWidgets']>>[number]\ntype RawWidget = Awaited<ReturnType<IAddonWidgetsSourceProvider['listWidgets']>>[number]\n\n/**\n * Backoff schedule (ms) used to retry sources that failed during a\n * `listWidgets()` round-trip — typically because the cap was just\n * registered (provider connected via Moleculer) but the worker-side\n * action registration hadn't propagated yet, so `Service '...listWidgets'\n * is not found on '<node>'` raced ahead of the call.\n *\n * On success we re-emit `AddonWidgetReady` so admin-ui invalidates its\n * `addonWidgets.listWidgets` query and the registry populates without a\n * page reload.\n */\nconst RETRY_BACKOFF_MS: readonly number[] = [500, 1500, 4000]\n\nexport class AddonWidgetsAggregatorAddon extends BaseAddon {\n readonly id = 'addon-widgets-aggregator'\n\n private resolvedPaths: ResolvedPaths | null = null\n\n /**\n * Last successful `listWidgets()` snapshot per source. Used as the\n * \"stale-but-valid\" fallback when a source transiently fails — drops\n * happen often enough during boot (Moleculer service-discovery\n * window) that swallowing the error and returning empty would leave\n * the dashboard with nothing for several seconds. Keeping the\n * previous good entry means a flake is invisible to the operator.\n */\n private readonly lastGood = new Map<string, readonly EnrichedWidget[]>()\n\n /** In-flight retry guards keyed by sourceAddonId. Avoids double-scheduling. */\n private readonly retryTimers = new Map<string, NodeJS.Timeout>()\n\n constructor() { super({}) }\n\n protected async onInitialize(): Promise<ProviderRegistration[]> {\n this.resolvedPaths = await this.resolvePaths()\n\n const provider: IAddonWidgetsAggregatorProvider = {\n listWidgets: async (): Promise<readonly EnrichedWidget[]> => this.aggregate(),\n }\n\n this.ctx.logger.info('Initialized — aggregating addon-widgets-source providers')\n return [{ capability: addonWidgetsCapability, provider }]\n }\n\n protected async onShutdown(): Promise<void> {\n for (const t of this.retryTimers.values()) clearTimeout(t)\n this.retryTimers.clear()\n this.lastGood.clear()\n }\n\n // ── Aggregation ───────────────────────────────────────────────────\n\n private async aggregate(): Promise<readonly EnrichedWidget[]> {\n // `getCollectionEntries` returns `[addonId, provider]` tuples — the\n // raw `addon-widgets-source` cap doesn't carry an `id` on the\n // provider (unlike the legacy `IAddonPageProvider`), so we lean on\n // the registry to attribute each contribution back to its addon.\n const entries = this.capabilities?.getCollectionEntries<IAddonWidgetsSourceProvider>('addon-widgets-source') ?? []\n const out: EnrichedWidget[] = []\n const seenIds = new Set<string>()\n\n for (const [addonId, source] of entries) {\n seenIds.add(addonId)\n try {\n const widgets = await Promise.resolve(source.listWidgets())\n const enriched: EnrichedWidget[] = widgets.map((w: RawWidget) => ({\n ...w,\n addonId,\n bundleUrl: this.makeBundleUrl(addonId, w.bundle),\n }))\n for (const item of enriched) out.push(item)\n // Cache successful snapshot — used as fallback on next failure.\n this.lastGood.set(addonId, enriched)\n } catch (err: unknown) {\n const message = errMsg(err)\n this.ctx.logger.warn('addon-widgets-source provider failed', {\n meta: { sourceId: addonId, error: message },\n })\n // Fall back to the last-good snapshot for this source so a\n // transient Moleculer service-discovery race doesn't blank\n // the dashboard.\n const cached = this.lastGood.get(addonId)\n if (cached !== undefined) {\n for (const item of cached) out.push(item)\n this.ctx.logger.info('addon-widgets-source falling back to cached snapshot', {\n meta: { sourceId: addonId, cachedWidgets: cached.length },\n })\n }\n // Schedule a background retry. On success we re-emit\n // `AddonWidgetReady` so admin-ui's queryClient invalidates and\n // any newly-loaded widgets show up without a manual reload.\n this.scheduleRetry(addonId)\n }\n }\n\n // Drop cache entries for sources that have disappeared from the\n // registry — keeps the fallback aligned with the live collection.\n for (const cachedId of this.lastGood.keys()) {\n if (!seenIds.has(cachedId)) this.lastGood.delete(cachedId)\n }\n\n return out\n }\n\n // ── Retry on transient Moleculer race ─────────────────────────────\n\n private scheduleRetry(sourceId: string, attempt = 0): void {\n if (attempt >= RETRY_BACKOFF_MS.length) return\n if (this.retryTimers.has(sourceId)) return // already pending\n\n const delayMs = RETRY_BACKOFF_MS[attempt] ?? RETRY_BACKOFF_MS[RETRY_BACKOFF_MS.length - 1]!\n const timer = setTimeout(() => {\n this.retryTimers.delete(sourceId)\n void this.retrySource(sourceId, attempt)\n }, delayMs)\n this.retryTimers.set(sourceId, timer)\n }\n\n private async retrySource(sourceId: string, attempt: number): Promise<void> {\n const entries = this.capabilities?.getCollectionEntries<IAddonWidgetsSourceProvider>('addon-widgets-source') ?? []\n const found = entries.find(([id]) => id === sourceId)\n if (!found) return // provider went away; nothing to retry\n const [addonId, source] = found\n\n try {\n const widgets = await Promise.resolve(source.listWidgets())\n const enriched: EnrichedWidget[] = widgets.map((w: RawWidget) => ({\n ...w,\n addonId,\n bundleUrl: this.makeBundleUrl(addonId, w.bundle),\n }))\n this.lastGood.set(addonId, enriched)\n this.ctx.logger.info('addon-widgets-source recovered after retry', {\n meta: { sourceId: addonId, attempt: attempt + 1, widgets: enriched.length },\n })\n // Re-emit AddonWidgetReady so admin-ui invalidates and refetches.\n this.ctx.eventBus.emit({\n id: randomUUID(),\n timestamp: new Date(),\n source: { type: 'addon', id: this.id },\n category: EventCategory.AddonWidgetReady,\n data: { addonId, recovered: true },\n })\n } catch (err: unknown) {\n this.ctx.logger.debug('addon-widgets-source retry failed', {\n meta: { sourceId, attempt: attempt + 1, error: errMsg(err) },\n })\n this.scheduleRetry(sourceId, attempt + 1)\n }\n }\n\n // ── Bundle URL stamping ──────────────────────────────────────────\n\n /**\n * Build `/api/addon-widgets/<addonId>/<bundle>?v=<mtime>`. Falls back\n * to `Date.now()` when the bundle path can't be stat'd (remote addon\n * with no local file, addon not yet on disk, etc.) — the browser\n * just gets a fresh URL on each call instead of cache-friendly mtime.\n */\n private makeBundleUrl(addonId: string, bundle: string): string {\n const bundlePath = this.resolveBundlePath(addonId, bundle)\n let mtime = Date.now()\n if (bundlePath !== null) {\n try { mtime = fs.statSync(bundlePath).mtimeMs }\n catch { /* remote addon — no local file */ }\n }\n const v = Math.floor(mtime)\n return `/api/addon-widgets/${addonId}/${bundle}?v=${v}`\n }\n\n private resolveBundlePath(addonId: string, bundle: string): string | null {\n const paths = this.resolvedPaths\n if (!paths) return null\n const addonDistPath = path.join(paths.addonsDir, '@camstack', `addon-${addonId}`, 'dist')\n const resolvedBase = path.resolve(addonDistPath)\n const resolvedFile = path.resolve(addonDistPath, bundle)\n if (!resolvedFile.startsWith(resolvedBase + path.sep) && resolvedFile !== resolvedBase) {\n return null\n }\n return resolvedFile\n }\n\n // ── Path resolution ──────────────────────────────────────────────\n\n private async resolvePaths(): Promise<ResolvedPaths> {\n const fallback: ResolvedPaths = { addonsDir: path.resolve('camstack-data', 'addons') }\n if (!this.ctx.settings) return fallback\n try {\n const server = await this.ctx.settings.getSection('server')\n const dataPath = typeof server['dataPath'] === 'string' && server['dataPath']\n ? server['dataPath']\n : 'camstack-data'\n return { addonsDir: path.resolve(dataPath, 'addons') }\n } catch (err: unknown) {\n this.ctx.logger.debug('Failed to read server.dataPath — falling back', {\n meta: { error: errMsg(err) },\n })\n return fallback\n }\n }\n}\n\nexport default AddonWidgetsAggregatorAddon\n"],"mappings":"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","names":[]}
1
+ {"version":3,"file":"addon-widgets-aggregator.addon.js","names":[],"sources":["../../../src/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.ts"],"sourcesContent":["/**\n * Addon Widgets Aggregator — hub-local builtin that owns the singleton\n * `addon-widgets` cap.\n *\n * Mirrors `addon-pages-aggregator` exactly: walks every registered\n * `addon-widgets-source` (collection) provider and emits an enriched\n * widget metadata list with versioned `bundleUrl`s pointing at\n * `/api/addon-widgets/<addonId>/<bundle>?v=<mtime>`. The filesystem\n * `mtime` cache-buster lets the browser pick up addon rebuilds without\n * manual reload.\n *\n * The static file endpoint (`/api/addon-widgets/:addonId/*`) is served\n * by `AddonWidgetsService.resolveBundle()` on the server side; this\n * addon only owns the listing surface.\n *\n * Why a builtin: same reasoning as `addon-pages-aggregator`. The\n * aggregator is the de-facto \"addon-widgets provider\" — addons own caps,\n * not the server. Living in `@camstack/core/builtins` keeps the surface\n * symmetrical with `system-config`, `local-auth`, etc.\n */\nimport * as path from 'node:path'\nimport * as fs from 'node:fs'\nimport { randomUUID } from 'node:crypto'\nimport {\n BaseAddon,\n EventCategory,\n addonWidgetsCapability,\n errMsg,\n type IAddonWidgetsAggregatorProvider,\n type IAddonWidgetsSourceProvider,\n type ProviderRegistration,\n} from '@camstack/types'\n\ninterface ResolvedPaths {\n readonly addonsDir: string\n}\n\n/**\n * Inferred from the cap definition — equivalent to:\n * `z.infer<typeof EnrichedWidgetMetadataSchema>` but reuses the\n * provider's return type so the aggregator stays in lockstep with the\n * cap if its shape evolves.\n */\ntype EnrichedWidget = Awaited<ReturnType<IAddonWidgetsAggregatorProvider['listWidgets']>>[number]\ntype RawWidget = Awaited<ReturnType<IAddonWidgetsSourceProvider['listWidgets']>>[number]\n\n/**\n * Backoff schedule (ms) used to retry sources that failed during a\n * `listWidgets()` round-trip — typically because the cap was just\n * registered (provider connected via Moleculer) but the worker-side\n * action registration hadn't propagated yet, so `Service '...listWidgets'\n * is not found on '<node>'` raced ahead of the call.\n *\n * On success we re-emit `AddonWidgetReady` so admin-ui invalidates its\n * `addonWidgets.listWidgets` query and the registry populates without a\n * page reload.\n */\nconst RETRY_BACKOFF_MS: readonly number[] = [500, 1500, 4000]\n\nexport class AddonWidgetsAggregatorAddon extends BaseAddon {\n readonly id = 'addon-widgets-aggregator'\n\n private resolvedPaths: ResolvedPaths | null = null\n\n /**\n * Last successful `listWidgets()` snapshot per source. Used as the\n * \"stale-but-valid\" fallback when a source transiently fails — drops\n * happen often enough during boot (Moleculer service-discovery\n * window) that swallowing the error and returning empty would leave\n * the dashboard with nothing for several seconds. Keeping the\n * previous good entry means a flake is invisible to the operator.\n */\n private readonly lastGood = new Map<string, readonly EnrichedWidget[]>()\n\n /** In-flight retry guards keyed by sourceAddonId. Avoids double-scheduling. */\n private readonly retryTimers = new Map<string, NodeJS.Timeout>()\n\n constructor() { super({}) }\n\n protected async onInitialize(): Promise<ProviderRegistration[]> {\n this.resolvedPaths = await this.resolvePaths()\n\n const provider: IAddonWidgetsAggregatorProvider = {\n listWidgets: async (): Promise<readonly EnrichedWidget[]> => this.aggregate(),\n }\n\n this.ctx.logger.info('Initialized — aggregating addon-widgets-source providers')\n return [{ capability: addonWidgetsCapability, provider }]\n }\n\n protected async onShutdown(): Promise<void> {\n for (const t of this.retryTimers.values()) clearTimeout(t)\n this.retryTimers.clear()\n this.lastGood.clear()\n }\n\n // ── Aggregation ───────────────────────────────────────────────────\n\n private async aggregate(): Promise<readonly EnrichedWidget[]> {\n // `getCollectionEntries` returns `[addonId, provider]` tuples — the\n // raw `addon-widgets-source` cap doesn't carry an `id` on the\n // provider (unlike the legacy `IAddonPageProvider`), so we lean on\n // the registry to attribute each contribution back to its addon.\n const entries = this.capabilities?.getCollectionEntries<IAddonWidgetsSourceProvider>('addon-widgets-source') ?? []\n const out: EnrichedWidget[] = []\n const seenIds = new Set<string>()\n\n for (const [addonId, source] of entries) {\n seenIds.add(addonId)\n try {\n const widgets = await Promise.resolve(source.listWidgets())\n const enriched: EnrichedWidget[] = widgets.map((w: RawWidget) => ({\n ...w,\n addonId,\n bundleUrl: this.makeBundleUrl(addonId, w.bundle),\n }))\n for (const item of enriched) out.push(item)\n // Cache successful snapshot — used as fallback on next failure.\n this.lastGood.set(addonId, enriched)\n } catch (err: unknown) {\n const message = errMsg(err)\n this.ctx.logger.warn('addon-widgets-source provider failed', {\n meta: { sourceId: addonId, error: message },\n })\n // Fall back to the last-good snapshot for this source so a\n // transient Moleculer service-discovery race doesn't blank\n // the dashboard.\n const cached = this.lastGood.get(addonId)\n if (cached !== undefined) {\n for (const item of cached) out.push(item)\n this.ctx.logger.info('addon-widgets-source falling back to cached snapshot', {\n meta: { sourceId: addonId, cachedWidgets: cached.length },\n })\n }\n // Schedule a background retry. On success we re-emit\n // `AddonWidgetReady` so admin-ui's queryClient invalidates and\n // any newly-loaded widgets show up without a manual reload.\n this.scheduleRetry(addonId)\n }\n }\n\n // Drop cache entries for sources that have disappeared from the\n // registry — keeps the fallback aligned with the live collection.\n for (const cachedId of this.lastGood.keys()) {\n if (!seenIds.has(cachedId)) this.lastGood.delete(cachedId)\n }\n\n return out\n }\n\n // ── Retry on transient Moleculer race ─────────────────────────────\n\n private scheduleRetry(sourceId: string, attempt = 0): void {\n if (attempt >= RETRY_BACKOFF_MS.length) return\n if (this.retryTimers.has(sourceId)) return // already pending\n\n const delayMs = RETRY_BACKOFF_MS[attempt] ?? RETRY_BACKOFF_MS[RETRY_BACKOFF_MS.length - 1]!\n const timer = setTimeout(() => {\n this.retryTimers.delete(sourceId)\n void this.retrySource(sourceId, attempt)\n }, delayMs)\n this.retryTimers.set(sourceId, timer)\n }\n\n private async retrySource(sourceId: string, attempt: number): Promise<void> {\n const entries = this.capabilities?.getCollectionEntries<IAddonWidgetsSourceProvider>('addon-widgets-source') ?? []\n const found = entries.find(([id]) => id === sourceId)\n if (!found) return // provider went away; nothing to retry\n const [addonId, source] = found\n\n try {\n const widgets = await Promise.resolve(source.listWidgets())\n const enriched: EnrichedWidget[] = widgets.map((w: RawWidget) => ({\n ...w,\n addonId,\n bundleUrl: this.makeBundleUrl(addonId, w.bundle),\n }))\n this.lastGood.set(addonId, enriched)\n this.ctx.logger.info('addon-widgets-source recovered after retry', {\n meta: { sourceId: addonId, attempt: attempt + 1, widgets: enriched.length },\n })\n // Re-emit AddonWidgetReady so admin-ui invalidates and refetches.\n this.ctx.eventBus.emit({\n id: randomUUID(),\n timestamp: new Date(),\n source: { type: 'addon', id: this.id },\n category: EventCategory.AddonWidgetReady,\n data: { addonId, recovered: true },\n })\n } catch (err: unknown) {\n this.ctx.logger.debug('addon-widgets-source retry failed', {\n meta: { sourceId, attempt: attempt + 1, error: errMsg(err) },\n })\n this.scheduleRetry(sourceId, attempt + 1)\n }\n }\n\n // ── Bundle URL stamping ──────────────────────────────────────────\n\n /**\n * Build `/api/addon-widgets/<addonId>/<bundle>?v=<mtime>`. Falls back\n * to `Date.now()` when the bundle path can't be stat'd (remote addon\n * with no local file, addon not yet on disk, etc.) — the browser\n * just gets a fresh URL on each call instead of cache-friendly mtime.\n */\n private makeBundleUrl(addonId: string, bundle: string): string {\n const bundlePath = this.resolveBundlePath(addonId, bundle)\n let mtime = Date.now()\n if (bundlePath !== null) {\n try { mtime = fs.statSync(bundlePath).mtimeMs }\n catch { /* remote addon — no local file */ }\n }\n const v = Math.floor(mtime)\n return `/api/addon-widgets/${addonId}/${bundle}?v=${v}`\n }\n\n private resolveBundlePath(addonId: string, bundle: string): string | null {\n const paths = this.resolvedPaths\n if (!paths) return null\n const addonDistPath = path.join(paths.addonsDir, '@camstack', `addon-${addonId}`, 'dist')\n const resolvedBase = path.resolve(addonDistPath)\n const resolvedFile = path.resolve(addonDistPath, bundle)\n if (!resolvedFile.startsWith(resolvedBase + path.sep) && resolvedFile !== resolvedBase) {\n return null\n }\n return resolvedFile\n }\n\n // ── Path resolution ──────────────────────────────────────────────\n\n private async resolvePaths(): Promise<ResolvedPaths> {\n const fallback: ResolvedPaths = { addonsDir: path.resolve('camstack-data', 'addons') }\n if (!this.ctx.settings) return fallback\n try {\n const server = await this.ctx.settings.getSection('server')\n const dataPath = typeof server['dataPath'] === 'string' && server['dataPath']\n ? server['dataPath']\n : 'camstack-data'\n return { addonsDir: path.resolve(dataPath, 'addons') }\n } catch (err: unknown) {\n this.ctx.logger.debug('Failed to read server.dataPath — falling back', {\n meta: { error: errMsg(err) },\n })\n return fallback\n }\n }\n}\n\nexport default AddonWidgetsAggregatorAddon\n"],"mappings":"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"}