abmind 0.0.1 → 0.1.1

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 (533) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/LICENSE +190 -0
  3. package/README.md +191 -0
  4. package/dist/cli/abmind-backfill.d.ts +3 -0
  5. package/dist/cli/abmind-backfill.d.ts.map +1 -0
  6. package/dist/cli/abmind-backfill.js +64 -0
  7. package/dist/cli/abmind-backfill.js.map +1 -0
  8. package/dist/cli/abmind-backup.d.ts +5 -0
  9. package/dist/cli/abmind-backup.d.ts.map +1 -0
  10. package/dist/cli/abmind-backup.js +44 -0
  11. package/dist/cli/abmind-backup.js.map +1 -0
  12. package/dist/cli/abmind-bundle.d.ts +7 -0
  13. package/dist/cli/abmind-bundle.d.ts.map +1 -0
  14. package/dist/cli/abmind-bundle.js +17 -0
  15. package/dist/cli/abmind-bundle.js.map +1 -0
  16. package/dist/cli/abmind-edit.d.ts +10 -0
  17. package/dist/cli/abmind-edit.d.ts.map +1 -0
  18. package/dist/cli/abmind-edit.js +160 -0
  19. package/dist/cli/abmind-edit.js.map +1 -0
  20. package/dist/cli/abmind-embed.d.ts +3 -0
  21. package/dist/cli/abmind-embed.d.ts.map +1 -0
  22. package/dist/cli/abmind-embed.js +83 -0
  23. package/dist/cli/abmind-embed.js.map +1 -0
  24. package/dist/cli/abmind-expand.d.ts +6 -0
  25. package/dist/cli/abmind-expand.d.ts.map +1 -0
  26. package/dist/cli/abmind-expand.js +100 -0
  27. package/dist/cli/abmind-expand.js.map +1 -0
  28. package/dist/cli/abmind-hook-doctor.d.ts +8 -0
  29. package/dist/cli/abmind-hook-doctor.d.ts.map +1 -0
  30. package/dist/cli/abmind-hook-doctor.js +73 -0
  31. package/dist/cli/abmind-hook-doctor.js.map +1 -0
  32. package/dist/cli/abmind-hook-recall.d.ts +16 -0
  33. package/dist/cli/abmind-hook-recall.d.ts.map +1 -0
  34. package/dist/cli/abmind-hook-recall.js +123 -0
  35. package/dist/cli/abmind-hook-recall.js.map +1 -0
  36. package/dist/cli/abmind-hook-store.d.ts +17 -0
  37. package/dist/cli/abmind-hook-store.d.ts.map +1 -0
  38. package/dist/cli/abmind-hook-store.js +115 -0
  39. package/dist/cli/abmind-hook-store.js.map +1 -0
  40. package/dist/cli/abmind-hook-wakeup.d.ts +12 -0
  41. package/dist/cli/abmind-hook-wakeup.d.ts.map +1 -0
  42. package/dist/cli/abmind-hook-wakeup.js +143 -0
  43. package/dist/cli/abmind-hook-wakeup.js.map +1 -0
  44. package/dist/cli/abmind-ingest.d.ts +7 -0
  45. package/dist/cli/abmind-ingest.d.ts.map +1 -0
  46. package/dist/cli/abmind-ingest.js +96 -0
  47. package/dist/cli/abmind-ingest.js.map +1 -0
  48. package/dist/cli/abmind-install.d.ts +10 -0
  49. package/dist/cli/abmind-install.d.ts.map +1 -0
  50. package/dist/cli/abmind-install.js +240 -0
  51. package/dist/cli/abmind-install.js.map +1 -0
  52. package/dist/cli/abmind-mcp.d.ts +3 -0
  53. package/dist/cli/abmind-mcp.d.ts.map +1 -0
  54. package/dist/cli/abmind-mcp.js +26 -0
  55. package/dist/cli/abmind-mcp.js.map +1 -0
  56. package/dist/cli/abmind-memory-stats.d.ts +3 -0
  57. package/dist/cli/abmind-memory-stats.d.ts.map +1 -0
  58. package/dist/cli/abmind-memory-stats.js +45 -0
  59. package/dist/cli/abmind-memory-stats.js.map +1 -0
  60. package/dist/cli/abmind-migrate-openclaw.d.ts +12 -0
  61. package/dist/cli/abmind-migrate-openclaw.d.ts.map +1 -0
  62. package/dist/cli/abmind-migrate-openclaw.js +247 -0
  63. package/dist/cli/abmind-migrate-openclaw.js.map +1 -0
  64. package/dist/cli/abmind-recall.d.ts +8 -0
  65. package/dist/cli/abmind-recall.d.ts.map +1 -0
  66. package/dist/cli/abmind-recall.js +94 -0
  67. package/dist/cli/abmind-recall.js.map +1 -0
  68. package/dist/cli/abmind-reset.d.ts +11 -0
  69. package/dist/cli/abmind-reset.d.ts.map +1 -0
  70. package/dist/cli/abmind-reset.js +143 -0
  71. package/dist/cli/abmind-reset.js.map +1 -0
  72. package/dist/cli/abmind-restore.d.ts +5 -0
  73. package/dist/cli/abmind-restore.d.ts.map +1 -0
  74. package/dist/cli/abmind-restore.js +64 -0
  75. package/dist/cli/abmind-restore.js.map +1 -0
  76. package/dist/cli/abmind-retro-extract.d.ts +15 -0
  77. package/dist/cli/abmind-retro-extract.d.ts.map +1 -0
  78. package/dist/cli/abmind-retro-extract.js +113 -0
  79. package/dist/cli/abmind-retro-extract.js.map +1 -0
  80. package/dist/cli/abmind-rollback.d.ts +8 -0
  81. package/dist/cli/abmind-rollback.d.ts.map +1 -0
  82. package/dist/cli/abmind-rollback.js +76 -0
  83. package/dist/cli/abmind-rollback.js.map +1 -0
  84. package/dist/cli/abmind-secrets.d.ts +12 -0
  85. package/dist/cli/abmind-secrets.d.ts.map +1 -0
  86. package/dist/cli/abmind-secrets.js +83 -0
  87. package/dist/cli/abmind-secrets.js.map +1 -0
  88. package/dist/cli/abmind-sleep-apply.d.ts +3 -0
  89. package/dist/cli/abmind-sleep-apply.d.ts.map +1 -0
  90. package/dist/cli/abmind-sleep-apply.js +50 -0
  91. package/dist/cli/abmind-sleep-apply.js.map +1 -0
  92. package/dist/cli/abmind-sleep-report.d.ts +3 -0
  93. package/dist/cli/abmind-sleep-report.d.ts.map +1 -0
  94. package/dist/cli/abmind-sleep-report.js +40 -0
  95. package/dist/cli/abmind-sleep-report.js.map +1 -0
  96. package/dist/cli/abmind-sleep-state.d.ts +3 -0
  97. package/dist/cli/abmind-sleep-state.d.ts.map +1 -0
  98. package/dist/cli/abmind-sleep-state.js +33 -0
  99. package/dist/cli/abmind-sleep-state.js.map +1 -0
  100. package/dist/cli/abmind-sleep.d.ts +14 -0
  101. package/dist/cli/abmind-sleep.d.ts.map +1 -0
  102. package/dist/cli/abmind-sleep.js +186 -0
  103. package/dist/cli/abmind-sleep.js.map +1 -0
  104. package/dist/cli/abmind-status-runtime.d.ts +9 -0
  105. package/dist/cli/abmind-status-runtime.d.ts.map +1 -0
  106. package/dist/cli/abmind-status-runtime.js +132 -0
  107. package/dist/cli/abmind-status-runtime.js.map +1 -0
  108. package/dist/cli/abmind-status.d.ts +3 -0
  109. package/dist/cli/abmind-status.d.ts.map +1 -0
  110. package/dist/cli/abmind-status.js +45 -0
  111. package/dist/cli/abmind-status.js.map +1 -0
  112. package/dist/cli/abmind-store.d.ts +54 -0
  113. package/dist/cli/abmind-store.d.ts.map +1 -0
  114. package/dist/cli/abmind-store.js +251 -0
  115. package/dist/cli/abmind-store.js.map +1 -0
  116. package/dist/cli/abmind-update.d.ts +11 -0
  117. package/dist/cli/abmind-update.d.ts.map +1 -0
  118. package/dist/cli/abmind-update.js +160 -0
  119. package/dist/cli/abmind-update.js.map +1 -0
  120. package/dist/cli/abmind-wakeup.d.ts +3 -0
  121. package/dist/cli/abmind-wakeup.d.ts.map +1 -0
  122. package/dist/cli/abmind-wakeup.js +36 -0
  123. package/dist/cli/abmind-wakeup.js.map +1 -0
  124. package/dist/cli/abmind.d.ts +10 -0
  125. package/dist/cli/abmind.d.ts.map +1 -0
  126. package/dist/cli/abmind.js +100 -0
  127. package/dist/cli/abmind.js.map +1 -0
  128. package/dist/src/abm-v2-vocab.d.ts +10 -0
  129. package/dist/src/abm-v2-vocab.d.ts.map +1 -0
  130. package/dist/src/abm-v2-vocab.js +66 -0
  131. package/dist/src/abm-v2-vocab.js.map +1 -0
  132. package/dist/src/adapters/openclaw.d.ts +66 -0
  133. package/dist/src/adapters/openclaw.d.ts.map +1 -0
  134. package/dist/src/adapters/openclaw.js +97 -0
  135. package/dist/src/adapters/openclaw.js.map +1 -0
  136. package/dist/src/backend-factory.d.ts +9 -0
  137. package/dist/src/backend-factory.d.ts.map +1 -0
  138. package/dist/src/backend-factory.js +23 -0
  139. package/dist/src/backend-factory.js.map +1 -0
  140. package/dist/src/backup.d.ts +19 -0
  141. package/dist/src/backup.d.ts.map +1 -0
  142. package/dist/src/backup.js +191 -0
  143. package/dist/src/backup.js.map +1 -0
  144. package/dist/src/brain-patterns.d.ts +20 -0
  145. package/dist/src/brain-patterns.d.ts.map +1 -0
  146. package/dist/src/brain-patterns.js +72 -0
  147. package/dist/src/brain-patterns.js.map +1 -0
  148. package/dist/src/cli-entry.d.ts +10 -0
  149. package/dist/src/cli-entry.d.ts.map +1 -0
  150. package/dist/src/cli-entry.js +29 -0
  151. package/dist/src/cli-entry.js.map +1 -0
  152. package/dist/src/cli-flags.d.ts +29 -0
  153. package/dist/src/cli-flags.d.ts.map +1 -0
  154. package/dist/src/cli-flags.js +72 -0
  155. package/dist/src/cli-flags.js.map +1 -0
  156. package/dist/src/cli-runner-raw.d.ts +21 -0
  157. package/dist/src/cli-runner-raw.d.ts.map +1 -0
  158. package/dist/src/cli-runner-raw.js +41 -0
  159. package/dist/src/cli-runner-raw.js.map +1 -0
  160. package/dist/src/cli-runner.d.ts +26 -0
  161. package/dist/src/cli-runner.d.ts.map +1 -0
  162. package/dist/src/cli-runner.js +51 -0
  163. package/dist/src/cli-runner.js.map +1 -0
  164. package/dist/src/consolidation-search.d.ts +17 -0
  165. package/dist/src/consolidation-search.d.ts.map +1 -0
  166. package/dist/src/consolidation-search.js +83 -0
  167. package/dist/src/consolidation-search.js.map +1 -0
  168. package/dist/src/context-engine.d.ts +89 -0
  169. package/dist/src/context-engine.d.ts.map +1 -0
  170. package/dist/src/context-engine.js +216 -0
  171. package/dist/src/context-engine.js.map +1 -0
  172. package/dist/src/context-tier-renderer.d.ts +79 -0
  173. package/dist/src/context-tier-renderer.d.ts.map +1 -0
  174. package/dist/src/context-tier-renderer.js +223 -0
  175. package/dist/src/context-tier-renderer.js.map +1 -0
  176. package/dist/src/contradiction-checker.d.ts +16 -0
  177. package/dist/src/contradiction-checker.d.ts.map +1 -0
  178. package/dist/src/contradiction-checker.js +40 -0
  179. package/dist/src/contradiction-checker.js.map +1 -0
  180. package/dist/src/crypto.d.ts +15 -0
  181. package/dist/src/crypto.d.ts.map +1 -0
  182. package/dist/src/crypto.js +86 -0
  183. package/dist/src/crypto.js.map +1 -0
  184. package/dist/src/deploy-lib/cleanup.d.ts +38 -0
  185. package/dist/src/deploy-lib/cleanup.d.ts.map +1 -0
  186. package/dist/src/deploy-lib/cleanup.js +71 -0
  187. package/dist/src/deploy-lib/cleanup.js.map +1 -0
  188. package/dist/src/deploy-lib/index.d.ts +20 -0
  189. package/dist/src/deploy-lib/index.d.ts.map +1 -0
  190. package/dist/src/deploy-lib/index.js +20 -0
  191. package/dist/src/deploy-lib/index.js.map +1 -0
  192. package/dist/src/deploy-lib/lock.d.ts +37 -0
  193. package/dist/src/deploy-lib/lock.d.ts.map +1 -0
  194. package/dist/src/deploy-lib/lock.js +107 -0
  195. package/dist/src/deploy-lib/lock.js.map +1 -0
  196. package/dist/src/deploy-lib/manifest.d.ts +42 -0
  197. package/dist/src/deploy-lib/manifest.d.ts.map +1 -0
  198. package/dist/src/deploy-lib/manifest.js +38 -0
  199. package/dist/src/deploy-lib/manifest.js.map +1 -0
  200. package/dist/src/deploy-lib/paths.d.ts +29 -0
  201. package/dist/src/deploy-lib/paths.d.ts.map +1 -0
  202. package/dist/src/deploy-lib/paths.js +40 -0
  203. package/dist/src/deploy-lib/paths.js.map +1 -0
  204. package/dist/src/deploy-lib/releases.d.ts +52 -0
  205. package/dist/src/deploy-lib/releases.d.ts.map +1 -0
  206. package/dist/src/deploy-lib/releases.js +119 -0
  207. package/dist/src/deploy-lib/releases.js.map +1 -0
  208. package/dist/src/deploy-lib/safe-copy.d.ts +16 -0
  209. package/dist/src/deploy-lib/safe-copy.d.ts.map +1 -0
  210. package/dist/src/deploy-lib/safe-copy.js +32 -0
  211. package/dist/src/deploy-lib/safe-copy.js.map +1 -0
  212. package/dist/src/embedding-health.d.ts +12 -0
  213. package/dist/src/embedding-health.d.ts.map +1 -0
  214. package/dist/src/embedding-health.js +18 -0
  215. package/dist/src/embedding-health.js.map +1 -0
  216. package/dist/src/embedding-provider.d.ts +48 -0
  217. package/dist/src/embedding-provider.d.ts.map +1 -0
  218. package/dist/src/embedding-provider.js +145 -0
  219. package/dist/src/embedding-provider.js.map +1 -0
  220. package/dist/src/embedding-quantize.d.ts +11 -0
  221. package/dist/src/embedding-quantize.d.ts.map +1 -0
  222. package/dist/src/embedding-quantize.js +38 -0
  223. package/dist/src/embedding-quantize.js.map +1 -0
  224. package/dist/src/emotion-arc.d.ts +17 -0
  225. package/dist/src/emotion-arc.d.ts.map +1 -0
  226. package/dist/src/emotion-arc.js +62 -0
  227. package/dist/src/emotion-arc.js.map +1 -0
  228. package/dist/src/emotion-tagger.d.ts +8 -0
  229. package/dist/src/emotion-tagger.d.ts.map +1 -0
  230. package/dist/src/emotion-tagger.js +45 -0
  231. package/dist/src/emotion-tagger.js.map +1 -0
  232. package/dist/src/emotion-utils.d.ts +13 -0
  233. package/dist/src/emotion-utils.d.ts.map +1 -0
  234. package/dist/src/emotion-utils.js +76 -0
  235. package/dist/src/emotion-utils.js.map +1 -0
  236. package/dist/src/entity-graph.d.ts +33 -0
  237. package/dist/src/entity-graph.d.ts.map +1 -0
  238. package/dist/src/entity-graph.js +42 -0
  239. package/dist/src/entity-graph.js.map +1 -0
  240. package/dist/src/env-schema.d.ts +46 -0
  241. package/dist/src/env-schema.d.ts.map +1 -0
  242. package/dist/src/env-schema.js +93 -0
  243. package/dist/src/env-schema.js.map +1 -0
  244. package/dist/src/hook-helpers.d.ts +16 -0
  245. package/dist/src/hook-helpers.d.ts.map +1 -0
  246. package/dist/src/hook-helpers.js +64 -0
  247. package/dist/src/hook-helpers.js.map +1 -0
  248. package/dist/src/imemory-system.d.ts +138 -0
  249. package/dist/src/imemory-system.d.ts.map +1 -0
  250. package/dist/src/imemory-system.js +40 -0
  251. package/dist/src/imemory-system.js.map +1 -0
  252. package/dist/src/importance-flagger.d.ts +8 -0
  253. package/dist/src/importance-flagger.d.ts.map +1 -0
  254. package/dist/src/importance-flagger.js +24 -0
  255. package/dist/src/importance-flagger.js.map +1 -0
  256. package/dist/src/index.d.ts +79 -0
  257. package/dist/src/index.d.ts.map +1 -0
  258. package/dist/src/index.js +79 -0
  259. package/dist/src/index.js.map +1 -0
  260. package/dist/src/ingest-pipeline.d.ts +32 -0
  261. package/dist/src/ingest-pipeline.d.ts.map +1 -0
  262. package/dist/src/ingest-pipeline.js +58 -0
  263. package/dist/src/ingest-pipeline.js.map +1 -0
  264. package/dist/src/injection-scanner.d.ts +16 -0
  265. package/dist/src/injection-scanner.d.ts.map +1 -0
  266. package/dist/src/injection-scanner.js +182 -0
  267. package/dist/src/injection-scanner.js.map +1 -0
  268. package/dist/src/local-time.d.ts +12 -0
  269. package/dist/src/local-time.d.ts.map +1 -0
  270. package/dist/src/local-time.js +23 -0
  271. package/dist/src/local-time.js.map +1 -0
  272. package/dist/src/maintenance-service.d.ts +46 -0
  273. package/dist/src/maintenance-service.d.ts.map +1 -0
  274. package/dist/src/maintenance-service.js +280 -0
  275. package/dist/src/maintenance-service.js.map +1 -0
  276. package/dist/src/mcp-server.d.ts +6 -0
  277. package/dist/src/mcp-server.d.ts.map +1 -0
  278. package/dist/src/mcp-server.js +50 -0
  279. package/dist/src/mcp-server.js.map +1 -0
  280. package/dist/src/media-sanitizer.d.ts +11 -0
  281. package/dist/src/media-sanitizer.d.ts.map +1 -0
  282. package/dist/src/media-sanitizer.js +56 -0
  283. package/dist/src/media-sanitizer.js.map +1 -0
  284. package/dist/src/mem-config-env.d.ts +18 -0
  285. package/dist/src/mem-config-env.d.ts.map +1 -0
  286. package/dist/src/mem-config-env.js +43 -0
  287. package/dist/src/mem-config-env.js.map +1 -0
  288. package/dist/src/mem-env.d.ts +5 -0
  289. package/dist/src/mem-env.d.ts.map +1 -0
  290. package/dist/src/mem-env.js +19 -0
  291. package/dist/src/mem-env.js.map +1 -0
  292. package/dist/src/mem-logger.d.ts +20 -0
  293. package/dist/src/mem-logger.d.ts.map +1 -0
  294. package/dist/src/mem-logger.js +24 -0
  295. package/dist/src/mem-logger.js.map +1 -0
  296. package/dist/src/mem-paths.d.ts +20 -0
  297. package/dist/src/mem-paths.d.ts.map +1 -0
  298. package/dist/src/mem-paths.js +43 -0
  299. package/dist/src/mem-paths.js.map +1 -0
  300. package/dist/src/mem-types.d.ts +157 -0
  301. package/dist/src/mem-types.d.ts.map +1 -0
  302. package/dist/src/mem-types.js +2 -0
  303. package/dist/src/mem-types.js.map +1 -0
  304. package/dist/src/memory-backend.d.ts +65 -0
  305. package/dist/src/memory-backend.d.ts.map +1 -0
  306. package/dist/src/memory-backend.js +43 -0
  307. package/dist/src/memory-backend.js.map +1 -0
  308. package/dist/src/memory-compressor.d.ts +17 -0
  309. package/dist/src/memory-compressor.d.ts.map +1 -0
  310. package/dist/src/memory-compressor.js +147 -0
  311. package/dist/src/memory-compressor.js.map +1 -0
  312. package/dist/src/memory-config.d.ts +30 -0
  313. package/dist/src/memory-config.d.ts.map +1 -0
  314. package/dist/src/memory-config.js +62 -0
  315. package/dist/src/memory-config.js.map +1 -0
  316. package/dist/src/memory-db.d.ts +7 -0
  317. package/dist/src/memory-db.d.ts.map +1 -0
  318. package/dist/src/memory-db.js +173 -0
  319. package/dist/src/memory-db.js.map +1 -0
  320. package/dist/src/memory-editor.d.ts +32 -0
  321. package/dist/src/memory-editor.d.ts.map +1 -0
  322. package/dist/src/memory-editor.js +339 -0
  323. package/dist/src/memory-editor.js.map +1 -0
  324. package/dist/src/memory-index.d.ts +91 -0
  325. package/dist/src/memory-index.d.ts.map +1 -0
  326. package/dist/src/memory-index.js +310 -0
  327. package/dist/src/memory-index.js.map +1 -0
  328. package/dist/src/memory-ipc-client.d.ts +22 -0
  329. package/dist/src/memory-ipc-client.d.ts.map +1 -0
  330. package/dist/src/memory-ipc-client.js +75 -0
  331. package/dist/src/memory-ipc-client.js.map +1 -0
  332. package/dist/src/memory-ipc-server.d.ts +17 -0
  333. package/dist/src/memory-ipc-server.d.ts.map +1 -0
  334. package/dist/src/memory-ipc-server.js +86 -0
  335. package/dist/src/memory-ipc-server.js.map +1 -0
  336. package/dist/src/memory-manager.d.ts +155 -0
  337. package/dist/src/memory-manager.d.ts.map +1 -0
  338. package/dist/src/memory-manager.js +463 -0
  339. package/dist/src/memory-manager.js.map +1 -0
  340. package/dist/src/memory-renderer.d.ts +15 -0
  341. package/dist/src/memory-renderer.d.ts.map +1 -0
  342. package/dist/src/memory-renderer.js +126 -0
  343. package/dist/src/memory-renderer.js.map +1 -0
  344. package/dist/src/message-store.d.ts +42 -0
  345. package/dist/src/message-store.d.ts.map +1 -0
  346. package/dist/src/message-store.js +145 -0
  347. package/dist/src/message-store.js.map +1 -0
  348. package/dist/src/mmr.d.ts +17 -0
  349. package/dist/src/mmr.d.ts.map +1 -0
  350. package/dist/src/mmr.js +48 -0
  351. package/dist/src/mmr.js.map +1 -0
  352. package/dist/src/ollama-embed.d.ts +46 -0
  353. package/dist/src/ollama-embed.d.ts.map +1 -0
  354. package/dist/src/ollama-embed.js +139 -0
  355. package/dist/src/ollama-embed.js.map +1 -0
  356. package/dist/src/openclaw-plugin/engine.d.ts +87 -0
  357. package/dist/src/openclaw-plugin/engine.d.ts.map +1 -0
  358. package/dist/src/openclaw-plugin/engine.js +121 -0
  359. package/dist/src/openclaw-plugin/engine.js.map +1 -0
  360. package/dist/src/openclaw-plugin/hooks.d.ts +41 -0
  361. package/dist/src/openclaw-plugin/hooks.d.ts.map +1 -0
  362. package/dist/src/openclaw-plugin/hooks.js +155 -0
  363. package/dist/src/openclaw-plugin/hooks.js.map +1 -0
  364. package/dist/src/openclaw-plugin/index.d.ts +20 -0
  365. package/dist/src/openclaw-plugin/index.d.ts.map +1 -0
  366. package/dist/src/openclaw-plugin/index.js +151 -0
  367. package/dist/src/openclaw-plugin/index.js.map +1 -0
  368. package/dist/src/openclaw-plugin/message-adapter.d.ts +13 -0
  369. package/dist/src/openclaw-plugin/message-adapter.d.ts.map +1 -0
  370. package/dist/src/openclaw-plugin/message-adapter.js +49 -0
  371. package/dist/src/openclaw-plugin/message-adapter.js.map +1 -0
  372. package/dist/src/openclaw-plugin/prompt-builder.d.ts +17 -0
  373. package/dist/src/openclaw-plugin/prompt-builder.d.ts.map +1 -0
  374. package/dist/src/openclaw-plugin/prompt-builder.js +22 -0
  375. package/dist/src/openclaw-plugin/prompt-builder.js.map +1 -0
  376. package/dist/src/openclaw-plugin/public-artifacts.d.ts +20 -0
  377. package/dist/src/openclaw-plugin/public-artifacts.d.ts.map +1 -0
  378. package/dist/src/openclaw-plugin/public-artifacts.js +59 -0
  379. package/dist/src/openclaw-plugin/public-artifacts.js.map +1 -0
  380. package/dist/src/openclaw-plugin/runtime-adapter.d.ts +26 -0
  381. package/dist/src/openclaw-plugin/runtime-adapter.d.ts.map +1 -0
  382. package/dist/src/openclaw-plugin/runtime-adapter.js +161 -0
  383. package/dist/src/openclaw-plugin/runtime-adapter.js.map +1 -0
  384. package/dist/src/openclaw-plugin/session-mapper.d.ts +11 -0
  385. package/dist/src/openclaw-plugin/session-mapper.d.ts.map +1 -0
  386. package/dist/src/openclaw-plugin/session-mapper.js +17 -0
  387. package/dist/src/openclaw-plugin/session-mapper.js.map +1 -0
  388. package/dist/src/openclaw-plugin/tools.d.ts +32 -0
  389. package/dist/src/openclaw-plugin/tools.d.ts.map +1 -0
  390. package/dist/src/openclaw-plugin/tools.js +131 -0
  391. package/dist/src/openclaw-plugin/tools.js.map +1 -0
  392. package/dist/src/openclaw-plugin/types.d.ts +35 -0
  393. package/dist/src/openclaw-plugin/types.d.ts.map +1 -0
  394. package/dist/src/openclaw-plugin/types.js +2 -0
  395. package/dist/src/openclaw-plugin/types.js.map +1 -0
  396. package/dist/src/query-tokenizer.d.ts +33 -0
  397. package/dist/src/query-tokenizer.d.ts.map +1 -0
  398. package/dist/src/query-tokenizer.js +84 -0
  399. package/dist/src/query-tokenizer.js.map +1 -0
  400. package/dist/src/recall-benchmark.d.ts +13 -0
  401. package/dist/src/recall-benchmark.d.ts.map +1 -0
  402. package/dist/src/recall-benchmark.js +256 -0
  403. package/dist/src/recall-benchmark.js.map +1 -0
  404. package/dist/src/recall-engine.d.ts +81 -0
  405. package/dist/src/recall-engine.d.ts.map +1 -0
  406. package/dist/src/recall-engine.js +387 -0
  407. package/dist/src/recall-engine.js.map +1 -0
  408. package/dist/src/redact-secrets.d.ts +20 -0
  409. package/dist/src/redact-secrets.d.ts.map +1 -0
  410. package/dist/src/redact-secrets.js +42 -0
  411. package/dist/src/redact-secrets.js.map +1 -0
  412. package/dist/src/runtime-store.d.ts +47 -0
  413. package/dist/src/runtime-store.d.ts.map +1 -0
  414. package/dist/src/runtime-store.js +78 -0
  415. package/dist/src/runtime-store.js.map +1 -0
  416. package/dist/src/session-context.d.ts +10 -0
  417. package/dist/src/session-context.d.ts.map +1 -0
  418. package/dist/src/session-context.js +83 -0
  419. package/dist/src/session-context.js.map +1 -0
  420. package/dist/src/session-memory.d.ts +8 -0
  421. package/dist/src/session-memory.d.ts.map +1 -0
  422. package/dist/src/session-memory.js +45 -0
  423. package/dist/src/session-memory.js.map +1 -0
  424. package/dist/src/signature-generator.d.ts +15 -0
  425. package/dist/src/signature-generator.d.ts.map +1 -0
  426. package/dist/src/signature-generator.js +78 -0
  427. package/dist/src/signature-generator.js.map +1 -0
  428. package/dist/src/sleep/basic.d.ts +48 -0
  429. package/dist/src/sleep/basic.d.ts.map +1 -0
  430. package/dist/src/sleep/basic.js +147 -0
  431. package/dist/src/sleep/basic.js.map +1 -0
  432. package/dist/src/sleep/levels.d.ts +20 -0
  433. package/dist/src/sleep/levels.d.ts.map +1 -0
  434. package/dist/src/sleep/levels.js +11 -0
  435. package/dist/src/sleep/levels.js.map +1 -0
  436. package/dist/src/sleep/native.d.ts +41 -0
  437. package/dist/src/sleep/native.d.ts.map +1 -0
  438. package/dist/src/sleep/native.js +112 -0
  439. package/dist/src/sleep/native.js.map +1 -0
  440. package/dist/src/sleep/orchestrator.d.ts +64 -0
  441. package/dist/src/sleep/orchestrator.d.ts.map +1 -0
  442. package/dist/src/sleep/orchestrator.js +960 -0
  443. package/dist/src/sleep/orchestrator.js.map +1 -0
  444. package/dist/src/sleep/runtime.d.ts +15 -0
  445. package/dist/src/sleep/runtime.d.ts.map +1 -0
  446. package/dist/src/sleep/runtime.js +2 -0
  447. package/dist/src/sleep/runtime.js.map +1 -0
  448. package/dist/src/sleep/sleep-daily-summary.d.ts +64 -0
  449. package/dist/src/sleep/sleep-daily-summary.d.ts.map +1 -0
  450. package/dist/src/sleep/sleep-daily-summary.js +273 -0
  451. package/dist/src/sleep/sleep-daily-summary.js.map +1 -0
  452. package/dist/src/sleep/sleep-extract-daily.d.ts +12 -0
  453. package/dist/src/sleep/sleep-extract-daily.d.ts.map +1 -0
  454. package/dist/src/sleep/sleep-extract-daily.js +55 -0
  455. package/dist/src/sleep/sleep-extract-daily.js.map +1 -0
  456. package/dist/src/sleep/sleep-prompt-loader.d.ts +27 -0
  457. package/dist/src/sleep/sleep-prompt-loader.d.ts.map +1 -0
  458. package/dist/src/sleep/sleep-prompt-loader.js +116 -0
  459. package/dist/src/sleep/sleep-prompt-loader.js.map +1 -0
  460. package/dist/src/sleep/test-harness.d.ts +67 -0
  461. package/dist/src/sleep/test-harness.d.ts.map +1 -0
  462. package/dist/src/sleep/test-harness.js +121 -0
  463. package/dist/src/sleep/test-harness.js.map +1 -0
  464. package/dist/src/sleep/trigger.d.ts +3 -0
  465. package/dist/src/sleep/trigger.d.ts.map +1 -0
  466. package/dist/src/sleep/trigger.js +66 -0
  467. package/dist/src/sleep/trigger.js.map +1 -0
  468. package/dist/src/sleep-data-access.d.ts +54 -0
  469. package/dist/src/sleep-data-access.d.ts.map +1 -0
  470. package/dist/src/sleep-data-access.js +176 -0
  471. package/dist/src/sleep-data-access.js.map +1 -0
  472. package/dist/src/sleep-pipeline.d.ts +9 -0
  473. package/dist/src/sleep-pipeline.d.ts.map +1 -0
  474. package/dist/src/sleep-pipeline.js +8 -0
  475. package/dist/src/sleep-pipeline.js.map +1 -0
  476. package/dist/src/sleep-state-gatherer.d.ts +74 -0
  477. package/dist/src/sleep-state-gatherer.d.ts.map +1 -0
  478. package/dist/src/sleep-state-gatherer.js +275 -0
  479. package/dist/src/sleep-state-gatherer.js.map +1 -0
  480. package/dist/src/sqlite-backend.d.ts +23 -0
  481. package/dist/src/sqlite-backend.d.ts.map +1 -0
  482. package/dist/src/sqlite-backend.js +48 -0
  483. package/dist/src/sqlite-backend.js.map +1 -0
  484. package/dist/src/test-helpers.d.ts +3 -0
  485. package/dist/src/test-helpers.d.ts.map +1 -0
  486. package/dist/src/test-helpers.js +5 -0
  487. package/dist/src/test-helpers.js.map +1 -0
  488. package/dist/src/tier-llm-refinement.d.ts +35 -0
  489. package/dist/src/tier-llm-refinement.d.ts.map +1 -0
  490. package/dist/src/tier-llm-refinement.js +131 -0
  491. package/dist/src/tier-llm-refinement.js.map +1 -0
  492. package/dist/src/timeline-builder.d.ts +45 -0
  493. package/dist/src/timeline-builder.d.ts.map +1 -0
  494. package/dist/src/timeline-builder.js +147 -0
  495. package/dist/src/timeline-builder.js.map +1 -0
  496. package/dist/src/trigram-search.d.ts +28 -0
  497. package/dist/src/trigram-search.d.ts.map +1 -0
  498. package/dist/src/trigram-search.js +192 -0
  499. package/dist/src/trigram-search.js.map +1 -0
  500. package/dist/src/turn-classifier.d.ts +29 -0
  501. package/dist/src/turn-classifier.d.ts.map +1 -0
  502. package/dist/src/turn-classifier.js +186 -0
  503. package/dist/src/turn-classifier.js.map +1 -0
  504. package/dist/src/user-utils.d.ts +6 -0
  505. package/dist/src/user-utils.d.ts.map +1 -0
  506. package/dist/src/user-utils.js +27 -0
  507. package/dist/src/user-utils.js.map +1 -0
  508. package/dist/src/wake-up-builder.d.ts +12 -0
  509. package/dist/src/wake-up-builder.d.ts.map +1 -0
  510. package/dist/src/wake-up-builder.js +45 -0
  511. package/dist/src/wake-up-builder.js.map +1 -0
  512. package/dist/src/wake-up-renderer.d.ts +29 -0
  513. package/dist/src/wake-up-renderer.d.ts.map +1 -0
  514. package/dist/src/wake-up-renderer.js +182 -0
  515. package/dist/src/wake-up-renderer.js.map +1 -0
  516. package/openclaw.plugin.json +72 -0
  517. package/package.json +92 -5
  518. package/prompts/sleep/01-gc-noise.md +28 -0
  519. package/prompts/sleep/02-daily-summary.md +3 -0
  520. package/prompts/sleep/03-extract-from-daily.md +3 -0
  521. package/prompts/sleep/04-retrospective.md +30 -0
  522. package/prompts/sleep/06-feedback.md +17 -0
  523. package/prompts/sleep/07-topic-assignment.md +23 -0
  524. package/prompts/sleep/08-core-promotion.md +26 -0
  525. package/prompts/sleep/09-merge.md +19 -0
  526. package/prompts/sleep/10-translation.md +17 -0
  527. package/prompts/sleep/11-skill-review.md +12 -0
  528. package/prompts/sleep/12-core-knowledge.md +14 -0
  529. package/prompts/sleep/13-consolidation.md +11 -0
  530. package/prompts/sleep/14-emotion-context.md +17 -0
  531. package/prompts/sleep/15-contradiction-and-graph.md +48 -0
  532. package/prompts/sleep/16-rem-synthesis.md +31 -0
  533. package/prompts/sleep/basic.md +12 -0
@@ -0,0 +1,15 @@
1
+ export interface RenderMemoryInput {
2
+ content_en: string;
3
+ topic?: string;
4
+ emotion_tags?: string;
5
+ importance_flags?: string;
6
+ memory_type?: string;
7
+ confidence?: number;
8
+ date?: string;
9
+ createdAt?: number;
10
+ /** Optional conversational-turn role. When set, emits [USER|...] or [ASSISTANT|...] prefix. */
11
+ role?: "user" | "assistant" | "USER" | "ASSISTANT";
12
+ }
13
+ /** Render a memory for injection. Branches by ABML_VERSION. */
14
+ export declare function renderMemory(input: RenderMemoryInput): string;
15
+ //# sourceMappingURL=memory-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-renderer.d.ts","sourceRoot":"","sources":["../../src/memory-renderer.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+FAA+F;IAC/F,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,WAAW,CAAC;CACpD;AAED,+DAA+D;AAC/D,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAM7D"}
@@ -0,0 +1,126 @@
1
+ import { getAbmindEnv } from "./env-schema.js";
2
+ /**
3
+ * memory-renderer.ts — Unified memory rendering with ABM-L version toggle.
4
+ * v0: legacy positional format (current)
5
+ * v1: slot-based structured format (explicit field names)
6
+ *
7
+ * Optional `role` field enables conversational-turn rendering (#348):
8
+ * when present, emits `[USER|...]` or `[ASSISTANT|...]` prefix before
9
+ * the normal header. Formalized in abm-language.md v1 spec.
10
+ */
11
+ import { compress } from "./memory-compressor.js";
12
+ import { localMonth } from "./local-time.js";
13
+ import { TYPE_EMOJI, TOPIC_EMOJI, EMOTION_EMOJI, confidenceMarker } from "./abm-v2-vocab.js";
14
+ /** Render a memory for injection. Branches by ABML_VERSION. */
15
+ export function renderMemory(input) {
16
+ const version = getAbmindEnv().abmlVersion;
17
+ if (version === "v2")
18
+ return renderV2(input);
19
+ if (version === "v1")
20
+ return renderV1(input);
21
+ if (version === "v0")
22
+ return renderV0(input);
23
+ return renderPlain(input);
24
+ }
25
+ // ── plain: full English, universally understood ──────────────────────────────
26
+ function renderPlain(input) {
27
+ const type = input.memory_type ?? "fact";
28
+ const date = input.date ?? (input.createdAt ? localMonth(new Date(input.createdAt)) : "");
29
+ const topic = input.topic && input.topic !== "general" ? `, ${input.topic}` : "";
30
+ const rolePrefix = input.role && input.role.toLowerCase() !== "assistant" ? `${input.role.toUpperCase()}, ` : "";
31
+ const prefix = date ? `[${rolePrefix}${date}, ${type}${topic}]` : `[${rolePrefix}${type}${topic}]`;
32
+ return `${prefix} ${input.content_en}`;
33
+ }
34
+ // ── v0: legacy positional format ─────────────────────────────────────────────
35
+ function renderV0(input) {
36
+ const { content_en } = input;
37
+ const rolePrefix = input.role ? `${input.role.toUpperCase()}:` : "";
38
+ if (content_en.length < getAbmindEnv().abmlMinChars) {
39
+ const type = (input.memory_type ?? "fact").charAt(0).toUpperCase();
40
+ const date = input.date ?? (input.createdAt ? localMonth(new Date(input.createdAt)) : "");
41
+ return date ? `(${rolePrefix}${type}, ${date}) ${content_en}` : content_en;
42
+ }
43
+ // Long content: fall through to the existing compress() pipeline. If role
44
+ // is set, prepend it to the compressed result (compress() doesn't know about roles).
45
+ const compressed = compress({
46
+ content_en,
47
+ topic: input.topic ?? "general",
48
+ emotion_tags: input.emotion_tags ?? "",
49
+ importance_flags: input.importance_flags ?? "",
50
+ memory_type: input.memory_type ?? "fact",
51
+ confidence: input.confidence ?? 3,
52
+ date: input.date ?? (input.createdAt ? localMonth(new Date(input.createdAt)) : undefined),
53
+ });
54
+ return input.role ? `${input.role.toUpperCase()}: ${compressed}` : compressed;
55
+ }
56
+ // ── v1: slot-based structured format ─────────────────────────────────────────
57
+ const TYPE_CODE = {
58
+ fact: "F", decision: "D", preference: "P", event: "E",
59
+ lesson: "L", feedback: "FB", story: "S", observation: "O",
60
+ };
61
+ function renderV1(input) {
62
+ const { content_en } = input;
63
+ const type = TYPE_CODE[input.memory_type ?? "fact"] ?? "F";
64
+ const topic = input.topic && input.topic !== "general" ? input.topic : undefined;
65
+ const conf = input.confidence ?? 3;
66
+ const date = input.date ?? (input.createdAt ? localMonth(new Date(input.createdAt)) : undefined);
67
+ // Header: [ROLE?|TYPE|topic|conf|date]
68
+ const headerParts = [];
69
+ if (input.role)
70
+ headerParts.push(input.role.toUpperCase());
71
+ headerParts.push(type);
72
+ if (topic)
73
+ headerParts.push(topic);
74
+ headerParts.push(String(conf));
75
+ if (date)
76
+ headerParts.push(date);
77
+ const header = `[${headerParts.join("|")}]`;
78
+ // Emotion/importance as inline tags
79
+ const tags = [];
80
+ if (input.emotion_tags)
81
+ tags.push(`emo=(${input.emotion_tags})`);
82
+ if (input.importance_flags)
83
+ tags.push(`imp=(${input.importance_flags})`);
84
+ const tagStr = tags.length > 0 ? ` ${tags.join(" ")}` : "";
85
+ return `${header} ${content_en}${tagStr}`;
86
+ }
87
+ // ── v2: emoji content layer ──────────────────────────────────────────────────
88
+ function renderV2(input) {
89
+ const { content_en } = input;
90
+ const typeEmoji = TYPE_EMOJI[input.memory_type ?? "fact"] ?? "📌";
91
+ const topicEmoji = TOPIC_EMOJI[input.topic ?? "general"] ?? "";
92
+ const emotionEmoji = input.emotion_tags
93
+ ? input.emotion_tags.split(",").map(e => EMOTION_EMOJI[e.trim()] ?? "").filter(Boolean).join("") || "—"
94
+ : "—";
95
+ const conf = confidenceMarker(input.confidence ?? 3);
96
+ const date = input.date ?? (input.createdAt ? localMonth(new Date(input.createdAt)) : "");
97
+ // Header: [typeEmoji|topicEmoji|emotionEmoji|conf|date]
98
+ const headerParts = [];
99
+ if (input.role)
100
+ headerParts.push(input.role.toUpperCase());
101
+ headerParts.push(typeEmoji);
102
+ if (topicEmoji)
103
+ headerParts.push(topicEmoji);
104
+ headerParts.push(emotionEmoji);
105
+ headerParts.push(conf);
106
+ if (date)
107
+ headerParts.push(date);
108
+ const header = `[${headerParts.join("|")}]`;
109
+ // Body: compress content — strip filler, keep entities as @name
110
+ const body = compressV2Body(content_en);
111
+ return `${header} ${body}`;
112
+ }
113
+ /** Compress body for v2: truncate long content, preserve @entities. */
114
+ function compressV2Body(text) {
115
+ if (text.length <= 120)
116
+ return text;
117
+ // Keep @entities visible even if they'd be cut
118
+ const entities = text.match(/@\w+/g) ?? [];
119
+ let body = text.slice(0, 117) + "...";
120
+ for (const e of entities) {
121
+ if (!body.includes(e))
122
+ body = `${e} ${body}`;
123
+ }
124
+ return body;
125
+ }
126
+ //# sourceMappingURL=memory-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-renderer.js","sourceRoot":"","sources":["../../src/memory-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type Database from "better-sqlite3";
2
+ import type { MemoryConfig } from "./memory-config.js";
3
+ import type { MessageRecord } from "./mem-types.js";
4
+ import type { MemoryIndex } from "./memory-index.js";
5
+ /** Handles message recording, loading, and emotion score updates. */
6
+ export declare class MessageStore {
7
+ private readonly db;
8
+ private readonly config;
9
+ private readonly memoryIndex;
10
+ constructor(db: Database.Database, config: MemoryConfig, memoryIndex: MemoryIndex);
11
+ private writeCounter;
12
+ private diskBudgetCallback;
13
+ /** Count of messages rejected by the injection scanner since process start. Exposed via getStats(). */
14
+ rejectedByScanner: number;
15
+ /** Register a callback to run disk budget enforcement periodically. */
16
+ setDiskBudgetCallback(fn: () => void): void;
17
+ /** Record a conversation message to FTS index + optional backup. Never throws. */
18
+ recordMessage(record: MessageRecord): void;
19
+ /** Load the most recent N messages from a session. */
20
+ loadRecentMessages(userId: string, sessionId: string, count: number): MessageRecord[];
21
+ /** Update emotion_score on a message by platform ID. Returns true if updated. */
22
+ updateEmotionByPlatformId(userId: string | string, platformMessageId: number, score: number, editMemoryFn: (params: {
23
+ messageId: number;
24
+ userId: string;
25
+ emotionScore: number;
26
+ }) => void): boolean;
27
+ /** Get the timestamp of the most recent user message (optionally excluding system markers). */
28
+ getLastMessageTimestamp(excludeSystem?: boolean): number;
29
+ /** Get recent messages since a timestamp, ordered newest first. */
30
+ getMessagesSince(sinceTimestamp: number, limit: number): Array<{
31
+ role: string;
32
+ content: string;
33
+ timestamp: number;
34
+ }>;
35
+ /** Get recent extracted memories (English content), newest first. */
36
+ getRecentExtractedMemories(limit: number): string[];
37
+ /** Get all extracted memories with attributes (for dashboard visualization). */
38
+ getAllExtractedMemories(): Array<Record<string, unknown>>;
39
+ /** Get distinct user IDs from messages. */
40
+ getDistinctUserIds(): string[];
41
+ }
42
+ //# sourceMappingURL=message-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-store.d.ts","sourceRoot":"","sources":["../../src/message-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAkBrD,qEAAqE;AACrE,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAFX,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,WAAW;IAG3C,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,kBAAkB,CAA6B;IACvD,uGAAuG;IACvG,iBAAiB,SAAK;IAEtB,uEAAuE;IACvE,qBAAqB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAE3C,kFAAkF;IAClF,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IA6B1C,sDAAsD;IACtD,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE;IAYrF,iFAAiF;IACjF,yBAAyB,CACvB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,iBAAiB,EAAE,MAAM,EACzB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAC1F,OAAO;IAkBV,+FAA+F;IAC/F,uBAAuB,CAAC,aAAa,UAAQ,GAAG,MAAM;IAUtD,mEAAmE;IACnE,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAQpH,qEAAqE;IACrE,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IASnD,gFAAgF;IAChF,uBAAuB,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAczD,2CAA2C;IAC3C,kBAAkB,IAAI,MAAM,EAAE;CAM/B"}
@@ -0,0 +1,145 @@
1
+ import { logError, logWarn } from "./mem-logger.js";
2
+ import { scanForInjection } from "./injection-scanner.js";
3
+ import { redactSecrets } from "./redact-secrets.js";
4
+ const TAG = "message-store";
5
+ /**
6
+ * Roles whose content is scanned for prompt injection at store time.
7
+ * Allowlist (not blocklist) — new roles default to trusted-skip.
8
+ * Untrusted input must opt in explicitly.
9
+ *
10
+ * - user: untrusted input from any platform adapter
11
+ * - assistant: bridge's own LLM output — trusted transport
12
+ * - compaction: derivative of already-scanned user messages — no new attack surface
13
+ */
14
+ const SCANNED_ROLES = new Set(["user"]);
15
+ /** Handles message recording, loading, and emotion score updates. */
16
+ export class MessageStore {
17
+ db;
18
+ config;
19
+ memoryIndex;
20
+ constructor(db, config, memoryIndex) {
21
+ this.db = db;
22
+ this.config = config;
23
+ this.memoryIndex = memoryIndex;
24
+ }
25
+ writeCounter = 0;
26
+ diskBudgetCallback = null;
27
+ /** Count of messages rejected by the injection scanner since process start. Exposed via getStats(). */
28
+ rejectedByScanner = 0;
29
+ /** Register a callback to run disk budget enforcement periodically. */
30
+ setDiskBudgetCallback(fn) { this.diskBudgetCallback = fn; }
31
+ /** Record a conversation message to FTS index + optional backup. Never throws. */
32
+ recordMessage(record) {
33
+ try {
34
+ if (!record.content.trim())
35
+ return;
36
+ if (SCANNED_ROLES.has(record.role)) {
37
+ const scan = scanForInjection(record.content);
38
+ if (!scan.safe) {
39
+ this.rejectedByScanner++;
40
+ logError(TAG, `Injection blocked in ${record.role} message (flags: ${scan.flags.map(f => f.category).join(", ")}, user=${record.userId}): ${redactSecrets(record.content)}`);
41
+ return;
42
+ }
43
+ }
44
+ this.memoryIndex.index(record);
45
+ if (this.config.maxMessagesPerChat > 0) {
46
+ this.memoryIndex.prune(record.userId, this.config.maxMessagesPerChat);
47
+ }
48
+ this.writeCounter++;
49
+ if (this.writeCounter % 100 === 0)
50
+ this.diskBudgetCallback?.();
51
+ }
52
+ catch (err) {
53
+ logError(TAG, "Failed to record message", err);
54
+ }
55
+ }
56
+ /** Load the most recent N messages from a session. */
57
+ loadRecentMessages(userId, sessionId, count) {
58
+ try {
59
+ const rows = this.db.prepare("SELECT role, content, timestamp, user_id, session_id AS sessionId FROM messages WHERE user_id = ? AND session_id = ? ORDER BY timestamp DESC LIMIT ?").all(userId, sessionId, count);
60
+ return rows.reverse();
61
+ }
62
+ catch (err) {
63
+ logError(TAG, `Failed to load recent messages for chat ${userId} session ${sessionId}`, err);
64
+ return [];
65
+ }
66
+ }
67
+ /** Update emotion_score on a message by platform ID. Returns true if updated. */
68
+ updateEmotionByPlatformId(userId, platformMessageId, score, editMemoryFn) {
69
+ try {
70
+ const result = this.db.prepare("UPDATE messages SET emotion_score = ? WHERE user_id = ? AND platform_message_id = ?").run(score, userId, platformMessageId);
71
+ if (result.changes === 0)
72
+ return false;
73
+ editMemoryFn({
74
+ messageId: platformMessageId,
75
+ userId: userId,
76
+ emotionScore: score,
77
+ });
78
+ return true;
79
+ }
80
+ catch (err) {
81
+ logError(TAG, "Failed to update emotion score", err);
82
+ return false;
83
+ }
84
+ }
85
+ /** Get the timestamp of the most recent user message (optionally excluding system markers). */
86
+ getLastMessageTimestamp(excludeSystem = false) {
87
+ try {
88
+ const sql = excludeSystem
89
+ ? "SELECT MAX(timestamp) as ts FROM messages WHERE content NOT LIKE '%[SYSTEM%'"
90
+ : "SELECT MAX(timestamp) as ts FROM messages WHERE role = 'user'";
91
+ const row = this.db.prepare(sql).get();
92
+ return row?.ts ?? 0;
93
+ }
94
+ catch (err) {
95
+ logWarn(TAG, `getLastMessageTimestamp failed: ${err instanceof Error ? err.message : String(err)}`);
96
+ return 0;
97
+ }
98
+ }
99
+ /** Get recent messages since a timestamp, ordered newest first. */
100
+ getMessagesSince(sinceTimestamp, limit) {
101
+ try {
102
+ return this.db.prepare("SELECT role, content, timestamp FROM messages WHERE timestamp > ? ORDER BY timestamp DESC LIMIT ?").all(sinceTimestamp, limit);
103
+ }
104
+ catch (err) {
105
+ logWarn(TAG, `query failed: ${err instanceof Error ? err.message : String(err)}`);
106
+ return [];
107
+ }
108
+ }
109
+ /** Get recent extracted memories (English content), newest first. */
110
+ getRecentExtractedMemories(limit) {
111
+ try {
112
+ const rows = this.db.prepare("SELECT content_en FROM extracted_memories ORDER BY created_at DESC LIMIT ?").all(limit);
113
+ return rows.map(r => r.content_en);
114
+ }
115
+ catch (err) {
116
+ logWarn(TAG, `query failed: ${err instanceof Error ? err.message : String(err)}`);
117
+ return [];
118
+ }
119
+ }
120
+ /** Get all extracted memories with attributes (for dashboard visualization). */
121
+ getAllExtractedMemories() {
122
+ try {
123
+ return this.db.prepare(`SELECT id, content_en, content_original, memory_type, created_at, emotion_score,
124
+ recall_count, relevance_score, classification, trust, integrity, credibility,
125
+ CASE WHEN embedding IS NOT NULL THEN 1 ELSE 0 END as has_embedding
126
+ FROM extracted_memories ORDER BY created_at DESC`).all();
127
+ }
128
+ catch (err) {
129
+ logWarn(TAG, `getAllExtractedMemories failed: ${err instanceof Error ? err.message : String(err)}`);
130
+ return [];
131
+ }
132
+ }
133
+ /** Get distinct user IDs from messages. */
134
+ getDistinctUserIds() {
135
+ try {
136
+ return this.db.prepare("SELECT DISTINCT user_id FROM messages ORDER BY user_id").all()
137
+ .map(r => r.user_id);
138
+ }
139
+ catch (err) {
140
+ logWarn(TAG, `query failed: ${err instanceof Error ? err.message : String(err)}`);
141
+ return [];
142
+ }
143
+ }
144
+ }
145
+ //# sourceMappingURL=message-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-store.js","sourceRoot":"","sources":["../../src/message-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Maximal Marginal Relevance (MMR) re-ranking.
3
+ *
4
+ * Iteratively selects results that balance relevance (score) with diversity
5
+ * (low similarity to already-selected results). Uses Jaccard token similarity.
6
+ */
7
+ /**
8
+ * Re-rank results using MMR.
9
+ * @param results - Pre-sorted by relevance score (descending). Each must have `content` and `score`.
10
+ * @param lambda - Balance: 1.0 = pure relevance, 0.0 = pure diversity. Default 0.7.
11
+ * @returns New array in MMR order.
12
+ */
13
+ export declare function applyMMR<T extends {
14
+ content: string;
15
+ score: number;
16
+ }>(results: T[], lambda?: number): T[];
17
+ //# sourceMappingURL=mmr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mmr.d.ts","sourceRoot":"","sources":["../../src/mmr.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,SAAM,GAAG,CAAC,EAAE,CAwBtG"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Maximal Marginal Relevance (MMR) re-ranking.
3
+ *
4
+ * Iteratively selects results that balance relevance (score) with diversity
5
+ * (low similarity to already-selected results). Uses Jaccard token similarity.
6
+ */
7
+ /** Jaccard similarity on lowercased word tokens. */
8
+ function jaccard(a, b) {
9
+ const tokA = new Set(a.toLowerCase().split(/\s+/).filter(Boolean));
10
+ const tokB = new Set(b.toLowerCase().split(/\s+/).filter(Boolean));
11
+ if (!tokA.size || !tokB.size)
12
+ return 0;
13
+ let intersection = 0;
14
+ for (const t of tokA)
15
+ if (tokB.has(t))
16
+ intersection++;
17
+ return intersection / (tokA.size + tokB.size - intersection);
18
+ }
19
+ /**
20
+ * Re-rank results using MMR.
21
+ * @param results - Pre-sorted by relevance score (descending). Each must have `content` and `score`.
22
+ * @param lambda - Balance: 1.0 = pure relevance, 0.0 = pure diversity. Default 0.7.
23
+ * @returns New array in MMR order.
24
+ */
25
+ export function applyMMR(results, lambda = 0.7) {
26
+ if (results.length <= 1)
27
+ return results;
28
+ const remaining = [...results];
29
+ const selected = [];
30
+ // First pick is always the highest-scoring result
31
+ selected.push(remaining.shift());
32
+ while (remaining.length > 0) {
33
+ let bestIdx = 0;
34
+ let bestMMR = -Infinity;
35
+ for (let i = 0; i < remaining.length; i++) {
36
+ const candidate = remaining[i];
37
+ const maxSim = Math.max(...selected.map(s => jaccard(candidate.content, s.content)));
38
+ const mmrScore = lambda * candidate.score - (1 - lambda) * maxSim;
39
+ if (mmrScore > bestMMR) {
40
+ bestMMR = mmrScore;
41
+ bestIdx = i;
42
+ }
43
+ }
44
+ selected.push(remaining.splice(bestIdx, 1)[0]);
45
+ }
46
+ return selected;
47
+ }
48
+ //# sourceMappingURL=mmr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mmr.js","sourceRoot":"","sources":["../../src/mmr.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oDAAoD;AACpD,SAAS,OAAO,CAAC,CAAS,EAAE,CAAS;IACnC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACnE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IACvC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,YAAY,EAAE,CAAC;IACtD,OAAO,YAAY,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAA+C,OAAY,EAAE,MAAM,GAAG,GAAG;IAC/F,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAExC,MAAM,SAAS,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAQ,EAAE,CAAC;IAEzB,kDAAkD;IAClD,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAG,CAAC,CAAC;IAElC,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAAO,GAAG,CAAC,QAAQ,CAAC;QAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACrF,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;YAClE,IAAI,QAAQ,GAAG,OAAO,EAAE,CAAC;gBAAC,OAAO,GAAG,QAAQ,CAAC;gBAAC,OAAO,GAAG,CAAC,CAAC;YAAC,CAAC;QAC9D,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type Database from "better-sqlite3";
2
+ export type OllamaEmbedConfig = {
3
+ enabled: boolean;
4
+ model: string;
5
+ url: string;
6
+ threshold: number;
7
+ };
8
+ export declare function loadEmbedConfig(): OllamaEmbedConfig;
9
+ export declare function embedText(config: OllamaEmbedConfig, text: string): Promise<Float32Array | null>;
10
+ /** Try to load sqlite-vec extension. Call once at DB init. Dims comes from EMBEDDING_DIMENSIONS. */
11
+ export declare function initVec(db: Database.Database, dimensions: number): void;
12
+ /** Whether sqlite-vec is loaded and usable. */
13
+ export declare function vecAvailable(): boolean;
14
+ /** Backfill vec_memories from existing embeddings (one-time migration). */
15
+ export declare function backfillVecIndex(db: Database.Database): number;
16
+ /** Insert a single embedding into the vec index. */
17
+ export declare function vecInsert(db: Database.Database, rowid: number, embedding: Buffer): void;
18
+ export declare function cosineSimilarity(a: Float32Array, b: Float32Array): number;
19
+ /**
20
+ * Search extracted_memories by vector similarity.
21
+ * Returns ids + scores above threshold, sorted descending.
22
+ */
23
+ export declare function vectorSearch(db: Database.Database, queryVector: Float32Array, opts: {
24
+ userId?: string;
25
+ limit?: number;
26
+ threshold: number;
27
+ maxClassification?: number;
28
+ }): Array<{
29
+ id: number;
30
+ content_en: string;
31
+ content_original: string | null;
32
+ created_at: number;
33
+ memory_type: string | null;
34
+ score: number;
35
+ trust: number | null;
36
+ integrity: number | null;
37
+ credibility: number | null;
38
+ classification: number | null;
39
+ source_message_ids: string | null;
40
+ }>;
41
+ /**
42
+ * Batch-embed all extracted_memories that have NULL embedding.
43
+ * Returns count of newly embedded memories.
44
+ */
45
+ export declare function batchEmbed(config: OllamaEmbedConfig, db: Database.Database): Promise<number>;
46
+ //# sourceMappingURL=ollama-embed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama-embed.d.ts","sourceRoot":"","sources":["../../src/ollama-embed.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAI3C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,eAAe,IAAI,iBAAiB,CAOnD;AAID,wBAAsB,SAAS,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAkBrG;AAMD,oGAAoG;AACpG,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAUvE;AAED,+CAA+C;AAC/C,wBAAgB,YAAY,IAAI,OAAO,CAA0B;AAEjE,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAQ9D;AAED,oDAAoD;AACpD,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAGvF;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAUzE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,WAAW,EAAE,YAAY,EACzB,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAE,GACvF,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CA4BzR;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,iBAAiB,EACzB,EAAE,EAAE,QAAQ,CAAC,QAAQ,GACpB,OAAO,CAAC,MAAM,CAAC,CAoBjB"}
@@ -0,0 +1,139 @@
1
+ import { getAbmindEnv } from "./env-schema.js";
2
+ /**
3
+ * Ollama embedding client — generates vector embeddings via local ollama API.
4
+ * Gated by EMBEDDING_ENABLED env var. When disabled, all methods return null/empty.
5
+ */
6
+ import { logInfo, logWarn } from "./mem-logger.js";
7
+ const TAG = "ollama-embed";
8
+ export function loadEmbedConfig() {
9
+ return {
10
+ enabled: getAbmindEnv().embeddingEnabled,
11
+ model: getAbmindEnv().embeddingModel,
12
+ url: getAbmindEnv().embeddingUrl,
13
+ threshold: getAbmindEnv().embeddingSimilarityThreshold,
14
+ };
15
+ }
16
+ let warnedOnce = false;
17
+ export async function embedText(config, text) {
18
+ if (!config.enabled)
19
+ return null;
20
+ try {
21
+ const res = await fetch(`${config.url}/api/embed`, {
22
+ method: "POST",
23
+ headers: { "Content-Type": "application/json" },
24
+ body: JSON.stringify({ model: config.model, input: text }),
25
+ });
26
+ if (!res.ok)
27
+ throw new Error(`ollama ${res.status}`);
28
+ const data = await res.json();
29
+ return new Float32Array(data.embeddings[0]);
30
+ }
31
+ catch (err) {
32
+ if (!warnedOnce) {
33
+ logWarn(TAG, `ollama unavailable — Se disabled: ${err instanceof Error ? err.message : String(err)}`);
34
+ warnedOnce = true;
35
+ }
36
+ return null;
37
+ }
38
+ }
39
+ // ── sqlite-vec index (graceful degradation) ─────────────────────────────────
40
+ let _vecAvailable = false;
41
+ /** Try to load sqlite-vec extension. Call once at DB init. Dims comes from EMBEDDING_DIMENSIONS. */
42
+ export function initVec(db, dimensions) {
43
+ try {
44
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
45
+ const sqliteVec = require("sqlite-vec");
46
+ sqliteVec.load(db);
47
+ db.exec(`CREATE VIRTUAL TABLE IF NOT EXISTS vec_memories USING vec0(embedding float[${dimensions}])`);
48
+ _vecAvailable = true;
49
+ }
50
+ catch {
51
+ logWarn(TAG, "sqlite-vec not available — falling back to brute-force vector search");
52
+ }
53
+ }
54
+ /** Whether sqlite-vec is loaded and usable. */
55
+ export function vecAvailable() { return _vecAvailable; }
56
+ /** Backfill vec_memories from existing embeddings (one-time migration). */
57
+ export function backfillVecIndex(db) {
58
+ if (!_vecAvailable)
59
+ return 0;
60
+ const count = db.prepare("SELECT COUNT(*) as c FROM vec_memories").get().c;
61
+ if (count > 0)
62
+ return 0;
63
+ const rows = db.prepare("SELECT id, embedding FROM extracted_memories WHERE embedding IS NOT NULL").all();
64
+ const stmt = db.prepare("INSERT INTO vec_memories (rowid, embedding) VALUES (?, ?)");
65
+ for (const row of rows)
66
+ stmt.run(row.id, row.embedding);
67
+ return rows.length;
68
+ }
69
+ /** Insert a single embedding into the vec index. */
70
+ export function vecInsert(db, rowid, embedding) {
71
+ if (!_vecAvailable)
72
+ return;
73
+ db.prepare("INSERT OR REPLACE INTO vec_memories (rowid, embedding) VALUES (?, ?)").run(rowid, embedding);
74
+ }
75
+ export function cosineSimilarity(a, b) {
76
+ if (a.length !== b.length || a.length === 0)
77
+ return 0;
78
+ let dot = 0, normA = 0, normB = 0;
79
+ for (let i = 0; i < a.length; i++) {
80
+ dot += a[i] * b[i];
81
+ normA += a[i] * a[i];
82
+ normB += b[i] * b[i];
83
+ }
84
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
85
+ return denom === 0 ? 0 : dot / denom;
86
+ }
87
+ /**
88
+ * Search extracted_memories by vector similarity.
89
+ * Returns ids + scores above threshold, sorted descending.
90
+ */
91
+ export function vectorSearch(db, queryVector, opts) {
92
+ const conditions = ["embedding IS NOT NULL"];
93
+ const params = [];
94
+ if (opts.maxClassification !== undefined) {
95
+ conditions.push("COALESCE(classification, 0) <= ?");
96
+ params.push(opts.maxClassification);
97
+ }
98
+ if (opts.userId) {
99
+ conditions.push("(COALESCE(classification, 0) <= 1 OR user_id = ?)");
100
+ params.push(opts.userId);
101
+ }
102
+ // Cap the scan to the most recent 500 embedded memories to avoid O(n) over entire DB
103
+ const scanLimit = 500;
104
+ const rows = db.prepare(`SELECT id, content_en, content_original, created_at, memory_type, embedding, trust, integrity, credibility, classification, source_message_ids FROM extracted_memories WHERE ${conditions.join(" AND ")} ORDER BY created_at DESC LIMIT ${scanLimit}`).all(...params);
105
+ const scored = [];
106
+ for (const row of rows) {
107
+ const stored = new Float32Array(new Uint8Array(row.embedding).buffer);
108
+ const score = cosineSimilarity(queryVector, stored);
109
+ if (score >= opts.threshold) {
110
+ scored.push({ id: row.id, content_en: row.content_en, content_original: row.content_original, created_at: row.created_at, memory_type: row.memory_type, score, trust: row.trust, integrity: row.integrity, credibility: row.credibility, classification: row.classification, source_message_ids: row.source_message_ids });
111
+ }
112
+ }
113
+ scored.sort((a, b) => b.score - a.score);
114
+ return scored.slice(0, opts.limit ?? 10);
115
+ }
116
+ /**
117
+ * Batch-embed all extracted_memories that have NULL embedding.
118
+ * Returns count of newly embedded memories.
119
+ */
120
+ export async function batchEmbed(config, db) {
121
+ if (!config.enabled)
122
+ return 0;
123
+ const rows = db.prepare("SELECT id, content_en FROM extracted_memories WHERE embedding IS NULL").all();
124
+ if (rows.length === 0)
125
+ return 0;
126
+ logInfo(TAG, `Batch embedding ${rows.length} memories...`);
127
+ const update = db.prepare("UPDATE extracted_memories SET embedding = ? WHERE id = ?");
128
+ let count = 0;
129
+ for (const row of rows) {
130
+ const vec = await embedText(config, row.content_en);
131
+ if (vec) {
132
+ update.run(Buffer.from(vec.buffer), row.id);
133
+ count++;
134
+ }
135
+ }
136
+ logInfo(TAG, `Batch embedded ${count}/${rows.length} memories`);
137
+ return count;
138
+ }
139
+ //# sourceMappingURL=ollama-embed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama-embed.js","sourceRoot":"","sources":["../../src/ollama-embed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAGnD,MAAM,GAAG,GAAG,cAAc,CAAC;AAS3B,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,OAAO,EAAE,YAAY,EAAE,CAAC,gBAAgB;QACxC,KAAK,EAAE,YAAY,EAAE,CAAC,cAAc;QACpC,GAAG,EAAE,YAAY,EAAE,CAAC,YAAY;QAChC,SAAS,EAAE,YAAY,EAAE,CAAC,4BAA4B;KACvD,CAAC;AACJ,CAAC;AAED,IAAI,UAAU,GAAG,KAAK,CAAC;AAEvB,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAyB,EAAE,IAAY;IACrE,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,YAAY,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;SAC3D,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAgC,CAAC;QAC5D,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,EAAE,qCAAqC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtG,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,IAAI,aAAa,GAAG,KAAK,CAAC;AAE1B,oGAAoG;AACpG,MAAM,UAAU,OAAO,CAAC,EAAqB,EAAE,UAAkB;IAC/D,IAAI,CAAC;QACH,iEAAiE;QACjE,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;QACxC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,EAAE,CAAC,IAAI,CAAC,8EAA8E,UAAU,IAAI,CAAC,CAAC;QACtG,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,EAAE,sEAAsE,CAAC,CAAC;IACvF,CAAC;AACH,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,YAAY,KAAc,OAAO,aAAa,CAAC,CAAC,CAAC;AAEjE,2EAA2E;AAC3E,MAAM,UAAU,gBAAgB,CAAC,EAAqB;IACpD,IAAI,CAAC,aAAa;QAAE,OAAO,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAI,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,EAAoB,CAAC,CAAC,CAAC;IAC9F,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,0EAA0E,CAAC,CAAC,GAAG,EAA8C,CAAC;IACtJ,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC;IACrF,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,SAAS,CAAC,EAAqB,EAAE,KAAa,EAAE,SAAiB;IAC/E,IAAI,CAAC,aAAa;QAAE,OAAO;IAC3B,EAAE,CAAC,OAAO,CAAC,sEAAsE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AAC3G,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAe,EAAE,CAAe;IAC/D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtD,IAAI,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACvB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACzB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,EAAqB,EACrB,WAAyB,EACzB,IAAwF;IAExF,MAAM,UAAU,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;QAAC,UAAU,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAAC,CAAC;IACvI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAAC,CAAC;IAEpH,qFAAqF;IACrF,MAAM,SAAS,GAAG,GAAG,CAAC;IAEtB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,gLAAgL,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,mCAAmC,SAAS,EAAE,CACvP,CAAC,GAAG,CAAC,GAAG,MAAM,CAIb,CAAC;IAEH,MAAM,MAAM,GAA4R,EAAE,CAAC;IAC3S,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;QACtE,MAAM,KAAK,GAAG,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACpD,IAAI,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,CAAC,cAAc,EAAE,kBAAkB,EAAE,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAC7T,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAyB,EACzB,EAAqB;IAErB,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC;IAE9B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,uEAAuE,CAAC,CAAC,GAAG,EAA+C,CAAC;IACpJ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEhC,OAAO,CAAC,GAAG,EAAE,mBAAmB,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC;IACtF,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5C,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,IAAI,CAAC,MAAM,WAAW,CAAC,CAAC;IAChE,OAAO,KAAK,CAAC;AACf,CAAC"}