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,402 @@
1
+ /**
2
+ * LLM Entity Extractor
3
+ *
4
+ * Extracts named entities and relationships from memory content using
5
+ * LLM-powered analysis. Falls back to regex extraction when LLM is unavailable.
6
+ */
7
+
8
+ import { logger } from '../logger.js';
9
+ import { config } from '../../config.js';
10
+ import {
11
+ extractEntities as regexExtractEntities,
12
+ linkEntitiesToMemories,
13
+ type EntityType,
14
+ type ExtractedEntity,
15
+ } from '../memory/entity-extractor.js';
16
+
17
+ // ─── Types ──────────────────────────────────────────────────────────────────
18
+
19
+ export type RelationType =
20
+ | 'works_on'
21
+ | 'depends_on'
22
+ | 'manages'
23
+ | 'uses'
24
+ | 'caused'
25
+ | 'located_in'
26
+ | 'belongs_to'
27
+ | 'reports_to'
28
+ | 'occurred_on'
29
+ | 'affects'
30
+ | 'contains'
31
+ | 'implements'
32
+ | 'extends'
33
+ | 'related_to'
34
+ | 'part_of'
35
+ | 'owns'
36
+ | 'created'
37
+ | 'resolved'
38
+ | 'blocks';
39
+
40
+ export interface ExtractedRelation {
41
+ fromEntity: string;
42
+ toEntity: string;
43
+ relationType: RelationType;
44
+ confidence: number;
45
+ context: string;
46
+ }
47
+
48
+ export interface LLMExtractionResult {
49
+ entities: ExtractedEntity[];
50
+ relations: ExtractedRelation[];
51
+ source: 'llm' | 'regex' | 'none';
52
+ }
53
+
54
+ // ─── LLM Prompt ─────────────────────────────────────────────────────────────
55
+
56
+ const ENTITY_EXTRACTION_PROMPT = `You are an entity and relationship extractor for an AI memory system. Given text, extract:
57
+
58
+ 1. ENTITIES: Named things mentioned (people, projects, systems, tools, concepts, events)
59
+ 2. RELATIONSHIPS: How entities connect to each other
60
+
61
+ Return ONLY valid JSON in this exact format:
62
+ {
63
+ "entities": [
64
+ {"name": "Alice", "type": "person", "confidence": 0.95},
65
+ {"name": "Project Atlas", "type": "concept", "confidence": 0.9}
66
+ ],
67
+ "relations": [
68
+ {"from": "Alice", "to": "Project Atlas", "type": "works_on", "confidence": 0.85, "context": "Alice is the tech lead on Project Atlas"},
69
+ {"from": "Project Atlas", "to": "PostgreSQL", "type": "uses", "confidence": 0.9, "context": "Project Atlas uses PostgreSQL for its primary datastore"}
70
+ ]
71
+ }
72
+
73
+ Entity types: person, file, function, class, concept, tool, date, location, pattern, technique, other
74
+ Relation types: works_on, depends_on, manages, uses, caused, located_in, belongs_to, reports_to, occurred_on, affects, contains, implements, extends, related_to, part_of, owns, created, resolved, blocks
75
+
76
+ Rules:
77
+ - Extract only explicitly mentioned entities and relationships
78
+ - Use the most specific relation type available
79
+ - Include confidence scores (0-1)
80
+ - Keep entity names as they appear in text (preserve capitalization)
81
+ - For ambiguous relationships, use "related_to"
82
+ - Do NOT invent entities or relationships not present in the text`;
83
+
84
+ // ─── LLM Call Abstraction ───────────────────────────────────────────────────
85
+
86
+ /**
87
+ * Call an LLM for entity extraction.
88
+ * Uses OpenAI-compatible API (works with OpenAI, Ollama, LM Studio, local endpoints).
89
+ */
90
+ async function callLLM(prompt: string, content: string): Promise<string | null> {
91
+ // Determine which provider to use for extraction
92
+ const provider = config.llmProvider;
93
+ const endpoint = config.llmEndpoint || config.lmStudioUrl || config.ollamaUrl;
94
+ const model = config.llmExtractionModel;
95
+ if (!model) {
96
+ logger.debug('LLM extraction model not configured; using regex fallback');
97
+ return null;
98
+ }
99
+
100
+ // Try OpenAI first if configured and provider matches
101
+ if ((provider === 'openai' || !provider) && config.openAiApiKey) {
102
+ try {
103
+ const chatUrl = config.openAiApiUrl.replace('/embeddings', '/chat/completions');
104
+ const response = await fetch(chatUrl, {
105
+ method: 'POST',
106
+ headers: {
107
+ 'Content-Type': 'application/json',
108
+ Authorization: `Bearer ${config.openAiApiKey}`,
109
+ },
110
+ body: JSON.stringify({
111
+ model,
112
+ messages: [
113
+ { role: 'system', content: prompt },
114
+ { role: 'user', content },
115
+ ],
116
+ temperature: 0.1,
117
+ max_tokens: 2000,
118
+ }),
119
+ });
120
+
121
+ if (!response.ok) {
122
+ logger.warn(`LLM entity extraction failed (OpenAI): ${response.status}`);
123
+ return null;
124
+ }
125
+
126
+ const payload = await response.json() as { choices?: Array<{ message?: { content?: string } }> };
127
+ return payload.choices?.[0]?.message?.content ?? null;
128
+ } catch (error) {
129
+ logger.warn('LLM entity extraction error (OpenAI):', { error: error as Error });
130
+ }
131
+ }
132
+
133
+ // Try Ollama if configured and provider matches
134
+ if ((provider === 'ollama' || !provider) && config.ollamaUrl) {
135
+ try {
136
+ const response = await fetch(`${config.ollamaUrl}/api/chat`, {
137
+ method: 'POST',
138
+ headers: { 'Content-Type': 'application/json' },
139
+ body: JSON.stringify({
140
+ model,
141
+ messages: [
142
+ { role: 'system', content: prompt },
143
+ { role: 'user', content },
144
+ ],
145
+ stream: false,
146
+ options: { temperature: 0.1 },
147
+ }),
148
+ });
149
+
150
+ if (!response.ok) {
151
+ logger.warn(`Ollama entity extraction failed: ${response.status}`);
152
+ return null;
153
+ }
154
+
155
+ const payload = await response.json() as { message?: { content?: string } };
156
+ return payload.message?.content ?? null;
157
+ } catch (error) {
158
+ logger.warn('LLM entity extraction error (Ollama):', { error: error as Error });
159
+ }
160
+ }
161
+
162
+ // Try LM Studio / custom endpoint if configured and provider matches
163
+ if ((provider === 'lmstudio' || provider === 'local' || !provider) && (config.lmStudioUrl || endpoint)) {
164
+ try {
165
+ const baseUrl = endpoint || config.lmStudioUrl;
166
+ if (!baseUrl) return null;
167
+ const response = await fetch(`${baseUrl}/v1/chat/completions`, {
168
+ method: 'POST',
169
+ headers: { 'Content-Type': 'application/json' },
170
+ body: JSON.stringify({
171
+ model,
172
+ messages: [
173
+ { role: 'system', content: prompt },
174
+ { role: 'user', content },
175
+ ],
176
+ temperature: 0.1,
177
+ max_tokens: 2000,
178
+ }),
179
+ });
180
+
181
+ if (!response.ok) {
182
+ logger.warn(`LM Studio entity extraction failed: ${response.status}`);
183
+ return null;
184
+ }
185
+
186
+ const payload = await response.json() as { choices?: Array<{ message?: { content?: string } }> };
187
+ return payload.choices?.[0]?.message?.content ?? null;
188
+ } catch (error) {
189
+ logger.warn('LLM entity extraction error (LM Studio):', { error: error as Error });
190
+ }
191
+ }
192
+
193
+ return null;
194
+ }
195
+
196
+ // ─── JSON Parsing ────────────────────────────────────────────────────────────
197
+
198
+ /**
199
+ * Parse LLM response into structured extraction result.
200
+ * Handles various response formats (raw JSON, markdown code blocks, etc.)
201
+ */
202
+ function parseLLMResponse(response: string): { entities: ExtractedEntity[]; relations: ExtractedRelation[] } | null {
203
+ // Try to extract JSON from the response
204
+ let jsonStr = response.trim();
205
+
206
+ // Handle markdown code blocks
207
+ const codeBlockMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
208
+ if (codeBlockMatch) {
209
+ jsonStr = codeBlockMatch[1].trim();
210
+ }
211
+
212
+ // Try to find JSON object in the response
213
+ const jsonMatch = jsonStr.match(/\{[\s\S]*\}/);
214
+ if (!jsonMatch) {
215
+ logger.debug('No JSON found in LLM response');
216
+ return null;
217
+ }
218
+
219
+ try {
220
+ const parsed = JSON.parse(jsonMatch[0]);
221
+
222
+ // Validate structure
223
+ if (!parsed.entities || !Array.isArray(parsed.entities)) {
224
+ logger.debug('LLM response missing entities array');
225
+ return null;
226
+ }
227
+
228
+ const entities: ExtractedEntity[] = (parsed.entities as any[])
229
+ .filter((e: any) => e.name && e.type)
230
+ .map((e: any) => ({
231
+ name: String(e.name),
232
+ type: validateEntityType(String(e.type)),
233
+ confidence: typeof e.confidence === 'number' ? Math.min(1, Math.max(0, e.confidence)) : 0.8,
234
+ startIndex: 0,
235
+ endIndex: 0,
236
+ context: String(e.context || ''),
237
+ normalized: e.normalized ? String(e.normalized) : undefined,
238
+ }));
239
+
240
+ const relations: ExtractedRelation[] = (parsed.relations || [])
241
+ .filter((r: any) => r.from && r.to && r.type)
242
+ .map((r: any) => ({
243
+ fromEntity: String(r.from),
244
+ toEntity: String(r.to),
245
+ relationType: validateRelationType(String(r.type)),
246
+ confidence: typeof r.confidence === 'number' ? Math.min(1, Math.max(0, r.confidence)) : 0.7,
247
+ context: String(r.context || ''),
248
+ }));
249
+
250
+ return { entities, relations };
251
+ } catch (error) {
252
+ logger.debug('Failed to parse LLM response as JSON', { error: error as Error });
253
+ return null;
254
+ }
255
+ }
256
+
257
+ function validateEntityType(type: string): EntityType {
258
+ const validTypes: EntityType[] = ['person', 'file', 'function', 'class', 'concept', 'tool', 'date', 'location', 'pattern', 'technique', 'other'];
259
+ const lower = type.toLowerCase() as EntityType;
260
+ if (validTypes.includes(lower)) return lower;
261
+ return 'other';
262
+ }
263
+
264
+ function validateRelationType(type: string): RelationType {
265
+ const validTypes: RelationType[] = [
266
+ 'works_on', 'depends_on', 'manages', 'uses', 'caused', 'located_in',
267
+ 'belongs_to', 'reports_to', 'occurred_on', 'affects', 'contains',
268
+ 'implements', 'extends', 'related_to', 'part_of', 'owns', 'created',
269
+ 'resolved', 'blocks',
270
+ ];
271
+ const lower = type.toLowerCase() as RelationType;
272
+ if (validTypes.includes(lower)) return lower;
273
+ return 'related_to';
274
+ }
275
+
276
+ // ─── Main Extraction Functions ───────────────────────────────────────────────
277
+
278
+ /**
279
+ * Extract entities and relationships from text using LLM.
280
+ * Falls back to regex extraction when LLM is unavailable.
281
+ */
282
+ export async function extractEntitiesAndRelations(
283
+ content: string,
284
+ options?: {
285
+ preferLLM?: boolean;
286
+ maxContentLength?: number;
287
+ }
288
+ ): Promise<LLMExtractionResult> {
289
+ const { preferLLM = true, maxContentLength = 4000 } = options || {};
290
+
291
+ // Truncate very long content
292
+ const truncatedContent = content.length > maxContentLength
293
+ ? content.substring(0, maxContentLength) + '...'
294
+ : content;
295
+
296
+ // Try LLM extraction first if preferred
297
+ if (preferLLM) {
298
+ const llmResult = await extractWithLLM(truncatedContent);
299
+ if (llmResult) {
300
+ logger.debug('LLM entity extraction succeeded', {
301
+ entityCount: llmResult.entities.length,
302
+ relationCount: llmResult.relations.length,
303
+ });
304
+ return { ...llmResult, source: 'llm' };
305
+ }
306
+ }
307
+
308
+ // Fall back to regex extraction
309
+ const regexEntities = await regexExtractEntities(content);
310
+ if (regexEntities.length > 0) {
311
+ logger.debug('Regex entity extraction fallback', {
312
+ entityCount: regexEntities.length,
313
+ });
314
+ return {
315
+ entities: regexEntities,
316
+ relations: [], // Regex extraction doesn't produce relations
317
+ source: 'regex',
318
+ };
319
+ }
320
+
321
+ return { entities: [], relations: [], source: 'none' };
322
+ }
323
+
324
+ /**
325
+ * Extract entities and relations using LLM.
326
+ */
327
+ async function extractWithLLM(content: string): Promise<Omit<LLMExtractionResult, 'source'> | null> {
328
+ const response = await callLLM(ENTITY_EXTRACTION_PROMPT, content);
329
+ if (!response) return null;
330
+
331
+ const parsed = parseLLMResponse(response);
332
+ if (!parsed) return null;
333
+
334
+ // Validate that extracted entities actually appear in the content
335
+ const validatedEntities = parsed.entities.filter((entity) => {
336
+ // Allow entities whose name or a significant substring appears in content
337
+ const nameLower = entity.name.toLowerCase();
338
+ const contentLower = content.toLowerCase();
339
+ // Check if the entity name or a key part of it appears in content
340
+ const words = nameLower.split(/\s+/);
341
+ return words.some(word => word.length > 2 && contentLower.includes(word));
342
+ });
343
+
344
+ // Validate that relation entities exist in the entity list
345
+ const entityNames = new Set(validatedEntities.map(e => e.name.toLowerCase()));
346
+ const validatedRelations = parsed.relations.filter((relation) => {
347
+ const fromExists = entityNames.has(relation.fromEntity.toLowerCase());
348
+ const toExists = entityNames.has(relation.toEntity.toLowerCase());
349
+ // Allow relations where at least one entity is known
350
+ // (the LLM might use slightly different names)
351
+ return fromExists || toExists ||
352
+ // Also allow if both entity names appear in the content
353
+ (content.toLowerCase().includes(relation.fromEntity.toLowerCase()) &&
354
+ content.toLowerCase().includes(relation.toEntity.toLowerCase()));
355
+ });
356
+
357
+ return {
358
+ entities: validatedEntities,
359
+ relations: validatedRelations,
360
+ };
361
+ }
362
+
363
+ /**
364
+ * Extract entities and relations from multiple memories in batch.
365
+ * More efficient than calling extractEntitiesAndRelations for each memory.
366
+ */
367
+ export async function batchExtractEntitiesAndRelations(
368
+ contents: string[],
369
+ options?: {
370
+ preferLLM?: boolean;
371
+ maxContentLength?: number;
372
+ batchSize?: number;
373
+ }
374
+ ): Promise<LLMExtractionResult[]> {
375
+ const { batchSize = 5 } = options || {};
376
+ const results: LLMExtractionResult[] = [];
377
+
378
+ // Process in batches to avoid overwhelming the LLM
379
+ for (let i = 0; i < contents.length; i += batchSize) {
380
+ const batch = contents.slice(i, i + batchSize);
381
+ const batchResults = await Promise.all(
382
+ batch.map(content => extractEntitiesAndRelations(content, options))
383
+ );
384
+ results.push(...batchResults);
385
+ }
386
+
387
+ return results;
388
+ }
389
+
390
+ /**
391
+ * Get the extraction prompt for testing/debugging purposes.
392
+ */
393
+ export function getExtractionPrompt(): string {
394
+ return ENTITY_EXTRACTION_PROMPT;
395
+ }
396
+
397
+ /**
398
+ * Parse an LLM response for testing/debugging purposes.
399
+ */
400
+ export function testParseLLMResponse(response: string): { entities: ExtractedEntity[]; relations: ExtractedRelation[] } | null {
401
+ return parseLLMResponse(response);
402
+ }