abmind 0.0.1 → 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 (532) 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 +145 -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 +31 -0
  389. package/dist/src/openclaw-plugin/tools.d.ts.map +1 -0
  390. package/dist/src/openclaw-plugin/tools.js +127 -0
  391. package/dist/src/openclaw-plugin/tools.js.map +1 -0
  392. package/dist/src/openclaw-plugin/types.d.ts +34 -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/package.json +87 -5
  517. package/prompts/sleep/01-gc-noise.md +28 -0
  518. package/prompts/sleep/02-daily-summary.md +3 -0
  519. package/prompts/sleep/03-extract-from-daily.md +3 -0
  520. package/prompts/sleep/04-retrospective.md +30 -0
  521. package/prompts/sleep/06-feedback.md +17 -0
  522. package/prompts/sleep/07-topic-assignment.md +23 -0
  523. package/prompts/sleep/08-core-promotion.md +26 -0
  524. package/prompts/sleep/09-merge.md +19 -0
  525. package/prompts/sleep/10-translation.md +17 -0
  526. package/prompts/sleep/11-skill-review.md +12 -0
  527. package/prompts/sleep/12-core-knowledge.md +14 -0
  528. package/prompts/sleep/13-consolidation.md +11 -0
  529. package/prompts/sleep/14-emotion-context.md +17 -0
  530. package/prompts/sleep/15-contradiction-and-graph.md +48 -0
  531. package/prompts/sleep/16-rem-synthesis.md +31 -0
  532. package/prompts/sleep/basic.md +12 -0
@@ -0,0 +1,116 @@
1
+ import { readFileSync, existsSync, readdirSync } from "node:fs";
2
+ import { join, dirname } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { abmindHome } from "../mem-paths.js";
5
+ import { logWarn } from "../mem-logger.js";
6
+ import { localDate } from "../local-time.js";
7
+ const TAG = "sleep-prompt-loader";
8
+ /** Build the variable map used for template substitution. */
9
+ export function buildSleepVars(snapshot) {
10
+ const now = new Date();
11
+ const dateStr = localDate().replace(/-/g, "");
12
+ const timeStr = now.toTimeString().slice(0, 5).replace(/:/g, "");
13
+ return {
14
+ TIMESTAMP: snapshot.timestamp,
15
+ LAST_SLEEP_AUDIT: snapshot.lastSleepAudit ?? "none",
16
+ LAST_SLEEP_TS: snapshot.lastSleepTimestamp ? String(snapshot.lastSleepTimestamp) : "0",
17
+ CURRENT_TS: String(Date.now()),
18
+ WAKEUP_DATE: snapshot.wakeupDate ?? localDate(),
19
+ STATE_SNAPSHOT: buildSnapshotBlock(snapshot),
20
+ FTS_MESSAGES: snapshot.fts5Health.messages_fts,
21
+ FTS_EXTRACTED: snapshot.fts5Health.extracted_memories_fts,
22
+ FTS_ORIGINAL: snapshot.fts5Health.extracted_memories_original_fts,
23
+ DISK_USAGE_MB: (snapshot.diskUsageBytes / 1024 / 1024).toFixed(1),
24
+ DISK_BUDGET_MB: (snapshot.diskBudgetBytes / 1024 / 1024).toFixed(0),
25
+ TODO_CONTENTS: snapshot.todoContents ?? "No todo list yet.",
26
+ CRON_CONTENTS: snapshot.cronContents ?? "No cron entries.",
27
+ TOPIC_FILES_SECTION: buildTopicSection(snapshot),
28
+ WORKING_DIRS_SECTION: buildWorkingDirsSection(snapshot),
29
+ AUDIT_FILENAME: `${dateStr}_${timeStr}`,
30
+ };
31
+ }
32
+ /** Apply variable substitution to a template string. */
33
+ export function substituteVars(template, vars) {
34
+ let result = template;
35
+ for (const [key, value] of Object.entries(vars)) {
36
+ result = result.replaceAll(`\${${key}}`, value);
37
+ }
38
+ const unreplaced = result.match(/\$\{[A-Z_]+\}/g);
39
+ if (unreplaced)
40
+ logWarn(TAG, `Unreplaced template variables: ${unreplaced.join(", ")}`);
41
+ return result;
42
+ }
43
+ /** Resolve the package's shipped prompts/sleep/ dir.
44
+ * Works from both source (src/sleep/) and built dist (dist/src/sleep/). */
45
+ function packagePromptsDir() {
46
+ const hereDir = dirname(fileURLToPath(import.meta.url));
47
+ // src/sleep/ → up 2 to pkg root → prompts/sleep
48
+ const srcSide = join(hereDir, "..", "..", "prompts", "sleep");
49
+ if (existsSync(srcSide))
50
+ return srcSide;
51
+ // dist/src/sleep/ → up 3 to pkg root → prompts/sleep
52
+ return join(hereDir, "..", "..", "..", "prompts", "sleep");
53
+ }
54
+ /**
55
+ * Load all sleep step files from prompts/sleep/ directory.
56
+ * Returns raw templates — caller substitutes JIT with evolving vars map.
57
+ *
58
+ * Resolution order:
59
+ * 1. $ABMIND_HOME/prompts/sleep/ — user override (if present).
60
+ * 2. Package tree <pkg>/prompts/sleep/ — default, ships with abmind.
61
+ */
62
+ export function loadSleepSteps() {
63
+ const userDir = join(abmindHome(), "prompts", "sleep");
64
+ const packageDir = packagePromptsDir();
65
+ const sleepDir = existsSync(userDir) ? userDir : packageDir;
66
+ if (!existsSync(sleepDir)) {
67
+ throw new Error(`Sleep step directory not found at ${userDir} or ${packageDir}`);
68
+ }
69
+ const files = readdirSync(sleepDir).filter(f => f.endsWith(".md")).sort();
70
+ return files.map(filename => {
71
+ const raw = readFileSync(join(sleepDir, filename), "utf-8");
72
+ const name = filename.replace(/^\d+-/, "").replace(/\.md$/, "");
73
+ return {
74
+ name,
75
+ filename,
76
+ rawPrompt: raw,
77
+ skippable: !name.includes("gc-noise") && !name.includes("daily-summary") && !name.includes("extract-from-daily") && !name.includes("retrospective"),
78
+ };
79
+ });
80
+ }
81
+ /**
82
+ * Load sleeping_prompt.md template and inject state snapshot variables.
83
+ * @deprecated Use loadSleepSteps() for multi-turn sleep.
84
+ */
85
+ export function loadSleepPrompt(snapshot) {
86
+ const path = join(abmindHome(), "prompts", "sleeping_prompt.md");
87
+ if (!existsSync(path)) {
88
+ throw new Error(`sleeping_prompt.md not found at ${path}`);
89
+ }
90
+ const template = readFileSync(path, "utf-8");
91
+ return substituteVars(template, buildSleepVars(snapshot));
92
+ }
93
+ function buildSnapshotBlock(s) {
94
+ return [
95
+ `- Messages in DB: ${s.dbStats.messageCount}`,
96
+ `- Extracted memories: ${s.dbStats.extractedMemoryCount}`,
97
+ `- Embeddings: ${s.dbStats.embeddingCount}/${s.dbStats.extractedMemoryCount}${s.dbStats.nullEmbeddingCount > 0 ? ` (${s.dbStats.nullEmbeddingCount} missing)` : ""}`,
98
+ `- Working dirs: ${s.workingDirs.length}`,
99
+ `- Disk: ${(s.diskUsageBytes / 1024 / 1024).toFixed(1)} MB / ${(s.diskBudgetBytes / 1024 / 1024).toFixed(0)} MB`,
100
+ ].join("\n");
101
+ }
102
+ function buildTopicSection(s) {
103
+ if (s.topicFiles.length === 0)
104
+ return "No topic files.";
105
+ return s.topicFiles
106
+ .map((t) => `- \`${t.name}\` (${(t.sizeBytes / 1024).toFixed(1)} KB, modified ${t.lastModified.slice(0, 10)})`)
107
+ .join("\n");
108
+ }
109
+ function buildWorkingDirsSection(s) {
110
+ if (s.workingDirs.length === 0)
111
+ return "No working directories.";
112
+ return s.workingDirs
113
+ .map((d) => `- \`${d.date}\` (${d.files.length} files)`)
114
+ .join("\n");
115
+ }
116
+ //# sourceMappingURL=sleep-prompt-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep-prompt-loader.js","sourceRoot":"","sources":["../../../src/sleep/sleep-prompt-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Test harness for sleep orchestrator integration tests (#175).
3
+ *
4
+ * Provides:
5
+ * - Temp memory dir with initialized abmind DB
6
+ * - MockRuntime implementing SleepRuntime with prompt-hint-keyed responses
7
+ * - Deterministic time injection helpers
8
+ * - Lock file pre-seeding for resume/catch-up scenarios
9
+ */
10
+ import { MemoryManager } from "../memory-manager.js";
11
+ import { type MemoryConfig } from "../memory-config.js";
12
+ import type { SleepRuntime } from "./runtime.js";
13
+ export interface MockRuntime extends SleepRuntime {
14
+ setResponse(stepHint: string, response: string): void;
15
+ setError(stepHint: string, err: Error): void;
16
+ setDefault(response: string): void;
17
+ callCount(): number;
18
+ callsFor(stepHint: string): string[];
19
+ allCalls(): Array<{
20
+ prompt: string;
21
+ }>;
22
+ }
23
+ /** Create a SleepRuntime mock. complete() matches prompt against registered hints; first hint-match wins. */
24
+ export declare function createMockRuntime(): MockRuntime;
25
+ export interface TestEnv {
26
+ memoryDir: string;
27
+ memory: MemoryManager;
28
+ memoryConfig: MemoryConfig;
29
+ sleepDir: string;
30
+ dailyDir: string;
31
+ runtime: MockRuntime;
32
+ /** Fixed "today" timestamp — use in opts.now */
33
+ now: number;
34
+ todayStr: string;
35
+ todayIso: string;
36
+ cleanup: () => void;
37
+ }
38
+ export interface SetupOpts {
39
+ seedMessages?: number;
40
+ /** Fixed today as YYYY-MM-DD. Defaults to a stable test date. */
41
+ today?: string;
42
+ /** Seed today's lock file. Steps default to empty map. */
43
+ preseedLock?: {
44
+ status?: "ongoing" | "completed" | "suspended" | "failed";
45
+ llmCalls?: number;
46
+ steps?: Record<string, {
47
+ status: "ok" | "failed" | "skipped" | "pending" | "timeout";
48
+ duration?: number;
49
+ path?: string;
50
+ }>;
51
+ };
52
+ /** Seed a previous day's lock file for catch-up tests. */
53
+ preseedPreviousDayLock?: {
54
+ dateStr: string;
55
+ steps: Record<string, {
56
+ status: "ok" | "failed" | "skipped" | "pending" | "timeout";
57
+ }>;
58
+ ageDaysAtNow?: number;
59
+ };
60
+ /** Seed a daily_YYYY-MM-DD.md file (for resume scenarios that start mid-cycle). */
61
+ preseedDailyFile?: {
62
+ date: string;
63
+ content: string;
64
+ };
65
+ }
66
+ export declare function setupTestEnv(opts?: SetupOpts): Promise<TestEnv>;
67
+ //# sourceMappingURL=test-harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-harness.d.ts","sourceRoot":"","sources":["../../../src/sleep/test-harness.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC/C,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7C,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,SAAS,IAAI,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACrC,QAAQ,IAAI,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvC;AAED,6GAA6G;AAC7G,wBAAgB,iBAAiB,IAAI,WAAW,CA2B/C;AAID,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,WAAW,CAAC;IACrB,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,WAAW,CAAC,EAAE;QACZ,MAAM,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;QAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE,IAAI,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC3H,CAAC;IACF,0DAA0D;IAC1D,sBAAsB,CAAC,EAAE;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE,IAAI,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAA;SAAE,CAAC,CAAC;QACvF,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,mFAAmF;IACnF,gBAAgB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD;AAED,wBAAsB,YAAY,CAAC,IAAI,GAAE,SAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAoFzE"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Test harness for sleep orchestrator integration tests (#175).
3
+ *
4
+ * Provides:
5
+ * - Temp memory dir with initialized abmind DB
6
+ * - MockRuntime implementing SleepRuntime with prompt-hint-keyed responses
7
+ * - Deterministic time injection helpers
8
+ * - Lock file pre-seeding for resume/catch-up scenarios
9
+ */
10
+ import { mkdtempSync, rmSync, mkdirSync, writeFileSync, copyFileSync, readdirSync, existsSync } from "node:fs";
11
+ import { tmpdir } from "node:os";
12
+ import { join, dirname } from "node:path";
13
+ import { fileURLToPath } from "node:url";
14
+ import { MemoryManager } from "../memory-manager.js";
15
+ import { loadMemoryConfig } from "../memory-config.js";
16
+ /** Create a SleepRuntime mock. complete() matches prompt against registered hints; first hint-match wins. */
17
+ export function createMockRuntime() {
18
+ const responses = new Map();
19
+ const errors = new Map();
20
+ let defaultResponse = "(mock default)";
21
+ const calls = [];
22
+ return {
23
+ async complete(prompt) {
24
+ calls.push({ prompt });
25
+ // Ensure writeStateFile flush ordering before returning (see plan Phase 2 atomicity note)
26
+ await Promise.resolve();
27
+ for (const [hint, err] of errors) {
28
+ if (prompt.includes(hint))
29
+ throw err;
30
+ }
31
+ for (const [hint, resp] of responses) {
32
+ if (prompt.includes(hint))
33
+ return resp;
34
+ }
35
+ return defaultResponse;
36
+ },
37
+ setResponse(stepHint, response) { responses.set(stepHint, response); },
38
+ setError(stepHint, err) { errors.set(stepHint, err); },
39
+ setDefault(response) { defaultResponse = response; },
40
+ callCount() { return calls.length; },
41
+ callsFor(stepHint) { return calls.filter(c => c.prompt.includes(stepHint)).map(c => c.prompt); },
42
+ allCalls() { return [...calls]; },
43
+ };
44
+ }
45
+ export async function setupTestEnv(opts = {}) {
46
+ const memoryDir = mkdtempSync(join(tmpdir(), "sleep-orch-"));
47
+ const todayIso = opts.today ?? "2026-04-18";
48
+ const todayStr = todayIso.replace(/-/g, "");
49
+ const now = new Date(`${todayIso}T12:00:00`).getTime();
50
+ // Set up a fake ABMIND_HOME with prompts — loadSleepSteps() reads from here
51
+ const abmindHomeDir = join(memoryDir, "abmind-home");
52
+ mkdirSync(join(abmindHomeDir, "prompts", "sleep"), { recursive: true });
53
+ // Copy prompt files from the abmind repo tree into the temp home.
54
+ // We're inside abmind/src/sleep/, prompts live at abmind/prompts/sleep/.
55
+ const hereDir = dirname(fileURLToPath(import.meta.url));
56
+ const promptsSrc = join(hereDir, "..", "..", "prompts", "sleep");
57
+ if (existsSync(promptsSrc)) {
58
+ for (const f of readdirSync(promptsSrc)) {
59
+ if (f.endsWith(".md"))
60
+ copyFileSync(join(promptsSrc, f), join(abmindHomeDir, "prompts", "sleep", f));
61
+ }
62
+ }
63
+ process.env["ABMIND_HOME"] = abmindHomeDir;
64
+ process.env["ABMIND_USER_ID"] = "master";
65
+ // Init abmind
66
+ const baseConfig = loadMemoryConfig();
67
+ const memoryConfig = { ...baseConfig, memoryDir, memoryEnabled: true };
68
+ const memory = new MemoryManager(memoryConfig);
69
+ await memory.initialize({ skipEmbeddingCheck: true });
70
+ const sleepDir = join(memoryDir, "sleep");
71
+ const dailyDir = join(memoryDir, "daily");
72
+ mkdirSync(sleepDir, { recursive: true });
73
+ mkdirSync(dailyDir, { recursive: true });
74
+ mkdirSync(join(memoryDir, "core"), { recursive: true });
75
+ // Seed messages — direct SQL insert, bypass scanner for test determinism
76
+ if (opts.seedMessages && opts.seedMessages > 0) {
77
+ const db = memory.getDb();
78
+ if (!db)
79
+ throw new Error("test harness: DB not available after init");
80
+ const stmt = db.prepare("INSERT INTO messages (user_id, session_id, role, content, timestamp) VALUES (?, ?, ?, ?, ?)");
81
+ const baseTs = now - opts.seedMessages * 60_000; // 1 msg/min backward
82
+ for (let i = 0; i < opts.seedMessages; i++) {
83
+ const role = i % 2 === 0 ? "user" : "assistant";
84
+ stmt.run("master", "master:telegram", role, `test message ${i}`, baseTs + i * 60_000);
85
+ }
86
+ }
87
+ // Pre-seed today's lock file
88
+ if (opts.preseedLock) {
89
+ const lockPath = join(sleepDir, `sleep_${todayStr}.lock`);
90
+ writeFileSync(lockPath, JSON.stringify({
91
+ status: opts.preseedLock.status ?? "ongoing",
92
+ pid: process.pid,
93
+ startedAt: now - 60_000,
94
+ llmCalls: opts.preseedLock.llmCalls ?? 0,
95
+ steps: opts.preseedLock.steps ?? {},
96
+ }, null, 2));
97
+ }
98
+ // Pre-seed previous day's lock file
99
+ if (opts.preseedPreviousDayLock) {
100
+ const prev = opts.preseedPreviousDayLock;
101
+ const lockPath = join(sleepDir, `sleep_${prev.dateStr}.lock`);
102
+ writeFileSync(lockPath, JSON.stringify({
103
+ status: "failed",
104
+ pid: 0,
105
+ startedAt: now - (prev.ageDaysAtNow ?? 1) * 86400_000,
106
+ llmCalls: 0,
107
+ steps: prev.steps,
108
+ }, null, 2));
109
+ }
110
+ // Pre-seed daily file (for resume scenarios)
111
+ if (opts.preseedDailyFile) {
112
+ const f = opts.preseedDailyFile;
113
+ writeFileSync(join(dailyDir, `daily_${f.date}.md`), f.content);
114
+ }
115
+ const runtime = createMockRuntime();
116
+ return {
117
+ memoryDir, memory, memoryConfig, sleepDir, dailyDir, runtime, now, todayStr, todayIso,
118
+ cleanup() { memory.close(); rmSync(memoryDir, { recursive: true, force: true }); },
119
+ };
120
+ }
121
+ //# sourceMappingURL=test-harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-harness.js","sourceRoot":"","sources":["../../../src/sleep/test-harness.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/G,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAqB,MAAM,qBAAqB,CAAC;AAc1E,6GAA6G;AAC7G,MAAM,UAAU,iBAAiB;IAC/B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;IACxC,IAAI,eAAe,GAAG,gBAAgB,CAAC;IACvC,MAAM,KAAK,GAA8B,EAAE,CAAC;IAE5C,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,MAAc;YAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YACvB,0FAA0F;YAC1F,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACxB,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;gBACjC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,MAAM,GAAG,CAAC;YACvC,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;gBACrC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAC;YACzC,CAAC;YACD,OAAO,eAAe,CAAC;QACzB,CAAC;QAED,WAAW,CAAC,QAAQ,EAAE,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtE,QAAQ,CAAC,QAAQ,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QACtD,UAAU,CAAC,QAAQ,IAAI,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC;QACpD,SAAS,KAAK,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACpC,QAAQ,CAAC,QAAQ,IAAI,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAChG,QAAQ,KAAK,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;KAClC,CAAC;AACJ,CAAC;AAsCD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAkB,EAAE;IACrD,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC;IAC5C,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,QAAQ,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC;IAEvD,4EAA4E;IAC5E,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACrD,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,kEAAkE;IAClE,yEAAyE;IACzE,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACjE,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACvG,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,QAAQ,CAAC;IAEzC,cAAc;IACd,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IACtC,MAAM,YAAY,GAAiB,EAAE,GAAG,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACrF,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,YAAY,CAAC,CAAC;IAC/C,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1C,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExD,yEAAyE;IACzE,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,6FAA6F,CAC9F,CAAC;QACF,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,CAAC,qBAAqB;QACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;YAChD,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,QAAQ,OAAO,CAAC,CAAC;QAC1D,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;YACrC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,SAAS;YAC5C,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,SAAS,EAAE,GAAG,GAAG,MAAM;YACvB,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC;YACxC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;SACpC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;IAED,oCAAoC;IACpC,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,sBAAsB,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,IAAI,CAAC,OAAO,OAAO,CAAC,CAAC;QAC9D,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;YACrC,MAAM,EAAE,QAAQ;YAChB,GAAG,EAAE,CAAC;YACN,SAAS,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,SAAS;YACrD,QAAQ,EAAE,CAAC;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;IAED,6CAA6C;IAC7C,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAChC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IAEpC,OAAO;QACL,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ;QACrF,OAAO,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;KACnF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Check if sleep has already run today (audit file exists with all steps ok). */
2
+ export declare function hasSleepAuditToday(auditDir: string): boolean;
3
+ //# sourceMappingURL=trigger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigger.d.ts","sourceRoot":"","sources":["../../../src/sleep/trigger.ts"],"names":[],"mappings":"AAOA,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAiD5D"}
@@ -0,0 +1,66 @@
1
+ import { readdirSync, existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { logDebug } from "../mem-logger.js";
4
+ import { localDate } from "../local-time.js";
5
+ const TAG = "sleep-trigger";
6
+ /** Check if sleep has already run today (audit file exists with all steps ok). */
7
+ export function hasSleepAuditToday(auditDir) {
8
+ if (!existsSync(auditDir))
9
+ return false;
10
+ const dateStr = localDate().replace(/-/g, "");
11
+ try {
12
+ const files = readdirSync(auditDir);
13
+ // Audit .md exists → sleep completed today
14
+ if (files.some((f) => f.startsWith(`sleep_${dateStr}`) && f.endsWith(".md")))
15
+ return true;
16
+ const lockFile = files.find(f => f === `sleep_${dateStr}.lock`);
17
+ if (lockFile) {
18
+ try {
19
+ const state = JSON.parse(readFileSync(join(auditDir, lockFile), "utf-8"));
20
+ // Check top-level status first (new format)
21
+ if (state.status === "completed") {
22
+ logDebug(TAG, "Sleep completed — no retry today");
23
+ return true;
24
+ }
25
+ if (state.status === "suspended") {
26
+ logDebug(TAG, "Sleep suspended (budget exhausted) — retry allowed");
27
+ return false;
28
+ }
29
+ if (state.status === "ongoing") {
30
+ // Check if pid is still alive
31
+ if (state.pid) {
32
+ try {
33
+ process.kill(state.pid, 0);
34
+ logDebug(TAG, `Sleep process ${state.pid} still running`);
35
+ return true;
36
+ }
37
+ catch {
38
+ logDebug(TAG, "Sleep process dead — retry allowed");
39
+ return false;
40
+ }
41
+ }
42
+ }
43
+ if (state.status === "failed") {
44
+ logDebug(TAG, "Sleep failed — retry allowed");
45
+ return false;
46
+ }
47
+ // Legacy format (no status field) — fall back to step inspection
48
+ const steps = Object.values(state.steps ?? {});
49
+ const hasFailed = steps.some(s => s.status === "failed" || s.status === "pending" || s.status === "timeout");
50
+ if (hasFailed) {
51
+ logDebug(TAG, "Lock file has incomplete steps — retry allowed");
52
+ return false;
53
+ }
54
+ return steps.length > 0;
55
+ }
56
+ catch {
57
+ return false;
58
+ }
59
+ }
60
+ return false;
61
+ }
62
+ catch {
63
+ return false;
64
+ }
65
+ }
66
+ //# sourceMappingURL=trigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigger.js","sourceRoot":"","sources":["../../../src/sleep/trigger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * sleep-data-access.ts — Database queries used by the sleep cycle.
3
+ * Lives in the memory package so it can use raw DB internally.
4
+ * Sleep imports this via IMemorySystem.getSleepData().
5
+ */
6
+ import type Database from "better-sqlite3";
7
+ export type SleepCandidateLists = {
8
+ untaggedMemories: string;
9
+ promotionCandidates: string;
10
+ contradictions: string;
11
+ mergeCandidates: string;
12
+ translationIssues: string;
13
+ emotionContextGaps: string;
14
+ recallFeedback: string;
15
+ };
16
+ export type EmotionalProfileEntry = {
17
+ topic: string;
18
+ positive: number;
19
+ negative: number;
20
+ topTags: Array<{
21
+ tag: string;
22
+ count: number;
23
+ }>;
24
+ topContexts: string[];
25
+ };
26
+ export declare class SleepDataAccess {
27
+ private readonly db;
28
+ constructor(db: Database.Database);
29
+ /** Transitional: expose raw DB for callers not yet migrated (buildDailySummary). */
30
+ getDb(): Database.Database;
31
+ getPrimaryUserId(): string;
32
+ getExtractionWatermark(userId: string): number;
33
+ getFirstMessageAfter(userId: string, afterTs: number): number | null;
34
+ advanceExtractionWatermarks(): number;
35
+ getMessagesAfter(afterTs: number): Array<{
36
+ id: number;
37
+ role: string;
38
+ content: string;
39
+ emotion_score: number | null;
40
+ }>;
41
+ getShortMessageCount(): number;
42
+ deleteMessagesByIds(ids: number[]): void;
43
+ flushOldMessages(opts: {
44
+ maxAgeDays: number;
45
+ maxCount: number;
46
+ }): {
47
+ agedOut: number;
48
+ capped: number;
49
+ };
50
+ buildEmotionArcs(): number;
51
+ getEmotionalProfileData(): EmotionalProfileEntry[];
52
+ buildSleepCandidates(): SleepCandidateLists;
53
+ }
54
+ //# sourceMappingURL=sleep-data-access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep-data-access.d.ts","sourceRoot":"","sources":["../../src/sleep-data-access.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAQ3C,MAAM,MAAM,mBAAmB,GAAG;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAElD,oFAAoF;IACpF,KAAK,IAAI,QAAQ,CAAC,QAAQ;IAE1B,gBAAgB,IAAI,MAAM;IAU1B,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAK9C,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKpE,2BAA2B,IAAI,MAAM;IAWrC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAMrH,oBAAoB,IAAI,MAAM;IAI9B,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI;IAKxC,gBAAgB,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAWrG,gBAAgB,IAAI,MAAM;IAsB1B,uBAAuB,IAAI,qBAAqB,EAAE;IA+BlD,oBAAoB,IAAI,mBAAmB;CAkE5C"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * sleep-data-access.ts — Database queries used by the sleep cycle.
3
+ * Lives in the memory package so it can use raw DB internally.
4
+ * Sleep imports this via IMemorySystem.getSleepData().
5
+ */
6
+ import { buildArc } from "./emotion-arc.js";
7
+ import { checkContradiction } from "./contradiction-checker.js";
8
+ import { hammingSimilarity } from "./signature-generator.js";
9
+ import { logWarn } from "./mem-logger.js";
10
+ const TAG = "sleep-data";
11
+ export class SleepDataAccess {
12
+ db;
13
+ constructor(db) {
14
+ this.db = db;
15
+ }
16
+ /** Transitional: expose raw DB for callers not yet migrated (buildDailySummary). */
17
+ getDb() { return this.db; }
18
+ getPrimaryUserId() {
19
+ const fromEnv = process.env["ABMIND_USER_ID"];
20
+ if (fromEnv)
21
+ return fromEnv;
22
+ try {
23
+ const row = this.db.prepare("SELECT DISTINCT user_id FROM messages LIMIT 1").get();
24
+ if (row?.user_id)
25
+ return row.user_id;
26
+ }
27
+ catch { /* */ }
28
+ throw new Error("No user_id found. Set ABMIND_USER_ID env var or ensure messages exist in the DB.");
29
+ }
30
+ getExtractionWatermark(userId) {
31
+ const row = this.db.prepare("SELECT last_processed_timestamp FROM extraction_watermarks WHERE user_id = ?").get(userId);
32
+ return row?.last_processed_timestamp ?? 0;
33
+ }
34
+ getFirstMessageAfter(userId, afterTs) {
35
+ const row = this.db.prepare("SELECT MIN(timestamp) as ts FROM messages WHERE user_id = ? AND timestamp > ?").get(userId, afterTs);
36
+ return row?.ts ?? null;
37
+ }
38
+ advanceExtractionWatermarks() {
39
+ const userIds = this.db.prepare("SELECT DISTINCT user_id FROM messages").all();
40
+ const now = Date.now();
41
+ for (const { user_id } of userIds) {
42
+ this.db.prepare(`INSERT INTO extraction_watermarks (user_id, last_processed_timestamp) VALUES (?, ?) ON CONFLICT(user_id) DO UPDATE SET last_processed_timestamp = excluded.last_processed_timestamp`).run(user_id, now);
43
+ }
44
+ return userIds.length;
45
+ }
46
+ getMessagesAfter(afterTs) {
47
+ return this.db.prepare("SELECT id, role, content, emotion_score FROM messages WHERE timestamp > ? ORDER BY timestamp").all(afterTs);
48
+ }
49
+ getShortMessageCount() {
50
+ return this.db.prepare("SELECT COUNT(*) as cnt FROM messages WHERE role='user' AND length(content) < 20").get().cnt;
51
+ }
52
+ deleteMessagesByIds(ids) {
53
+ if (ids.length === 0)
54
+ return;
55
+ this.db.prepare(`DELETE FROM messages WHERE id IN (${ids.join(",")})`).run();
56
+ }
57
+ flushOldMessages(opts) {
58
+ const ageCutoff = Date.now() - opts.maxAgeDays * 86400000;
59
+ const agedOut = this.db.prepare("DELETE FROM messages WHERE timestamp < ?").run(ageCutoff).changes;
60
+ const total = this.db.prepare("SELECT COUNT(*) as c FROM messages").get().c;
61
+ let capped = 0;
62
+ if (total > opts.maxCount) {
63
+ capped = this.db.prepare("DELETE FROM messages WHERE id IN (SELECT id FROM messages ORDER BY timestamp ASC LIMIT ?)").run(total - opts.maxCount).changes;
64
+ }
65
+ return { agedOut, capped };
66
+ }
67
+ buildEmotionArcs() {
68
+ const topics = this.db.prepare("SELECT DISTINCT topic FROM extracted_memories WHERE topic IS NOT NULL AND emotion_tags IS NOT NULL AND emotion_tags != ''").all();
69
+ let updated = 0;
70
+ for (const { topic } of topics) {
71
+ const memories = this.db.prepare("SELECT emotion_tags, created_at FROM extracted_memories WHERE topic = ? AND emotion_tags IS NOT NULL AND emotion_tags != '' ORDER BY created_at ASC").all(topic);
72
+ if (memories.length < 2)
73
+ continue;
74
+ const arc = buildArc(memories);
75
+ const target = this.db.prepare("SELECT id FROM extracted_memories WHERE topic = ? AND tier = 'core' AND valid_to IS NULL ORDER BY created_at DESC LIMIT 1").get(topic);
76
+ if (target) {
77
+ this.db.prepare("UPDATE extracted_memories SET emotion_arc = ? WHERE id = ?").run(arc.symbol, target.id);
78
+ updated++;
79
+ }
80
+ }
81
+ return updated;
82
+ }
83
+ getEmotionalProfileData() {
84
+ const rows = this.db.prepare("SELECT topic, emotion_tags, emotion_context, created_at FROM extracted_memories WHERE emotion_tags IS NOT NULL AND emotion_tags != '' ORDER BY created_at DESC LIMIT 200").all();
85
+ if (rows.length < 10)
86
+ return [];
87
+ const positiveTags = new Set(["joy", "pride", "excitement", "relief", "gratitude", "love", "hope", "humor"]);
88
+ const topicMap = new Map();
89
+ for (const r of rows) {
90
+ let entry = topicMap.get(r.topic);
91
+ if (!entry) {
92
+ entry = { positive: 0, negative: 0, tags: new Map(), contexts: [] };
93
+ topicMap.set(r.topic, entry);
94
+ }
95
+ for (const tag of r.emotion_tags.split(",").map(t => t.trim()).filter(Boolean)) {
96
+ entry.tags.set(tag, (entry.tags.get(tag) ?? 0) + 1);
97
+ if (positiveTags.has(tag))
98
+ entry.positive++;
99
+ else
100
+ entry.negative++;
101
+ }
102
+ if (r.emotion_context)
103
+ entry.contexts.push(r.emotion_context);
104
+ }
105
+ return [...topicMap.entries()]
106
+ .sort((a, b) => (b[1].positive + b[1].negative) - (a[1].positive + a[1].negative))
107
+ .slice(0, 5)
108
+ .map(([topic, data]) => ({
109
+ topic,
110
+ positive: data.positive,
111
+ negative: data.negative,
112
+ topTags: [...data.tags.entries()].sort((a, b) => b[1] - a[1]).slice(0, 3).map(([tag, count]) => ({ tag, count })),
113
+ topContexts: [...new Set(data.contexts)].slice(0, 3),
114
+ }));
115
+ }
116
+ buildSleepCandidates() {
117
+ const lists = { untaggedMemories: "", promotionCandidates: "", contradictions: "", mergeCandidates: "", translationIssues: "", emotionContextGaps: "", recallFeedback: "" };
118
+ try {
119
+ const untagged = this.db.prepare("SELECT id, substr(content_en,1,100) as preview FROM extracted_memories WHERE (topic IS NULL OR topic = 'general') AND content_en IS NOT NULL LIMIT 20").all();
120
+ if (untagged.length > 0)
121
+ lists.untaggedMemories = untagged.map(r => `#${r.id}: ${r.preview}`).join("\n");
122
+ const promote = this.db.prepare("SELECT id, topic, substr(content_en,1,300) as preview, recall_count, confidence FROM extracted_memories WHERE tier = 'general' AND recall_count >= 2 AND confidence >= 3 AND valid_to IS NULL ORDER BY recall_count DESC LIMIT 15").all();
123
+ if (promote.length > 0)
124
+ lists.promotionCandidates = promote.map(r => `#${r.id} [${r.topic}] (recall:${r.recall_count}, conf:${r.confidence}): ${r.preview}`).join("\n");
125
+ // Contradiction check on promotion candidates
126
+ if (promote.length > 0) {
127
+ try {
128
+ const core = this.db.prepare("SELECT id, content_en, topic FROM extracted_memories WHERE tier = 'core' AND valid_to IS NULL AND content_en IS NOT NULL").all();
129
+ const hits = [];
130
+ for (const c of promote) {
131
+ const hit = checkContradiction(c.preview, c.topic, core);
132
+ if (hit)
133
+ hits.push(`#${c.id} contradicts #${hit.existingId}: ${hit.reason}`);
134
+ }
135
+ if (hits.length > 0) {
136
+ lists.contradictions = hits.join("\n");
137
+ logWarn(TAG, `${hits.length} contradiction(s) flagged in promotion candidates`);
138
+ }
139
+ }
140
+ catch { /* contradiction checker not available */ }
141
+ }
142
+ try {
143
+ const sigs = this.db.prepare("SELECT id, topic, signature, substr(content_en,1,80) as preview FROM extracted_memories WHERE signature IS NOT NULL AND valid_to IS NULL ORDER BY topic").all();
144
+ const pairs = [];
145
+ for (let i = 0; i < sigs.length && pairs.length < 10; i++) {
146
+ for (let j = i + 1; j < sigs.length && pairs.length < 10; j++) {
147
+ if (sigs[i].topic !== sigs[j].topic)
148
+ continue;
149
+ const sim = hammingSimilarity(new Uint8Array(sigs[i].signature), new Uint8Array(sigs[j].signature));
150
+ if (sim > 0.8)
151
+ pairs.push(`#${sigs[i].id} ↔ #${sigs[j].id} (${(sim * 100).toFixed(0)}%): "${sigs[i].preview}" vs "${sigs[j].preview}"`);
152
+ }
153
+ }
154
+ if (pairs.length > 0)
155
+ lists.mergeCandidates = pairs.join("\n");
156
+ }
157
+ catch { /* signature module not available */ }
158
+ const translation = this.db.prepare("SELECT id, substr(content_en,1,80) as en, substr(content_original,1,80) as orig FROM extracted_memories WHERE content_original IS NOT NULL AND content_en IS NOT NULL AND length(content_en) > 0 AND (length(content_en) < length(content_original) * 0.3 OR length(content_en) > length(content_original) * 3) LIMIT 10").all();
159
+ if (translation.length > 0)
160
+ lists.translationIssues = translation.map(r => `#${r.id}: EN="${r.en}" ORIG="${r.orig}"`).join("\n");
161
+ const gaps = this.db.prepare("SELECT id, substr(content_en,1,100) as preview, emotion_tags FROM extracted_memories WHERE emotion_tags IS NOT NULL AND emotion_tags != '' AND emotion_context IS NULL LIMIT 15").all();
162
+ if (gaps.length > 0)
163
+ lists.emotionContextGaps = gaps.map(r => `#${r.id} [${r.emotion_tags}]: ${r.preview}`).join("\n");
164
+ const today = new Date();
165
+ today.setHours(0, 0, 0, 0);
166
+ const recalls = this.db.prepare("SELECT id, substr(content_en,1,80) as preview, recall_count, last_recalled_at FROM extracted_memories WHERE last_recalled_at > ? ORDER BY last_recalled_at DESC LIMIT 15").all(today.getTime());
167
+ if (recalls.length > 0)
168
+ lists.recallFeedback = recalls.map(r => `#${r.id} (recalled ${r.recall_count}x): ${r.preview}`).join("\n");
169
+ }
170
+ catch (err) {
171
+ logWarn(TAG, `buildSleepCandidates failed: ${err instanceof Error ? err.message : String(err)}`);
172
+ }
173
+ return lists;
174
+ }
175
+ }
176
+ //# sourceMappingURL=sleep-data-access.js.map