@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,2 @@
1
+ import { RemoteAccessOrchestratorAddon } from "./remote-access-orchestrator.addon.mjs";
2
+ export { RemoteAccessOrchestratorAddon, RemoteAccessOrchestratorAddon as default };
@@ -0,0 +1,9 @@
1
+ import { BaseAddon, ProviderRegistration } from '@camstack/types';
2
+ export declare class RemoteAccessOrchestratorAddon extends BaseAddon<Record<string, never>> {
3
+ constructor();
4
+ protected onInitialize(): Promise<ProviderRegistration[]>;
5
+ private resolveImpl;
6
+ private listProviders;
7
+ }
8
+ export default RemoteAccessOrchestratorAddon;
9
+ //# sourceMappingURL=remote-access-orchestrator.addon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-access-orchestrator.addon.d.ts","sourceRoot":"","sources":["../../../src/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,SAAS,EAIT,KAAK,oBAAoB,EAC1B,MAAM,iBAAiB,CAAA;AAiBxB,qBAAa,6BAA8B,SAAQ,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;;cAKjE,YAAY,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAkB/D,OAAO,CAAC,WAAW;YAML,aAAa;CA+B5B;AAED,eAAe,6BAA6B,CAAA"}
@@ -0,0 +1,72 @@
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
5
+ require("../../chunk-C13QxCFV.js");
6
+ let _camstack_types = require("@camstack/types");
7
+ //#region src/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.ts
8
+ /**
9
+ * Remote-access orchestrator — singleton facade over the
10
+ * `network-access` collection (Cloudflare Tunnel, ngrok, Tailscale, …).
11
+ * Mirrors the auth-orchestrator and backup-orchestrator patterns.
12
+ */
13
+ var RemoteAccessOrchestratorAddon = class extends _camstack_types.BaseAddon {
14
+ constructor() {
15
+ super({});
16
+ }
17
+ async onInitialize() {
18
+ const provider = {
19
+ listProviders: async () => this.listProviders(),
20
+ startProvider: async ({ addonId }) => {
21
+ const impl = this.resolveImpl(addonId);
22
+ if (!impl?.start) throw new Error(`Remote-access provider "${addonId}" does not support start`);
23
+ return await impl.start();
24
+ },
25
+ stopProvider: async ({ addonId }) => {
26
+ const impl = this.resolveImpl(addonId);
27
+ if (impl?.stop) await impl.stop();
28
+ return { success: true };
29
+ }
30
+ };
31
+ this.ctx.logger.info("Remote-access orchestrator initialized");
32
+ return [{
33
+ capability: _camstack_types.remoteAccessCapability,
34
+ provider
35
+ }];
36
+ }
37
+ resolveImpl(addonId) {
38
+ return (this.capabilities?.getCollectionEntries("network-access") ?? []).find(([id]) => id === addonId)?.[1] ?? null;
39
+ }
40
+ async listProviders() {
41
+ const entries = this.capabilities?.getCollectionEntries("network-access") ?? [];
42
+ const out = [];
43
+ for (const [addonId, impl] of entries) {
44
+ let connected = false;
45
+ let endpoint = null;
46
+ let error;
47
+ if (impl.getStatus) try {
48
+ const s = await impl.getStatus();
49
+ connected = s.connected;
50
+ endpoint = s.endpoint;
51
+ error = s.error;
52
+ } catch (err) {
53
+ error = err instanceof Error ? err.message : String(err);
54
+ }
55
+ out.push({
56
+ addonId,
57
+ displayName: impl.displayName ?? addonId,
58
+ kind: impl.kind ?? (addonId.includes("cloudflare") ? "cloudflare-tunnel" : "other"),
59
+ enabled: true,
60
+ connected,
61
+ endpoint,
62
+ ...error !== void 0 ? { error } : {}
63
+ });
64
+ }
65
+ return out;
66
+ }
67
+ };
68
+ //#endregion
69
+ exports.RemoteAccessOrchestratorAddon = RemoteAccessOrchestratorAddon;
70
+ exports.default = RemoteAccessOrchestratorAddon;
71
+
72
+ //# sourceMappingURL=remote-access-orchestrator.addon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-access-orchestrator.addon.js","names":[],"sources":["../../../src/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.ts"],"sourcesContent":["/**\n * Remote-access orchestrator — singleton facade over the\n * `network-access` collection (Cloudflare Tunnel, ngrok, Tailscale, …).\n * Mirrors the auth-orchestrator and backup-orchestrator patterns.\n */\nimport {\n BaseAddon,\n remoteAccessCapability,\n type IRemoteAccessOrchestrator,\n type RemoteAccessProviderInfo,\n type ProviderRegistration,\n} from '@camstack/types'\n\ninterface NetworkAccessLike {\n start?: () => Promise<{ url: string; hostname: string; port: number; protocol: 'http' | 'https' }>\n stop?: () => Promise<void>\n getStatus?: () => Promise<{\n connected: boolean\n endpoint: { url: string; hostname: string; port: number; protocol: 'http' | 'https' } | null\n error?: string\n }>\n}\n\ninterface NetworkAccessRegistrationMeta {\n readonly displayName?: string\n readonly kind?: RemoteAccessProviderInfo['kind']\n}\n\nexport class RemoteAccessOrchestratorAddon extends BaseAddon<Record<string, never>> {\n constructor() {\n super({})\n }\n\n protected async onInitialize(): Promise<ProviderRegistration[]> {\n const provider: IRemoteAccessOrchestrator = {\n listProviders: async () => this.listProviders(),\n startProvider: async ({ addonId }) => {\n const impl = this.resolveImpl(addonId)\n if (!impl?.start) throw new Error(`Remote-access provider \"${addonId}\" does not support start`)\n return await impl.start()\n },\n stopProvider: async ({ addonId }) => {\n const impl = this.resolveImpl(addonId)\n if (impl?.stop) await impl.stop()\n return { success: true as const }\n },\n } satisfies IRemoteAccessOrchestrator\n this.ctx.logger.info('Remote-access orchestrator initialized')\n return [{ capability: remoteAccessCapability, provider }]\n }\n\n private resolveImpl(addonId: string): NetworkAccessLike | null {\n const entries = this.capabilities?.getCollectionEntries<NetworkAccessLike>('network-access') ?? []\n const found = entries.find(([id]) => id === addonId)\n return found?.[1] ?? null\n }\n\n private async listProviders(): Promise<readonly RemoteAccessProviderInfo[]> {\n const entries = this.capabilities?.getCollectionEntries<NetworkAccessLike & NetworkAccessRegistrationMeta>(\n 'network-access',\n ) ?? []\n const out: RemoteAccessProviderInfo[] = []\n for (const [addonId, impl] of entries) {\n let connected = false\n let endpoint: RemoteAccessProviderInfo['endpoint'] = null\n let error: string | undefined\n if (impl.getStatus) {\n try {\n const s = await impl.getStatus()\n connected = s.connected\n endpoint = s.endpoint\n error = s.error\n } catch (err) {\n error = err instanceof Error ? err.message : String(err)\n }\n }\n out.push({\n addonId,\n displayName: impl.displayName ?? addonId,\n kind: impl.kind ?? (addonId.includes('cloudflare') ? 'cloudflare-tunnel' as const : 'other' as const),\n enabled: true,\n connected,\n endpoint,\n ...(error !== undefined ? { error } : {}),\n })\n }\n return out\n }\n}\n\nexport default RemoteAccessOrchestratorAddon\n"],"mappings":";;;;;;;;;;;;AA4BA,IAAa,gCAAb,cAAmD,gBAAA,UAAiC;CAClF,cAAc;EACZ,MAAM,EAAE,CAAC;;CAGX,MAAgB,eAAgD;EAC9D,MAAM,WAAsC;GAC1C,eAAe,YAAY,KAAK,eAAe;GAC/C,eAAe,OAAO,EAAE,cAAc;IACpC,MAAM,OAAO,KAAK,YAAY,QAAQ;IACtC,IAAI,CAAC,MAAM,OAAO,MAAM,IAAI,MAAM,2BAA2B,QAAQ,0BAA0B;IAC/F,OAAO,MAAM,KAAK,OAAO;;GAE3B,cAAc,OAAO,EAAE,cAAc;IACnC,MAAM,OAAO,KAAK,YAAY,QAAQ;IACtC,IAAI,MAAM,MAAM,MAAM,KAAK,MAAM;IACjC,OAAO,EAAE,SAAS,MAAe;;GAEpC;EACD,KAAK,IAAI,OAAO,KAAK,yCAAyC;EAC9D,OAAO,CAAC;GAAE,YAAY,gBAAA;GAAwB;GAAU,CAAC;;CAG3D,YAAoB,SAA2C;EAG7D,QAFgB,KAAK,cAAc,qBAAwC,iBAAiB,IAAI,EAAE,EAC5E,MAAM,CAAC,QAAQ,OAAO,QACrC,GAAQ,MAAM;;CAGvB,MAAc,gBAA8D;EAC1E,MAAM,UAAU,KAAK,cAAc,qBACjC,iBACD,IAAI,EAAE;EACP,MAAM,MAAkC,EAAE;EAC1C,KAAK,MAAM,CAAC,SAAS,SAAS,SAAS;GACrC,IAAI,YAAY;GAChB,IAAI,WAAiD;GACrD,IAAI;GACJ,IAAI,KAAK,WACP,IAAI;IACF,MAAM,IAAI,MAAM,KAAK,WAAW;IAChC,YAAY,EAAE;IACd,WAAW,EAAE;IACb,QAAQ,EAAE;YACH,KAAK;IACZ,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;;GAG5D,IAAI,KAAK;IACP;IACA,aAAa,KAAK,eAAe;IACjC,MAAM,KAAK,SAAS,QAAQ,SAAS,aAAa,GAAG,sBAA+B;IACpF,SAAS;IACT;IACA;IACA,GAAI,UAAU,KAAA,IAAY,EAAE,OAAO,GAAG,EAAE;IACzC,CAAC;;EAEJ,OAAO"}
@@ -0,0 +1,66 @@
1
+ import { BaseAddon, remoteAccessCapability } from "@camstack/types";
2
+ //#region src/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.ts
3
+ /**
4
+ * Remote-access orchestrator — singleton facade over the
5
+ * `network-access` collection (Cloudflare Tunnel, ngrok, Tailscale, …).
6
+ * Mirrors the auth-orchestrator and backup-orchestrator patterns.
7
+ */
8
+ var RemoteAccessOrchestratorAddon = class extends BaseAddon {
9
+ constructor() {
10
+ super({});
11
+ }
12
+ async onInitialize() {
13
+ const provider = {
14
+ listProviders: async () => this.listProviders(),
15
+ startProvider: async ({ addonId }) => {
16
+ const impl = this.resolveImpl(addonId);
17
+ if (!impl?.start) throw new Error(`Remote-access provider "${addonId}" does not support start`);
18
+ return await impl.start();
19
+ },
20
+ stopProvider: async ({ addonId }) => {
21
+ const impl = this.resolveImpl(addonId);
22
+ if (impl?.stop) await impl.stop();
23
+ return { success: true };
24
+ }
25
+ };
26
+ this.ctx.logger.info("Remote-access orchestrator initialized");
27
+ return [{
28
+ capability: remoteAccessCapability,
29
+ provider
30
+ }];
31
+ }
32
+ resolveImpl(addonId) {
33
+ return (this.capabilities?.getCollectionEntries("network-access") ?? []).find(([id]) => id === addonId)?.[1] ?? null;
34
+ }
35
+ async listProviders() {
36
+ const entries = this.capabilities?.getCollectionEntries("network-access") ?? [];
37
+ const out = [];
38
+ for (const [addonId, impl] of entries) {
39
+ let connected = false;
40
+ let endpoint = null;
41
+ let error;
42
+ if (impl.getStatus) try {
43
+ const s = await impl.getStatus();
44
+ connected = s.connected;
45
+ endpoint = s.endpoint;
46
+ error = s.error;
47
+ } catch (err) {
48
+ error = err instanceof Error ? err.message : String(err);
49
+ }
50
+ out.push({
51
+ addonId,
52
+ displayName: impl.displayName ?? addonId,
53
+ kind: impl.kind ?? (addonId.includes("cloudflare") ? "cloudflare-tunnel" : "other"),
54
+ enabled: true,
55
+ connected,
56
+ endpoint,
57
+ ...error !== void 0 ? { error } : {}
58
+ });
59
+ }
60
+ return out;
61
+ }
62
+ };
63
+ //#endregion
64
+ export { RemoteAccessOrchestratorAddon, RemoteAccessOrchestratorAddon as default };
65
+
66
+ //# sourceMappingURL=remote-access-orchestrator.addon.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-access-orchestrator.addon.mjs","names":[],"sources":["../../../src/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.ts"],"sourcesContent":["/**\n * Remote-access orchestrator — singleton facade over the\n * `network-access` collection (Cloudflare Tunnel, ngrok, Tailscale, …).\n * Mirrors the auth-orchestrator and backup-orchestrator patterns.\n */\nimport {\n BaseAddon,\n remoteAccessCapability,\n type IRemoteAccessOrchestrator,\n type RemoteAccessProviderInfo,\n type ProviderRegistration,\n} from '@camstack/types'\n\ninterface NetworkAccessLike {\n start?: () => Promise<{ url: string; hostname: string; port: number; protocol: 'http' | 'https' }>\n stop?: () => Promise<void>\n getStatus?: () => Promise<{\n connected: boolean\n endpoint: { url: string; hostname: string; port: number; protocol: 'http' | 'https' } | null\n error?: string\n }>\n}\n\ninterface NetworkAccessRegistrationMeta {\n readonly displayName?: string\n readonly kind?: RemoteAccessProviderInfo['kind']\n}\n\nexport class RemoteAccessOrchestratorAddon extends BaseAddon<Record<string, never>> {\n constructor() {\n super({})\n }\n\n protected async onInitialize(): Promise<ProviderRegistration[]> {\n const provider: IRemoteAccessOrchestrator = {\n listProviders: async () => this.listProviders(),\n startProvider: async ({ addonId }) => {\n const impl = this.resolveImpl(addonId)\n if (!impl?.start) throw new Error(`Remote-access provider \"${addonId}\" does not support start`)\n return await impl.start()\n },\n stopProvider: async ({ addonId }) => {\n const impl = this.resolveImpl(addonId)\n if (impl?.stop) await impl.stop()\n return { success: true as const }\n },\n } satisfies IRemoteAccessOrchestrator\n this.ctx.logger.info('Remote-access orchestrator initialized')\n return [{ capability: remoteAccessCapability, provider }]\n }\n\n private resolveImpl(addonId: string): NetworkAccessLike | null {\n const entries = this.capabilities?.getCollectionEntries<NetworkAccessLike>('network-access') ?? []\n const found = entries.find(([id]) => id === addonId)\n return found?.[1] ?? null\n }\n\n private async listProviders(): Promise<readonly RemoteAccessProviderInfo[]> {\n const entries = this.capabilities?.getCollectionEntries<NetworkAccessLike & NetworkAccessRegistrationMeta>(\n 'network-access',\n ) ?? []\n const out: RemoteAccessProviderInfo[] = []\n for (const [addonId, impl] of entries) {\n let connected = false\n let endpoint: RemoteAccessProviderInfo['endpoint'] = null\n let error: string | undefined\n if (impl.getStatus) {\n try {\n const s = await impl.getStatus()\n connected = s.connected\n endpoint = s.endpoint\n error = s.error\n } catch (err) {\n error = err instanceof Error ? err.message : String(err)\n }\n }\n out.push({\n addonId,\n displayName: impl.displayName ?? addonId,\n kind: impl.kind ?? (addonId.includes('cloudflare') ? 'cloudflare-tunnel' as const : 'other' as const),\n enabled: true,\n connected,\n endpoint,\n ...(error !== undefined ? { error } : {}),\n })\n }\n return out\n }\n}\n\nexport default RemoteAccessOrchestratorAddon\n"],"mappings":";;;;;;;AA4BA,IAAa,gCAAb,cAAmD,UAAiC;CAClF,cAAc;EACZ,MAAM,EAAE,CAAC;;CAGX,MAAgB,eAAgD;EAC9D,MAAM,WAAsC;GAC1C,eAAe,YAAY,KAAK,eAAe;GAC/C,eAAe,OAAO,EAAE,cAAc;IACpC,MAAM,OAAO,KAAK,YAAY,QAAQ;IACtC,IAAI,CAAC,MAAM,OAAO,MAAM,IAAI,MAAM,2BAA2B,QAAQ,0BAA0B;IAC/F,OAAO,MAAM,KAAK,OAAO;;GAE3B,cAAc,OAAO,EAAE,cAAc;IACnC,MAAM,OAAO,KAAK,YAAY,QAAQ;IACtC,IAAI,MAAM,MAAM,MAAM,KAAK,MAAM;IACjC,OAAO,EAAE,SAAS,MAAe;;GAEpC;EACD,KAAK,IAAI,OAAO,KAAK,yCAAyC;EAC9D,OAAO,CAAC;GAAE,YAAY;GAAwB;GAAU,CAAC;;CAG3D,YAAoB,SAA2C;EAG7D,QAFgB,KAAK,cAAc,qBAAwC,iBAAiB,IAAI,EAAE,EAC5E,MAAM,CAAC,QAAQ,OAAO,QACrC,GAAQ,MAAM;;CAGvB,MAAc,gBAA8D;EAC1E,MAAM,UAAU,KAAK,cAAc,qBACjC,iBACD,IAAI,EAAE;EACP,MAAM,MAAkC,EAAE;EAC1C,KAAK,MAAM,CAAC,SAAS,SAAS,SAAS;GACrC,IAAI,YAAY;GAChB,IAAI,WAAiD;GACrD,IAAI;GACJ,IAAI,KAAK,WACP,IAAI;IACF,MAAM,IAAI,MAAM,KAAK,WAAW;IAChC,YAAY,EAAE;IACd,WAAW,EAAE;IACb,QAAQ,EAAE;YACH,KAAK;IACZ,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;;GAG5D,IAAI,KAAK;IACP;IACA,aAAa,KAAK,eAAe;IACjC,MAAM,KAAK,SAAS,QAAQ,SAAS,aAAa,GAAG,sBAA+B;IACpF,SAAS;IACT;IACA;IACA,GAAI,UAAU,KAAA,IAAY,EAAE,OAAO,GAAG,EAAE;IACzC,CAAC;;EAEJ,OAAO"}
@@ -0,0 +1,3 @@
1
+ export { SnapshotAddon } from './snapshot.addon.js';
2
+ export { SnapshotAddon as default } from './snapshot.addon.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builtins/snapshot/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,aAAa,IAAI,OAAO,EAAE,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,494 @@
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
5
+ require("../../chunk-C13QxCFV.js");
6
+ let node_child_process = require("node:child_process");
7
+ let _camstack_types = require("@camstack/types");
8
+ //#region src/builtins/snapshot/snapshot.addon.ts
9
+ /** Default cache window for non-battery cams (seconds). 10s feels live. */
10
+ var NON_BATTERY_DEFAULT_MAX_AGE_S = 10;
11
+ /** Default cache window for battery cams (seconds). 1h ≈ "don't wake the cam unless asked". */
12
+ var BATTERY_DEFAULT_MAX_AGE_S = 3600;
13
+ /**
14
+ * SnapshotAddon — wrapper over the `snapshot` capability.
15
+ *
16
+ * Activated per-device (toggleable by user; default active). When active,
17
+ * caches fresh snapshots in memory. On cache miss, delegates to the native
18
+ * provider for this device via `ctx.getNativeProvider(snapshotCapability, id)`.
19
+ *
20
+ * No silent fallback — if the native fails, propagate the error up. Stale
21
+ * cache is returned ONLY when the native throws AND a stale entry exists,
22
+ * and the failure is logged so the fallback is never silent.
23
+ *
24
+ * Frame-grab fallback: when the native provider is absent (or returns null /
25
+ * throws), we ask the `stream-broker` capability for the device's RTSP
26
+ * restream URL and pipe one JPEG out of ffmpeg. stream-broker intentionally
27
+ * does NOT expose a `grabFrame` method — the orchestration (native-first,
28
+ * ffmpeg fallback, caching) is this addon's concern; stream-broker only
29
+ * publishes stream endpoints.
30
+ */
31
+ var SnapshotAddon = class extends _camstack_types.BaseAddon {
32
+ cache = /* @__PURE__ */ new Map();
33
+ constructor() {
34
+ super({ staleTtlMs: 6e4 });
35
+ }
36
+ async onInitialize() {
37
+ this.ctx.logger.info("Snapshot wrapper initialized");
38
+ return [{
39
+ capability: _camstack_types.snapshotCapability,
40
+ provider: {
41
+ getSnapshot: (input) => this.getSnapshot(input),
42
+ invalidateCache: (input) => this.invalidateCache(input),
43
+ getDeviceSettingsContribution: (input) => this.buildDeviceSettingsContribution(input.deviceId),
44
+ getDeviceLiveContribution: async () => null,
45
+ applyDeviceSettingsPatch: (input) => this.saveDeviceSettingsPatch(input.deviceId, input.patch),
46
+ getStatus: async (input) => this.getStatus(input.deviceId)
47
+ },
48
+ kind: "wrapper",
49
+ defaultActive: true
50
+ }];
51
+ }
52
+ async onShutdown() {
53
+ this.cache.clear();
54
+ }
55
+ globalSettingsSchema() {
56
+ return this.schema({ sections: [{
57
+ id: "snapshot-cache",
58
+ title: "Snapshot Cache",
59
+ description: "Stale fallback when live capture fails. Per-device freshness is configured under Device → Snapshot → Max cache age.",
60
+ columns: 1,
61
+ fields: [this.field({
62
+ type: "number",
63
+ key: "staleTtlMs",
64
+ label: "Stale fallback TTL (ms)",
65
+ description: "If live capture fails, cached snapshot younger than this is still returned.",
66
+ min: 0,
67
+ max: 36e5,
68
+ step: 1e3,
69
+ default: 6e4
70
+ })]
71
+ }] });
72
+ }
73
+ async getSnapshot(input) {
74
+ const { deviceId, force } = input;
75
+ const meta = await this.lookupDeviceMeta(deviceId);
76
+ const deviceName = meta?.name;
77
+ const isBatteryDevice = meta?.isBattery ?? false;
78
+ const log = this.ctx.logger.withTags({
79
+ deviceId,
80
+ ...deviceName ? { deviceName } : {}
81
+ });
82
+ const now = Date.now();
83
+ const hit = this.cache.get(deviceId);
84
+ const prefs = await this.readDeviceSettings(deviceId).catch(() => ({}));
85
+ const rawPref = prefs.snapshotStreamId;
86
+ const effectiveStreamId = input.streamId ?? (rawPref && rawPref !== "auto" ? rawPref : void 0);
87
+ if (prefs.snapshotDebug) log.info("debug on", {
88
+ tags: { deviceId },
89
+ meta: { stream: effectiveStreamId ?? "auto" }
90
+ });
91
+ const defaultMaxAgeS = isBatteryDevice ? BATTERY_DEFAULT_MAX_AGE_S : NON_BATTERY_DEFAULT_MAX_AGE_S;
92
+ const effectiveMaxAgeMs = (typeof prefs.snapshotMaxAgeS === "number" && prefs.snapshotMaxAgeS >= 0 ? prefs.snapshotMaxAgeS : defaultMaxAgeS) * 1e3;
93
+ if (!force && hit && now - hit.ts < effectiveMaxAgeMs) {
94
+ if (prefs.snapshotDebug) log.debug("snapshot: cache hit", {
95
+ tags: { deviceId },
96
+ meta: {
97
+ ageMs: now - hit.ts,
98
+ maxAgeMs: effectiveMaxAgeMs,
99
+ isBattery: isBatteryDevice
100
+ }
101
+ });
102
+ return hit.data;
103
+ }
104
+ let nativeError = null;
105
+ let nativeAbsent = false;
106
+ try {
107
+ const native = this.ctx.getNativeProvider(_camstack_types.snapshotCapability, deviceId);
108
+ if (native) {
109
+ const result = await native.getSnapshot(input);
110
+ if (result) {
111
+ this.cache.set(deviceId, {
112
+ data: result,
113
+ ts: now,
114
+ streamId: effectiveStreamId ?? null
115
+ });
116
+ return result;
117
+ }
118
+ } else nativeAbsent = true;
119
+ } catch (err) {
120
+ const msg = (0, _camstack_types.errMsg)(err);
121
+ if (isAbsentNativeError(msg)) {
122
+ nativeAbsent = true;
123
+ log.debug("native snapshot absent", {
124
+ tags: { deviceId },
125
+ meta: { error: msg }
126
+ });
127
+ } else {
128
+ nativeError = err;
129
+ log.warn("native snapshot failed", {
130
+ tags: { deviceId },
131
+ meta: { error: msg }
132
+ });
133
+ }
134
+ }
135
+ if (!(isBatteryDevice && nativeAbsent && !await this.hasStreamingBrokerForDevice(deviceId))) try {
136
+ const fallback = await this.grabFrameFromBroker(deviceId, effectiveStreamId);
137
+ if (fallback) {
138
+ this.cache.set(deviceId, {
139
+ data: fallback,
140
+ ts: now,
141
+ streamId: effectiveStreamId ?? null
142
+ });
143
+ return fallback;
144
+ }
145
+ } catch (err) {
146
+ log.warn("stream-broker snapshot fallback failed", {
147
+ tags: { deviceId },
148
+ meta: { error: (0, _camstack_types.errMsg)(err) }
149
+ });
150
+ }
151
+ else log.debug("snapshot: skipping broker fallback — battery device with absent native and no streaming broker", { tags: { deviceId } });
152
+ if (hit) {
153
+ const ageMs = now - hit.ts;
154
+ if (ageMs > this.config.staleTtlMs) log.warn("snapshot: all live paths failed — serving stale cache", {
155
+ tags: { deviceId },
156
+ meta: { ageMs }
157
+ });
158
+ return hit.data;
159
+ }
160
+ if (nativeError) throw nativeError;
161
+ if (nativeAbsent) return null;
162
+ return null;
163
+ }
164
+ /**
165
+ * Tell apart "native provider isn't registered for this device" from
166
+ * "native provider ran and threw a real error". The former is the steady
167
+ * state for cameras without a vendor snapshot endpoint and should not
168
+ * propagate as a 500; the latter should.
169
+ */
170
+ /**
171
+ * Pull one JPEG from the device's stream-broker RTSP restream using
172
+ * a short-lived ffmpeg invocation.
173
+ *
174
+ * Stream selection strategy (picks the broker that won't stall):
175
+ * 1. Explicit `preferredStreamId` (user set in per-device settings)
176
+ * — always honoured, even if currently idle. Operator choice
177
+ * wins.
178
+ * 2. Auto: highest-quality broker currently in `streaming` state.
179
+ * This is the whole point — prefer the stream that has active
180
+ * subscribers (usually `low` for detection, but `mid`/`high`
181
+ * if WebRTC is watching) so ffmpeg hits a warm pipe and
182
+ * doesn't race the broker's resume.
183
+ * 3. Fallback: highest-quality enabled entry regardless of status
184
+ * (will wake a suspended broker — retry-guarded against the
185
+ * cold-start error).
186
+ *
187
+ * The stream-broker auto-suspends idle streams on the "no demand"
188
+ * signal; snapshots used to default to `high` which was often the
189
+ * first to go idle, racing every snapshot with a broker resume.
190
+ * Now we ask the orchestrator of streams which one is warm and grab
191
+ * from there.
192
+ */
193
+ async grabFrameFromBroker(deviceId, preferredStreamId) {
194
+ const dev = await this.ctx.fetchDevice(deviceId);
195
+ const prefix = `${deviceId}/`;
196
+ const [deviceEntries, profileSlots] = await Promise.all([dev.cameraStreams?.getRtspEntries({}) ?? [], dev.cameraStreams?.getBrokerStreams({}) ?? []]);
197
+ const usable = deviceEntries.filter((e) => e.enabled && !!e.url);
198
+ if (usable.length === 0) return null;
199
+ if (preferredStreamId && preferredStreamId !== "auto") {
200
+ const explicit = usable.find((e) => e.brokerId === `${prefix}${preferredStreamId}`);
201
+ if (explicit) {
202
+ const grabbed = await this.runGrabWithResumeRetry(explicit.url, deviceId);
203
+ if (grabbed) return grabbed;
204
+ this.ctx.logger.debug("grabFrame: explicit stream failed — falling back to auto", { meta: { preferredStreamId } });
205
+ }
206
+ }
207
+ const ranked = [...usable].sort((a, b) => qualityRank(b.brokerId, prefix) - qualityRank(a.brokerId, prefix));
208
+ const statusByBrokerId = /* @__PURE__ */ new Map();
209
+ for (const slot of profileSlots) statusByBrokerId.set(slot.brokerId, slot.status);
210
+ const statuses = ranked.map((e) => ({
211
+ entry: e,
212
+ status: statusByBrokerId.get(e.brokerId) ?? "idle"
213
+ }));
214
+ const warm = statuses.find((s) => s.status === "streaming");
215
+ if (warm) {
216
+ const grabbed = await this.runGrabWithResumeRetry(warm.entry.url, deviceId);
217
+ if (grabbed) return grabbed;
218
+ }
219
+ for (const { entry } of statuses) {
220
+ const grabbed = await this.runGrabWithResumeRetry(entry.url, deviceId).catch(() => null);
221
+ if (grabbed) return grabbed;
222
+ }
223
+ return null;
224
+ }
225
+ /**
226
+ * Ffmpeg grab with one retry on the broker-cold-start error
227
+ * signature. Covers the window between "client connected" and
228
+ * "first keyframe" when a suspended broker resumes.
229
+ */
230
+ async runGrabWithResumeRetry(url, deviceId) {
231
+ let buf;
232
+ try {
233
+ buf = await runFfmpegFrameGrab(url, 15e3);
234
+ } catch (err) {
235
+ if (isBrokerColdError((0, _camstack_types.errMsg)(err))) {
236
+ this.ctx.logger.debug("grabFrame: broker-resume race — retrying in 1500ms", { tags: { deviceId } });
237
+ await new Promise((r) => setTimeout(r, 1500));
238
+ buf = await runFfmpegFrameGrab(url, 15e3);
239
+ } else throw err;
240
+ }
241
+ if (buf.length === 0) return null;
242
+ return {
243
+ base64: buf.toString("base64"),
244
+ contentType: "image/jpeg"
245
+ };
246
+ }
247
+ async invalidateCache(input) {
248
+ this.cache.delete(input.deviceId);
249
+ }
250
+ /**
251
+ * Non-throwing probe of the device's battery cap. Returns true only
252
+ * when a battery native is registered AND its current status says
253
+ * `sleeping: true`. Any error (no provider, native absent, getStatus
254
+ * missing, RPC timeout) is swallowed and treated as "awake" — we'd
255
+ * rather pay a wake-up than strand the caller on a cache that's
256
+ * semantically stale. Debug-logged for observability.
257
+ */
258
+ /**
259
+ * True when at least one of the device's brokers is actively
260
+ * streaming (status === 'streaming'). Used by the battery-cam guard
261
+ * around `grabFrameFromBroker` to allow the fallback ONLY when
262
+ * grabbing a frame is free (a consumer is already keeping the
263
+ * stream warm). When everything is suspended, the fallback would
264
+ * dial the camera and wake it — defeats the sleeping cache.
265
+ */
266
+ async hasStreamingBrokerForDevice(deviceId) {
267
+ try {
268
+ return (await (await this.ctx.fetchDevice(deviceId)).cameraStreams?.getBrokerStreams({}) ?? []).some((s) => s.status === "streaming");
269
+ } catch {
270
+ return false;
271
+ }
272
+ }
273
+ /**
274
+ * Diagnostic status for the `status` auto-injected cap method. Reports
275
+ * the cache bookkeeping for this device — when the last snapshot was
276
+ * captured, how stale the cached image is, its size, and which stream
277
+ * was used. Returns null when the device has never been captured
278
+ * (cache miss) since the addon started.
279
+ */
280
+ async getStatus(deviceId) {
281
+ const hit = this.cache.get(deviceId);
282
+ if (!hit) return null;
283
+ return {
284
+ lastCapturedAt: hit.ts,
285
+ cacheAgeMs: Date.now() - hit.ts,
286
+ lastBytes: hit.data.base64.length,
287
+ lastStreamId: hit.streamId
288
+ };
289
+ }
290
+ async readDeviceSettings(deviceId) {
291
+ if (!this.ctx.settings) return {};
292
+ const raw = await this.ctx.settings.readDeviceStore(deviceId);
293
+ const rawAge = raw["snapshotMaxAgeS"];
294
+ const maxAgeS = typeof rawAge === "number" && rawAge >= 0 && Number.isFinite(rawAge) ? rawAge : void 0;
295
+ return {
296
+ snapshotStreamId: typeof raw["snapshotStreamId"] === "string" ? raw["snapshotStreamId"] : void 0,
297
+ snapshotDebug: raw["snapshotDebug"] === true,
298
+ ...maxAgeS !== void 0 ? { snapshotMaxAgeS: maxAgeS } : {}
299
+ };
300
+ }
301
+ async buildDeviceSettingsContribution(deviceId) {
302
+ const meta = await this.lookupDeviceMeta(deviceId);
303
+ if (meta && meta.type !== _camstack_types.DeviceType.Camera) return null;
304
+ const current = await this.readDeviceSettings(deviceId);
305
+ const streamOptions = await this.getStreamOptions(deviceId);
306
+ const isBattery = await this.isDeviceBattery(deviceId);
307
+ const defaultMaxAgeS = isBattery ? BATTERY_DEFAULT_MAX_AGE_S : NON_BATTERY_DEFAULT_MAX_AGE_S;
308
+ return { sections: [{
309
+ id: "snapshot-preferences",
310
+ title: "Snapshot",
311
+ tab: "snapshot",
312
+ order: 60,
313
+ fields: [
314
+ {
315
+ type: "select",
316
+ key: "snapshotStreamId",
317
+ label: "Preferred stream",
318
+ description: "Stream used when grabbing a snapshot",
319
+ options: streamOptions,
320
+ required: true,
321
+ value: current.snapshotStreamId || "auto"
322
+ },
323
+ {
324
+ type: "number",
325
+ key: "snapshotMaxAgeS",
326
+ label: "Max cache age (s)",
327
+ description: `Serve cached snapshot up to this age before re-capturing. Default ${defaultMaxAgeS}s for ${isBattery ? "battery cams (avoids gratuitous wake-ups)" : "non-battery cams (live-feel)"}. The UI refresh button always forces a fresh capture regardless of this value.`,
328
+ min: 0,
329
+ max: 24 * 3600,
330
+ step: 1,
331
+ value: current.snapshotMaxAgeS ?? defaultMaxAgeS
332
+ },
333
+ {
334
+ type: "boolean",
335
+ key: "snapshotDebug",
336
+ label: "Debug logging",
337
+ description: "Log stream selection and timing details for this device.",
338
+ value: current.snapshotDebug ?? false
339
+ }
340
+ ]
341
+ }] };
342
+ }
343
+ /**
344
+ * Single-trip device lookup against device-manager. Returns the
345
+ * fields the wrapper actually consults — name (logging) + battery
346
+ * flag (cache window + broker-fallback gate). Sourced from the
347
+ * device-manager registry rather than the battery cap so the answer
348
+ * survives a momentarily-unreachable provider (the very condition
349
+ * we're trying to be resilient to).
350
+ *
351
+ * Logged at debug + null return on failure: every call site already
352
+ * has a sensible fallback path (cache hit, conservative default, …),
353
+ * so we don't want a transient device-manager hiccup to throw.
354
+ */
355
+ async lookupDeviceMeta(deviceId) {
356
+ const api = this.ctx.api;
357
+ if (!api) return null;
358
+ try {
359
+ const found = await api.deviceManager.getDevice.query({ deviceId });
360
+ if (!found) return null;
361
+ const features = found.features ?? [];
362
+ const rawType = found.type;
363
+ return {
364
+ ...found.name ? { name: found.name } : {},
365
+ isBattery: features.includes(_camstack_types.DeviceFeature.BatteryOperated),
366
+ ...rawType ? { type: rawType } : {}
367
+ };
368
+ } catch (err) {
369
+ this.ctx.logger.debug("deviceManager.getDevice failed during snapshot", {
370
+ tags: { deviceId },
371
+ meta: { error: err instanceof Error ? err.message : String(err) }
372
+ });
373
+ return null;
374
+ }
375
+ }
376
+ /** Settings-UI helper — battery flag drives the default max-age in the field description. */
377
+ async isDeviceBattery(deviceId) {
378
+ return (await this.lookupDeviceMeta(deviceId))?.isBattery ?? false;
379
+ }
380
+ async getStreamOptions(deviceId) {
381
+ const prefix = `${deviceId}/`;
382
+ try {
383
+ return [{
384
+ value: "auto",
385
+ label: "Auto"
386
+ }, ...(await (await this.ctx.fetchDevice(deviceId)).cameraStreams?.getRtspEntries({}) ?? []).filter((e) => e.enabled).map((e) => e.brokerId.slice(prefix.length)).map((id) => ({
387
+ value: id,
388
+ label: (0, _camstack_types.streamQualityLabel)(id)
389
+ }))];
390
+ } catch (err) {
391
+ this.ctx.logger.error("getStreamOptions failed", {
392
+ tags: { deviceId },
393
+ meta: { error: (0, _camstack_types.errMsg)(err) }
394
+ });
395
+ return [{
396
+ value: "auto",
397
+ label: "Auto"
398
+ }];
399
+ }
400
+ }
401
+ async saveDeviceSettingsPatch(deviceId, patch) {
402
+ if (!this.ctx.settings) throw new Error("[snapshot] settings store unavailable — cannot persist per-device settings");
403
+ const next = { ...await this.ctx.settings.readDeviceStore(deviceId) };
404
+ if ("snapshotStreamId" in patch) {
405
+ const v = patch["snapshotStreamId"];
406
+ next["snapshotStreamId"] = typeof v === "string" && v.trim().length > 0 ? v.trim() : "";
407
+ }
408
+ if ("snapshotDebug" in patch) next["snapshotDebug"] = patch["snapshotDebug"] === true;
409
+ if ("snapshotMaxAgeS" in patch) {
410
+ const v = patch["snapshotMaxAgeS"];
411
+ if (typeof v === "number" && Number.isFinite(v) && v >= 0) next["snapshotMaxAgeS"] = v;
412
+ else delete next["snapshotMaxAgeS"];
413
+ }
414
+ await this.ctx.settings.writeDeviceStore(deviceId, next);
415
+ this.cache.delete(deviceId);
416
+ return { success: true };
417
+ }
418
+ };
419
+ function isAbsentNativeError(msg) {
420
+ return msg.includes("no provider for") || msg.includes("no native provider for capability");
421
+ }
422
+ /**
423
+ * Quality ordering for broker picker: `high` > `mid` > `low` > other.
424
+ * The streamId is the suffix after `${deviceId}/` in the brokerId.
425
+ * Unknown labels fall through to 0 so they land at the bottom of the
426
+ * preference list without crashing.
427
+ */
428
+ function qualityRank(brokerId, prefix) {
429
+ const normalized = (brokerId.startsWith(prefix) ? brokerId.slice(prefix.length) : brokerId).toLowerCase();
430
+ if (normalized.includes("high") || normalized === "main" || normalized === "hd") return 3;
431
+ if (normalized.includes("mid") || normalized === "medium") return 2;
432
+ if (normalized.includes("low") || normalized === "sub" || normalized === "sd") return 1;
433
+ return 0;
434
+ }
435
+ /**
436
+ * Detect ffmpeg failure signatures that indicate the broker wasn't
437
+ * streaming yet when we tried to read its RTSP restream — a race
438
+ * window that closes as soon as the broker lands its first keyframe.
439
+ * Used by `grabFrameFromBroker` to retry once instead of giving up.
440
+ */
441
+ function isBrokerColdError(msg) {
442
+ return msg.includes("Invalid data found when processing input") || msg.includes("Error opening input") || msg.includes("Connection refused") || msg.includes("No route to host");
443
+ }
444
+ function runFfmpegFrameGrab(url, timeoutMs) {
445
+ return new Promise((resolve, reject) => {
446
+ (0, node_child_process.execFile)("ffmpeg", [
447
+ "-loglevel",
448
+ "error",
449
+ "-rtsp_transport",
450
+ "tcp",
451
+ "-fflags",
452
+ "+discardcorrupt",
453
+ "-skip_frame",
454
+ "nokey",
455
+ "-i",
456
+ url,
457
+ "-vf",
458
+ "select=eq(pict_type\\,I)",
459
+ "-vsync",
460
+ "vfr",
461
+ "-frames:v",
462
+ "1",
463
+ "-q:v",
464
+ "3",
465
+ "-f",
466
+ "image2pipe",
467
+ "-vcodec",
468
+ "mjpeg",
469
+ "pipe:1"
470
+ ], {
471
+ encoding: "buffer",
472
+ maxBuffer: 16 * 1024 * 1024,
473
+ timeout: timeoutMs
474
+ }, (err, stdout, stderr) => {
475
+ if (err) {
476
+ const errWithMeta = err;
477
+ const stderrText = Buffer.isBuffer(stderr) ? stderr.toString("utf8").trim() : String(stderr ?? "").trim();
478
+ const parts = [err instanceof Error ? err.message : String(err)];
479
+ if (errWithMeta.killed) parts.push("killed=true");
480
+ if (errWithMeta.code !== void 0) parts.push(`code=${String(errWithMeta.code)}`);
481
+ if (errWithMeta.signal) parts.push(`signal=${errWithMeta.signal}`);
482
+ if (stderrText) parts.push(`stderr: ${stderrText.slice(0, 500)}`);
483
+ reject(new Error(parts.join(" — ")));
484
+ return;
485
+ }
486
+ resolve(Buffer.isBuffer(stdout) ? stdout : Buffer.from(stdout));
487
+ }).on("error", (e) => reject(e));
488
+ });
489
+ }
490
+ //#endregion
491
+ exports.SnapshotAddon = SnapshotAddon;
492
+ exports.default = SnapshotAddon;
493
+
494
+ //# sourceMappingURL=index.js.map