@qvac/core 0.0.0 → 0.1.0

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 (586) hide show
  1. package/LICENSE.md +198 -0
  2. package/NOTICE.md +13 -0
  3. package/README.md +694 -0
  4. package/SECURITY.md +6 -0
  5. package/dist/assistant.bundle +47256 -0
  6. package/dist/assistant.cjs +18 -0
  7. package/dist/assistant.d.ts +8 -0
  8. package/dist/prebuilds-manifest.json +380 -0
  9. package/dist-lib/client.d.ts +2 -0
  10. package/dist-lib/client.js +1 -0
  11. package/dist-lib/index.d.ts +13 -0
  12. package/dist-lib/index.js +10 -0
  13. package/dist-lib/lib/agent-icons.d.ts +3 -0
  14. package/dist-lib/lib/agent-icons.js +1 -0
  15. package/dist-lib/lib/api/agents.d.ts +5 -0
  16. package/dist-lib/lib/api/agents.js +38 -0
  17. package/dist-lib/lib/api/app-config.d.ts +5 -0
  18. package/dist-lib/lib/api/app-config.js +108 -0
  19. package/dist-lib/lib/api/approval-rules.d.ts +3 -0
  20. package/dist-lib/lib/api/approval-rules.js +9 -0
  21. package/dist-lib/lib/api/attachments.d.ts +8 -0
  22. package/dist-lib/lib/api/attachments.js +15 -0
  23. package/dist-lib/lib/api/chat-groups.d.ts +5 -0
  24. package/dist-lib/lib/api/chat-groups.js +12 -0
  25. package/dist-lib/lib/api/chat.d.ts +5 -0
  26. package/dist-lib/lib/api/chat.js +38 -0
  27. package/dist-lib/lib/api/chunks.d.ts +5 -0
  28. package/dist-lib/lib/api/chunks.js +61 -0
  29. package/dist-lib/lib/api/config.d.ts +5 -0
  30. package/dist-lib/lib/api/config.js +15 -0
  31. package/dist-lib/lib/api/current-mesh.d.ts +5 -0
  32. package/dist-lib/lib/api/current-mesh.js +12 -0
  33. package/dist-lib/lib/api/custom-models.d.ts +5 -0
  34. package/dist-lib/lib/api/custom-models.js +45 -0
  35. package/dist-lib/lib/api/devices.d.ts +8 -0
  36. package/dist-lib/lib/api/devices.js +125 -0
  37. package/dist-lib/lib/api/diagnostics.d.ts +7 -0
  38. package/dist-lib/lib/api/diagnostics.js +7 -0
  39. package/dist-lib/lib/api/effective-ctx-size.d.ts +2 -0
  40. package/dist-lib/lib/api/effective-ctx-size.js +10 -0
  41. package/dist-lib/lib/api/execution.d.ts +3 -0
  42. package/dist-lib/lib/api/execution.js +45 -0
  43. package/dist-lib/lib/api/files.d.ts +3 -0
  44. package/dist-lib/lib/api/files.js +48 -0
  45. package/dist-lib/lib/api/index.d.ts +62 -0
  46. package/dist-lib/lib/api/index.js +172 -0
  47. package/dist-lib/lib/api/instrument.d.ts +2 -0
  48. package/dist-lib/lib/api/instrument.js +86 -0
  49. package/dist-lib/lib/api/knowledge.d.ts +8 -0
  50. package/dist-lib/lib/api/knowledge.js +26 -0
  51. package/dist-lib/lib/api/logs.d.ts +14 -0
  52. package/dist-lib/lib/api/logs.js +116 -0
  53. package/dist-lib/lib/api/mesh.d.ts +13 -0
  54. package/dist-lib/lib/api/mesh.js +25 -0
  55. package/dist-lib/lib/api/model-download.d.ts +5 -0
  56. package/dist-lib/lib/api/model-download.js +47 -0
  57. package/dist-lib/lib/api/network.d.ts +8 -0
  58. package/dist-lib/lib/api/network.js +6 -0
  59. package/dist-lib/lib/api/notifications.d.ts +21 -0
  60. package/dist-lib/lib/api/notifications.js +108 -0
  61. package/dist-lib/lib/api/rag.d.ts +7 -0
  62. package/dist-lib/lib/api/rag.js +216 -0
  63. package/dist-lib/lib/api/sync.d.ts +3 -0
  64. package/dist-lib/lib/api/sync.js +6 -0
  65. package/dist-lib/lib/api/tool-activity.d.ts +5 -0
  66. package/dist-lib/lib/api/tool-activity.js +53 -0
  67. package/dist-lib/lib/api/tool-configs.d.ts +6 -0
  68. package/dist-lib/lib/api/tool-configs.js +27 -0
  69. package/dist-lib/lib/api/watchable.d.ts +12 -0
  70. package/dist-lib/lib/api/watchable.js +121 -0
  71. package/dist-lib/lib/assistant-client.d.ts +21 -0
  72. package/dist-lib/lib/assistant-client.js +52 -0
  73. package/dist-lib/lib/assistant-tree.d.ts +50 -0
  74. package/dist-lib/lib/assistant-tree.js +184 -0
  75. package/dist-lib/lib/assistant.d.ts +425 -0
  76. package/dist-lib/lib/assistant.js +2706 -0
  77. package/dist-lib/lib/audio-format.d.ts +4 -0
  78. package/dist-lib/lib/audio-format.js +4 -0
  79. package/dist-lib/lib/chat-title.d.ts +5 -0
  80. package/dist-lib/lib/chat-title.js +58 -0
  81. package/dist-lib/lib/client.d.ts +25 -0
  82. package/dist-lib/lib/client.js +53 -0
  83. package/dist-lib/lib/collabora/convert.d.ts +9 -0
  84. package/dist-lib/lib/collabora/convert.js +62 -0
  85. package/dist-lib/lib/collabora/entry.d.ts +1 -0
  86. package/dist-lib/lib/collabora/entry.js +44 -0
  87. package/dist-lib/lib/collabora/protocol.d.ts +15 -0
  88. package/dist-lib/lib/collabora/protocol.js +24 -0
  89. package/dist-lib/lib/collabora/worker.d.ts +5 -0
  90. package/dist-lib/lib/collabora/worker.js +111 -0
  91. package/dist-lib/lib/compaction.d.ts +30 -0
  92. package/dist-lib/lib/compaction.js +95 -0
  93. package/dist-lib/lib/constants.d.ts +4 -0
  94. package/dist-lib/lib/constants.js +4 -0
  95. package/dist-lib/lib/core/agent.d.ts +15 -0
  96. package/dist-lib/lib/core/agent.js +149 -0
  97. package/dist-lib/lib/core/app-build.d.ts +7 -0
  98. package/dist-lib/lib/core/app-build.js +1 -0
  99. package/dist-lib/lib/core/approval-rules.d.ts +15 -0
  100. package/dist-lib/lib/core/approval-rules.js +41 -0
  101. package/dist-lib/lib/core/async-iterable.d.ts +13 -0
  102. package/dist-lib/lib/core/async-iterable.js +65 -0
  103. package/dist-lib/lib/core/attachment-link.d.ts +7 -0
  104. package/dist-lib/lib/core/attachment-link.js +6 -0
  105. package/dist-lib/lib/core/audio-attachment.d.ts +1 -0
  106. package/dist-lib/lib/core/audio-attachment.js +4 -0
  107. package/dist-lib/lib/core/blind-peers.d.ts +6 -0
  108. package/dist-lib/lib/core/blind-peers.js +13 -0
  109. package/dist-lib/lib/core/chat-activity.d.ts +7 -0
  110. package/dist-lib/lib/core/chat-activity.js +244 -0
  111. package/dist-lib/lib/core/chat-group.d.ts +14 -0
  112. package/dist-lib/lib/core/chat-group.js +79 -0
  113. package/dist-lib/lib/core/chat-search.d.ts +17 -0
  114. package/dist-lib/lib/core/chat-search.js +199 -0
  115. package/dist-lib/lib/core/chat.d.ts +37 -0
  116. package/dist-lib/lib/core/chat.js +196 -0
  117. package/dist-lib/lib/core/chunk.d.ts +61 -0
  118. package/dist-lib/lib/core/chunk.js +212 -0
  119. package/dist-lib/lib/core/contract/activity.d.ts +11 -0
  120. package/dist-lib/lib/core/contract/activity.js +45 -0
  121. package/dist-lib/lib/core/contract/agents.d.ts +2 -0
  122. package/dist-lib/lib/core/contract/agents.js +29 -0
  123. package/dist-lib/lib/core/contract/approval-rules.d.ts +2 -0
  124. package/dist-lib/lib/core/contract/approval-rules.js +14 -0
  125. package/dist-lib/lib/core/contract/attestations.d.ts +2 -0
  126. package/dist-lib/lib/core/contract/attestations.js +14 -0
  127. package/dist-lib/lib/core/contract/chat-group.d.ts +2 -0
  128. package/dist-lib/lib/core/contract/chat-group.js +20 -0
  129. package/dist-lib/lib/core/contract/chat.d.ts +2 -0
  130. package/dist-lib/lib/core/contract/chat.js +18 -0
  131. package/dist-lib/lib/core/contract/chunks.d.ts +2 -0
  132. package/dist-lib/lib/core/contract/chunks.js +156 -0
  133. package/dist-lib/lib/core/contract/devices.d.ts +2 -0
  134. package/dist-lib/lib/core/contract/devices.js +110 -0
  135. package/dist-lib/lib/core/contract/index.d.ts +2 -0
  136. package/dist-lib/lib/core/contract/index.js +30 -0
  137. package/dist-lib/lib/core/contract/indexing.d.ts +4 -0
  138. package/dist-lib/lib/core/contract/indexing.js +82 -0
  139. package/dist-lib/lib/core/contract/knowledge.d.ts +2 -0
  140. package/dist-lib/lib/core/contract/knowledge.js +55 -0
  141. package/dist-lib/lib/core/contract/members.d.ts +2 -0
  142. package/dist-lib/lib/core/contract/members.js +96 -0
  143. package/dist-lib/lib/core/contract/seed-defaults.d.ts +2 -0
  144. package/dist-lib/lib/core/contract/seed-defaults.js +29 -0
  145. package/dist-lib/lib/core/contract/tool-activity.d.ts +2 -0
  146. package/dist-lib/lib/core/contract/tool-activity.js +25 -0
  147. package/dist-lib/lib/core/contract/tool-configs.d.ts +2 -0
  148. package/dist-lib/lib/core/contract/tool-configs.js +50 -0
  149. package/dist-lib/lib/core/contract/types.d.ts +11 -0
  150. package/dist-lib/lib/core/contract/types.js +1 -0
  151. package/dist-lib/lib/core/contract/writers.d.ts +2 -0
  152. package/dist-lib/lib/core/contract/writers.js +112 -0
  153. package/dist-lib/lib/core/cpu-info-node.d.ts +3 -0
  154. package/dist-lib/lib/core/cpu-info-node.js +2 -0
  155. package/dist-lib/lib/core/departures.d.ts +41 -0
  156. package/dist-lib/lib/core/departures.js +145 -0
  157. package/dist-lib/lib/core/device-attestation.d.ts +6 -0
  158. package/dist-lib/lib/core/device-attestation.js +12 -0
  159. package/dist-lib/lib/core/devices.d.ts +14 -0
  160. package/dist-lib/lib/core/devices.js +11 -0
  161. package/dist-lib/lib/core/document-attachment.d.ts +22 -0
  162. package/dist-lib/lib/core/document-attachment.js +35 -0
  163. package/dist-lib/lib/core/files/attachments.d.ts +8 -0
  164. package/dist-lib/lib/core/files/attachments.js +50 -0
  165. package/dist-lib/lib/core/files/index.d.ts +133 -0
  166. package/dist-lib/lib/core/files/index.js +585 -0
  167. package/dist-lib/lib/core/files/knowledge.d.ts +9 -0
  168. package/dist-lib/lib/core/files/knowledge.js +31 -0
  169. package/dist-lib/lib/core/files/preview/image.d.ts +4 -0
  170. package/dist-lib/lib/core/files/preview/image.js +42 -0
  171. package/dist-lib/lib/core/files/preview/index.d.ts +33 -0
  172. package/dist-lib/lib/core/files/preview/index.js +161 -0
  173. package/dist-lib/lib/core/files/processing/claims.d.ts +26 -0
  174. package/dist-lib/lib/core/files/processing/claims.js +89 -0
  175. package/dist-lib/lib/core/files/processing/document.d.ts +100 -0
  176. package/dist-lib/lib/core/files/processing/document.js +101 -0
  177. package/dist-lib/lib/core/files/processing/index.d.ts +75 -0
  178. package/dist-lib/lib/core/files/processing/index.js +295 -0
  179. package/dist-lib/lib/core/files/processing/ownership.d.ts +11 -0
  180. package/dist-lib/lib/core/files/processing/ownership.js +41 -0
  181. package/dist-lib/lib/core/files/processing/protocol.d.ts +29 -0
  182. package/dist-lib/lib/core/files/processing/protocol.js +70 -0
  183. package/dist-lib/lib/core/files/processing/settle.d.ts +10 -0
  184. package/dist-lib/lib/core/files/processing/settle.js +75 -0
  185. package/dist-lib/lib/core/files/processing/source.d.ts +36 -0
  186. package/dist-lib/lib/core/files/processing/source.js +96 -0
  187. package/dist-lib/lib/core/files/processing/state.d.ts +64 -0
  188. package/dist-lib/lib/core/files/processing/state.js +118 -0
  189. package/dist-lib/lib/core/files/rag/artifact/codec.d.ts +3 -0
  190. package/dist-lib/lib/core/files/rag/artifact/codec.js +172 -0
  191. package/dist-lib/lib/core/files/rag/artifact/id.d.ts +10 -0
  192. package/dist-lib/lib/core/files/rag/artifact/id.js +39 -0
  193. package/dist-lib/lib/core/files/rag/artifact/types.d.ts +24 -0
  194. package/dist-lib/lib/core/files/rag/artifact/types.js +41 -0
  195. package/dist-lib/lib/core/files/rag/build.d.ts +25 -0
  196. package/dist-lib/lib/core/files/rag/build.js +60 -0
  197. package/dist-lib/lib/core/files/rag/chunk/chunking.d.ts +12 -0
  198. package/dist-lib/lib/core/files/rag/chunk/chunking.js +117 -0
  199. package/dist-lib/lib/core/files/rag/chunk/metadata.d.ts +30 -0
  200. package/dist-lib/lib/core/files/rag/chunk/metadata.js +89 -0
  201. package/dist-lib/lib/core/files/rag/chunk/tokenizer.d.ts +7 -0
  202. package/dist-lib/lib/core/files/rag/chunk/tokenizer.js +18 -0
  203. package/dist-lib/lib/core/files/rag/document-types.d.ts +11 -0
  204. package/dist-lib/lib/core/files/rag/document-types.js +94 -0
  205. package/dist-lib/lib/core/files/rag/extract/csv-text.d.ts +1 -0
  206. package/dist-lib/lib/core/files/rag/extract/csv-text.js +117 -0
  207. package/dist-lib/lib/core/files/rag/extract/document-types.d.ts +22 -0
  208. package/dist-lib/lib/core/files/rag/extract/document-types.js +152 -0
  209. package/dist-lib/lib/core/files/rag/extract/extract.d.ts +17 -0
  210. package/dist-lib/lib/core/files/rag/extract/extract.js +81 -0
  211. package/dist-lib/lib/core/files/rag/extract/html-table-text.d.ts +1 -0
  212. package/dist-lib/lib/core/files/rag/extract/html-table-text.js +125 -0
  213. package/dist-lib/lib/core/files/rag/extract/html-text.d.ts +1 -0
  214. package/dist-lib/lib/core/files/rag/extract/html-text.js +132 -0
  215. package/dist-lib/lib/core/files/rag/extract/office-collabora.d.ts +2 -0
  216. package/dist-lib/lib/core/files/rag/extract/office-collabora.js +8 -0
  217. package/dist-lib/lib/core/files/rag/extract/pdf-platform.d.ts +17 -0
  218. package/dist-lib/lib/core/files/rag/extract/pdf-platform.js +141 -0
  219. package/dist-lib/lib/core/files/rag/extract/pdf-text.d.ts +12 -0
  220. package/dist-lib/lib/core/files/rag/extract/pdf-text.js +43 -0
  221. package/dist-lib/lib/core/files/rag/extract/rtf-text.d.ts +1 -0
  222. package/dist-lib/lib/core/files/rag/extract/rtf-text.js +15 -0
  223. package/dist-lib/lib/core/files/rag/extract/text-decoding.d.ts +1 -0
  224. package/dist-lib/lib/core/files/rag/extract/text-decoding.js +91 -0
  225. package/dist-lib/lib/core/files/rag/extract/types.d.ts +36 -0
  226. package/dist-lib/lib/core/files/rag/extract/types.js +12 -0
  227. package/dist-lib/lib/core/files/rag/extract/utf.d.ts +2 -0
  228. package/dist-lib/lib/core/files/rag/extract/utf.js +18 -0
  229. package/dist-lib/lib/core/files/rag/index.d.ts +54 -0
  230. package/dist-lib/lib/core/files/rag/index.js +79 -0
  231. package/dist-lib/lib/core/files/rag/limits.d.ts +2 -0
  232. package/dist-lib/lib/core/files/rag/limits.js +2 -0
  233. package/dist-lib/lib/core/files/rag/load.d.ts +28 -0
  234. package/dist-lib/lib/core/files/rag/load.js +250 -0
  235. package/dist-lib/lib/core/files/rag/models.d.ts +1 -0
  236. package/dist-lib/lib/core/files/rag/models.js +1 -0
  237. package/dist-lib/lib/core/files/rag/policy.d.ts +2 -0
  238. package/dist-lib/lib/core/files/rag/policy.js +23 -0
  239. package/dist-lib/lib/core/files/rag/produce.d.ts +21 -0
  240. package/dist-lib/lib/core/files/rag/produce.js +214 -0
  241. package/dist-lib/lib/core/files/rag/retrieval/citation-match.d.ts +2 -0
  242. package/dist-lib/lib/core/files/rag/retrieval/citation-match.js +16 -0
  243. package/dist-lib/lib/core/files/rag/retrieval/coverage.d.ts +4 -0
  244. package/dist-lib/lib/core/files/rag/retrieval/coverage.js +48 -0
  245. package/dist-lib/lib/core/files/rag/retrieval/diversity.d.ts +10 -0
  246. package/dist-lib/lib/core/files/rag/retrieval/diversity.js +37 -0
  247. package/dist-lib/lib/core/files/rag/retrieval/floor.d.ts +5 -0
  248. package/dist-lib/lib/core/files/rag/retrieval/floor.js +21 -0
  249. package/dist-lib/lib/core/files/rag/retrieval/format.d.ts +6 -0
  250. package/dist-lib/lib/core/files/rag/retrieval/format.js +21 -0
  251. package/dist-lib/lib/core/files/rag/retrieval/full-text.d.ts +22 -0
  252. package/dist-lib/lib/core/files/rag/retrieval/full-text.js +137 -0
  253. package/dist-lib/lib/core/files/rag/retrieval/knowledge.d.ts +2 -0
  254. package/dist-lib/lib/core/files/rag/retrieval/knowledge.js +53 -0
  255. package/dist-lib/lib/core/files/rag/retrieval/notices.d.ts +16 -0
  256. package/dist-lib/lib/core/files/rag/retrieval/notices.js +27 -0
  257. package/dist-lib/lib/core/files/rag/retrieval/scoring.d.ts +8 -0
  258. package/dist-lib/lib/core/files/rag/retrieval/scoring.js +82 -0
  259. package/dist-lib/lib/core/files/rag/retrieval/search.d.ts +3 -0
  260. package/dist-lib/lib/core/files/rag/retrieval/search.js +46 -0
  261. package/dist-lib/lib/core/files/rag/retrieval/selection.d.ts +10 -0
  262. package/dist-lib/lib/core/files/rag/retrieval/selection.js +63 -0
  263. package/dist-lib/lib/core/files/rag/retrieval/source-tag-filter.d.ts +6 -0
  264. package/dist-lib/lib/core/files/rag/retrieval/source-tag-filter.js +79 -0
  265. package/dist-lib/lib/core/files/rag/retrieval/sources.d.ts +13 -0
  266. package/dist-lib/lib/core/files/rag/retrieval/sources.js +20 -0
  267. package/dist-lib/lib/core/files/rag/retrieval/target.d.ts +13 -0
  268. package/dist-lib/lib/core/files/rag/retrieval/target.js +89 -0
  269. package/dist-lib/lib/core/files/rag/retrieval/terms.d.ts +8 -0
  270. package/dist-lib/lib/core/files/rag/retrieval/terms.js +70 -0
  271. package/dist-lib/lib/core/files/rag/retrieval/types.d.ts +28 -0
  272. package/dist-lib/lib/core/files/rag/retrieval/types.js +1 -0
  273. package/dist-lib/lib/core/files/rag/retrieval/web-sources.d.ts +8 -0
  274. package/dist-lib/lib/core/files/rag/retrieval/web-sources.js +41 -0
  275. package/dist-lib/lib/core/files/rag/retrieval/whole-document-query.d.ts +1 -0
  276. package/dist-lib/lib/core/files/rag/retrieval/whole-document-query.js +96 -0
  277. package/dist-lib/lib/core/files/rag/vector/memory.d.ts +15 -0
  278. package/dist-lib/lib/core/files/rag/vector/memory.js +135 -0
  279. package/dist-lib/lib/core/files/rag/vector/types.d.ts +28 -0
  280. package/dist-lib/lib/core/files/rag/vector/types.js +1 -0
  281. package/dist-lib/lib/core/files/records/chunks.d.ts +3 -0
  282. package/dist-lib/lib/core/files/records/chunks.js +12 -0
  283. package/dist-lib/lib/core/files/records/index.d.ts +10 -0
  284. package/dist-lib/lib/core/files/records/index.js +8 -0
  285. package/dist-lib/lib/core/files/records/knowledge.d.ts +22 -0
  286. package/dist-lib/lib/core/files/records/knowledge.js +105 -0
  287. package/dist-lib/lib/core/files/records/linkage.d.ts +11 -0
  288. package/dist-lib/lib/core/files/records/linkage.js +27 -0
  289. package/dist-lib/lib/core/files/records/output.d.ts +8 -0
  290. package/dist-lib/lib/core/files/records/output.js +38 -0
  291. package/dist-lib/lib/core/files/records/reclaim.d.ts +5 -0
  292. package/dist-lib/lib/core/files/records/reclaim.js +73 -0
  293. package/dist-lib/lib/core/files/records/routing.d.ts +23 -0
  294. package/dist-lib/lib/core/files/records/routing.js +62 -0
  295. package/dist-lib/lib/core/files/records/source.d.ts +16 -0
  296. package/dist-lib/lib/core/files/records/source.js +70 -0
  297. package/dist-lib/lib/core/files/records/sweep.d.ts +2 -0
  298. package/dist-lib/lib/core/files/records/sweep.js +30 -0
  299. package/dist-lib/lib/core/files/store/blob.d.ts +29 -0
  300. package/dist-lib/lib/core/files/store/blob.js +98 -0
  301. package/dist-lib/lib/core/files/store/index.d.ts +36 -0
  302. package/dist-lib/lib/core/files/store/index.js +89 -0
  303. package/dist-lib/lib/core/files/store/inline.d.ts +8 -0
  304. package/dist-lib/lib/core/files/store/inline.js +38 -0
  305. package/dist-lib/lib/core/files/store/reference.d.ts +27 -0
  306. package/dist-lib/lib/core/files/store/reference.js +168 -0
  307. package/dist-lib/lib/core/files/store/server.d.ts +27 -0
  308. package/dist-lib/lib/core/files/store/server.js +114 -0
  309. package/dist-lib/lib/core/files/store/sweep.d.ts +2 -0
  310. package/dist-lib/lib/core/files/store/sweep.js +45 -0
  311. package/dist-lib/lib/core/files/upload-input.d.ts +27 -0
  312. package/dist-lib/lib/core/files/upload-input.js +52 -0
  313. package/dist-lib/lib/core/files/upload.d.ts +32 -0
  314. package/dist-lib/lib/core/files/upload.js +201 -0
  315. package/dist-lib/lib/core/fs-drives.d.ts +18 -0
  316. package/dist-lib/lib/core/fs-drives.js +58 -0
  317. package/dist-lib/lib/core/gpu-info-node.d.ts +3 -0
  318. package/dist-lib/lib/core/gpu-info-node.js +2 -0
  319. package/dist-lib/lib/core/handoff-channel.d.ts +46 -0
  320. package/dist-lib/lib/core/handoff-channel.js +102 -0
  321. package/dist-lib/lib/core/health-assistant.d.ts +7 -0
  322. package/dist-lib/lib/core/health-assistant.js +24 -0
  323. package/dist-lib/lib/core/helpers/index.d.ts +5 -0
  324. package/dist-lib/lib/core/helpers/index.js +74 -0
  325. package/dist-lib/lib/core/hosted-agents.d.ts +36 -0
  326. package/dist-lib/lib/core/hosted-agents.js +127 -0
  327. package/dist-lib/lib/core/id.d.ts +1 -0
  328. package/dist-lib/lib/core/id.js +5 -0
  329. package/dist-lib/lib/core/identity.d.ts +14 -0
  330. package/dist-lib/lib/core/identity.js +45 -0
  331. package/dist-lib/lib/core/image/cache-sweep.d.ts +12 -0
  332. package/dist-lib/lib/core/image/cache-sweep.js +67 -0
  333. package/dist-lib/lib/core/image/normalize.d.ts +3 -0
  334. package/dist-lib/lib/core/image/normalize.js +49 -0
  335. package/dist-lib/lib/core/image/sniff.d.ts +3 -0
  336. package/dist-lib/lib/core/image/sniff.js +149 -0
  337. package/dist-lib/lib/core/invite.d.ts +14 -0
  338. package/dist-lib/lib/core/invite.js +36 -0
  339. package/dist-lib/lib/core/local/index.d.ts +71 -0
  340. package/dist-lib/lib/core/local/index.js +391 -0
  341. package/dist-lib/lib/core/membership.d.ts +15 -0
  342. package/dist-lib/lib/core/membership.js +40 -0
  343. package/dist-lib/lib/core/mesh.d.ts +153 -0
  344. package/dist-lib/lib/core/mesh.js +509 -0
  345. package/dist-lib/lib/core/migrations/agent-catalog.d.ts +6 -0
  346. package/dist-lib/lib/core/migrations/agent-catalog.js +17 -0
  347. package/dist-lib/lib/core/migrations/index.d.ts +5 -0
  348. package/dist-lib/lib/core/migrations/index.js +7 -0
  349. package/dist-lib/lib/core/migrations/membership.d.ts +11 -0
  350. package/dist-lib/lib/core/migrations/membership.js +26 -0
  351. package/dist-lib/lib/core/min-version.d.ts +6 -0
  352. package/dist-lib/lib/core/min-version.js +31 -0
  353. package/dist-lib/lib/core/next-frame.d.ts +6 -0
  354. package/dist-lib/lib/core/next-frame.js +27 -0
  355. package/dist-lib/lib/core/notification.d.ts +6 -0
  356. package/dist-lib/lib/core/notification.js +162 -0
  357. package/dist-lib/lib/core/ota-config.d.ts +19 -0
  358. package/dist-lib/lib/core/ota-config.js +44 -0
  359. package/dist-lib/lib/core/prompt-history.d.ts +12 -0
  360. package/dist-lib/lib/core/prompt-history.js +40 -0
  361. package/dist-lib/lib/core/search-fold.d.ts +1 -0
  362. package/dist-lib/lib/core/search-fold.js +4 -0
  363. package/dist-lib/lib/core/secret-handoff.d.ts +17 -0
  364. package/dist-lib/lib/core/secret-handoff.js +29 -0
  365. package/dist-lib/lib/core/send.d.ts +18 -0
  366. package/dist-lib/lib/core/send.js +46 -0
  367. package/dist-lib/lib/core/skill-overlay-handoff.d.ts +25 -0
  368. package/dist-lib/lib/core/skill-overlay-handoff.js +50 -0
  369. package/dist-lib/lib/core/skill-overlay-receiver.d.ts +8 -0
  370. package/dist-lib/lib/core/skill-overlay-receiver.js +20 -0
  371. package/dist-lib/lib/core/skill-secrets.d.ts +25 -0
  372. package/dist-lib/lib/core/skill-secrets.js +79 -0
  373. package/dist-lib/lib/core/sync/chats.d.ts +3 -0
  374. package/dist-lib/lib/core/sync/chats.js +5 -0
  375. package/dist-lib/lib/core/sync/chunks.d.ts +9 -0
  376. package/dist-lib/lib/core/sync/chunks.js +16 -0
  377. package/dist-lib/lib/core/sync/devices.d.ts +4 -0
  378. package/dist-lib/lib/core/sync/devices.js +12 -0
  379. package/dist-lib/lib/core/sync/files.d.ts +16 -0
  380. package/dist-lib/lib/core/sync/files.js +109 -0
  381. package/dist-lib/lib/core/sync/index.d.ts +5 -0
  382. package/dist-lib/lib/core/sync/index.js +63 -0
  383. package/dist-lib/lib/core/sync-status.d.ts +17 -0
  384. package/dist-lib/lib/core/sync-status.js +129 -0
  385. package/dist-lib/lib/core/system-info.d.ts +24 -0
  386. package/dist-lib/lib/core/system-info.js +66 -0
  387. package/dist-lib/lib/core/tool-activity.d.ts +22 -0
  388. package/dist-lib/lib/core/tool-activity.js +39 -0
  389. package/dist-lib/lib/core/tool-configs.d.ts +13 -0
  390. package/dist-lib/lib/core/tool-configs.js +141 -0
  391. package/dist-lib/lib/core.d.ts +291 -0
  392. package/dist-lib/lib/core.js +2126 -0
  393. package/dist-lib/lib/credential-pusher.d.ts +67 -0
  394. package/dist-lib/lib/credential-pusher.js +290 -0
  395. package/dist-lib/lib/custom-model-pusher.d.ts +9 -0
  396. package/dist-lib/lib/custom-model-pusher.js +42 -0
  397. package/dist-lib/lib/custom-model-source.d.ts +15 -0
  398. package/dist-lib/lib/custom-model-source.js +46 -0
  399. package/dist-lib/lib/deadline.d.ts +9 -0
  400. package/dist-lib/lib/deadline.js +31 -0
  401. package/dist-lib/lib/diagnostics.d.ts +35 -0
  402. package/dist-lib/lib/diagnostics.js +14 -0
  403. package/dist-lib/lib/fetch-node.d.ts +1 -0
  404. package/dist-lib/lib/fetch-node.js +1 -0
  405. package/dist-lib/lib/fs-drive-bridge.d.ts +12 -0
  406. package/dist-lib/lib/fs-drive-bridge.js +186 -0
  407. package/dist-lib/lib/fs-grant-keys.d.ts +2 -0
  408. package/dist-lib/lib/fs-grant-keys.js +6 -0
  409. package/dist-lib/lib/fs-grants.d.ts +10 -0
  410. package/dist-lib/lib/fs-grants.js +44 -0
  411. package/dist-lib/lib/image-cache-dir.d.ts +1 -0
  412. package/dist-lib/lib/image-cache-dir.js +5 -0
  413. package/dist-lib/lib/integrations/index.d.ts +4 -0
  414. package/dist-lib/lib/integrations/index.js +3 -0
  415. package/dist-lib/lib/integrations/mcp-providers.d.ts +12 -0
  416. package/dist-lib/lib/integrations/mcp-providers.js +22 -0
  417. package/dist-lib/lib/integrations/oauth-providers.d.ts +14 -0
  418. package/dist-lib/lib/integrations/oauth-providers.js +116 -0
  419. package/dist-lib/lib/integrations/setup-routes.d.ts +12 -0
  420. package/dist-lib/lib/integrations/setup-routes.js +114 -0
  421. package/dist-lib/lib/knowledge-search.d.ts +7 -0
  422. package/dist-lib/lib/knowledge-search.js +53 -0
  423. package/dist-lib/lib/kv-cache-reclaim.d.ts +5 -0
  424. package/dist-lib/lib/kv-cache-reclaim.js +29 -0
  425. package/dist-lib/lib/kv-cache.d.ts +18 -0
  426. package/dist-lib/lib/kv-cache.js +33 -0
  427. package/dist-lib/lib/legacy-core-domain.d.ts +258 -0
  428. package/dist-lib/lib/legacy-core-domain.js +1 -0
  429. package/dist-lib/lib/llm-model-names.d.ts +1 -0
  430. package/dist-lib/lib/llm-model-names.js +1 -0
  431. package/dist-lib/lib/log-buffer.d.ts +7 -0
  432. package/dist-lib/lib/log-buffer.js +16 -0
  433. package/dist-lib/lib/log-levels.d.ts +7 -0
  434. package/dist-lib/lib/log-levels.js +1 -0
  435. package/dist-lib/lib/log.d.ts +60 -0
  436. package/dist-lib/lib/log.js +149 -0
  437. package/dist-lib/lib/logger-type.d.ts +13 -0
  438. package/dist-lib/lib/logger-type.js +1 -0
  439. package/dist-lib/lib/logger.d.ts +5 -0
  440. package/dist-lib/lib/logger.js +18 -0
  441. package/dist-lib/lib/model-catalog-revision.d.ts +9 -0
  442. package/dist-lib/lib/model-catalog-revision.js +65 -0
  443. package/dist-lib/lib/model-clamp.d.ts +6 -0
  444. package/dist-lib/lib/model-clamp.js +20 -0
  445. package/dist-lib/lib/model-context.d.ts +13 -0
  446. package/dist-lib/lib/model-context.js +71 -0
  447. package/dist-lib/lib/model-download-status.d.ts +29 -0
  448. package/dist-lib/lib/model-download-status.js +56 -0
  449. package/dist-lib/lib/model-download.d.ts +191 -0
  450. package/dist-lib/lib/model-download.js +787 -0
  451. package/dist-lib/lib/oauth/asana.d.ts +35 -0
  452. package/dist-lib/lib/oauth/asana.js +71 -0
  453. package/dist-lib/lib/oauth/browser-connect.d.ts +22 -0
  454. package/dist-lib/lib/oauth/browser-connect.js +83 -0
  455. package/dist-lib/lib/oauth/client.d.ts +9 -0
  456. package/dist-lib/lib/oauth/client.js +9 -0
  457. package/dist-lib/lib/oauth/common.d.ts +38 -0
  458. package/dist-lib/lib/oauth/common.js +36 -0
  459. package/dist-lib/lib/oauth/crypto.d.ts +3 -0
  460. package/dist-lib/lib/oauth/crypto.js +25 -0
  461. package/dist-lib/lib/oauth/fetch-platform.d.ts +1 -0
  462. package/dist-lib/lib/oauth/fetch-platform.js +1 -0
  463. package/dist-lib/lib/oauth/flow-core.d.ts +6 -0
  464. package/dist-lib/lib/oauth/flow-core.js +37 -0
  465. package/dist-lib/lib/oauth/flow.d.ts +3 -0
  466. package/dist-lib/lib/oauth/flow.js +24 -0
  467. package/dist-lib/lib/oauth/google.d.ts +37 -0
  468. package/dist-lib/lib/oauth/google.js +77 -0
  469. package/dist-lib/lib/oauth/host.d.ts +5 -0
  470. package/dist-lib/lib/oauth/host.js +3 -0
  471. package/dist-lib/lib/oauth/keys.d.ts +25 -0
  472. package/dist-lib/lib/oauth/keys.js +93 -0
  473. package/dist-lib/lib/oauth/loopback.d.ts +3 -0
  474. package/dist-lib/lib/oauth/loopback.js +119 -0
  475. package/dist-lib/lib/oauth/loopback.stub.d.ts +3 -0
  476. package/dist-lib/lib/oauth/loopback.stub.js +6 -0
  477. package/dist-lib/lib/oauth/notion.d.ts +34 -0
  478. package/dist-lib/lib/oauth/notion.js +82 -0
  479. package/dist-lib/lib/oauth/pkce-runtime.d.ts +3 -0
  480. package/dist-lib/lib/oauth/pkce-runtime.js +5 -0
  481. package/dist-lib/lib/oauth/pkce.d.ts +8 -0
  482. package/dist-lib/lib/oauth/pkce.js +6 -0
  483. package/dist-lib/lib/oauth/providers.d.ts +5 -0
  484. package/dist-lib/lib/oauth/providers.js +73 -0
  485. package/dist-lib/lib/oauth/redirect-types.d.ts +19 -0
  486. package/dist-lib/lib/oauth/redirect-types.js +1 -0
  487. package/dist-lib/lib/oauth/register.d.ts +3 -0
  488. package/dist-lib/lib/oauth/register.js +34 -0
  489. package/dist-lib/lib/oauth/resolve.d.ts +17 -0
  490. package/dist-lib/lib/oauth/resolve.js +57 -0
  491. package/dist-lib/lib/oauth/spotify.d.ts +32 -0
  492. package/dist-lib/lib/oauth/spotify.js +73 -0
  493. package/dist-lib/lib/oauth/token-exchange-core.d.ts +6 -0
  494. package/dist-lib/lib/oauth/token-exchange-core.js +97 -0
  495. package/dist-lib/lib/oauth/token-exchange.d.ts +5 -0
  496. package/dist-lib/lib/oauth/token-exchange.js +9 -0
  497. package/dist-lib/lib/oauth/types.d.ts +54 -0
  498. package/dist-lib/lib/oauth/types.js +1 -0
  499. package/dist-lib/lib/oauth.client.d.ts +5 -0
  500. package/dist-lib/lib/oauth.client.js +2 -0
  501. package/dist-lib/lib/oauth.d.ts +14 -0
  502. package/dist-lib/lib/oauth.js +12 -0
  503. package/dist-lib/lib/obsidian-key.d.ts +1 -0
  504. package/dist-lib/lib/obsidian-key.js +1 -0
  505. package/dist-lib/lib/race-resource.d.ts +5 -0
  506. package/dist-lib/lib/race-resource.js +25 -0
  507. package/dist-lib/lib/reconnecting-watch.d.ts +2 -0
  508. package/dist-lib/lib/reconnecting-watch.js +78 -0
  509. package/dist-lib/lib/retry-budget.d.ts +14 -0
  510. package/dist-lib/lib/retry-budget.js +39 -0
  511. package/dist-lib/lib/run-notices.d.ts +23 -0
  512. package/dist-lib/lib/run-notices.js +33 -0
  513. package/dist-lib/lib/run-transcript.d.ts +35 -0
  514. package/dist-lib/lib/run-transcript.js +106 -0
  515. package/dist-lib/lib/skill-readiness.d.ts +2 -0
  516. package/dist-lib/lib/skill-readiness.js +21 -0
  517. package/dist-lib/lib/skill-types.d.ts +70 -0
  518. package/dist-lib/lib/skill-types.js +1 -0
  519. package/dist-lib/lib/spec-loader.d.ts +14 -0
  520. package/dist-lib/lib/spec-loader.js +9 -0
  521. package/dist-lib/lib/suspend-lifecycle.d.ts +17 -0
  522. package/dist-lib/lib/suspend-lifecycle.js +33 -0
  523. package/dist-lib/lib/task.d.ts +26 -0
  524. package/dist-lib/lib/task.js +69 -0
  525. package/dist-lib/lib/unref.d.ts +3 -0
  526. package/dist-lib/lib/unref.js +4 -0
  527. package/dist-lib/lib/wav-duration.d.ts +1 -0
  528. package/dist-lib/lib/wav-duration.js +53 -0
  529. package/dist-lib/lib/write-queue.d.ts +22 -0
  530. package/dist-lib/lib/write-queue.js +39 -0
  531. package/dist-lib/schema/build.d.ts +1 -0
  532. package/dist-lib/schema/build.js +120 -0
  533. package/dist-lib/schema/config.d.ts +4 -0
  534. package/dist-lib/schema/config.js +7 -0
  535. package/dist-lib/schema/content.d.ts +20 -0
  536. package/dist-lib/schema/content.js +122 -0
  537. package/dist-lib/schema/engine.d.ts +2 -0
  538. package/dist-lib/schema/engine.js +2013 -0
  539. package/dist-lib/schema/field-order.d.ts +1 -0
  540. package/dist-lib/schema/field-order.js +95 -0
  541. package/dist-lib/schema/local.d.ts +2 -0
  542. package/dist-lib/schema/local.js +133 -0
  543. package/dist-lib/schema/qvac.d.ts +22 -0
  544. package/dist-lib/schema/qvac.js +722 -0
  545. package/dist-lib/spec/bind.d.ts +2 -0
  546. package/dist-lib/spec/bind.js +520 -0
  547. package/dist-lib/spec/calls.d.ts +3 -0
  548. package/dist-lib/spec/calls.js +129 -0
  549. package/dist-lib/spec/capabilities.d.ts +263 -0
  550. package/dist-lib/spec/config/hyperconf/index.d.ts +15 -0
  551. package/dist-lib/spec/config/hyperconf/index.js +24 -0
  552. package/dist-lib/spec/config/hyperconf/package.json +3 -0
  553. package/dist-lib/spec/config/hyperschema/index.js +81 -0
  554. package/dist-lib/spec/config/hyperschema/schema.json +19 -0
  555. package/dist-lib/spec/hrpc/hrpc.json +1500 -0
  556. package/dist-lib/spec/hrpc/index.d.ts +3 -0
  557. package/dist-lib/spec/hrpc/index.js +1545 -0
  558. package/dist-lib/spec/hrpc/messages.d.ts +4 -0
  559. package/dist-lib/spec/hrpc/messages.js +8373 -0
  560. package/dist-lib/spec/hyperschema/index.d.ts +20 -0
  561. package/dist-lib/spec/hyperschema/index.js +8373 -0
  562. package/dist-lib/spec/hyperschema/schema.json +6202 -0
  563. package/dist-lib/spec/hyperschema/types.d.ts +1545 -0
  564. package/dist-lib/spec/index.d.ts +36 -0
  565. package/dist-lib/spec/index.js +6 -0
  566. package/dist-lib/spec/local/hyperdb/db.json +186 -0
  567. package/dist-lib/spec/local/hyperdb/index.d.ts +9 -0
  568. package/dist-lib/spec/local/hyperdb/index.js +855 -0
  569. package/dist-lib/spec/local/hyperdb/messages.js +2189 -0
  570. package/dist-lib/spec/local/hyperschema/index.js +1208 -0
  571. package/dist-lib/spec/local/hyperschema/schema.json +639 -0
  572. package/dist-lib/spec/local/hyperschema/types.d.ts +159 -0
  573. package/dist-lib/spec/mesh/hyperdb/db.json +702 -0
  574. package/dist-lib/spec/mesh/hyperdb/index.d.ts +9 -0
  575. package/dist-lib/spec/mesh/hyperdb/index.js +2260 -0
  576. package/dist-lib/spec/mesh/hyperdb/messages.js +7453 -0
  577. package/dist-lib/spec/mesh/hyperdispatch/dispatch.json +174 -0
  578. package/dist-lib/spec/mesh/hyperdispatch/index.d.ts +13 -0
  579. package/dist-lib/spec/mesh/hyperdispatch/index.js +566 -0
  580. package/dist-lib/spec/mesh/hyperdispatch/messages.js +5713 -0
  581. package/dist-lib/spec/mesh/hyperschema/index.d.ts +14 -0
  582. package/dist-lib/spec/mesh/hyperschema/index.js +5713 -0
  583. package/dist-lib/spec/mesh/hyperschema/schema.json +3142 -0
  584. package/dist-lib/spec/mesh/hyperschema/types.d.ts +754 -0
  585. package/ducks.png +0 -0
  586. package/package.json +332 -1
@@ -0,0 +1,212 @@
1
+ import { CHUNK_PAYLOAD_FIELDS, ragSourcesWithinBounds } from "../../schema/qvac.js";
2
+ import { chunkTypeOrdinal, mediaKindOrdinal } from '../../schema/helpers.js';
3
+ import { putApprovalRule } from "./approval-rules.js";
4
+ import { linkAttachment } from "./attachment-link.js";
5
+ import { randomId } from "./id.js";
6
+ const CHUNKS = '@qvac/chunks';
7
+ const CHUNKS_BY_CHAT = '@qvac/chunks-by-chat';
8
+ const CHUNKS_BY_TYPE = '@qvac/chunks-by-type';
9
+ const HISTORY_CHUNKS = '@qvac/history-chunks';
10
+ const ATTACHMENTS_BY_MEDIA_KIND = '@qvac/attachments-by-media-kind';
11
+ const ATTACHMENTS_BY_MEDIA_KIND_ORIGIN = '@qvac/attachments-by-media-kind-origin';
12
+ export const HISTORY_CHUNK_TYPES = [
13
+ 'user-message',
14
+ 'run-request',
15
+ 'content',
16
+ 'attachment',
17
+ 'compaction'
18
+ ];
19
+ function linkChunks(store, chunks) {
20
+ const mint = store.attachmentUrl;
21
+ if (!mint)
22
+ return chunks;
23
+ return chunks.map((chunk) => chunk.attachment ? { ...chunk, attachment: linkAttachment(mint, chunk.attachment) } : chunk);
24
+ }
25
+ export function findChunksOfType(snap, chatId, type, { fromSeq, toSeq } = {}) {
26
+ const ordinal = chunkTypeOrdinal(type);
27
+ return snap
28
+ .find(CHUNKS_BY_TYPE, {
29
+ gte: fromSeq === undefined ? { chatId, type: ordinal } : { chatId, type: ordinal, seq: fromSeq },
30
+ lte: toSeq === undefined ? { chatId, type: ordinal } : { chatId, type: ordinal, seq: toSeq }
31
+ })
32
+ .toArray();
33
+ }
34
+ export async function listChunks(store, { chatId, type, types, fromSeq, reverse, limit }) {
35
+ const selected = selectedChunkTypes(type, types);
36
+ if (selected?.length === 0)
37
+ return [];
38
+ const options = { reverse: reverse === true, limit: limit || undefined };
39
+ if (selected && selected.length > 1 && !isHistorySelection(selected)) {
40
+ throw new Error('multiple chunk types require a mapped index');
41
+ }
42
+ const snap = store.view.snapshot();
43
+ try {
44
+ if (selected?.length === 1) {
45
+ const selectedType = chunkTypeOrdinal(selected[0]);
46
+ const chunks = await snap
47
+ .find(CHUNKS_BY_TYPE, {
48
+ gte: fromSeq === undefined
49
+ ? { chatId, type: selectedType }
50
+ : { chatId, type: selectedType, seq: fromSeq },
51
+ lte: { chatId, type: selectedType },
52
+ ...options
53
+ })
54
+ .toArray();
55
+ return linkChunks(store, chunks);
56
+ }
57
+ const chunks = await snap
58
+ .find(selected ? HISTORY_CHUNKS : CHUNKS_BY_CHAT, {
59
+ gte: fromSeq === undefined ? { chatId } : { chatId, seq: fromSeq },
60
+ lte: { chatId },
61
+ ...options
62
+ })
63
+ .toArray();
64
+ return linkChunks(store, chunks);
65
+ }
66
+ finally {
67
+ await snap.close();
68
+ }
69
+ }
70
+ export async function listAttachmentsByKind(store, { kind, origin, fromCreatedAt, reverse, limit }) {
71
+ const mediaKind = mediaKindOrdinal(kind);
72
+ const options = { reverse: reverse === true, limit: limit || undefined };
73
+ const snap = store.view.snapshot();
74
+ try {
75
+ if (origin === undefined) {
76
+ const chunks = await snap
77
+ .find(ATTACHMENTS_BY_MEDIA_KIND, {
78
+ gte: fromCreatedAt === undefined ? { mediaKind } : { mediaKind, createdAt: fromCreatedAt },
79
+ lte: { mediaKind },
80
+ ...options
81
+ })
82
+ .toArray();
83
+ return linkChunks(store, chunks);
84
+ }
85
+ const generated = origin === 'generated' ? 1 : 0;
86
+ const chunks = await snap
87
+ .find(ATTACHMENTS_BY_MEDIA_KIND_ORIGIN, {
88
+ gte: fromCreatedAt === undefined
89
+ ? { mediaKind, generated }
90
+ : { mediaKind, generated, createdAt: fromCreatedAt },
91
+ lte: { mediaKind, generated },
92
+ ...options
93
+ })
94
+ .toArray();
95
+ return linkChunks(store, chunks);
96
+ }
97
+ finally {
98
+ await snap.close();
99
+ }
100
+ }
101
+ function selectedChunkTypes(type, types) {
102
+ if (!type && types === undefined)
103
+ return null;
104
+ const selected = new Set(types);
105
+ if (type)
106
+ selected.add(type);
107
+ return [...selected];
108
+ }
109
+ function isHistorySelection(types) {
110
+ return (types.length === HISTORY_CHUNK_TYPES.length &&
111
+ types.every((type) => HISTORY_CHUNK_TYPES.includes(type)));
112
+ }
113
+ export async function getChunk(store, id) {
114
+ const snap = store.view.snapshot();
115
+ try {
116
+ const chunk = await snap.get(CHUNKS, { id });
117
+ return chunk;
118
+ }
119
+ finally {
120
+ await snap.close();
121
+ }
122
+ }
123
+ async function mustGetChunk(store, id) {
124
+ const chunk = await getChunk(store, id);
125
+ if (!chunk)
126
+ throw new Error(`chunk not found: ${id}`);
127
+ return chunk;
128
+ }
129
+ function assertPayloadMatchesType(type, payload) {
130
+ const field = CHUNK_PAYLOAD_FIELDS[type];
131
+ for (const candidate of Object.values(CHUNK_PAYLOAD_FIELDS)) {
132
+ if ((payload[candidate] !== null && payload[candidate] !== undefined) ===
133
+ (candidate === field)) {
134
+ continue;
135
+ }
136
+ throw new Error(`chunk payload invalid: ${type} carries ${field} and nothing else`);
137
+ }
138
+ }
139
+ export async function appendChunk(store, { id = randomId(), chatId, runId, type, originDeviceId, parentId, effect, intent, display, rawCall, ...payload }, into = store) {
140
+ assertPayloadMatchesType(type, payload);
141
+ if (type === 'sources' && !runId) {
142
+ throw new Error('chunk payload invalid: a sources chunk requires runId');
143
+ }
144
+ if (type === 'sources' && !ragSourcesWithinBounds(payload.sources)) {
145
+ throw new Error('chunk payload invalid: a sources chunk exceeds its wire bounds');
146
+ }
147
+ if (parentId) {
148
+ const parent = await getChunk(store, parentId);
149
+ if (!parent || parent.chatId !== chatId) {
150
+ throw new Error(`chunk payload invalid: parentId is not a chunk in this chat: ${parentId}`);
151
+ }
152
+ }
153
+ const op = {
154
+ id,
155
+ chatId,
156
+ runId,
157
+ type,
158
+ originDeviceId,
159
+ parentId,
160
+ effect,
161
+ intent,
162
+ display,
163
+ rawCall,
164
+ createdAt: Date.now(),
165
+ ...payload
166
+ };
167
+ await into.dispatch('append-chunk', op);
168
+ return { id };
169
+ }
170
+ export async function updateChunk(store, { id, runStatus, attachment }) {
171
+ const chunk = await mustGetChunk(store, id);
172
+ await store.dispatch('update-chunk', updateOp(chunk, { id, runStatus, attachment }));
173
+ const updated = await mustGetChunk(store, id);
174
+ return updated;
175
+ }
176
+ export function updateOp(chunk, { id, runStatus, attachment }) {
177
+ if (chunk.type === 'run-status' &&
178
+ runStatus !== null &&
179
+ runStatus !== undefined &&
180
+ (attachment === null || attachment === undefined)) {
181
+ return { id, runStatus, updatedAt: Date.now() };
182
+ }
183
+ if (chunk.type === 'attachment' &&
184
+ attachment !== null &&
185
+ attachment !== undefined &&
186
+ (runStatus === null || runStatus === undefined)) {
187
+ return { id, attachment, updatedAt: Date.now() };
188
+ }
189
+ throw new Error('chunk payload invalid: a run-status edits runStatus, an attachment edits attachment');
190
+ }
191
+ const DEFAULT_APPROVAL_RULE_TTL_MS = 60 * 60 * 1000;
192
+ export async function resolveApproval(store, { id, approved, scope, expiresAt, agentId }) {
193
+ const before = await getChunk(store, id);
194
+ const wasPending = before?.type === 'approval-request' && before.approvalRequest?.status === 'pending';
195
+ await store.dispatch('resolve-approval', { id, approved, resolvedAt: Date.now() });
196
+ const resolved = await mustGetChunk(store, id);
197
+ if (scope === 'always' && wasPending) {
198
+ const ask = resolved.approvalRequest;
199
+ if (ask && (ask.status === 'approved' || ask.status === 'denied')) {
200
+ await putApprovalRule(store, {
201
+ toolName: ask.name,
202
+ resourceKind: ask.resource?.kind ?? undefined,
203
+ resourcePattern: ask.resource?.label ?? undefined,
204
+ decision: ask.status === 'approved' ? 'allow' : 'deny',
205
+ expiresAt: expiresAt ?? Date.now() + DEFAULT_APPROVAL_RULE_TTL_MS,
206
+ agentId: ask.agentId ?? agentId,
207
+ effect: resolved.effect ?? undefined
208
+ });
209
+ }
210
+ }
211
+ return resolved;
212
+ }
@@ -0,0 +1,11 @@
1
+ import type { AutobeeNode } from 'autobee';
2
+ import type HyperDB from 'hyperdb';
3
+ import type { QvacDevice } from '../../../spec/mesh/hyperschema/types.d.ts';
4
+ import type { RouterContext } from './types.ts';
5
+ type RouteHandler<T> = (op: T, ctx: RouterContext) => Promise<unknown>;
6
+ export declare function trackActivity<T>(handler: RouteHandler<T>): RouteHandler<T>;
7
+ export declare function devicesByWriterKey(tx: HyperDB, writerKey: Buffer): import("hyperdb").HyperDBStream<QvacDevice>;
8
+ export declare function liveDeviceForWriter(db: HyperDB, writerKey: Buffer): Promise<QvacDevice | null>;
9
+ export declare function markWriterRevoked(tx: HyperDB, writerKey: Buffer, revoked: boolean): Promise<void>;
10
+ export declare function recordActivity(tx: HyperDB, node: AutobeeNode, clock: number): Promise<void>;
11
+ export {};
@@ -0,0 +1,45 @@
1
+ const WRITER_ACTIVITY = '@qvac/writer-activity';
2
+ const DEVICES_BY_WRITER_KEY = '@qvac/devices-by-writer-key';
3
+ export function trackActivity(handler) {
4
+ return async (op, ctx) => {
5
+ const applied = await handler(op, ctx);
6
+ if (applied)
7
+ await recordActivity(ctx.tx, ctx.node, ctx.host.clock);
8
+ return applied;
9
+ };
10
+ }
11
+ export function devicesByWriterKey(tx, writerKey) {
12
+ return tx.find(DEVICES_BY_WRITER_KEY, {
13
+ gte: { writerKey },
14
+ lte: { writerKey }
15
+ });
16
+ }
17
+ export async function liveDeviceForWriter(db, writerKey) {
18
+ for await (const device of devicesByWriterKey(db, writerKey)) {
19
+ if (!device.revoked)
20
+ return device;
21
+ }
22
+ return null;
23
+ }
24
+ export async function markWriterRevoked(tx, writerKey, revoked) {
25
+ const existing = await tx.get(WRITER_ACTIVITY, { writerKey });
26
+ if (!existing || existing.revoked === revoked)
27
+ return;
28
+ await tx.insert(WRITER_ACTIVITY, { ...existing, revoked });
29
+ }
30
+ export async function recordActivity(tx, node, clock) {
31
+ const existing = await tx.get(WRITER_ACTIVITY, { writerKey: node.key });
32
+ if (existing && existing.length >= node.length)
33
+ return;
34
+ const device = existing ? null : await devicesByWriterKey(tx, node.key).one();
35
+ const deviceId = existing?.deviceId ?? device?.id;
36
+ if (!deviceId)
37
+ return;
38
+ await tx.insert(WRITER_ACTIVITY, {
39
+ writerKey: node.key,
40
+ deviceId,
41
+ length: node.length,
42
+ clock,
43
+ revoked: existing ? existing.revoked : device?.revoked
44
+ });
45
+ }
@@ -0,0 +1,2 @@
1
+ import type { Router } from '../../../spec/mesh/hyperdispatch/index.js';
2
+ export declare function registerAgentRoutes(router: Router): void;
@@ -0,0 +1,29 @@
1
+ import { trackActivity } from "./activity.js";
2
+ const AGENTS = '@qvac/agents';
3
+ export function registerAgentRoutes(router) {
4
+ router.add('@qvac/put-agent', trackActivity(async ({ agent }, { tx, log }) => {
5
+ const existing = await tx.get(AGENTS, { id: agent.id });
6
+ if (existing && existing.updatedAt > agent.updatedAt) {
7
+ log?.debug('contract', 'put-agent dropped: stale updatedAt', { id: agent.id });
8
+ return;
9
+ }
10
+ await tx.insert(AGENTS, agent);
11
+ log?.debug('contract', existing ? 'agent updated' : 'agent created', { id: agent.id });
12
+ return agent;
13
+ }));
14
+ router.add('@qvac/migrate-agent-catalog', trackActivity(async ({ agent: healthAssistant }, { tx, log }) => {
15
+ if (await tx.get(AGENTS, { id: healthAssistant.id }))
16
+ return false;
17
+ const legacyDefault = (await tx.find(AGENTS).toArray()).find((agent) => !agent.deletedAt && agent.isDefault && agent.name === 'Agent');
18
+ if (legacyDefault) {
19
+ await tx.insert(AGENTS, {
20
+ ...legacyDefault,
21
+ version: undefined,
22
+ name: 'QV.AC'
23
+ });
24
+ }
25
+ await tx.insert(AGENTS, healthAssistant);
26
+ log?.info('contract', 'agent catalog migrated');
27
+ return true;
28
+ }));
29
+ }
@@ -0,0 +1,2 @@
1
+ import type { Router } from '../../../spec/mesh/hyperdispatch/index.js';
2
+ export declare function registerApprovalRuleRoutes(router: Router): void;
@@ -0,0 +1,14 @@
1
+ import { trackActivity } from "./activity.js";
2
+ const APPROVAL_RULES = '@qvac/approval-rules';
3
+ export function registerApprovalRuleRoutes(router) {
4
+ router.add('@qvac/put-approval-rule', trackActivity(async ({ rule }, { tx, log }) => {
5
+ const existing = await tx.get(APPROVAL_RULES, { id: rule.id });
6
+ if (existing && existing.updatedAt > rule.updatedAt) {
7
+ log?.debug('contract', 'put-approval-rule dropped: stale updatedAt', { id: rule.id });
8
+ return;
9
+ }
10
+ await tx.insert(APPROVAL_RULES, rule);
11
+ log?.info('contract', 'approval rule set', { id: rule.id });
12
+ return rule;
13
+ }));
14
+ }
@@ -0,0 +1,2 @@
1
+ import type { Router } from '../../../spec/mesh/hyperdispatch/index.js';
2
+ export declare function registerAttestationRoutes(router: Router): void;
@@ -0,0 +1,14 @@
1
+ import { verifyDeviceAttestation } from "../device-attestation.js";
2
+ const DEVICE_ATTESTATIONS = '@qvac/device-attestations';
3
+ export function registerAttestationRoutes(router) {
4
+ router.add('@qvac/attest-device', async (payload, { tx, meshDevicePublicKey, log }) => {
5
+ if (!verifyDeviceAttestation(meshDevicePublicKey, payload)) {
6
+ log?.warn('contract', 'attest-device dropped: signature is not over this device id');
7
+ return;
8
+ }
9
+ await tx.insert(DEVICE_ATTESTATIONS, {
10
+ deviceId: payload.deviceId,
11
+ signature: payload.signature
12
+ });
13
+ });
14
+ }
@@ -0,0 +1,2 @@
1
+ import type { Router } from '../../../spec/mesh/hyperdispatch/index.js';
2
+ export declare function registerChatGroupRoutes(router: Router): void;
@@ -0,0 +1,20 @@
1
+ import { trackActivity } from "./activity.js";
2
+ const CHAT_GROUPS = '@qvac/chat-groups';
3
+ export function registerChatGroupRoutes(router) {
4
+ router.add('@qvac/put-chat-group', trackActivity(async ({ group }, { tx, log }) => {
5
+ const existing = await tx.get(CHAT_GROUPS, { id: group.id });
6
+ if (existing?.deletedAt && !group.deletedAt) {
7
+ log?.debug('contract', 'put-chat-group dropped: tombstone is sticky', { id: group.id });
8
+ return;
9
+ }
10
+ if (existing && !group.deletedAt && existing.updatedAt > group.updatedAt) {
11
+ log?.debug('contract', 'put-chat-group dropped: stale updatedAt', { id: group.id });
12
+ return;
13
+ }
14
+ await tx.insert(CHAT_GROUPS, group);
15
+ log?.debug('contract', existing ? 'chat group updated' : 'chat group created', {
16
+ id: group.id
17
+ });
18
+ return group;
19
+ }));
20
+ }
@@ -0,0 +1,2 @@
1
+ import type { Router } from '../../../spec/mesh/hyperdispatch/index.js';
2
+ export declare function registerChatRoutes(router: Router): void;
@@ -0,0 +1,18 @@
1
+ import { trackActivity } from "./activity.js";
2
+ const CHATS = '@qvac/chats';
3
+ export function registerChatRoutes(router) {
4
+ router.add('@qvac/put-chat', trackActivity(async ({ chat }, { tx, log }) => {
5
+ const existing = await tx.get(CHATS, { id: chat.id });
6
+ if (existing?.deletedAt && !chat.deletedAt) {
7
+ log?.debug('contract', 'put-chat dropped: tombstone is sticky', { id: chat.id });
8
+ return;
9
+ }
10
+ if (existing && !chat.deletedAt && (existing.updatedAt ?? 0) > (chat.updatedAt ?? 0)) {
11
+ log?.debug('contract', 'put-chat dropped: stale updatedAt', { id: chat.id });
12
+ return;
13
+ }
14
+ await tx.insert(CHATS, chat);
15
+ log?.debug('contract', existing ? 'chat updated' : 'chat created', { id: chat.id });
16
+ return chat;
17
+ }));
18
+ }
@@ -0,0 +1,2 @@
1
+ import type { Router } from '../../../spec/mesh/hyperdispatch/index.js';
2
+ export declare function registerChunkRoutes(router: Router): void;
@@ -0,0 +1,156 @@
1
+ import { devicesByWriterKey, trackActivity } from "./activity.js";
2
+ import { CHUNK_PAYLOAD_FIELDS, ragSourcesWithinBounds } from "../../../schema/qvac.js";
3
+ import { chunkTypeOrdinal } from '../../../schema/helpers.js';
4
+ const CHUNKS = '@qvac/chunks';
5
+ const CHUNKS_BY_TYPE = '@qvac/chunks-by-type';
6
+ const CHUNK_COUNTERS = '@qvac/chunk-counters';
7
+ const DEVICES = '@qvac/devices';
8
+ const TERMINAL_RUN_STATES = new Set(['completed', 'failed', 'canceled']);
9
+ const CREDITED_CHUNK_TYPES = new Set(['run-request', 'run-status']);
10
+ async function runHasTerminalStatus(tx, chatId, runId) {
11
+ const type = chunkTypeOrdinal('run-status');
12
+ const statuses = tx.find(CHUNKS_BY_TYPE, {
13
+ gte: { chatId, type },
14
+ lte: { chatId, type }
15
+ });
16
+ for await (const chunk of statuses) {
17
+ if (chunk.runId === runId && TERMINAL_RUN_STATES.has(chunk.runStatus?.state ?? ''))
18
+ return true;
19
+ }
20
+ return false;
21
+ }
22
+ async function isOriginWriter(tx, chunk, writerKey) {
23
+ const device = await tx.get(DEVICES, { id: chunk.originDeviceId });
24
+ return Boolean(device?.writerKey?.equals(writerKey));
25
+ }
26
+ async function isAdmittedWriter(tx, writerKey) {
27
+ for await (const device of devicesByWriterKey(tx, writerKey)) {
28
+ if (!device.revoked)
29
+ return true;
30
+ }
31
+ return false;
32
+ }
33
+ function payloadMatchesType(op) {
34
+ const field = CHUNK_PAYLOAD_FIELDS[op.type];
35
+ for (const candidate of Object.values(CHUNK_PAYLOAD_FIELDS)) {
36
+ if ((op[candidate] !== null && op[candidate] !== undefined) !== (candidate === field)) {
37
+ return false;
38
+ }
39
+ }
40
+ return true;
41
+ }
42
+ export function registerChunkRoutes(router) {
43
+ router.add('@qvac/append-chunk', trackActivity(async (op, { tx, log }) => {
44
+ const chunk = await tx.get(CHUNKS, { id: op.id });
45
+ if (chunk)
46
+ return;
47
+ if (!payloadMatchesType(op)) {
48
+ log?.warn('contract', 'append-chunk dropped: payload does not match its type', {
49
+ id: op.id
50
+ });
51
+ return;
52
+ }
53
+ if (op.type === 'sources' && !op.runId) {
54
+ log?.warn('contract', 'append-chunk dropped: a sources chunk requires runId', {
55
+ id: op.id
56
+ });
57
+ return;
58
+ }
59
+ if (op.type === 'sources' && !ragSourcesWithinBounds(op.sources)) {
60
+ log?.warn('contract', 'append-chunk dropped: a sources chunk exceeds its wire bounds', {
61
+ id: op.id
62
+ });
63
+ return;
64
+ }
65
+ if (op.type === 'run-status' &&
66
+ op.runId !== null &&
67
+ op.runId !== undefined &&
68
+ (await runHasTerminalStatus(tx, op.chatId, op.runId))) {
69
+ log?.warn('contract', 'append-chunk dropped: the run already has a terminal run-status', {
70
+ id: op.id
71
+ });
72
+ return;
73
+ }
74
+ if (op.parentId !== null && op.parentId !== undefined) {
75
+ const parent = await tx.get(CHUNKS, { id: op.parentId });
76
+ if (!parent || parent.chatId !== op.chatId) {
77
+ log?.warn('contract', 'append-chunk dropped: parentId is not a chunk in this chat', {
78
+ id: op.id
79
+ });
80
+ return;
81
+ }
82
+ }
83
+ const counter = await tx.get(CHUNK_COUNTERS, { chatId: op.chatId });
84
+ const prevCount = counter?.count ?? 0;
85
+ const appended = { ...op, seq: prevCount };
86
+ await tx.insert(CHUNK_COUNTERS, {
87
+ chatId: op.chatId,
88
+ count: prevCount + 1,
89
+ lastActivityAt: Math.max(counter?.lastActivityAt ?? 0, op.createdAt)
90
+ });
91
+ await tx.insert(CHUNKS, appended);
92
+ return CREDITED_CHUNK_TYPES.has(op.type) ? appended : undefined;
93
+ }));
94
+ router.add('@qvac/update-chunk', trackActivity(async (op, { tx, node, log }) => {
95
+ const chunk = await tx.get(CHUNKS, { id: op.id });
96
+ if (!chunk) {
97
+ log?.debug('contract', 'update-chunk dropped: unknown chunk', { id: op.id });
98
+ return;
99
+ }
100
+ if (!(await isOriginWriter(tx, chunk, node.key))) {
101
+ log?.warn('contract', 'update-chunk dropped: writer is not the origin device', {
102
+ id: op.id
103
+ });
104
+ return;
105
+ }
106
+ if (chunk.type === 'run-status' && op.runStatus !== null && op.runStatus !== undefined) {
107
+ if (op.runStatus.state !== chunk.runStatus?.state) {
108
+ log?.warn('contract', 'update-chunk dropped: run-status state cannot change in place', {
109
+ id: op.id
110
+ });
111
+ return;
112
+ }
113
+ const next = { ...chunk, runStatus: op.runStatus, updatedAt: op.updatedAt };
114
+ await tx.insert(CHUNKS, next);
115
+ return next;
116
+ }
117
+ if (chunk.type === 'attachment' && op.attachment !== null && op.attachment !== undefined) {
118
+ if (chunk.attachment?.deletedAt) {
119
+ log?.debug('contract', 'update-chunk dropped: attachment is tombstoned', { id: op.id });
120
+ return;
121
+ }
122
+ const next = { ...chunk, attachment: op.attachment, updatedAt: op.updatedAt };
123
+ await tx.insert(CHUNKS, next);
124
+ return next;
125
+ }
126
+ log?.warn('contract', 'update-chunk dropped: only a run-status (runStatus) or attachment (attachment) edits', { id: op.id });
127
+ }));
128
+ router.add('@qvac/resolve-approval', trackActivity(async (op, { tx, node, log }) => {
129
+ const chunk = await tx.get(CHUNKS, { id: op.id });
130
+ if (!chunk || chunk.type !== 'approval-request' || !chunk.approvalRequest) {
131
+ log?.debug('contract', 'resolve-approval dropped: not a known approval-request', {
132
+ id: op.id
133
+ });
134
+ return;
135
+ }
136
+ if (chunk.approvalRequest.status !== 'pending')
137
+ return;
138
+ if (!(await isAdmittedWriter(tx, node.key))) {
139
+ log?.warn('contract', 'resolve-approval dropped: writer is not an admitted device', {
140
+ id: op.id
141
+ });
142
+ return;
143
+ }
144
+ const resolved = {
145
+ ...chunk,
146
+ approvalRequest: {
147
+ ...chunk.approvalRequest,
148
+ status: op.approved ? 'approved' : 'denied'
149
+ },
150
+ updatedAt: op.resolvedAt
151
+ };
152
+ await tx.insert(CHUNKS, resolved);
153
+ log?.info('contract', `approval ${op.approved ? 'approved' : 'denied'}`, { id: op.id });
154
+ return resolved;
155
+ }));
156
+ }
@@ -0,0 +1,2 @@
1
+ import type { Router } from '../../../spec/mesh/hyperdispatch/index.js';
2
+ export declare function registerDeviceRoutes(router: Router): void;
@@ -0,0 +1,110 @@
1
+ import { trackActivity } from "./activity.js";
2
+ const DEVICES = '@qvac/devices';
3
+ export function registerDeviceRoutes(router) {
4
+ router.add('@qvac/register-device', trackActivity(async ({ device }, { tx, node, log }) => {
5
+ const existing = await tx.get(DEVICES, { id: device.id });
6
+ if (existing) {
7
+ log?.debug('contract', 'register-device dropped: device already registered');
8
+ return;
9
+ }
10
+ const registered = {
11
+ id: device.id,
12
+ name: device.name,
13
+ joinedAt: device.joinedAt,
14
+ capabilityProfile: device.capabilityProfile,
15
+ recommendedModelName: device.recommendedModelName,
16
+ revoked: device.revoked,
17
+ revokedAt: device.revokedAt,
18
+ writerKey: node.key,
19
+ installedToolNames: device.installedToolNames,
20
+ installedSkillNames: device.installedSkillNames,
21
+ installedModelNames: device.installedModelNames,
22
+ cachedModelNames: device.cachedModelNames,
23
+ revokedBy: device.revokedBy,
24
+ appVersion: device.appVersion,
25
+ appBuild: device.appBuild,
26
+ appChannel: device.appChannel,
27
+ platform: device.platform,
28
+ readySkillNames: device.readySkillNames
29
+ };
30
+ await tx.insert(DEVICES, registered);
31
+ return registered;
32
+ }));
33
+ router.add('@qvac/update-device', trackActivity(async ({ device }, { tx, node, log }) => {
34
+ const existing = await tx.get(DEVICES, { id: device.id });
35
+ if (!existing) {
36
+ log?.debug('contract', 'update-device dropped: unknown device');
37
+ return;
38
+ }
39
+ if (!existing.writerKey?.equals(node.key)) {
40
+ log?.warn('contract', 'update-device dropped: writer is not the device owner', {
41
+ id: device.id
42
+ });
43
+ return;
44
+ }
45
+ const next = { ...existing, name: device.name };
46
+ await tx.insert(DEVICES, next);
47
+ return next;
48
+ }));
49
+ router.add('@qvac/update-device-profile', trackActivity(async ({ deviceId, capabilityProfile, recommendedModelName, platform }, { tx, node, log }) => {
50
+ const existing = await tx.get(DEVICES, { id: deviceId });
51
+ if (!existing) {
52
+ log?.debug('contract', 'update-device-profile dropped: unknown device');
53
+ return;
54
+ }
55
+ if (!existing.writerKey?.equals(node.key)) {
56
+ log?.warn('contract', 'update-device-profile dropped: writer is not the device owner', {
57
+ id: deviceId
58
+ });
59
+ return;
60
+ }
61
+ const next = {
62
+ ...existing,
63
+ capabilityProfile,
64
+ recommendedModelName,
65
+ platform: platform ?? existing.platform
66
+ };
67
+ await tx.insert(DEVICES, next);
68
+ return next;
69
+ }));
70
+ router.add('@qvac/report-device-capabilities', trackActivity(async ({ deviceId, installedToolNames, installedSkillNames, installedModelNames, cachedModelNames, readySkillNames, toolCatalog }, { tx, node, log }) => {
71
+ const existing = await tx.get(DEVICES, { id: deviceId });
72
+ if (!existing) {
73
+ log?.debug('contract', 'report-device-capabilities dropped: unknown device');
74
+ return;
75
+ }
76
+ if (!existing.writerKey?.equals(node.key)) {
77
+ log?.warn('contract', 'report-device-capabilities dropped: writer is not the device owner', {
78
+ id: deviceId
79
+ });
80
+ return;
81
+ }
82
+ const next = {
83
+ ...existing,
84
+ installedToolNames: installedToolNames ?? [],
85
+ installedSkillNames: installedSkillNames ?? [],
86
+ installedModelNames: installedModelNames ?? [],
87
+ cachedModelNames: cachedModelNames ?? [],
88
+ readySkillNames: readySkillNames ?? existing.readySkillNames,
89
+ toolCatalog: toolCatalog ?? existing.toolCatalog
90
+ };
91
+ await tx.insert(DEVICES, next);
92
+ return next;
93
+ }));
94
+ router.add('@qvac/report-device-version', trackActivity(async ({ deviceId, appVersion, appBuild, appChannel }, { tx, node, log }) => {
95
+ const existing = await tx.get(DEVICES, { id: deviceId });
96
+ if (!existing) {
97
+ log?.debug('contract', 'report-device-version dropped: unknown device');
98
+ return;
99
+ }
100
+ if (!existing.writerKey?.equals(node.key)) {
101
+ log?.warn('contract', 'report-device-version dropped: writer is not the device owner', {
102
+ id: deviceId
103
+ });
104
+ return;
105
+ }
106
+ const next = { ...existing, appVersion, appBuild, appChannel };
107
+ await tx.insert(DEVICES, next);
108
+ return next;
109
+ }));
110
+ }
@@ -0,0 +1,2 @@
1
+ import type { Router } from '../../../spec/mesh/hyperdispatch/index.js';
2
+ export declare function registerRoutes(router: Router): void;