@camstack/system 1.2.389 → 1.2.391

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (503) hide show
  1. package/dist/addon/addon-api-factory.d.ts +30 -30
  2. package/dist/addon-routes/addon-route-registry.d.ts +31 -31
  3. package/dist/addon-runner.js +1 -1
  4. package/dist/addon-runner.mjs +1 -1
  5. package/dist/addon-utils.d.ts +22 -22
  6. package/dist/auth/admin-token-manager.d.ts +37 -67
  7. package/dist/auth/api-key-manager.d.ts +8 -8
  8. package/dist/auth/auth-audit-log.d.ts +29 -49
  9. package/dist/auth/auth-manager.d.ts +127 -126
  10. package/dist/auth/cidr.d.ts +8 -8
  11. package/dist/auth/external-identity-manager.d.ts +46 -34
  12. package/dist/auth/jwt-signing-key.d.ts +14 -14
  13. package/dist/auth/login-session-manager.d.ts +95 -135
  14. package/dist/auth/parse-record.d.ts +13 -13
  15. package/dist/auth/scope-matcher.d.ts +7 -7
  16. package/dist/auth/scoped-token-manager.d.ts +62 -62
  17. package/dist/auth/token-expiry.d.ts +49 -26
  18. package/dist/auth/totp-manager.d.ts +48 -48
  19. package/dist/auth/user-management-internal.d.ts +67 -52
  20. package/dist/auth/user-manager.d.ts +58 -58
  21. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.d.ts +54 -54
  22. package/dist/builtins/addon-pages-aggregator/dedupe-pages.d.ts +22 -4
  23. package/dist/builtins/addon-pages-aggregator/index.d.ts +1 -1
  24. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.d.ts +54 -54
  25. package/dist/builtins/addon-widgets-aggregator/index.d.ts +1 -1
  26. package/dist/builtins/alerts/alerts.addon.d.ts +88 -87
  27. package/dist/builtins/alerts/device-label.d.ts +6 -6
  28. package/dist/builtins/alerts/index.d.ts +1 -1
  29. package/dist/builtins/alerts/prune-policy.d.ts +36 -36
  30. package/dist/builtins/autotrack/autotrack-cameras.d.ts +102 -79
  31. package/dist/builtins/autotrack/autotrack-config.d.ts +81 -81
  32. package/dist/builtins/autotrack/autotrack-decision.d.ts +69 -82
  33. package/dist/builtins/autotrack/autotrack-loop.d.ts +81 -61
  34. package/dist/builtins/autotrack/autotrack.addon.d.ts +103 -66
  35. package/dist/builtins/autotrack/frame-error.d.ts +38 -38
  36. package/dist/builtins/autotrack/frame-measurements.d.ts +79 -79
  37. package/dist/builtins/autotrack/index.d.ts +2 -2
  38. package/dist/builtins/autotrack/ptz-mirror.d.ts +46 -17
  39. package/dist/builtins/autotrack/target-selection.d.ts +33 -47
  40. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.d.ts +270 -269
  41. package/dist/builtins/backup-orchestrator/cron-helpers.d.ts +17 -17
  42. package/dist/builtins/backup-orchestrator/destination-policy.d.ts +99 -82
  43. package/dist/builtins/backup-orchestrator/download-helpers.d.ts +9 -9
  44. package/dist/builtins/backup-orchestrator/encryption-key-store.d.ts +40 -29
  45. package/dist/builtins/backup-orchestrator/index.d.ts +2 -2
  46. package/dist/builtins/backup-orchestrator/manifest-store.d.ts +88 -69
  47. package/dist/builtins/backup-orchestrator/restore-archive.d.ts +14 -14
  48. package/dist/builtins/backup-orchestrator/run-queue.d.ts +86 -86
  49. package/dist/builtins/backup-orchestrator/schedule-store.d.ts +53 -37
  50. package/dist/builtins/backup-orchestrator/staging-paths.d.ts +23 -23
  51. package/dist/builtins/backup-orchestrator/write-targets.d.ts +53 -53
  52. package/dist/builtins/calendars/calendar-color.d.ts +5 -1
  53. package/dist/builtins/calendars/calendar-prefs-store.d.ts +18 -12
  54. package/dist/builtins/calendars/calendars.addon.d.ts +16 -11
  55. package/dist/builtins/calendars/index.d.ts +1 -1
  56. package/dist/builtins/camera-grid/acquire-retry.d.ts +26 -26
  57. package/dist/builtins/camera-grid/addon.d.ts +200 -174
  58. package/dist/builtins/camera-grid/flv-join.d.ts +32 -58
  59. package/dist/builtins/camera-grid/grid-activity-mirror.d.ts +37 -37
  60. package/dist/builtins/camera-grid/grid-activity.d.ts +83 -42
  61. package/dist/builtins/camera-grid/grid-camera-declarations.d.ts +46 -46
  62. package/dist/builtins/camera-grid/grid-camera-device.d.ts +60 -34
  63. package/dist/builtins/camera-grid/grid-canvas-derivation.d.ts +50 -15
  64. package/dist/builtins/camera-grid/grid-canvas-seed.d.ts +96 -46
  65. package/dist/builtins/camera-grid/grid-canvas.d.ts +74 -74
  66. package/dist/builtins/camera-grid/grid-child.d.ts +29 -16
  67. package/dist/builtins/camera-grid/grid-compositor-child.d.ts +2 -2
  68. package/dist/builtins/camera-grid/grid-compositor-invocation.d.ts +39 -11
  69. package/dist/builtins/camera-grid/grid-compositor.d.ts +50 -50
  70. package/dist/builtins/camera-grid/grid-detection-mapping.d.ts +52 -22
  71. package/dist/builtins/camera-grid/grid-device-settings.d.ts +31 -7
  72. package/dist/builtins/camera-grid/grid-filter-graph.d.ts +41 -41
  73. package/dist/builtins/camera-grid/grid-frame-sample.d.ts +45 -19
  74. package/dist/builtins/camera-grid/grid-instances.d.ts +20 -50
  75. package/dist/builtins/camera-grid/grid-last-frame-store.d.ts +51 -51
  76. package/dist/builtins/camera-grid/grid-layout-native-provider.d.ts +30 -4
  77. package/dist/builtins/camera-grid/grid-plan.d.ts +30 -20
  78. package/dist/builtins/camera-grid/grid-profiles.d.ts +85 -45
  79. package/dist/builtins/camera-grid/grid-row-normalization.d.ts +6 -6
  80. package/dist/builtins/camera-grid/grid-sentry-sources.d.ts +57 -57
  81. package/dist/builtins/camera-grid/grid-snapshot.d.ts +41 -41
  82. package/dist/builtins/camera-grid/grid-stream-descriptor.d.ts +49 -21
  83. package/dist/builtins/camera-grid/grid-stream-invocation.d.ts +37 -22
  84. package/dist/builtins/camera-grid/grid-stream-relay.d.ts +26 -26
  85. package/dist/builtins/camera-grid/grid-stream-session.d.ts +123 -93
  86. package/dist/builtins/camera-grid/grid-tile-feed.d.ts +47 -47
  87. package/dist/builtins/camera-grid/grid-tile-plan.d.ts +55 -20
  88. package/dist/builtins/camera-grid/grid-wire-format.d.ts +22 -6
  89. package/dist/builtins/camera-grid/index.d.ts +44 -44
  90. package/dist/builtins/camera-grid/silence-analysis.d.ts +31 -14
  91. package/dist/builtins/composer/claim-gate.d.ts +54 -27
  92. package/dist/builtins/composer/composed-device-set.d.ts +40 -26
  93. package/dist/builtins/composer/composed-device.d.ts +39 -17
  94. package/dist/builtins/composer/composer-apply-waits.d.ts +20 -13
  95. package/dist/builtins/composer/composer-grafts.d.ts +57 -38
  96. package/dist/builtins/composer/composer-live-set.d.ts +15 -15
  97. package/dist/builtins/composer/composer-plan.d.ts +76 -60
  98. package/dist/builtins/composer/composer-runtime-factory.d.ts +21 -14
  99. package/dist/builtins/composer/composer-seeds.d.ts +20 -14
  100. package/dist/builtins/composer/composer-verdict.d.ts +28 -14
  101. package/dist/builtins/composer/composer.addon.d.ts +23 -9
  102. package/dist/builtins/composer/composer.d.ts +145 -100
  103. package/dist/builtins/composer/composition-declarations.d.ts +50 -39
  104. package/dist/builtins/composer/composition-evaluation.d.ts +38 -22
  105. package/dist/builtins/composer/composition-runtime.d.ts +178 -125
  106. package/dist/builtins/composer/composition-target.d.ts +38 -34
  107. package/dist/builtins/composer/confirmed-seed.d.ts +35 -23
  108. package/dist/builtins/composer/deadline-timer.d.ts +13 -13
  109. package/dist/builtins/composer/existing-target.d.ts +90 -73
  110. package/dist/builtins/composer/field-record.d.ts +26 -19
  111. package/dist/builtins/composer/graft-host.d.ts +56 -32
  112. package/dist/builtins/composer/held-claims.d.ts +26 -9
  113. package/dist/builtins/composer/index.d.ts +1 -1
  114. package/dist/builtins/composer/own-field-reads.d.ts +26 -15
  115. package/dist/builtins/composer/owned-fields-target.d.ts +75 -44
  116. package/dist/builtins/composer/slice-assembler.d.ts +19 -3
  117. package/dist/builtins/composer/source-readings.d.ts +67 -61
  118. package/dist/builtins/composer/source-tracker.d.ts +133 -69
  119. package/dist/builtins/console-logging/console-destination.d.ts +15 -8
  120. package/dist/builtins/console-logging/console-logging.addon.d.ts +20 -19
  121. package/dist/builtins/console-logging/index.d.ts +3 -3
  122. package/dist/builtins/core-blocks/block-package.d.ts +37 -37
  123. package/dist/builtins/core-blocks/block-settings-store.d.ts +34 -21
  124. package/dist/builtins/core-blocks/block-supervisor.d.ts +138 -117
  125. package/dist/builtins/core-blocks/block-type-defs.d.ts +21 -21
  126. package/dist/builtins/core-blocks/blocks-integration.d.ts +76 -49
  127. package/dist/builtins/core-blocks/compile-block.d.ts +37 -37
  128. package/dist/builtins/core-blocks/composition-api.d.ts +38 -24
  129. package/dist/builtins/core-blocks/composition-peers.d.ts +26 -4
  130. package/dist/builtins/core-blocks/composition-sources.d.ts +25 -10
  131. package/dist/builtins/core-blocks/core-block-store.d.ts +109 -109
  132. package/dist/builtins/core-blocks/core-blocks.addon.d.ts +72 -72
  133. package/dist/builtins/core-blocks/extract-settings-schema.d.ts +4 -4
  134. package/dist/builtins/core-blocks/index.d.ts +8 -8
  135. package/dist/builtins/device-manager/adoption-job-engine.d.ts +141 -98
  136. package/dist/builtins/device-manager/claimed-status-overlay.d.ts +42 -9
  137. package/dist/builtins/device-manager/contribution-cache.d.ts +56 -56
  138. package/dist/builtins/device-manager/day-night-config-schema.d.ts +26 -12
  139. package/dist/builtins/device-manager/device-aggregation-merge.d.ts +17 -17
  140. package/dist/builtins/device-manager/device-aggregation.d.ts +277 -254
  141. package/dist/builtins/device-manager/device-bindings-store.d.ts +232 -220
  142. package/dist/builtins/device-manager/device-config-contribution.d.ts +29 -29
  143. package/dist/builtins/device-manager/device-config-secrets.d.ts +32 -13
  144. package/dist/builtins/device-manager/device-event-propagator.d.ts +22 -22
  145. package/dist/builtins/device-manager/device-extension-linked-slot.d.ts +17 -17
  146. package/dist/builtins/device-manager/device-form-secrets.d.ts +14 -14
  147. package/dist/builtins/device-manager/device-linked-devices.d.ts +159 -98
  148. package/dist/builtins/device-manager/device-manager.addon.d.ts +223 -197
  149. package/dist/builtins/device-manager/device-meta-actions.d.ts +306 -305
  150. package/dist/builtins/device-manager/device-meta-store.d.ts +100 -90
  151. package/dist/builtins/device-manager/device-meta-types.d.ts +250 -241
  152. package/dist/builtins/device-manager/device-online-fallback.d.ts +30 -30
  153. package/dist/builtins/device-manager/device-projection.d.ts +53 -67
  154. package/dist/builtins/device-manager/device-provider-context.d.ts +109 -94
  155. package/dist/builtins/device-manager/device-queries.d.ts +63 -63
  156. package/dist/builtins/device-manager/device-row-store.d.ts +417 -365
  157. package/dist/builtins/device-manager/device-source-activation.d.ts +91 -49
  158. package/dist/builtins/device-manager/device-state-claim-views.d.ts +76 -61
  159. package/dist/builtins/device-manager/device-state-claims.d.ts +53 -30
  160. package/dist/builtins/device-manager/device-state-mirror.d.ts +256 -264
  161. package/dist/builtins/device-manager/device-sync-resolvers.d.ts +25 -25
  162. package/dist/builtins/device-manager/field-claims-index.d.ts +85 -58
  163. package/dist/builtins/device-manager/field-ownership.d.ts +54 -36
  164. package/dist/builtins/device-manager/fleet-read-census.d.ts +99 -61
  165. package/dist/builtins/device-manager/image-settings-config-schema.d.ts +18 -8
  166. package/dist/builtins/device-manager/index.d.ts +2 -2
  167. package/dist/builtins/device-manager/linked-devices-manual-backfill.d.ts +20 -9
  168. package/dist/builtins/device-manager/location-alignment.d.ts +46 -46
  169. package/dist/builtins/device-manager/migrate-device.d.ts +178 -101
  170. package/dist/builtins/device-manager/migrate-guard.d.ts +66 -34
  171. package/dist/builtins/device-manager/migrate-hardware-state.d.ts +59 -59
  172. package/dist/builtins/device-manager/migrate-reload.d.ts +42 -4
  173. package/dist/builtins/device-manager/migration-refused.d.ts +20 -20
  174. package/dist/builtins/device-manager/mirror-row-writer.d.ts +205 -179
  175. package/dist/builtins/device-manager/recording-onboard-config-schema.d.ts +56 -32
  176. package/dist/builtins/device-manager/removal-fence.d.ts +48 -48
  177. package/dist/builtins/device-manager/runtime-state-persist-gate.d.ts +54 -26
  178. package/dist/builtins/device-manager/secret-config-paths.d.ts +17 -17
  179. package/dist/builtins/device-manager/stale-wrapper-activations.d.ts +52 -25
  180. package/dist/builtins/device-manager/write-lock.d.ts +13 -13
  181. package/dist/builtins/hub-forwarder/hub-forwarder-destination.d.ts +41 -41
  182. package/dist/builtins/hub-forwarder/hub-forwarder.addon.d.ts +13 -12
  183. package/dist/builtins/hub-forwarder/index.d.ts +3 -3
  184. package/dist/builtins/keychain/index.d.ts +1 -1
  185. package/dist/builtins/keychain/key-sources.d.ts +19 -19
  186. package/dist/builtins/keychain/keychain-crypto.d.ts +4 -4
  187. package/dist/builtins/keychain/keychain-reset-trigger.d.ts +13 -13
  188. package/dist/builtins/keychain/keychain-service.d.ts +128 -128
  189. package/dist/builtins/keychain/keychain-store.d.ts +96 -87
  190. package/dist/builtins/keychain/keychain-usage.d.ts +13 -2
  191. package/dist/builtins/keychain/keychain.addon.d.ts +31 -6
  192. package/dist/builtins/keychain/platform-key-source.d.ts +15 -15
  193. package/dist/builtins/keychain/system-held-secrets.d.ts +17 -4
  194. package/dist/builtins/liveness-monitor/index.d.ts +2 -2
  195. package/dist/builtins/liveness-monitor/liveness-checks.d.ts +73 -52
  196. package/dist/builtins/liveness-monitor/liveness-monitor.addon.d.ts +57 -36
  197. package/dist/builtins/local-auth/admin-account-boot.d.ts +14 -14
  198. package/dist/builtins/local-auth/auth-config-reader.d.ts +34 -17
  199. package/dist/builtins/local-auth/auth-schema.d.ts +92 -69
  200. package/dist/builtins/local-auth/index.d.ts +1 -1
  201. package/dist/builtins/local-auth/jwt-signing-key-keeper.d.ts +22 -22
  202. package/dist/builtins/local-auth/local-auth.addon.d.ts +41 -40
  203. package/dist/builtins/local-auth/oauth-grants.d.ts +57 -57
  204. package/dist/builtins/local-auth/oauth-session-manager.d.ts +62 -62
  205. package/dist/builtins/local-network/address-book.d.ts +61 -36
  206. package/dist/builtins/local-network/index.d.ts +2 -2
  207. package/dist/builtins/local-network/ipv6-lan.d.ts +12 -17
  208. package/dist/builtins/local-network/local-hostname.d.ts +10 -10
  209. package/dist/builtins/local-network/local-network.addon.d.ts +259 -258
  210. package/dist/builtins/loki-logging/index.d.ts +4 -4
  211. package/dist/builtins/loki-logging/loki-destination.d.ts +113 -87
  212. package/dist/builtins/loki-logging/loki-logging.addon.d.ts +61 -42
  213. package/dist/builtins/loki-logging/loki-payload.d.ts +82 -39
  214. package/dist/builtins/loki-logging/retire-enabled-flag.d.ts +37 -12
  215. package/dist/builtins/native-metrics/cgroup-memory.d.ts +206 -159
  216. package/dist/builtins/native-metrics/cgroup-pids.d.ts +138 -91
  217. package/dist/builtins/native-metrics/container-memory-series.d.ts +212 -178
  218. package/dist/builtins/native-metrics/gpu-probe.d.ts +9 -9
  219. package/dist/builtins/native-metrics/index.d.ts +2 -2
  220. package/dist/builtins/native-metrics/load-series-config.d.ts +29 -57
  221. package/dist/builtins/native-metrics/load-series-reader.d.ts +52 -26
  222. package/dist/builtins/native-metrics/load-series-store.d.ts +237 -176
  223. package/dist/builtins/native-metrics/native-metrics-provider.d.ts +43 -43
  224. package/dist/builtins/native-metrics/native-metrics.addon.d.ts +230 -230
  225. package/dist/builtins/native-metrics/node-load-ring.d.ts +196 -196
  226. package/dist/builtins/native-metrics/proc-process-table.d.ts +12 -12
  227. package/dist/builtins/native-metrics/process-classification.d.ts +95 -36
  228. package/dist/builtins/native-metrics/thread-cpu-sampler.d.ts +95 -95
  229. package/dist/builtins/platform-probe/coral-accelerators.d.ts +17 -17
  230. package/dist/builtins/platform-probe/index.d.ts +38 -30
  231. package/dist/builtins/platform-probe/inference-config-resolver.d.ts +27 -27
  232. package/dist/builtins/platform-probe/intel-accelerators.d.ts +8 -8
  233. package/dist/builtins/platform-probe/intel-npu.d.ts +30 -30
  234. package/dist/builtins/platform-probe/platform-scorer.d.ts +35 -35
  235. package/dist/builtins/platform-probe/runtime-packages.d.ts +3 -3
  236. package/dist/builtins/remote-access-orchestrator/enabled-providers-reconcile.d.ts +87 -87
  237. package/dist/builtins/remote-access-orchestrator/index.d.ts +1 -1
  238. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.d.ts +66 -35
  239. package/dist/builtins/shared/device-state-changed.d.ts +9 -9
  240. package/dist/builtins/shared/settle-sources.d.ts +16 -16
  241. package/dist/builtins/snapshot/index.d.ts +2 -2
  242. package/dist/builtins/snapshot/snapshot-cache.d.ts +92 -92
  243. package/dist/builtins/snapshot/snapshot-coalescing.d.ts +108 -108
  244. package/dist/builtins/snapshot/snapshot-courtesy.d.ts +48 -48
  245. package/dist/builtins/snapshot/snapshot-durable-store.d.ts +32 -32
  246. package/dist/builtins/snapshot/snapshot-fatigue.d.ts +34 -34
  247. package/dist/builtins/snapshot/snapshot-grab-pick.d.ts +14 -14
  248. package/dist/builtins/snapshot/snapshot-link-url.d.ts +49 -49
  249. package/dist/builtins/snapshot/snapshot-media-handler.d.ts +97 -97
  250. package/dist/builtins/snapshot/snapshot-resize.d.ts +64 -103
  251. package/dist/builtins/snapshot/snapshot.addon.d.ts +569 -568
  252. package/dist/builtins/sqlite-storage/analyze-stats.d.ts +73 -29
  253. package/dist/builtins/sqlite-storage/config-store.d.ts +6 -6
  254. package/dist/builtins/sqlite-storage/device-store.d.ts +16 -16
  255. package/dist/builtins/sqlite-storage/filesystem-browse-provider.d.ts +23 -23
  256. package/dist/builtins/sqlite-storage/filesystem-storage-provider.d.ts +79 -79
  257. package/dist/builtins/sqlite-storage/filesystem-storage.addon.d.ts +27 -26
  258. package/dist/builtins/sqlite-storage/filter-compiler.d.ts +107 -107
  259. package/dist/builtins/sqlite-storage/index.d.ts +12 -12
  260. package/dist/builtins/sqlite-storage/integration-registry.d.ts +37 -37
  261. package/dist/builtins/sqlite-storage/path-guard.d.ts +5 -5
  262. package/dist/builtins/sqlite-storage/prefix-range.d.ts +44 -44
  263. package/dist/builtins/sqlite-storage/query-bounds.d.ts +100 -106
  264. package/dist/builtins/sqlite-storage/query-profiler.d.ts +217 -217
  265. package/dist/builtins/sqlite-storage/retired-collections.d.ts +124 -55
  266. package/dist/builtins/sqlite-storage/retired-settings-keys.d.ts +239 -189
  267. package/dist/builtins/sqlite-storage/shm-lock-canary.d.ts +41 -41
  268. package/dist/builtins/sqlite-storage/sqlite-pragmas.d.ts +162 -162
  269. package/dist/builtins/sqlite-storage/sqlite-settings-backend.d.ts +458 -458
  270. package/dist/builtins/sqlite-storage/sqlite-settings.addon.d.ts +59 -58
  271. package/dist/builtins/sqlite-storage/sqlite-snapshot-protocol.d.ts +37 -32
  272. package/dist/builtins/sqlite-storage/sqlite-snapshot-worker.d.ts +19 -19
  273. package/dist/builtins/sqlite-storage/sqlite-snapshotter.d.ts +76 -76
  274. package/dist/builtins/sqlite-storage/statement-shape.d.ts +54 -54
  275. package/dist/builtins/sqlite-storage/table-sizes.d.ts +71 -71
  276. package/dist/builtins/sqlite-storage/vector-index-shared.d.ts +63 -54
  277. package/dist/builtins/sqlite-storage/vector-index-vec.d.ts +133 -96
  278. package/dist/builtins/sqlite-storage/wal-checkpoint-policy.d.ts +161 -161
  279. package/dist/builtins/sqlite-storage/wal-checkpointer.d.ts +60 -60
  280. package/dist/builtins/sqlite-storage/wal-maintenance.d.ts +94 -94
  281. package/dist/builtins/storage-orchestrator/access-guards.d.ts +37 -26
  282. package/dist/builtins/storage-orchestrator/data-store-dispatch.d.ts +33 -18
  283. package/dist/builtins/storage-orchestrator/drain-ratchet.d.ts +85 -85
  284. package/dist/builtins/storage-orchestrator/drain-state-store.d.ts +20 -10
  285. package/dist/builtins/storage-orchestrator/hub-settings-forward.d.ts +113 -53
  286. package/dist/builtins/storage-orchestrator/index.d.ts +7 -7
  287. package/dist/builtins/storage-orchestrator/location-occupancy-slice.d.ts +64 -40
  288. package/dist/builtins/storage-orchestrator/location-occupancy.d.ts +14 -14
  289. package/dist/builtins/storage-orchestrator/location-protection.d.ts +13 -13
  290. package/dist/builtins/storage-orchestrator/location-repoint-move.d.ts +44 -44
  291. package/dist/builtins/storage-orchestrator/location-root-collision.d.ts +61 -25
  292. package/dist/builtins/storage-orchestrator/location-secrets.d.ts +99 -58
  293. package/dist/builtins/storage-orchestrator/location-store.d.ts +56 -47
  294. package/dist/builtins/storage-orchestrator/location-volume-capacity.d.ts +37 -37
  295. package/dist/builtins/storage-orchestrator/provider-discovery.d.ts +20 -6
  296. package/dist/builtins/storage-orchestrator/storage-cleanup-coordinator.d.ts +51 -51
  297. package/dist/builtins/storage-orchestrator/storage-migration-coordinator.d.ts +224 -224
  298. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.d.ts +292 -292
  299. package/dist/builtins/storage-orchestrator/storage-orchestrator.service.d.ts +431 -450
  300. package/dist/builtins/storage-orchestrator/storage-pressure-manager.d.ts +104 -104
  301. package/dist/builtins/system-backup/backup-encryption.d.ts +60 -23
  302. package/dist/builtins/system-backup/system-backup.service.d.ts +240 -240
  303. package/dist/builtins/system-config/cluster-secret-keeper.d.ts +54 -34
  304. package/dist/builtins/system-config/index.d.ts +2 -2
  305. package/dist/builtins/system-config/mesh-actions.d.ts +2 -30
  306. package/dist/builtins/system-config/system-config.addon.d.ts +57 -93
  307. package/dist/builtins/system-config/system-config.addon.js +46 -33
  308. package/dist/builtins/system-config/system-config.addon.mjs +46 -33
  309. package/dist/builtins/winston-logging/index.d.ts +3 -3
  310. package/dist/builtins/winston-logging/winston-destination.d.ts +15 -15
  311. package/dist/builtins/winston-logging/winston-logging.addon.d.ts +14 -13
  312. package/dist/{child-cap-dispatch-nURMuVTX.js → child-cap-dispatch-Bnr8brru.js} +18 -0
  313. package/dist/{child-cap-dispatch-B1gyE35b.mjs → child-cap-dispatch-mHO_6r0G.mjs} +1 -1
  314. package/dist/download/hosted-model-revisions.d.ts +8 -8
  315. package/dist/download/model-download-service.d.ts +32 -32
  316. package/dist/download/model-downloader.d.ts +88 -88
  317. package/dist/events/event-bus.d.ts +6 -6
  318. package/dist/events/system-event-bus.d.ts +11 -11
  319. package/dist/feature/feature-manager.d.ts +6 -6
  320. package/dist/http/asset-compression.d.ts +35 -73
  321. package/dist/http/authenticated-file-server.d.ts +32 -32
  322. package/dist/http/data-plane-registry.d.ts +49 -39
  323. package/dist/http/file-data-plane.d.ts +14 -14
  324. package/dist/http/lan-http-bind.d.ts +24 -13
  325. package/dist/http/reverse-proxy.d.ts +36 -24
  326. package/dist/index.d.ts +137 -137
  327. package/dist/index.js +4 -3
  328. package/dist/index.mjs +2 -4
  329. package/dist/kernel/addon-class-resolver.d.ts +1 -1
  330. package/dist/kernel/addon-engine-manager.d.ts +20 -20
  331. package/dist/kernel/addon-health-monitor.d.ts +151 -151
  332. package/dist/kernel/addon-installer.d.ts +609 -609
  333. package/dist/kernel/addon-loader.d.ts +133 -133
  334. package/dist/kernel/addon-manifest.d.ts +118 -118
  335. package/dist/kernel/addon-residue.d.ts +28 -32
  336. package/dist/kernel/array-buffer-census.d.ts +84 -88
  337. package/dist/kernel/bootstrap-config.d.ts +3 -3
  338. package/dist/kernel/cap-router-builder.d.ts +145 -101
  339. package/dist/kernel/capability-handle.d.ts +41 -41
  340. package/dist/kernel/capability-registry.d.ts +588 -576
  341. package/dist/kernel/config-manager.d.ts +199 -199
  342. package/dist/kernel/config-schema.d.ts +132 -128
  343. package/dist/kernel/custom-action-registry.d.ts +25 -25
  344. package/dist/kernel/deps/addon-deps-manager.d.ts +17 -17
  345. package/dist/kernel/deps/closure-dedupe.d.ts +76 -76
  346. package/dist/kernel/deps/ensure-addon-natives.d.ts +34 -34
  347. package/dist/kernel/deps/ensure-native-prebuilds.d.ts +25 -25
  348. package/dist/kernel/deps/manifest-native-deps.d.ts +38 -38
  349. package/dist/kernel/deps/manifest-python-deps.d.ts +18 -18
  350. package/dist/kernel/deps/manifest-system-deps.d.ts +13 -13
  351. package/dist/kernel/deps/npm-command.d.ts +45 -45
  352. package/dist/kernel/deps/system-package-allowlist.d.ts +9 -9
  353. package/dist/kernel/deps/system-package-broker.d.ts +20 -20
  354. package/dist/kernel/deps/system-package-client.d.ts +3 -3
  355. package/dist/kernel/device-registry.d.ts +27 -27
  356. package/dist/kernel/event-loop-stall-monitor.d.ts +33 -33
  357. package/dist/kernel/event-plane-report.d.ts +174 -174
  358. package/dist/kernel/fs-utils.d.ts +70 -70
  359. package/dist/kernel/gc-census.d.ts +119 -119
  360. package/dist/kernel/heap-spaces.d.ts +87 -87
  361. package/dist/kernel/heap-watch.d.ts +706 -706
  362. package/dist/kernel/host-externals.d.ts +8 -8
  363. package/dist/kernel/hwaccel/hwaccel-resolver.d.ts +27 -27
  364. package/dist/kernel/index.d.ts +115 -113
  365. package/dist/kernel/inference/inference-resolver.d.ts +13 -13
  366. package/dist/kernel/infra-capabilities.d.ts +7 -7
  367. package/dist/kernel/isolated-builtin-phase.d.ts +42 -42
  368. package/dist/kernel/lifecycle/job-journal.d.ts +17 -17
  369. package/dist/kernel/lifecycle/lifecycle-job-engine.d.ts +99 -99
  370. package/dist/kernel/lifecycle/staging-area.d.ts +22 -22
  371. package/dist/kernel/moleculer/addon-context-factory.d.ts +90 -89
  372. package/dist/kernel/moleculer/addon-data-plane-facility.d.ts +12 -12
  373. package/dist/kernel/moleculer/addon-deploy-source.d.ts +11 -11
  374. package/dist/kernel/moleculer/addon-peer-bytes-facility.d.ts +18 -18
  375. package/dist/kernel/moleculer/addon-service-factory.d.ts +41 -41
  376. package/dist/kernel/moleculer/agent-mesh-authenticator.d.ts +60 -33
  377. package/dist/kernel/moleculer/agent-ui-unlock.d.ts +30 -30
  378. package/dist/kernel/moleculer/broker-factory.d.ts +61 -61
  379. package/dist/kernel/moleculer/cap-usage-registry.d.ts +108 -153
  380. package/dist/kernel/moleculer/capabilities-access.d.ts +19 -19
  381. package/dist/kernel/moleculer/child-addon-call-dispatch.d.ts +43 -43
  382. package/dist/kernel/moleculer/child-cap-descriptors.d.ts +26 -26
  383. package/dist/kernel/moleculer/child-cap-dispatch.d.ts +52 -52
  384. package/dist/kernel/moleculer/children-batch-loader.d.ts +86 -34
  385. package/dist/kernel/moleculer/cluster-secret.d.ts +19 -19
  386. package/dist/kernel/moleculer/core-cap-service.d.ts +53 -53
  387. package/dist/kernel/moleculer/crash-supervisor.d.ts +39 -39
  388. package/dist/kernel/moleculer/device-cap-proxy.d.ts +51 -51
  389. package/dist/kernel/moleculer/device-event-ring.d.ts +117 -75
  390. package/dist/kernel/moleculer/event-bus-core.d.ts +171 -159
  391. package/dist/kernel/moleculer/event-bus.d.ts +73 -73
  392. package/dist/kernel/moleculer/hub-log-forwarder.d.ts +30 -30
  393. package/dist/kernel/moleculer/hub-service.d.ts +42 -42
  394. package/dist/kernel/moleculer/init-watchdog.d.ts +49 -49
  395. package/dist/kernel/moleculer/mesh-access-middleware.d.ts +36 -21
  396. package/dist/kernel/moleculer/mesh-auth-mode.d.ts +33 -39
  397. package/dist/kernel/moleculer/mesh-authenticator.d.ts +58 -58
  398. package/dist/kernel/moleculer/mesh-auto-enforce.d.ts +38 -18
  399. package/dist/kernel/moleculer/mesh-join-client.d.ts +67 -45
  400. package/dist/kernel/moleculer/mesh-join-proof.d.ts +8 -8
  401. package/dist/kernel/moleculer/mesh-mtls/constants.d.ts +1 -1
  402. package/dist/kernel/moleculer/mesh-mtls/index.d.ts +10 -10
  403. package/dist/kernel/moleculer/mesh-mtls/mesh-ca-keeper.d.ts +43 -38
  404. package/dist/kernel/moleculer/mesh-mtls/mesh-ca.d.ts +29 -20
  405. package/dist/kernel/moleculer/mesh-mtls/mesh-clear-port.d.ts +32 -32
  406. package/dist/kernel/moleculer/mesh-mtls/mesh-crl.d.ts +11 -11
  407. package/dist/kernel/moleculer/mesh-mtls/mesh-enroll.d.ts +19 -16
  408. package/dist/kernel/moleculer/mesh-mtls/mesh-join-token.d.ts +40 -40
  409. package/dist/kernel/moleculer/mesh-mtls/mesh-tls-enabler.d.ts +5 -1
  410. package/dist/kernel/moleculer/mesh-mtls/tls-tcp-transporter.d.ts +131 -130
  411. package/dist/kernel/moleculer/mesh-queue-report.d.ts +39 -39
  412. package/dist/kernel/moleculer/node-registry.d.ts +120 -120
  413. package/dist/kernel/moleculer/process-context.d.ts +2 -2
  414. package/dist/kernel/moleculer/process-service.d.ts +168 -168
  415. package/dist/kernel/moleculer/provider-registry.d.ts +9 -9
  416. package/dist/kernel/moleculer/readiness-context.d.ts +58 -58
  417. package/dist/kernel/moleculer/readiness-service.d.ts +31 -16
  418. package/dist/kernel/moleculer/register-framework-resolver.d.ts +6 -6
  419. package/dist/kernel/moleculer/register-node-client.d.ts +34 -27
  420. package/dist/kernel/moleculer/remote-logger.d.ts +29 -29
  421. package/dist/kernel/moleculer/resilient-cap-call.d.ts +21 -21
  422. package/dist/kernel/moleculer/runner-native-allocator.d.ts +95 -95
  423. package/dist/kernel/moleculer/runner-process-group.d.ts +57 -57
  424. package/dist/kernel/moleculer/runtime-state-load.d.ts +21 -11
  425. package/dist/kernel/moleculer/settings-read-guard.d.ts +39 -39
  426. package/dist/kernel/moleculer/stream-probe-service.d.ts +25 -6
  427. package/dist/kernel/moleculer/trpc-links.d.ts +203 -203
  428. package/dist/kernel/moleculer/typed-array-serde.d.ts +9 -20
  429. package/dist/kernel/moleculer/worker-device-restore.d.ts +8 -8
  430. package/dist/kernel/outbound-queue-watch.d.ts +74 -74
  431. package/dist/kernel/process-cpu-census.d.ts +55 -55
  432. package/dist/kernel/provider-kind-drift.d.ts +17 -8
  433. package/dist/kernel/restart-coordinator.d.ts +71 -71
  434. package/dist/kernel/settings-door-view.d.ts +36 -25
  435. package/dist/kernel/settings-read-error.d.ts +29 -31
  436. package/dist/kernel/settings-view-types.d.ts +100 -95
  437. package/dist/kernel/socket-plane-report.d.ts +214 -153
  438. package/dist/kernel/status-overlay.d.ts +31 -11
  439. package/dist/kernel/storage-location-registry.d.ts +50 -50
  440. package/dist/kernel/store-settings-view.d.ts +13 -13
  441. package/dist/kernel/system-settings-mirror.d.ts +40 -28
  442. package/dist/kernel/system-settings-policy.d.ts +15 -34
  443. package/dist/kernel/transport/cap-action-census.d.ts +183 -183
  444. package/dist/kernel/transport/cap-action-name.d.ts +84 -84
  445. package/dist/kernel/transport/cap-child-index.d.ts +41 -41
  446. package/dist/kernel/transport/cap-route-resolver.d.ts +237 -212
  447. package/dist/kernel/transport/cap-route.d.ts +139 -139
  448. package/dist/kernel/transport/cap-routing-hints.d.ts +37 -37
  449. package/dist/kernel/transport/child-cap-protocol.d.ts +245 -245
  450. package/dist/kernel/transport/claimed-get-status.d.ts +30 -6
  451. package/dist/kernel/transport/create-local-transport.d.ts +5 -5
  452. package/dist/kernel/transport/frame-codec.d.ts +109 -109
  453. package/dist/kernel/transport/hub-cap-forward.d.ts +81 -59
  454. package/dist/kernel/transport/index.d.ts +36 -36
  455. package/dist/kernel/transport/local-child-client.d.ts +184 -184
  456. package/dist/kernel/transport/local-child-registry.d.ts +592 -592
  457. package/dist/kernel/transport/local-endpoint-path.d.ts +4 -4
  458. package/dist/kernel/transport/local-transport.d.ts +92 -92
  459. package/dist/kernel/transport/parent-unowned-call.d.ts +266 -237
  460. package/dist/kernel/transport/peer-answered-error.d.ts +14 -14
  461. package/dist/kernel/transport/socket-channel.d.ts +110 -110
  462. package/dist/kernel/transport/socket-traffic.d.ts +96 -96
  463. package/dist/kernel/transport/uds-event-bridge.d.ts +77 -50
  464. package/dist/kernel/transport/uds-event-bus.d.ts +75 -26
  465. package/dist/kernel/transport/uds-local-transport.d.ts +14 -14
  466. package/dist/kernel/transport/uds-log-ingest.d.ts +38 -23
  467. package/dist/kernel/transport/uds-logger.d.ts +33 -33
  468. package/dist/kernel/utils/ring-buffer.d.ts +12 -12
  469. package/dist/kernel/workspace-detect.d.ts +7 -7
  470. package/dist/lifecycle/lifecycle-state-machine.d.ts +24 -24
  471. package/dist/logging/formatter.d.ts +52 -25
  472. package/dist/logging/log-manager.d.ts +133 -133
  473. package/dist/logging/log-redactor.d.ts +22 -1
  474. package/dist/logging/log-ring-buffer.d.ts +57 -57
  475. package/dist/logging/logging-gate.d.ts +69 -25
  476. package/dist/logging/logging-gate.singleton.d.ts +12 -1
  477. package/dist/logging/partitioned-log-buffer.d.ts +161 -161
  478. package/dist/logging/scoped-logger.d.ts +14 -14
  479. package/dist/network/network-quality.d.ts +8 -8
  480. package/dist/notification/notification-service.d.ts +37 -37
  481. package/dist/notification/toast-service.d.ts +18 -18
  482. package/dist/pipeline/engine-manager-resolver.d.ts +12 -12
  483. package/dist/pipeline/pipeline-runner.d.ts +6 -6
  484. package/dist/pipeline/pipeline-validator.d.ts +8 -8
  485. package/dist/process/proc-stat.d.ts +51 -51
  486. package/dist/process/resource-monitor.d.ts +19 -19
  487. package/dist/python/python-env-manager.d.ts +10 -10
  488. package/dist/repl/interfaces.d.ts +21 -21
  489. package/dist/repl/repl-engine.d.ts +6 -6
  490. package/dist/storage/fs-storage-backend.d.ts +35 -35
  491. package/dist/storage/storage-location-manager.d.ts +21 -21
  492. package/dist/storage/storage-manager.d.ts +68 -68
  493. package/dist/tls/boot-tls.d.ts +24 -24
  494. package/dist/tls/cert-evaluation.d.ts +25 -25
  495. package/dist/tls/cert-identity.d.ts +39 -39
  496. package/dist/tls/cert-issue.d.ts +37 -17
  497. package/dist/tls/cert-manager.d.ts +86 -84
  498. package/dist/tls/https-listener.d.ts +16 -16
  499. package/dist/tls/index.d.ts +8 -8
  500. package/dist/tls/tls-actions.d.ts +18 -18
  501. package/dist/tls/tls-status.d.ts +15 -15
  502. package/dist/tls/uploaded-cert.d.ts +9 -9
  503. package/package.json +9 -3
@@ -1,487 +1,487 @@
1
- import { BulkRecord, CollectionColumn, CollectionIndex, DataStoreEngineInfo, HistogramBucket, IScopedLogger, ISettingsBackend, QueryFilter, SettingsAggregateInput, SettingsAggregateResult, SettingsCountInput, SettingsDeleteInput, SettingsGetInput, SettingsHistogramInput, SettingsInsertInput, SettingsIsEmptyInput, SettingsQueryInput, SettingsRecord, SettingsSetInput, SettingsUpdateInput, SettingsUpsertInput } from '@camstack/types';
2
- import { default as Database } from 'better-sqlite3';
3
- import { MutationFilterInput } from './filter-compiler.js';
4
- import { SqliteOpProfiler } from './query-profiler.js';
1
+ import type { BulkRecord, CollectionColumn, CollectionIndex, DataStoreEngineInfo, HistogramBucket, IScopedLogger, ISettingsBackend, QueryFilter, SettingsAggregateInput, SettingsAggregateResult, SettingsCountInput, SettingsDeleteInput, SettingsGetInput, SettingsHistogramInput, SettingsInsertInput, SettingsIsEmptyInput, SettingsQueryInput, SettingsRecord, SettingsSetInput, SettingsUpdateInput, SettingsUpsertInput } from "@camstack/types";
2
+ import Database from "better-sqlite3";
3
+ import { type MutationFilterInput } from "./filter-compiler.js";
4
+ import { SqliteOpProfiler } from "./query-profiler.js";
5
5
  /** Input for {@link SqliteSettingsBackend.insertMany}. */
6
6
  interface SettingsInsertManyInput {
7
- readonly namespace?: string;
8
- readonly collection: string;
9
- readonly records: readonly BulkRecord[];
7
+ readonly namespace?: string;
8
+ readonly collection: string;
9
+ readonly records: readonly BulkRecord[];
10
10
  }
11
11
  interface SettingsInsertManyResult {
12
- readonly inserted: number;
12
+ readonly inserted: number;
13
13
  }
14
14
  /** Input for {@link SqliteSettingsBackend.deleteWhere}. */
15
15
  interface SettingsDeleteWhereInput {
16
- readonly namespace?: string;
17
- readonly collection: string;
18
- readonly filter: MutationFilterInput;
16
+ readonly namespace?: string;
17
+ readonly collection: string;
18
+ readonly filter: MutationFilterInput;
19
19
  }
20
20
  interface SettingsDeleteWhereResult {
21
- readonly deleted: number;
21
+ readonly deleted: number;
22
22
  }
23
23
  /** Input for {@link SqliteSettingsBackend.updateWhere}. */
24
24
  interface SettingsUpdateWhereInput {
25
- readonly namespace?: string;
26
- readonly collection: string;
27
- readonly filter: MutationFilterInput;
28
- readonly data: Readonly<Record<string, unknown>>;
25
+ readonly namespace?: string;
26
+ readonly collection: string;
27
+ readonly filter: MutationFilterInput;
28
+ readonly data: Readonly<Record<string, unknown>>;
29
29
  }
30
30
  interface SettingsUpdateWhereResult {
31
- readonly updated: number;
31
+ readonly updated: number;
32
32
  }
33
33
  /** What {@link SqliteSettingsBackend.dropRetiredTable} destroyed. */
34
34
  export interface DroppedTable {
35
- /** Rows the table held at the moment it was dropped. */
36
- readonly rows: number;
35
+ /** Rows the table held at the moment it was dropped. */
36
+ readonly rows: number;
37
37
  }
38
38
  /**
39
- * The addon that owns a scoped row, lifted out of the filter that names it.
40
- *
41
- * `(op, collection)` cannot name a culprit: the 60 s window of 2026-08-25 read
42
- * `query addon-device-settings` 67 660 times — 1 128 a second on a
43
- * single-threaded synchronous engine — and the report could say what was
44
- * running but never who. The caller identity is not reachable from this
45
- * process (a cap handler receives an input, not a caller), but for the scoped
46
- * collections it does not need to be: the id IS `<addonId>:<deviceId>.<field>`,
47
- * so a filter that names an id names its owner.
48
- *
49
- * Attributes NOTHING when the id is unscoped or absent. A storm blamed on the
50
- * wrong addon is worse than one with no name on it — the wrong name gets acted
51
- * on. Same source and same shape as {@link deviceIdOf}, which already lifts the
52
- * device out of this very filter.
53
- */
39
+ * The addon that owns a scoped row, lifted out of the filter that names it.
40
+ *
41
+ * `(op, collection)` cannot name a culprit: the 60 s window of 2026-08-25 read
42
+ * `query addon-device-settings` 67 660 times — 1 128 a second on a
43
+ * single-threaded synchronous engine — and the report could say what was
44
+ * running but never who. The caller identity is not reachable from this
45
+ * process (a cap handler receives an input, not a caller), but for the scoped
46
+ * collections it does not need to be: the id IS `<addonId>:<deviceId>.<field>`,
47
+ * so a filter that names an id names its owner.
48
+ *
49
+ * Attributes NOTHING when the id is unscoped or absent. A storm blamed on the
50
+ * wrong addon is worse than one with no name on it — the wrong name gets acted
51
+ * on. Same source and same shape as {@link deviceIdOf}, which already lifts the
52
+ * device out of this very filter.
53
+ */
54
54
  export declare function scopeOwnerOf(filter: QueryFilter | undefined): {
55
- owner?: string;
55
+ owner?: string;
56
56
  };
57
57
  /**
58
- * Stable identity of a declared schema — every property that changes the DDL
59
- * or the set of columns a filter can name.
60
- *
61
- * Deliberately covers `indexes` too: an added index is as invisible to a
62
- * name-only memo as an added column, and `CREATE INDEX IF NOT EXISTS` is
63
- * cheap enough that re-running it costs nothing.
64
- */
58
+ * Stable identity of a declared schema — every property that changes the DDL
59
+ * or the set of columns a filter can name.
60
+ *
61
+ * Deliberately covers `indexes` too: an added index is as invisible to a
62
+ * name-only memo as an added column, and `CREATE INDEX IF NOT EXISTS` is
63
+ * cheap enough that re-running it costs nothing.
64
+ */
65
65
  /**
66
- * A `query` asked to read a column the collection cannot serve. Distinct type
67
- * so a caller can map it to a 400 — it is always a programming error in the
68
- * caller, never a condition of the data.
69
- */
66
+ * A `query` asked to read a column the collection cannot serve. Distinct type
67
+ * so a caller can map it to a 400 — it is always a programming error in the
68
+ * caller, never a condition of the data.
69
+ */
70
70
  export declare class UnprojectableColumnError extends Error {
71
- constructor(message: string);
71
+ constructor(message: string);
72
72
  }
73
73
  /**
74
- * SQLite implementation of ISettingsBackend.
75
- *
76
- * Every collection is structured: declared at boot (canonical KV
77
- * collections) or via `declareCollection` (typed schemas like
78
- * `pipeline-analytics:tracks`). The legacy auto-create-on-first-access
79
- * path was removed — see commit history for the migration. Operations
80
- * on undeclared collections throw at runtime so callers fail fast.
81
- *
82
- * WAL mode for concurrent reads.
83
- */
74
+ * SQLite implementation of ISettingsBackend.
75
+ *
76
+ * Every collection is structured: declared at boot (canonical KV
77
+ * collections) or via `declareCollection` (typed schemas like
78
+ * `pipeline-analytics:tracks`). The legacy auto-create-on-first-access
79
+ * path was removed — see commit history for the migration. Operations
80
+ * on undeclared collections throw at runtime so callers fail fast.
81
+ *
82
+ * WAL mode for concurrent reads.
83
+ */
84
84
  export declare class SqliteSettingsBackend implements ISettingsBackend {
85
- private readonly dbPath;
86
- private db;
87
- /**
88
- * Table name → fingerprint of the schema this process last materialised.
89
- *
90
- * Keyed by FINGERPRINT, not by name, and that is the whole point. An addon
91
- * declares its schema at every boot, but the backend lives in hub-main,
92
- * which outlives an addon respawn: `camstack deploy` restarts the addon
93
- * runner and NOT hub-main. A name-only memo therefore made the second
94
- * declaration of a table a no-op FOREVER — a redeployed addon whose schema
95
- * had gained a column never got the `ALTER TABLE … ADD COLUMN`, and, because
96
- * `compileFilter` silently drops a predicate naming a column the collection
97
- * cannot express (select mode), the missing column read as "matches
98
- * everything" instead of failing. That is how `pipeline-analytics:tracks`
99
- * ran for a whole release with no `retrainStatus`: the retention sweep's
100
- * `whereIn: { retrainStatus: ['none','trained'] }` pin evaporated, so every
101
- * operator-staged track was eligible for deletion, and `countStaging`
102
- * reported the entire history as staged.
103
- */
104
- private readonly structuredTables;
105
- /** Map from scoped collection name → set of column names (non-id) that
106
- * the structured schema owns. Routes set/get/insert/update/query to
107
- * typed columns. Every collection MUST be declared here before use. */
108
- private readonly declaredCollections;
109
- private readonly runtimeDefaults;
110
- /**
111
- * Canonical key/value collections — declared with a `(id TEXT PK,
112
- * data TEXT NOT NULL)` schema at boot so existing JSON-blob rows
113
- * keep working through the structured path. Generates SQL identical
114
- * to the previous legacy path; only the routing is unified.
115
- */
116
- private static readonly CANONICAL_KV_COLLECTIONS;
117
- /**
118
- * Optional, because the engine is constructed in places that have no addon
119
- * context (migrations, one-shot tools, most specs). It is NOT optional in
120
- * production: `sqlite-settings.addon.ts` passes one, and without it a row cap
121
- * being hit would be silent — which is the failure mode the cap exists to
122
- * avoid replacing.
123
- */
124
- private readonly logger;
125
- /**
126
- * Per-statement timing. Absent only where the backend is constructed without
127
- * a logger (migrations, one-shot tools, most specs) — production always has
128
- * one, because a runner that stalls with no record of what it was executing
129
- * is the failure this was built for (`query-profiler.ts`).
130
- */
131
- private readonly profiler;
132
- constructor(dbPath: string, runtimeDefaults?: Record<string, unknown>, logger?: IScopedLogger);
133
- initialize(): Promise<void>;
134
- private requireDeclared;
135
- /**
136
- * Decode a single column value off a SQLite row into the JS shape the
137
- * caller's schema expects. Handles:
138
- * - BOOLEAN columns: `0|1` → `false|true`
139
- * - JSON columns (TEXT starting with `{` / `[`): parse
140
- * - everything else: pass-through with null coalescing
141
- */
142
- private decodeColumnValue;
143
- shutdown(): Promise<void>;
144
- /**
145
- * The statement profiler, so an addon sharing this handle (the sqlite-vec
146
- * index) reports into the SAME window. Two profilers on one thread would
147
- * each describe a fraction of the stall and neither would add up to it.
148
- */
149
- getProfiler(): SqliteOpProfiler | undefined;
150
- /**
151
- * `data-store-provider` self-description — how the orchestrator names
152
- * this engine in a log line, and (once collections declare an engine)
153
- * how it picks between registrants.
154
- */
155
- getEngineInfo(): Promise<DataStoreEngineInfo>;
156
- get({ namespace, collection, key }: SettingsGetInput): Promise<unknown>;
157
- set({ namespace, collection, key, value }: SettingsSetInput): Promise<void>;
158
- query<T extends object = Record<string, unknown>>({ namespace, collection, filter, columns, }: SettingsQueryInput): Promise<readonly SettingsRecord<T>[]>;
159
- insert<T extends object = Record<string, unknown>>({ namespace, collection, record, }: SettingsInsertInput<T>): Promise<{
160
- readonly id: string | number;
161
- }>;
162
- /**
163
- * Make a SLOT hold this row, and answer with the id the row HAS — one
164
- * statement, `INSERT … ON CONFLICT(<slot>) DO UPDATE … RETURNING <pk>`.
165
- *
166
- * See `settings-store.cap.ts`'s `upsert` docblock for why the store needed a
167
- * slot that is not the primary key (D482). Three things are load-bearing
168
- * here:
169
- *
170
- * - **`RETURNING` and not `lastInsertRowid`.** On the UPDATE branch
171
- * `lastInsertRowid` is whatever the connection last inserted — a
172
- * different row, or a different TABLE. It answers confidently and wrongly,
173
- * which is worse than not answering. `RETURNING` names the row this
174
- * statement actually touched, on both branches.
175
- * - **The conflict columns are checked against the declaration** before they
176
- * reach the SQL. An undeclared name would be interpolated into DDL-shaped
177
- * text; it is refused, by the same rule and for the same reason
178
- * {@link resolveProjection} throws on an unprojectable column.
179
- * - **The primary key is never part of the SET list.** An `INTEGER` rowid
180
- * alias is not in `row` at all, and on a TEXT key rewriting the id of the
181
- * row we just matched is the one update that cannot be right.
182
- */
183
- upsert<T extends object = Record<string, unknown>>({ namespace, collection, conflict, record, }: SettingsUpsertInput<T>): Promise<{
184
- readonly id: string | number;
185
- }>;
186
- /**
187
- * Insert a batch in ONE transaction, on ONE prepared statement.
188
- *
189
- * The write-side twin of {@link deleteWhere}. Every row in the batch shares
190
- * a single column list, which is what makes one `prepare` legal: rows are
191
- * normalised to the collection's DECLARED column set, so a row that omits a
192
- * column binds `null` for it rather than producing a second statement shape.
193
- *
194
- * All or nothing — `better-sqlite3`'s `transaction()` rolls the whole batch
195
- * back on any throw. A caller writing one process sample gets one COMMIT,
196
- * which is the entire point: 76 rows every 10 s is 7.6 rows/s, and 7.6
197
- * separate commits per second on the connection that also serves every
198
- * cluster-wide configuration read is a constant load nobody asked for.
199
- */
200
- insertMany({ namespace, collection, records, }: SettingsInsertManyInput): Promise<SettingsInsertManyResult>;
201
- update({ namespace, collection, id, data }: SettingsUpdateInput): Promise<void>;
202
- delete({ namespace, collection, key }: SettingsDeleteInput): Promise<void>;
203
- /**
204
- * Bulk delete. One statement, whatever the row count — this is what every
205
- * retention path in the system was hand-rolling as a select-then-delete
206
- * loop. The filter is compiled in `mutate` mode, so an unresolvable
207
- * predicate or an empty one throws before any SQL exists.
208
- */
209
- deleteWhere({ namespace, collection, filter, }: SettingsDeleteWhereInput): Promise<SettingsDeleteWhereResult>;
210
- /**
211
- * Bulk update. Same filter contract as {@link deleteWhere}.
212
- *
213
- * Every key of `data` must be a REAL column. A KV-shaped collection keeps
214
- * its fields inside a JSON blob, and setting one would need `json_set` with
215
- * read-modify-write semantics this method does not have — so it refuses
216
- * rather than writing a column that does not exist, which is what the
217
- * uncapped `tableUpdate` would have done.
218
- */
219
- updateWhere({ namespace, collection, filter, data, }: SettingsUpdateWhereInput): Promise<SettingsUpdateWhereResult>;
220
- /**
221
- * How many rows match — about the SAME rows {@link query} would return.
222
- *
223
- * That agreement is the entire contract, and until now it did not hold. This
224
- * was the FOURTH hand-rolled copy of the filter logic (after `query`, the
225
- * bulk mutations and `histogram`) and it compiled only `where`:
226
- * `whereBetween`, `whereIn` and `whereNot` were dropped silently, so the
227
- * count was not slow, it was WRONG, and always wrong in the same direction —
228
- * too big, because every dropped predicate is a predicate that would have
229
- * excluded rows.
230
- *
231
- * Two live callers decided on it. `TrackStore.countStaging({ deviceId,
232
- * olderThanMs })` sends the cutoff as `whereBetween: { lastSeen: [0, …] }`
233
- * and got the device's whole staging history instead. The notification-centre
234
- * artefact gallery pages on `total` from this method while listing through
235
- * `query`, and its filter is almost entirely `whereIn`/`whereBetween`
236
- * (visibility, kind, device, time window, expiry) — so `total` counted rows
237
- * the page could never show, including other users'.
238
- *
239
- * `measure` mode. `count` compiles the same predicates `query` does — the
240
- * two must never disagree about WHICH rows they are talking about — but it
241
- * refuses a predicate it cannot express rather than skipping it. `query`
242
- * hands back rows and a caller can see the filter did not bite; a count
243
- * hands back a number, and the whole collection and the intended subset are
244
- * the same shape.
245
- */
246
- count({ namespace, collection, filter }: SettingsCountInput): Promise<number>;
247
- /**
248
- * `COUNT(*)` and one SUM/MIN/MAX per requested field, in ONE statement.
249
- *
250
- * Result slots are aliased POSITIONALLY (`a0`, `a1`, …) and mapped back by
251
- * index: `as` is caller text and must never reach SQL as an identifier, and
252
- * the column name is validated through {@link fieldExprFor} exactly like a
253
- * projection — an unresolvable field THROWS rather than being dropped, because
254
- * a missing aggregate comes back as a number that looks real.
255
- *
256
- * `measure` mode on the filter, so this agrees with `query` and `count`
257
- * about which rows it is talking about — and, since 2026-08-30, refuses an
258
- * unresolvable PREDICATE for the same reason it already refused an
259
- * unresolvable FIELD. Both come back as a number that looks real.
260
- */
261
- aggregate({ namespace, collection, fields, filter, }: SettingsAggregateInput): Promise<SettingsAggregateResult>;
262
- histogram({ namespace, collection, field, bucketSize, origin, filter, }: SettingsHistogramInput): Promise<readonly HistogramBucket[]>;
263
- isEmpty({ namespace, collection }: SettingsIsEmptyInput): Promise<boolean>;
264
- private queryDeclared;
265
- /** Get a system setting by dot-notation key */
266
- getSystem(key: string): unknown;
267
- /** Set a system setting */
268
- setSystem(key: string, value: unknown): void;
269
- /** Get all system settings as flat key-value */
270
- getAllSystem(): Record<string, unknown>;
271
- /**
272
- * Get all settings for an addon.
273
- *
274
- * Selected by the SAME key range {@link setAllAddon} deletes and re-inserts
275
- * — `prefixWhere("<addonId>.")` — and for the same reason `getAllScoped`
276
- * uses it: `"<addonId>.<key>"` is the PRIMARY KEY, so the range is a
277
- * `SEARCH … USING INDEX` while anything else is a full `SCAN`.
278
- *
279
- * It used to select on `json_extract(data, '$.addonId')`, which is a second
280
- * authority for "this addon's rows" and disagreed with the writer in both
281
- * directions: a row inside the JSON's idea of the addon but outside the key
282
- * range was READ and never DELETED (a config key that could not be cleared),
283
- * and `json_extract` was evaluated on EVERY row — so a four-key addon paid
284
- * for the whole table and one unparseable neighbour aborted the statement,
285
- * taking out every addon's config read at once.
286
- *
287
- * The cost was not theoretical. On the live hub `addon-settings` is 627 KB
288
- * in 24 rows, 625 KB of it device-manager's three fleet blobs; a V8 profile
289
- * of a boot (2026-08-19) had hub-main's JS thread 99.9% busy with **64% of
290
- * it inside this method**, which is what put a ~45 s queue in front of every
291
- * runner's first store read. Measured on that table: 0.947 ms → ~0.02 ms for
292
- * a four-key addon, 2.90 ms → 2.13 ms for device-manager's own.
293
- */
294
- getAllAddon(addonId: string): Record<string, unknown>;
295
- /** Bulk-set all settings for an addon */
296
- setAllAddon(addonId: string, config: Record<string, unknown>): void;
297
- /** Get all settings for a provider */
298
- getAllProvider(providerId: string): Record<string, unknown>;
299
- /** Set a provider setting */
300
- setProvider(providerId: string, key: string, value: unknown): void;
301
- /** Get all settings for a device */
302
- getAllDevice(deviceId: string): Record<string, unknown>;
303
- /** Set a device setting */
304
- setDevice(deviceId: string, key: string, value: unknown): void;
305
- getAddonDevice(addonId: string, deviceId: string): Record<string, unknown>;
306
- setAddonDevice(addonId: string, deviceId: string, values: Record<string, unknown>): void;
307
- clearAddonDevice(addonId: string, deviceId: string): void;
308
- private static readonly LEGACY_RUNTIME_STATE_ADDON_ID;
309
- /**
310
- * The device's whole cap-slice map. Canonical row first, legacy prefix as the
311
- * fallback. `{}` — never null — when the device has never persisted a slice,
312
- * because every caller treats the result as a cap map to iterate.
313
- */
314
- getDeviceRuntimeState(deviceId: string): Record<string, unknown>;
315
- /**
316
- * Replace the device's whole cap-slice map. Replace, not merge — the caller
317
- * always hands over the full persistable blob, and merging would resurrect a
318
- * slice the durability policy has since stopped persisting.
319
- */
320
- setDeviceRuntimeState(deviceId: string, blob: Record<string, unknown>): void;
321
- /** Forget the device's runtime state in BOTH stores (device removal). */
322
- clearDeviceRuntimeState(deviceId: string): void;
323
- /** Seed system-settings with runtime defaults (first boot) */
324
- private seedDefaults;
325
- /**
326
- * Expose the raw better-sqlite3 Database instance for components that
327
- * need direct SQL access (e.g. DeviceStore, ConfigStore).
328
- * Returns null if the backend has not been initialized yet.
329
- */
330
- getDatabase(): Database.Database | null;
331
- /**
332
- * `EXPLAIN QUERY PLAN` for a statement, as one string per plan row.
333
- *
334
- * Answers the question the timing alone cannot: "1.6 s for 501 rows" is a
335
- * full scan and is also a cold disk, and only the plan tells them apart. It
336
- * runs on the SAME connection as the statement, because that is the only
337
- * connection whose `sqlite_stat1` visibility and temp schema match.
338
- *
339
- * `EXPLAIN QUERY PLAN` prepares and plans; it does not execute the statement,
340
- * so it costs no page reads of its own. In production it is called only from
341
- * the slow-call path, once per shape per window; it is public so a guard can
342
- * assert that a declared index is the one the planner actually picks — "we
343
- * added an index" and "the query uses it" are different claims.
344
- *
345
- * Never throws. A plan that cannot be taken (a statement the engine will no
346
- * longer prepare, a closed handle mid-shutdown) is a missing ANSWER, not a
347
- * failure worth turning a slow query into a crash — the profiler falls back
348
- * to the line it would have printed anyway.
349
- */
350
- explainQueryPlan(sql: string, params: readonly unknown[]): readonly string[];
351
- /**
352
- * Run one synchronous statement under the profiler.
353
- *
354
- * A thin pass-through when no profiler exists, so the specs that construct
355
- * this backend without a logger keep exercising the SAME code path as
356
- * production. The alternative — two call shapes — is how a fix gets tested
357
- * on a branch production never takes.
358
- */
359
- private measured;
360
- /**
361
- * Size of the database file, or 0 when it cannot be read.
362
- *
363
- * 0 is the honest answer for a first boot (no file yet) and for an
364
- * unreadable `stat`, and both callers treat it as "unknown" and fall back to
365
- * the floor — never to a smaller setting than the one already argued for.
366
- */
367
- /**
368
- * One numeric PRAGMA off the open connection. A pragma that does not answer
369
- * with a number yields 0, which `sqliteOccupancy` reads as "unknown" and
370
- * reports as an empty file rather than inventing a ratio.
371
- */
372
- /**
373
- * Follow the file as it grows.
374
- *
375
- * The map is derived from the file at OPEN and never again, which is the same
376
- * expiry one level up: a database that grows during uptime keeps the map it
377
- * had at boot, and once the file passes it every read outside the window
378
- * costs a synchronous page-in — 418 per second, measured 2026-08-25. This
379
- * node escaped it only because 130 MB → 858 MB spanned seventeen days of
380
- * restarts.
381
- *
382
- * `unref` so it never holds the process open.
383
- */
384
- private scheduleMapGrowthCheck;
385
- /**
386
- * One-shot `ANALYZE`, long after boot, only if the database has none.
387
- *
388
- * `analyze-stats.ts` has the measurement that justifies it: without
389
- * `sqlite_stat1` the planner walked 150 133 media rows to return six, and one
390
- * `ANALYZE` took that same query from 727 ms to 3.2 ms. It is scheduled
391
- * rather than run inline because it is a 14 s synchronous statement on the
392
- * one thread the cluster reads configuration through.
393
- */
394
- private scheduleIndexAnalysis;
395
- /**
396
- * Name the biggest tables, once, a minute after the connection opens.
397
- *
398
- * `dbSizeMb` says how big the file is and `freePct` says how much of it is
399
- * live; neither says WHOSE. Per-addon scoped collections are created on first
400
- * write and declared nowhere, so this is the only place the real set can be
401
- * enumerated. `unref` so it can never hold the process open.
402
- */
403
- private scheduleStorageReport;
404
- private logStorageReport;
405
- private readPragmaNumber;
406
- private measureDbSizeBytes;
407
- private getDb;
408
- /**
409
- * `WHERE` fragment selecting every key that starts with `prefix`, plus its
410
- * bound parameters.
411
- *
412
- * The range form is what makes the implicit PRIMARY KEY index usable — see
413
- * `prefix-range.ts` for the `EXPLAIN QUERY PLAN` output and the measured
414
- * 1.8x/19.4x. The `LIKE` fallback is the SQL that shipped before, kept
415
- * verbatim for the prefixes a byte range cannot express, so a key shape this
416
- * function refuses degrades in speed and never in correctness.
417
- */
418
- private prefixWhere;
419
- private getAllScoped;
420
- private setScopedKey;
421
- private scopedName;
422
- /**
423
- * Project a declared collection onto what {@link compileFilter} needs. A
424
- * collection whose only column is `data` is KV-shaped: its fields live
425
- * inside that blob and are reached with `json_extract`.
426
- */
427
- private shapeOf;
428
- /**
429
- * Where a declaration LIVES, so it outlives the process that made it.
430
- *
431
- * `declaredCollections` used to be only an in-memory Map, and the
432
- * declarations are made once, by each addon, at that addon's own boot.
433
- * On 2026-09-12 this backend died with SIGBUS (a second connection
434
- * truncated the WAL under its mmap) and `CrashSupervisor` respawned it: the
435
- * new instance knew only the canonical KV collections, every other addon
436
- * stayed up and never re-declared, and the cluster failed every settings
437
- * read for six hours — the operator could not log in.
438
- *
439
- * The tables are durable. What the backend knows ABOUT them has to be too,
440
- * because nothing in the system re-declares and nothing listens for this
441
- * process restarting.
442
- */
443
- private static readonly DECLARATIONS_TABLE;
444
- /** Create the meta table. Idempotent; called before anything reads it. */
445
- private ensureDeclarationsTable;
446
- /** Persist one declaration, replacing any earlier shape for the same table. */
447
- private persistDeclaration;
448
- /**
449
- * Reload every persisted declaration. Called at init, BEFORE any addon has
450
- * had the chance to re-declare — which on a respawn none of them will.
451
- */
452
- private restorePersistedDeclarations;
453
- declareCollection(input: {
454
- namespace?: string;
455
- collection: string;
456
- columns: readonly CollectionColumn[];
457
- indexes?: readonly CollectionIndex[];
458
- }): Promise<void>;
459
- /** Serialise per-column values for SQL binding: objects → JSON, booleans → 0/1. */
460
- private serializeColumnValue;
461
- private ensureTable;
462
- /**
463
- * Drop a table nothing declares any more, reporting what went with it.
464
- *
465
- * The DDL lives here because the engine owns the handle AND the two memos
466
- * that outlive a table: `structuredTables` (schema fingerprint) and
467
- * `declaredCollections` (the column set `compileFilter` resolves against).
468
- * Dropping behind their backs would leave a ghost — a later declaration of
469
- * the same name would be memoised as "already materialised" against a table
470
- * that no longer exists.
471
- *
472
- * WHICH tables are retired, and the logging, are policy: they live in
473
- * `retired-collections.ts`. This method knows only how to drop one.
474
- *
475
- * Answers `null` when the table is not there — the steady state after the
476
- * first boot that ran the purge, and the case on a fresh install.
477
- */
478
- dropRetiredTable(table: string): DroppedTable | null;
479
- /** Returns SQLite's `lastInsertRowid` — the only place an auto-assigned key
480
- * is knowable (D473). */
481
- private tableInsert;
482
- private tableUpdate;
483
- private tableDelete;
484
- private tableCount;
485
- private buildWhere;
85
+ private readonly dbPath;
86
+ private db;
87
+ /**
88
+ * Table name → fingerprint of the schema this process last materialised.
89
+ *
90
+ * Keyed by FINGERPRINT, not by name, and that is the whole point. An addon
91
+ * declares its schema at every boot, but the backend lives in hub-main,
92
+ * which outlives an addon respawn: `camstack deploy` restarts the addon
93
+ * runner and NOT hub-main. A name-only memo therefore made the second
94
+ * declaration of a table a no-op FOREVER — a redeployed addon whose schema
95
+ * had gained a column never got the `ALTER TABLE … ADD COLUMN`, and, because
96
+ * `compileFilter` silently drops a predicate naming a column the collection
97
+ * cannot express (select mode), the missing column read as "matches
98
+ * everything" instead of failing. That is how `pipeline-analytics:tracks`
99
+ * ran for a whole release with no `retrainStatus`: the retention sweep's
100
+ * `whereIn: { retrainStatus: ['none','trained'] }` pin evaporated, so every
101
+ * operator-staged track was eligible for deletion, and `countStaging`
102
+ * reported the entire history as staged.
103
+ */
104
+ private readonly structuredTables;
105
+ /** Map from scoped collection name → set of column names (non-id) that
106
+ * the structured schema owns. Routes set/get/insert/update/query to
107
+ * typed columns. Every collection MUST be declared here before use. */
108
+ private readonly declaredCollections;
109
+ private readonly runtimeDefaults;
110
+ /**
111
+ * Canonical key/value collections — declared with a `(id TEXT PK,
112
+ * data TEXT NOT NULL)` schema at boot so existing JSON-blob rows
113
+ * keep working through the structured path. Generates SQL identical
114
+ * to the previous legacy path; only the routing is unified.
115
+ */
116
+ private static readonly CANONICAL_KV_COLLECTIONS;
117
+ /**
118
+ * Optional, because the engine is constructed in places that have no addon
119
+ * context (migrations, one-shot tools, most specs). It is NOT optional in
120
+ * production: `sqlite-settings.addon.ts` passes one, and without it a row cap
121
+ * being hit would be silent — which is the failure mode the cap exists to
122
+ * avoid replacing.
123
+ */
124
+ private readonly logger;
125
+ /**
126
+ * Per-statement timing. Absent only where the backend is constructed without
127
+ * a logger (migrations, one-shot tools, most specs) — production always has
128
+ * one, because a runner that stalls with no record of what it was executing
129
+ * is the failure this was built for (`query-profiler.ts`).
130
+ */
131
+ private readonly profiler;
132
+ constructor(dbPath: string, runtimeDefaults?: Record<string, unknown>, logger?: IScopedLogger);
133
+ initialize(): Promise<void>;
134
+ private requireDeclared;
135
+ /**
136
+ * Decode a single column value off a SQLite row into the JS shape the
137
+ * caller's schema expects. Handles:
138
+ * - BOOLEAN columns: `0|1` → `false|true`
139
+ * - JSON columns (TEXT starting with `{` / `[`): parse
140
+ * - everything else: pass-through with null coalescing
141
+ */
142
+ private decodeColumnValue;
143
+ shutdown(): Promise<void>;
144
+ /**
145
+ * The statement profiler, so an addon sharing this handle (the sqlite-vec
146
+ * index) reports into the SAME window. Two profilers on one thread would
147
+ * each describe a fraction of the stall and neither would add up to it.
148
+ */
149
+ getProfiler(): SqliteOpProfiler | undefined;
150
+ /**
151
+ * `data-store-provider` self-description — how the orchestrator names
152
+ * this engine in a log line, and (once collections declare an engine)
153
+ * how it picks between registrants.
154
+ */
155
+ getEngineInfo(): Promise<DataStoreEngineInfo>;
156
+ get({ namespace, collection, key }: SettingsGetInput): Promise<unknown>;
157
+ set({ namespace, collection, key, value }: SettingsSetInput): Promise<void>;
158
+ query<T extends object = Record<string, unknown>>({ namespace, collection, filter, columns }: SettingsQueryInput): Promise<readonly SettingsRecord<T>[]>;
159
+ insert<T extends object = Record<string, unknown>>({ namespace, collection, record }: SettingsInsertInput<T>): Promise<{
160
+ readonly id: string | number;
161
+ }>;
162
+ /**
163
+ * Make a SLOT hold this row, and answer with the id the row HAS — one
164
+ * statement, `INSERT … ON CONFLICT(<slot>) DO UPDATE … RETURNING <pk>`.
165
+ *
166
+ * See `settings-store.cap.ts`'s `upsert` docblock for why the store needed a
167
+ * slot that is not the primary key (D482). Three things are load-bearing
168
+ * here:
169
+ *
170
+ * - **`RETURNING` and not `lastInsertRowid`.** On the UPDATE branch
171
+ * `lastInsertRowid` is whatever the connection last inserted — a
172
+ * different row, or a different TABLE. It answers confidently and wrongly,
173
+ * which is worse than not answering. `RETURNING` names the row this
174
+ * statement actually touched, on both branches.
175
+ * - **The conflict columns are checked against the declaration** before they
176
+ * reach the SQL. An undeclared name would be interpolated into DDL-shaped
177
+ * text; it is refused, by the same rule and for the same reason
178
+ * {@link resolveProjection} throws on an unprojectable column.
179
+ * - **The primary key is never part of the SET list.** An `INTEGER` rowid
180
+ * alias is not in `row` at all, and on a TEXT key rewriting the id of the
181
+ * row we just matched is the one update that cannot be right.
182
+ */
183
+ upsert<T extends object = Record<string, unknown>>({ namespace, collection, conflict, record }: SettingsUpsertInput<T>): Promise<{
184
+ readonly id: string | number;
185
+ }>;
186
+ /**
187
+ * Insert a batch in ONE transaction, on ONE prepared statement.
188
+ *
189
+ * The write-side twin of {@link deleteWhere}. Every row in the batch shares
190
+ * a single column list, which is what makes one `prepare` legal: rows are
191
+ * normalised to the collection's DECLARED column set, so a row that omits a
192
+ * column binds `null` for it rather than producing a second statement shape.
193
+ *
194
+ * All or nothing — `better-sqlite3`'s `transaction()` rolls the whole batch
195
+ * back on any throw. A caller writing one process sample gets one COMMIT,
196
+ * which is the entire point: 76 rows every 10 s is 7.6 rows/s, and 7.6
197
+ * separate commits per second on the connection that also serves every
198
+ * cluster-wide configuration read is a constant load nobody asked for.
199
+ */
200
+ insertMany({ namespace, collection, records }: SettingsInsertManyInput): Promise<SettingsInsertManyResult>;
201
+ update({ namespace, collection, id, data }: SettingsUpdateInput): Promise<void>;
202
+ delete({ namespace, collection, key }: SettingsDeleteInput): Promise<void>;
203
+ /**
204
+ * Bulk delete. One statement, whatever the row count — this is what every
205
+ * retention path in the system was hand-rolling as a select-then-delete
206
+ * loop. The filter is compiled in `mutate` mode, so an unresolvable
207
+ * predicate or an empty one throws before any SQL exists.
208
+ */
209
+ deleteWhere({ namespace, collection, filter }: SettingsDeleteWhereInput): Promise<SettingsDeleteWhereResult>;
210
+ /**
211
+ * Bulk update. Same filter contract as {@link deleteWhere}.
212
+ *
213
+ * Every key of `data` must be a REAL column. A KV-shaped collection keeps
214
+ * its fields inside a JSON blob, and setting one would need `json_set` with
215
+ * read-modify-write semantics this method does not have — so it refuses
216
+ * rather than writing a column that does not exist, which is what the
217
+ * uncapped `tableUpdate` would have done.
218
+ */
219
+ updateWhere({ namespace, collection, filter, data }: SettingsUpdateWhereInput): Promise<SettingsUpdateWhereResult>;
220
+ /**
221
+ * How many rows match — about the SAME rows {@link query} would return.
222
+ *
223
+ * That agreement is the entire contract, and until now it did not hold. This
224
+ * was the FOURTH hand-rolled copy of the filter logic (after `query`, the
225
+ * bulk mutations and `histogram`) and it compiled only `where`:
226
+ * `whereBetween`, `whereIn` and `whereNot` were dropped silently, so the
227
+ * count was not slow, it was WRONG, and always wrong in the same direction —
228
+ * too big, because every dropped predicate is a predicate that would have
229
+ * excluded rows.
230
+ *
231
+ * Two live callers decided on it. `TrackStore.countStaging({ deviceId,
232
+ * olderThanMs })` sends the cutoff as `whereBetween: { lastSeen: [0, …] }`
233
+ * and got the device's whole staging history instead. The notification-centre
234
+ * artefact gallery pages on `total` from this method while listing through
235
+ * `query`, and its filter is almost entirely `whereIn`/`whereBetween`
236
+ * (visibility, kind, device, time window, expiry) — so `total` counted rows
237
+ * the page could never show, including other users'.
238
+ *
239
+ * `measure` mode. `count` compiles the same predicates `query` does — the
240
+ * two must never disagree about WHICH rows they are talking about — but it
241
+ * refuses a predicate it cannot express rather than skipping it. `query`
242
+ * hands back rows and a caller can see the filter did not bite; a count
243
+ * hands back a number, and the whole collection and the intended subset are
244
+ * the same shape.
245
+ */
246
+ count({ namespace, collection, filter }: SettingsCountInput): Promise<number>;
247
+ /**
248
+ * `COUNT(*)` and one SUM/MIN/MAX per requested field, in ONE statement.
249
+ *
250
+ * Result slots are aliased POSITIONALLY (`a0`, `a1`, …) and mapped back by
251
+ * index: `as` is caller text and must never reach SQL as an identifier, and
252
+ * the column name is validated through {@link fieldExprFor} exactly like a
253
+ * projection — an unresolvable field THROWS rather than being dropped, because
254
+ * a missing aggregate comes back as a number that looks real.
255
+ *
256
+ * `measure` mode on the filter, so this agrees with `query` and `count`
257
+ * about which rows it is talking about — and, since 2026-08-30, refuses an
258
+ * unresolvable PREDICATE for the same reason it already refused an
259
+ * unresolvable FIELD. Both come back as a number that looks real.
260
+ */
261
+ aggregate({ namespace, collection, fields, filter }: SettingsAggregateInput): Promise<SettingsAggregateResult>;
262
+ histogram({ namespace, collection, field, bucketSize, origin, filter }: SettingsHistogramInput): Promise<readonly HistogramBucket[]>;
263
+ isEmpty({ namespace, collection }: SettingsIsEmptyInput): Promise<boolean>;
264
+ private queryDeclared;
265
+ /** Get a system setting by dot-notation key */
266
+ getSystem(key: string): unknown;
267
+ /** Set a system setting */
268
+ setSystem(key: string, value: unknown): void;
269
+ /** Get all system settings as flat key-value */
270
+ getAllSystem(): Record<string, unknown>;
271
+ /**
272
+ * Get all settings for an addon.
273
+ *
274
+ * Selected by the SAME key range {@link setAllAddon} deletes and re-inserts
275
+ * — `prefixWhere("<addonId>.")` — and for the same reason `getAllScoped`
276
+ * uses it: `"<addonId>.<key>"` is the PRIMARY KEY, so the range is a
277
+ * `SEARCH … USING INDEX` while anything else is a full `SCAN`.
278
+ *
279
+ * It used to select on `json_extract(data, '$.addonId')`, which is a second
280
+ * authority for "this addon's rows" and disagreed with the writer in both
281
+ * directions: a row inside the JSON's idea of the addon but outside the key
282
+ * range was READ and never DELETED (a config key that could not be cleared),
283
+ * and `json_extract` was evaluated on EVERY row — so a four-key addon paid
284
+ * for the whole table and one unparseable neighbour aborted the statement,
285
+ * taking out every addon's config read at once.
286
+ *
287
+ * The cost was not theoretical. On the live hub `addon-settings` is 627 KB
288
+ * in 24 rows, 625 KB of it device-manager's three fleet blobs; a V8 profile
289
+ * of a boot (2026-08-19) had hub-main's JS thread 99.9% busy with **64% of
290
+ * it inside this method**, which is what put a ~45 s queue in front of every
291
+ * runner's first store read. Measured on that table: 0.947 ms → ~0.02 ms for
292
+ * a four-key addon, 2.90 ms → 2.13 ms for device-manager's own.
293
+ */
294
+ getAllAddon(addonId: string): Record<string, unknown>;
295
+ /** Bulk-set all settings for an addon */
296
+ setAllAddon(addonId: string, config: Record<string, unknown>): void;
297
+ /** Get all settings for a provider */
298
+ getAllProvider(providerId: string): Record<string, unknown>;
299
+ /** Set a provider setting */
300
+ setProvider(providerId: string, key: string, value: unknown): void;
301
+ /** Get all settings for a device */
302
+ getAllDevice(deviceId: string): Record<string, unknown>;
303
+ /** Set a device setting */
304
+ setDevice(deviceId: string, key: string, value: unknown): void;
305
+ getAddonDevice(addonId: string, deviceId: string): Record<string, unknown>;
306
+ setAddonDevice(addonId: string, deviceId: string, values: Record<string, unknown>): void;
307
+ clearAddonDevice(addonId: string, deviceId: string): void;
308
+ private static readonly LEGACY_RUNTIME_STATE_ADDON_ID;
309
+ /**
310
+ * The device's whole cap-slice map. Canonical row first, legacy prefix as the
311
+ * fallback. `{}` — never null — when the device has never persisted a slice,
312
+ * because every caller treats the result as a cap map to iterate.
313
+ */
314
+ getDeviceRuntimeState(deviceId: string): Record<string, unknown>;
315
+ /**
316
+ * Replace the device's whole cap-slice map. Replace, not merge — the caller
317
+ * always hands over the full persistable blob, and merging would resurrect a
318
+ * slice the durability policy has since stopped persisting.
319
+ */
320
+ setDeviceRuntimeState(deviceId: string, blob: Record<string, unknown>): void;
321
+ /** Forget the device's runtime state in BOTH stores (device removal). */
322
+ clearDeviceRuntimeState(deviceId: string): void;
323
+ /** Seed system-settings with runtime defaults (first boot) */
324
+ private seedDefaults;
325
+ /**
326
+ * Expose the raw better-sqlite3 Database instance for components that
327
+ * need direct SQL access (e.g. DeviceStore, ConfigStore).
328
+ * Returns null if the backend has not been initialized yet.
329
+ */
330
+ getDatabase(): Database.Database | null;
331
+ /**
332
+ * `EXPLAIN QUERY PLAN` for a statement, as one string per plan row.
333
+ *
334
+ * Answers the question the timing alone cannot: "1.6 s for 501 rows" is a
335
+ * full scan and is also a cold disk, and only the plan tells them apart. It
336
+ * runs on the SAME connection as the statement, because that is the only
337
+ * connection whose `sqlite_stat1` visibility and temp schema match.
338
+ *
339
+ * `EXPLAIN QUERY PLAN` prepares and plans; it does not execute the statement,
340
+ * so it costs no page reads of its own. In production it is called only from
341
+ * the slow-call path, once per shape per window; it is public so a guard can
342
+ * assert that a declared index is the one the planner actually picks — "we
343
+ * added an index" and "the query uses it" are different claims.
344
+ *
345
+ * Never throws. A plan that cannot be taken (a statement the engine will no
346
+ * longer prepare, a closed handle mid-shutdown) is a missing ANSWER, not a
347
+ * failure worth turning a slow query into a crash — the profiler falls back
348
+ * to the line it would have printed anyway.
349
+ */
350
+ explainQueryPlan(sql: string, params: readonly unknown[]): readonly string[];
351
+ /**
352
+ * Run one synchronous statement under the profiler.
353
+ *
354
+ * A thin pass-through when no profiler exists, so the specs that construct
355
+ * this backend without a logger keep exercising the SAME code path as
356
+ * production. The alternative — two call shapes — is how a fix gets tested
357
+ * on a branch production never takes.
358
+ */
359
+ private measured;
360
+ /**
361
+ * Size of the database file, or 0 when it cannot be read.
362
+ *
363
+ * 0 is the honest answer for a first boot (no file yet) and for an
364
+ * unreadable `stat`, and both callers treat it as "unknown" and fall back to
365
+ * the floor — never to a smaller setting than the one already argued for.
366
+ */
367
+ /**
368
+ * One numeric PRAGMA off the open connection. A pragma that does not answer
369
+ * with a number yields 0, which `sqliteOccupancy` reads as "unknown" and
370
+ * reports as an empty file rather than inventing a ratio.
371
+ */
372
+ /**
373
+ * Follow the file as it grows.
374
+ *
375
+ * The map is derived from the file at OPEN and never again, which is the same
376
+ * expiry one level up: a database that grows during uptime keeps the map it
377
+ * had at boot, and once the file passes it every read outside the window
378
+ * costs a synchronous page-in — 418 per second, measured 2026-08-25. This
379
+ * node escaped it only because 130 MB → 858 MB spanned seventeen days of
380
+ * restarts.
381
+ *
382
+ * `unref` so it never holds the process open.
383
+ */
384
+ private scheduleMapGrowthCheck;
385
+ /**
386
+ * One-shot `ANALYZE`, long after boot, only if the database has none.
387
+ *
388
+ * `analyze-stats.ts` has the measurement that justifies it: without
389
+ * `sqlite_stat1` the planner walked 150 133 media rows to return six, and one
390
+ * `ANALYZE` took that same query from 727 ms to 3.2 ms. It is scheduled
391
+ * rather than run inline because it is a 14 s synchronous statement on the
392
+ * one thread the cluster reads configuration through.
393
+ */
394
+ private scheduleIndexAnalysis;
395
+ /**
396
+ * Name the biggest tables, once, a minute after the connection opens.
397
+ *
398
+ * `dbSizeMb` says how big the file is and `freePct` says how much of it is
399
+ * live; neither says WHOSE. Per-addon scoped collections are created on first
400
+ * write and declared nowhere, so this is the only place the real set can be
401
+ * enumerated. `unref` so it can never hold the process open.
402
+ */
403
+ private scheduleStorageReport;
404
+ private logStorageReport;
405
+ private readPragmaNumber;
406
+ private measureDbSizeBytes;
407
+ private getDb;
408
+ /**
409
+ * `WHERE` fragment selecting every key that starts with `prefix`, plus its
410
+ * bound parameters.
411
+ *
412
+ * The range form is what makes the implicit PRIMARY KEY index usable — see
413
+ * `prefix-range.ts` for the `EXPLAIN QUERY PLAN` output and the measured
414
+ * 1.8x/19.4x. The `LIKE` fallback is the SQL that shipped before, kept
415
+ * verbatim for the prefixes a byte range cannot express, so a key shape this
416
+ * function refuses degrades in speed and never in correctness.
417
+ */
418
+ private prefixWhere;
419
+ private getAllScoped;
420
+ private setScopedKey;
421
+ private scopedName;
422
+ /**
423
+ * Project a declared collection onto what {@link compileFilter} needs. A
424
+ * collection whose only column is `data` is KV-shaped: its fields live
425
+ * inside that blob and are reached with `json_extract`.
426
+ */
427
+ private shapeOf;
428
+ /**
429
+ * Where a declaration LIVES, so it outlives the process that made it.
430
+ *
431
+ * `declaredCollections` used to be only an in-memory Map, and the
432
+ * declarations are made once, by each addon, at that addon's own boot.
433
+ * On 2026-09-12 this backend died with SIGBUS (a second connection
434
+ * truncated the WAL under its mmap) and `CrashSupervisor` respawned it: the
435
+ * new instance knew only the canonical KV collections, every other addon
436
+ * stayed up and never re-declared, and the cluster failed every settings
437
+ * read for six hours — the operator could not log in.
438
+ *
439
+ * The tables are durable. What the backend knows ABOUT them has to be too,
440
+ * because nothing in the system re-declares and nothing listens for this
441
+ * process restarting.
442
+ */
443
+ private static readonly DECLARATIONS_TABLE;
444
+ /** Create the meta table. Idempotent; called before anything reads it. */
445
+ private ensureDeclarationsTable;
446
+ /** Persist one declaration, replacing any earlier shape for the same table. */
447
+ private persistDeclaration;
448
+ /**
449
+ * Reload every persisted declaration. Called at init, BEFORE any addon has
450
+ * had the chance to re-declare — which on a respawn none of them will.
451
+ */
452
+ private restorePersistedDeclarations;
453
+ declareCollection(input: {
454
+ namespace?: string;
455
+ collection: string;
456
+ columns: readonly CollectionColumn[];
457
+ indexes?: readonly CollectionIndex[];
458
+ }): Promise<void>;
459
+ /** Serialise per-column values for SQL binding: objects → JSON, booleans → 0/1. */
460
+ private serializeColumnValue;
461
+ private ensureTable;
462
+ /**
463
+ * Drop a table nothing declares any more, reporting what went with it.
464
+ *
465
+ * The DDL lives here because the engine owns the handle AND the two memos
466
+ * that outlive a table: `structuredTables` (schema fingerprint) and
467
+ * `declaredCollections` (the column set `compileFilter` resolves against).
468
+ * Dropping behind their backs would leave a ghost — a later declaration of
469
+ * the same name would be memoised as "already materialised" against a table
470
+ * that no longer exists.
471
+ *
472
+ * WHICH tables are retired, and the logging, are policy: they live in
473
+ * `retired-collections.ts`. This method knows only how to drop one.
474
+ *
475
+ * Answers `null` when the table is not there — the steady state after the
476
+ * first boot that ran the purge, and the case on a fresh install.
477
+ */
478
+ dropRetiredTable(table: string): DroppedTable | null;
479
+ /** Returns SQLite's `lastInsertRowid` — the only place an auto-assigned key
480
+ * is knowable (D473). */
481
+ private tableInsert;
482
+ private tableUpdate;
483
+ private tableDelete;
484
+ private tableCount;
485
+ private buildWhere;
486
486
  }
487
487
  export default SqliteSettingsBackend;