@camstack/core 0.1.14 → 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 (352) 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 +226 -0
  18. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js.map +1 -0
  19. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +218 -0
  20. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs.map +1 -0
  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 +7 -0
  24. package/dist/builtins/addon-pages-aggregator/index.mjs +2 -0
  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 +202 -0
  28. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js.map +1 -0
  29. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +194 -0
  30. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs.map +1 -0
  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 +7 -0
  34. package/dist/builtins/addon-widgets-aggregator/index.mjs +2 -0
  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 +603 -0
  38. package/dist/builtins/alerts/alerts.addon.js.map +1 -0
  39. package/dist/builtins/alerts/alerts.addon.mjs +597 -0
  40. package/dist/builtins/alerts/alerts.addon.mjs.map +1 -0
  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 -0
  44. package/dist/builtins/alerts/index.mjs +2 -0
  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 +106 -0
  80. package/dist/builtins/console-logging/index.js.map +1 -0
  81. package/dist/builtins/console-logging/index.mjs +97 -0
  82. package/dist/builtins/console-logging/index.mjs.map +1 -0
  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 +2153 -0
  88. package/dist/builtins/device-manager/device-manager.addon.js.map +1 -0
  89. package/dist/builtins/device-manager/device-manager.addon.mjs +2147 -0
  90. package/dist/builtins/device-manager/device-manager.addon.mjs.map +1 -0
  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 +7 -0
  94. package/dist/builtins/device-manager/index.mjs +2 -0
  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 +156 -0
  102. package/dist/builtins/hub-forwarder/index.js.map +1 -0
  103. package/dist/builtins/hub-forwarder/index.mjs +147 -0
  104. package/dist/builtins/hub-forwarder/index.mjs.map +1 -0
  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 -0
  110. package/dist/builtins/local-auth/index.mjs +2 -0
  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 +6895 -0
  114. package/dist/builtins/local-auth/local-auth.addon.js.map +1 -0
  115. package/dist/builtins/local-auth/local-auth.addon.mjs +6885 -0
  116. package/dist/builtins/local-auth/local-auth.addon.mjs.map +1 -0
  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 +924 -0
  144. package/dist/builtins/native-metrics/native-metrics.addon.js.map +1 -0
  145. package/dist/builtins/native-metrics/native-metrics.addon.mjs +916 -0
  146. package/dist/builtins/native-metrics/native-metrics.addon.mjs.map +1 -0
  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 +494 -0
  170. package/dist/builtins/snapshot/index.js.map +1 -0
  171. package/dist/builtins/snapshot/index.mjs +488 -0
  172. package/dist/builtins/snapshot/index.mjs.map +1 -0
  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 -2
  182. package/dist/builtins/sqlite-storage/filesystem-storage.addon.d.ts.map +1 -0
  183. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +311 -205
  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 -4
  188. package/dist/builtins/sqlite-storage/index.d.ts.map +1 -0
  189. package/dist/builtins/sqlite-storage/index.js +258 -1097
  190. package/dist/builtins/sqlite-storage/index.js.map +1 -1
  191. package/dist/builtins/sqlite-storage/index.mjs +268 -28
  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 -2
  202. package/dist/builtins/sqlite-storage/sqlite-settings.addon.d.ts.map +1 -0
  203. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +588 -417
  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 +7 -0
  226. package/dist/builtins/system-config/index.mjs +2 -0
  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 +234 -0
  230. package/dist/builtins/system-config/system-config.addon.js.map +1 -0
  231. package/dist/builtins/system-config/system-config.addon.mjs +228 -0
  232. package/dist/builtins/system-config/system-config.addon.mjs.map +1 -0
  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 -30
  244. package/dist/builtins/winston-logging/index.d.ts.map +1 -0
  245. package/dist/builtins/winston-logging/index.js +153 -180
  246. package/dist/builtins/winston-logging/index.js.map +1 -1
  247. package/dist/builtins/winston-logging/index.mjs +144 -8
  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 -1137
  270. package/dist/index.d.ts.map +1 -0
  271. package/dist/index.js +7761 -7017
  272. package/dist/index.js.map +1 -1
  273. package/dist/index.mjs +7699 -3798
  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 +230 -13
  320. package/dist/builtins/local-backup/index.d.mts +0 -42
  321. package/dist/builtins/local-backup/index.d.ts +0 -42
  322. package/dist/builtins/local-backup/index.js +0 -188
  323. package/dist/builtins/local-backup/index.js.map +0 -1
  324. package/dist/builtins/local-backup/index.mjs +0 -10
  325. package/dist/builtins/local-backup/index.mjs.map +0 -1
  326. package/dist/builtins/sqlite-storage/filesystem-storage.addon.d.mts +0 -2
  327. package/dist/builtins/sqlite-storage/index.d.mts +0 -4
  328. package/dist/builtins/sqlite-storage/sqlite-settings.addon.d.mts +0 -2
  329. package/dist/builtins/winston-logging/index.d.mts +0 -30
  330. package/dist/chunk-2F3XZYRW.mjs +0 -89
  331. package/dist/chunk-2F3XZYRW.mjs.map +0 -1
  332. package/dist/chunk-LQFPAEQF.mjs +0 -147
  333. package/dist/chunk-LQFPAEQF.mjs.map +0 -1
  334. package/dist/chunk-R3DIIBBX.mjs +0 -532
  335. package/dist/chunk-R3DIIBBX.mjs.map +0 -1
  336. package/dist/chunk-SMNR44VG.mjs +0 -386
  337. package/dist/chunk-SMNR44VG.mjs.map +0 -1
  338. package/dist/chunk-SO4LROOT.mjs +0 -150
  339. package/dist/chunk-SO4LROOT.mjs.map +0 -1
  340. package/dist/chunk-SPA4JBKN.mjs +0 -175
  341. package/dist/chunk-SPA4JBKN.mjs.map +0 -1
  342. package/dist/dist-3BY63UQ5.mjs +0 -2151
  343. package/dist/dist-3BY63UQ5.mjs.map +0 -1
  344. package/dist/filesystem-storage.addon-C42r589X.d.mts +0 -57
  345. package/dist/filesystem-storage.addon-C42r589X.d.ts +0 -57
  346. package/dist/index.d.mts +0 -1137
  347. package/dist/sql-schema-CKz78rId.d.mts +0 -97
  348. package/dist/sql-schema-CKz78rId.d.ts +0 -97
  349. package/dist/sqlite-settings.addon-KwG-uKMP.d.mts +0 -79
  350. package/dist/sqlite-settings.addon-KwG-uKMP.d.ts +0 -79
  351. package/dist/storage-location-manager-KKDQNAKA.mjs +0 -7
  352. package/dist/storage-location-manager-KKDQNAKA.mjs.map +0 -1
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Factory for creating tRPC clients for addons.
3
+ *
4
+ * In-process only: `createDirectCaller()` uses tRPC's `createCallerFactory`
5
+ * to call procedures directly (zero network overhead) and wraps the raw
6
+ * caller in a proxy so it matches `CreateTRPCClient<AppRouter>` shape —
7
+ * addons use `context.api.namespace.method.query(input)` identically to
8
+ * the cross-process path.
9
+ *
10
+ * Cross-process calls (forked workers, remote agents) ride the Moleculer
11
+ * broker via `brokerTransportLink` in the kernel — not this factory.
12
+ */
13
+ export interface DirectCallerOptions {
14
+ /** The tRPC router instance (from buildAppRouter) */
15
+ readonly router: unknown;
16
+ /** Context for the caller (user identity, etc.) */
17
+ readonly context: {
18
+ readonly user: {
19
+ readonly id: string;
20
+ readonly username: string;
21
+ readonly role: string;
22
+ };
23
+ };
24
+ }
25
+ export declare class AddonApiFactory {
26
+ /**
27
+ * Create a direct caller -- calls tRPC procedures directly in-process.
28
+ * Zero network overhead. Used for in-process addons and dev mode.
29
+ *
30
+ * Returns `AddonApi` — the same tRPC client surface that broker-routed
31
+ * callers get. Callers treat it uniformly as `context.api` regardless
32
+ * of the underlying transport.
33
+ */
34
+ createDirectCaller(options: DirectCallerOptions): Promise<import('@camstack/types').AddonApi>;
35
+ }
36
+ //# sourceMappingURL=addon-api-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addon-api-factory.d.ts","sourceRoot":"","sources":["../../src/addon/addon-api-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE;YAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;CAC/G;AAoDD,qBAAa,eAAe;IAC1B;;;;;;;OAOG;IACG,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,iBAAiB,EAAE,QAAQ,CAAC;CASpG"}
@@ -0,0 +1,38 @@
1
+ import { IAddonHttpRoute, IAddonRouteProvider } from '@camstack/types';
2
+ interface RouteMatch {
3
+ readonly route: IAddonHttpRoute;
4
+ readonly addonId: string;
5
+ readonly params: Record<string, string>;
6
+ }
7
+ /**
8
+ * Registry for dynamic HTTP routes registered by addons.
9
+ * Framework-agnostic — the server HTTP layer queries this registry to dispatch requests.
10
+ */
11
+ export declare class AddonRouteRegistry {
12
+ private readonly routes;
13
+ /**
14
+ * Register all routes from an addon's route provider.
15
+ */
16
+ registerRoutes(addonId: string, provider: IAddonRouteProvider): void;
17
+ /**
18
+ * Unregister all routes for an addon.
19
+ */
20
+ unregisterRoutes(addonId: string): void;
21
+ /**
22
+ * Match an incoming request method + path to a registered route.
23
+ * Supports simple path parameters (e.g., /items/:id).
24
+ */
25
+ matchRoute(method: string, path: string): RouteMatch | null;
26
+ /**
27
+ * List all registered routes across all addons.
28
+ */
29
+ listRoutes(): ReadonlyArray<{
30
+ addonId: string;
31
+ method: string;
32
+ path: string;
33
+ access: string;
34
+ description?: string;
35
+ }>;
36
+ }
37
+ export {};
38
+ //# sourceMappingURL=addon-route-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addon-route-registry.d.ts","sourceRoot":"","sources":["../../src/addon-routes/addon-route-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAE3E,UAAU,UAAU;IAClB,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAA;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACxC;AASD;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAE9D;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,GAAG,IAAI;IAapE;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIvC;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAqB3D;;OAEG;IACH,UAAU,IAAI,aAAa,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAerH"}
@@ -0,0 +1,27 @@
1
+ import { AuthManager } from './auth-manager.js';
2
+ import { ApiKeyRecord, UserRole, SettingsStoreClient } from '@camstack/types';
3
+ export type { ApiKeyRecord };
4
+ interface CreateApiKeyInput {
5
+ label: string;
6
+ role: UserRole;
7
+ allowedProviders?: string[] | '*';
8
+ allowedDevices?: Record<string, string[] | '*'>;
9
+ }
10
+ export interface ApiKeyStorageAccess {
11
+ getStore(): SettingsStoreClient;
12
+ }
13
+ export declare class ApiKeyManager {
14
+ private readonly storageAccess;
15
+ private readonly auth;
16
+ constructor(storageAccess: ApiKeyStorageAccess, auth: AuthManager);
17
+ private get store();
18
+ create(input: CreateApiKeyInput): Promise<{
19
+ record: ApiKeyRecord;
20
+ token: string;
21
+ }>;
22
+ validateToken(token: string): Promise<ApiKeyRecord | null>;
23
+ listAll(): Promise<Omit<ApiKeyRecord, 'tokenHash'>[]>;
24
+ revoke(id: string): Promise<void>;
25
+ findById(id: string): Promise<ApiKeyRecord | null>;
26
+ }
27
+ //# sourceMappingURL=api-key-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key-manager.d.ts","sourceRoot":"","sources":["../../src/auth/api-key-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAGlF,YAAY,EAAE,YAAY,EAAE,CAAA;AAE5B,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,QAAQ,CAAA;IACd,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,CAAA;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,CAAA;CAChD;AAID,MAAM,WAAW,mBAAmB;IAClC,QAAQ,IAAI,mBAAmB,CAAA;CAChC;AAMD,qBAAa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI;gBADJ,aAAa,EAAE,mBAAmB,EAClC,IAAI,EAAE,WAAW;IAGpC,OAAO,KAAK,KAAK,GAEhB;IAEK,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,YAAY,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAkBlF,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAa1D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC;IASrD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;CAKzD"}
@@ -0,0 +1,47 @@
1
+ import { ScopedToken, UserRole, TokenPayload, IScopedLogger } from '@camstack/types';
2
+ import { ScopedTokenManager } from './scoped-token-manager.js';
3
+ export type { UserRole, TokenPayload };
4
+ export type AuthConfigReader = {
5
+ get<T>(path: string): T;
6
+ update(section: string, data: Record<string, unknown>): void;
7
+ };
8
+ export declare class AuthManager {
9
+ private readonly config;
10
+ private readonly jwtSecret;
11
+ private scopedTokenManager;
12
+ private readonly logger;
13
+ constructor(config: AuthConfigReader, logger?: IScopedLogger);
14
+ signToken(payload: Omit<TokenPayload, 'iat' | 'exp'>): string;
15
+ verifyToken(token: string): TokenPayload;
16
+ hashPassword(password: string): Promise<string>;
17
+ comparePassword(password: string, hash: string): Promise<boolean>;
18
+ generateApiKey(): {
19
+ token: string;
20
+ hash: string;
21
+ prefix: string;
22
+ };
23
+ validateApiKey(token: string, storedHash: string): boolean;
24
+ /**
25
+ * Create a service token for agent/worker authentication.
26
+ * Used when forking workers or when agents register.
27
+ */
28
+ createServiceToken(opts: {
29
+ readonly agentId: string;
30
+ readonly role?: string;
31
+ readonly expiresIn?: string;
32
+ }): string;
33
+ /**
34
+ * Set the scoped token manager for the auth chain.
35
+ */
36
+ setScopedTokenManager(manager: ScopedTokenManager): void;
37
+ /**
38
+ * Validate a scoped token string.
39
+ * Returns the token record if valid, null otherwise.
40
+ */
41
+ validateScopedToken(rawToken: string): Promise<ScopedToken | null>;
42
+ /**
43
+ * Check whether a scoped token grants access to a given addon/route/capability.
44
+ */
45
+ matchesScopedTokenScope(token: ScopedToken, addonId?: string, routePath?: string, capability?: string): boolean;
46
+ }
47
+ //# sourceMappingURL=auth-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-manager.d.ts","sourceRoot":"","sources":["../../src/auth/auth-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACzF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAYnE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAA;AAEtC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAAA;IACvB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAC7D,CAAA;AAED,qBAAa,WAAW;IAKV,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,kBAAkB,CAAkC;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAET,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAE,aAA0B;IAczF,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,KAAK,CAAC,GAAG,MAAM;IAI7D,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAIlC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI/C,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvE,cAAc,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAOjE,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAK1D;;;OAGG;IACH,kBAAkB,CAAC,IAAI,EAAE;QACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAC5B,GAAG,MAAM;IAcV;;OAEG;IACH,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAIxD;;;OAGG;IACG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAOxE;;OAEG;IACH,uBAAuB,CACrB,KAAK,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO;CAMX"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Wrap a Zod schema parse with an actionable error message. The
3
+ * settings-store regression that broke local-auth in May 2026 surfaced
4
+ * as an opaque Zod error listing every required field as `undefined`
5
+ * — confusing because the data IS in the DB, just exposed through the
6
+ * wrong shape by `queryDeclared`. This helper makes the failure mode
7
+ * obvious: it explicitly mentions the kind, the offending value's top-
8
+ * level keys, and a hint about the most common cause.
9
+ *
10
+ * `schema` is typed loosely (any with a `parse` method) to avoid the
11
+ * generic ZodTypeAny variance error across Zod major versions when this
12
+ * helper is reused by callers that import schemas from `@camstack/types`.
13
+ */
14
+ interface ZodLikeSchema<T> {
15
+ parse(data: unknown): T;
16
+ }
17
+ export declare function parseRecord<T>(kind: string, schema: ZodLikeSchema<T>, data: unknown): T;
18
+ export {};
19
+ //# sourceMappingURL=parse-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-record.d.ts","sourceRoot":"","sources":["../../src/auth/parse-record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,UAAU,aAAa,CAAC,CAAC;IACvB,KAAK,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC,CAAA;CACxB;AAED,wBAAgB,WAAW,CAAC,CAAC,EAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EACxB,IAAI,EAAE,OAAO,GACZ,CAAC,CAsBH"}
@@ -0,0 +1,18 @@
1
+ import { ScopedToken, TokenScope, SettingsStoreClient } from '@camstack/types';
2
+ /**
3
+ * Manages scoped API tokens with restricted addon/route/capability access.
4
+ */
5
+ export declare class ScopedTokenManager {
6
+ private readonly store;
7
+ constructor(store: SettingsStoreClient);
8
+ create(userId: string, name: string, scopes: TokenScope[], expiresAt?: number): Promise<{
9
+ token: string;
10
+ record: ScopedToken;
11
+ }>;
12
+ validate(rawToken: string): Promise<ScopedToken | null>;
13
+ matchesScope(token: ScopedToken, addonId?: string, routePath?: string, capability?: string): boolean;
14
+ revoke(tokenId: string): Promise<void>;
15
+ listForUser(userId: string): Promise<ScopedToken[]>;
16
+ updateLastUsed(tokenId: string): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=scoped-token-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoped-token-manager.d.ts","sourceRoot":"","sources":["../../src/auth/scoped-token-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAUnF;;GAEG;AACH,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,mBAAmB;IAEjD,MAAM,CACV,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,EAAE,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,CAAC;IAsB5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAY7D,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO;IAW9F,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAKnD,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMrD"}
@@ -0,0 +1,34 @@
1
+ import { AuthManager } from './auth-manager.js';
2
+ import { UserRecord, UserRole, SettingsStoreClient } from '@camstack/types';
3
+ export type { UserRecord };
4
+ interface CreateUserInput {
5
+ username: string;
6
+ password: string;
7
+ role: UserRole;
8
+ allowedProviders?: string[] | '*';
9
+ allowedDevices?: Record<string, string[] | '*'>;
10
+ }
11
+ type UpdatableUserFields = Partial<Pick<UserRecord, 'role' | 'allowedProviders' | 'allowedDevices'>>;
12
+ export interface UserStorageAccess {
13
+ getStore(): SettingsStoreClient;
14
+ }
15
+ export interface UserConfigReader {
16
+ get<T>(path: string): T;
17
+ }
18
+ export declare class UserManager {
19
+ private readonly storageAccess;
20
+ private readonly auth;
21
+ private readonly config;
22
+ constructor(storageAccess: UserStorageAccess, auth: AuthManager, config: UserConfigReader);
23
+ private get store();
24
+ create(input: CreateUserInput): Promise<UserRecord>;
25
+ findByUsername(username: string): Promise<UserRecord | null>;
26
+ findById(id: string): Promise<UserRecord | null>;
27
+ validateCredentials(username: string, password: string): Promise<UserRecord | null>;
28
+ listAll(): Promise<Omit<UserRecord, 'passwordHash'>[]>;
29
+ update(id: string, data: UpdatableUserFields): Promise<void>;
30
+ delete(id: string): Promise<void>;
31
+ resetPassword(id: string, newPassword: string): Promise<void>;
32
+ ensureAdminExists(): Promise<void>;
33
+ }
34
+ //# sourceMappingURL=user-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-manager.d.ts","sourceRoot":"","sources":["../../src/auth/user-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAGhF,YAAY,EAAE,UAAU,EAAE,CAAA;AAE1B,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,QAAQ,CAAA;IACd,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,CAAA;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,CAAA;CAChD;AAED,KAAK,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,gBAAgB,CAAC,CAAC,CAAA;AAIpG,MAAM,WAAW,iBAAiB;IAChC,QAAQ,IAAI,mBAAmB,CAAA;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAAA;CACxB;AAMD,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,aAAa,EAAE,iBAAiB,EAChC,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,gBAAgB;IAG3C,OAAO,KAAK,KAAK,GAEhB;IAEK,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;IAqBnD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAM5D,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAMhD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAOnF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,CAAC;IAStD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7D,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;CAkBzC"}
@@ -0,0 +1,54 @@
1
+ import { BaseAddon, ProviderRegistration } from '@camstack/types';
2
+ export declare class AddonPagesAggregatorAddon extends BaseAddon {
3
+ readonly id = "addon-pages-aggregator";
4
+ private resolvedPaths;
5
+ /**
6
+ * Last successful `listPages()` snapshot per source. Used as the
7
+ * "stale-but-valid" fallback when a source transiently fails — drops
8
+ * happen often enough during boot (Moleculer service-discovery
9
+ * window) that swallowing the error and returning empty leaves the
10
+ * sidebar with nothing for several seconds. Keeping the previous
11
+ * good entry means a flake is invisible to the operator.
12
+ */
13
+ private readonly lastGood;
14
+ /** In-flight retry guards keyed by sourceId. Avoids double-scheduling. */
15
+ private readonly retryTimers;
16
+ constructor();
17
+ protected onInitialize(): Promise<ProviderRegistration[]>;
18
+ protected onShutdown(): Promise<void>;
19
+ private aggregate;
20
+ /**
21
+ * Schedule background re-call of `listPages()` on a source that just
22
+ * failed. Walks `RETRY_BACKOFF_MS` from index 0 — each successful
23
+ * call updates the cache and emits `AddonPageReady` so the admin UI
24
+ * invalidates its query. Stops on first success or after the schedule
25
+ * is exhausted.
26
+ */
27
+ private scheduleRetry;
28
+ private retrySource;
29
+ /**
30
+ * Build `/api/addon-pages/<addonId>/<bundle>?v=<mtime>`. Falls back
31
+ * to `Date.now()` when the bundle path can't be stat'd (remote addon
32
+ * with no local file, addon not yet on disk, etc.) — the browser
33
+ * just gets a fresh URL on each call instead of cache-friendly mtime.
34
+ */
35
+ private makeBundleUrl;
36
+ /**
37
+ * Resolve the local filesystem path for an addon's bundle. Mirrors
38
+ * `AddonPagesService.resolveBundle` (server-side), but without the
39
+ * existence / traversal checks — those still live on the server's
40
+ * static file route. We only need a stat-able path here for the
41
+ * `mtime` cache-buster.
42
+ */
43
+ private resolveBundlePath;
44
+ /**
45
+ * Read `server.dataPath` from the cluster yml-backed sections (same
46
+ * source the server uses at boot), then derive the addons directory
47
+ * from it. Falls back to `camstack-data/addons` when no settings API
48
+ * is available — agents and isolated tests don't see this addon, so
49
+ * the fallback is purely defensive.
50
+ */
51
+ private resolvePaths;
52
+ }
53
+ export default AddonPagesAggregatorAddon;
54
+ //# sourceMappingURL=addon-pages-aggregator.addon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addon-pages-aggregator.addon.d.ts","sourceRoot":"","sources":["../../../src/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.ts"],"names":[],"mappings":"AAyBA,OAAO,EACL,SAAS,EAOT,KAAK,oBAAoB,EAC1B,MAAM,iBAAiB,CAAA;AAqBxB,qBAAa,yBAA0B,SAAQ,SAAS;IACtD,QAAQ,CAAC,EAAE,4BAA2B;IAEtC,OAAO,CAAC,aAAa,CAA6B;IAElD;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8C;IAEvE,0EAA0E;IAC1E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoC;;cAIhD,YAAY,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;cAW/C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAQ7B,SAAS;IAmDvB;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;YAYP,WAAW;IAkCzB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAWrB;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAczB;;;;;;OAMG;YACW,YAAY;CAgB3B;AAED,eAAe,yBAAyB,CAAA"}
@@ -0,0 +1,226 @@
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
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-pages-aggregator/addon-pages-aggregator.addon.ts
13
+ /**
14
+ * Addon Pages Aggregator — hub-local builtin that owns the singleton
15
+ * `addon-pages` cap.
16
+ *
17
+ * Walks every registered `addon-pages-source` (collection) provider and
18
+ * emits an enriched `AddonPageInfo[]` list with versioned `bundleUrl`s
19
+ * pointing at `/api/addon-pages/<addonId>/<bundle>?v=<mtime>`. The
20
+ * filesystem `mtime` cache-buster lets the browser pick up addon
21
+ * rebuilds without manual reload — same scheme the original
22
+ * hand-written `AddonPagesService.listPages` used before this split.
23
+ *
24
+ * The static file endpoint (`/api/addon-pages/:addonId/*`) is still
25
+ * served by `AddonPagesService.resolveBundle()` on the server side; this
26
+ * addon only owns the listing surface.
27
+ *
28
+ * Why a builtin rather than a cap-providers helper:
29
+ * - The aggregator is conceptually the "addon-pages provider" — addons
30
+ * own caps, not the server. Living in `@camstack/core/builtins` keeps
31
+ * the surface symmetrical with `system-config`, `local-auth`, etc.
32
+ * - Lets the aggregator subscribe to source readiness without piping a
33
+ * CapabilityRegistry handle through `RouterServices`.
34
+ */
35
+ /**
36
+ * Backoff schedule (ms) used to retry sources that failed during a
37
+ * `listPages()` round-trip — typically because the cap was just
38
+ * registered (provider connected via Moleculer) but the worker-side
39
+ * action registration hadn't propagated yet, so `Service '...listPages'
40
+ * is not found on '<node>'` raced ahead of the call.
41
+ *
42
+ * We schedule one retry per entry; if every retry fails we stop
43
+ * (the next aggregate() run will pick the source up again). On
44
+ * success we re-emit `AddonPageReady` so admin-ui invalidates its
45
+ * `addonPages.listPages` query and the sidebar populates without a
46
+ * page reload.
47
+ */
48
+ var RETRY_BACKOFF_MS = [
49
+ 500,
50
+ 1500,
51
+ 4e3
52
+ ];
53
+ var AddonPagesAggregatorAddon = class extends _camstack_types.BaseAddon {
54
+ id = "addon-pages-aggregator";
55
+ resolvedPaths = null;
56
+ /**
57
+ * Last successful `listPages()` snapshot per source. Used as the
58
+ * "stale-but-valid" fallback when a source transiently fails — drops
59
+ * happen often enough during boot (Moleculer service-discovery
60
+ * window) that swallowing the error and returning empty leaves the
61
+ * sidebar with nothing for several seconds. Keeping the previous
62
+ * good entry means a flake is invisible to the operator.
63
+ */
64
+ lastGood = /* @__PURE__ */ new Map();
65
+ /** In-flight retry guards keyed by sourceId. Avoids double-scheduling. */
66
+ retryTimers = /* @__PURE__ */ new Map();
67
+ constructor() {
68
+ super({});
69
+ }
70
+ async onInitialize() {
71
+ this.resolvedPaths = await this.resolvePaths();
72
+ const provider = { listPages: async () => this.aggregate() };
73
+ this.ctx.logger.info("Initialized — aggregating addon-pages-source providers");
74
+ return [{
75
+ capability: _camstack_types.addonPagesCapability,
76
+ provider
77
+ }];
78
+ }
79
+ async onShutdown() {
80
+ for (const t of this.retryTimers.values()) clearTimeout(t);
81
+ this.retryTimers.clear();
82
+ this.lastGood.clear();
83
+ }
84
+ async aggregate() {
85
+ const sources = this.capabilities?.getCollection("addon-pages-source") ?? [];
86
+ const out = [];
87
+ const seenIds = /* @__PURE__ */ new Set();
88
+ for (const source of sources) {
89
+ seenIds.add(source.id);
90
+ try {
91
+ const enriched = (await Promise.resolve(source.listPages())).map((page) => ({
92
+ addonId: source.id,
93
+ page,
94
+ bundleUrl: this.makeBundleUrl(source.id, page.bundle)
95
+ }));
96
+ for (const item of enriched) out.push(item);
97
+ this.lastGood.set(source.id, enriched);
98
+ } catch (err) {
99
+ const message = (0, _camstack_types.errMsg)(err);
100
+ this.ctx.logger.warn("addon-pages-source provider failed", { meta: {
101
+ sourceId: source.id,
102
+ error: message
103
+ } });
104
+ const cached = this.lastGood.get(source.id);
105
+ if (cached !== void 0) {
106
+ for (const item of cached) out.push(item);
107
+ this.ctx.logger.info("addon-pages-source falling back to cached snapshot", { meta: {
108
+ sourceId: source.id,
109
+ cachedPages: cached.length
110
+ } });
111
+ }
112
+ this.scheduleRetry(source.id);
113
+ }
114
+ }
115
+ for (const cachedId of this.lastGood.keys()) if (!seenIds.has(cachedId)) this.lastGood.delete(cachedId);
116
+ return out;
117
+ }
118
+ /**
119
+ * Schedule background re-call of `listPages()` on a source that just
120
+ * failed. Walks `RETRY_BACKOFF_MS` from index 0 — each successful
121
+ * call updates the cache and emits `AddonPageReady` so the admin UI
122
+ * invalidates its query. Stops on first success or after the schedule
123
+ * is exhausted.
124
+ */
125
+ scheduleRetry(sourceId, attempt = 0) {
126
+ if (attempt >= RETRY_BACKOFF_MS.length) return;
127
+ if (this.retryTimers.has(sourceId)) return;
128
+ const delayMs = RETRY_BACKOFF_MS[attempt] ?? RETRY_BACKOFF_MS[RETRY_BACKOFF_MS.length - 1];
129
+ const timer = setTimeout(() => {
130
+ this.retryTimers.delete(sourceId);
131
+ this.retrySource(sourceId, attempt);
132
+ }, delayMs);
133
+ this.retryTimers.set(sourceId, timer);
134
+ }
135
+ async retrySource(sourceId, attempt) {
136
+ const source = (this.capabilities?.getCollection("addon-pages-source") ?? []).find((s) => s.id === sourceId);
137
+ if (!source) return;
138
+ try {
139
+ const enriched = (await Promise.resolve(source.listPages())).map((page) => ({
140
+ addonId: source.id,
141
+ page,
142
+ bundleUrl: this.makeBundleUrl(source.id, page.bundle)
143
+ }));
144
+ this.lastGood.set(source.id, enriched);
145
+ this.ctx.logger.info("addon-pages-source recovered after retry", { meta: {
146
+ sourceId,
147
+ attempt: attempt + 1,
148
+ pages: enriched.length
149
+ } });
150
+ this.ctx.eventBus.emit({
151
+ id: (0, node_crypto.randomUUID)(),
152
+ timestamp: /* @__PURE__ */ new Date(),
153
+ source: {
154
+ type: "addon",
155
+ id: this.id
156
+ },
157
+ category: _camstack_types.EventCategory.AddonPageReady,
158
+ data: {
159
+ addonId: sourceId,
160
+ recovered: true
161
+ }
162
+ });
163
+ } catch (err) {
164
+ this.ctx.logger.debug("addon-pages-source retry failed", { meta: {
165
+ sourceId,
166
+ attempt: attempt + 1,
167
+ error: (0, _camstack_types.errMsg)(err)
168
+ } });
169
+ this.scheduleRetry(sourceId, attempt + 1);
170
+ }
171
+ }
172
+ /**
173
+ * Build `/api/addon-pages/<addonId>/<bundle>?v=<mtime>`. Falls back
174
+ * to `Date.now()` when the bundle path can't be stat'd (remote addon
175
+ * with no local file, addon not yet on disk, etc.) — the browser
176
+ * just gets a fresh URL on each call instead of cache-friendly mtime.
177
+ */
178
+ makeBundleUrl(addonId, bundle) {
179
+ const bundlePath = this.resolveBundlePath(addonId, bundle);
180
+ let mtime = Date.now();
181
+ if (bundlePath !== null) try {
182
+ mtime = node_fs.statSync(bundlePath).mtimeMs;
183
+ } catch {}
184
+ return `/api/addon-pages/${addonId}/${bundle}?v=${Math.floor(mtime)}`;
185
+ }
186
+ /**
187
+ * Resolve the local filesystem path for an addon's bundle. Mirrors
188
+ * `AddonPagesService.resolveBundle` (server-side), but without the
189
+ * existence / traversal checks — those still live on the server's
190
+ * static file route. We only need a stat-able path here for the
191
+ * `mtime` cache-buster.
192
+ */
193
+ resolveBundlePath(addonId, bundle) {
194
+ const paths = this.resolvedPaths;
195
+ if (!paths) return null;
196
+ const addonDistPath = node_path.join(paths.addonsDir, "@camstack", `addon-${addonId}`, "dist");
197
+ const resolvedBase = node_path.resolve(addonDistPath);
198
+ const resolvedFile = node_path.resolve(addonDistPath, bundle);
199
+ if (!resolvedFile.startsWith(resolvedBase + node_path.sep) && resolvedFile !== resolvedBase) return null;
200
+ return resolvedFile;
201
+ }
202
+ /**
203
+ * Read `server.dataPath` from the cluster yml-backed sections (same
204
+ * source the server uses at boot), then derive the addons directory
205
+ * from it. Falls back to `camstack-data/addons` when no settings API
206
+ * is available — agents and isolated tests don't see this addon, so
207
+ * the fallback is purely defensive.
208
+ */
209
+ async resolvePaths() {
210
+ const fallback = { addonsDir: node_path.resolve("camstack-data", "addons") };
211
+ if (!this.ctx.settings) return fallback;
212
+ try {
213
+ const server = await this.ctx.settings.getSection("server");
214
+ const dataPath = typeof server["dataPath"] === "string" && server["dataPath"] ? server["dataPath"] : "camstack-data";
215
+ return { addonsDir: node_path.resolve(dataPath, "addons") };
216
+ } catch (err) {
217
+ this.ctx.logger.debug("Failed to read server.dataPath — falling back", { meta: { error: (0, _camstack_types.errMsg)(err) } });
218
+ return fallback;
219
+ }
220
+ }
221
+ };
222
+ //#endregion
223
+ exports.AddonPagesAggregatorAddon = AddonPagesAggregatorAddon;
224
+ exports.default = AddonPagesAggregatorAddon;
225
+
226
+ //# sourceMappingURL=addon-pages-aggregator.addon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addon-pages-aggregator.addon.js","names":[],"sources":["../../../src/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.ts"],"sourcesContent":["/**\n * Addon Pages Aggregator — hub-local builtin that owns the singleton\n * `addon-pages` cap.\n *\n * Walks every registered `addon-pages-source` (collection) provider and\n * emits an enriched `AddonPageInfo[]` list with versioned `bundleUrl`s\n * pointing at `/api/addon-pages/<addonId>/<bundle>?v=<mtime>`. The\n * filesystem `mtime` cache-buster lets the browser pick up addon\n * rebuilds without manual reload — same scheme the original\n * hand-written `AddonPagesService.listPages` used before this split.\n *\n * The static file endpoint (`/api/addon-pages/:addonId/*`) is still\n * served by `AddonPagesService.resolveBundle()` on the server side; this\n * addon only owns the listing surface.\n *\n * Why a builtin rather than a cap-providers helper:\n * - The aggregator is conceptually the \"addon-pages provider\" — addons\n * own caps, not the server. Living in `@camstack/core/builtins` keeps\n * the surface symmetrical with `system-config`, `local-auth`, etc.\n * - Lets the aggregator subscribe to source readiness without piping a\n * CapabilityRegistry handle through `RouterServices`.\n */\nimport * as path from 'node:path'\nimport * as fs from 'node:fs'\nimport { randomUUID } from 'node:crypto'\nimport {\n BaseAddon,\n EventCategory,\n addonPagesCapability,\n errMsg,\n type AddonPageInfo,\n type IAddonPageProvider,\n type IAddonPagesAggregatorProvider,\n type ProviderRegistration,\n} from '@camstack/types'\n\ninterface ResolvedPaths {\n readonly addonsDir: string\n}\n\n/**\n * Backoff schedule (ms) used to retry sources that failed during a\n * `listPages()` 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 '...listPages'\n * is not found on '<node>'` raced ahead of the call.\n *\n * We schedule one retry per entry; if every retry fails we stop\n * (the next aggregate() run will pick the source up again). On\n * success we re-emit `AddonPageReady` so admin-ui invalidates its\n * `addonPages.listPages` query and the sidebar populates without a\n * page reload.\n */\nconst RETRY_BACKOFF_MS: readonly number[] = [500, 1500, 4000]\n\nexport class AddonPagesAggregatorAddon extends BaseAddon {\n readonly id = 'addon-pages-aggregator'\n\n private resolvedPaths: ResolvedPaths | null = null\n\n /**\n * Last successful `listPages()` 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 leaves the\n * sidebar with nothing for several seconds. Keeping the previous\n * good entry means a flake is invisible to the operator.\n */\n private readonly lastGood = new Map<string, readonly AddonPageInfo[]>()\n\n /** In-flight retry guards keyed by sourceId. 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: IAddonPagesAggregatorProvider = {\n listPages: async (): Promise<readonly AddonPageInfo[]> => this.aggregate(),\n }\n\n this.ctx.logger.info('Initialized — aggregating addon-pages-source providers')\n return [{ capability: addonPagesCapability, 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 AddonPageInfo[]> {\n const sources = this.capabilities?.getCollection<IAddonPageProvider>('addon-pages-source') ?? []\n const out: AddonPageInfo[] = []\n const seenIds = new Set<string>()\n\n for (const source of sources) {\n seenIds.add(source.id)\n try {\n // listPages() may be async for remote Moleculer providers.\n const pages = await Promise.resolve(source.listPages())\n const enriched: AddonPageInfo[] = pages.map((page) => ({\n addonId: source.id,\n page,\n bundleUrl: this.makeBundleUrl(source.id, page.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(source.id, enriched)\n } catch (err: unknown) {\n const message = errMsg(err)\n this.ctx.logger.warn('addon-pages-source provider failed', {\n meta: { sourceId: source.id, error: message },\n })\n // Fall back to the last-good snapshot for this source so a\n // transient Moleculer service-discovery race (cap registered\n // but action not yet callable) doesn't blank the sidebar.\n const cached = this.lastGood.get(source.id)\n if (cached !== undefined) {\n for (const item of cached) out.push(item)\n this.ctx.logger.info('addon-pages-source falling back to cached snapshot', {\n meta: { sourceId: source.id, cachedPages: cached.length },\n })\n }\n // Schedule a background retry. On success we re-emit\n // `AddonPageReady` so admin-ui's queryClient invalidates and\n // any newly-loaded pages show up without a manual reload.\n this.scheduleRetry(source.id)\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 /**\n * Schedule background re-call of `listPages()` on a source that just\n * failed. Walks `RETRY_BACKOFF_MS` from index 0 — each successful\n * call updates the cache and emits `AddonPageReady` so the admin UI\n * invalidates its query. Stops on first success or after the schedule\n * is exhausted.\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 sources = this.capabilities?.getCollection<IAddonPageProvider>('addon-pages-source') ?? []\n const source = sources.find((s) => s.id === sourceId)\n if (!source) return // provider went away; nothing to retry\n\n try {\n const pages = await Promise.resolve(source.listPages())\n const enriched: AddonPageInfo[] = pages.map((page) => ({\n addonId: source.id,\n page,\n bundleUrl: this.makeBundleUrl(source.id, page.bundle),\n }))\n this.lastGood.set(source.id, enriched)\n this.ctx.logger.info('addon-pages-source recovered after retry', {\n meta: { sourceId, attempt: attempt + 1, pages: enriched.length },\n })\n // Re-emit AddonPageReady 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.AddonPageReady,\n data: { addonId: sourceId, recovered: true },\n })\n } catch (err: unknown) {\n this.ctx.logger.debug('addon-pages-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-pages/<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-pages/${addonId}/${bundle}?v=${v}`\n }\n\n /**\n * Resolve the local filesystem path for an addon's bundle. Mirrors\n * `AddonPagesService.resolveBundle` (server-side), but without the\n * existence / traversal checks — those still live on the server's\n * static file route. We only need a stat-able path here for the\n * `mtime` cache-buster.\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 /**\n * Read `server.dataPath` from the cluster yml-backed sections (same\n * source the server uses at boot), then derive the addons directory\n * from it. Falls back to `camstack-data/addons` when no settings API\n * is available — agents and isolated tests don't see this addon, so\n * the fallback is purely defensive.\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 AddonPagesAggregatorAddon\n"],"mappings":"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"}