squish-memory 1.0.2 → 1.2.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 (704) hide show
  1. package/.env.example +146 -0
  2. package/CHANGELOG.md +202 -0
  3. package/README.md +192 -287
  4. package/{scripts → bin}/dependency-manager.mjs +217 -217
  5. package/{scripts → bin}/detect-clients.mjs +78 -78
  6. package/bin/install-interactive.mjs +321 -0
  7. package/bin/squish-mcp.mjs +46 -0
  8. package/bin/squish.mjs +33 -0
  9. package/config/mcp-migration-map.json +1 -6
  10. package/config/mcp-mode-semantics.json +10 -12
  11. package/config/mcp-remote-auth.json +3 -26
  12. package/config/mcp-universal.schema.json +5 -35
  13. package/config/settings.json +78 -22
  14. package/config.js +5 -0
  15. package/config.ts +218 -0
  16. package/core/adapters/config/claude-code.ts +133 -0
  17. package/core/adapters/config/cursor.ts +90 -0
  18. package/core/adapters/config/opencode.ts +89 -0
  19. package/core/adapters/config/windsurf.ts +90 -0
  20. package/core/adapters/index.ts +102 -0
  21. package/core/adapters/timeline.ts +116 -0
  22. package/core/adapters/types.ts +166 -0
  23. package/core/agent-preferences.ts +140 -0
  24. package/core/algorithms/analytics/token-estimator.ts +216 -0
  25. package/core/algorithms/detection/hash-filters.ts +260 -0
  26. package/core/algorithms/detection/semantic-ranker.ts +194 -0
  27. package/core/algorithms/detection/two-stage-detector.ts +421 -0
  28. package/core/algorithms/handlers/approve-merge.ts +215 -0
  29. package/core/algorithms/handlers/detect-duplicates.ts +192 -0
  30. package/core/algorithms/handlers/get-stats.ts +132 -0
  31. package/core/algorithms/handlers/list-proposals.ts +130 -0
  32. package/core/algorithms/handlers/preview-merge.ts +139 -0
  33. package/core/algorithms/handlers/reject-merge.ts +93 -0
  34. package/core/algorithms/handlers/reverse-merge.ts +155 -0
  35. package/core/algorithms/index.ts +39 -0
  36. package/core/algorithms/operations/cache-maintenance.ts +182 -0
  37. package/core/algorithms/safety/safety-checks.ts +256 -0
  38. package/core/algorithms/strategies/merge-strategies.ts +381 -0
  39. package/core/algorithms/types.ts +140 -0
  40. package/core/algorithms/utils/response-builder.ts +61 -0
  41. package/core/associations.ts +363 -0
  42. package/core/beliefs/decay.ts +289 -0
  43. package/core/beliefs/extractor.ts +131 -0
  44. package/core/beliefs/store.ts +557 -0
  45. package/core/beliefs/types.ts +38 -0
  46. package/core/commands/mcp-server.ts +5 -0
  47. package/core/compression.ts +177 -0
  48. package/core/config.js +2 -0
  49. package/core/consolidation.ts +330 -0
  50. package/core/context/agent-context.ts +388 -0
  51. package/core/context/context-paging.ts +449 -0
  52. package/core/context/context-window.ts +234 -0
  53. package/core/context/context.ts +35 -0
  54. package/core/embeddings/embeddings.ts +616 -0
  55. package/core/embeddings/google-multimodal.ts +200 -0
  56. package/core/embeddings/local-embeddings.ts +12 -0
  57. package/core/embeddings/qmd-client.ts +495 -0
  58. package/core/embeddings/transformers-local.ts +261 -0
  59. package/core/embeddings.js +4 -0
  60. package/core/error-handling.ts +206 -0
  61. package/core/external +219 -0
  62. package/core/graph/entity-deduplicator.ts +232 -0
  63. package/core/graph/graph-builder.ts +257 -0
  64. package/core/graph/graph-traversal.ts +490 -0
  65. package/core/graph/index.ts +24 -0
  66. package/core/graph/llm-entity-extractor.ts +402 -0
  67. package/core/graph/multi-hop-retrieval.ts +317 -0
  68. package/core/graph/relationship-extractor.ts +465 -0
  69. package/core/hooks/agent-hooks.ts +653 -0
  70. package/core/hooks/auto-tagger.ts +149 -0
  71. package/core/hooks/capture-filter.ts +169 -0
  72. package/core/hot-cache.ts +388 -0
  73. package/core/index.ts +10 -0
  74. package/core/ingestion/agent-memory.ts +167 -0
  75. package/core/ingestion/core-memory.ts +326 -0
  76. package/core/ingestion/learnings.ts +260 -0
  77. package/core/ingestion/signal-engine.ts +266 -0
  78. package/core/integrations/obsidian-vault.ts +197 -0
  79. package/core/layers/generator.ts +115 -0
  80. package/core/lib/db-client.ts +168 -0
  81. package/core/lib/parse-embedding.ts +59 -0
  82. package/core/lib/schemas.ts +102 -0
  83. package/core/lib/types.ts +49 -0
  84. package/core/lib/utils.ts +151 -0
  85. package/core/lib/validation.ts +180 -0
  86. package/core/lifecycle.ts +353 -0
  87. package/core/logger.ts +59 -0
  88. package/core/memory/bridge-discovery.ts +395 -0
  89. package/core/memory/categorizer.ts +390 -0
  90. package/core/memory/conflict-detector.ts +62 -0
  91. package/core/memory/consolidation.ts +372 -0
  92. package/core/memory/context-collector.ts +75 -0
  93. package/core/memory/contradiction-resolver.ts +494 -0
  94. package/core/memory/edit-workflow.ts +174 -0
  95. package/core/memory/entity-extractor.ts +426 -0
  96. package/core/memory/entity-resolver.ts +89 -0
  97. package/core/memory/explain.ts +112 -0
  98. package/core/memory/fact-deriver.ts +300 -0
  99. package/core/memory/fact-extractor.ts +120 -0
  100. package/core/memory/feedback-tracker.ts +200 -0
  101. package/core/memory/hooks.ts +230 -0
  102. package/core/memory/hybrid-retrieval.ts +65 -0
  103. package/core/memory/hybrid-scorer.ts +325 -0
  104. package/core/memory/hybrid-search.ts +748 -0
  105. package/core/memory/importance.ts +319 -0
  106. package/core/memory/index.ts +11 -0
  107. package/core/memory/loader.ts +178 -0
  108. package/core/memory/markdown/markdown-storage.ts +318 -0
  109. package/core/memory/memories.ts +565 -0
  110. package/core/memory/memory-lifecycle.ts +51 -0
  111. package/core/memory/memory-manager.ts +53 -0
  112. package/core/memory/migrate.ts +173 -0
  113. package/core/memory/normalization.ts +30 -0
  114. package/core/memory/path-strengthener.ts +211 -0
  115. package/core/memory/progressive-disclosure.ts +392 -0
  116. package/core/memory/query-processor.ts +130 -0
  117. package/core/memory/query-rewriter.ts +153 -0
  118. package/core/memory/response-analyzer.ts +81 -0
  119. package/core/memory/retrieval-feedback.ts +276 -0
  120. package/core/memory/serialization.ts +83 -0
  121. package/core/memory/stale-cleaner.ts +147 -0
  122. package/core/memory/stats.ts +181 -0
  123. package/core/memory/telemetry.ts +392 -0
  124. package/core/memory/temporal-facts.ts +356 -0
  125. package/core/memory/temporal-parser.ts +477 -0
  126. package/core/memory/trigger-detector.ts +104 -0
  127. package/core/memory/write-gate.ts +288 -0
  128. package/core/places/index.ts +14 -0
  129. package/core/places/memory-places.ts +339 -0
  130. package/core/places/places.ts +406 -0
  131. package/core/places/rules.ts +308 -0
  132. package/core/places/walking.ts +192 -0
  133. package/core/projects +89 -0
  134. package/core/projects.ts +131 -0
  135. package/core/redis.ts +82 -0
  136. package/core/responses.ts +187 -0
  137. package/core/runtime/trust-report.ts +195 -0
  138. package/core/runtime/trust-state.ts +360 -0
  139. package/core/scheduler/cron-scheduler.ts +581 -0
  140. package/core/scheduler/heartbeat.ts +91 -0
  141. package/core/scheduler/index.ts +8 -0
  142. package/core/scheduler/job-runner.ts +197 -0
  143. package/core/search/conversations.ts +166 -0
  144. package/core/search/entities.ts +46 -0
  145. package/core/search/folder-context.ts +154 -0
  146. package/core/search/graph-boost.ts +22 -0
  147. package/core/search/index.ts +4 -0
  148. package/core/search/qmd-wrapper.ts +84 -0
  149. package/core/security/encrypt.ts +51 -0
  150. package/core/security/governance.ts +102 -0
  151. package/core/security/privacy.ts +108 -0
  152. package/core/security/secret-detector.ts +122 -0
  153. package/core/session/auto-load.ts +160 -0
  154. package/core/session/entity-tracker.ts +363 -0
  155. package/core/session/index.ts +7 -0
  156. package/core/session/reference-resolver.ts +158 -0
  157. package/core/session/self-iteration-job.ts +478 -0
  158. package/core/session/session-hooks.ts +69 -0
  159. package/core/session/types.ts +36 -0
  160. package/core/session/working-set.ts +275 -0
  161. package/core/snapshots/cleanup.ts +13 -0
  162. package/core/snapshots/comparison.ts +59 -0
  163. package/core/snapshots/creation.ts +139 -0
  164. package/core/snapshots/retrieval.ts +44 -0
  165. package/core/snapshots/stats.ts +63 -0
  166. package/core/storage/cache.ts +241 -0
  167. package/core/storage/database.ts +23 -0
  168. package/core/summarization/cleanup.ts +13 -0
  169. package/core/summarization/queries.ts +32 -0
  170. package/core/summarization/stats.ts +64 -0
  171. package/core/summarization/strategies.ts +52 -0
  172. package/core/summarization.ts +248 -0
  173. package/core/temporal-facts.ts +244 -0
  174. package/core/tracing/collector.ts +470 -0
  175. package/core/tracing/visualizer.ts +195 -0
  176. package/core/utils/cleanup-operations.ts +50 -0
  177. package/core/utils/content-extraction.ts +95 -0
  178. package/core/utils/filter-builder.ts +56 -0
  179. package/core/utils/history-traversal.ts +63 -0
  180. package/core/utils/memory-operations.ts +56 -0
  181. package/core/utils/query-operations.ts +83 -0
  182. package/core/utils/summarization-helpers.ts +45 -0
  183. package/core/utils/temporal-queries.ts +39 -0
  184. package/core/utils/vector-operations.ts +135 -0
  185. package/core/utils/version-management.ts +74 -0
  186. package/core/worker.ts +324 -0
  187. package/db/adapter.ts +215 -0
  188. package/db/bootstrap.ts +1055 -0
  189. package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
  190. package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
  191. package/db/drizzle/migrations/meta/_journal.json +13 -0
  192. package/db/drizzle/schema-sqlite.ts +1032 -0
  193. package/db/drizzle/schema.ts +1128 -0
  194. package/db/drizzle.config.ts +12 -0
  195. package/db/index.ts +83 -0
  196. package/db/init.sql +5 -0
  197. package/db/migrations/associations.ts +35 -0
  198. package/db/migrations/beliefs.ts +89 -0
  199. package/db/migrations/core-memory.ts +35 -0
  200. package/db/migrations/fts.ts +59 -0
  201. package/db/migrations/index.ts +54 -0
  202. package/db/migrations/indexes.ts +36 -0
  203. package/db/migrations/learnings.ts +34 -0
  204. package/db/migrations/maintenance.ts +68 -0
  205. package/db/migrations/memories.ts +22 -0
  206. package/db/migrations/memory-places.ts +35 -0
  207. package/db/migrations/places.ts +49 -0
  208. package/db/migrations/projects.ts +21 -0
  209. package/db/migrations/tier-conversion.ts +24 -0
  210. package/db/neon.ts +22 -0
  211. package/db/schema/beliefs.ts +50 -0
  212. package/db/schema/generator.ts +159 -0
  213. package/db/schema/index.ts +58 -0
  214. package/db/schema/learnings.ts +32 -0
  215. package/db/schema/memories.ts +83 -0
  216. package/db/schema/projects.ts +33 -0
  217. package/db/schema.ts +13 -0
  218. package/db/supabase.ts +27 -0
  219. package/dist/config.d.ts +61 -14
  220. package/dist/config.js +159 -139
  221. package/dist/core/adapters/config/claude-code.d.ts +45 -0
  222. package/dist/core/adapters/config/claude-code.js +113 -0
  223. package/dist/core/adapters/config/cursor.d.ts +26 -0
  224. package/dist/core/adapters/config/cursor.js +74 -0
  225. package/dist/core/adapters/config/opencode.d.ts +23 -0
  226. package/dist/core/adapters/config/opencode.js +73 -0
  227. package/dist/core/adapters/config/windsurf.d.ts +26 -0
  228. package/dist/core/adapters/config/windsurf.js +74 -0
  229. package/dist/core/adapters/index.d.ts +45 -0
  230. package/dist/core/adapters/index.js +84 -0
  231. package/dist/core/adapters/scripts/install-adapter.d.ts +19 -0
  232. package/dist/core/adapters/scripts/install-adapter.js +149 -0
  233. package/dist/core/adapters/timeline.d.ts +23 -0
  234. package/dist/core/adapters/timeline.js +88 -0
  235. package/dist/core/adapters/types.d.ts +137 -0
  236. package/dist/core/adapters/types.js +50 -0
  237. package/dist/core/agent-preferences.d.ts +16 -0
  238. package/dist/core/agent-preferences.js +124 -0
  239. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.d.ts +1 -1
  240. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.js +3 -3
  241. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.d.ts +1 -1
  242. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.js +1 -1
  243. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.d.ts +1 -1
  244. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.js +7 -10
  245. package/dist/{algorithms → core/algorithms}/handlers/approve-merge.js +4 -4
  246. package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.js +3 -3
  247. package/dist/{algorithms → core/algorithms}/handlers/get-stats.js +3 -3
  248. package/dist/{algorithms → core/algorithms}/handlers/list-proposals.js +3 -3
  249. package/dist/{algorithms → core/algorithms}/handlers/preview-merge.js +3 -3
  250. package/dist/{algorithms → core/algorithms}/handlers/reject-merge.js +3 -3
  251. package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.js +3 -3
  252. package/dist/core/algorithms/index.d.ts +21 -0
  253. package/dist/core/algorithms/index.js +26 -0
  254. package/dist/core/algorithms/operations/cache-maintenance.d.ts +12 -0
  255. package/dist/core/algorithms/operations/cache-maintenance.js +157 -0
  256. package/dist/{algorithms → core/algorithms}/safety/safety-checks.d.ts +2 -6
  257. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.d.ts +19 -1
  258. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.js +74 -123
  259. package/dist/core/algorithms/types.d.ts +125 -0
  260. package/dist/core/algorithms/types.js +5 -0
  261. package/dist/core/associations.d.ts +3 -2
  262. package/dist/core/associations.js +37 -2
  263. package/dist/core/autosave.d.ts +19 -0
  264. package/dist/core/autosave.js +16 -0
  265. package/dist/core/beliefs/decay.d.ts +27 -0
  266. package/dist/core/beliefs/decay.js +217 -0
  267. package/dist/core/beliefs/extractor.d.ts +9 -0
  268. package/dist/core/beliefs/extractor.js +113 -0
  269. package/dist/core/beliefs/store.d.ts +46 -0
  270. package/dist/core/beliefs/store.js +466 -0
  271. package/dist/core/beliefs/types.d.ts +28 -0
  272. package/dist/core/beliefs/types.js +2 -0
  273. package/dist/core/commands/mcp-server.d.ts +2 -0
  274. package/dist/core/commands/mcp-server.js +6 -0
  275. package/dist/core/commands/remember.d.ts +24 -0
  276. package/dist/core/commands/remember.js +144 -0
  277. package/dist/core/compression.d.ts +45 -0
  278. package/dist/core/compression.js +160 -0
  279. package/dist/core/context/agent-context.d.ts +106 -0
  280. package/dist/core/context/agent-context.js +274 -0
  281. package/dist/core/{context-paging.d.ts → context/context-paging.d.ts} +2 -12
  282. package/dist/core/{context-paging.js → context/context-paging.js} +19 -39
  283. package/dist/core/context/context-window.d.ts +40 -0
  284. package/dist/core/context/context-window.js +177 -0
  285. package/dist/core/context/context.js +22 -0
  286. package/dist/core/embeddings/embeddings.d.ts +29 -0
  287. package/dist/core/embeddings/embeddings.js +546 -0
  288. package/dist/core/embeddings/google-multimodal.js +6 -2
  289. package/dist/core/embeddings/local-embeddings.d.ts +11 -0
  290. package/dist/core/embeddings/local-embeddings.js +11 -0
  291. package/dist/core/embeddings/qmd-client.js +1 -1
  292. package/dist/core/embeddings/transformers-local.d.ts +64 -0
  293. package/dist/core/embeddings/transformers-local.js +213 -0
  294. package/dist/core/embeddings.d.ts +1 -28
  295. package/dist/core/embeddings.js +2 -401
  296. package/dist/core/error-handling.d.ts +63 -0
  297. package/dist/core/error-handling.js +173 -0
  298. package/dist/core/graph/entity-deduplicator.d.ts +24 -0
  299. package/dist/core/graph/entity-deduplicator.js +183 -0
  300. package/dist/core/graph/graph-builder.d.ts +46 -0
  301. package/dist/core/graph/graph-builder.js +174 -0
  302. package/dist/core/graph/graph-traversal.d.ts +80 -0
  303. package/dist/core/graph/graph-traversal.js +315 -0
  304. package/dist/core/graph/index.d.ts +19 -0
  305. package/dist/core/graph/index.js +13 -0
  306. package/dist/core/graph/llm-entity-extractor.d.ts +49 -0
  307. package/dist/core/graph/llm-entity-extractor.js +313 -0
  308. package/dist/core/graph/multi-hop-retrieval.d.ts +48 -0
  309. package/dist/core/graph/multi-hop-retrieval.js +215 -0
  310. package/dist/core/graph/relationship-extractor.d.ts +48 -0
  311. package/dist/core/graph/relationship-extractor.js +351 -0
  312. package/dist/core/hooks/agent-hooks.d.ts +83 -0
  313. package/dist/core/hooks/agent-hooks.js +521 -0
  314. package/dist/core/hooks/auto-tagger.d.ts +19 -0
  315. package/dist/core/hooks/auto-tagger.js +155 -0
  316. package/dist/core/hooks/capture-filter.d.ts +41 -0
  317. package/dist/core/hooks/capture-filter.js +128 -0
  318. package/dist/core/hot-cache.d.ts +86 -0
  319. package/dist/core/hot-cache.js +285 -0
  320. package/dist/core/index.d.ts +9 -9
  321. package/dist/core/index.js +9 -12
  322. package/dist/core/{agent-memory.js → ingestion/agent-memory.js} +5 -7
  323. package/dist/core/{core-memory.d.ts → ingestion/core-memory.d.ts} +2 -2
  324. package/dist/core/{core-memory.js → ingestion/core-memory.js} +7 -7
  325. package/dist/core/ingestion/learnings.d.ts +57 -0
  326. package/dist/core/ingestion/learnings.js +205 -0
  327. package/dist/core/ingestion/signal-engine.d.ts +41 -0
  328. package/dist/core/ingestion/signal-engine.js +201 -0
  329. package/dist/core/integrations/obsidian-vault.d.ts +31 -0
  330. package/dist/core/integrations/obsidian-vault.js +156 -0
  331. package/dist/core/lib/db-client.d.ts +114 -0
  332. package/dist/core/lib/db-client.js +130 -0
  333. package/dist/core/lib/parse-embedding.d.ts +9 -0
  334. package/dist/core/lib/parse-embedding.js +58 -0
  335. package/dist/core/lib/schemas.d.ts +132 -0
  336. package/dist/core/lib/schemas.js +87 -0
  337. package/dist/core/lib/types.d.ts +45 -0
  338. package/dist/core/lib/types.js +6 -0
  339. package/dist/core/{utils.d.ts → lib/utils.d.ts} +5 -0
  340. package/dist/core/lib/utils.js +145 -0
  341. package/dist/core/lib/validation.d.ts +38 -0
  342. package/dist/core/lib/validation.js +151 -0
  343. package/dist/core/lifecycle.d.ts +7 -1
  344. package/dist/core/lifecycle.js +152 -42
  345. package/dist/core/logger.d.ts +1 -0
  346. package/dist/core/logger.js +13 -1
  347. package/dist/core/mcp/tools.d.ts +0 -2
  348. package/dist/core/mcp/tools.js +35 -90
  349. package/dist/core/mcp/types.d.ts +25 -253
  350. package/dist/core/mcp/types.js +2 -2
  351. package/dist/core/memory/categorizer.js +2 -0
  352. package/dist/core/memory/conflict-detector.js +1 -1
  353. package/dist/core/memory/consolidation.d.ts +1 -10
  354. package/dist/core/memory/consolidation.js +4 -39
  355. package/dist/core/memory/context-collector.js +1 -1
  356. package/dist/core/memory/edit-workflow.js +1 -1
  357. package/dist/core/memory/entity-extractor.d.ts +4 -0
  358. package/dist/core/memory/entity-extractor.js +30 -16
  359. package/dist/core/memory/entity-resolver.js +7 -7
  360. package/dist/core/memory/explain.d.ts +18 -0
  361. package/dist/core/memory/explain.js +92 -0
  362. package/dist/core/memory/fact-deriver.d.ts +31 -0
  363. package/dist/core/memory/fact-deriver.js +236 -0
  364. package/dist/core/memory/fact-extractor.js +12 -12
  365. package/dist/core/memory/feedback-tracker.js +1 -1
  366. package/dist/core/memory/hooks.d.ts +88 -0
  367. package/dist/core/memory/hooks.js +174 -0
  368. package/dist/core/memory/hybrid-retrieval.d.ts +14 -16
  369. package/dist/core/memory/hybrid-retrieval.js +25 -127
  370. package/dist/core/memory/hybrid-scorer.js +6 -23
  371. package/dist/core/memory/hybrid-search.d.ts +9 -11
  372. package/dist/core/memory/hybrid-search.js +496 -273
  373. package/dist/core/memory/importance.d.ts +2 -24
  374. package/dist/core/memory/importance.js +7 -91
  375. package/dist/core/memory/index.d.ts +1 -0
  376. package/dist/core/memory/index.js +1 -0
  377. package/dist/core/memory/loader.d.ts +31 -0
  378. package/dist/core/memory/loader.js +141 -0
  379. package/dist/core/memory/markdown/markdown-storage.d.ts +72 -0
  380. package/dist/core/memory/markdown/markdown-storage.js +243 -0
  381. package/dist/core/memory/memories.d.ts +23 -19
  382. package/dist/core/memory/memories.js +243 -228
  383. package/dist/core/memory/memory-lifecycle.d.ts +8 -0
  384. package/dist/core/memory/memory-lifecycle.js +47 -0
  385. package/dist/core/memory/migrate.d.ts +21 -0
  386. package/dist/core/memory/migrate.js +134 -0
  387. package/dist/core/memory/normalization.d.ts +7 -0
  388. package/dist/core/memory/normalization.js +26 -0
  389. package/dist/core/memory/path-strengthener.d.ts +39 -0
  390. package/dist/core/memory/path-strengthener.js +150 -0
  391. package/dist/core/memory/progressive-disclosure.js +1 -1
  392. package/dist/core/memory/query-processor.js +37 -3
  393. package/dist/core/memory/query-rewriter.js +9 -9
  394. package/dist/core/memory/retrieval-feedback.d.ts +70 -0
  395. package/dist/core/memory/retrieval-feedback.js +213 -0
  396. package/dist/core/memory/serialization.d.ts +4 -0
  397. package/dist/core/memory/serialization.js +49 -0
  398. package/dist/core/memory/stale-cleaner.d.ts +26 -0
  399. package/dist/core/memory/stale-cleaner.js +97 -0
  400. package/dist/core/memory/stats.d.ts +15 -0
  401. package/dist/core/memory/stats.js +69 -13
  402. package/dist/core/memory/temporal-facts.js +21 -0
  403. package/dist/core/memory/trigger-detector.d.ts +8 -1
  404. package/dist/core/memory/trigger-detector.js +42 -5
  405. package/dist/core/memory/write-gate.js +1 -1
  406. package/dist/core/places/index.d.ts +14 -0
  407. package/dist/core/places/index.js +14 -0
  408. package/dist/core/places/memory-places.d.ts +68 -0
  409. package/dist/core/places/memory-places.js +261 -0
  410. package/dist/core/places/places.d.ts +88 -0
  411. package/dist/core/places/places.js +314 -0
  412. package/dist/core/places/rules.d.ts +74 -0
  413. package/dist/core/places/rules.js +240 -0
  414. package/dist/core/places/walking.d.ts +56 -0
  415. package/dist/core/places/walking.js +121 -0
  416. package/dist/core/projects.d.ts +5 -0
  417. package/dist/core/projects.js +47 -18
  418. package/dist/core/responses.d.ts +96 -0
  419. package/dist/core/responses.js +122 -0
  420. package/dist/core/runtime/trust-report.d.ts +102 -0
  421. package/dist/core/runtime/trust-report.js +107 -0
  422. package/dist/core/runtime/trust-state.d.ts +12 -0
  423. package/dist/core/runtime/trust-state.js +309 -0
  424. package/dist/core/scheduler/cron-scheduler.d.ts +1 -1
  425. package/dist/core/scheduler/cron-scheduler.js +193 -10
  426. package/dist/core/scheduler/index.d.ts +1 -1
  427. package/dist/core/scheduler/index.js +1 -1
  428. package/dist/core/scheduler/job-runner.js +2 -2
  429. package/dist/core/search/conversations.js +40 -42
  430. package/dist/core/search/entities.js +6 -9
  431. package/dist/core/search/graph-boost.d.ts +7 -0
  432. package/dist/core/search/graph-boost.js +23 -0
  433. package/dist/core/search/qmd-wrapper.d.ts +36 -0
  434. package/dist/core/search/qmd-wrapper.js +58 -0
  435. package/dist/core/security/encrypt.d.ts +6 -0
  436. package/dist/core/security/encrypt.js +47 -0
  437. package/dist/core/{governance.d.ts → security/governance.d.ts} +6 -1
  438. package/dist/core/security/governance.js +79 -0
  439. package/dist/core/session/auto-load.js +34 -9
  440. package/dist/core/session/entity-tracker.d.ts +62 -0
  441. package/dist/core/session/entity-tracker.js +287 -0
  442. package/dist/core/session/index.d.ts +1 -1
  443. package/dist/core/session/index.js +1 -1
  444. package/dist/core/session/reference-resolver.d.ts +26 -0
  445. package/dist/core/session/reference-resolver.js +121 -0
  446. package/dist/core/{session-hooks → session}/self-iteration-job.d.ts +15 -0
  447. package/dist/core/{session-hooks → session}/self-iteration-job.js +195 -90
  448. package/dist/core/session/working-set.d.ts +50 -0
  449. package/dist/core/session/working-set.js +212 -0
  450. package/dist/core/snapshots/creation.d.ts +2 -8
  451. package/dist/core/snapshots/creation.js +3 -12
  452. package/dist/core/{cache.js → storage/cache.js} +2 -2
  453. package/dist/core/utils/memory-operations.js +1 -1
  454. package/dist/core/utils/summarization-helpers.d.ts +0 -4
  455. package/dist/core/utils/summarization-helpers.js +1 -6
  456. package/dist/core/utils/vector-operations.d.ts +71 -0
  457. package/dist/core/utils/vector-operations.js +129 -0
  458. package/dist/db/adapter.d.ts +3 -3
  459. package/dist/db/adapter.js +99 -88
  460. package/dist/db/bootstrap.d.ts +2 -0
  461. package/dist/db/bootstrap.js +921 -674
  462. package/dist/{drizzle → db/drizzle}/schema-sqlite.d.ts +775 -25
  463. package/dist/{drizzle → db/drizzle}/schema-sqlite.js +170 -24
  464. package/dist/{drizzle → db/drizzle}/schema.d.ts +731 -32
  465. package/dist/{drizzle → db/drizzle}/schema.js +192 -32
  466. package/dist/db/drizzle.config.d.ts +3 -0
  467. package/dist/db/drizzle.config.js +12 -0
  468. package/dist/db/index.d.ts +1 -5
  469. package/dist/db/index.js +51 -8
  470. package/dist/db/migrations/associations.d.ts +6 -0
  471. package/dist/db/migrations/associations.js +29 -0
  472. package/dist/db/migrations/beliefs.d.ts +10 -0
  473. package/dist/db/migrations/beliefs.js +76 -0
  474. package/dist/db/migrations/core-memory.d.ts +6 -0
  475. package/dist/db/migrations/core-memory.js +29 -0
  476. package/dist/db/migrations/fts.d.ts +6 -0
  477. package/dist/db/migrations/fts.js +52 -0
  478. package/dist/db/migrations/index.d.ts +25 -0
  479. package/dist/db/migrations/index.js +51 -0
  480. package/dist/db/migrations/indexes.d.ts +6 -0
  481. package/dist/db/migrations/indexes.js +30 -0
  482. package/dist/db/migrations/learnings.d.ts +7 -0
  483. package/dist/db/migrations/learnings.js +26 -0
  484. package/dist/db/migrations/maintenance.d.ts +6 -0
  485. package/dist/db/migrations/maintenance.js +61 -0
  486. package/dist/db/migrations/memories.d.ts +7 -0
  487. package/dist/db/migrations/memories.js +16 -0
  488. package/dist/db/migrations/memory-places.d.ts +6 -0
  489. package/dist/db/migrations/memory-places.js +29 -0
  490. package/dist/db/migrations/places.d.ts +6 -0
  491. package/dist/db/migrations/places.js +43 -0
  492. package/dist/db/migrations/projects.d.ts +3 -0
  493. package/dist/db/migrations/projects.js +13 -0
  494. package/dist/db/migrations/tier-conversion.d.ts +7 -0
  495. package/dist/db/migrations/tier-conversion.js +20 -0
  496. package/dist/db/neon.d.ts +8 -0
  497. package/dist/db/neon.js +20 -0
  498. package/dist/db/schema/beliefs.d.ts +9 -0
  499. package/dist/db/schema/beliefs.js +46 -0
  500. package/dist/db/schema/generator.d.ts +38 -0
  501. package/dist/db/schema/generator.js +108 -0
  502. package/dist/db/schema/index.d.ts +39 -0
  503. package/dist/db/schema/index.js +51 -0
  504. package/dist/db/schema/learnings.d.ts +7 -0
  505. package/dist/db/schema/learnings.js +30 -0
  506. package/dist/db/schema/memories.d.ts +7 -0
  507. package/dist/db/schema/memories.js +81 -0
  508. package/dist/db/schema/projects.d.ts +4 -0
  509. package/dist/db/schema/projects.js +31 -0
  510. package/dist/db/schema/tables/context-sessions.d.ts +9 -0
  511. package/dist/db/schema/tables/context-sessions.js +37 -0
  512. package/dist/db/schema/tables/conversations.d.ts +9 -0
  513. package/dist/db/schema/tables/conversations.js +47 -0
  514. package/dist/db/schema/tables/core-memory.d.ts +9 -0
  515. package/dist/db/schema/tables/core-memory.js +41 -0
  516. package/dist/db/schema/tables/entities.d.ts +9 -0
  517. package/dist/db/schema/tables/entities.js +39 -0
  518. package/dist/db/schema/tables/entity-relations.d.ts +9 -0
  519. package/dist/db/schema/tables/entity-relations.js +31 -0
  520. package/dist/db/schema/tables/learnings.d.ts +9 -0
  521. package/dist/db/schema/tables/learnings.js +66 -0
  522. package/dist/db/schema/tables/memories.d.ts +9 -0
  523. package/dist/db/schema/tables/memories.js +161 -0
  524. package/dist/db/schema/tables/memory-associations.d.ts +9 -0
  525. package/dist/db/schema/tables/memory-associations.js +39 -0
  526. package/dist/db/schema/tables/memory-hash-cache.d.ts +9 -0
  527. package/dist/db/schema/tables/memory-hash-cache.js +29 -0
  528. package/dist/db/schema/tables/memory-merge-history.d.ts +9 -0
  529. package/dist/db/schema/tables/memory-merge-history.js +33 -0
  530. package/dist/db/schema/tables/memory-merge-proposals.d.ts +9 -0
  531. package/dist/db/schema/tables/memory-merge-proposals.js +39 -0
  532. package/dist/db/schema/tables/messages.d.ts +9 -0
  533. package/dist/db/schema/tables/messages.js +41 -0
  534. package/dist/db/schema/tables/namespaces.d.ts +9 -0
  535. package/dist/db/schema/tables/namespaces.js +37 -0
  536. package/dist/db/schema/tables/projects.d.ts +9 -0
  537. package/dist/db/schema/tables/projects.js +31 -0
  538. package/dist/db/schema/tables/users.d.ts +9 -0
  539. package/dist/db/schema/tables/users.js +27 -0
  540. package/dist/db/schema.d.ts +1 -1
  541. package/dist/db/schema.js +2 -2
  542. package/dist/db/supabase.d.ts +9 -0
  543. package/dist/db/supabase.js +24 -0
  544. package/dist/packages/mcp/src/index.d.ts +3 -0
  545. package/dist/packages/mcp/src/index.js +733 -0
  546. package/mcp.json.example +8 -0
  547. package/package.json +132 -173
  548. package/packages/cli/package.json +22 -0
  549. package/packages/cli/src/commands/clean.ts +68 -0
  550. package/packages/cli/src/commands/context.ts +79 -0
  551. package/packages/cli/src/commands/doctor.ts +357 -0
  552. package/packages/cli/src/commands/forget.ts +72 -0
  553. package/packages/cli/src/commands/health.ts +36 -0
  554. package/packages/cli/src/commands/inspect.ts +41 -0
  555. package/packages/cli/src/commands/link.ts +50 -0
  556. package/packages/cli/src/commands/migrate.ts +93 -0
  557. package/packages/cli/src/commands/recall.ts +99 -0
  558. package/packages/cli/src/commands/recent.ts +57 -0
  559. package/packages/cli/src/commands/remember.ts +139 -0
  560. package/packages/cli/src/commands/run.ts +58 -0
  561. package/packages/cli/src/commands/stale.ts +43 -0
  562. package/packages/cli/src/commands/stats.ts +42 -0
  563. package/packages/cli/src/index.ts +57 -0
  564. package/packages/cli/tsconfig.json +24 -0
  565. package/packages/mcp/package.json +26 -0
  566. package/packages/mcp/src/index.ts +877 -0
  567. package/packages/mcp/tsconfig.json +20 -0
  568. package/skills/squish-memory/SKILL.md +107 -114
  569. package/skills/squish-memory/install.sh +3 -3
  570. package/skills/squish-memory/{claude-desktop.json → references/claude-desktop.json} +12 -12
  571. package/skills/squish-memory/{openclaw.json → references/openclaw.json} +13 -13
  572. package/skills/squish-memory/{opencode.json → references/opencode.json} +14 -14
  573. package/.claude-plugin/marketplace.json +0 -20
  574. package/.claude-plugin/plugin.json +0 -32
  575. package/.env.mcp.example +0 -60
  576. package/.mcp.json +0 -11
  577. package/QUICK-START.md +0 -71
  578. package/bin/squish-add.mjs +0 -32
  579. package/bin/squish-rm.mjs +0 -21
  580. package/commands/context-paging.md +0 -51
  581. package/commands/context-status.md +0 -22
  582. package/commands/context.md +0 -5
  583. package/commands/core-memory.md +0 -56
  584. package/commands/health.md +0 -5
  585. package/commands/init.md +0 -39
  586. package/commands/merge.md +0 -113
  587. package/commands/observe.md +0 -5
  588. package/commands/recall.md +0 -5
  589. package/commands/remember.md +0 -11
  590. package/commands/search.md +0 -10
  591. package/config/mcp-cli-fallback-policy.json +0 -22
  592. package/config/mcp.json +0 -38
  593. package/config/plugin-manifest.json +0 -152
  594. package/config/plugin-manifest.schema.json +0 -244
  595. package/config/remote-memory-policy.json +0 -32
  596. package/dist/api/web/index.d.ts +0 -3
  597. package/dist/api/web/index.js +0 -4
  598. package/dist/api/web/web-server.d.ts +0 -3
  599. package/dist/api/web/web-server.js +0 -6
  600. package/dist/api/web/web.d.ts +0 -4
  601. package/dist/api/web/web.js +0 -639
  602. package/dist/commands/managed-sync.d.ts +0 -10
  603. package/dist/commands/managed-sync.js +0 -64
  604. package/dist/commands/mcp-server.d.ts +0 -3
  605. package/dist/commands/mcp-server.js +0 -393
  606. package/dist/core/context.js +0 -24
  607. package/dist/core/governance.js +0 -64
  608. package/dist/core/local-embeddings.d.ts +0 -6
  609. package/dist/core/local-embeddings.js +0 -20
  610. package/dist/core/namespaces/index.d.ts +0 -71
  611. package/dist/core/namespaces/index.js +0 -305
  612. package/dist/core/namespaces/uri-parser.d.ts +0 -31
  613. package/dist/core/namespaces/uri-parser.js +0 -74
  614. package/dist/core/observations.d.ts +0 -26
  615. package/dist/core/observations.js +0 -110
  616. package/dist/core/requirements.d.ts +0 -20
  617. package/dist/core/requirements.js +0 -35
  618. package/dist/core/search/qmd-search.d.ts +0 -61
  619. package/dist/core/search/qmd-search.js +0 -178
  620. package/dist/core/snapshots.d.ts +0 -29
  621. package/dist/core/snapshots.js +0 -220
  622. package/dist/core/sync/qmd-sync.d.ts +0 -106
  623. package/dist/core/sync/qmd-sync.js +0 -213
  624. package/dist/core/utils.js +0 -74
  625. package/dist/index.d.ts +0 -19
  626. package/dist/index.js +0 -997
  627. package/generated/mcp/manifest.json +0 -23
  628. package/generated/mcp/mcp-servers.json +0 -25
  629. package/generated/mcp/mcporter.json +0 -34
  630. package/generated/mcp/openclaw-memory-qmd.json +0 -17
  631. package/generated/mcp/runtime.json +0 -12
  632. package/hooks/hooks.json +0 -52
  633. package/hooks/post-tool-use.js +0 -26
  634. package/hooks/session-end.js +0 -28
  635. package/hooks/session-start.js +0 -33
  636. package/hooks/user-prompt-submit.js +0 -26
  637. package/hooks/utils.js +0 -153
  638. package/npx-installer.js +0 -208
  639. package/packages/plugin-claude-code/README.md +0 -73
  640. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +0 -35
  641. package/packages/plugin-claude-code/dist/plugin-wrapper.js +0 -191
  642. package/packages/plugin-claude-code/package.json +0 -31
  643. package/packages/plugin-openclaw/README.md +0 -70
  644. package/packages/plugin-openclaw/dist/index.d.ts +0 -49
  645. package/packages/plugin-openclaw/dist/index.js +0 -262
  646. package/packages/plugin-openclaw/openclaw.plugin.json +0 -94
  647. package/packages/plugin-openclaw/package.json +0 -31
  648. package/packages/plugin-opencode/install.mjs +0 -217
  649. package/packages/plugin-opencode/package.json +0 -21
  650. package/plugin.json +0 -32
  651. package/scripts/build-release.sh +0 -36
  652. package/scripts/check-secrets.js +0 -132
  653. package/scripts/db/check-db.mjs +0 -88
  654. package/scripts/db/fix-all-columns.mjs +0 -52
  655. package/scripts/db/fix-schema-all.mjs +0 -55
  656. package/scripts/db/fix-schema-full.mjs +0 -46
  657. package/scripts/db/fix-schema.mjs +0 -38
  658. package/scripts/db/init-db.mjs +0 -13
  659. package/scripts/db/recreate-db.mjs +0 -14
  660. package/scripts/generate-mcp.mjs +0 -264
  661. package/scripts/github-release.sh +0 -77
  662. package/scripts/init-dirs.mjs +0 -13
  663. package/scripts/install-interactive.mjs +0 -677
  664. package/scripts/install-mcp.mjs +0 -116
  665. package/scripts/install-plugin.mjs +0 -415
  666. package/scripts/install-web.sh +0 -120
  667. package/scripts/install.mjs +0 -340
  668. package/scripts/openclaw-bootstrap.mjs +0 -127
  669. package/scripts/package-release.sh +0 -71
  670. package/scripts/remote-preflight.mjs +0 -62
  671. package/scripts/squish-fallback.mjs +0 -132
  672. package/scripts/test/test-all-systems.mjs +0 -139
  673. package/scripts/test/test-memory-system.mjs +0 -139
  674. package/scripts/test/test-v0.5.0.mjs +0 -210
  675. package/scripts/test-interactive.mjs +0 -131
  676. package/scripts/verify-mcp.mjs +0 -214
  677. package/skills/memory-guide/SKILL.md +0 -332
  678. package/skills/squish-cli/SKILL.md +0 -240
  679. package/skills/squish-mcp/SKILL.md +0 -355
  680. package/skills/squish-memory/install.mjs +0 -335
  681. package/skills/squish-memory/skill.json +0 -32
  682. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.d.ts +0 -0
  683. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.js +0 -0
  684. /package/dist/{algorithms → core/algorithms}/handlers/approve-merge.d.ts +0 -0
  685. /package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.d.ts +0 -0
  686. /package/dist/{algorithms → core/algorithms}/handlers/get-stats.d.ts +0 -0
  687. /package/dist/{algorithms → core/algorithms}/handlers/list-proposals.d.ts +0 -0
  688. /package/dist/{algorithms → core/algorithms}/handlers/preview-merge.d.ts +0 -0
  689. /package/dist/{algorithms → core/algorithms}/handlers/reject-merge.d.ts +0 -0
  690. /package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.d.ts +0 -0
  691. /package/dist/{algorithms → core/algorithms}/safety/safety-checks.js +0 -0
  692. /package/dist/{algorithms → core/algorithms}/utils/response-builder.d.ts +0 -0
  693. /package/dist/{algorithms → core/algorithms}/utils/response-builder.js +0 -0
  694. /package/dist/core/{context.d.ts → context/context.d.ts} +0 -0
  695. /package/dist/core/{agent-memory.d.ts → ingestion/agent-memory.d.ts} +0 -0
  696. /package/dist/core/{privacy.d.ts → security/privacy.d.ts} +0 -0
  697. /package/dist/core/{privacy.js → security/privacy.js} +0 -0
  698. /package/dist/core/{secret-detector.d.ts → security/secret-detector.d.ts} +0 -0
  699. /package/dist/core/{secret-detector.js → security/secret-detector.js} +0 -0
  700. /package/dist/core/{session-hooks → session}/session-hooks.d.ts +0 -0
  701. /package/dist/core/{session-hooks → session}/session-hooks.js +0 -0
  702. /package/dist/core/{cache.d.ts → storage/cache.d.ts} +0 -0
  703. /package/dist/core/{database.d.ts → storage/database.d.ts} +0 -0
  704. /package/dist/core/{database.js → storage/database.js} +0 -0
@@ -5,8 +5,11 @@
5
5
  import { sql, eq } from 'drizzle-orm';
6
6
  import { getDb } from '../../db/index.js';
7
7
  import { getSchema } from '../../db/schema.js';
8
- import { rememberMemory } from '../memory/memories.js';
8
+ import { getProjectById } from '../projects.js';
9
+ import { rememberMemory, search } from '../memory/memories.js';
10
+ import { serializeMetadata, deserializeMetadata } from '../memory/serialization.js';
9
11
  import { logger } from '../logger.js';
12
+ import { generateExtractiveSummary, extractMessageContent } from '../utils/content-extraction.js';
10
13
  const DEFAULT_CONFIG = {
11
14
  enabled: true,
12
15
  extractFacts: true,
@@ -15,36 +18,82 @@ const DEFAULT_CONFIG = {
15
18
  minMessageCount: 5,
16
19
  maxMessagesToProcess: 50,
17
20
  };
21
+ const MIN_CONFIDENCE_TO_STORE = 75;
22
+ const FORBIDDEN_BRAND_TERMS = new RegExp(`\\b(?:${['mem' + '\\s*' + 'palace', 'mem' + '-' + 'palace', 'om' + 'ni'].join('|')})\\b`, 'i');
23
+ const LOW_SIGNAL_PATTERNS = [
24
+ /^\s*(?:thanks?|thank you|hello|hi|hey)\b/i,
25
+ /\b(?:can you|could you|please|help me|show me|explain|what is|how do i)\b/i,
26
+ /\b(?:i'll|i will|we will|let's|todo|task|goal|next step|follow up|remind me)\b/i,
27
+ /^\s*[-*]\s+\[[ x]\]/i,
28
+ ];
29
+ const EXTRACTION_PATTERNS = [
30
+ {
31
+ pattern: /\b(?:i|we)\s+(?:decided|chose|picked|selected|settled on|agreed to use|agreed on)\b/i,
32
+ type: 'decision',
33
+ confidence: 90,
34
+ prefix: 'Decision',
35
+ },
36
+ {
37
+ pattern: /\b(?:final decision|decision)\s*:/i,
38
+ type: 'decision',
39
+ confidence: 90,
40
+ prefix: 'Decision',
41
+ },
42
+ {
43
+ pattern: /\b(?:i|we)\s+(?:prefer|like|dislike|hate|love)\b/i,
44
+ type: 'preference',
45
+ confidence: 85,
46
+ prefix: 'Preference',
47
+ },
48
+ {
49
+ pattern: /\b(?:my|our|the user's)\s+(?:preference|preferred)\b/i,
50
+ type: 'preference',
51
+ confidence: 85,
52
+ prefix: 'Preference',
53
+ },
54
+ {
55
+ pattern: /\b(?:remember|don't forget)\s+(?:that\s+)?\S+/i,
56
+ type: 'fact',
57
+ confidence: 80,
58
+ prefix: 'Fact',
59
+ },
60
+ {
61
+ pattern: /\b(?:project|repo|workspace|service|app)\s+\S+\s+(?:uses|runs on|depends on|requires|stores)\b/i,
62
+ type: 'fact',
63
+ confidence: 80,
64
+ prefix: 'Fact',
65
+ },
66
+ ];
18
67
  /**
19
68
  * Build fact extraction prompt
20
69
  */
21
70
  function buildFactExtractionPrompt(messages) {
22
71
  const messagesText = messages.map(m => `[${m.role}]: ${m.content}`).join('\n\n');
23
- return `Extract key facts, decisions, and user preferences from this conversation.
24
-
25
- Format your response as JSON:
26
- {
27
- "extractedFacts": [
28
- {
29
- "content": "specific fact text",
30
- "type": "fact|decision|preference|observation",
31
- "confidence": 0-100
32
- }
33
- ]
34
- }
35
-
36
- Only extract truly meaningful information that should be remembered:
37
- - Facts that are useful for future work or decisions
38
- - User preferences and choices
39
- - Important decisions made
40
- - Patterns or behaviors observed
41
-
42
- Do NOT extract:
43
- - Temporary conversational details
44
- - Greetings or pleasantries
45
- - Unless they indicate something significant
46
-
47
- Conversation messages:
72
+ return `Extract key facts, decisions, and user preferences from this conversation.
73
+
74
+ Format your response as JSON:
75
+ {
76
+ "extractedFacts": [
77
+ {
78
+ "content": "specific fact text",
79
+ "type": "fact|decision|preference|observation",
80
+ "confidence": 0-100
81
+ }
82
+ ]
83
+ }
84
+
85
+ Only extract truly meaningful information that should be remembered:
86
+ - Facts that are useful for future work or decisions
87
+ - User preferences and choices
88
+ - Important decisions made
89
+ - Patterns or behaviors observed
90
+
91
+ Do NOT extract:
92
+ - Temporary conversational details
93
+ - Greetings or pleasantries
94
+ - Unless they indicate something significant
95
+
96
+ Conversation messages:
48
97
  ${messagesText}`;
49
98
  }
50
99
  /**
@@ -52,14 +101,14 @@ ${messagesText}`;
52
101
  */
53
102
  function buildSummaryPrompt(messages) {
54
103
  const messagesText = messages.map(m => `[${m.role}]: ${m.content}`).join('\n\n');
55
- return `Generate a concise summary of this conversation (2-3 sentences, under 300 characters).
56
-
57
- Focus on:
58
- - What was accomplished
59
- - Key decisions made
60
- - Important context established
61
-
62
- Conversation messages:
104
+ return `Generate a concise summary of this conversation (2-3 sentences, under 300 characters).
105
+
106
+ Focus on:
107
+ - What was accomplished
108
+ - Key decisions made
109
+ - Important context established
110
+
111
+ Conversation messages:
63
112
  ${messagesText}`;
64
113
  }
65
114
  /**
@@ -78,10 +127,75 @@ function parseExtractedFacts(llmResponse) {
78
127
  return [];
79
128
  }
80
129
  }
130
+ function normalizeCaptureKey(content) {
131
+ return content
132
+ .toLowerCase()
133
+ .replace(/^(?:decision|preference|fact):\s*/i, '')
134
+ .replace(/['"`]/g, '')
135
+ .replace(/\s+/g, ' ')
136
+ .replace(/[^\w\s./:-]/g, '')
137
+ .trim();
138
+ }
139
+ function isLowSignalCapture(content) {
140
+ const text = content.trim();
141
+ if (text.length < 20 || text.split(/\s+/).length < 4)
142
+ return true;
143
+ if (text.endsWith('?'))
144
+ return true;
145
+ if (FORBIDDEN_BRAND_TERMS.test(text))
146
+ return true;
147
+ return LOW_SIGNAL_PATTERNS.some((pattern) => pattern.test(text));
148
+ }
149
+ function splitCandidateStatements(content) {
150
+ return content
151
+ .split(/\n+|(?<=[.!?])\s+/)
152
+ .map((part) => part.trim())
153
+ .filter(Boolean);
154
+ }
155
+ export function extractDurableSelfIterationFacts(messages) {
156
+ const captures = new Map();
157
+ for (const msg of messages) {
158
+ if (msg.role !== 'user')
159
+ continue;
160
+ for (const statement of splitCandidateStatements(msg.content)) {
161
+ if (isLowSignalCapture(statement))
162
+ continue;
163
+ for (const { pattern, type, confidence, prefix } of EXTRACTION_PATTERNS) {
164
+ if (!pattern.test(statement))
165
+ continue;
166
+ const normalizedStatement = statement.replace(/^(?:decision|preference|fact):\s*/i, '');
167
+ const content = `${prefix}: ${normalizedStatement}`;
168
+ const key = `${type}:${normalizeCaptureKey(content)}`;
169
+ const existing = captures.get(key);
170
+ if (!existing || confidence > existing.confidence) {
171
+ captures.set(key, { content, type, confidence });
172
+ }
173
+ }
174
+ }
175
+ }
176
+ return Array.from(captures.values()).filter((fact) => fact.confidence >= MIN_CONFIDENCE_TO_STORE);
177
+ }
178
+ async function hasSimilarSelfIterationMemory(fact, projectPath) {
179
+ const matches = await search({
180
+ query: fact.content,
181
+ type: fact.type,
182
+ project: projectPath,
183
+ limit: 5,
184
+ });
185
+ const factKey = normalizeCaptureKey(fact.content);
186
+ return matches.some((match) => {
187
+ const matchMetadata = match.metadata ?? {};
188
+ if (matchMetadata.extractionMethod !== 'self-iteration')
189
+ return false;
190
+ if ((match.similarity ?? 0) >= 0.92)
191
+ return true;
192
+ return normalizeCaptureKey(match.content) === factKey;
193
+ });
194
+ }
81
195
  /**
82
196
  * Get conversations ready for self-iteration
83
197
  */
84
- async function getConversationsForIteration(maxMessages) {
198
+ async function getConversationsForIteration(minMessageCount) {
85
199
  const db = await getDb();
86
200
  if (!db)
87
201
  return [];
@@ -94,10 +208,14 @@ async function getConversationsForIteration(maxMessages) {
94
208
  const conversations = await sqliteDb.select()
95
209
  .from(schema.conversations)
96
210
  .where(sql `${schema.conversations.endedAt} IS NOT NULL
97
- AND (${schema.conversations.metadata}->>'selfIterationProcessed') IS NULL
98
- AND ${schema.conversations.messageCount} >= ?`)
211
+ AND ${schema.conversations.messageCount} >= ${minMessageCount}`)
99
212
  .limit(10);
100
- return conversations;
213
+ return conversations
214
+ .map((conversation) => ({
215
+ ...conversation,
216
+ metadata: deserializeMetadata(conversation.metadata ?? null),
217
+ }))
218
+ .filter((conversation) => !conversation.metadata?.selfIterationProcessed);
101
219
  }
102
220
  /**
103
221
  * Get messages for a conversation
@@ -129,9 +247,18 @@ async function markConversationProcessed(conversationId) {
129
247
  return;
130
248
  const schema = await getSchema();
131
249
  const sqliteDb = db;
250
+ const rows = await sqliteDb.select()
251
+ .from(schema.conversations)
252
+ .where(eq(schema.conversations.id, conversationId))
253
+ .limit(1);
254
+ const existingMetadata = deserializeMetadata(rows[0]?.metadata ?? null) ?? {};
132
255
  await sqliteDb.update(schema.conversations)
133
256
  .set({
134
- metadata: sql `json_set(${schema.conversations.metadata}, 'selfIterationProcessed', true)`,
257
+ metadata: serializeMetadata({
258
+ ...existingMetadata,
259
+ selfIterationProcessed: true,
260
+ selfIterationProcessedAt: new Date().toISOString(),
261
+ }),
135
262
  })
136
263
  .where(eq(schema.conversations.id, conversationId));
137
264
  }
@@ -149,65 +276,43 @@ async function processConversation(conversation, config) {
149
276
  if (messagesToProcess.length === 0) {
150
277
  return { memoriesCreated, summariesCreated };
151
278
  }
152
- // Extract facts
279
+ // Extract facts using improved pattern matching
153
280
  if (config.extractFacts) {
154
- const prompt = buildFactExtractionPrompt(messagesToProcess);
155
- // Here we would call an LLM client to extract facts
156
- // For now, we'll use a simple heuristic extraction
157
- const extractedFacts = [];
158
- for (const msg of messagesToProcess) {
159
- if (msg.role === 'user') {
160
- const content = msg.content.toLowerCase();
161
- // Look for user preferences
162
- if (content.includes('i want') || content.includes('i prefer') || content.includes('i like')) {
163
- extractedFacts.push({
164
- content: `User preference: ${msg.content}`,
165
- type: 'preference',
166
- confidence: 70,
167
- });
168
- }
169
- // Look for decisions
170
- if (content.includes('i will') || content.includes('i decide') || content.includes('let\'s')) {
171
- extractedFacts.push({
172
- content: `Decision: ${msg.content}`,
173
- type: 'decision',
174
- confidence: 80,
175
- });
176
- }
177
- }
178
- }
281
+ const extractedFacts = extractDurableSelfIterationFacts(messagesToProcess);
282
+ const project = conversation.projectId ? await getProjectById(conversation.projectId) : null;
283
+ const projectPath = project?.path;
179
284
  // Store extracted facts as memories
180
285
  for (const fact of extractedFacts) {
181
- if (fact.confidence >= 60) {
182
- try {
183
- await rememberMemory({
184
- content: fact.content,
185
- type: fact.type,
186
- project: conversation.projectId,
187
- metadata: {
188
- extractionMethod: 'self-iteration',
189
- confidence: fact.confidence,
190
- conversationId: conversation.id,
191
- sessionId: conversation.sessionId,
192
- },
193
- });
194
- memoriesCreated++;
195
- logger.info(`[SelfIteration] Extracted memory: ${fact.type} - ${fact.content.substring(0, 50)}...`);
196
- }
197
- catch (error) {
198
- logger.error(`[SelfIteration] Failed to store memory:`, error);
286
+ try {
287
+ if (await hasSimilarSelfIterationMemory(fact, projectPath)) {
288
+ logger.debug(`[SelfIteration] Suppressed duplicate memory: ${fact.type} - ${fact.content.substring(0, 50)}...`);
289
+ continue;
199
290
  }
291
+ await rememberMemory({
292
+ content: fact.content,
293
+ type: fact.type,
294
+ project: projectPath,
295
+ metadata: {
296
+ extractionMethod: 'self-iteration',
297
+ confidence: fact.confidence,
298
+ conversationId: conversation.id,
299
+ sessionId: conversation.sessionId,
300
+ },
301
+ source: 'self-iteration',
302
+ });
303
+ memoriesCreated++;
304
+ logger.info(`[SelfIteration] Extracted memory: ${fact.type} - ${fact.content.substring(0, 50)}...`);
305
+ }
306
+ catch (error) {
307
+ logger.error(`[SelfIteration] Failed to store memory:`, error);
200
308
  }
201
309
  }
202
310
  }
203
311
  // Generate summary
204
312
  if (config.generateSummaries && messagesToProcess.length > 0) {
205
- const prompt = buildSummaryPrompt(messagesToProcess);
206
- // Here we would call an LLM client to generate summary
207
- // For now, use simple heuristic
208
- const userMessages = messagesToProcess.filter(m => m.role === 'user');
209
- const lastMessage = userMessages[userMessages.length - 1]?.content || '';
210
- const summary = lastMessage.substring(0, Math.min(250, lastMessage.length));
313
+ // Use extractive summarization for better results
314
+ const extracted = extractMessageContent(messagesToProcess);
315
+ const summary = generateExtractiveSummary(extracted);
211
316
  // Update conversation with summary
212
317
  const db = await getDb();
213
318
  const schema = await getSchema();
@@ -234,7 +339,7 @@ const selfIterationHandler = async (context) => {
234
339
  return { recordsProcessed: 0, summary: { status: 'disabled' } };
235
340
  }
236
341
  try {
237
- const conversations = await getConversationsForIteration(config.maxMessagesToProcess || DEFAULT_CONFIG.maxMessagesToProcess);
342
+ const conversations = await getConversationsForIteration(config.minMessageCount || DEFAULT_CONFIG.minMessageCount);
238
343
  if (conversations.length === 0) {
239
344
  logger.info('[SelfIteration] No conversations to process');
240
345
  return { recordsProcessed: 0, summary: { status: 'no_conversations' } };
@@ -0,0 +1,50 @@
1
+ export interface WorkingSetCommand {
2
+ command: string;
3
+ outcome?: string;
4
+ at: string;
5
+ }
6
+ export interface SessionWorkingSet {
7
+ activeFiles: string[];
8
+ activePlaces: string[];
9
+ graphEntities: string[];
10
+ recentCommands: WorkingSetCommand[];
11
+ currentHypotheses: string[];
12
+ recentFailures: string[];
13
+ recentAttempts: string[];
14
+ projectPath?: string;
15
+ sessionId: string;
16
+ signalStats: {
17
+ captured: number;
18
+ suppressed: number;
19
+ sessionOnly: number;
20
+ durable: number;
21
+ durableWithRaw: number;
22
+ tokensSaved: number;
23
+ placeRouted: number;
24
+ graphEnriched: number;
25
+ };
26
+ recentEvents: Array<{
27
+ classification: string;
28
+ content: string;
29
+ target?: string;
30
+ hash?: string;
31
+ at: string;
32
+ }>;
33
+ }
34
+ export declare function getSessionWorkingSet(sessionId: string, projectPath?: string): Promise<SessionWorkingSet>;
35
+ export declare function recordSessionSignal(input: {
36
+ sessionId: string;
37
+ projectPath: string;
38
+ classification: 'discard' | 'session-only' | 'durable-distilled' | 'durable-raw+distilled';
39
+ distilledContent: string;
40
+ toolName: string;
41
+ target?: string;
42
+ metadata?: Record<string, unknown>;
43
+ }): Promise<SessionWorkingSet>;
44
+ export declare function compactSessionWorkingSet(sessionId: string, projectPath?: string): Promise<{
45
+ summary: string;
46
+ workingSet: SessionWorkingSet;
47
+ }>;
48
+ export declare function getProjectSignalStats(projectPath: string): Promise<any>;
49
+ export declare function getLatestProjectWorkingSetSummary(projectPath: string): Promise<string>;
50
+ //# sourceMappingURL=working-set.d.ts.map
@@ -0,0 +1,212 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { eq } from 'drizzle-orm';
3
+ import { getDbClient } from '../lib/db-client.js';
4
+ import { ensureProject, getProjectByPath } from '../projects.js';
5
+ import { deserializeMetadata, serializeMetadata } from '../memory/serialization.js';
6
+ const EMPTY_WORKING_SET = (sessionId, projectPath) => ({
7
+ activeFiles: [],
8
+ activePlaces: [],
9
+ graphEntities: [],
10
+ recentCommands: [],
11
+ currentHypotheses: [],
12
+ recentFailures: [],
13
+ recentAttempts: [],
14
+ projectPath,
15
+ sessionId,
16
+ signalStats: {
17
+ captured: 0,
18
+ suppressed: 0,
19
+ sessionOnly: 0,
20
+ durable: 0,
21
+ durableWithRaw: 0,
22
+ tokensSaved: 0,
23
+ placeRouted: 0,
24
+ graphEnriched: 0,
25
+ },
26
+ recentEvents: [],
27
+ });
28
+ function dedupe(items, limit) {
29
+ return [...new Set(items.filter(Boolean))].slice(0, limit);
30
+ }
31
+ function normalizeSessionMetadata(metadata, sessionId, projectPath) {
32
+ const parsed = (metadata ?? {});
33
+ return {
34
+ ...EMPTY_WORKING_SET(sessionId, projectPath),
35
+ ...parsed,
36
+ activeFiles: parsed.activeFiles ?? [],
37
+ activePlaces: parsed.activePlaces ?? [],
38
+ graphEntities: parsed.graphEntities ?? [],
39
+ recentCommands: parsed.recentCommands ?? [],
40
+ currentHypotheses: parsed.currentHypotheses ?? [],
41
+ recentFailures: parsed.recentFailures ?? [],
42
+ recentAttempts: parsed.recentAttempts ?? [],
43
+ recentEvents: parsed.recentEvents ?? [],
44
+ signalStats: {
45
+ ...EMPTY_WORKING_SET(sessionId, projectPath).signalStats,
46
+ ...(parsed.signalStats ?? {}),
47
+ },
48
+ };
49
+ }
50
+ async function getOrCreateContextSession(sessionId, projectPath) {
51
+ const { db, schema, raw } = await getDbClient();
52
+ const project = await ensureProject(projectPath);
53
+ const existing = await db
54
+ .select()
55
+ .from(schema.contextSessions)
56
+ .where(eq(schema.contextSessions.sessionId, sessionId))
57
+ .limit(1);
58
+ if (existing[0])
59
+ return { row: existing[0], projectId: project?.id ?? null, db, schema };
60
+ const sqlite = raw.$client;
61
+ const id = randomUUID();
62
+ const metadata = serializeMetadata(EMPTY_WORKING_SET(sessionId, projectPath));
63
+ sqlite.prepare(`
64
+ INSERT INTO context_sessions (
65
+ id, session_id, project_id, metadata, token_budget, tokens_used, core_memory_tokens, loaded_memories_tokens, created_at, updated_at
66
+ ) VALUES (?, ?, ?, ?, 8000, 0, 0, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
67
+ `).run(id, sessionId, project?.id ?? null, metadata);
68
+ const inserted = await db
69
+ .select()
70
+ .from(schema.contextSessions)
71
+ .where(eq(schema.contextSessions.sessionId, sessionId))
72
+ .limit(1);
73
+ return { row: inserted[0], projectId: project?.id ?? null, db, schema };
74
+ }
75
+ export async function getSessionWorkingSet(sessionId, projectPath) {
76
+ const { db, schema } = await getDbClient();
77
+ const rows = await db
78
+ .select()
79
+ .from(schema.contextSessions)
80
+ .where(eq(schema.contextSessions.sessionId, sessionId))
81
+ .limit(1);
82
+ if (!rows[0])
83
+ return EMPTY_WORKING_SET(sessionId, projectPath);
84
+ return normalizeSessionMetadata(deserializeMetadata(rows[0].metadata ?? null), sessionId, projectPath);
85
+ }
86
+ export async function recordSessionSignal(input) {
87
+ const { row, db, schema } = await getOrCreateContextSession(input.sessionId, input.projectPath);
88
+ const current = normalizeSessionMetadata(deserializeMetadata(row.metadata ?? null), input.sessionId, input.projectPath);
89
+ const meta = input.metadata ?? {};
90
+ const now = new Date().toISOString();
91
+ const next = normalizeSessionMetadata(current, input.sessionId, input.projectPath);
92
+ next.activeFiles = dedupe([
93
+ ...next.activeFiles,
94
+ ...((meta.activeFiles ?? [])),
95
+ ], 8);
96
+ next.activePlaces = dedupe([
97
+ ...next.activePlaces,
98
+ ...((meta.activePlaces ?? [])),
99
+ ], 6);
100
+ next.graphEntities = dedupe([
101
+ ...next.graphEntities,
102
+ ...((meta.graphEntities ?? [])),
103
+ ], 8);
104
+ const command = typeof meta.command === 'string' ? meta.command : undefined;
105
+ if (command) {
106
+ next.recentCommands = [{ command, outcome: typeof meta.outcome === 'string' ? meta.outcome : undefined, at: now }, ...next.recentCommands].slice(0, 8);
107
+ }
108
+ if (/hypothesis/i.test(input.distilledContent)) {
109
+ next.currentHypotheses = dedupe([input.distilledContent, ...next.currentHypotheses], 5);
110
+ }
111
+ if ((typeof meta.outcome === 'string' && meta.outcome === 'failure') || /fail|error|exception/i.test(input.distilledContent)) {
112
+ next.recentFailures = dedupe([input.target ?? input.distilledContent, ...next.recentFailures], 5);
113
+ }
114
+ next.recentAttempts = dedupe([input.distilledContent, ...next.recentAttempts], 8);
115
+ next.recentEvents = [
116
+ {
117
+ classification: input.classification,
118
+ content: input.distilledContent,
119
+ target: input.target,
120
+ hash: typeof meta.contentHash === 'string' ? meta.contentHash : undefined,
121
+ at: now,
122
+ },
123
+ ...next.recentEvents,
124
+ ].slice(0, 20);
125
+ if (input.classification === 'discard')
126
+ next.signalStats.suppressed += 1;
127
+ else
128
+ next.signalStats.captured += 1;
129
+ if (input.classification === 'session-only')
130
+ next.signalStats.sessionOnly += 1;
131
+ if (input.classification === 'durable-distilled')
132
+ next.signalStats.durable += 1;
133
+ if (input.classification === 'durable-raw+distilled')
134
+ next.signalStats.durableWithRaw += 1;
135
+ next.signalStats.tokensSaved += Number(meta.tokensSaved ?? 0);
136
+ next.signalStats.placeRouted += meta.placeRouted ? 1 : 0;
137
+ next.signalStats.graphEnriched += meta.graphEnriched ? 1 : 0;
138
+ await db
139
+ .update(schema.contextSessions)
140
+ .set({
141
+ metadata: serializeMetadata(next),
142
+ updatedAt: new Date(),
143
+ })
144
+ .where(eq(schema.contextSessions.sessionId, input.sessionId));
145
+ return next;
146
+ }
147
+ export async function compactSessionWorkingSet(sessionId, projectPath) {
148
+ const workingSet = await getSessionWorkingSet(sessionId, projectPath);
149
+ const lines = [];
150
+ if (workingSet.currentHypotheses.length > 0) {
151
+ lines.push(`Hypotheses: ${dedupe(workingSet.currentHypotheses, 3).join(' | ')}`);
152
+ }
153
+ if (workingSet.recentFailures.length > 0) {
154
+ lines.push(`Failures: ${dedupe(workingSet.recentFailures, 3).join(' | ')}`);
155
+ }
156
+ if (workingSet.activeFiles.length > 0) {
157
+ lines.push(`Active files: ${dedupe(workingSet.activeFiles, 5).join(', ')}`);
158
+ }
159
+ if (workingSet.activePlaces.length > 0) {
160
+ lines.push(`Active places: ${dedupe(workingSet.activePlaces, 4).join(', ')}`);
161
+ }
162
+ if (workingSet.graphEntities.length > 0) {
163
+ lines.push(`Graph entities: ${dedupe(workingSet.graphEntities, 4).join(', ')}`);
164
+ }
165
+ if (workingSet.recentCommands.length > 0) {
166
+ lines.push(`Recent commands: ${dedupe(workingSet.recentCommands.map((entry) => entry.command), 3).join(' | ')}`);
167
+ }
168
+ return {
169
+ summary: lines.join('\n'),
170
+ workingSet,
171
+ };
172
+ }
173
+ export async function getProjectSignalStats(projectPath) {
174
+ const { db, schema } = await getDbClient();
175
+ const project = await getProjectByPath(projectPath);
176
+ if (!project) {
177
+ return EMPTY_WORKING_SET('project-stats', projectPath).signalStats;
178
+ }
179
+ const rows = await db
180
+ .select()
181
+ .from(schema.contextSessions)
182
+ .where(eq(schema.contextSessions.projectId, project.id));
183
+ return rows.reduce((acc, row) => {
184
+ const workingSet = normalizeSessionMetadata(deserializeMetadata(row.metadata ?? null), row.sessionId, projectPath);
185
+ acc.captured += workingSet.signalStats.captured;
186
+ acc.suppressed += workingSet.signalStats.suppressed;
187
+ acc.sessionOnly += workingSet.signalStats.sessionOnly;
188
+ acc.durable += workingSet.signalStats.durable;
189
+ acc.durableWithRaw += workingSet.signalStats.durableWithRaw;
190
+ acc.tokensSaved += workingSet.signalStats.tokensSaved;
191
+ return acc;
192
+ }, { ...EMPTY_WORKING_SET('project-stats', projectPath).signalStats });
193
+ }
194
+ export async function getLatestProjectWorkingSetSummary(projectPath) {
195
+ const { db, schema } = await getDbClient();
196
+ const project = await getProjectByPath(projectPath);
197
+ if (!project)
198
+ return '';
199
+ const rows = await db
200
+ .select()
201
+ .from(schema.contextSessions)
202
+ .where(eq(schema.contextSessions.projectId, project.id));
203
+ const latest = rows.sort((a, b) => {
204
+ const left = new Date(a.updatedAt ?? a.createdAt ?? 0).getTime();
205
+ const right = new Date(b.updatedAt ?? b.createdAt ?? 0).getTime();
206
+ return right - left;
207
+ })[0];
208
+ if (!latest)
209
+ return '';
210
+ return compactSessionWorkingSet(latest.sessionId, projectPath).then((result) => result.summary);
211
+ }
212
+ //# sourceMappingURL=working-set.js.map
@@ -2,14 +2,8 @@
2
2
  * Snapshot Creation Operations
3
3
  * Functions for creating different types of memory snapshots
4
4
  */
5
- export interface MemoryDiff {
6
- added?: string[];
7
- removed?: string[];
8
- changed?: Record<string, {
9
- from: unknown;
10
- to: unknown;
11
- }>;
12
- }
5
+ import { MemoryDiff, calculateDiff } from './comparison.js';
6
+ export { MemoryDiff, calculateDiff };
13
7
  export declare function createBeforeSnapshot(memoryId: string): Promise<string>;
14
8
  export declare function createAfterSnapshot(memoryId: string, beforeSnapshotId: string): Promise<{
15
9
  snapshotId: string;
@@ -7,6 +7,9 @@ import { randomUUID } from 'crypto';
7
7
  import { getDb } from '../../db/index.js';
8
8
  import { getSchema } from '../../db/schema.js';
9
9
  import { logger } from '../logger.js';
10
+ import { calculateDiff } from './comparison.js';
11
+ // Re-export for convenience
12
+ export { calculateDiff };
10
13
  export async function createBeforeSnapshot(memoryId) {
11
14
  try {
12
15
  const db = await getDb();
@@ -111,16 +114,4 @@ function extractMetadata(memory) {
111
114
  agentId: memory.agentId,
112
115
  };
113
116
  }
114
- function calculateDiff(before, after) {
115
- const beforeLines = before.split('\n');
116
- const afterLines = after.split('\n');
117
- const beforeSet = new Set(beforeLines);
118
- const afterSet = new Set(afterLines);
119
- const added = afterLines.filter(line => !beforeSet.has(line));
120
- const removed = beforeLines.filter(line => !afterSet.has(line));
121
- return {
122
- added: added.length > 0 ? added : undefined,
123
- removed: removed.length > 0 ? removed : undefined,
124
- };
125
- }
126
117
  //# sourceMappingURL=creation.js.map
@@ -1,5 +1,5 @@
1
- import { config } from '../config.js';
2
- import { logger } from './logger.js';
1
+ import { config } from '../../config.js';
2
+ import { logger } from '../logger.js';
3
3
  let redis = null;
4
4
  class LRUCache {
5
5
  cache = new Map();
@@ -5,7 +5,7 @@
5
5
  import { eq } from 'drizzle-orm';
6
6
  import { getDb } from '../../db/index.js';
7
7
  import { getSchema } from '../../db/schema.js';
8
- import { createDatabaseClient } from '../database.js';
8
+ import { createDatabaseClient } from '../storage/database.js';
9
9
  import { config } from '../../config.js';
10
10
  import { logger } from '../logger.js';
11
11
  /**