squish-memory 1.1.5 → 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 (499) hide show
  1. package/.env.example +32 -16
  2. package/CHANGELOG.md +147 -0
  3. package/README.md +120 -78
  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 +19 -23
  11. package/config/mcp-remote-auth.json +3 -26
  12. package/config/mcp-universal.schema.json +5 -35
  13. package/config/settings.json +107 -52
  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/{dist/core/local-embeddings.js → core/embeddings/local-embeddings.ts} +12 -11
  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 +40 -17
  220. package/dist/config.js +150 -198
  221. package/dist/core/adapters/types.d.ts +13 -33
  222. package/dist/core/adapters/types.js +1 -1
  223. package/dist/core/agent-preferences.d.ts +16 -0
  224. package/dist/core/agent-preferences.js +124 -0
  225. package/dist/core/algorithms/safety/safety-checks.d.ts +1 -5
  226. package/dist/core/algorithms/types.d.ts +0 -8
  227. package/dist/core/associations.d.ts +3 -1
  228. package/dist/core/associations.js +37 -1
  229. package/dist/core/beliefs/decay.d.ts +27 -0
  230. package/dist/core/beliefs/decay.js +217 -0
  231. package/dist/core/beliefs/extractor.d.ts +9 -0
  232. package/dist/core/beliefs/extractor.js +113 -0
  233. package/dist/core/beliefs/store.d.ts +46 -0
  234. package/dist/core/beliefs/store.js +466 -0
  235. package/dist/core/beliefs/types.d.ts +28 -0
  236. package/dist/core/beliefs/types.js +2 -0
  237. package/dist/core/commands/mcp-server.d.ts +0 -1
  238. package/dist/core/commands/mcp-server.js +4 -737
  239. package/dist/core/commands/remember.d.ts +24 -0
  240. package/dist/core/commands/remember.js +144 -0
  241. package/dist/core/{toon.d.ts → compression.d.ts} +6 -4
  242. package/dist/core/{toon.js → compression.js} +8 -8
  243. package/dist/core/context/agent-context.js +1 -1
  244. package/dist/core/embeddings/embeddings.d.ts +29 -0
  245. package/dist/core/embeddings/embeddings.js +546 -0
  246. package/dist/core/embeddings/google-multimodal.js +6 -2
  247. package/dist/core/{local-embeddings.d.ts → embeddings/local-embeddings.d.ts} +1 -1
  248. package/dist/core/embeddings/local-embeddings.js +11 -0
  249. package/dist/core/embeddings/qmd-client.js +1 -1
  250. package/dist/core/embeddings/transformers-local.d.ts +64 -0
  251. package/dist/core/embeddings/transformers-local.js +213 -0
  252. package/dist/core/embeddings.d.ts +1 -28
  253. package/dist/core/embeddings.js +2 -453
  254. package/dist/core/graph/entity-deduplicator.d.ts +24 -0
  255. package/dist/core/graph/entity-deduplicator.js +183 -0
  256. package/dist/core/graph/graph-builder.d.ts +46 -0
  257. package/dist/core/graph/graph-builder.js +174 -0
  258. package/dist/core/graph/graph-traversal.d.ts +80 -0
  259. package/dist/core/graph/graph-traversal.js +315 -0
  260. package/dist/core/graph/index.d.ts +19 -0
  261. package/dist/core/graph/index.js +13 -0
  262. package/dist/core/graph/llm-entity-extractor.d.ts +49 -0
  263. package/dist/core/graph/llm-entity-extractor.js +313 -0
  264. package/dist/core/graph/multi-hop-retrieval.d.ts +48 -0
  265. package/dist/core/graph/multi-hop-retrieval.js +215 -0
  266. package/dist/core/graph/relationship-extractor.d.ts +48 -0
  267. package/dist/core/graph/relationship-extractor.js +351 -0
  268. package/dist/core/hooks/agent-hooks.d.ts +10 -1
  269. package/dist/core/hooks/agent-hooks.js +301 -24
  270. package/dist/core/hot-cache.d.ts +86 -0
  271. package/dist/core/hot-cache.js +285 -0
  272. package/dist/core/index.d.ts +9 -9
  273. package/dist/core/index.js +9 -12
  274. package/dist/core/ingestion/core-memory.d.ts +2 -2
  275. package/dist/core/ingestion/core-memory.js +3 -3
  276. package/dist/core/ingestion/learnings.js +3 -0
  277. package/dist/core/ingestion/signal-engine.d.ts +41 -0
  278. package/dist/core/ingestion/signal-engine.js +201 -0
  279. package/dist/core/{obsidian-vault.d.ts → integrations/obsidian-vault.d.ts} +2 -1
  280. package/dist/core/{obsidian-vault.js → integrations/obsidian-vault.js} +69 -7
  281. package/dist/core/lib/parse-embedding.d.ts +9 -0
  282. package/dist/core/lib/parse-embedding.js +58 -0
  283. package/dist/core/lib/schemas.d.ts +57 -54
  284. package/dist/core/lib/types.d.ts +45 -0
  285. package/dist/core/lib/types.js +6 -0
  286. package/dist/core/lib/utils.d.ts +4 -0
  287. package/dist/core/lib/utils.js +55 -0
  288. package/dist/core/lifecycle.d.ts +0 -1
  289. package/dist/core/lifecycle.js +13 -23
  290. package/dist/core/logger.d.ts +1 -0
  291. package/dist/core/logger.js +14 -8
  292. package/dist/core/mcp/tools.d.ts +0 -2
  293. package/dist/core/mcp/tools.js +0 -87
  294. package/dist/core/mcp/types.d.ts +25 -253
  295. package/dist/core/mcp/types.js +2 -2
  296. package/dist/core/memory/categorizer.js +1 -0
  297. package/dist/core/memory/consolidation.js +2 -28
  298. package/dist/core/memory/entity-extractor.d.ts +4 -0
  299. package/dist/core/memory/entity-extractor.js +30 -16
  300. package/dist/core/memory/explain.d.ts +18 -0
  301. package/dist/core/memory/explain.js +92 -0
  302. package/dist/core/memory/fact-deriver.d.ts +31 -0
  303. package/dist/core/memory/fact-deriver.js +236 -0
  304. package/dist/core/memory/hybrid-retrieval.d.ts +14 -16
  305. package/dist/core/memory/hybrid-retrieval.js +25 -127
  306. package/dist/core/memory/hybrid-scorer.js +6 -23
  307. package/dist/core/memory/hybrid-search.d.ts +10 -7
  308. package/dist/core/memory/hybrid-search.js +458 -221
  309. package/dist/core/memory/importance.d.ts +0 -17
  310. package/dist/core/memory/importance.js +1 -58
  311. package/dist/core/memory/index.d.ts +1 -0
  312. package/dist/core/memory/index.js +1 -0
  313. package/dist/core/memory/memories.d.ts +13 -17
  314. package/dist/core/memory/memories.js +78 -75
  315. package/dist/core/memory/memory-lifecycle.d.ts +2 -2
  316. package/dist/core/memory/memory-lifecycle.js +10 -18
  317. package/dist/core/memory/normalization.d.ts +1 -16
  318. package/dist/core/memory/path-strengthener.d.ts +39 -0
  319. package/dist/core/memory/path-strengthener.js +150 -0
  320. package/dist/core/memory/query-processor.js +37 -3
  321. package/dist/core/memory/retrieval-feedback.d.ts +70 -0
  322. package/dist/core/memory/retrieval-feedback.js +213 -0
  323. package/dist/core/memory/stale-cleaner.d.ts +26 -0
  324. package/dist/core/memory/stale-cleaner.js +97 -0
  325. package/dist/core/memory/stats.d.ts +10 -0
  326. package/dist/core/memory/stats.js +8 -3
  327. package/dist/core/memory/trigger-detector.d.ts +8 -1
  328. package/dist/core/memory/trigger-detector.js +42 -5
  329. package/dist/core/places/index.d.ts +1 -1
  330. package/dist/core/places/index.js +1 -1
  331. package/dist/core/places/places.d.ts +13 -13
  332. package/dist/core/places/places.js +27 -27
  333. package/dist/core/places/rules.js +23 -23
  334. package/dist/core/places/walking.d.ts +3 -3
  335. package/dist/core/places/walking.js +7 -7
  336. package/dist/core/projects.js +8 -0
  337. package/dist/core/runtime/trust-report.d.ts +102 -0
  338. package/dist/core/runtime/trust-report.js +107 -0
  339. package/dist/core/runtime/trust-state.d.ts +12 -0
  340. package/dist/core/runtime/trust-state.js +309 -0
  341. package/dist/core/scheduler/cron-scheduler.d.ts +1 -1
  342. package/dist/core/scheduler/cron-scheduler.js +164 -3
  343. package/dist/core/scheduler/job-runner.js +1 -1
  344. package/dist/core/search/qmd-wrapper.d.ts +36 -0
  345. package/dist/core/search/qmd-wrapper.js +58 -0
  346. package/dist/core/session/auto-load.js +28 -3
  347. package/dist/core/session/entity-tracker.d.ts +62 -0
  348. package/dist/core/session/entity-tracker.js +287 -0
  349. package/dist/core/session/reference-resolver.d.ts +26 -0
  350. package/dist/core/session/reference-resolver.js +121 -0
  351. package/dist/core/session/self-iteration-job.d.ts +15 -0
  352. package/dist/core/session/self-iteration-job.js +163 -58
  353. package/dist/core/session/working-set.d.ts +50 -0
  354. package/dist/core/session/working-set.js +212 -0
  355. package/dist/core/snapshots/creation.d.ts +2 -8
  356. package/dist/core/snapshots/creation.js +3 -12
  357. package/dist/core/utils/summarization-helpers.d.ts +0 -4
  358. package/dist/core/utils/summarization-helpers.js +1 -6
  359. package/dist/db/bootstrap.d.ts +2 -0
  360. package/dist/db/bootstrap.js +229 -280
  361. package/dist/db/drizzle/schema-sqlite.d.ts +702 -1
  362. package/dist/db/drizzle/schema-sqlite.js +83 -4
  363. package/dist/db/drizzle/schema.d.ts +653 -1
  364. package/dist/db/drizzle/schema.js +93 -4
  365. package/dist/db/migrations/associations.d.ts +6 -0
  366. package/dist/db/migrations/associations.js +29 -0
  367. package/dist/db/migrations/beliefs.d.ts +10 -0
  368. package/dist/db/migrations/beliefs.js +76 -0
  369. package/dist/db/migrations/core-memory.d.ts +6 -0
  370. package/dist/db/migrations/core-memory.js +29 -0
  371. package/dist/db/migrations/fts.d.ts +6 -0
  372. package/dist/db/migrations/fts.js +52 -0
  373. package/dist/db/migrations/index.d.ts +25 -0
  374. package/dist/db/migrations/index.js +51 -0
  375. package/dist/db/migrations/indexes.d.ts +6 -0
  376. package/dist/db/migrations/indexes.js +30 -0
  377. package/dist/db/migrations/learnings.d.ts +7 -0
  378. package/dist/db/migrations/learnings.js +26 -0
  379. package/dist/db/migrations/maintenance.d.ts +6 -0
  380. package/dist/db/migrations/maintenance.js +61 -0
  381. package/dist/db/migrations/memories.d.ts +7 -0
  382. package/dist/db/migrations/memories.js +16 -0
  383. package/dist/db/migrations/memory-places.d.ts +6 -0
  384. package/dist/db/migrations/memory-places.js +29 -0
  385. package/dist/db/migrations/places.d.ts +6 -0
  386. package/dist/db/migrations/places.js +43 -0
  387. package/dist/db/migrations/projects.d.ts +3 -0
  388. package/dist/db/migrations/projects.js +13 -0
  389. package/dist/db/migrations/tier-conversion.d.ts +7 -0
  390. package/dist/db/migrations/tier-conversion.js +20 -0
  391. package/dist/db/schema/beliefs.d.ts +9 -0
  392. package/dist/db/schema/beliefs.js +46 -0
  393. package/dist/db/schema/generator.d.ts +38 -0
  394. package/dist/db/schema/generator.js +108 -0
  395. package/dist/db/schema/index.d.ts +19 -20
  396. package/dist/db/schema/index.js +25 -79
  397. package/dist/db/schema/learnings.d.ts +7 -0
  398. package/dist/db/schema/learnings.js +30 -0
  399. package/dist/db/schema/memories.d.ts +7 -0
  400. package/dist/db/schema/memories.js +81 -0
  401. package/dist/db/schema/projects.d.ts +4 -0
  402. package/dist/db/schema/projects.js +31 -0
  403. package/dist/packages/mcp/src/index.d.ts +3 -0
  404. package/dist/packages/mcp/src/index.js +733 -0
  405. package/mcp.json.example +8 -11
  406. package/package.json +57 -76
  407. package/packages/cli/package.json +22 -0
  408. package/packages/cli/src/commands/clean.ts +68 -0
  409. package/packages/cli/src/commands/context.ts +79 -0
  410. package/packages/cli/src/commands/doctor.ts +357 -0
  411. package/packages/cli/src/commands/forget.ts +72 -0
  412. package/packages/cli/src/commands/health.ts +36 -0
  413. package/packages/cli/src/commands/inspect.ts +41 -0
  414. package/packages/cli/src/commands/link.ts +50 -0
  415. package/packages/cli/src/commands/migrate.ts +93 -0
  416. package/packages/cli/src/commands/recall.ts +99 -0
  417. package/packages/cli/src/commands/recent.ts +57 -0
  418. package/packages/cli/src/commands/remember.ts +139 -0
  419. package/packages/cli/src/commands/run.ts +58 -0
  420. package/packages/cli/src/commands/stale.ts +43 -0
  421. package/packages/cli/src/commands/stats.ts +42 -0
  422. package/packages/cli/src/index.ts +57 -0
  423. package/packages/cli/tsconfig.json +24 -0
  424. package/packages/mcp/package.json +26 -0
  425. package/packages/mcp/src/index.ts +877 -0
  426. package/packages/mcp/tsconfig.json +20 -0
  427. package/skills/squish-memory/SKILL.md +38 -35
  428. package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
  429. package/skills/squish-memory/references/claude-desktop.json +12 -0
  430. package/skills/squish-memory/references/openclaw.json +13 -0
  431. package/skills/squish-memory/references/opencode.json +14 -0
  432. package/config/hooks/claude-code-hooks.json +0 -39
  433. package/config/hooks/cursor-hooks.json +0 -30
  434. package/config/hooks/opencode-hooks.json +0 -30
  435. package/config/hooks/windsurf-hooks.json +0 -30
  436. package/config/mcp-cli-fallback-policy.json +0 -22
  437. package/config/mcp.json +0 -38
  438. package/config/plugin-manifest.json +0 -101
  439. package/config/plugin-manifest.schema.json +0 -244
  440. package/config/plugin.json +0 -32
  441. package/config/remote-memory-policy.json +0 -32
  442. package/core/commands/context-paging.md +0 -51
  443. package/core/commands/context-status.md +0 -22
  444. package/core/commands/context.md +0 -5
  445. package/core/commands/core-memory.md +0 -56
  446. package/core/commands/health.md +0 -5
  447. package/core/commands/init.md +0 -39
  448. package/core/commands/merge.md +0 -113
  449. package/core/commands/recall.md +0 -5
  450. package/core/commands/remember.md +0 -11
  451. package/core/commands/search.md +0 -10
  452. package/dist/core/commands/managed-sync.d.ts +0 -10
  453. package/dist/core/commands/managed-sync.js +0 -64
  454. package/dist/core/external-folder/index.d.ts +0 -102
  455. package/dist/core/external-folder/index.js +0 -294
  456. package/dist/core/namespaces/index.d.ts +0 -71
  457. package/dist/core/namespaces/index.js +0 -305
  458. package/dist/core/namespaces/uri-parser.d.ts +0 -31
  459. package/dist/core/namespaces/uri-parser.js +0 -74
  460. package/dist/core/search/qmd-search.d.ts +0 -61
  461. package/dist/core/search/qmd-search.js +0 -178
  462. package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
  463. package/dist/core/session-hooks/self-iteration-job.js +0 -282
  464. package/dist/core/session-hooks/session-hooks.d.ts +0 -18
  465. package/dist/core/session-hooks/session-hooks.js +0 -58
  466. package/dist/core/snapshots.d.ts +0 -29
  467. package/dist/core/snapshots.js +0 -220
  468. package/dist/core/sync/qmd-sync.d.ts +0 -94
  469. package/dist/core/sync/qmd-sync.js +0 -201
  470. package/dist/index.d.ts +0 -7
  471. package/dist/index.js +0 -1677
  472. package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
  473. package/dist/webui/server.d.ts +0 -5
  474. package/dist/webui/server.js +0 -642
  475. package/generated/mcp/manifest.json +0 -23
  476. package/generated/mcp/mcp-servers.json +0 -25
  477. package/generated/mcp/mcporter.json +0 -34
  478. package/generated/mcp/openclaw-memory-qmd.json +0 -17
  479. package/generated/mcp/runtime.json +0 -12
  480. package/scripts/README.md +0 -60
  481. package/scripts/build-release.sh +0 -36
  482. package/scripts/check-secrets.js +0 -132
  483. package/scripts/copy-runtime-assets.mjs +0 -26
  484. package/scripts/generate-mcp.mjs +0 -264
  485. package/scripts/github-release.sh +0 -77
  486. package/scripts/init-dirs.mjs +0 -13
  487. package/scripts/install-claude-code.sh +0 -85
  488. package/scripts/install-cursor.sh +0 -56
  489. package/scripts/install-hooks.sh +0 -73
  490. package/scripts/install-interactive.mjs +0 -357
  491. package/scripts/install-opencode.sh +0 -75
  492. package/scripts/install-plugin.mjs +0 -415
  493. package/scripts/install-windsurf.sh +0 -67
  494. package/scripts/remote-preflight.mjs +0 -62
  495. package/scripts/squish-fallback.mjs +0 -132
  496. package/scripts/test-interactive.mjs +0 -131
  497. package/scripts/verify-mcp.mjs +0 -214
  498. package/skills/squish-memory/scripts/install.mjs +0 -335
  499. package/skills/squish-memory/write_skill.js +0 -2
@@ -0,0 +1,372 @@
1
+ /**
2
+ * Memory Consolidation System
3
+ * Implements experience replay and memory consolidation
4
+ */
5
+
6
+ import { randomUUID } from 'crypto';
7
+ import { eq, inArray, and } from 'drizzle-orm';
8
+ import { createDatabaseClient } from '../storage/database.js';
9
+ import { getDb } from '../../db/index.js';
10
+ import { getSchema } from '../../db/schema.js';
11
+ import { getEmbedding } from '../../core/embeddings.js';
12
+ import { cosineSimilarity } from '../utils/vector-operations.js';
13
+ import { parseEmbedding } from '../lib/parse-embedding.js';
14
+ import { getLowImportanceMemories } from './importance.js';
15
+ import { rememberMemory } from './memories.js';
16
+ import { logger } from '../logger.js';
17
+
18
+ export interface ConsolidationOptions {
19
+ projectId: string;
20
+ minAge?: number; // days - minimum age for consolidation
21
+ maxImportance?: number; // 0-100 - maximum importance to consolidate
22
+ minClusterSize?: number; // minimum memories in a cluster to consolidate
23
+ similarityThreshold?: number; // 0-1 - minimum similarity to cluster
24
+ limit?: number; // max memories to process
25
+ }
26
+
27
+ export interface ConsolidationResult {
28
+ consolidatedMemoryId: string;
29
+ sourceMemoryIds: string[];
30
+ clusterSize: number;
31
+ summary: string;
32
+ }
33
+
34
+ export interface ClusterResult {
35
+ memories: any[];
36
+ similarity: number;
37
+ representativeId: string;
38
+ }
39
+
40
+ /**
41
+ * Main consolidation function - consolidates low-importance old memories
42
+ */
43
+ export async function consolidateMemories(
44
+ options: ConsolidationOptions
45
+ ): Promise<ConsolidationResult[]> {
46
+ const {
47
+ projectId,
48
+ minAge = 90,
49
+ maxImportance = 30,
50
+ minClusterSize = 3,
51
+ similarityThreshold = 0.7,
52
+ limit = 100,
53
+ } = options;
54
+
55
+ // Get low-importance, old memories
56
+ const candidates = await getLowImportanceMemories(projectId, {
57
+ minAge,
58
+ maxImportance,
59
+ limit,
60
+ });
61
+
62
+ if (candidates.length < minClusterSize) {
63
+ logger.debug('Not enough memories to consolidate', {
64
+ count: candidates.length,
65
+ minClusterSize,
66
+ });
67
+ return [];
68
+ }
69
+
70
+ // Cluster memories by similarity
71
+ const clusters = await clusterMemoriesBySimilarity(candidates, {
72
+ minClusterSize,
73
+ similarityThreshold,
74
+ });
75
+
76
+ logger.info(`Found ${clusters.length} memory clusters for consolidation`);
77
+
78
+ const results: ConsolidationResult[] = [];
79
+
80
+ // Consolidate each cluster
81
+ for (const cluster of clusters) {
82
+ try {
83
+ const result = await consolidateCluster(cluster);
84
+ results.push(result);
85
+ } catch (error) {
86
+ logger.error('Failed to consolidate cluster', error);
87
+ }
88
+ }
89
+
90
+ return results;
91
+ }
92
+
93
+ /**
94
+ * Cluster memories by similarity using a simple greedy algorithm
95
+ */
96
+ async function clusterMemoriesBySimilarity(
97
+ memories: any[],
98
+ options: {
99
+ minClusterSize?: number;
100
+ similarityThreshold?: number;
101
+ } = {}
102
+ ): Promise<ClusterResult[]> {
103
+ const { minClusterSize = 3, similarityThreshold = 0.7 } = options;
104
+
105
+ const clustered = new Set<string>();
106
+ const clusters: ClusterResult[] = [];
107
+
108
+ for (const memory of memories) {
109
+ if (clustered.has(memory.id)) continue;
110
+
111
+ // Find similar memories
112
+ const similar: any[] = [memory];
113
+ const similarities: number[] = [1];
114
+
115
+ for (const other of memories) {
116
+ if (other.id === memory.id) continue;
117
+ if (clustered.has(other.id)) continue;
118
+
119
+ // Calculate similarity using embeddings
120
+ const sim = await calculateMemorySimilarity(memory, other);
121
+ if (sim >= similarityThreshold) {
122
+ similar.push(other);
123
+ similarities.push(sim);
124
+ clustered.add(other.id);
125
+ }
126
+ }
127
+
128
+ clustered.add(memory.id);
129
+
130
+ // Only keep clusters that meet minimum size
131
+ if (similar.length >= minClusterSize) {
132
+ const avgSimilarity = similarities.reduce((a, b) => a + b, 0) / similarities.length;
133
+ clusters.push({
134
+ memories: similar as any,
135
+ similarity: avgSimilarity,
136
+ representativeId: memory.id,
137
+ });
138
+ }
139
+ }
140
+
141
+ return clusters;
142
+ }
143
+
144
+ /**
145
+ * Calculate similarity between two memories using their embeddings
146
+ */
147
+ async function calculateMemorySimilarity(
148
+ memory1: any,
149
+ memory2: any
150
+ ): Promise<number> {
151
+ let embedding1 = parseEmbedding(memory1.embedding) ?? parseEmbedding(memory1.embedding_json);
152
+ let embedding2 = parseEmbedding(memory2.embedding) ?? parseEmbedding(memory2.embedding_json);
153
+
154
+ if (!embedding1 || !embedding2) {
155
+ // Fallback to text similarity if embeddings not available
156
+ return textSimilarity(memory1.content, memory2.content);
157
+ }
158
+
159
+ return cosineSimilarity(embedding1, embedding2);
160
+ }
161
+
162
+ /**
163
+ * Simple text similarity as fallback (Jaccard similarity of word sets)
164
+ */
165
+ function textSimilarity(text1: string, text2: string): number {
166
+ const words1 = new Set(text1.toLowerCase().split(/\s+/).filter(w => w.length > 2));
167
+ const words2 = new Set(text2.toLowerCase().split(/\s+/).filter(w => w.length > 2));
168
+
169
+ if (words1.size === 0 && words2.size === 0) return 1;
170
+ if (words1.size === 0 || words2.size === 0) return 0;
171
+
172
+ const intersection = new Set([...words1].filter(w => words2.has(w)));
173
+ const union = new Set([...words1, ...words2]);
174
+
175
+ return intersection.size / union.size;
176
+ }
177
+
178
+ /**
179
+ * Consolidate a cluster of memories into a single summary memory
180
+ */
181
+ async function consolidateCluster(cluster: ClusterResult): Promise<ConsolidationResult> {
182
+ const { memories } = cluster;
183
+ const sourceMemoryIds = memories.map((m: any) => m.id);
184
+
185
+ // Generate extractive summary
186
+ const summary = generateExtractiveSummary(memories);
187
+
188
+ // Create consolidated memory
189
+ const consolidated = await rememberMemory({
190
+ content: summary,
191
+ type: 'context',
192
+ metadata: {
193
+ consolidatedFrom: sourceMemoryIds,
194
+ consolidatedAt: new Date().toISOString(),
195
+ clusterSize: memories.length,
196
+ avgSimilarity: cluster.similarity,
197
+ },
198
+ tags: ['consolidated'],
199
+ });
200
+
201
+ // Mark originals as consolidated
202
+ const db = createDatabaseClient(await getDb());
203
+ const schema = await getSchema();
204
+
205
+ await db
206
+ .update(schema.memories)
207
+ .set({
208
+ isConsolidated: 1,
209
+ consolidatedInto: consolidated.id,
210
+ consolidatedAt: new Date(),
211
+ })
212
+ .where(inArray(schema.memories.id, sourceMemoryIds));
213
+
214
+ logger.info('Consolidated memory cluster', {
215
+ consolidatedId: consolidated.id,
216
+ sourceCount: memories.length,
217
+ sourceIds: sourceMemoryIds,
218
+ });
219
+
220
+ return {
221
+ consolidatedMemoryId: consolidated.id,
222
+ sourceMemoryIds,
223
+ clusterSize: memories.length,
224
+ summary,
225
+ };
226
+ }
227
+
228
+ /**
229
+ * Generate extractive summary from a cluster of memories
230
+ * Uses text processing without requiring an LLM
231
+ */
232
+ function generateExtractiveSummary(memories: any[]): string {
233
+ // Group by memory type
234
+ const byType = new Map<string, any[]>();
235
+ for (const m of memories) {
236
+ const type = m.type ?? 'observation';
237
+ if (!byType.has(type)) {
238
+ byType.set(type, []);
239
+ }
240
+ byType.get(type)!.push(m);
241
+ }
242
+
243
+ const summaryParts: string[] = [];
244
+
245
+ // Add header with count
246
+ summaryParts.push(`Consolidated from ${memories.length} memories:`);
247
+
248
+ // Summarize each type
249
+ for (const [type, typeMemories] of byType.entries()) {
250
+ if (typeMemories.length === 1) {
251
+ summaryParts.push(`\n- ${type}: ${truncate(typeMemories[0].content, 100)}`);
252
+ } else {
253
+ summaryParts.push(`\n- ${type}s (${typeMemories.length}):`);
254
+ // Extract key phrases from each memory
255
+ for (const m of typeMemories.slice(0, 3)) {
256
+ summaryParts.push(` - ${truncate(m.content, 80)}`);
257
+ }
258
+ if (typeMemories.length > 3) {
259
+ summaryParts.push(` - ...and ${typeMemories.length - 3} more`);
260
+ }
261
+ }
262
+ }
263
+
264
+ return summaryParts.join('\n');
265
+ }
266
+
267
+ /**
268
+ * Truncate text to maximum length
269
+ */
270
+ function truncate(text: string, maxLength: number): string {
271
+ if (text.length <= maxLength) return text;
272
+ return text.substring(0, maxLength - 3) + '...';
273
+ }
274
+
275
+ /**
276
+ * Reverse consolidation - restore original memories
277
+ * This allows undoing consolidation if needed
278
+ */
279
+ export async function reverseConsolidation(
280
+ consolidatedMemoryId: string
281
+ ): Promise<void> {
282
+ const db = createDatabaseClient(await getDb());
283
+ const schema = await getSchema();
284
+
285
+ // Get the consolidated memory
286
+ const consolidated = await db
287
+ .select()
288
+ .from(schema.memories)
289
+ .where(eq(schema.memories.id, consolidatedMemoryId))
290
+ .limit(1);
291
+
292
+ if (consolidated.length === 0) {
293
+ throw new Error(`Consolidated memory not found: ${consolidatedMemoryId}`);
294
+ }
295
+
296
+ const metadata = consolidated[0].metadata as any;
297
+ const sourceIds = metadata?.consolidatedFrom as string[] | undefined;
298
+
299
+ if (!sourceIds || sourceIds.length === 0) {
300
+ throw new Error('No source memories found in consolidated memory metadata');
301
+ }
302
+
303
+ // Restore original memories
304
+ await db
305
+ .update(schema.memories)
306
+ .set({
307
+ isConsolidated: 0,
308
+ consolidatedInto: null,
309
+ consolidatedAt: null,
310
+ })
311
+ .where(inArray(schema.memories.id, sourceIds));
312
+
313
+ // Delete the consolidated memory
314
+ await db
315
+ .delete(schema.memories)
316
+ .where(eq(schema.memories.id, consolidatedMemoryId));
317
+
318
+ logger.info('Reversed consolidation', {
319
+ consolidatedId: consolidatedMemoryId,
320
+ restoredCount: sourceIds.length,
321
+ });
322
+ }
323
+
324
+ /**
325
+ * Get consolidation statistics for a project
326
+ */
327
+ export async function getConsolidationStats(
328
+ projectId: string
329
+ ): Promise<{
330
+ totalMemories: number;
331
+ consolidatedMemories: number;
332
+ consolidationsCreated: number;
333
+ avgClusterSize: number;
334
+ }> {
335
+ const db = createDatabaseClient(await getDb());
336
+ const schema = await getSchema();
337
+
338
+ // Get all memories for project
339
+ const memories = await db
340
+ .select()
341
+ .from(schema.memories)
342
+ .where(eq(schema.memories.projectId, projectId))
343
+ .all();
344
+
345
+ const totalMemories = memories.length;
346
+ const consolidatedMemories = memories.filter((m: any) => m.isConsolidated).length;
347
+
348
+ // Get consolidation summaries (memories created by consolidation)
349
+ const consolidations = memories.filter((m: any) => {
350
+ const metadata = m.metadata as any;
351
+ return metadata?.consolidatedFrom && Array.isArray(metadata.consolidatedFrom);
352
+ });
353
+
354
+ const consolidationsCreated = consolidations.length;
355
+
356
+ // Calculate average cluster size
357
+ let totalClusterSize = 0;
358
+ for (const m of consolidations) {
359
+ const metadata = m.metadata as any;
360
+ totalClusterSize += metadata?.clusterSize || 0;
361
+ }
362
+ const avgClusterSize = consolidationsCreated > 0
363
+ ? totalClusterSize / consolidationsCreated
364
+ : 0;
365
+
366
+ return {
367
+ totalMemories,
368
+ consolidatedMemories,
369
+ consolidationsCreated,
370
+ avgClusterSize,
371
+ };
372
+ }
@@ -0,0 +1,75 @@
1
+ /** Context Collector - Collect recent conversation context for query rewriting */
2
+
3
+ import { logger } from '../logger.js';
4
+ import { getDb } from '../../db/index.js';
5
+ import { messages, conversations } from '../../db/drizzle/schema-sqlite.js';
6
+ import { eq, desc } from 'drizzle-orm';
7
+
8
+ export interface ContextMessage {
9
+ role: 'user' | 'assistant';
10
+ content: string;
11
+ createdAt: Date;
12
+ }
13
+
14
+ export async function collectRecentContext(
15
+ sessionId: string,
16
+ count: number = 5
17
+ ): Promise<ContextMessage[]> {
18
+ const db = await getDb();
19
+ if (!db) {
20
+ logger.warn('[ContextCollector] Database not available');
21
+ return [];
22
+ }
23
+
24
+ try {
25
+ const sqliteDb = db as any;
26
+ const [conversation] = await sqliteDb
27
+ .select()
28
+ .from(conversations)
29
+ .where(eq(conversations.sessionId, sessionId))
30
+ .orderBy(desc(conversations.startedAt))
31
+ .limit(1);
32
+
33
+ if (!conversation) {
34
+ logger.debug(`[ContextCollector] No conversation found for session ${sessionId}`);
35
+ return [];
36
+ }
37
+
38
+ const recentMessages = await sqliteDb
39
+ .select()
40
+ .from(messages)
41
+ .where(eq(messages.conversationId, conversation.id))
42
+ .orderBy(desc(messages.createdAt))
43
+ .limit(count);
44
+
45
+ const ordered = recentMessages.reverse();
46
+
47
+ return ordered.map((msg: typeof messages.$inferSelect) => ({
48
+ role: msg.role as 'user' | 'assistant',
49
+ content: msg.content,
50
+ createdAt: new Date(msg.createdAt ?? Date.now()),
51
+ }));
52
+ } catch (error) {
53
+ logger.error('[ContextCollector] Failed to collect context:', error);
54
+ return [];
55
+ }
56
+ }
57
+
58
+ export function formatContextForLLM(messages: ContextMessage[]): string {
59
+ if (messages.length === 0) return '';
60
+
61
+ return messages
62
+ .map(msg => `${msg.role === 'user' ? 'User' : 'Assistant'}: ${msg.content}`)
63
+ .join('\n\n');
64
+ }
65
+
66
+ export async function getLastUserMessages(
67
+ sessionId: string,
68
+ count: number = 3
69
+ ): Promise<string[]> {
70
+ const context = await collectRecentContext(sessionId, count * 2);
71
+ return context
72
+ .filter(msg => msg.role === 'user')
73
+ .slice(-count)
74
+ .map(msg => msg.content);
75
+ }