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
@@ -36,9 +36,43 @@ export function expandQuery(query) {
36
36
  }
37
37
  }
38
38
  }
39
- // Extract simple entities (capitalized words)
40
- const entityMatches = query.match(/\b[A-Z][a-z]+\b/g);
41
- const entities = entityMatches ? [...new Set(entityMatches)] : [];
39
+ // Extract entities (capitalized words), filtering common stopwords
40
+ const STOP_WORDS = new Set([
41
+ 'The', 'A', 'An', 'This', 'That', 'These', 'Those',
42
+ 'I', 'You', 'We', 'They', 'He', 'She', 'It',
43
+ 'What', 'When', 'Where', 'Why', 'How',
44
+ 'My', 'Your', 'Our', 'Their', 'Its',
45
+ 'If', 'But', 'Or', 'And', 'So', 'Then',
46
+ 'Just', 'Only', 'Also', 'Very', 'Too',
47
+ 'Has', 'Have', 'Had', 'Does', 'Did', 'Will', 'Would', 'Could', 'Should',
48
+ 'Can', 'May', 'Might', 'Must', 'Shall',
49
+ 'With', 'Without', 'From', 'Into', 'About', 'After', 'Before', 'Between',
50
+ 'During', 'Through', 'Under', 'Over', 'Above', 'Below',
51
+ 'All', 'Some', 'Any', 'No', 'Not', 'Each', 'Every', 'Most', 'Many', 'Much',
52
+ 'Few', 'Both', 'Either', 'Neither', 'Another', 'Other',
53
+ 'Such', 'Same', 'Different', 'New', 'Old', 'First', 'Last', 'Next', 'Last',
54
+ 'See', 'Get', 'Make', 'Do', 'Say', 'Tell', 'Know', 'Think', 'Want', 'Use',
55
+ 'Find', 'Give', 'Take', 'Show', 'Send', 'Put', 'Keep', 'Let', 'Begin', 'Seem',
56
+ ]);
57
+ // Common tech stack terms that ARE entities (preserves known entities)
58
+ const TECH_TERMS = new Set([
59
+ 'TypeScript', 'JavaScript', 'Python', 'Java', 'Go', 'Rust', 'Ruby', 'PHP',
60
+ 'React', 'Vue', 'Angular', 'Svelte', 'Next', 'Nuxt', 'Astro',
61
+ 'Node', 'Express', 'Fastify', 'Deno', 'Bun',
62
+ 'PostgreSQL', 'MySQL', 'MongoDB', 'Redis', 'SQLite', 'DynamoDB',
63
+ 'AWS', 'GCP', 'Azure', 'Docker', 'Kubernetes', 'Terraform',
64
+ 'OpenAI', 'Anthropic', 'Google', 'Meta', 'Microsoft', 'Apple',
65
+ 'HTML', 'CSS', 'Tailwind', 'GraphQL', 'REST', 'gRPC', 'WebSocket',
66
+ 'CI', 'CD', 'Git', 'GitHub', 'GitLab', 'Bitbucket',
67
+ ]);
68
+ const entityMatches = query.match(/\b[A-Z][a-z]{2,}\b/g) || [];
69
+ const entities = [...new Set(entityMatches)].filter(e => {
70
+ // Always include known tech terms
71
+ if (TECH_TERMS.has(e))
72
+ return true;
73
+ // Filter out stopwords
74
+ return !STOP_WORDS.has(e);
75
+ });
42
76
  return {
43
77
  original: query,
44
78
  expanded: [...new Set(expanded)], // Deduplicate
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Retrieval Feedback System
3
+ *
4
+ * Tracks whether retrieved memories were useful in responses.
5
+ * Strengthens useful paths, prunes stale nodes, tunes edge weights.
6
+ */
7
+ export interface RetrievalFeedback {
8
+ memoryId: string;
9
+ query: string;
10
+ wasUseful: boolean;
11
+ cited: boolean;
12
+ responseId?: string;
13
+ timestamp: Date;
14
+ }
15
+ export interface FeedbackStats {
16
+ totalRetrievals: number;
17
+ usefulRetrievals: number;
18
+ citedRetrievals: number;
19
+ usefulnessRate: number;
20
+ citationRate: number;
21
+ }
22
+ /**
23
+ * Record that a memory was retrieved for a query.
24
+ * Call this when a memory appears in search results.
25
+ */
26
+ export declare function recordRetrieval(memoryId: string, query: string, options?: {
27
+ sessionId?: string;
28
+ }): void;
29
+ /**
30
+ * Record that a retrieved memory was actually useful.
31
+ * Call this when a memory is cited or referenced in a response.
32
+ */
33
+ export declare function recordUsefulRetrieval(memoryId: string, query: string, options?: {
34
+ cited?: boolean;
35
+ responseId?: string;
36
+ sessionId?: string;
37
+ }): void;
38
+ /**
39
+ * Record that a memory was cited in a response.
40
+ * This is stronger feedback than just "useful" - it means the memory
41
+ * was explicitly referenced.
42
+ */
43
+ export declare function recordCitation(memoryId: string, responseId: string, options?: {
44
+ sessionId?: string;
45
+ }): void;
46
+ /**
47
+ * Get feedback statistics for a specific memory.
48
+ */
49
+ export declare function getRetrievalStats(memoryId: string): FeedbackStats;
50
+ /**
51
+ * Get overall feedback statistics.
52
+ */
53
+ export declare function getOverallFeedbackStats(): FeedbackStats;
54
+ /**
55
+ * Flush feedback to the database, updating association weights.
56
+ */
57
+ export declare function flushFeedback(): Promise<{
58
+ strengthened: number;
59
+ weakened: number;
60
+ total: number;
61
+ }>;
62
+ /**
63
+ * Start the periodic feedback flush timer.
64
+ */
65
+ export declare function startFeedbackFlushTimer(): void;
66
+ /**
67
+ * Stop the periodic feedback flush timer.
68
+ */
69
+ export declare function stopFeedbackFlushTimer(): void;
70
+ //# sourceMappingURL=retrieval-feedback.d.ts.map
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Retrieval Feedback System
3
+ *
4
+ * Tracks whether retrieved memories were useful in responses.
5
+ * Strengthens useful paths, prunes stale nodes, tunes edge weights.
6
+ */
7
+ import { eq, sql } from 'drizzle-orm';
8
+ import { getDb } from '../../db/index.js';
9
+ import { getSchema } from '../../db/schema.js';
10
+ import { logger } from '../logger.js';
11
+ // ─── In-Memory Feedback Buffer ───────────────────────────────────────────────
12
+ const feedbackBuffer = new Map();
13
+ const MAX_BUFFER_SIZE = 1000;
14
+ const FLUSH_INTERVAL_MS = 60000; // 1 minute
15
+ let flushTimer = null;
16
+ /**
17
+ * Record that a memory was retrieved for a query.
18
+ * Call this when a memory appears in search results.
19
+ */
20
+ export function recordRetrieval(memoryId, query, options) {
21
+ const key = options?.sessionId || 'default';
22
+ const buffer = feedbackBuffer.get(key) || [];
23
+ buffer.push({
24
+ memoryId,
25
+ query,
26
+ wasUseful: false, // Will be updated later
27
+ cited: false,
28
+ timestamp: new Date(),
29
+ });
30
+ // Trim buffer if too large
31
+ if (buffer.length > MAX_BUFFER_SIZE) {
32
+ buffer.splice(0, buffer.length - MAX_BUFFER_SIZE);
33
+ }
34
+ feedbackBuffer.set(key, buffer);
35
+ }
36
+ /**
37
+ * Record that a retrieved memory was actually useful.
38
+ * Call this when a memory is cited or referenced in a response.
39
+ */
40
+ export function recordUsefulRetrieval(memoryId, query, options) {
41
+ const key = options?.sessionId || 'default';
42
+ const buffer = feedbackBuffer.get(key) || [];
43
+ // Find the existing retrieval record and update it
44
+ const existing = buffer.find(f => f.memoryId === memoryId && f.query === query && !f.wasUseful);
45
+ if (existing) {
46
+ existing.wasUseful = true;
47
+ existing.cited = options?.cited ?? false;
48
+ existing.responseId = options?.responseId;
49
+ }
50
+ else {
51
+ // Add a new record
52
+ buffer.push({
53
+ memoryId,
54
+ query,
55
+ wasUseful: true,
56
+ cited: options?.cited ?? false,
57
+ responseId: options?.responseId,
58
+ timestamp: new Date(),
59
+ });
60
+ }
61
+ feedbackBuffer.set(key, buffer);
62
+ }
63
+ /**
64
+ * Record that a memory was cited in a response.
65
+ * This is stronger feedback than just "useful" - it means the memory
66
+ * was explicitly referenced.
67
+ */
68
+ export function recordCitation(memoryId, responseId, options) {
69
+ const key = options?.sessionId || 'default';
70
+ const buffer = feedbackBuffer.get(key) || [];
71
+ // Mark all retrievals of this memory as useful
72
+ for (const feedback of buffer) {
73
+ if (feedback.memoryId === memoryId) {
74
+ feedback.wasUseful = true;
75
+ feedback.cited = true;
76
+ feedback.responseId = responseId;
77
+ }
78
+ }
79
+ feedbackBuffer.set(key, buffer);
80
+ }
81
+ /**
82
+ * Get feedback statistics for a specific memory.
83
+ */
84
+ export function getRetrievalStats(memoryId) {
85
+ let totalRetrievals = 0;
86
+ let usefulRetrievals = 0;
87
+ let citedRetrievals = 0;
88
+ for (const [, buffer] of feedbackBuffer) {
89
+ for (const feedback of buffer) {
90
+ if (feedback.memoryId === memoryId) {
91
+ totalRetrievals++;
92
+ if (feedback.wasUseful)
93
+ usefulRetrievals++;
94
+ if (feedback.cited)
95
+ citedRetrievals++;
96
+ }
97
+ }
98
+ }
99
+ return {
100
+ totalRetrievals,
101
+ usefulRetrievals,
102
+ citedRetrievals,
103
+ usefulnessRate: totalRetrievals > 0 ? usefulRetrievals / totalRetrievals : 0,
104
+ citationRate: totalRetrievals > 0 ? citedRetrievals / totalRetrievals : 0,
105
+ };
106
+ }
107
+ /**
108
+ * Get overall feedback statistics.
109
+ */
110
+ export function getOverallFeedbackStats() {
111
+ let totalRetrievals = 0;
112
+ let usefulRetrievals = 0;
113
+ let citedRetrievals = 0;
114
+ for (const [, buffer] of feedbackBuffer) {
115
+ for (const feedback of buffer) {
116
+ totalRetrievals++;
117
+ if (feedback.wasUseful)
118
+ usefulRetrievals++;
119
+ if (feedback.cited)
120
+ citedRetrievals++;
121
+ }
122
+ }
123
+ return {
124
+ totalRetrievals,
125
+ usefulRetrievals,
126
+ citedRetrievals,
127
+ usefulnessRate: totalRetrievals > 0 ? usefulRetrievals / totalRetrievals : 0,
128
+ citationRate: totalRetrievals > 0 ? citedRetrievals / totalRetrievals : 0,
129
+ };
130
+ }
131
+ /**
132
+ * Flush feedback to the database, updating association weights.
133
+ */
134
+ export async function flushFeedback() {
135
+ const db = await getDb();
136
+ const schema = await getSchema();
137
+ let strengthened = 0;
138
+ let weakened = 0;
139
+ let total = 0;
140
+ for (const [, buffer] of feedbackBuffer) {
141
+ for (const feedback of buffer) {
142
+ total++;
143
+ try {
144
+ // Get associations involving this memory
145
+ const associations = await db
146
+ .select()
147
+ .from(schema.memoryAssociations)
148
+ .where(sql `${schema.memoryAssociations.fromMemoryId} = ${feedback.memoryId} OR ${schema.memoryAssociations.toMemoryId} = ${feedback.memoryId}`);
149
+ for (const assoc of associations) {
150
+ if (feedback.wasUseful) {
151
+ // Strengthen: increase weight and coactivation count
152
+ await db
153
+ .update(schema.memoryAssociations)
154
+ .set({
155
+ weight: sql `${schema.memoryAssociations.weight} + 1`,
156
+ coactivationCount: sql `${schema.memoryAssociations.coactivationCount} + 1`,
157
+ lastCoactivatedAt: new Date(),
158
+ })
159
+ .where(eq(schema.memoryAssociations.id, assoc.id));
160
+ strengthened++;
161
+ }
162
+ else {
163
+ // Weaken: decrease weight slightly (but don't go below 1)
164
+ await db
165
+ .update(schema.memoryAssociations)
166
+ .set({
167
+ weight: sql `GREATEST(${schema.memoryAssociations.weight} - 0.5, 1)`,
168
+ })
169
+ .where(eq(schema.memoryAssociations.id, assoc.id));
170
+ weakened++;
171
+ }
172
+ }
173
+ }
174
+ catch (error) {
175
+ logger.debug('Error updating association weights', {
176
+ memoryId: feedback.memoryId,
177
+ error: error,
178
+ });
179
+ }
180
+ }
181
+ }
182
+ // Clear the buffer after flushing
183
+ feedbackBuffer.clear();
184
+ logger.info('Feedback flushed', { strengthened, weakened, total });
185
+ return { strengthened, weakened, total };
186
+ }
187
+ /**
188
+ * Start the periodic feedback flush timer.
189
+ */
190
+ export function startFeedbackFlushTimer() {
191
+ if (flushTimer)
192
+ return;
193
+ flushTimer = setInterval(async () => {
194
+ try {
195
+ await flushFeedback();
196
+ }
197
+ catch (error) {
198
+ logger.error('Error flushing feedback', { error: error });
199
+ }
200
+ }, FLUSH_INTERVAL_MS);
201
+ logger.info('Feedback flush timer started', { intervalMs: FLUSH_INTERVAL_MS });
202
+ }
203
+ /**
204
+ * Stop the periodic feedback flush timer.
205
+ */
206
+ export function stopFeedbackFlushTimer() {
207
+ if (flushTimer) {
208
+ clearInterval(flushTimer);
209
+ flushTimer = null;
210
+ logger.info('Feedback flush timer stopped');
211
+ }
212
+ }
213
+ //# sourceMappingURL=retrieval-feedback.js.map
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Stale Memory Cleaner
3
+ * Deletes memories that are old, low-confidence, and low-importance
4
+ */
5
+ export interface StaleMemory {
6
+ id: string;
7
+ content: string;
8
+ type: string;
9
+ createdAt: Date;
10
+ confidenceLevel: string | null;
11
+ importanceScore: number | null;
12
+ isPinned: boolean;
13
+ }
14
+ export interface StaleMemoryQuery {
15
+ olderThanDays: number;
16
+ confidenceLevels: string[];
17
+ minImportance: number;
18
+ projectId?: string;
19
+ }
20
+ export declare function getStaleMemories(query: StaleMemoryQuery): Promise<StaleMemory[]>;
21
+ export declare function deleteMemoryPermanently(memoryId: string): Promise<void>;
22
+ export declare function runAutoClean(options?: Partial<StaleMemoryQuery>): Promise<{
23
+ deleted: number;
24
+ summary: Record<string, unknown>;
25
+ }>;
26
+ //# sourceMappingURL=stale-cleaner.d.ts.map
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Stale Memory Cleaner
3
+ * Deletes memories that are old, low-confidence, and low-importance
4
+ */
5
+ import { getDb } from '../../db/index.js';
6
+ import { getSchema } from '../../db/schema.js';
7
+ import { lt, or, and, eq, lte } from 'drizzle-orm';
8
+ export async function getStaleMemories(query) {
9
+ const db = await getDb();
10
+ if (!db)
11
+ return [];
12
+ const schema = await getSchema();
13
+ const sqliteDb = db;
14
+ const cutoffDate = new Date(Date.now() - query.olderThanDays * 24 * 60 * 60 * 1000);
15
+ // Build conditions
16
+ const conditions = [
17
+ // Not pinned
18
+ or(eq(schema.memories.isPinned, false), eq(schema.memories.isPinned, null)),
19
+ // Older than cutoff
20
+ lt(schema.memories.createdAt, cutoffDate),
21
+ ];
22
+ // Confidence level filter
23
+ if (query.confidenceLevels.length > 0) {
24
+ conditions.push(or(...query.confidenceLevels.map(level => eq(schema.memories.confidenceLevel, level))));
25
+ }
26
+ // Importance filter (below threshold)
27
+ conditions.push(lte(schema.memories.importanceScore, query.minImportance));
28
+ // Project filter if specified
29
+ if (query.projectId) {
30
+ conditions.push(eq(schema.memories.projectId, query.projectId));
31
+ }
32
+ try {
33
+ const results = await sqliteDb
34
+ .select({
35
+ id: schema.memories.id,
36
+ content: schema.memories.content,
37
+ type: schema.memories.type,
38
+ createdAt: schema.memories.createdAt,
39
+ confidenceLevel: schema.memories.confidenceLevel,
40
+ importanceScore: schema.memories.importanceScore,
41
+ isPinned: schema.memories.isPinned,
42
+ })
43
+ .from(schema.memories)
44
+ .where(and(...conditions.filter(Boolean)));
45
+ return results.map((r) => ({
46
+ ...r,
47
+ isPinned: Boolean(r.isPinned),
48
+ }));
49
+ }
50
+ catch (error) {
51
+ console.error('[StaleCleaner] Error querying stale memories:', error);
52
+ return [];
53
+ }
54
+ }
55
+ export async function deleteMemoryPermanently(memoryId) {
56
+ const db = await getDb();
57
+ if (!db)
58
+ return;
59
+ const schema = await getSchema();
60
+ const sqliteDb = db;
61
+ try {
62
+ // Delete associated records first
63
+ await sqliteDb.delete(schema.memoryAssociations).where(or(eq(schema.memoryAssociations.fromMemoryId, memoryId), eq(schema.memoryAssociations.toMemoryId, memoryId))).catch(() => { }); // Ignore if table doesn't exist
64
+ // Delete memory tags
65
+ await sqliteDb.delete(schema.memoryTags).where(eq(schema.memoryTags.memoryId, memoryId)).catch(() => { }); // Ignore if table doesn't exist
66
+ // Delete the memory itself
67
+ await sqliteDb.delete(schema.memories).where(eq(schema.memories.id, memoryId));
68
+ }
69
+ catch (error) {
70
+ console.error(`[StaleCleaner] Error deleting memory ${memoryId}:`, error);
71
+ throw error;
72
+ }
73
+ }
74
+ export async function runAutoClean(options) {
75
+ const defaultOptions = {
76
+ olderThanDays: options?.olderThanDays || 30,
77
+ confidenceLevels: options?.confidenceLevels || ['outdated', 'speculative'],
78
+ minImportance: options?.minImportance || 40,
79
+ };
80
+ const stale = await getStaleMemories(defaultOptions);
81
+ let deleted = 0;
82
+ for (const memory of stale) {
83
+ if (!memory.isPinned) {
84
+ await deleteMemoryPermanently(memory.id);
85
+ deleted++;
86
+ }
87
+ }
88
+ return {
89
+ deleted,
90
+ summary: {
91
+ scanned: stale.length,
92
+ skippedPinned: stale.length - deleted,
93
+ criteria: defaultOptions,
94
+ },
95
+ };
96
+ }
97
+ //# sourceMappingURL=stale-cleaner.js.map
@@ -14,6 +14,16 @@ export interface MemoryStats {
14
14
  newestMemory?: string;
15
15
  projectPath: string;
16
16
  mode: string;
17
+ signal?: {
18
+ captured: number;
19
+ suppressed: number;
20
+ sessionOnly: number;
21
+ durable: number;
22
+ durableWithRaw: number;
23
+ tokensSaved: number;
24
+ placeRouted: number;
25
+ graphEnriched: number;
26
+ };
17
27
  }
18
28
  /**
19
29
  * Get memory statistics for a project
@@ -5,8 +5,9 @@
5
5
  import { getDb } from '../../db/index.js';
6
6
  import { getSchema } from '../../db/schema.js';
7
7
  import { config } from '../../config.js';
8
- import { requireProject } from '../../core/projects.js';
8
+ import { ensureProject } from '../../core/projects.js';
9
9
  import { createDatabaseClient } from '../storage/database.js';
10
+ import { getProjectSignalStats } from '../session/working-set.js';
10
11
  /**
11
12
  * Get memory statistics for a project
12
13
  */
@@ -19,7 +20,10 @@ export async function getMemoryStats(projectPath = process.cwd()) {
19
20
  throw new Error(`Database unavailable: ${error instanceof Error ? error.message : 'Unknown error'}`);
20
21
  }
21
22
  const schema = await getSchema();
22
- const project = await requireProject(projectPath);
23
+ const project = await ensureProject(projectPath);
24
+ if (!project) {
25
+ throw new Error(`Project not found: ${projectPath}`);
26
+ }
23
27
  const stats = {
24
28
  totalMemories: 0,
25
29
  byType: {},
@@ -29,7 +33,7 @@ export async function getMemoryStats(projectPath = process.cwd()) {
29
33
  learningsByType: {},
30
34
  totalLinks: 0,
31
35
  projectPath,
32
- mode: config.isTeamMode ? 'team' : 'local'
36
+ mode: config.isTeamMode ? 'team' : 'local',
33
37
  };
34
38
  try {
35
39
  // Count total memories
@@ -132,6 +136,7 @@ export async function getMemoryStats(projectPath = process.cwd()) {
132
136
  // Return empty stats on error
133
137
  console.error('Error getting memory stats:', error);
134
138
  }
139
+ stats.signal = await getProjectSignalStats(projectPath);
135
140
  return stats;
136
141
  }
137
142
  import { eq, sql, asc, desc } from 'drizzle-orm';
@@ -6,9 +6,16 @@ export interface MemorySignals {
6
6
  preference: boolean;
7
7
  workflowRule: boolean;
8
8
  lesson: boolean;
9
+ note: boolean;
10
+ important: boolean;
11
+ hack: boolean;
12
+ why: boolean;
13
+ todo: boolean;
14
+ fixme: boolean;
9
15
  };
10
- suggestedType: 'observation' | 'fact' | 'decision' | 'context' | 'preference';
16
+ suggestedType: 'observation' | 'fact' | 'decision' | 'context' | 'preference' | 'task';
11
17
  priority: 'normal' | 'high';
18
+ confidence: 'certain' | 'speculative' | 'inferred';
12
19
  }
13
20
  export declare function detectMemorySignals(content: string): MemorySignals;
14
21
  //# sourceMappingURL=trigger-detector.d.ts.map
@@ -8,6 +8,15 @@ const EXPLICIT_TRIGGER_PATTERNS = [
8
8
  { label: 'save-this', regex: /\bsave\s+this\b/i },
9
9
  { label: 'log-this', regex: /\blog\s+this\b/i },
10
10
  { label: 'important', regex: /\bimportant\s*:/i },
11
+ // New: Rationale comment triggers
12
+ { label: 'NOTE', regex: /NOTE:/i },
13
+ { label: 'IMPORTANT', regex: /IMPORTANT:/i },
14
+ { label: 'HACK', regex: /HACK:/i },
15
+ { label: 'WHY', regex: /WHY:/i },
16
+ { label: 'TODO', regex: /TODO:/i },
17
+ { label: 'FIXME', regex: /FIXME:/i },
18
+ { label: 'XXX', regex: /XXX:/i },
19
+ { label: 'DEPRECATED', regex: /DEPRECATED:/i },
11
20
  ];
12
21
  export function detectMemorySignals(content) {
13
22
  const text = content.trim();
@@ -20,23 +29,51 @@ export function detectMemorySignals(content) {
20
29
  /\b(?:always|never)\b/i.test(text),
21
30
  workflowRule: /\b(?:let'?s\s+always\s+do\s+it\s+this\s+way|standard\s+workflow|runbook)\b/i.test(text),
22
31
  lesson: /\b(?:failed\s+because|lesson\s+learned|next\s+time|do\s+not\s+repeat|root\s+cause)\b/i.test(text),
32
+ // New: Rationale patterns from code comments
33
+ note: /NOTE:/i.test(text),
34
+ important: /IMPORTANT:/i.test(text),
35
+ hack: /HACK:/i.test(text),
36
+ why: /WHY:/i.test(text),
37
+ todo: /TODO:/i.test(text),
38
+ fixme: /FIXME:/i.test(text),
23
39
  };
24
40
  let suggestedType = 'observation';
25
- if (implicit.preference)
26
- suggestedType = 'preference';
41
+ // Priority order: decision > preference > lesson > workflowRule > rationale > fact
27
42
  if (implicit.decision)
28
43
  suggestedType = 'decision';
29
- if (implicit.workflowRule || implicit.lesson)
44
+ else if (implicit.preference)
45
+ suggestedType = 'preference';
46
+ else if (implicit.workflowRule || implicit.lesson)
30
47
  suggestedType = 'context';
31
- if (!implicit.decision && !implicit.preference && /\b(?:is|are|was|were|uses|has|have)\b/i.test(text)) {
48
+ else if (implicit.todo)
49
+ suggestedType = 'task';
50
+ else if (!implicit.decision && !implicit.preference && /\b(?:is|are|was|were|uses|has|have)\b/i.test(text)) {
32
51
  suggestedType = 'fact';
33
52
  }
34
- const priority = explicitTriggers.length > 0 || implicit.correction ? 'high' : 'normal';
53
+ // Override for specific rationale markers
54
+ if (implicit.note || implicit.important)
55
+ suggestedType = 'observation';
56
+ if (implicit.why)
57
+ suggestedType = 'context';
58
+ // Determine confidence based on signal strength
59
+ let confidence = 'certain';
60
+ if (implicit.note || implicit.todo)
61
+ confidence = 'speculative';
62
+ if (implicit.hack || implicit.fixme)
63
+ confidence = 'certain'; // Known issues are certain
64
+ const priority = explicitTriggers.length > 0 ||
65
+ implicit.correction ||
66
+ implicit.important ||
67
+ implicit.hack ||
68
+ implicit.fixme
69
+ ? 'high'
70
+ : 'normal';
35
71
  return {
36
72
  explicitTriggers,
37
73
  implicit,
38
74
  suggestedType,
39
75
  priority,
76
+ confidence,
40
77
  };
41
78
  }
42
79
  //# sourceMappingURL=trigger-detector.js.map
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Places Module - Spatial memory organization (Method of Loci)
2
+ * Places Module - Spatial memory organization
3
3
  *
4
4
  * Exports:
5
5
  * - places.ts: CRUD operations for places
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Places Module - Spatial memory organization (Method of Loci)
2
+ * Places Module - Spatial memory organization
3
3
  *
4
4
  * Exports:
5
5
  * - places.ts: CRUD operations for places