reflectt-node 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 (486) hide show
  1. package/LICENSE +178 -0
  2. package/README.md +188 -0
  3. package/dist/activationEvents.d.ts +110 -0
  4. package/dist/activationEvents.d.ts.map +1 -0
  5. package/dist/activationEvents.js +378 -0
  6. package/dist/activationEvents.js.map +1 -0
  7. package/dist/activity-signal.d.ts +30 -0
  8. package/dist/activity-signal.d.ts.map +1 -0
  9. package/dist/activity-signal.js +93 -0
  10. package/dist/activity-signal.js.map +1 -0
  11. package/dist/alert-integrity.d.ts +100 -0
  12. package/dist/alert-integrity.d.ts.map +1 -0
  13. package/dist/alert-integrity.js +333 -0
  14. package/dist/alert-integrity.js.map +1 -0
  15. package/dist/alert-preflight.d.ts +40 -0
  16. package/dist/alert-preflight.d.ts.map +1 -0
  17. package/dist/alert-preflight.js +235 -0
  18. package/dist/alert-preflight.js.map +1 -0
  19. package/dist/analytics.d.ts +131 -0
  20. package/dist/analytics.d.ts.map +1 -0
  21. package/dist/analytics.js +371 -0
  22. package/dist/analytics.js.map +1 -0
  23. package/dist/artifact-mirror.d.ts +26 -0
  24. package/dist/artifact-mirror.d.ts.map +1 -0
  25. package/dist/artifact-mirror.js +170 -0
  26. package/dist/artifact-mirror.js.map +1 -0
  27. package/dist/artifact-resolver.d.ts +48 -0
  28. package/dist/artifact-resolver.d.ts.map +1 -0
  29. package/dist/artifact-resolver.js +164 -0
  30. package/dist/artifact-resolver.js.map +1 -0
  31. package/dist/assignment.d.ts +116 -0
  32. package/dist/assignment.d.ts.map +1 -0
  33. package/dist/assignment.js +475 -0
  34. package/dist/assignment.js.map +1 -0
  35. package/dist/auditLedger.d.ts +50 -0
  36. package/dist/auditLedger.d.ts.map +1 -0
  37. package/dist/auditLedger.js +136 -0
  38. package/dist/auditLedger.js.map +1 -0
  39. package/dist/boardHealthWorker.d.ts +134 -0
  40. package/dist/boardHealthWorker.d.ts.map +1 -0
  41. package/dist/boardHealthWorker.js +882 -0
  42. package/dist/boardHealthWorker.js.map +1 -0
  43. package/dist/bootstrap-team.d.ts +42 -0
  44. package/dist/bootstrap-team.d.ts.map +1 -0
  45. package/dist/bootstrap-team.js +111 -0
  46. package/dist/bootstrap-team.js.map +1 -0
  47. package/dist/buildInfo.d.ts +17 -0
  48. package/dist/buildInfo.d.ts.map +1 -0
  49. package/dist/buildInfo.js +56 -0
  50. package/dist/buildInfo.js.map +1 -0
  51. package/dist/calendar-events.d.ts +133 -0
  52. package/dist/calendar-events.d.ts.map +1 -0
  53. package/dist/calendar-events.js +615 -0
  54. package/dist/calendar-events.js.map +1 -0
  55. package/dist/calendar-ical.d.ts +41 -0
  56. package/dist/calendar-ical.d.ts.map +1 -0
  57. package/dist/calendar-ical.js +413 -0
  58. package/dist/calendar-ical.js.map +1 -0
  59. package/dist/calendar-reminder-engine.d.ts +10 -0
  60. package/dist/calendar-reminder-engine.d.ts.map +1 -0
  61. package/dist/calendar-reminder-engine.js +143 -0
  62. package/dist/calendar-reminder-engine.js.map +1 -0
  63. package/dist/calendar.d.ts +75 -0
  64. package/dist/calendar.d.ts.map +1 -0
  65. package/dist/calendar.js +391 -0
  66. package/dist/calendar.js.map +1 -0
  67. package/dist/canvas-multiplexer.d.ts +44 -0
  68. package/dist/canvas-multiplexer.d.ts.map +1 -0
  69. package/dist/canvas-multiplexer.js +150 -0
  70. package/dist/canvas-multiplexer.js.map +1 -0
  71. package/dist/canvas-slots.d.ts +83 -0
  72. package/dist/canvas-slots.d.ts.map +1 -0
  73. package/dist/canvas-slots.js +144 -0
  74. package/dist/canvas-slots.js.map +1 -0
  75. package/dist/canvas-types.d.ts +56 -0
  76. package/dist/canvas-types.d.ts.map +1 -0
  77. package/dist/canvas-types.js +54 -0
  78. package/dist/canvas-types.js.map +1 -0
  79. package/dist/cf-keepalive.d.ts +40 -0
  80. package/dist/cf-keepalive.d.ts.map +1 -0
  81. package/dist/cf-keepalive.js +153 -0
  82. package/dist/cf-keepalive.js.map +1 -0
  83. package/dist/changeFeed.d.ts +38 -0
  84. package/dist/changeFeed.d.ts.map +1 -0
  85. package/dist/changeFeed.js +324 -0
  86. package/dist/changeFeed.js.map +1 -0
  87. package/dist/channels.d.ts +28 -0
  88. package/dist/channels.d.ts.map +1 -0
  89. package/dist/channels.js +23 -0
  90. package/dist/channels.js.map +1 -0
  91. package/dist/chat-approval-detector.d.ts +47 -0
  92. package/dist/chat-approval-detector.d.ts.map +1 -0
  93. package/dist/chat-approval-detector.js +224 -0
  94. package/dist/chat-approval-detector.js.map +1 -0
  95. package/dist/chat.d.ts +119 -0
  96. package/dist/chat.d.ts.map +1 -0
  97. package/dist/chat.js +666 -0
  98. package/dist/chat.js.map +1 -0
  99. package/dist/cli.d.ts +3 -0
  100. package/dist/cli.d.ts.map +1 -0
  101. package/dist/cli.js +1142 -0
  102. package/dist/cli.js.map +1 -0
  103. package/dist/cloud.d.ts +45 -0
  104. package/dist/cloud.d.ts.map +1 -0
  105. package/dist/cloud.js +962 -0
  106. package/dist/cloud.js.map +1 -0
  107. package/dist/config.d.ts +17 -0
  108. package/dist/config.d.ts.map +1 -0
  109. package/dist/config.js +33 -0
  110. package/dist/config.js.map +1 -0
  111. package/dist/connectivity.d.ts +59 -0
  112. package/dist/connectivity.d.ts.map +1 -0
  113. package/dist/connectivity.js +173 -0
  114. package/dist/connectivity.js.map +1 -0
  115. package/dist/contacts.d.ts +59 -0
  116. package/dist/contacts.d.ts.map +1 -0
  117. package/dist/contacts.js +183 -0
  118. package/dist/contacts.js.map +1 -0
  119. package/dist/content.d.ts +130 -0
  120. package/dist/content.d.ts.map +1 -0
  121. package/dist/content.js +186 -0
  122. package/dist/content.js.map +1 -0
  123. package/dist/context-budget.d.ts +87 -0
  124. package/dist/context-budget.d.ts.map +1 -0
  125. package/dist/context-budget.js +459 -0
  126. package/dist/context-budget.js.map +1 -0
  127. package/dist/continuity-loop.d.ts +55 -0
  128. package/dist/continuity-loop.d.ts.map +1 -0
  129. package/dist/continuity-loop.js +267 -0
  130. package/dist/continuity-loop.js.map +1 -0
  131. package/dist/dashboard.d.ts +6 -0
  132. package/dist/dashboard.d.ts.map +1 -0
  133. package/dist/dashboard.js +2348 -0
  134. package/dist/dashboard.js.map +1 -0
  135. package/dist/db.d.ts +44 -0
  136. package/dist/db.d.ts.map +1 -0
  137. package/dist/db.js +648 -0
  138. package/dist/db.js.map +1 -0
  139. package/dist/doctor.d.ts +30 -0
  140. package/dist/doctor.d.ts.map +1 -0
  141. package/dist/doctor.js +159 -0
  142. package/dist/doctor.js.map +1 -0
  143. package/dist/duplicateClosureGuard.d.ts +31 -0
  144. package/dist/duplicateClosureGuard.d.ts.map +1 -0
  145. package/dist/duplicateClosureGuard.js +83 -0
  146. package/dist/duplicateClosureGuard.js.map +1 -0
  147. package/dist/embeddings.d.ts +13 -0
  148. package/dist/embeddings.d.ts.map +1 -0
  149. package/dist/embeddings.js +78 -0
  150. package/dist/embeddings.js.map +1 -0
  151. package/dist/escalation.d.ts +80 -0
  152. package/dist/escalation.d.ts.map +1 -0
  153. package/dist/escalation.js +213 -0
  154. package/dist/escalation.js.map +1 -0
  155. package/dist/events.d.ts +130 -0
  156. package/dist/events.d.ts.map +1 -0
  157. package/dist/events.js +382 -0
  158. package/dist/events.js.map +1 -0
  159. package/dist/executionSweeper.d.ts +97 -0
  160. package/dist/executionSweeper.d.ts.map +1 -0
  161. package/dist/executionSweeper.js +875 -0
  162. package/dist/executionSweeper.js.map +1 -0
  163. package/dist/experiments.d.ts +47 -0
  164. package/dist/experiments.d.ts.map +1 -0
  165. package/dist/experiments.js +133 -0
  166. package/dist/experiments.js.map +1 -0
  167. package/dist/feedback.d.ts +179 -0
  168. package/dist/feedback.d.ts.map +1 -0
  169. package/dist/feedback.js +397 -0
  170. package/dist/feedback.js.map +1 -0
  171. package/dist/files.d.ts +52 -0
  172. package/dist/files.d.ts.map +1 -0
  173. package/dist/files.js +172 -0
  174. package/dist/files.js.map +1 -0
  175. package/dist/format-duration.d.ts +19 -0
  176. package/dist/format-duration.d.ts.map +1 -0
  177. package/dist/format-duration.js +33 -0
  178. package/dist/format-duration.js.map +1 -0
  179. package/dist/github-actor-auth.d.ts +20 -0
  180. package/dist/github-actor-auth.d.ts.map +1 -0
  181. package/dist/github-actor-auth.js +54 -0
  182. package/dist/github-actor-auth.js.map +1 -0
  183. package/dist/github-ci.d.ts +16 -0
  184. package/dist/github-ci.d.ts.map +1 -0
  185. package/dist/github-ci.js +37 -0
  186. package/dist/github-ci.js.map +1 -0
  187. package/dist/github-identity.d.ts +30 -0
  188. package/dist/github-identity.d.ts.map +1 -0
  189. package/dist/github-identity.js +96 -0
  190. package/dist/github-identity.js.map +1 -0
  191. package/dist/github-reviews.d.ts +24 -0
  192. package/dist/github-reviews.d.ts.map +1 -0
  193. package/dist/github-reviews.js +56 -0
  194. package/dist/github-reviews.js.map +1 -0
  195. package/dist/health.d.ts +391 -0
  196. package/dist/health.d.ts.map +1 -0
  197. package/dist/health.js +1841 -0
  198. package/dist/health.js.map +1 -0
  199. package/dist/host-keepalive.d.ts +22 -0
  200. package/dist/host-keepalive.d.ts.map +1 -0
  201. package/dist/host-keepalive.js +126 -0
  202. package/dist/host-keepalive.js.map +1 -0
  203. package/dist/host-registry.d.ts +43 -0
  204. package/dist/host-registry.d.ts.map +1 -0
  205. package/dist/host-registry.js +93 -0
  206. package/dist/host-registry.js.map +1 -0
  207. package/dist/inbox.d.ts +87 -0
  208. package/dist/inbox.d.ts.map +1 -0
  209. package/dist/inbox.js +410 -0
  210. package/dist/inbox.js.map +1 -0
  211. package/dist/index.d.ts +2 -0
  212. package/dist/index.d.ts.map +1 -0
  213. package/dist/index.js +306 -0
  214. package/dist/index.js.map +1 -0
  215. package/dist/insight-mutation.d.ts +32 -0
  216. package/dist/insight-mutation.d.ts.map +1 -0
  217. package/dist/insight-mutation.js +160 -0
  218. package/dist/insight-mutation.js.map +1 -0
  219. package/dist/insight-promotion.d.ts +89 -0
  220. package/dist/insight-promotion.d.ts.map +1 -0
  221. package/dist/insight-promotion.js +278 -0
  222. package/dist/insight-promotion.js.map +1 -0
  223. package/dist/insight-task-bridge.d.ts +77 -0
  224. package/dist/insight-task-bridge.d.ts.map +1 -0
  225. package/dist/insight-task-bridge.js +556 -0
  226. package/dist/insight-task-bridge.js.map +1 -0
  227. package/dist/insights.d.ts +222 -0
  228. package/dist/insights.d.ts.map +1 -0
  229. package/dist/insights.js +871 -0
  230. package/dist/insights.js.map +1 -0
  231. package/dist/intake-pipeline.d.ts +74 -0
  232. package/dist/intake-pipeline.d.ts.map +1 -0
  233. package/dist/intake-pipeline.js +199 -0
  234. package/dist/intake-pipeline.js.map +1 -0
  235. package/dist/intensity.d.ts +31 -0
  236. package/dist/intensity.d.ts.map +1 -0
  237. package/dist/intensity.js +94 -0
  238. package/dist/intensity.js.map +1 -0
  239. package/dist/knowledge-auto-index.d.ts +37 -0
  240. package/dist/knowledge-auto-index.d.ts.map +1 -0
  241. package/dist/knowledge-auto-index.js +149 -0
  242. package/dist/knowledge-auto-index.js.map +1 -0
  243. package/dist/knowledge-docs.d.ts +45 -0
  244. package/dist/knowledge-docs.d.ts.map +1 -0
  245. package/dist/knowledge-docs.js +188 -0
  246. package/dist/knowledge-docs.js.map +1 -0
  247. package/dist/lane-config.d.ts +25 -0
  248. package/dist/lane-config.d.ts.map +1 -0
  249. package/dist/lane-config.js +105 -0
  250. package/dist/lane-config.js.map +1 -0
  251. package/dist/lineage.d.ts +86 -0
  252. package/dist/lineage.d.ts.map +1 -0
  253. package/dist/lineage.js +303 -0
  254. package/dist/lineage.js.map +1 -0
  255. package/dist/logStore.d.ts +25 -0
  256. package/dist/logStore.d.ts.map +1 -0
  257. package/dist/logStore.js +83 -0
  258. package/dist/logStore.js.map +1 -0
  259. package/dist/manage.d.ts +12 -0
  260. package/dist/manage.d.ts.map +1 -0
  261. package/dist/manage.js +253 -0
  262. package/dist/manage.js.map +1 -0
  263. package/dist/mcp.d.ts +5 -0
  264. package/dist/mcp.d.ts.map +1 -0
  265. package/dist/mcp.js +604 -0
  266. package/dist/mcp.js.map +1 -0
  267. package/dist/memory.d.ts +47 -0
  268. package/dist/memory.d.ts.map +1 -0
  269. package/dist/memory.js +149 -0
  270. package/dist/memory.js.map +1 -0
  271. package/dist/mention-ack.d.ts +80 -0
  272. package/dist/mention-ack.d.ts.map +1 -0
  273. package/dist/mention-ack.js +175 -0
  274. package/dist/mention-ack.js.map +1 -0
  275. package/dist/messageRouter.d.ts +60 -0
  276. package/dist/messageRouter.d.ts.map +1 -0
  277. package/dist/messageRouter.js +309 -0
  278. package/dist/messageRouter.js.map +1 -0
  279. package/dist/mutationAlert.d.ts +44 -0
  280. package/dist/mutationAlert.d.ts.map +1 -0
  281. package/dist/mutationAlert.js +174 -0
  282. package/dist/mutationAlert.js.map +1 -0
  283. package/dist/noise-budget.d.ts +136 -0
  284. package/dist/noise-budget.d.ts.map +1 -0
  285. package/dist/noise-budget.js +340 -0
  286. package/dist/noise-budget.js.map +1 -0
  287. package/dist/notifications.d.ts +67 -0
  288. package/dist/notifications.d.ts.map +1 -0
  289. package/dist/notifications.js +253 -0
  290. package/dist/notifications.js.map +1 -0
  291. package/dist/openclaw.d.ts +34 -0
  292. package/dist/openclaw.d.ts.map +1 -0
  293. package/dist/openclaw.js +208 -0
  294. package/dist/openclaw.js.map +1 -0
  295. package/dist/pause-controls.d.ts +31 -0
  296. package/dist/pause-controls.d.ts.map +1 -0
  297. package/dist/pause-controls.js +130 -0
  298. package/dist/pause-controls.js.map +1 -0
  299. package/dist/pidlock.d.ts +25 -0
  300. package/dist/pidlock.d.ts.map +1 -0
  301. package/dist/pidlock.js +179 -0
  302. package/dist/pidlock.js.map +1 -0
  303. package/dist/policy.d.ts +139 -0
  304. package/dist/policy.d.ts.map +1 -0
  305. package/dist/policy.js +264 -0
  306. package/dist/policy.js.map +1 -0
  307. package/dist/polls.d.ts +47 -0
  308. package/dist/polls.d.ts.map +1 -0
  309. package/dist/polls.js +162 -0
  310. package/dist/polls.js.map +1 -0
  311. package/dist/portability.d.ts +55 -0
  312. package/dist/portability.d.ts.map +1 -0
  313. package/dist/portability.js +292 -0
  314. package/dist/portability.js.map +1 -0
  315. package/dist/pr-integrity.d.ts +45 -0
  316. package/dist/pr-integrity.d.ts.map +1 -0
  317. package/dist/pr-integrity.js +124 -0
  318. package/dist/pr-integrity.js.map +1 -0
  319. package/dist/prAutoMerge.d.ts +62 -0
  320. package/dist/prAutoMerge.d.ts.map +1 -0
  321. package/dist/prAutoMerge.js +493 -0
  322. package/dist/prAutoMerge.js.map +1 -0
  323. package/dist/preflight.d.ts +66 -0
  324. package/dist/preflight.d.ts.map +1 -0
  325. package/dist/preflight.js +864 -0
  326. package/dist/preflight.js.map +1 -0
  327. package/dist/presence.d.ts +98 -0
  328. package/dist/presence.d.ts.map +1 -0
  329. package/dist/presence.js +347 -0
  330. package/dist/presence.js.map +1 -0
  331. package/dist/provisioning.d.ts +101 -0
  332. package/dist/provisioning.d.ts.map +1 -0
  333. package/dist/provisioning.js +430 -0
  334. package/dist/provisioning.js.map +1 -0
  335. package/dist/reflection-automation.d.ts +59 -0
  336. package/dist/reflection-automation.d.ts.map +1 -0
  337. package/dist/reflection-automation.js +350 -0
  338. package/dist/reflection-automation.js.map +1 -0
  339. package/dist/reflections.d.ts +65 -0
  340. package/dist/reflections.d.ts.map +1 -0
  341. package/dist/reflections.js +306 -0
  342. package/dist/reflections.js.map +1 -0
  343. package/dist/release.d.ts +67 -0
  344. package/dist/release.d.ts.map +1 -0
  345. package/dist/release.js +275 -0
  346. package/dist/release.js.map +1 -0
  347. package/dist/request-tracker.d.ts +36 -0
  348. package/dist/request-tracker.d.ts.map +1 -0
  349. package/dist/request-tracker.js +109 -0
  350. package/dist/request-tracker.js.map +1 -0
  351. package/dist/research.d.ts +75 -0
  352. package/dist/research.d.ts.map +1 -0
  353. package/dist/research.js +171 -0
  354. package/dist/research.js.map +1 -0
  355. package/dist/routing-approvals.d.ts +73 -0
  356. package/dist/routing-approvals.d.ts.map +1 -0
  357. package/dist/routing-approvals.js +88 -0
  358. package/dist/routing-approvals.js.map +1 -0
  359. package/dist/routing-override.d.ts +94 -0
  360. package/dist/routing-override.d.ts.map +1 -0
  361. package/dist/routing-override.js +290 -0
  362. package/dist/routing-override.js.map +1 -0
  363. package/dist/scope-routing.d.ts +18 -0
  364. package/dist/scope-routing.d.ts.map +1 -0
  365. package/dist/scope-routing.js +29 -0
  366. package/dist/scope-routing.js.map +1 -0
  367. package/dist/secrets.d.ts +77 -0
  368. package/dist/secrets.d.ts.map +1 -0
  369. package/dist/secrets.js +287 -0
  370. package/dist/secrets.js.map +1 -0
  371. package/dist/server.d.ts +3 -0
  372. package/dist/server.d.ts.map +1 -0
  373. package/dist/server.js +10887 -0
  374. package/dist/server.js.map +1 -0
  375. package/dist/service-probe.d.ts +53 -0
  376. package/dist/service-probe.d.ts.map +1 -0
  377. package/dist/service-probe.js +225 -0
  378. package/dist/service-probe.js.map +1 -0
  379. package/dist/shared-workspace-api.d.ts +73 -0
  380. package/dist/shared-workspace-api.d.ts.map +1 -0
  381. package/dist/shared-workspace-api.js +281 -0
  382. package/dist/shared-workspace-api.js.map +1 -0
  383. package/dist/shipped-heartbeat.d.ts +91 -0
  384. package/dist/shipped-heartbeat.d.ts.map +1 -0
  385. package/dist/shipped-heartbeat.js +272 -0
  386. package/dist/shipped-heartbeat.js.map +1 -0
  387. package/dist/starter-team.d.ts +23 -0
  388. package/dist/starter-team.d.ts.map +1 -0
  389. package/dist/starter-team.js +88 -0
  390. package/dist/starter-team.js.map +1 -0
  391. package/dist/suppression-ledger.d.ts +73 -0
  392. package/dist/suppression-ledger.d.ts.map +1 -0
  393. package/dist/suppression-ledger.js +125 -0
  394. package/dist/suppression-ledger.js.map +1 -0
  395. package/dist/system-loop-state.d.ts +4 -0
  396. package/dist/system-loop-state.d.ts.map +1 -0
  397. package/dist/system-loop-state.js +40 -0
  398. package/dist/system-loop-state.js.map +1 -0
  399. package/dist/taskCommentIngest.d.ts +43 -0
  400. package/dist/taskCommentIngest.d.ts.map +1 -0
  401. package/dist/taskCommentIngest.js +59 -0
  402. package/dist/taskCommentIngest.js.map +1 -0
  403. package/dist/taskPrecheck.d.ts +20 -0
  404. package/dist/taskPrecheck.d.ts.map +1 -0
  405. package/dist/taskPrecheck.js +329 -0
  406. package/dist/taskPrecheck.js.map +1 -0
  407. package/dist/taskStateSync.d.ts +8 -0
  408. package/dist/taskStateSync.d.ts.map +1 -0
  409. package/dist/taskStateSync.js +79 -0
  410. package/dist/taskStateSync.js.map +1 -0
  411. package/dist/tasks.d.ts +140 -0
  412. package/dist/tasks.d.ts.map +1 -0
  413. package/dist/tasks.js +1281 -0
  414. package/dist/tasks.js.map +1 -0
  415. package/dist/team-config.d.ts +24 -0
  416. package/dist/team-config.d.ts.map +1 -0
  417. package/dist/team-config.js +221 -0
  418. package/dist/team-config.js.map +1 -0
  419. package/dist/team-doctor.d.ts +22 -0
  420. package/dist/team-doctor.d.ts.map +1 -0
  421. package/dist/team-doctor.js +270 -0
  422. package/dist/team-doctor.js.map +1 -0
  423. package/dist/team-pulse.d.ts +52 -0
  424. package/dist/team-pulse.d.ts.map +1 -0
  425. package/dist/team-pulse.js +176 -0
  426. package/dist/team-pulse.js.map +1 -0
  427. package/dist/telemetry.d.ts +74 -0
  428. package/dist/telemetry.d.ts.map +1 -0
  429. package/dist/telemetry.js +256 -0
  430. package/dist/telemetry.js.map +1 -0
  431. package/dist/test-task-filter.d.ts +21 -0
  432. package/dist/test-task-filter.d.ts.map +1 -0
  433. package/dist/test-task-filter.js +48 -0
  434. package/dist/test-task-filter.js.map +1 -0
  435. package/dist/types.d.ts +126 -0
  436. package/dist/types.d.ts.map +1 -0
  437. package/dist/types.js +4 -0
  438. package/dist/types.js.map +1 -0
  439. package/dist/usage-tracking.d.ts +101 -0
  440. package/dist/usage-tracking.d.ts.map +1 -0
  441. package/dist/usage-tracking.js +325 -0
  442. package/dist/usage-tracking.js.map +1 -0
  443. package/dist/vector-store.d.ts +87 -0
  444. package/dist/vector-store.d.ts.map +1 -0
  445. package/dist/vector-store.js +247 -0
  446. package/dist/vector-store.js.map +1 -0
  447. package/dist/watchdog/idleNudgeLane.d.ts +22 -0
  448. package/dist/watchdog/idleNudgeLane.d.ts.map +1 -0
  449. package/dist/watchdog/idleNudgeLane.js +98 -0
  450. package/dist/watchdog/idleNudgeLane.js.map +1 -0
  451. package/dist/webhooks.d.ts +103 -0
  452. package/dist/webhooks.d.ts.map +1 -0
  453. package/dist/webhooks.js +398 -0
  454. package/dist/webhooks.js.map +1 -0
  455. package/dist/working-contract.d.ts +42 -0
  456. package/dist/working-contract.d.ts.map +1 -0
  457. package/dist/working-contract.js +228 -0
  458. package/dist/working-contract.js.map +1 -0
  459. package/dist/ws-heartbeat.d.ts +66 -0
  460. package/dist/ws-heartbeat.d.ts.map +1 -0
  461. package/dist/ws-heartbeat.js +174 -0
  462. package/dist/ws-heartbeat.js.map +1 -0
  463. package/package.json +87 -0
  464. package/plugins/reflectt-channel/README.md +96 -0
  465. package/plugins/reflectt-channel/index.ts +789 -0
  466. package/plugins/reflectt-channel/openclaw.plugin.json +23 -0
  467. package/plugins/reflectt-channel/package.json +23 -0
  468. package/plugins/reflectt-channel/src/channel.ts +433 -0
  469. package/plugins/reflectt-channel/src/types.ts +29 -0
  470. package/public/avatars/echo.png +0 -0
  471. package/public/avatars/harmony.png +0 -0
  472. package/public/avatars/kai.png +0 -0
  473. package/public/avatars/link.png +0 -0
  474. package/public/avatars/pixel.png +0 -0
  475. package/public/avatars/rhythm.png +0 -0
  476. package/public/avatars/ryan.png +0 -0
  477. package/public/avatars/sage.png +0 -0
  478. package/public/avatars/scout.png +0 -0
  479. package/public/avatars/spark.png +0 -0
  480. package/public/dashboard-animations.css +381 -0
  481. package/public/dashboard.js +3479 -0
  482. package/public/docs.md +1062 -0
  483. package/public/file-upload-mock.html +1097 -0
  484. package/public/og-card.png +0 -0
  485. package/public/ui-kit.html +318 -0
  486. package/public/widget/feedback.js +194 -0
@@ -0,0 +1,325 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Usage Tracking — Model API cost instrumentation + spend caps
3
+ //
4
+ // Stores per-call usage events with token counts and estimated costs.
5
+ // Provides aggregation by agent, task, model, and time period.
6
+ // Enforces configurable spend caps with warn/throttle/block actions.
7
+ import { getDb } from './db.js';
8
+ import { eventBus } from './events.js';
9
+ // ── Model Pricing (estimated, per 1M tokens) ──
10
+ const MODEL_PRICING = {
11
+ 'claude-opus-4': { input: 15.0, output: 75.0 },
12
+ 'claude-opus-4-6': { input: 15.0, output: 75.0 },
13
+ 'claude-sonnet-4': { input: 3.0, output: 15.0 },
14
+ 'claude-sonnet-4-6': { input: 3.0, output: 15.0 },
15
+ 'gpt-5.3': { input: 2.0, output: 8.0 },
16
+ 'gpt-5.3-codex': { input: 2.0, output: 8.0 },
17
+ 'gpt-4o-mini': { input: 0.15, output: 0.60 },
18
+ 'gpt-4o': { input: 2.5, output: 10.0 },
19
+ };
20
+ export function estimateCost(model, inputTokens, outputTokens) {
21
+ // Try exact match, then prefix match
22
+ let pricing = MODEL_PRICING[model];
23
+ if (!pricing) {
24
+ const key = Object.keys(MODEL_PRICING).find(k => model.includes(k));
25
+ pricing = key ? MODEL_PRICING[key] : { input: 5.0, output: 20.0 }; // conservative default
26
+ }
27
+ return (inputTokens * pricing.input + outputTokens * pricing.output) / 1_000_000;
28
+ }
29
+ // ── DB Setup ──
30
+ export function ensureUsageTables() {
31
+ const db = getDb();
32
+ db.exec(`
33
+ CREATE TABLE IF NOT EXISTS model_usage (
34
+ id TEXT PRIMARY KEY,
35
+ agent TEXT NOT NULL,
36
+ task_id TEXT,
37
+ model TEXT NOT NULL,
38
+ provider TEXT NOT NULL DEFAULT 'unknown',
39
+ input_tokens INTEGER NOT NULL DEFAULT 0,
40
+ output_tokens INTEGER NOT NULL DEFAULT 0,
41
+ estimated_cost_usd REAL NOT NULL DEFAULT 0,
42
+ category TEXT NOT NULL DEFAULT 'other',
43
+ team_id TEXT,
44
+ metadata TEXT,
45
+ timestamp INTEGER NOT NULL
46
+ );
47
+ CREATE INDEX IF NOT EXISTS idx_usage_agent ON model_usage(agent);
48
+ CREATE INDEX IF NOT EXISTS idx_usage_ts ON model_usage(timestamp);
49
+ CREATE INDEX IF NOT EXISTS idx_usage_model ON model_usage(model);
50
+ CREATE INDEX IF NOT EXISTS idx_usage_task ON model_usage(task_id);
51
+
52
+ CREATE TABLE IF NOT EXISTS spend_caps (
53
+ id TEXT PRIMARY KEY,
54
+ scope TEXT NOT NULL DEFAULT 'global',
55
+ scope_id TEXT,
56
+ period TEXT NOT NULL DEFAULT 'monthly',
57
+ limit_usd REAL NOT NULL,
58
+ action TEXT NOT NULL DEFAULT 'warn',
59
+ enabled INTEGER NOT NULL DEFAULT 1,
60
+ created_at INTEGER NOT NULL,
61
+ updated_at INTEGER NOT NULL
62
+ );
63
+ `);
64
+ }
65
+ // ── Usage Recording ──
66
+ export function recordUsage(event) {
67
+ ensureUsageTables();
68
+ const db = getDb();
69
+ const id = `usage-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
70
+ const cost = event.estimated_cost_usd ?? estimateCost(event.model, event.input_tokens, event.output_tokens);
71
+ const record = {
72
+ id,
73
+ agent: event.agent,
74
+ task_id: event.task_id,
75
+ model: event.model,
76
+ provider: event.provider,
77
+ input_tokens: event.input_tokens,
78
+ output_tokens: event.output_tokens,
79
+ estimated_cost_usd: Math.round(cost * 1_000_000) / 1_000_000, // 6 decimal precision
80
+ category: event.category,
81
+ timestamp: event.timestamp || Date.now(),
82
+ team_id: event.team_id,
83
+ metadata: event.metadata,
84
+ };
85
+ db.prepare(`
86
+ INSERT INTO model_usage (id, agent, task_id, model, provider, input_tokens, output_tokens, estimated_cost_usd, category, team_id, metadata, timestamp)
87
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
88
+ `).run(record.id, record.agent, record.task_id || null, record.model, record.provider, record.input_tokens, record.output_tokens, record.estimated_cost_usd, record.category, record.team_id || null, record.metadata ? JSON.stringify(record.metadata) : null, record.timestamp);
89
+ // Check caps after recording
90
+ checkCaps(record);
91
+ return record;
92
+ }
93
+ export function recordUsageBatch(events) {
94
+ return events.map(e => recordUsage(e));
95
+ }
96
+ // ── Aggregation ──
97
+ export function getUsageSummary(options = {}) {
98
+ ensureUsageTables();
99
+ const db = getDb();
100
+ const conditions = [];
101
+ const params = [];
102
+ if (options.since) {
103
+ conditions.push('timestamp >= ?');
104
+ params.push(options.since);
105
+ }
106
+ if (options.until) {
107
+ conditions.push('timestamp <= ?');
108
+ params.push(options.until);
109
+ }
110
+ if (options.agent) {
111
+ conditions.push('agent = ?');
112
+ params.push(options.agent);
113
+ }
114
+ if (options.team_id) {
115
+ conditions.push('team_id = ?');
116
+ params.push(options.team_id);
117
+ }
118
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
119
+ const rows = db.prepare(`
120
+ SELECT
121
+ 'total' as period,
122
+ COALESCE(SUM(estimated_cost_usd), 0) as total_cost_usd,
123
+ COALESCE(SUM(input_tokens), 0) as total_input_tokens,
124
+ COALESCE(SUM(output_tokens), 0) as total_output_tokens,
125
+ COUNT(*) as event_count
126
+ FROM model_usage ${where}
127
+ `).all(...params);
128
+ return rows;
129
+ }
130
+ export function getUsageByAgent(options = {}) {
131
+ ensureUsageTables();
132
+ const db = getDb();
133
+ const conditions = [];
134
+ const params = [];
135
+ if (options.since) {
136
+ conditions.push('timestamp >= ?');
137
+ params.push(options.since);
138
+ }
139
+ if (options.until) {
140
+ conditions.push('timestamp <= ?');
141
+ params.push(options.until);
142
+ }
143
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
144
+ return db.prepare(`
145
+ SELECT
146
+ agent,
147
+ SUM(estimated_cost_usd) as total_cost_usd,
148
+ SUM(input_tokens) as total_input_tokens,
149
+ SUM(output_tokens) as total_output_tokens,
150
+ COUNT(*) as event_count,
151
+ (SELECT model FROM model_usage m2 WHERE m2.agent = model_usage.agent GROUP BY model ORDER BY SUM(estimated_cost_usd) DESC LIMIT 1) as top_model
152
+ FROM model_usage ${where}
153
+ GROUP BY agent
154
+ ORDER BY total_cost_usd DESC
155
+ `).all(...params);
156
+ }
157
+ export function getUsageByModel(options = {}) {
158
+ ensureUsageTables();
159
+ const db = getDb();
160
+ const conditions = [];
161
+ const params = [];
162
+ if (options.since) {
163
+ conditions.push('timestamp >= ?');
164
+ params.push(options.since);
165
+ }
166
+ if (options.until) {
167
+ conditions.push('timestamp <= ?');
168
+ params.push(options.until);
169
+ }
170
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
171
+ return db.prepare(`
172
+ SELECT model, SUM(estimated_cost_usd) as total_cost_usd, SUM(input_tokens) as total_input_tokens,
173
+ SUM(output_tokens) as total_output_tokens, COUNT(*) as event_count
174
+ FROM model_usage ${where}
175
+ GROUP BY model ORDER BY total_cost_usd DESC
176
+ `).all(...params);
177
+ }
178
+ export function getUsageByTask(options = {}) {
179
+ ensureUsageTables();
180
+ const db = getDb();
181
+ const limit = options.limit ?? 50;
182
+ const conditions = ['task_id IS NOT NULL'];
183
+ const params = [];
184
+ if (options.since) {
185
+ conditions.push('timestamp >= ?');
186
+ params.push(options.since);
187
+ }
188
+ if (options.until) {
189
+ conditions.push('timestamp <= ?');
190
+ params.push(options.until);
191
+ }
192
+ const where = `WHERE ${conditions.join(' AND ')}`;
193
+ return db.prepare(`
194
+ SELECT task_id, SUM(estimated_cost_usd) as total_cost_usd, COUNT(*) as event_count
195
+ FROM model_usage ${where}
196
+ GROUP BY task_id ORDER BY total_cost_usd DESC LIMIT ?
197
+ `).all(...params, limit);
198
+ }
199
+ // ── Spend Caps ──
200
+ export function setCap(cap) {
201
+ ensureUsageTables();
202
+ const db = getDb();
203
+ const now = Date.now();
204
+ const id = `cap-${now}-${Math.random().toString(36).slice(2, 7)}`;
205
+ const record = { id, ...cap, created_at: now, updated_at: now };
206
+ db.prepare(`
207
+ INSERT INTO spend_caps (id, scope, scope_id, period, limit_usd, action, enabled, created_at, updated_at)
208
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
209
+ `).run(id, record.scope, record.scope_id || null, record.period, record.limit_usd, record.action, record.enabled ? 1 : 0, now, now);
210
+ return record;
211
+ }
212
+ export function listCaps() {
213
+ ensureUsageTables();
214
+ const db = getDb();
215
+ return db.prepare('SELECT * FROM spend_caps WHERE enabled = 1 ORDER BY created_at DESC').all().map(r => ({
216
+ ...r, enabled: !!r.enabled,
217
+ }));
218
+ }
219
+ export function deleteCap(id) {
220
+ ensureUsageTables();
221
+ const db = getDb();
222
+ const result = db.prepare('DELETE FROM spend_caps WHERE id = ?').run(id);
223
+ return result.changes > 0;
224
+ }
225
+ function getPeriodStart(period) {
226
+ const now = new Date();
227
+ if (period === 'daily') {
228
+ return new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
229
+ }
230
+ else if (period === 'weekly') {
231
+ const day = now.getDay();
232
+ const diff = now.getDate() - day + (day === 0 ? -6 : 1); // Monday start
233
+ return new Date(now.getFullYear(), now.getMonth(), diff).getTime();
234
+ }
235
+ else {
236
+ return new Date(now.getFullYear(), now.getMonth(), 1).getTime();
237
+ }
238
+ }
239
+ export function checkCaps(event) {
240
+ const caps = listCaps();
241
+ const results = [];
242
+ for (const cap of caps) {
243
+ const periodStart = getPeriodStart(cap.period);
244
+ const conditions = ['timestamp >= ?'];
245
+ const params = [periodStart];
246
+ if (cap.scope === 'agent' && cap.scope_id) {
247
+ conditions.push('agent = ?');
248
+ params.push(cap.scope_id);
249
+ }
250
+ else if (cap.scope === 'team' && cap.scope_id) {
251
+ conditions.push('team_id = ?');
252
+ params.push(cap.scope_id);
253
+ }
254
+ const db = getDb();
255
+ const row = db.prepare(`
256
+ SELECT COALESCE(SUM(estimated_cost_usd), 0) as total
257
+ FROM model_usage WHERE ${conditions.join(' AND ')}
258
+ `).get(...params);
259
+ const currentSpend = row.total;
260
+ const remaining = Math.max(0, cap.limit_usd - currentSpend);
261
+ const utilization = cap.limit_usd > 0 ? (currentSpend / cap.limit_usd) * 100 : 0;
262
+ const breached = currentSpend >= cap.limit_usd;
263
+ const status = {
264
+ cap,
265
+ current_spend_usd: Math.round(currentSpend * 100) / 100,
266
+ remaining_usd: Math.round(remaining * 100) / 100,
267
+ utilization_pct: Math.round(utilization * 10) / 10,
268
+ breached,
269
+ };
270
+ results.push(status);
271
+ // Emit events on breach or warning (>80%)
272
+ if (event && breached) {
273
+ eventBus.emit({
274
+ type: 'task_updated',
275
+ data: { kind: 'usage:cap_breached', source: 'usage-tracking', cap_id: cap.id, scope: cap.scope, scope_id: cap.scope_id, current_spend: currentSpend, limit: cap.limit_usd, action: cap.action },
276
+ });
277
+ }
278
+ else if (event && utilization >= 80) {
279
+ eventBus.emit({
280
+ type: 'task_updated',
281
+ data: { kind: 'usage:cap_warning', source: 'usage-tracking', cap_id: cap.id, scope: cap.scope, scope_id: cap.scope_id, current_spend: currentSpend, limit: cap.limit_usd, utilization_pct: utilization },
282
+ });
283
+ }
284
+ }
285
+ return results;
286
+ }
287
+ // ── Routing Suggestions ──
288
+ export function getRoutingSuggestions(options = {}) {
289
+ ensureUsageTables();
290
+ const db = getDb();
291
+ const since = options.since ?? Date.now() - 30 * 24 * 60 * 60 * 1000; // 30 days
292
+ const categories = db.prepare(`
293
+ SELECT category, model,
294
+ SUM(estimated_cost_usd) as total_cost,
295
+ SUM(input_tokens) as total_input,
296
+ SUM(output_tokens) as total_output
297
+ FROM model_usage WHERE timestamp >= ?
298
+ GROUP BY category, model
299
+ ORDER BY total_cost DESC
300
+ `).all(since);
301
+ const suggestions = [];
302
+ const cheapModel = 'gpt-4o-mini';
303
+ const lowStakesCategories = ['heartbeat', 'reflection', 'chat'];
304
+ for (const row of categories) {
305
+ if (!lowStakesCategories.includes(row.category))
306
+ continue;
307
+ if (row.model === cheapModel)
308
+ continue;
309
+ const projectedCost = estimateCost(cheapModel, row.total_input, row.total_output);
310
+ const savings = row.total_cost - projectedCost;
311
+ if (savings > 0.01) {
312
+ suggestions.push({
313
+ category: row.category,
314
+ current_model: row.model,
315
+ suggested_model: cheapModel,
316
+ current_cost_usd: Math.round(row.total_cost * 100) / 100,
317
+ projected_cost_usd: Math.round(projectedCost * 100) / 100,
318
+ savings_usd: Math.round(savings * 100) / 100,
319
+ savings_pct: Math.round((savings / row.total_cost) * 100),
320
+ });
321
+ }
322
+ }
323
+ return suggestions.sort((a, b) => b.savings_usd - a.savings_usd);
324
+ }
325
+ //# sourceMappingURL=usage-tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-tracking.js","sourceRoot":"","sources":["../src/usage-tracking.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Vector store for semantic search using sqlite-vec.
3
+ *
4
+ * Stores embeddings alongside source metadata (type, id, text snippet).
5
+ * All vectors stay local — no external API calls for storage or search.
6
+ */
7
+ import type Database from 'better-sqlite3';
8
+ /**
9
+ * Load the sqlite-vec extension into the database connection.
10
+ * Safe to call multiple times — only loads once per connection.
11
+ */
12
+ export declare function loadVecExtension(db: Database.Database): void;
13
+ /**
14
+ * Reset the vec loaded flag (for tests)
15
+ */
16
+ export declare function resetVecLoadedForTests(): void;
17
+ /**
18
+ * Initialize vector tables.
19
+ * Called during migration v4.
20
+ */
21
+ export declare function initVectorTables(db: Database.Database): void;
22
+ /**
23
+ * Upsert a vector entry: store metadata + embedding.
24
+ * If a record with the same source_type+source_id exists, it gets replaced.
25
+ */
26
+ export declare function upsertVector(db: Database.Database, sourceType: string, sourceId: string, textSnippet: string, embedding: Float32Array): void;
27
+ /**
28
+ * Search for the nearest vectors to a query embedding.
29
+ * Returns results sorted by distance (ascending = most similar first).
30
+ */
31
+ export declare function searchVectors(db: Database.Database, queryEmbedding: Float32Array, limit?: number, sourceType?: string): Array<{
32
+ sourceType: string;
33
+ sourceId: string;
34
+ textSnippet: string;
35
+ distance: number;
36
+ }>;
37
+ /**
38
+ * Get the number of indexed vectors
39
+ */
40
+ export declare function vectorCount(db: Database.Database, sourceType?: string): number;
41
+ /**
42
+ * Delete a vector entry by source type and id
43
+ */
44
+ export declare function deleteVector(db: Database.Database, sourceType: string, sourceId: string): boolean;
45
+ /**
46
+ * Index a task for semantic search.
47
+ * Combines title + description + done criteria into searchable text.
48
+ */
49
+ export declare function indexTask(taskId: string, title: string, description?: string | null, doneCriteria?: string[] | null): Promise<void>;
50
+ /**
51
+ * Index a chat message for semantic search.
52
+ */
53
+ export declare function indexChatMessage(messageId: string, content: string): Promise<void>;
54
+ /**
55
+ * Index a reflection for semantic search.
56
+ * Combines pain + evidence + proposed_fix into searchable text.
57
+ */
58
+ export declare function indexReflection(reflectionId: string, pain: string, evidence: string[], proposedFix: string, author?: string, tags?: string[]): Promise<void>;
59
+ /**
60
+ * Index an insight for semantic search.
61
+ * Combines title + evidence_refs into searchable text.
62
+ */
63
+ export declare function indexInsight(insightId: string, title: string, evidenceRefs: string[], authors?: string[], clusterKey?: string): Promise<void>;
64
+ /**
65
+ * Index a shared workspace file for semantic search.
66
+ * Stores the file path and content snippet.
67
+ */
68
+ export declare function indexSharedFile(filePath: string, content: string): Promise<void>;
69
+ /**
70
+ * Index a knowledge document for semantic search.
71
+ * Combines title, content snippet, category, and tags.
72
+ */
73
+ export declare function indexKnowledgeDoc(docId: string, title: string, content: string, category?: string, tags?: string[] | null): Promise<void>;
74
+ /**
75
+ * Semantic search across all indexed content.
76
+ */
77
+ export declare function semanticSearch(query: string, options?: {
78
+ limit?: number;
79
+ type?: string;
80
+ }): Promise<Array<{
81
+ sourceType: string;
82
+ sourceId: string;
83
+ textSnippet: string;
84
+ distance: number;
85
+ similarity: number;
86
+ }>>;
87
+ //# sourceMappingURL=vector-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-store.d.ts","sourceRoot":"","sources":["../src/vector-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,247 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) Reflectt AI
3
+ import { getDb } from './db.js';
4
+ // Embedding dimension for all-MiniLM-L6-v2
5
+ const EMBEDDING_DIM = 384;
6
+ let _vecLoaded = false;
7
+ /**
8
+ * Load the sqlite-vec extension into the database connection.
9
+ * Safe to call multiple times — only loads once per connection.
10
+ */
11
+ export function loadVecExtension(db) {
12
+ if (_vecLoaded)
13
+ return;
14
+ try {
15
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
16
+ const sqliteVec = require('sqlite-vec');
17
+ sqliteVec.load(db);
18
+ _vecLoaded = true;
19
+ }
20
+ catch (err) {
21
+ console.error('[vector-store] Failed to load sqlite-vec extension:', err?.message);
22
+ throw err;
23
+ }
24
+ }
25
+ /**
26
+ * Reset the vec loaded flag (for tests)
27
+ */
28
+ export function resetVecLoadedForTests() {
29
+ _vecLoaded = false;
30
+ }
31
+ /**
32
+ * Initialize vector tables.
33
+ * Called during migration v4.
34
+ */
35
+ export function initVectorTables(db) {
36
+ loadVecExtension(db);
37
+ // Metadata table for vector entries
38
+ db.exec(`
39
+ CREATE TABLE IF NOT EXISTS vec_metadata (
40
+ row_id INTEGER PRIMARY KEY AUTOINCREMENT,
41
+ source_type TEXT NOT NULL,
42
+ source_id TEXT NOT NULL,
43
+ text_snippet TEXT NOT NULL,
44
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
45
+ UNIQUE(source_type, source_id)
46
+ )
47
+ `);
48
+ db.exec(`
49
+ CREATE INDEX IF NOT EXISTS idx_vec_metadata_source
50
+ ON vec_metadata(source_type, source_id)
51
+ `);
52
+ // Virtual table for vector search
53
+ db.exec(`
54
+ CREATE VIRTUAL TABLE IF NOT EXISTS vec_embeddings USING vec0(
55
+ row_id INTEGER PRIMARY KEY,
56
+ embedding float[${EMBEDDING_DIM}]
57
+ )
58
+ `);
59
+ }
60
+ /**
61
+ * Upsert a vector entry: store metadata + embedding.
62
+ * If a record with the same source_type+source_id exists, it gets replaced.
63
+ */
64
+ export function upsertVector(db, sourceType, sourceId, textSnippet, embedding) {
65
+ // Delete existing entry if present
66
+ const existing = db.prepare('SELECT row_id FROM vec_metadata WHERE source_type = ? AND source_id = ?').get(sourceType, sourceId);
67
+ if (existing) {
68
+ db.prepare('DELETE FROM vec_embeddings WHERE row_id = ?').run(BigInt(existing.row_id));
69
+ db.prepare('DELETE FROM vec_metadata WHERE row_id = ?').run(existing.row_id);
70
+ }
71
+ // Insert metadata
72
+ const result = db.prepare('INSERT INTO vec_metadata (source_type, source_id, text_snippet, created_at) VALUES (?, ?, ?, ?)').run(sourceType, sourceId, textSnippet.slice(0, 500), Date.now());
73
+ const rowId = BigInt(result.lastInsertRowid);
74
+ // Insert embedding into vec0 virtual table
75
+ db.prepare('INSERT INTO vec_embeddings (row_id, embedding) VALUES (?, ?)').run(rowId, Buffer.from(embedding.buffer));
76
+ }
77
+ /**
78
+ * Search for the nearest vectors to a query embedding.
79
+ * Returns results sorted by distance (ascending = most similar first).
80
+ */
81
+ export function searchVectors(db, queryEmbedding, limit = 10, sourceType) {
82
+ const queryBuffer = Buffer.from(queryEmbedding.buffer);
83
+ // Query vec0 for nearest neighbors
84
+ const rows = db.prepare(`
85
+ SELECT row_id, distance
86
+ FROM vec_embeddings
87
+ WHERE embedding MATCH ?
88
+ ORDER BY distance
89
+ LIMIT ?
90
+ `).all(queryBuffer, limit * 2);
91
+ if (rows.length === 0)
92
+ return [];
93
+ // Fetch metadata for matched rows
94
+ const results = [];
95
+ for (const row of rows) {
96
+ const meta = db.prepare('SELECT source_type, source_id, text_snippet FROM vec_metadata WHERE row_id = ?').get(row.row_id);
97
+ if (!meta)
98
+ continue;
99
+ // Filter by source type if specified
100
+ if (sourceType && meta.source_type !== sourceType)
101
+ continue;
102
+ results.push({
103
+ sourceType: meta.source_type,
104
+ sourceId: meta.source_id,
105
+ textSnippet: meta.text_snippet,
106
+ distance: row.distance,
107
+ });
108
+ if (results.length >= limit)
109
+ break;
110
+ }
111
+ return results;
112
+ }
113
+ /**
114
+ * Get the number of indexed vectors
115
+ */
116
+ export function vectorCount(db, sourceType) {
117
+ if (sourceType) {
118
+ const row = db.prepare('SELECT COUNT(*) as c FROM vec_metadata WHERE source_type = ?').get(sourceType);
119
+ return row.c;
120
+ }
121
+ const row = db.prepare('SELECT COUNT(*) as c FROM vec_metadata').get();
122
+ return row.c;
123
+ }
124
+ /**
125
+ * Delete a vector entry by source type and id
126
+ */
127
+ export function deleteVector(db, sourceType, sourceId) {
128
+ const existing = db.prepare('SELECT row_id FROM vec_metadata WHERE source_type = ? AND source_id = ?').get(sourceType, sourceId);
129
+ if (!existing)
130
+ return false;
131
+ db.prepare('DELETE FROM vec_embeddings WHERE row_id = ?').run(BigInt(existing.row_id));
132
+ db.prepare('DELETE FROM vec_metadata WHERE row_id = ?').run(existing.row_id);
133
+ return true;
134
+ }
135
+ /**
136
+ * Index a task for semantic search.
137
+ * Combines title + description + done criteria into searchable text.
138
+ */
139
+ export async function indexTask(taskId, title, description, doneCriteria) {
140
+ const parts = [title];
141
+ if (description)
142
+ parts.push(description);
143
+ if (doneCriteria?.length)
144
+ parts.push(doneCriteria.join('. '));
145
+ const text = parts.join(' — ');
146
+ const { embed } = await import('./embeddings.js');
147
+ const embedding = await embed(text);
148
+ const db = getDb();
149
+ upsertVector(db, 'task', taskId, text, embedding);
150
+ }
151
+ /**
152
+ * Index a chat message for semantic search.
153
+ */
154
+ export async function indexChatMessage(messageId, content) {
155
+ // Skip very short messages (not useful for search)
156
+ if (content.trim().length < 10)
157
+ return;
158
+ const { embed } = await import('./embeddings.js');
159
+ const embedding = await embed(content);
160
+ const db = getDb();
161
+ upsertVector(db, 'chat', messageId, content, embedding);
162
+ }
163
+ /**
164
+ * Index a reflection for semantic search.
165
+ * Combines pain + evidence + proposed_fix into searchable text.
166
+ */
167
+ export async function indexReflection(reflectionId, pain, evidence, proposedFix, author, tags) {
168
+ const parts = [pain];
169
+ if (evidence?.length)
170
+ parts.push(evidence.join('. '));
171
+ if (proposedFix)
172
+ parts.push(proposedFix);
173
+ if (author)
174
+ parts.push(`author:${author}`);
175
+ if (tags?.length)
176
+ parts.push(`tags:${tags.join(',')}`);
177
+ const text = parts.join(' — ');
178
+ const { embed } = await import('./embeddings.js');
179
+ const embedding = await embed(text);
180
+ const db = getDb();
181
+ upsertVector(db, 'reflection', reflectionId, text, embedding);
182
+ }
183
+ /**
184
+ * Index an insight for semantic search.
185
+ * Combines title + evidence_refs into searchable text.
186
+ */
187
+ export async function indexInsight(insightId, title, evidenceRefs, authors, clusterKey) {
188
+ const parts = [title];
189
+ if (evidenceRefs?.length)
190
+ parts.push(evidenceRefs.join('. '));
191
+ if (authors?.length)
192
+ parts.push(`authors:${authors.join(',')}`);
193
+ if (clusterKey)
194
+ parts.push(`cluster:${clusterKey}`);
195
+ const text = parts.join(' — ');
196
+ const { embed } = await import('./embeddings.js');
197
+ const embedding = await embed(text);
198
+ const db = getDb();
199
+ upsertVector(db, 'insight', insightId, text, embedding);
200
+ }
201
+ /**
202
+ * Index a shared workspace file for semantic search.
203
+ * Stores the file path and content snippet.
204
+ */
205
+ export async function indexSharedFile(filePath, content) {
206
+ if (content.trim().length < 10)
207
+ return;
208
+ const text = `[${filePath}] ${content}`;
209
+ const { embed } = await import('./embeddings.js');
210
+ const embedding = await embed(text);
211
+ const db = getDb();
212
+ upsertVector(db, 'shared_file', filePath, text, embedding);
213
+ }
214
+ /**
215
+ * Index a knowledge document for semantic search.
216
+ * Combines title, content snippet, category, and tags.
217
+ */
218
+ export async function indexKnowledgeDoc(docId, title, content, category, tags) {
219
+ const parts = [title];
220
+ // Use first ~2000 chars of content for embedding
221
+ if (content)
222
+ parts.push(content.slice(0, 2000));
223
+ if (category)
224
+ parts.push(`Category: ${category}`);
225
+ if (tags?.length)
226
+ parts.push(`Tags: ${tags.join(', ')}`);
227
+ const text = parts.join(' — ');
228
+ const { embed } = await import('./embeddings.js');
229
+ const embedding = await embed(text);
230
+ const db = getDb();
231
+ upsertVector(db, 'knowledge_doc', docId, text.slice(0, 500), embedding);
232
+ }
233
+ /**
234
+ * Semantic search across all indexed content.
235
+ */
236
+ export async function semanticSearch(query, options) {
237
+ const { embed } = await import('./embeddings.js');
238
+ const queryEmbedding = await embed(query);
239
+ const db = getDb();
240
+ const results = searchVectors(db, queryEmbedding, options?.limit ?? 10, options?.type);
241
+ return results.map((r) => ({
242
+ ...r,
243
+ // Convert L2 distance to similarity score (0-1, higher = more similar)
244
+ similarity: 1 / (1 + r.distance),
245
+ }));
246
+ }
247
+ //# sourceMappingURL=vector-store.js.map