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,319 @@
1
+ /**
2
+ * Importance Scoring System
3
+ * Calculates and manages memory importance scores (0-100) with temporal decay
4
+ */
5
+
6
+ import type { Memory } from '../../db/drizzle/schema.js';
7
+ import { eq } from 'drizzle-orm';
8
+ import { cosineSimilarity as vectorCosineSimilarity } from '../utils/vector-operations.js';
9
+ import { getDbClient } from '../lib/db-client.js';
10
+
11
+ export interface ImportanceScore {
12
+ score: number; // 0-100
13
+ components: {
14
+ base: number;
15
+ recency: number;
16
+ accessFrequency: number;
17
+ typeWeight: number;
18
+ userFlags: number;
19
+ };
20
+ explanation: string;
21
+ }
22
+
23
+ /**
24
+ * Type weights for importance scoring
25
+ * Higher values = more important memory types
26
+ */
27
+ const TYPE_WEIGHTS: Record<string, number> = {
28
+ decision: 15,
29
+ fact: 10,
30
+ preference: 8,
31
+ context: 5,
32
+ observation: 0,
33
+ };
34
+
35
+ /**
36
+ * Calculate importance score for a memory
37
+ *
38
+ * Formula: base + recency + accessFrequency + typeWeight + userFlags
39
+ * All values are clamped to 0-100 range
40
+ */
41
+ export function calculateImportance(memory: Partial<Memory>): ImportanceScore {
42
+ const components = {
43
+ base: 50, // Neutral starting point
44
+ recency: calculateRecencyComponent(memory),
45
+ accessFrequency: calculateAccessFrequencyComponent(memory),
46
+ typeWeight: calculateTypeWeightComponent(memory),
47
+ userFlags: calculateUserFlagsComponent(memory),
48
+ };
49
+
50
+ // Calculate total score (clamped to 0-100)
51
+ const score = Math.min(
52
+ 100,
53
+ Math.max(
54
+ 0,
55
+ components.base +
56
+ components.recency +
57
+ components.accessFrequency +
58
+ components.typeWeight +
59
+ components.userFlags
60
+ )
61
+ );
62
+
63
+ return {
64
+ score,
65
+ components,
66
+ explanation: generateImportanceExplanation(components, memory),
67
+ };
68
+ }
69
+
70
+ /**
71
+ * Calculate recency component (0-30 points)
72
+ * Uses exponential decay based on memory age
73
+ */
74
+ function calculateRecencyComponent(memory: Partial<Memory>): number {
75
+ if (!memory.createdAt) return 0;
76
+
77
+ const now = Date.now();
78
+ const createdAt = new Date(memory.createdAt).getTime();
79
+ const ageDays = (now - createdAt) / (1000 * 60 * 60 * 24);
80
+
81
+ // Decay rate: default 30 days half-life
82
+ const decayRate = memory.importanceDecayRate ?? 30;
83
+
84
+ // Exponential decay: 30 * (0.5 ^ (age / halfLife))
85
+ // Maximum 30 points for very recent memories
86
+ const recencyScore = 30 * Math.pow(0.5, ageDays / decayRate);
87
+
88
+ return Math.max(0, Math.min(30, recencyScore));
89
+ }
90
+
91
+ /**
92
+ * Calculate access frequency component (0-15 points)
93
+ * More frequently accessed memories are more important
94
+ */
95
+ function calculateAccessFrequencyComponent(memory: Partial<Memory>): number {
96
+ const accessCount = memory.accessCount ?? 0;
97
+ const usageCount = memory.usageCount ?? 0;
98
+
99
+ // Combined access count (from both fields)
100
+ const totalAccess = accessCount + usageCount;
101
+
102
+ // Logarithmic scaling: 15 * log10(totalAccess + 1)
103
+ // This gives diminishing returns for high access counts
104
+ const accessScore = 15 * Math.log10(totalAccess + 1);
105
+
106
+ return Math.min(15, accessScore);
107
+ }
108
+
109
+ /**
110
+ * Calculate type weight component (0-15 points)
111
+ * Different memory types have different inherent importance
112
+ */
113
+ function calculateTypeWeightComponent(memory: Partial<Memory>): number {
114
+ const type = memory.type ?? 'observation';
115
+ return TYPE_WEIGHTS[type] ?? 0;
116
+ }
117
+
118
+ /**
119
+ * Calculate user flags component (0 or +20 points)
120
+ * Pinned or protected memories get maximum importance
121
+ */
122
+ function calculateUserFlagsComponent(memory: Partial<Memory>): number {
123
+ // Pinned memories get maximum boost
124
+ if (memory.isPinned) return 20;
125
+
126
+ // Protected memories also get significant boost
127
+ if (memory.isProtected) return 15;
128
+
129
+ // Immutable memories are important but not as much
130
+ if (memory.isImmutable) return 10;
131
+
132
+ return 0;
133
+ }
134
+
135
+ /**
136
+ * Generate human-readable explanation for importance score
137
+ */
138
+ function generateImportanceExplanation(
139
+ components: ImportanceScore['components'],
140
+ memory: Partial<Memory>
141
+ ): string {
142
+ const parts: string[] = [];
143
+
144
+ // Base score
145
+ parts.push(`base: ${components.base}`);
146
+
147
+ // Recency
148
+ if (components.recency > 20) {
149
+ parts.push('very recent');
150
+ } else if (components.recency > 10) {
151
+ parts.push('recent');
152
+ } else if (components.recency > 0) {
153
+ parts.push('somewhat recent');
154
+ }
155
+
156
+ // Access frequency
157
+ const totalAccess = (memory.accessCount ?? 0) + (memory.usageCount ?? 0);
158
+ if (totalAccess > 10) {
159
+ parts.push('frequently accessed');
160
+ } else if (totalAccess > 3) {
161
+ parts.push('occasionally accessed');
162
+ }
163
+
164
+ // Type
165
+ const type = memory.type ?? 'observation';
166
+ if (type !== 'observation') {
167
+ parts.push(`${type} type`);
168
+ }
169
+
170
+ // User flags
171
+ if (memory.isPinned) {
172
+ parts.push('pinned by user');
173
+ } else if (memory.isProtected) {
174
+ parts.push('protected');
175
+ }
176
+
177
+ return parts.join(', ');
178
+ }
179
+
180
+ /**
181
+ * Update importance score for a memory
182
+ * Used when memory is accessed or modified
183
+ */
184
+ export async function updateImportanceScore(
185
+ memoryId: string,
186
+ incrementAccess: boolean = false
187
+ ): Promise<number> {
188
+ const { db, schema } = await getDbClient();
189
+
190
+ // Get current memory
191
+ const memories = await db
192
+ .select()
193
+ .from(schema.memories)
194
+ .where(eq(schema.memories.id, memoryId))
195
+ .limit(1);
196
+
197
+ if (memories.length === 0) {
198
+ throw new Error(`Memory not found: ${memoryId}`);
199
+ }
200
+
201
+ const memory = memories[0];
202
+
203
+ // Calculate new importance score
204
+ const importance = calculateImportance(memory);
205
+
206
+ // Update memory with new score
207
+ const updateData: any = {
208
+ importanceScore: importance.score,
209
+ lastImportanceRecalc: new Date(),
210
+ };
211
+
212
+ // Increment access count if requested
213
+ if (incrementAccess) {
214
+ updateData.accessCount = (memory.accessCount ?? 0) + 1;
215
+ updateData.lastAccessedAt = new Date();
216
+ }
217
+
218
+ await db
219
+ .update(schema.memories)
220
+ .set(updateData)
221
+ .where(eq(schema.memories.id, memoryId));
222
+
223
+ return importance.score;
224
+ }
225
+
226
+ /**
227
+ * Get low-importance memories that are candidates for consolidation
228
+ * These are old, rarely accessed memories with low importance scores
229
+ */
230
+ export async function getLowImportanceMemories(
231
+ projectId: string,
232
+ options: {
233
+ minAge?: number; // days
234
+ maxImportance?: number; // 0-100
235
+ limit?: number;
236
+ } = {}
237
+ ): Promise<any[]> {
238
+ const { db, schema } = await getDbClient();
239
+
240
+ const {
241
+ minAge = 90, // 90 days old by default
242
+ maxImportance = 30, // importance score below 30
243
+ limit = 100,
244
+ } = options;
245
+
246
+ const minAgeTimestamp = new Date(Date.now() - minAge * 24 * 60 * 60 * 1000);
247
+
248
+ const memories = await db
249
+ .select()
250
+ .from(schema.memories)
251
+ .where(eq(schema.memories.projectId, projectId))
252
+ .all();
253
+
254
+ // Filter by criteria
255
+ return memories
256
+ .filter((m: any) => {
257
+ // Skip pinned/protected/consolidated
258
+ if (m.isPinned || m.isProtected || m.isConsolidated) {
259
+ return false;
260
+ }
261
+
262
+ // Check age
263
+ if (m.createdAt) {
264
+ const createdAt = new Date(m.createdAt).getTime();
265
+ if (createdAt > minAgeTimestamp.getTime()) {
266
+ return false;
267
+ }
268
+ }
269
+
270
+ // Check importance
271
+ if ((m.importanceScore ?? 50) > maxImportance) {
272
+ return false;
273
+ }
274
+
275
+ return true;
276
+ })
277
+ .slice(0, limit);
278
+ }
279
+
280
+ /**
281
+ * Set importance score manually (for user override)
282
+ */
283
+ export async function setImportanceScore(
284
+ memoryId: string,
285
+ score: number
286
+ ): Promise<void> {
287
+ if (score < 0 || score > 100) {
288
+ throw new Error('Importance score must be between 0 and 100');
289
+ }
290
+
291
+ const { db, schema } = await getDbClient();
292
+
293
+ await db
294
+ .update(schema.memories)
295
+ .set({
296
+ importanceScore: Math.round(score),
297
+ lastImportanceRecalc: new Date(),
298
+ })
299
+ .where(eq(schema.memories.id, memoryId));
300
+ }
301
+
302
+ /**
303
+ * Pin a memory to prevent decay and consolidation
304
+ */
305
+ export async function pinMemory(memoryId: string, pinned: boolean = true): Promise<void> {
306
+ const { db, schema } = await getDbClient();
307
+
308
+ await db
309
+ .update(schema.memories)
310
+ .set({
311
+ isPinned: pinned ? 1 : 0,
312
+ // When pinning, set max importance; when unpinning, recalculate
313
+ importanceScore: pinned ? 100 : undefined,
314
+ lastImportanceRecalc: new Date(),
315
+ })
316
+ .where(eq(schema.memories.id, memoryId));
317
+ }
318
+
319
+ // cosineSimilarity has been removed - import from core/utils/vector-operations.ts directly
@@ -0,0 +1,11 @@
1
+ // Memory feature - Store and manage memories
2
+ export * from './normalization.js';
3
+ export * from './memories.js';
4
+ export * from './memory-manager.js';
5
+ export * from './serialization.js';
6
+
7
+ // Advanced memory features
8
+ export * from './temporal-parser.js';
9
+ export * from './entity-extractor.js';
10
+ export * from './hybrid-scorer.js';
11
+ export * from './bridge-discovery.js';
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Memory Loading Abstraction
3
+ * Unified utilities for loading memories by ID with configurable options
4
+ */
5
+
6
+ import { eq, inArray } from 'drizzle-orm';
7
+ import { getDbClient } from '../lib/db-client.js';
8
+ import { decrypt } from '../security/encrypt.js';
9
+ import { normalizeMemory, type MemoryRecord } from './normalization.js';
10
+ import { requireUuid } from '../lib/validation.js';
11
+ import { withDatabaseErrorHandling } from '../lib/utils.js';
12
+
13
+ export interface LoadMemoryOptions {
14
+ incrementAccess?: boolean;
15
+ decrypt?: boolean;
16
+ normalize?: boolean;
17
+ includeSensitive?: boolean;
18
+ }
19
+
20
+ /**
21
+ * Load a single memory by ID with configurable options
22
+ */
23
+ export async function loadMemory(
24
+ id: string,
25
+ options: LoadMemoryOptions = {}
26
+ ): Promise<MemoryRecord | any | null> {
27
+ const { incrementAccess = true, decrypt: shouldDecrypt = true, normalize = true, includeSensitive = false } = options;
28
+
29
+ // Validate UUID
30
+ requireUuid(id);
31
+
32
+ const { db, schema } = await getDbClient();
33
+
34
+ // Query the memory
35
+ const rows = await db.select().from(schema.memories).where(eq(schema.memories.id, id)).limit(1);
36
+ const row = rows[0];
37
+ if (!row) return null;
38
+
39
+ // Increment access count if needed
40
+ if (incrementAccess) {
41
+ await db.update(schema.memories)
42
+ .set({
43
+ accessCount: (row.accessCount ?? 0) + 1,
44
+ lastAccessedAt: new Date(),
45
+ })
46
+ .where(eq(schema.memories.id, id));
47
+ }
48
+
49
+ // Determine content: decrypt if needed
50
+ let content = row.content;
51
+ let encryptedContent = row.encrypted_content;
52
+ let encryptionNonce = row.encryption_nonce;
53
+
54
+ if (shouldDecrypt && row.is_encrypted) {
55
+ try {
56
+ content = decrypt(encryptedContent, encryptionNonce);
57
+ } catch (e) {
58
+ console.warn('Failed to decrypt memory', e);
59
+ content = row.content; // fallback to stored content (encrypted)
60
+ }
61
+ }
62
+
63
+ // Build result object
64
+ let result: any = { ...row, content };
65
+
66
+ // If not decrypting and includeSensitive, keep encrypted fields
67
+ if (!shouldDecrypt && includeSensitive) {
68
+ result.encrypted_content = encryptedContent;
69
+ result.encryption_nonce = encryptionNonce;
70
+ }
71
+
72
+ // If normalize, convert to MemoryRecord shape
73
+ if (normalize) {
74
+ return normalizeMemory(result);
75
+ }
76
+
77
+ // Otherwise return raw-ish row (with content possibly decrypted)
78
+ return result;
79
+ }
80
+
81
+ /**
82
+ * Load multiple memories by IDs efficiently
83
+ * Returns a Map keyed by memory ID
84
+ */
85
+ export async function loadMemories(
86
+ ids: string[],
87
+ options: LoadMemoryOptions = {}
88
+ ): Promise<Map<string, any>> {
89
+ const { incrementAccess = true, decrypt: shouldDecrypt = true, normalize = true, includeSensitive = false } = options;
90
+
91
+ if (ids.length === 0) {
92
+ return new Map();
93
+ }
94
+
95
+ // Validate all UUIDs
96
+ for (const id of ids) {
97
+ requireUuid(id);
98
+ }
99
+
100
+ const { db, schema } = await getDbClient();
101
+
102
+ // Batch query using IN operator
103
+ const rows = await db
104
+ .select()
105
+ .from(schema.memories)
106
+ .where(inArray(schema.memories.id, ids));
107
+
108
+ // Create a map from id to row
109
+ const rowMap = new Map<string, any>();
110
+ for (const row of rows) {
111
+ rowMap.set(row.id, row);
112
+ }
113
+
114
+ // Increment access counts if needed
115
+ if (incrementAccess) {
116
+ const now = new Date();
117
+ for (const row of rows) {
118
+ await db.update(schema.memories)
119
+ .set({
120
+ accessCount: (row.accessCount ?? 0) + 1,
121
+ lastAccessedAt: now,
122
+ })
123
+ .where(eq(schema.memories.id, row.id));
124
+ }
125
+ }
126
+
127
+ // Process each row according to options
128
+ const resultMap = new Map<string, any>();
129
+ for (const row of rows) {
130
+ let content = row.content;
131
+ let encryptedContent = row.encrypted_content;
132
+ let encryptionNonce = row.encryption_nonce;
133
+
134
+ if (shouldDecrypt && row.is_encrypted) {
135
+ try {
136
+ content = decrypt(encryptedContent, encryptionNonce);
137
+ } catch (e) {
138
+ console.warn('Failed to decrypt memory', e);
139
+ content = row.content;
140
+ }
141
+ }
142
+
143
+ let result: any = { ...row, content };
144
+
145
+ if (!shouldDecrypt && includeSensitive) {
146
+ result.encrypted_content = encryptedContent;
147
+ result.encryption_nonce = encryptionNonce;
148
+ }
149
+
150
+ if (normalize) {
151
+ resultMap.set(row.id, normalizeMemory(result));
152
+ } else {
153
+ resultMap.set(row.id, result);
154
+ }
155
+ }
156
+
157
+ return resultMap;
158
+ }
159
+
160
+ /**
161
+ * Load a memory by ID with raw database access, no processing.
162
+ *
163
+ * This is for special cases that need the raw database row without
164
+ * normalization, decryption, or access count updates.
165
+ *
166
+ * @param id - Memory UUID
167
+ * @returns Raw database row or null if not found
168
+ */
169
+ export async function loadMemoryRaw(id: string): Promise<any | null> {
170
+ // Validate UUID
171
+ requireUuid(id);
172
+
173
+ const { db, schema } = await getDbClient();
174
+
175
+ // Direct query without any processing
176
+ const rows = await db.select().from(schema.memories).where(eq(schema.memories.id, id)).limit(1);
177
+ return rows[0] || null;
178
+ }