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
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Retrieval Feedback System
3
+ *
4
+ * Tracks whether retrieved memories were useful in responses.
5
+ * Strengthens useful paths, prunes stale nodes, tunes edge weights.
6
+ */
7
+ import { eq, sql } from 'drizzle-orm';
8
+ import { getDb } from '../../db/index.js';
9
+ import { getSchema } from '../../db/schema.js';
10
+ import { logger } from '../logger.js';
11
+ // ─── In-Memory Feedback Buffer ───────────────────────────────────────────────
12
+ const feedbackBuffer = new Map();
13
+ const MAX_BUFFER_SIZE = 1000;
14
+ const FLUSH_INTERVAL_MS = 60000; // 1 minute
15
+ let flushTimer = null;
16
+ /**
17
+ * Record that a memory was retrieved for a query.
18
+ * Call this when a memory appears in search results.
19
+ */
20
+ export function recordRetrieval(memoryId, query, options) {
21
+ const key = options?.sessionId || 'default';
22
+ const buffer = feedbackBuffer.get(key) || [];
23
+ buffer.push({
24
+ memoryId,
25
+ query,
26
+ wasUseful: false, // Will be updated later
27
+ cited: false,
28
+ timestamp: new Date(),
29
+ });
30
+ // Trim buffer if too large
31
+ if (buffer.length > MAX_BUFFER_SIZE) {
32
+ buffer.splice(0, buffer.length - MAX_BUFFER_SIZE);
33
+ }
34
+ feedbackBuffer.set(key, buffer);
35
+ }
36
+ /**
37
+ * Record that a retrieved memory was actually useful.
38
+ * Call this when a memory is cited or referenced in a response.
39
+ */
40
+ export function recordUsefulRetrieval(memoryId, query, options) {
41
+ const key = options?.sessionId || 'default';
42
+ const buffer = feedbackBuffer.get(key) || [];
43
+ // Find the existing retrieval record and update it
44
+ const existing = buffer.find(f => f.memoryId === memoryId && f.query === query && !f.wasUseful);
45
+ if (existing) {
46
+ existing.wasUseful = true;
47
+ existing.cited = options?.cited ?? false;
48
+ existing.responseId = options?.responseId;
49
+ }
50
+ else {
51
+ // Add a new record
52
+ buffer.push({
53
+ memoryId,
54
+ query,
55
+ wasUseful: true,
56
+ cited: options?.cited ?? false,
57
+ responseId: options?.responseId,
58
+ timestamp: new Date(),
59
+ });
60
+ }
61
+ feedbackBuffer.set(key, buffer);
62
+ }
63
+ /**
64
+ * Record that a memory was cited in a response.
65
+ * This is stronger feedback than just "useful" - it means the memory
66
+ * was explicitly referenced.
67
+ */
68
+ export function recordCitation(memoryId, responseId, options) {
69
+ const key = options?.sessionId || 'default';
70
+ const buffer = feedbackBuffer.get(key) || [];
71
+ // Mark all retrievals of this memory as useful
72
+ for (const feedback of buffer) {
73
+ if (feedback.memoryId === memoryId) {
74
+ feedback.wasUseful = true;
75
+ feedback.cited = true;
76
+ feedback.responseId = responseId;
77
+ }
78
+ }
79
+ feedbackBuffer.set(key, buffer);
80
+ }
81
+ /**
82
+ * Get feedback statistics for a specific memory.
83
+ */
84
+ export function getRetrievalStats(memoryId) {
85
+ let totalRetrievals = 0;
86
+ let usefulRetrievals = 0;
87
+ let citedRetrievals = 0;
88
+ for (const [, buffer] of feedbackBuffer) {
89
+ for (const feedback of buffer) {
90
+ if (feedback.memoryId === memoryId) {
91
+ totalRetrievals++;
92
+ if (feedback.wasUseful)
93
+ usefulRetrievals++;
94
+ if (feedback.cited)
95
+ citedRetrievals++;
96
+ }
97
+ }
98
+ }
99
+ return {
100
+ totalRetrievals,
101
+ usefulRetrievals,
102
+ citedRetrievals,
103
+ usefulnessRate: totalRetrievals > 0 ? usefulRetrievals / totalRetrievals : 0,
104
+ citationRate: totalRetrievals > 0 ? citedRetrievals / totalRetrievals : 0,
105
+ };
106
+ }
107
+ /**
108
+ * Get overall feedback statistics.
109
+ */
110
+ export function getOverallFeedbackStats() {
111
+ let totalRetrievals = 0;
112
+ let usefulRetrievals = 0;
113
+ let citedRetrievals = 0;
114
+ for (const [, buffer] of feedbackBuffer) {
115
+ for (const feedback of buffer) {
116
+ totalRetrievals++;
117
+ if (feedback.wasUseful)
118
+ usefulRetrievals++;
119
+ if (feedback.cited)
120
+ citedRetrievals++;
121
+ }
122
+ }
123
+ return {
124
+ totalRetrievals,
125
+ usefulRetrievals,
126
+ citedRetrievals,
127
+ usefulnessRate: totalRetrievals > 0 ? usefulRetrievals / totalRetrievals : 0,
128
+ citationRate: totalRetrievals > 0 ? citedRetrievals / totalRetrievals : 0,
129
+ };
130
+ }
131
+ /**
132
+ * Flush feedback to the database, updating association weights.
133
+ */
134
+ export async function flushFeedback() {
135
+ const db = await getDb();
136
+ const schema = await getSchema();
137
+ let strengthened = 0;
138
+ let weakened = 0;
139
+ let total = 0;
140
+ for (const [, buffer] of feedbackBuffer) {
141
+ for (const feedback of buffer) {
142
+ total++;
143
+ try {
144
+ // Get associations involving this memory
145
+ const associations = await db
146
+ .select()
147
+ .from(schema.memoryAssociations)
148
+ .where(sql `${schema.memoryAssociations.fromMemoryId} = ${feedback.memoryId} OR ${schema.memoryAssociations.toMemoryId} = ${feedback.memoryId}`);
149
+ for (const assoc of associations) {
150
+ if (feedback.wasUseful) {
151
+ // Strengthen: increase weight and coactivation count
152
+ await db
153
+ .update(schema.memoryAssociations)
154
+ .set({
155
+ weight: sql `${schema.memoryAssociations.weight} + 1`,
156
+ coactivationCount: sql `${schema.memoryAssociations.coactivationCount} + 1`,
157
+ lastCoactivatedAt: new Date(),
158
+ })
159
+ .where(eq(schema.memoryAssociations.id, assoc.id));
160
+ strengthened++;
161
+ }
162
+ else {
163
+ // Weaken: decrease weight slightly (but don't go below 1)
164
+ await db
165
+ .update(schema.memoryAssociations)
166
+ .set({
167
+ weight: sql `GREATEST(${schema.memoryAssociations.weight} - 0.5, 1)`,
168
+ })
169
+ .where(eq(schema.memoryAssociations.id, assoc.id));
170
+ weakened++;
171
+ }
172
+ }
173
+ }
174
+ catch (error) {
175
+ logger.debug('Error updating association weights', {
176
+ memoryId: feedback.memoryId,
177
+ error: error,
178
+ });
179
+ }
180
+ }
181
+ }
182
+ // Clear the buffer after flushing
183
+ feedbackBuffer.clear();
184
+ logger.info('Feedback flushed', { strengthened, weakened, total });
185
+ return { strengthened, weakened, total };
186
+ }
187
+ /**
188
+ * Start the periodic feedback flush timer.
189
+ */
190
+ export function startFeedbackFlushTimer() {
191
+ if (flushTimer)
192
+ return;
193
+ flushTimer = setInterval(async () => {
194
+ try {
195
+ await flushFeedback();
196
+ }
197
+ catch (error) {
198
+ logger.error('Error flushing feedback', { error: error });
199
+ }
200
+ }, FLUSH_INTERVAL_MS);
201
+ logger.info('Feedback flush timer started', { intervalMs: FLUSH_INTERVAL_MS });
202
+ }
203
+ /**
204
+ * Stop the periodic feedback flush timer.
205
+ */
206
+ export function stopFeedbackFlushTimer() {
207
+ if (flushTimer) {
208
+ clearInterval(flushTimer);
209
+ flushTimer = null;
210
+ logger.info('Feedback flush timer stopped');
211
+ }
212
+ }
213
+ //# sourceMappingURL=retrieval-feedback.js.map
@@ -3,4 +3,8 @@ export declare function toSqliteJson(value: unknown): string | null;
3
3
  export declare function fromSqliteJson<T>(value: string | null | undefined): T | null;
4
4
  export declare function toSqliteTags(tags?: string[]): string | null;
5
5
  export declare function fromSqliteTags(value: string | null | undefined): string[];
6
+ export declare function serializeTags(tags?: string[]): string[] | string | null | undefined;
7
+ export declare function deserializeTags(value: string[] | string | null | undefined): string[];
8
+ export declare function serializeMetadata(metadata: Record<string, unknown> | null | undefined): Record<string, unknown> | string | null;
9
+ export declare function deserializeMetadata(value: Record<string, unknown> | string | null | undefined): Record<string, unknown> | null;
6
10
  //# sourceMappingURL=serialization.d.ts.map
@@ -1,3 +1,4 @@
1
+ import { config } from '../../config.js';
1
2
  export function normalizeTags(tags) {
2
3
  return (tags || []).map((tag) => tag.trim()).filter((tag) => tag.length > 0);
3
4
  }
@@ -32,4 +33,52 @@ export function fromSqliteTags(value) {
32
33
  return value.split(',').map((tag) => tag.trim()).filter(Boolean);
33
34
  }
34
35
  }
36
+ // High-level helpers that abstract away team mode vs local mode
37
+ export function serializeTags(tags) {
38
+ if (config.isTeamMode) {
39
+ // PostgreSQL: store as array directly (or null if empty)
40
+ return tags && tags.length > 0 ? tags : null;
41
+ }
42
+ else {
43
+ // SQLite: store as JSON string (or null)
44
+ return toSqliteTags(tags);
45
+ }
46
+ }
47
+ export function deserializeTags(value) {
48
+ if (config.isTeamMode) {
49
+ // PostgreSQL: value is already an array or null/undefined
50
+ return Array.isArray(value) ? value : [];
51
+ }
52
+ else {
53
+ // SQLite: value is a JSON string or null/undefined
54
+ if (typeof value === 'string' || value === null || value === undefined) {
55
+ return fromSqliteTags(value);
56
+ }
57
+ // Unexpected type, return empty array
58
+ return [];
59
+ }
60
+ }
61
+ export function serializeMetadata(metadata) {
62
+ if (config.isTeamMode) {
63
+ // PostgreSQL: store object directly (or null if null/undefined, keep empty object as-is)
64
+ return metadata === undefined || metadata === null ? null : metadata;
65
+ }
66
+ else {
67
+ // SQLite: store as JSON string (or null)
68
+ return toSqliteJson(metadata);
69
+ }
70
+ }
71
+ export function deserializeMetadata(value) {
72
+ if (config.isTeamMode) {
73
+ // PostgreSQL: value is already an object or null/undefined
74
+ return value == null ? null : value;
75
+ }
76
+ else {
77
+ // SQLite: value is a JSON string or null/undefined
78
+ if (typeof value === 'string' || value === null) {
79
+ return fromSqliteJson(value);
80
+ }
81
+ return null;
82
+ }
83
+ }
35
84
  //# sourceMappingURL=serialization.js.map
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Stale Memory Cleaner
3
+ * Deletes memories that are old, low-confidence, and low-importance
4
+ */
5
+ export interface StaleMemory {
6
+ id: string;
7
+ content: string;
8
+ type: string;
9
+ createdAt: Date;
10
+ confidenceLevel: string | null;
11
+ importanceScore: number | null;
12
+ isPinned: boolean;
13
+ }
14
+ export interface StaleMemoryQuery {
15
+ olderThanDays: number;
16
+ confidenceLevels: string[];
17
+ minImportance: number;
18
+ projectId?: string;
19
+ }
20
+ export declare function getStaleMemories(query: StaleMemoryQuery): Promise<StaleMemory[]>;
21
+ export declare function deleteMemoryPermanently(memoryId: string): Promise<void>;
22
+ export declare function runAutoClean(options?: Partial<StaleMemoryQuery>): Promise<{
23
+ deleted: number;
24
+ summary: Record<string, unknown>;
25
+ }>;
26
+ //# sourceMappingURL=stale-cleaner.d.ts.map
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Stale Memory Cleaner
3
+ * Deletes memories that are old, low-confidence, and low-importance
4
+ */
5
+ import { getDb } from '../../db/index.js';
6
+ import { getSchema } from '../../db/schema.js';
7
+ import { lt, or, and, eq, lte } from 'drizzle-orm';
8
+ export async function getStaleMemories(query) {
9
+ const db = await getDb();
10
+ if (!db)
11
+ return [];
12
+ const schema = await getSchema();
13
+ const sqliteDb = db;
14
+ const cutoffDate = new Date(Date.now() - query.olderThanDays * 24 * 60 * 60 * 1000);
15
+ // Build conditions
16
+ const conditions = [
17
+ // Not pinned
18
+ or(eq(schema.memories.isPinned, false), eq(schema.memories.isPinned, null)),
19
+ // Older than cutoff
20
+ lt(schema.memories.createdAt, cutoffDate),
21
+ ];
22
+ // Confidence level filter
23
+ if (query.confidenceLevels.length > 0) {
24
+ conditions.push(or(...query.confidenceLevels.map(level => eq(schema.memories.confidenceLevel, level))));
25
+ }
26
+ // Importance filter (below threshold)
27
+ conditions.push(lte(schema.memories.importanceScore, query.minImportance));
28
+ // Project filter if specified
29
+ if (query.projectId) {
30
+ conditions.push(eq(schema.memories.projectId, query.projectId));
31
+ }
32
+ try {
33
+ const results = await sqliteDb
34
+ .select({
35
+ id: schema.memories.id,
36
+ content: schema.memories.content,
37
+ type: schema.memories.type,
38
+ createdAt: schema.memories.createdAt,
39
+ confidenceLevel: schema.memories.confidenceLevel,
40
+ importanceScore: schema.memories.importanceScore,
41
+ isPinned: schema.memories.isPinned,
42
+ })
43
+ .from(schema.memories)
44
+ .where(and(...conditions.filter(Boolean)));
45
+ return results.map((r) => ({
46
+ ...r,
47
+ isPinned: Boolean(r.isPinned),
48
+ }));
49
+ }
50
+ catch (error) {
51
+ console.error('[StaleCleaner] Error querying stale memories:', error);
52
+ return [];
53
+ }
54
+ }
55
+ export async function deleteMemoryPermanently(memoryId) {
56
+ const db = await getDb();
57
+ if (!db)
58
+ return;
59
+ const schema = await getSchema();
60
+ const sqliteDb = db;
61
+ try {
62
+ // Delete associated records first
63
+ await sqliteDb.delete(schema.memoryAssociations).where(or(eq(schema.memoryAssociations.fromMemoryId, memoryId), eq(schema.memoryAssociations.toMemoryId, memoryId))).catch(() => { }); // Ignore if table doesn't exist
64
+ // Delete memory tags
65
+ await sqliteDb.delete(schema.memoryTags).where(eq(schema.memoryTags.memoryId, memoryId)).catch(() => { }); // Ignore if table doesn't exist
66
+ // Delete the memory itself
67
+ await sqliteDb.delete(schema.memories).where(eq(schema.memories.id, memoryId));
68
+ }
69
+ catch (error) {
70
+ console.error(`[StaleCleaner] Error deleting memory ${memoryId}:`, error);
71
+ throw error;
72
+ }
73
+ }
74
+ export async function runAutoClean(options) {
75
+ const defaultOptions = {
76
+ olderThanDays: options?.olderThanDays || 30,
77
+ confidenceLevels: options?.confidenceLevels || ['outdated', 'speculative'],
78
+ minImportance: options?.minImportance || 40,
79
+ };
80
+ const stale = await getStaleMemories(defaultOptions);
81
+ let deleted = 0;
82
+ for (const memory of stale) {
83
+ if (!memory.isPinned) {
84
+ await deleteMemoryPermanently(memory.id);
85
+ deleted++;
86
+ }
87
+ }
88
+ return {
89
+ deleted,
90
+ summary: {
91
+ scanned: stale.length,
92
+ skippedPinned: stale.length - deleted,
93
+ criteria: defaultOptions,
94
+ },
95
+ };
96
+ }
97
+ //# sourceMappingURL=stale-cleaner.js.map
@@ -5,10 +5,25 @@
5
5
  export interface MemoryStats {
6
6
  totalMemories: number;
7
7
  byType: Record<string, number>;
8
+ totalNotes: number;
9
+ notesByCategory: Record<string, number>;
10
+ totalLearnings: number;
11
+ learningsByType: Record<string, number>;
12
+ totalLinks: number;
8
13
  oldestMemory?: string;
9
14
  newestMemory?: string;
10
15
  projectPath: string;
11
16
  mode: string;
17
+ signal?: {
18
+ captured: number;
19
+ suppressed: number;
20
+ sessionOnly: number;
21
+ durable: number;
22
+ durableWithRaw: number;
23
+ tokensSaved: number;
24
+ placeRouted: number;
25
+ graphEnriched: number;
26
+ };
12
27
  }
13
28
  /**
14
29
  * Get memory statistics for a project
@@ -5,8 +5,9 @@
5
5
  import { getDb } from '../../db/index.js';
6
6
  import { getSchema } from '../../db/schema.js';
7
7
  import { config } from '../../config.js';
8
- import { getProjectByPath } from '../../core/projects.js';
9
- import { createDatabaseClient } from '../../core/database.js';
8
+ import { ensureProject } from '../../core/projects.js';
9
+ import { createDatabaseClient } from '../storage/database.js';
10
+ import { getProjectSignalStats } from '../session/working-set.js';
10
11
  /**
11
12
  * Get memory statistics for a project
12
13
  */
@@ -19,28 +20,36 @@ export async function getMemoryStats(projectPath = process.cwd()) {
19
20
  throw new Error(`Database unavailable: ${error instanceof Error ? error.message : 'Unknown error'}`);
20
21
  }
21
22
  const schema = await getSchema();
22
- const project = await getProjectByPath(projectPath);
23
+ const project = await ensureProject(projectPath);
24
+ if (!project) {
25
+ throw new Error(`Project not found: ${projectPath}`);
26
+ }
23
27
  const stats = {
24
28
  totalMemories: 0,
25
29
  byType: {},
30
+ totalNotes: 0,
31
+ notesByCategory: {},
32
+ totalLearnings: 0,
33
+ learningsByType: {},
34
+ totalLinks: 0,
26
35
  projectPath,
27
- mode: config.isTeamMode ? 'team' : 'local'
36
+ mode: config.isTeamMode ? 'team' : 'local',
28
37
  };
29
38
  try {
30
39
  // Count total memories
31
40
  const countResult = await db
32
41
  .select({ count: schema.memories.id })
33
42
  .from(schema.memories)
34
- .where(project ? eq(schema.memories.projectId, project.id) : undefined);
43
+ .where(eq(schema.memories.projectId, project.id));
35
44
  stats.totalMemories = countResult.length;
36
45
  // Count by type
37
46
  if (config.isTeamMode) {
38
47
  // PostgreSQL - use raw query for GROUP BY
39
- const typeCounts = await db.execute(sql `
40
- SELECT type, COUNT(*) as count
41
- FROM memories
42
- ${project ? sql `WHERE project_id = ${project.id}` : sql ``}
43
- GROUP BY type
48
+ const typeCounts = await db.execute(sql `
49
+ SELECT type, COUNT(*) as count
50
+ FROM memories
51
+ ${sql `WHERE project_id = ${project.id}`}
52
+ GROUP BY type
44
53
  `);
45
54
  for (const row of typeCounts.rows) {
46
55
  stats.byType[row.type] = Number(row.count);
@@ -51,7 +60,7 @@ export async function getMemoryStats(projectPath = process.cwd()) {
51
60
  const allMemories = await db
52
61
  .select({ type: schema.memories.type })
53
62
  .from(schema.memories)
54
- .where(project ? eq(schema.memories.projectId, project.id) : undefined);
63
+ .where(eq(schema.memories.projectId, project.id));
55
64
  for (const mem of allMemories) {
56
65
  const type = mem.type || 'unknown';
57
66
  stats.byType[type] = (stats.byType[type] || 0) + 1;
@@ -61,13 +70,13 @@ export async function getMemoryStats(projectPath = process.cwd()) {
61
70
  const oldest = await db
62
71
  .select({ createdAt: schema.memories.createdAt })
63
72
  .from(schema.memories)
64
- .where(project ? eq(schema.memories.projectId, project.id) : undefined)
73
+ .where(eq(schema.memories.projectId, project.id))
65
74
  .orderBy(asc(schema.memories.createdAt))
66
75
  .limit(1);
67
76
  const newest = await db
68
77
  .select({ createdAt: schema.memories.createdAt })
69
78
  .from(schema.memories)
70
- .where(project ? eq(schema.memories.projectId, project.id) : undefined)
79
+ .where(eq(schema.memories.projectId, project.id))
71
80
  .orderBy(desc(schema.memories.createdAt))
72
81
  .limit(1);
73
82
  if (oldest.length > 0 && oldest[0].createdAt) {
@@ -76,11 +85,58 @@ export async function getMemoryStats(projectPath = process.cwd()) {
76
85
  if (newest.length > 0 && newest[0].createdAt) {
77
86
  stats.newestMemory = newest[0].createdAt;
78
87
  }
88
+ // Learnings
89
+ const allLearnings = await db
90
+ .select({ category: schema.learnings.category, type: schema.learnings.type })
91
+ .from(schema.learnings)
92
+ .where(eq(schema.learnings.projectId, project.id));
93
+ stats.totalNotes = allLearnings.length;
94
+ for (const obs of allLearnings) {
95
+ const cat = obs.category || 'uncategorized';
96
+ stats.notesByCategory[cat] = (stats.notesByCategory[cat] || 0) + 1;
97
+ }
98
+ // Learnings by type
99
+ const learningTypes = ['success', 'failure', 'fix', 'insight'];
100
+ const learningRecords = allLearnings.filter((o) => {
101
+ const type = o.type || '';
102
+ return learningTypes.includes(type.toLowerCase());
103
+ });
104
+ stats.totalLearnings = learningRecords.length;
105
+ // Count by type
106
+ for (const obs of learningRecords) {
107
+ const type = obs.type || 'unknown';
108
+ stats.learningsByType[type] = (stats.learningsByType[type] || 0) + 1;
109
+ }
110
+ // Links
111
+ // Links are scoped via their associated memories
112
+ if (config.isTeamMode) {
113
+ // PostgreSQL - use raw query to join through memories
114
+ const linksCount = await db.execute(sql `
115
+ SELECT COUNT(*) as count FROM memory_associations ma
116
+ JOIN memories m1 ON ma.from_memory_id = m1.id
117
+ JOIN memories m2 ON ma.to_memory_id = m2.id
118
+ ${project ? sql `WHERE m1.project_id = ${project.id} OR m2.project_id = ${project.id}` : sql ``}
119
+ `);
120
+ stats.totalLinks = Number(linksCount.rows[0]?.count || 0);
121
+ }
122
+ else {
123
+ // SQLite - get all and filter in memory
124
+ const allLinks = await db
125
+ .select({
126
+ fromProjectId: schema.memories.projectId,
127
+ toProjectId: schema.memories.projectId
128
+ })
129
+ .from(schema.memoryAssociations)
130
+ .innerJoin(schema.memories, eq(schema.memoryAssociations.fromMemoryId, schema.memories.id))
131
+ .where(project ? eq(schema.memories.projectId, project.id) : undefined);
132
+ stats.totalLinks = allLinks.length;
133
+ }
79
134
  }
80
135
  catch (error) {
81
136
  // Return empty stats on error
82
137
  console.error('Error getting memory stats:', error);
83
138
  }
139
+ stats.signal = await getProjectSignalStats(projectPath);
84
140
  return stats;
85
141
  }
86
142
  import { eq, sql, asc, desc } from 'drizzle-orm';
@@ -16,6 +16,10 @@ import { parseTemporalFacts } from './temporal-parser.js';
16
16
  export async function checkTemporalValidity(memoryId) {
17
17
  try {
18
18
  const db = await getDb();
19
+ if (!db) {
20
+ // Graceful fallback when database is unavailable
21
+ return { isValid: true, confidence: 0.5 };
22
+ }
19
23
  const schema = await getSchema();
20
24
  const memories = await db
21
25
  .select()
@@ -75,6 +79,10 @@ export async function supersedeOldTemporalFacts(newMemoryId, content, projectId)
75
79
  };
76
80
  try {
77
81
  const db = await getDb();
82
+ if (!db) {
83
+ // Graceful fallback when database is unavailable
84
+ return result;
85
+ }
78
86
  const schema = await getSchema();
79
87
  // Parse temporal facts from new content
80
88
  const temporalFacts = await parseTemporalFacts(content);
@@ -180,6 +188,10 @@ export async function cleanupExpiredTemporalFacts(projectId) {
180
188
  let expiredCount = 0;
181
189
  try {
182
190
  const db = await getDb();
191
+ if (!db) {
192
+ // Graceful fallback when database is unavailable
193
+ return 0;
194
+ }
183
195
  const schema = await getSchema();
184
196
  const now = new Date();
185
197
  const whereClause = projectId
@@ -217,6 +229,15 @@ export async function cleanupExpiredTemporalFacts(projectId) {
217
229
  export async function getTemporalFactsStats(projectId) {
218
230
  try {
219
231
  const db = await getDb();
232
+ if (!db) {
233
+ // Graceful fallback when database is unavailable
234
+ return {
235
+ totalTemporalFacts: 0,
236
+ validFacts: 0,
237
+ expiredFacts: 0,
238
+ supersededFacts: 0,
239
+ };
240
+ }
220
241
  const schema = await getSchema();
221
242
  const now = new Date();
222
243
  const whereClause = projectId
@@ -6,9 +6,16 @@ export interface MemorySignals {
6
6
  preference: boolean;
7
7
  workflowRule: boolean;
8
8
  lesson: boolean;
9
+ note: boolean;
10
+ important: boolean;
11
+ hack: boolean;
12
+ why: boolean;
13
+ todo: boolean;
14
+ fixme: boolean;
9
15
  };
10
- suggestedType: 'observation' | 'fact' | 'decision' | 'context' | 'preference';
16
+ suggestedType: 'observation' | 'fact' | 'decision' | 'context' | 'preference' | 'task';
11
17
  priority: 'normal' | 'high';
18
+ confidence: 'certain' | 'speculative' | 'inferred';
12
19
  }
13
20
  export declare function detectMemorySignals(content: string): MemorySignals;
14
21
  //# sourceMappingURL=trigger-detector.d.ts.map