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,232 @@
1
+ /**
2
+ * Entity Deduplicator
3
+ *
4
+ * Deduplicates entities using embedding similarity and string matching.
5
+ * Critical for knowledge graph - prevents duplicate nodes for aliases like "AWS" / "Amazon Web Services".
6
+ */
7
+
8
+ import { eq, and, or, sql } from 'drizzle-orm';
9
+ import { getDb } from '../../db/index.js';
10
+ import { getSchema } from '../../db/schema.js';
11
+ import { getEmbedding } from '../embeddings.js';
12
+ import { cosineSimilarity } from '../utils/vector-operations.js';
13
+ import { parseEmbedding } from '../lib/parse-embedding.js';
14
+ import { logger } from '../logger.js';
15
+
16
+ export interface DeduplicationResult {
17
+ merged: number;
18
+ aliases: Array<{ from: string; to: string; similarity: number }>;
19
+ totalEntities: number;
20
+ uniqueEntities: number;
21
+ }
22
+
23
+ // Common entity aliases for normalization
24
+ const KNOWN_ALIASES: Record<string, string[]> = {
25
+ 'amazon web services': ['aws'],
26
+ 'aws': ['amazon web services'],
27
+ 'postgresql': ['postgres', 'pg'],
28
+ 'kubernetes': ['k8s'],
29
+ 'k8s': ['kubernetes'],
30
+ 'javascript': ['js'],
31
+ 'typescript': ['ts'],
32
+ 'node.js': ['nodejs', 'node'],
33
+ 'react.js': ['react'],
34
+ 'vue.js': ['vue'],
35
+ 'machine learning': ['ml'],
36
+ 'artificial intelligence': ['ai'],
37
+ 'large language model': ['llm'],
38
+ 'natural language processing': ['nlp'],
39
+ };
40
+
41
+ /**
42
+ * Find and merge duplicate entities in a project.
43
+ */
44
+ export async function deduplicateProjectEntities(
45
+ projectId: string,
46
+ options?: {
47
+ similarityThreshold?: number;
48
+ dryRun?: boolean;
49
+ }
50
+ ): Promise<DeduplicationResult> {
51
+ const { similarityThreshold = 0.85, dryRun = false } = options || {};
52
+ const db = await getDb();
53
+ const schema = await getSchema();
54
+
55
+ // Get all entities for the project
56
+ const entities = await (db as any)
57
+ .select()
58
+ .from(schema.entities)
59
+ .where(eq(schema.entities.projectId, projectId));
60
+
61
+ if (entities.length < 2) {
62
+ return {
63
+ merged: 0,
64
+ aliases: [],
65
+ totalEntities: entities.length,
66
+ uniqueEntities: entities.length,
67
+ };
68
+ }
69
+
70
+ const aliases: Array<{ from: string; to: string; similarity: number }> = [];
71
+ const merged = new Set<string>();
72
+ let mergeCount = 0;
73
+
74
+ // Compare each pair of entities
75
+ for (let i = 0; i < entities.length; i++) {
76
+ if (merged.has(entities[i].id)) continue;
77
+
78
+ for (let j = i + 1; j < entities.length; j++) {
79
+ if (merged.has(entities[j].id)) continue;
80
+
81
+ const similarity = await computeEntitySimilarity(entities[i], entities[j]);
82
+
83
+ if (similarity >= similarityThreshold) {
84
+ // Merge j into i (keep the one with more mentions)
85
+ const target = (entities[i].mentionCount || 0) >= (entities[j].mentionCount || 0)
86
+ ? entities[i]
87
+ : entities[j];
88
+ const source = target.id === entities[i].id ? entities[j] : entities[i];
89
+
90
+ aliases.push({
91
+ from: source.name,
92
+ to: target.name,
93
+ similarity,
94
+ });
95
+
96
+ if (!dryRun) {
97
+ await mergeEntities(source, target, db, schema);
98
+ }
99
+
100
+ merged.add(source.id);
101
+ mergeCount++;
102
+ }
103
+ }
104
+ }
105
+
106
+ logger.info('Entity deduplication completed', {
107
+ projectId,
108
+ totalEntities: entities.length,
109
+ merged: mergeCount,
110
+ dryRun,
111
+ });
112
+
113
+ return {
114
+ merged: mergeCount,
115
+ aliases,
116
+ totalEntities: entities.length,
117
+ uniqueEntities: entities.length - mergeCount,
118
+ };
119
+ }
120
+
121
+ /**
122
+ * Compute similarity between two entities.
123
+ * Uses a combination of string matching, known aliases, and embedding similarity.
124
+ */
125
+ async function computeEntitySimilarity(entity1: any, entity2: any): Promise<number> {
126
+ // Must be same type to be considered duplicates
127
+ if (entity1.type !== entity2.type) {
128
+ return 0;
129
+ }
130
+
131
+ const name1 = entity1.name.toLowerCase().trim();
132
+ const name2 = entity2.name.toLowerCase().trim();
133
+
134
+ // Exact match
135
+ if (name1 === name2) return 1.0;
136
+
137
+ // Check known aliases
138
+ const name1Aliases = KNOWN_ALIASES[name1] || [];
139
+ const name2Aliases = KNOWN_ALIASES[name2] || [];
140
+
141
+ if (name1Aliases.includes(name2) || name2Aliases.includes(name1)) {
142
+ return 0.99; // Very high confidence for known aliases
143
+ }
144
+
145
+ // String similarity (Jaccard on words)
146
+ const words1 = new Set(name1.split(/[\s._-]+/).filter((w: string) => w.length > 1));
147
+ const words2 = new Set(name2.split(/[\s._-]+/).filter((w: string) => w.length > 1));
148
+
149
+ const words1Arr = Array.from(words1);
150
+ const words2Arr = Array.from(words2);
151
+ const intersection = words1Arr.filter(w => words2.has(w));
152
+ const union = new Set([...words1Arr, ...words2Arr]);
153
+
154
+ if (words1.size > 0 && words2.size > 0) {
155
+ const jaccard = intersection.length / union.size;
156
+
157
+ if (jaccard >= 0.8) return jaccard;
158
+ }
159
+
160
+ // One contains the other (e.g., "React" in "React.js")
161
+ if (name1.includes(name2) || name2.includes(name1)) {
162
+ const shorter = name1.length < name2.length ? name1 : name2;
163
+ const longer = name1.length < name2.length ? name2 : name1;
164
+ // Only count as similar if the shorter name is a significant portion
165
+ if (shorter.length / longer.length >= 0.5) {
166
+ return 0.85;
167
+ }
168
+ }
169
+
170
+ // Embedding similarity (if available)
171
+ const embedding1 = parseEmbedding(entity1.embedding || entity1.embedding_json);
172
+ const embedding2 = parseEmbedding(entity2.embedding || entity2.embedding_json);
173
+
174
+ if (embedding1 && embedding2) {
175
+ const embSimilarity = cosineSimilarity(embedding1, embedding2);
176
+ if (embSimilarity >= similarityThreshold) {
177
+ return embSimilarity;
178
+ }
179
+ }
180
+
181
+ return 0;
182
+ }
183
+
184
+ /**
185
+ * Merge source entity into target entity.
186
+ * Updates all relations pointing to source to point to target instead.
187
+ */
188
+ async function mergeEntities(
189
+ source: any,
190
+ target: any,
191
+ db: any,
192
+ schema: any
193
+ ): Promise<void> {
194
+ // Update all relations pointing FROM source to point FROM target
195
+ await db
196
+ .update(schema.entityRelations)
197
+ .set({ fromEntityId: target.id })
198
+ .where(eq(schema.entityRelations.fromEntityId, source.id));
199
+
200
+ // Update all relations pointing TO source to point TO target
201
+ await db
202
+ .update(schema.entityRelations)
203
+ .set({ toEntityId: target.id })
204
+ .where(eq(schema.entityRelations.toEntityId, source.id));
205
+
206
+ // Add source name as alias to target
207
+ const existingAliases = Array.isArray(target.aliases) ? target.aliases as string[] : [];
208
+ const updatedAliases = [...new Set([...existingAliases, source.name])];
209
+
210
+ await db
211
+ .update(schema.entities)
212
+ .set({
213
+ aliases: updatedAliases as any,
214
+ mentionCount: (target.mentionCount || 0) + (source.mentionCount || 0),
215
+ updatedAt: new Date(),
216
+ })
217
+ .where(eq(schema.entities.id, target.id));
218
+
219
+ // Delete source entity
220
+ await db
221
+ .delete(schema.entities)
222
+ .where(eq(schema.entities.id, source.id));
223
+
224
+ logger.debug('Merged entity', {
225
+ source: source.name,
226
+ target: target.name,
227
+ aliases: updatedAliases,
228
+ });
229
+ }
230
+
231
+ // Module-level threshold for embedding similarity
232
+ const similarityThreshold = 0.85;
@@ -0,0 +1,257 @@
1
+ /**
2
+ * Graph Builder
3
+ *
4
+ * Orchestrates the full pipeline: extract entities and relations from
5
+ * memories and store them in the knowledge graph.
6
+ */
7
+
8
+ import { eq } from 'drizzle-orm';
9
+ import { getDb } from '../../db/index.js';
10
+ import { getSchema } from '../../db/schema.js';
11
+ import { logger } from '../logger.js';
12
+ import { config } from '../../config.js';
13
+ import { extractAndStoreRelations } from './relationship-extractor.js';
14
+ import { deduplicateProjectEntities } from './entity-deduplicator.js';
15
+
16
+ export interface GraphBuildStats {
17
+ memoriesProcessed: number;
18
+ entitiesCreated: number;
19
+ relationsCreated: number;
20
+ entitiesDeduplicated: number;
21
+ errors: number;
22
+ durationMs: number;
23
+ }
24
+
25
+ export interface GraphAddStats {
26
+ entitiesCreated: number;
27
+ relationsCreated: number;
28
+ source: 'llm' | 'regex' | 'fallback' | 'none';
29
+ }
30
+
31
+ /**
32
+ * Build or rebuild the entity graph for a project.
33
+ * Processes all memories in the project, extracting entities and relations.
34
+ */
35
+ export async function buildGraphForProject(
36
+ projectPath: string,
37
+ options?: {
38
+ clearExisting?: boolean;
39
+ batchSize?: number;
40
+ preferLLM?: boolean;
41
+ deduplicate?: boolean;
42
+ }
43
+ ): Promise<GraphBuildStats> {
44
+ const startTime = Date.now();
45
+ const {
46
+ clearExisting = false,
47
+ batchSize = 10,
48
+ preferLLM = true,
49
+ deduplicate = true,
50
+ } = options || {};
51
+
52
+ const db = await getDb();
53
+ const schema = await getSchema();
54
+
55
+ // Get project
56
+ const projectRows = await (db as any)
57
+ .select()
58
+ .from(schema.projects)
59
+ .where(eq(schema.projects.path, projectPath))
60
+ .limit(1);
61
+
62
+ if (projectRows.length === 0) {
63
+ logger.warn('Project not found for graph build', { projectPath });
64
+ return {
65
+ memoriesProcessed: 0,
66
+ entitiesCreated: 0,
67
+ relationsCreated: 0,
68
+ entitiesDeduplicated: 0,
69
+ errors: 0,
70
+ durationMs: Date.now() - startTime,
71
+ };
72
+ }
73
+
74
+ const projectId = projectRows[0].id;
75
+
76
+ // Clear existing graph if requested
77
+ if (clearExisting) {
78
+ const { clearProjectGraph } = await import('./relationship-extractor.js');
79
+ await clearProjectGraph(projectId);
80
+ logger.info('Cleared existing graph for rebuild', { projectId });
81
+ }
82
+
83
+ // Get all active memories for the project
84
+ const memories = await (db as any)
85
+ .select()
86
+ .from(schema.memories)
87
+ .where(eq(schema.memories.projectId, projectId));
88
+
89
+ logger.info('Starting graph build for project', {
90
+ projectId,
91
+ memoryCount: memories.length,
92
+ clearExisting,
93
+ });
94
+
95
+ let entitiesCreated = 0;
96
+ let relationsCreated = 0;
97
+ let errors = 0;
98
+
99
+ // Process memories in batches
100
+ for (let i = 0; i < memories.length; i += batchSize) {
101
+ const batch = memories.slice(i, i + batchSize);
102
+
103
+ for (const memory of batch) {
104
+ try {
105
+ const result = await extractAndStoreRelations(
106
+ memory.id,
107
+ memory.content,
108
+ projectId,
109
+ { preferLLM }
110
+ );
111
+
112
+ entitiesCreated += result.entities;
113
+ relationsCreated += result.relations;
114
+ } catch (error) {
115
+ logger.error('Error processing memory for graph', {
116
+ memoryId: memory.id,
117
+ error: error as Error,
118
+ });
119
+ errors++;
120
+ }
121
+ }
122
+
123
+ logger.debug('Graph build batch progress', {
124
+ processed: Math.min(i + batchSize, memories.length),
125
+ total: memories.length,
126
+ });
127
+ }
128
+
129
+ // Deduplicate entities
130
+ let entitiesDeduplicated = 0;
131
+ if (deduplicate) {
132
+ try {
133
+ const dedupResult = await deduplicateProjectEntities(projectId);
134
+ entitiesDeduplicated = dedupResult.merged;
135
+ } catch (error) {
136
+ logger.error('Error during entity deduplication', { error: error as Error });
137
+ }
138
+ }
139
+
140
+ const stats: GraphBuildStats = {
141
+ memoriesProcessed: memories.length,
142
+ entitiesCreated,
143
+ relationsCreated,
144
+ entitiesDeduplicated,
145
+ errors,
146
+ durationMs: Date.now() - startTime,
147
+ };
148
+
149
+ logger.info('Graph build completed', stats);
150
+
151
+ return stats;
152
+ }
153
+
154
+ /**
155
+ * Add a single memory to the knowledge graph.
156
+ * Used for incremental updates when new memories are stored.
157
+ */
158
+ export async function addMemoryToGraph(
159
+ memoryId: string,
160
+ options?: {
161
+ preferLLM?: boolean;
162
+ }
163
+ ): Promise<GraphAddStats> {
164
+ const db = await getDb();
165
+ const schema = await getSchema();
166
+
167
+ // Get the memory
168
+ const memories = await (db as any)
169
+ .select()
170
+ .from(schema.memories)
171
+ .where(eq(schema.memories.id, memoryId))
172
+ .limit(1);
173
+
174
+ if (memories.length === 0) {
175
+ return { entitiesCreated: 0, relationsCreated: 0, source: 'none' };
176
+ }
177
+
178
+ const memory = memories[0];
179
+
180
+ if (!memory.projectId) {
181
+ return { entitiesCreated: 0, relationsCreated: 0, source: 'none' as const };
182
+ }
183
+
184
+ // Use global config if not explicitly overridden
185
+ const preferLLM = options?.preferLLM ?? config.llmEnabled;
186
+
187
+ const result = await extractAndStoreRelations(
188
+ memoryId,
189
+ memory.content,
190
+ memory.projectId,
191
+ { preferLLM }
192
+ );
193
+
194
+ return {
195
+ entitiesCreated: result.entities,
196
+ relationsCreated: result.relations,
197
+ source: result.source,
198
+ };
199
+ }
200
+
201
+ /**
202
+ * Get graph statistics for a project.
203
+ */
204
+ export async function getGraphStats(projectPath: string): Promise<{
205
+ entityCount: number;
206
+ relationCount: number;
207
+ relationTypes: Record<string, number>;
208
+ avgConnections: number;
209
+ }> {
210
+ const db = await getDb();
211
+ const schema = await getSchema();
212
+
213
+ const projectRows = await (db as any)
214
+ .select({ id: schema.projects.id })
215
+ .from(schema.projects)
216
+ .where(eq(schema.projects.path, projectPath))
217
+ .limit(1);
218
+
219
+ if (projectRows.length === 0) {
220
+ return { entityCount: 0, relationCount: 0, relationTypes: {}, avgConnections: 0 };
221
+ }
222
+
223
+ const projectId = projectRows[0].id;
224
+
225
+ const entities = await (db as any)
226
+ .select()
227
+ .from(schema.entities)
228
+ .where(eq(schema.entities.projectId, projectId));
229
+
230
+ const relations = await (db as any)
231
+ .select()
232
+ .from(schema.entityRelations);
233
+
234
+ // Filter relations to only those involving project entities
235
+ const entityIds = new Set(entities.map((e: any) => e.id));
236
+ const projectRelations = relations.filter(
237
+ (r: any) => entityIds.has(r.fromEntityId) || entityIds.has(r.toEntityId)
238
+ );
239
+
240
+ // Count by type
241
+ const relationTypes: Record<string, number> = {};
242
+ for (const r of projectRelations) {
243
+ const type = r.type || 'unknown';
244
+ relationTypes[type] = (relationTypes[type] || 0) + 1;
245
+ }
246
+
247
+ const avgConnections = entities.length > 0
248
+ ? (projectRelations.length * 2) / entities.length
249
+ : 0;
250
+
251
+ return {
252
+ entityCount: entities.length,
253
+ relationCount: projectRelations.length,
254
+ relationTypes,
255
+ avgConnections: Math.round(avgConnections * 100) / 100,
256
+ };
257
+ }