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
@@ -3,7 +3,6 @@
3
3
  * Calculates and manages memory importance scores (0-100) with temporal decay
4
4
  */
5
5
  import type { Memory } from '../../db/drizzle/schema.js';
6
- import { cosineSimilarity as vectorCosineSimilarity } from '../utils/vector-operations.js';
7
6
  export interface ImportanceScore {
8
7
  score: number;
9
8
  components: {
@@ -27,16 +26,6 @@ export declare function calculateImportance(memory: Partial<Memory>): Importance
27
26
  * Used when memory is accessed or modified
28
27
  */
29
28
  export declare function updateImportanceScore(memoryId: string, incrementAccess?: boolean): Promise<number>;
30
- /**
31
- * Decay importance scores for old memories
32
- * Should be run periodically (e.g., daily) to reduce scores of stale memories
33
- *
34
- * This function applies exponential decay to all memories that haven't been
35
- * recalculated recently, keeping the system's importance scores current.
36
- *
37
- * Fixed: Uses batch update instead of N+1 individual queries
38
- */
39
- export declare function decayImportanceScores(projectId?: string): Promise<number>;
40
29
  /**
41
30
  * Get low-importance memories that are candidates for consolidation
42
31
  * These are old, rarely accessed memories with low importance scores
@@ -54,10 +43,4 @@ export declare function setImportanceScore(memoryId: string, score: number): Pro
54
43
  * Pin a memory to prevent decay and consolidation
55
44
  */
56
45
  export declare function pinMemory(memoryId: string, pinned?: boolean): Promise<void>;
57
- /**
58
- * Calculate cosine similarity between two vectors
59
- * Re-exported from core/utils/vector-operations.ts for backward compatibility.
60
- * This will be removed in v1.2.0 - import directly from core/utils/vector-operations.ts
61
- */
62
- export declare const cosineSimilarity: typeof vectorCosineSimilarity;
63
46
  //# sourceMappingURL=importance.d.ts.map
@@ -3,7 +3,6 @@
3
3
  * Calculates and manages memory importance scores (0-100) with temporal decay
4
4
  */
5
5
  import { eq } from 'drizzle-orm';
6
- import { cosineSimilarity as vectorCosineSimilarity } from '../utils/vector-operations.js';
7
6
  import { getDbClient } from '../lib/db-client.js';
8
7
  /**
9
8
  * Type weights for importance scoring
@@ -170,57 +169,6 @@ export async function updateImportanceScore(memoryId, incrementAccess = false) {
170
169
  .where(eq(schema.memories.id, memoryId));
171
170
  return importance.score;
172
171
  }
173
- /**
174
- * Decay importance scores for old memories
175
- * Should be run periodically (e.g., daily) to reduce scores of stale memories
176
- *
177
- * This function applies exponential decay to all memories that haven't been
178
- * recalculated recently, keeping the system's importance scores current.
179
- *
180
- * Fixed: Uses batch update instead of N+1 individual queries
181
- */
182
- export async function decayImportanceScores(projectId) {
183
- const { db, schema, raw } = await getDbClient();
184
- // Get memories that need recalculation
185
- // (those not recalculated in the last 24 hours or never)
186
- const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000);
187
- // Use raw SQL for bulk update - avoids N+1 queries - let's use raw SQL for efficiency
188
- // Build a single UPDATE that sets importance to base 50 (neutral) minus decay
189
- // The JS calculation is too complex to port to SQL, but we can at least
190
- // use a simpler approach: just reset to default and let individual recalc happen on access
191
- // For now, use a more efficient approach: bulk update with raw SQL
192
- // This avoids N+1 queries while still using the JS calculation logic
193
- const clientType = raw.$clientType || 'sqlite';
194
- const now = new Date().toISOString();
195
- if (clientType === 'sqlite') {
196
- const sqliteClient = raw.$client;
197
- // Single SQL update - set all non-pinned/consolidated memories to base decay
198
- // Note: We can't fully replicate the JS calculation in SQL, so we apply
199
- // a simple decay multiplier. Full recalculation happens on access.
200
- const result = sqliteClient.prepare(`
201
- UPDATE memories
202
- SET importance_score = MAX(0, importance_score - 1),
203
- last_importance_recalc = ?
204
- WHERE (is_pinned = 0 AND is_protected = 0 AND is_consolidated = 0)
205
- AND (last_importance_recalc IS NULL OR last_importance_recalc < ?)
206
- ${projectId ? 'AND project_id = ?' : ''}
207
- `).run(now, oneDayAgo.toISOString(), ...(projectId ? [projectId] : []));
208
- return result.changes;
209
- }
210
- else {
211
- // PostgreSQL
212
- const pgClient = raw.$client;
213
- const result = await pgClient.query(`
214
- UPDATE memories
215
- SET importance_score = GREATEST(0, importance_score - 1),
216
- last_importance_recalc = $1
217
- WHERE (is_pinned = FALSE AND is_protected = FALSE AND is_consolidated = FALSE)
218
- AND (last_importance_recalc IS NULL OR last_importance_recalc < $2)
219
- ${projectId ? 'AND project_id = $3' : ''}
220
- `, [now, oneDayAgo.toISOString(), ...(projectId ? [projectId] : [])]);
221
- return result.rowCount || 0;
222
- }
223
- }
224
172
  /**
225
173
  * Get low-importance memories that are candidates for consolidation
226
174
  * These are old, rarely accessed memories with low importance scores
@@ -289,10 +237,5 @@ export async function pinMemory(memoryId, pinned = true) {
289
237
  })
290
238
  .where(eq(schema.memories.id, memoryId));
291
239
  }
292
- /**
293
- * Calculate cosine similarity between two vectors
294
- * Re-exported from core/utils/vector-operations.ts for backward compatibility.
295
- * This will be removed in v1.2.0 - import directly from core/utils/vector-operations.ts
296
- */
297
- export const cosineSimilarity = vectorCosineSimilarity;
240
+ // cosineSimilarity has been removed - import from core/utils/vector-operations.ts directly
298
241
  //# sourceMappingURL=importance.js.map
@@ -1,3 +1,4 @@
1
+ export * from './normalization.js';
1
2
  export * from './memories.js';
2
3
  export * from './memory-manager.js';
3
4
  export * from './serialization.js';
@@ -1,4 +1,5 @@
1
1
  // Memory feature - Store and manage memories
2
+ export * from './normalization.js';
2
3
  export * from './memories.js';
3
4
  export * from './memory-manager.js';
4
5
  export * from './serialization.js';
@@ -1,4 +1,4 @@
1
- export type MemoryType = 'observation' | 'fact' | 'decision' | 'context' | 'preference' | 'note';
1
+ import { MemoryRecord, MemoryType } from '../lib/types.js';
2
2
  export interface RememberInput {
3
3
  content: string;
4
4
  type?: MemoryType;
@@ -12,6 +12,9 @@ export interface RememberInput {
12
12
  exceptions?: string;
13
13
  tier?: 'hot' | 'cold';
14
14
  namespaceId?: string;
15
+ sessionId?: string;
16
+ sessionStartTime?: string;
17
+ toolName?: string;
15
18
  }
16
19
  export interface SearchInput {
17
20
  query: string;
@@ -19,22 +22,10 @@ export interface SearchInput {
19
22
  tags?: string[];
20
23
  limit?: number;
21
24
  project?: string;
22
- }
23
- export interface MemoryRecord {
24
- id: string;
25
- projectId?: string | null;
26
- type: MemoryType;
27
- content: string;
28
- summary?: string | null;
29
- tags: string[];
30
- metadata?: Record<string, unknown> | null;
31
- createdAt?: string | null;
32
- validFrom?: string | null;
33
- validTo?: string | null;
34
- recordedAt?: string | null;
35
- similarity?: number;
36
- importance?: number;
37
- confidenceLevel?: 'certain' | 'speculative' | 'outdated' | null;
25
+ placeId?: string;
26
+ placeType?: string;
27
+ sessionId?: string;
28
+ sessionStartTime?: string;
38
29
  }
39
30
  export interface SearchResult extends MemoryRecord {
40
31
  similarity: number;
@@ -44,4 +35,9 @@ export declare function getMemory(id: string, incrementAccess?: boolean): Promis
44
35
  export declare function setConfidence(id: string, level: 'certain' | 'speculative' | 'outdated'): Promise<boolean>;
45
36
  export declare function getRecent(projectPath: string, limit: number): Promise<MemoryRecord[]>;
46
37
  export declare function search(input: SearchInput): Promise<SearchResult[]>;
38
+ /**
39
+ * Find similar memories to prevent duplicates
40
+ * Returns memories with similarity >= threshold
41
+ */
42
+ export declare function findSimilarMemories(content: string, threshold?: number, limit?: number): Promise<SearchResult[]>;
47
43
  //# sourceMappingURL=memories.d.ts.map
@@ -15,6 +15,12 @@ import { resolveContradictions, applySupersession } from './contradiction-resolv
15
15
  import { encrypt, decrypt } from '../security/encrypt.js';
16
16
  import { estimateTokens } from '../context/context-window.js';
17
17
  import { getDbClient } from '../lib/db-client.js';
18
+ import { extractBeliefsFromMemory } from '../beliefs/extractor.js';
19
+ import { upsertBeliefsForMemory } from '../beliefs/store.js';
20
+ import { extractEntityNames } from './entity-extractor.js';
21
+ import { autoLinkByEntities } from '../associations.js';
22
+ import { addMemoryToGraph } from '../graph/graph-builder.js';
23
+ import { parseEmbedding } from '../lib/parse-embedding.js';
18
24
  export async function rememberMemory(input) {
19
25
  const { db, schema } = await getDbClient();
20
26
  const tags = normalizeTags(input.tags);
@@ -56,6 +62,12 @@ export async function rememberMemory(input) {
56
62
  priority: signals.priority,
57
63
  requiresConflictCheck: signals.implicit.correction,
58
64
  },
65
+ // Session metadata for temporal queries (Task 1)
66
+ sessionMetadata: {
67
+ sessionId: input.sessionId,
68
+ sessionStartTime: input.sessionStartTime,
69
+ toolName: input.toolName,
70
+ },
59
71
  };
60
72
  let metadataValue = serializeMetadata(enrichedMetadata);
61
73
  // Prepare fields for insertion, handling optional encryption
@@ -92,10 +104,58 @@ export async function rememberMemory(input) {
92
104
  insertValues.is_encrypted = false;
93
105
  }
94
106
  await db.insert(schema.memories).values(insertValues);
107
+ if (project?.id) {
108
+ try {
109
+ const beliefs = extractBeliefsFromMemory({
110
+ memoryId: id,
111
+ content: input.content,
112
+ type,
113
+ metadata: enrichedMetadata,
114
+ });
115
+ if (beliefs.length > 0) {
116
+ await upsertBeliefsForMemory({
117
+ projectId: project.id,
118
+ memoryId: id,
119
+ beliefs,
120
+ });
121
+ }
122
+ }
123
+ catch (beliefError) {
124
+ logger.warn(`[Beliefs] Failed to derive beliefs for memory ${id}: ${beliefError}`);
125
+ }
126
+ }
127
+ // Auto-link by entity overlap (synchronous - Task 5)
128
+ // Now memories are immediately findable via associations after storage
129
+ const entityNames = extractEntityNames(input.content);
130
+ if (entityNames.length > 0 && project?.id) {
131
+ try {
132
+ const linked = await autoLinkByEntities(id, entityNames, project.id);
133
+ if (linked > 0)
134
+ logger.debug(`[AutoLink] Linked memory ${id} to ${linked} related memories`);
135
+ }
136
+ catch (err) {
137
+ logger.debug(`[AutoLink] Failed: ${err}`);
138
+ }
139
+ }
140
+ // Build graph for this memory (auto-build if enabled)
141
+ // This populates the entity_entities and entity_relations tables
142
+ if (config.graphAutoBuild && project?.id) {
143
+ try {
144
+ const graphResult = await addMemoryToGraph(id, {
145
+ preferLLM: config.llmEnabled,
146
+ });
147
+ if (graphResult.entitiesCreated > 0 || graphResult.relationsCreated > 0) {
148
+ logger.debug(`[Graph] Built graph for memory ${id}: ${graphResult.entitiesCreated} entities, ${graphResult.relationsCreated} relations`);
149
+ }
150
+ }
151
+ catch (graphError) {
152
+ logger.debug(`[Graph] Failed to build graph for memory ${id}: ${graphError}`);
153
+ }
154
+ }
95
155
  // Append to Obsidian vault if enabled and hot tier (NEW)
96
156
  if (config.obsidianEnabled && config.obsidianVaultPath && insertValues.tier === 'hot') {
97
157
  try {
98
- const { appendToObsidianVault } = await import('../obsidian-vault.js');
158
+ const { appendToObsidianVault } = await import('../integrations/obsidian-vault.js');
99
159
  await appendToObsidianVault({
100
160
  content: input.content,
101
161
  id,
@@ -112,26 +172,6 @@ export async function rememberMemory(input) {
112
172
  logger.warn(`[Obsidian] Failed to append to vault: ${error}`);
113
173
  }
114
174
  }
115
- // Write to external folder memory if enabled and hot tier
116
- if (config.externalMemoryEnabled && config.externalMemoryPath && insertValues.tier === 'hot') {
117
- try {
118
- const { getExternalMemory } = await import('../external-folder/index.js');
119
- const externalMemory = getExternalMemory();
120
- const memoryRecord = {
121
- id,
122
- projectId: project?.id ?? null,
123
- type,
124
- content: input.content,
125
- tags,
126
- createdAt: insertValues.createdAt?.toISOString(),
127
- confidenceLevel: null,
128
- };
129
- await externalMemory.writeMemory(externalMemory.toMarkdownFormat(memoryRecord));
130
- }
131
- catch (error) {
132
- logger.warn(`[ExternalMemory] Failed to write: ${error}`);
133
- }
134
- }
135
175
  // Resolve contradictions and supersede old memories (async, non-blocking)
136
176
  resolveContradictions(input.content, type, project?.id)
137
177
  .then(async (result) => {
@@ -236,62 +276,12 @@ export async function getRecent(projectPath, limit) {
236
276
  export async function search(input) {
237
277
  const limit = clampLimit(input.limit, 10, 1, 100);
238
278
  const tags = normalizeTags(input.tags);
239
- // Get results from database (hybrid search: BM25 + vectors with RRF)
240
- let dbResults;
241
- if (config.isTeamMode) {
242
- dbResults = await searchMemoriesPostgres(input, tags, limit);
243
- }
244
- else {
245
- // Use hybrid search for SQLite (BM25 + vectors with RRF)
246
- dbResults = await hybridSearchImpl(input, { limit });
247
- }
279
+ // Always use hybrid search for both SQLite and PostgreSQL
280
+ // Graph boost requires hybrid path for proper scoring
281
+ const dbResults = await hybridSearchImpl(input, { limit });
248
282
  return dbResults.slice(0, limit);
249
283
  }
250
- /**
251
- * Parse embedding from SQLite storage
252
- */
253
- function parseEmbedding(embeddingData) {
254
- if (!embeddingData)
255
- return null;
256
- // If it's already an array
257
- if (Array.isArray(embeddingData))
258
- return embeddingData;
259
- // If it's a Buffer/Uint8Array
260
- if (embeddingData instanceof Uint8Array || Buffer.isBuffer(embeddingData)) {
261
- // Try to parse as JSON first
262
- try {
263
- const json = JSON.parse(embeddingData.toString());
264
- if (Array.isArray(json))
265
- return json;
266
- }
267
- catch {
268
- // Not JSON, try Float32Array
269
- try {
270
- const buffer = embeddingData.buffer;
271
- const arrayBuffer = buffer instanceof ArrayBuffer
272
- ? buffer
273
- : buffer;
274
- const floatArray = new Float32Array(arrayBuffer);
275
- return Array.from(floatArray);
276
- }
277
- catch {
278
- return null;
279
- }
280
- }
281
- }
282
- // If it's a string
283
- if (typeof embeddingData === 'string') {
284
- try {
285
- const parsed = JSON.parse(embeddingData);
286
- if (Array.isArray(parsed))
287
- return parsed;
288
- }
289
- catch {
290
- return null;
291
- }
292
- }
293
- return null;
294
- }
284
+ // parseEmbedding imported from ../lib/parse-embedding.js
295
285
  async function searchMemoriesSqlite(input, tags, limit) {
296
286
  const { db } = await getDbClient();
297
287
  const sqlite = db.$client;
@@ -446,4 +436,17 @@ function normalizeMemory(row) {
446
436
  confidenceLevel: row.confidenceLevel ?? row.confidence_level ?? null,
447
437
  };
448
438
  }
439
+ /**
440
+ * Find similar memories to prevent duplicates
441
+ * Returns memories with similarity >= threshold
442
+ */
443
+ export async function findSimilarMemories(content, threshold = 0.85, limit = 5) {
444
+ // Use search with high similarity
445
+ const results = await search({
446
+ query: content,
447
+ limit,
448
+ });
449
+ // Filter by similarity threshold
450
+ return results.filter(r => (r.similarity ?? 0) >= threshold);
451
+ }
449
452
  //# sourceMappingURL=memories.js.map
@@ -1,6 +1,6 @@
1
- /** Promote a memory to a higher tier (hot -> warm -> cold) */
1
+ /** Promote a memory to a higher tier (cold -> hot only, simplified from warm hierarchy) */
2
2
  export declare function promoteTier(memoryId: string): Promise<void>;
3
- /** Demote a memory tier or expire it based on decay */
3
+ /** Demote a memory tier or expire it based on decay (simplified: hot -> cold only) */
4
4
  export declare function demoteTier(memoryId: string): Promise<void>;
5
5
  export declare function expireMemory(memoryId: string): Promise<void>;
6
6
  export declare function markMerged(memoryId: string, targetId: string): Promise<void>;
@@ -2,7 +2,7 @@ import { getDb } from '../../db/index.js';
2
2
  import { memories } from '../../db/drizzle/schema.js';
3
3
  import { eq } from 'drizzle-orm';
4
4
  import { logger } from '../logger.js';
5
- /** Promote a memory to a higher tier (hot -> warm -> cold) */
5
+ /** Promote a memory to a higher tier (cold -> hot only, simplified from warm hierarchy) */
6
6
  export async function promoteTier(memoryId) {
7
7
  const db = await getDb();
8
8
  // @ts-ignore - drizzle overloads
@@ -10,15 +10,12 @@ export async function promoteTier(memoryId) {
10
10
  const mem = row[0];
11
11
  if (!mem)
12
12
  return;
13
- let newTier = mem.tier;
14
- if (mem.tier === 'warm')
15
- newTier = 'hot';
16
- else if (mem.tier === 'cold')
17
- newTier = 'warm';
18
- // @ts-ignore
19
- await db.update(memories).set({ tier: newTier }).where(eq(memories.id, memoryId));
13
+ // Simplified: cold -> hot (no warm tier)
14
+ if (mem.tier === 'cold') {
15
+ await db.update(memories).set({ tier: 'hot' }).where(eq(memories.id, memoryId));
16
+ }
20
17
  }
21
- /** Demote a memory tier or expire it based on decay */
18
+ /** Demote a memory tier or expire it based on decay (simplified: hot -> cold only) */
22
19
  export async function demoteTier(memoryId) {
23
20
  const db = await getDb();
24
21
  // @ts-ignore
@@ -26,15 +23,10 @@ export async function demoteTier(memoryId) {
26
23
  const mem = row[0];
27
24
  if (!mem)
28
25
  return;
29
- let updates = {};
30
- if (mem.tier === 'hot')
31
- updates.tier = 'warm';
32
- else if (mem.tier === 'warm')
33
- updates.tier = 'cold';
34
- else
35
- updates.status = 'expired';
36
- // @ts-ignore
37
- await db.update(memories).set(updates).where(eq(memories.id, memoryId));
26
+ // Simplified: hot -> cold (no warm tier)
27
+ if (mem.tier === 'hot') {
28
+ await db.update(memories).set({ tier: 'cold' }).where(eq(memories.id, memoryId));
29
+ }
38
30
  }
39
31
  export async function expireMemory(memoryId) {
40
32
  const db = await getDb();
@@ -2,21 +2,6 @@
2
2
  * Memory normalization utilities
3
3
  * Shared between memories.ts and loader.ts to avoid circular dependencies
4
4
  */
5
- export interface MemoryRecord {
6
- id: string;
7
- projectId?: string | null;
8
- type: string;
9
- content: string;
10
- summary?: string | null;
11
- tags: string[];
12
- metadata?: Record<string, unknown> | null;
13
- createdAt?: string | null;
14
- validFrom?: string | null;
15
- validTo?: string | null;
16
- recordedAt?: string | null;
17
- similarity?: number;
18
- importance?: number;
19
- confidenceLevel?: 'certain' | 'speculative' | 'outdated' | null;
20
- }
5
+ import type { MemoryRecord } from '../lib/types.js';
21
6
  export declare function normalizeMemory(row: any): MemoryRecord;
22
7
  //# sourceMappingURL=normalization.d.ts.map
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Path Strengthener
3
+ *
4
+ * Strengthens association paths that led to successful retrievals and
5
+ * weakens paths that led to irrelevant results. This implements the
6
+ * "optimize" concept: the graph develops its own sense of relevance
7
+ * over time based on actual usage patterns.
8
+ *
9
+ * A customer support agent's graph naturally strengthens paths through
10
+ * product docs and refund policies while letting rarely-queried HR
11
+ * edges decay.
12
+ */
13
+ export interface PathStrengthResult {
14
+ strengthened: number;
15
+ weakened: number;
16
+ pruned: number;
17
+ }
18
+ /**
19
+ * Strengthen the association path between memories that were
20
+ * retrieved together and found useful.
21
+ */
22
+ export declare function strengthenPath(memoryIds: string[], boostAmount?: number): Promise<number>;
23
+ /**
24
+ * Weaken association paths that led to irrelevant results.
25
+ */
26
+ export declare function weakenPath(memoryIds: string[], decayAmount?: number): Promise<number>;
27
+ /**
28
+ * Prune associations that have decayed below a threshold.
29
+ */
30
+ export declare function pruneWeakAssociations(minWeight?: number, maxAge?: number): Promise<number>;
31
+ /**
32
+ * Run a full optimize cycle: strengthen useful paths, weaken unused ones,
33
+ * prune dead associations, and derive implicit facts.
34
+ */
35
+ export declare function runPruneCycle(options?: {
36
+ minWeight?: number;
37
+ maxAge?: number;
38
+ }): Promise<PathStrengthResult>;
39
+ //# sourceMappingURL=path-strengthener.d.ts.map
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Path Strengthener
3
+ *
4
+ * Strengthens association paths that led to successful retrievals and
5
+ * weakens paths that led to irrelevant results. This implements the
6
+ * "optimize" concept: the graph develops its own sense of relevance
7
+ * over time based on actual usage patterns.
8
+ *
9
+ * A customer support agent's graph naturally strengthens paths through
10
+ * product docs and refund policies while letting rarely-queried HR
11
+ * edges decay.
12
+ */
13
+ import { eq, and, or, sql } from 'drizzle-orm';
14
+ import { getDb } from '../../db/index.js';
15
+ import { getSchema } from '../../db/schema.js';
16
+ import { logger } from '../logger.js';
17
+ /**
18
+ * Strengthen the association path between memories that were
19
+ * retrieved together and found useful.
20
+ */
21
+ export async function strengthenPath(memoryIds, boostAmount = 2) {
22
+ if (memoryIds.length < 2)
23
+ return 0;
24
+ const db = await getDb();
25
+ const schema = await getSchema();
26
+ let strengthened = 0;
27
+ // Generate all pairs
28
+ for (let i = 0; i < memoryIds.length; i++) {
29
+ for (let j = i + 1; j < memoryIds.length; j++) {
30
+ try {
31
+ // Check if association exists
32
+ const existing = await db
33
+ .select()
34
+ .from(schema.memoryAssociations)
35
+ .where(or(and(eq(schema.memoryAssociations.fromMemoryId, memoryIds[i]), eq(schema.memoryAssociations.toMemoryId, memoryIds[j])), and(eq(schema.memoryAssociations.fromMemoryId, memoryIds[j]), eq(schema.memoryAssociations.toMemoryId, memoryIds[i]))))
36
+ .limit(1);
37
+ if (existing.length > 0) {
38
+ // Strengthen existing association
39
+ await db
40
+ .update(schema.memoryAssociations)
41
+ .set({
42
+ weight: sql `${schema.memoryAssociations.weight} + ${boostAmount}`,
43
+ coactivationCount: sql `${schema.memoryAssociations.coactivationCount} + 1`,
44
+ lastCoactivatedAt: new Date(),
45
+ })
46
+ .where(eq(schema.memoryAssociations.id, existing[0].id));
47
+ }
48
+ else {
49
+ // Create new association
50
+ await db.insert(schema.memoryAssociations).values({
51
+ fromMemoryId: memoryIds[i],
52
+ toMemoryId: memoryIds[j],
53
+ associationType: 'co_occurred',
54
+ weight: boostAmount,
55
+ coactivationCount: 1,
56
+ lastCoactivatedAt: new Date(),
57
+ });
58
+ }
59
+ strengthened++;
60
+ }
61
+ catch (error) {
62
+ logger.debug('Error strengthening path', {
63
+ from: memoryIds[i],
64
+ to: memoryIds[j],
65
+ error: error,
66
+ });
67
+ }
68
+ }
69
+ }
70
+ return strengthened;
71
+ }
72
+ /**
73
+ * Weaken association paths that led to irrelevant results.
74
+ */
75
+ export async function weakenPath(memoryIds, decayAmount = 0.5) {
76
+ if (memoryIds.length < 2)
77
+ return 0;
78
+ const db = await getDb();
79
+ const schema = await getSchema();
80
+ let weakened = 0;
81
+ for (let i = 0; i < memoryIds.length; i++) {
82
+ for (let j = i + 1; j < memoryIds.length; j++) {
83
+ try {
84
+ const existing = await db
85
+ .select()
86
+ .from(schema.memoryAssociations)
87
+ .where(or(and(eq(schema.memoryAssociations.fromMemoryId, memoryIds[i]), eq(schema.memoryAssociations.toMemoryId, memoryIds[j])), and(eq(schema.memoryAssociations.fromMemoryId, memoryIds[j]), eq(schema.memoryAssociations.toMemoryId, memoryIds[i]))))
88
+ .limit(1);
89
+ if (existing.length > 0) {
90
+ // Weaken but don't remove (minimum weight of 1)
91
+ await db
92
+ .update(schema.memoryAssociations)
93
+ .set({
94
+ weight: sql `GREATEST(${schema.memoryAssociations.weight} - ${decayAmount}, 1)`,
95
+ })
96
+ .where(eq(schema.memoryAssociations.id, existing[0].id));
97
+ weakened++;
98
+ }
99
+ }
100
+ catch (error) {
101
+ logger.debug('Error weakening path', {
102
+ from: memoryIds[i],
103
+ to: memoryIds[j],
104
+ error: error,
105
+ });
106
+ }
107
+ }
108
+ }
109
+ return weakened;
110
+ }
111
+ /**
112
+ * Prune associations that have decayed below a threshold.
113
+ */
114
+ export async function pruneWeakAssociations(minWeight = 2, maxAge = 90 // days
115
+ ) {
116
+ const db = await getDb();
117
+ const schema = await getSchema();
118
+ const cutoffDate = new Date();
119
+ cutoffDate.setDate(cutoffDate.getDate() - maxAge);
120
+ try {
121
+ // Delete associations that are weak AND old
122
+ const result = await db
123
+ .delete(schema.memoryAssociations)
124
+ .where(and(sql `${schema.memoryAssociations.weight} < ${minWeight}`, sql `${schema.memoryAssociations.lastCoactivatedAt} < ${cutoffDate}`));
125
+ const pruned = result?.rowCount ?? 0;
126
+ logger.info('Pruned weak associations', { pruned, minWeight, maxAge });
127
+ return pruned;
128
+ }
129
+ catch (error) {
130
+ logger.error('Error pruning weak associations', { error: error });
131
+ return 0;
132
+ }
133
+ }
134
+ /**
135
+ * Run a full optimize cycle: strengthen useful paths, weaken unused ones,
136
+ * prune dead associations, and derive implicit facts.
137
+ */
138
+ export async function runPruneCycle(options) {
139
+ const { minWeight = 2, maxAge = 90 } = options || {};
140
+ logger.info('Starting prune cycle', { minWeight, maxAge });
141
+ // Step 1: Prune weak associations
142
+ const pruned = await pruneWeakAssociations(minWeight, maxAge);
143
+ logger.info('Prune cycle completed', { pruned });
144
+ return {
145
+ strengthened: 0, // Strengthening happens via retrieval feedback
146
+ weakened: 0, // Weakening happens via retrieval feedback
147
+ pruned,
148
+ };
149
+ }
150
+ //# sourceMappingURL=path-strengthener.js.map