squish-memory 1.1.5 → 1.2.1

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 (646) 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 +44 -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/{dist/core/algorithms/index.js → core/algorithms/index.ts} +39 -26
  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/{dist/core/lib/db-client.d.ts → core/lib/db-client.ts} +168 -114
  81. package/core/lib/parse-embedding.ts +59 -0
  82. package/{dist/core/lib/schemas.js → core/lib/schemas.ts} +102 -87
  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/{dist/core/memory/index.js → core/memory/index.ts} +11 -10
  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/{dist/core/places/index.js → core/places/index.ts} +12 -12
  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 +590 -0
  140. package/core/scheduler/heartbeat.ts +91 -0
  141. package/{dist/core/scheduler/index.js → core/scheduler/index.ts} +8 -8
  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/{dist/core/search/index.js → core/search/index.ts} +4 -5
  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/{dist/core/session/index.js → core/session/index.ts} +7 -7
  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/{dist/core/snapshots/cleanup.js → core/snapshots/cleanup.ts} +13 -12
  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/{dist/core/summarization/cleanup.js → core/summarization/cleanup.ts} +13 -12
  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/{dist/core/utils/vector-operations.js → core/utils/vector-operations.ts} +135 -129
  185. package/core/utils/version-management.ts +74 -0
  186. package/core/worker.ts +333 -0
  187. package/db/adapter.ts +215 -0
  188. package/{dist/db/bootstrap.js → db/bootstrap.ts} +388 -418
  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/mcp.json.example +8 -11
  220. package/package.json +140 -159
  221. package/packages/cli/package.json +22 -0
  222. package/packages/cli/src/commands/clean.ts +68 -0
  223. package/packages/cli/src/commands/context.ts +79 -0
  224. package/packages/cli/src/commands/doctor.ts +357 -0
  225. package/packages/cli/src/commands/forget.ts +72 -0
  226. package/packages/cli/src/commands/health.ts +36 -0
  227. package/packages/cli/src/commands/inspect.ts +41 -0
  228. package/packages/cli/src/commands/link.ts +50 -0
  229. package/packages/cli/src/commands/migrate.ts +93 -0
  230. package/packages/cli/src/commands/recall.ts +99 -0
  231. package/packages/cli/src/commands/recent.ts +57 -0
  232. package/packages/cli/src/commands/remember.ts +139 -0
  233. package/packages/cli/src/commands/run.ts +58 -0
  234. package/packages/cli/src/commands/stale.ts +43 -0
  235. package/packages/cli/src/commands/stats.ts +42 -0
  236. package/packages/cli/src/index.ts +57 -0
  237. package/packages/cli/tsconfig.json +24 -0
  238. package/packages/mcp/package.json +26 -0
  239. package/packages/mcp/src/index.ts +940 -0
  240. package/packages/mcp/tsconfig.json +20 -0
  241. package/skills/squish-memory/SKILL.md +38 -35
  242. package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
  243. package/skills/squish-memory/references/claude-desktop.json +12 -0
  244. package/skills/squish-memory/references/openclaw.json +13 -0
  245. package/skills/squish-memory/references/opencode.json +14 -0
  246. package/config/hooks/claude-code-hooks.json +0 -39
  247. package/config/hooks/cursor-hooks.json +0 -30
  248. package/config/hooks/opencode-hooks.json +0 -30
  249. package/config/hooks/windsurf-hooks.json +0 -30
  250. package/config/mcp-cli-fallback-policy.json +0 -22
  251. package/config/mcp.json +0 -38
  252. package/config/plugin-manifest.json +0 -101
  253. package/config/plugin-manifest.schema.json +0 -244
  254. package/config/plugin.json +0 -32
  255. package/config/remote-memory-policy.json +0 -32
  256. package/core/commands/context-paging.md +0 -51
  257. package/core/commands/context-status.md +0 -22
  258. package/core/commands/context.md +0 -5
  259. package/core/commands/core-memory.md +0 -56
  260. package/core/commands/health.md +0 -5
  261. package/core/commands/init.md +0 -39
  262. package/core/commands/merge.md +0 -113
  263. package/core/commands/recall.md +0 -5
  264. package/core/commands/remember.md +0 -11
  265. package/core/commands/search.md +0 -10
  266. package/dist/config.d.ts +0 -83
  267. package/dist/config.js +0 -242
  268. package/dist/core/adapters/config/claude-code.d.ts +0 -45
  269. package/dist/core/adapters/config/claude-code.js +0 -113
  270. package/dist/core/adapters/config/cursor.d.ts +0 -26
  271. package/dist/core/adapters/config/cursor.js +0 -74
  272. package/dist/core/adapters/config/opencode.d.ts +0 -23
  273. package/dist/core/adapters/config/opencode.js +0 -73
  274. package/dist/core/adapters/config/windsurf.d.ts +0 -26
  275. package/dist/core/adapters/config/windsurf.js +0 -74
  276. package/dist/core/adapters/index.d.ts +0 -45
  277. package/dist/core/adapters/index.js +0 -84
  278. package/dist/core/adapters/scripts/install-adapter.d.ts +0 -19
  279. package/dist/core/adapters/scripts/install-adapter.js +0 -149
  280. package/dist/core/adapters/timeline.d.ts +0 -23
  281. package/dist/core/adapters/timeline.js +0 -88
  282. package/dist/core/adapters/types.d.ts +0 -157
  283. package/dist/core/adapters/types.js +0 -50
  284. package/dist/core/algorithms/analytics/token-estimator.d.ts +0 -50
  285. package/dist/core/algorithms/analytics/token-estimator.js +0 -154
  286. package/dist/core/algorithms/detection/hash-filters.d.ts +0 -47
  287. package/dist/core/algorithms/detection/hash-filters.js +0 -190
  288. package/dist/core/algorithms/detection/semantic-ranker.d.ts +0 -32
  289. package/dist/core/algorithms/detection/semantic-ranker.js +0 -118
  290. package/dist/core/algorithms/detection/two-stage-detector.d.ts +0 -52
  291. package/dist/core/algorithms/detection/two-stage-detector.js +0 -299
  292. package/dist/core/algorithms/handlers/approve-merge.d.ts +0 -22
  293. package/dist/core/algorithms/handlers/approve-merge.js +0 -179
  294. package/dist/core/algorithms/handlers/detect-duplicates.d.ts +0 -47
  295. package/dist/core/algorithms/handlers/detect-duplicates.js +0 -145
  296. package/dist/core/algorithms/handlers/get-stats.d.ts +0 -39
  297. package/dist/core/algorithms/handlers/get-stats.js +0 -88
  298. package/dist/core/algorithms/handlers/list-proposals.d.ts +0 -45
  299. package/dist/core/algorithms/handlers/list-proposals.js +0 -83
  300. package/dist/core/algorithms/handlers/preview-merge.d.ts +0 -39
  301. package/dist/core/algorithms/handlers/preview-merge.js +0 -93
  302. package/dist/core/algorithms/handlers/reject-merge.d.ts +0 -28
  303. package/dist/core/algorithms/handlers/reject-merge.js +0 -69
  304. package/dist/core/algorithms/handlers/reverse-merge.d.ts +0 -21
  305. package/dist/core/algorithms/handlers/reverse-merge.js +0 -121
  306. package/dist/core/algorithms/index.d.ts +0 -21
  307. package/dist/core/algorithms/operations/cache-maintenance.d.ts +0 -12
  308. package/dist/core/algorithms/operations/cache-maintenance.js +0 -157
  309. package/dist/core/algorithms/safety/safety-checks.d.ts +0 -22
  310. package/dist/core/algorithms/safety/safety-checks.js +0 -179
  311. package/dist/core/algorithms/strategies/merge-strategies.d.ts +0 -50
  312. package/dist/core/algorithms/strategies/merge-strategies.js +0 -288
  313. package/dist/core/algorithms/types.d.ts +0 -133
  314. package/dist/core/algorithms/types.js +0 -5
  315. package/dist/core/algorithms/utils/response-builder.d.ts +0 -28
  316. package/dist/core/algorithms/utils/response-builder.js +0 -37
  317. package/dist/core/associations.d.ts +0 -31
  318. package/dist/core/associations.js +0 -248
  319. package/dist/core/autosave.d.ts +0 -19
  320. package/dist/core/autosave.js +0 -16
  321. package/dist/core/commands/managed-sync.d.ts +0 -10
  322. package/dist/core/commands/managed-sync.js +0 -64
  323. package/dist/core/commands/mcp-server.d.ts +0 -3
  324. package/dist/core/commands/mcp-server.js +0 -739
  325. package/dist/core/consolidation.d.ts +0 -37
  326. package/dist/core/consolidation.js +0 -248
  327. package/dist/core/context/agent-context.d.ts +0 -106
  328. package/dist/core/context/agent-context.js +0 -274
  329. package/dist/core/context/context-paging.d.ts +0 -80
  330. package/dist/core/context/context-paging.js +0 -328
  331. package/dist/core/context/context-window.d.ts +0 -40
  332. package/dist/core/context/context-window.js +0 -177
  333. package/dist/core/context/context.d.ts +0 -7
  334. package/dist/core/context/context.js +0 -22
  335. package/dist/core/embeddings/google-multimodal.d.ts +0 -14
  336. package/dist/core/embeddings/google-multimodal.js +0 -142
  337. package/dist/core/embeddings/qmd-client.d.ts +0 -136
  338. package/dist/core/embeddings/qmd-client.js +0 -403
  339. package/dist/core/embeddings.d.ts +0 -29
  340. package/dist/core/embeddings.js +0 -454
  341. package/dist/core/error-handling.d.ts +0 -63
  342. package/dist/core/error-handling.js +0 -173
  343. package/dist/core/external-folder/index.d.ts +0 -102
  344. package/dist/core/external-folder/index.js +0 -294
  345. package/dist/core/hooks/agent-hooks.d.ts +0 -74
  346. package/dist/core/hooks/agent-hooks.js +0 -244
  347. package/dist/core/hooks/auto-tagger.d.ts +0 -19
  348. package/dist/core/hooks/auto-tagger.js +0 -155
  349. package/dist/core/hooks/capture-filter.d.ts +0 -41
  350. package/dist/core/hooks/capture-filter.js +0 -128
  351. package/dist/core/index.d.ts +0 -10
  352. package/dist/core/index.js +0 -14
  353. package/dist/core/ingestion/agent-memory.d.ts +0 -22
  354. package/dist/core/ingestion/agent-memory.js +0 -109
  355. package/dist/core/ingestion/core-memory.d.ts +0 -78
  356. package/dist/core/ingestion/core-memory.js +0 -226
  357. package/dist/core/ingestion/learnings.d.ts +0 -57
  358. package/dist/core/ingestion/learnings.js +0 -202
  359. package/dist/core/layers/generator.d.ts +0 -25
  360. package/dist/core/layers/generator.js +0 -76
  361. package/dist/core/lib/db-client.js +0 -130
  362. package/dist/core/lib/schemas.d.ts +0 -129
  363. package/dist/core/lib/utils.d.ts +0 -14
  364. package/dist/core/lib/utils.js +0 -90
  365. package/dist/core/lib/validation.d.ts +0 -38
  366. package/dist/core/lib/validation.js +0 -151
  367. package/dist/core/lifecycle.d.ts +0 -26
  368. package/dist/core/lifecycle.js +0 -302
  369. package/dist/core/local-embeddings.d.ts +0 -11
  370. package/dist/core/logger.d.ts +0 -16
  371. package/dist/core/logger.js +0 -40
  372. package/dist/core/mcp/client.d.ts +0 -17
  373. package/dist/core/mcp/client.js +0 -101
  374. package/dist/core/mcp/index.d.ts +0 -6
  375. package/dist/core/mcp/index.js +0 -6
  376. package/dist/core/mcp/server.d.ts +0 -18
  377. package/dist/core/mcp/server.js +0 -157
  378. package/dist/core/mcp/standalone-server.d.ts +0 -13
  379. package/dist/core/mcp/standalone-server.js +0 -46
  380. package/dist/core/mcp/tools.d.ts +0 -9
  381. package/dist/core/mcp/tools.js +0 -365
  382. package/dist/core/mcp/types.d.ts +0 -315
  383. package/dist/core/mcp/types.js +0 -48
  384. package/dist/core/memory/bridge-discovery.d.ts +0 -50
  385. package/dist/core/memory/bridge-discovery.js +0 -291
  386. package/dist/core/memory/categorizer.d.ts +0 -27
  387. package/dist/core/memory/categorizer.js +0 -305
  388. package/dist/core/memory/conflict-detector.d.ts +0 -7
  389. package/dist/core/memory/conflict-detector.js +0 -43
  390. package/dist/core/memory/consolidation.d.ts +0 -42
  391. package/dist/core/memory/consolidation.js +0 -303
  392. package/dist/core/memory/context-collector.d.ts +0 -10
  393. package/dist/core/memory/context-collector.js +0 -56
  394. package/dist/core/memory/contradiction-resolver.d.ts +0 -40
  395. package/dist/core/memory/contradiction-resolver.js +0 -368
  396. package/dist/core/memory/edit-workflow.d.ts +0 -19
  397. package/dist/core/memory/edit-workflow.js +0 -120
  398. package/dist/core/memory/entity-extractor.d.ts +0 -33
  399. package/dist/core/memory/entity-extractor.js +0 -336
  400. package/dist/core/memory/entity-resolver.d.ts +0 -23
  401. package/dist/core/memory/entity-resolver.js +0 -64
  402. package/dist/core/memory/fact-extractor.d.ts +0 -24
  403. package/dist/core/memory/fact-extractor.js +0 -89
  404. package/dist/core/memory/feedback-tracker.d.ts +0 -12
  405. package/dist/core/memory/feedback-tracker.js +0 -155
  406. package/dist/core/memory/hooks.d.ts +0 -88
  407. package/dist/core/memory/hooks.js +0 -174
  408. package/dist/core/memory/hybrid-retrieval.d.ts +0 -29
  409. package/dist/core/memory/hybrid-retrieval.js +0 -139
  410. package/dist/core/memory/hybrid-scorer.d.ts +0 -40
  411. package/dist/core/memory/hybrid-scorer.js +0 -284
  412. package/dist/core/memory/hybrid-search.d.ts +0 -20
  413. package/dist/core/memory/hybrid-search.js +0 -359
  414. package/dist/core/memory/importance.d.ts +0 -63
  415. package/dist/core/memory/importance.js +0 -298
  416. package/dist/core/memory/index.d.ts +0 -8
  417. package/dist/core/memory/loader.d.ts +0 -31
  418. package/dist/core/memory/loader.js +0 -141
  419. package/dist/core/memory/markdown/markdown-storage.d.ts +0 -72
  420. package/dist/core/memory/markdown/markdown-storage.js +0 -243
  421. package/dist/core/memory/memories.d.ts +0 -47
  422. package/dist/core/memory/memories.js +0 -449
  423. package/dist/core/memory/memory-lifecycle.d.ts +0 -8
  424. package/dist/core/memory/memory-lifecycle.js +0 -55
  425. package/dist/core/memory/memory-manager.d.ts +0 -15
  426. package/dist/core/memory/memory-manager.js +0 -46
  427. package/dist/core/memory/migrate.d.ts +0 -21
  428. package/dist/core/memory/migrate.js +0 -134
  429. package/dist/core/memory/normalization.d.ts +0 -22
  430. package/dist/core/memory/normalization.js +0 -26
  431. package/dist/core/memory/progressive-disclosure.d.ts +0 -43
  432. package/dist/core/memory/progressive-disclosure.js +0 -280
  433. package/dist/core/memory/query-processor.d.ts +0 -21
  434. package/dist/core/memory/query-processor.js +0 -72
  435. package/dist/core/memory/query-rewriter.d.ts +0 -13
  436. package/dist/core/memory/query-rewriter.js +0 -118
  437. package/dist/core/memory/response-analyzer.d.ts +0 -9
  438. package/dist/core/memory/response-analyzer.js +0 -61
  439. package/dist/core/memory/serialization.d.ts +0 -10
  440. package/dist/core/memory/serialization.js +0 -84
  441. package/dist/core/memory/stats.d.ts +0 -22
  442. package/dist/core/memory/stats.js +0 -138
  443. package/dist/core/memory/telemetry.d.ts +0 -69
  444. package/dist/core/memory/telemetry.js +0 -313
  445. package/dist/core/memory/temporal-facts.d.ts +0 -41
  446. package/dist/core/memory/temporal-facts.js +0 -283
  447. package/dist/core/memory/temporal-parser.d.ts +0 -32
  448. package/dist/core/memory/temporal-parser.js +0 -385
  449. package/dist/core/memory/trigger-detector.d.ts +0 -14
  450. package/dist/core/memory/trigger-detector.js +0 -42
  451. package/dist/core/memory/write-gate.d.ts +0 -54
  452. package/dist/core/memory/write-gate.js +0 -210
  453. package/dist/core/namespaces/index.d.ts +0 -71
  454. package/dist/core/namespaces/index.js +0 -305
  455. package/dist/core/namespaces/uri-parser.d.ts +0 -31
  456. package/dist/core/namespaces/uri-parser.js +0 -74
  457. package/dist/core/obsidian-vault.d.ts +0 -30
  458. package/dist/core/obsidian-vault.js +0 -94
  459. package/dist/core/places/index.d.ts +0 -14
  460. package/dist/core/places/memory-places.d.ts +0 -68
  461. package/dist/core/places/memory-places.js +0 -261
  462. package/dist/core/places/places.d.ts +0 -88
  463. package/dist/core/places/places.js +0 -314
  464. package/dist/core/places/rules.d.ts +0 -74
  465. package/dist/core/places/rules.js +0 -240
  466. package/dist/core/places/walking.d.ts +0 -56
  467. package/dist/core/places/walking.js +0 -121
  468. package/dist/core/projects.d.ts +0 -17
  469. package/dist/core/projects.js +0 -108
  470. package/dist/core/redis.d.ts +0 -11
  471. package/dist/core/redis.js +0 -69
  472. package/dist/core/responses.d.ts +0 -96
  473. package/dist/core/responses.js +0 -122
  474. package/dist/core/scheduler/cron-scheduler.d.ts +0 -32
  475. package/dist/core/scheduler/cron-scheduler.js +0 -332
  476. package/dist/core/scheduler/heartbeat.d.ts +0 -11
  477. package/dist/core/scheduler/heartbeat.js +0 -73
  478. package/dist/core/scheduler/index.d.ts +0 -8
  479. package/dist/core/scheduler/job-runner.d.ts +0 -11
  480. package/dist/core/scheduler/job-runner.js +0 -164
  481. package/dist/core/search/conversations.d.ts +0 -25
  482. package/dist/core/search/conversations.js +0 -110
  483. package/dist/core/search/entities.d.ts +0 -12
  484. package/dist/core/search/entities.js +0 -31
  485. package/dist/core/search/folder-context.d.ts +0 -25
  486. package/dist/core/search/folder-context.js +0 -119
  487. package/dist/core/search/graph-boost.d.ts +0 -7
  488. package/dist/core/search/graph-boost.js +0 -23
  489. package/dist/core/search/index.d.ts +0 -4
  490. package/dist/core/search/qmd-search.d.ts +0 -61
  491. package/dist/core/search/qmd-search.js +0 -178
  492. package/dist/core/security/encrypt.d.ts +0 -6
  493. package/dist/core/security/encrypt.js +0 -47
  494. package/dist/core/security/governance.d.ts +0 -26
  495. package/dist/core/security/governance.js +0 -79
  496. package/dist/core/security/privacy.d.ts +0 -23
  497. package/dist/core/security/privacy.js +0 -82
  498. package/dist/core/security/secret-detector.d.ts +0 -32
  499. package/dist/core/security/secret-detector.js +0 -88
  500. package/dist/core/session/auto-load.d.ts +0 -6
  501. package/dist/core/session/auto-load.js +0 -119
  502. package/dist/core/session/index.d.ts +0 -7
  503. package/dist/core/session/self-iteration-job.d.ts +0 -20
  504. package/dist/core/session/self-iteration-job.js +0 -282
  505. package/dist/core/session/session-hooks.d.ts +0 -18
  506. package/dist/core/session/session-hooks.js +0 -58
  507. package/dist/core/session/types.d.ts +0 -26
  508. package/dist/core/session/types.js +0 -10
  509. package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
  510. package/dist/core/session-hooks/self-iteration-job.js +0 -282
  511. package/dist/core/session-hooks/session-hooks.d.ts +0 -18
  512. package/dist/core/session-hooks/session-hooks.js +0 -58
  513. package/dist/core/snapshots/cleanup.d.ts +0 -9
  514. package/dist/core/snapshots/comparison.d.ts +0 -19
  515. package/dist/core/snapshots/comparison.js +0 -43
  516. package/dist/core/snapshots/creation.d.ts +0 -19
  517. package/dist/core/snapshots/creation.js +0 -126
  518. package/dist/core/snapshots/retrieval.d.ts +0 -7
  519. package/dist/core/snapshots/retrieval.js +0 -41
  520. package/dist/core/snapshots/stats.d.ts +0 -11
  521. package/dist/core/snapshots/stats.js +0 -52
  522. package/dist/core/snapshots.d.ts +0 -29
  523. package/dist/core/snapshots.js +0 -220
  524. package/dist/core/storage/cache.d.ts +0 -13
  525. package/dist/core/storage/cache.js +0 -202
  526. package/dist/core/storage/database.d.ts +0 -12
  527. package/dist/core/storage/database.js +0 -12
  528. package/dist/core/summarization/cleanup.d.ts +0 -9
  529. package/dist/core/summarization/queries.d.ts +0 -9
  530. package/dist/core/summarization/queries.js +0 -28
  531. package/dist/core/summarization/stats.d.ts +0 -14
  532. package/dist/core/summarization/stats.js +0 -52
  533. package/dist/core/summarization/strategies.d.ts +0 -24
  534. package/dist/core/summarization/strategies.js +0 -28
  535. package/dist/core/summarization.d.ts +0 -37
  536. package/dist/core/summarization.js +0 -188
  537. package/dist/core/sync/qmd-sync.d.ts +0 -94
  538. package/dist/core/sync/qmd-sync.js +0 -201
  539. package/dist/core/temporal-facts.d.ts +0 -54
  540. package/dist/core/temporal-facts.js +0 -193
  541. package/dist/core/toon.d.ts +0 -43
  542. package/dist/core/toon.js +0 -160
  543. package/dist/core/tracing/collector.d.ts +0 -111
  544. package/dist/core/tracing/collector.js +0 -350
  545. package/dist/core/tracing/visualizer.d.ts +0 -32
  546. package/dist/core/tracing/visualizer.js +0 -165
  547. package/dist/core/utils/cleanup-operations.d.ts +0 -13
  548. package/dist/core/utils/cleanup-operations.js +0 -44
  549. package/dist/core/utils/content-extraction.d.ts +0 -19
  550. package/dist/core/utils/content-extraction.js +0 -75
  551. package/dist/core/utils/filter-builder.d.ts +0 -13
  552. package/dist/core/utils/filter-builder.js +0 -44
  553. package/dist/core/utils/history-traversal.d.ts +0 -13
  554. package/dist/core/utils/history-traversal.js +0 -50
  555. package/dist/core/utils/memory-operations.d.ts +0 -17
  556. package/dist/core/utils/memory-operations.js +0 -43
  557. package/dist/core/utils/query-operations.d.ts +0 -18
  558. package/dist/core/utils/query-operations.js +0 -65
  559. package/dist/core/utils/summarization-helpers.d.ts +0 -21
  560. package/dist/core/utils/summarization-helpers.js +0 -38
  561. package/dist/core/utils/temporal-queries.d.ts +0 -13
  562. package/dist/core/utils/temporal-queries.js +0 -27
  563. package/dist/core/utils/vector-operations.d.ts +0 -71
  564. package/dist/core/utils/version-management.d.ts +0 -9
  565. package/dist/core/utils/version-management.js +0 -61
  566. package/dist/core/worker.d.ts +0 -82
  567. package/dist/core/worker.js +0 -272
  568. package/dist/db/adapter.d.ts +0 -7
  569. package/dist/db/adapter.js +0 -175
  570. package/dist/db/bootstrap.d.ts +0 -9
  571. package/dist/db/drizzle/schema-sqlite.d.ts +0 -4837
  572. package/dist/db/drizzle/schema-sqlite.js +0 -684
  573. package/dist/db/drizzle/schema.d.ts +0 -4082
  574. package/dist/db/drizzle/schema.js +0 -770
  575. package/dist/db/drizzle.config.d.ts +0 -3
  576. package/dist/db/drizzle.config.js +0 -12
  577. package/dist/db/index.d.ts +0 -7
  578. package/dist/db/index.js +0 -89
  579. package/dist/db/neon.d.ts +0 -8
  580. package/dist/db/neon.js +0 -20
  581. package/dist/db/schema/index.d.ts +0 -40
  582. package/dist/db/schema/index.js +0 -105
  583. package/dist/db/schema/tables/context-sessions.d.ts +0 -9
  584. package/dist/db/schema/tables/context-sessions.js +0 -37
  585. package/dist/db/schema/tables/conversations.d.ts +0 -9
  586. package/dist/db/schema/tables/conversations.js +0 -47
  587. package/dist/db/schema/tables/core-memory.d.ts +0 -9
  588. package/dist/db/schema/tables/core-memory.js +0 -41
  589. package/dist/db/schema/tables/entities.d.ts +0 -9
  590. package/dist/db/schema/tables/entities.js +0 -39
  591. package/dist/db/schema/tables/entity-relations.d.ts +0 -9
  592. package/dist/db/schema/tables/entity-relations.js +0 -31
  593. package/dist/db/schema/tables/learnings.d.ts +0 -9
  594. package/dist/db/schema/tables/learnings.js +0 -66
  595. package/dist/db/schema/tables/memories.d.ts +0 -9
  596. package/dist/db/schema/tables/memories.js +0 -161
  597. package/dist/db/schema/tables/memory-associations.d.ts +0 -9
  598. package/dist/db/schema/tables/memory-associations.js +0 -39
  599. package/dist/db/schema/tables/memory-hash-cache.d.ts +0 -9
  600. package/dist/db/schema/tables/memory-hash-cache.js +0 -29
  601. package/dist/db/schema/tables/memory-merge-history.d.ts +0 -9
  602. package/dist/db/schema/tables/memory-merge-history.js +0 -33
  603. package/dist/db/schema/tables/memory-merge-proposals.d.ts +0 -9
  604. package/dist/db/schema/tables/memory-merge-proposals.js +0 -39
  605. package/dist/db/schema/tables/messages.d.ts +0 -9
  606. package/dist/db/schema/tables/messages.js +0 -41
  607. package/dist/db/schema/tables/namespaces.d.ts +0 -9
  608. package/dist/db/schema/tables/namespaces.js +0 -37
  609. package/dist/db/schema/tables/projects.d.ts +0 -9
  610. package/dist/db/schema/tables/projects.js +0 -31
  611. package/dist/db/schema/tables/users.d.ts +0 -9
  612. package/dist/db/schema/tables/users.js +0 -27
  613. package/dist/db/schema.d.ts +0 -3
  614. package/dist/db/schema.js +0 -11
  615. package/dist/db/supabase.d.ts +0 -9
  616. package/dist/db/supabase.js +0 -24
  617. package/dist/index.d.ts +0 -7
  618. package/dist/index.js +0 -1677
  619. package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
  620. package/dist/webui/server.d.ts +0 -5
  621. package/dist/webui/server.js +0 -642
  622. package/generated/mcp/manifest.json +0 -23
  623. package/generated/mcp/mcp-servers.json +0 -25
  624. package/generated/mcp/mcporter.json +0 -34
  625. package/generated/mcp/openclaw-memory-qmd.json +0 -17
  626. package/generated/mcp/runtime.json +0 -12
  627. package/scripts/README.md +0 -60
  628. package/scripts/build-release.sh +0 -36
  629. package/scripts/check-secrets.js +0 -132
  630. package/scripts/copy-runtime-assets.mjs +0 -26
  631. package/scripts/generate-mcp.mjs +0 -264
  632. package/scripts/github-release.sh +0 -77
  633. package/scripts/init-dirs.mjs +0 -13
  634. package/scripts/install-claude-code.sh +0 -85
  635. package/scripts/install-cursor.sh +0 -56
  636. package/scripts/install-hooks.sh +0 -73
  637. package/scripts/install-interactive.mjs +0 -357
  638. package/scripts/install-opencode.sh +0 -75
  639. package/scripts/install-plugin.mjs +0 -415
  640. package/scripts/install-windsurf.sh +0 -67
  641. package/scripts/remote-preflight.mjs +0 -62
  642. package/scripts/squish-fallback.mjs +0 -132
  643. package/scripts/test-interactive.mjs +0 -131
  644. package/scripts/verify-mcp.mjs +0 -214
  645. package/skills/squish-memory/scripts/install.mjs +0 -335
  646. package/skills/squish-memory/write_skill.js +0 -2
@@ -0,0 +1,81 @@
1
+ /** Response Analyzer - Analyze LLM responses for memory references (Echo/Fizzle tracking) */
2
+
3
+ import { logger } from '../logger.js';
4
+
5
+ export interface AnalysisResult {
6
+ referencedMemoryIds: string[];
7
+ referenceCount: number;
8
+ hasReferences: boolean;
9
+ }
10
+
11
+ const REFERENCE_PATTERNS = [
12
+ /[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/gi,
13
+ /as (?:i |we )?(?:mentioned|noted|remembered|recalled|stored|saved)/gi,
14
+ /(?:based|drawing) on (?:my|our|the) (?:memory|previous|earlier)/gi,
15
+ /(?:i |we )?(?:recall|remember|noted) (?:that |earlier )?/gi,
16
+ /from (?:my|our|the) (?:memory|notes|records)/gi,
17
+ ];
18
+
19
+ export function analyzeResponseForMemoryReferences(
20
+ responseText: string,
21
+ injectedMemoryIds: string[],
22
+ injectedMemoryContent: Map<string, string>
23
+ ): AnalysisResult {
24
+ const referencedMemoryIds: string[] = [];
25
+ const responseLower = responseText.toLowerCase();
26
+
27
+ for (const memoryId of injectedMemoryIds) {
28
+ if (responseText.includes(memoryId)) {
29
+ referencedMemoryIds.push(memoryId);
30
+ logger.debug(`[ResponseAnalyzer] Direct reference found: ${memoryId}`);
31
+ }
32
+ }
33
+
34
+ for (const [memoryId, content] of injectedMemoryContent) {
35
+ if (referencedMemoryIds.includes(memoryId)) continue;
36
+
37
+ const contentWords = content.toLowerCase().split(/\s+/).filter(w => w.length > 3);
38
+ if (contentWords.length < 5) continue;
39
+
40
+ let matchCount = 0;
41
+ for (const word of contentWords) {
42
+ if (responseLower.includes(word)) {
43
+ matchCount++;
44
+ }
45
+ }
46
+
47
+ const matchRatio = matchCount / contentWords.length;
48
+ if (matchRatio > 0.5) {
49
+ referencedMemoryIds.push(memoryId);
50
+ logger.debug(`[ResponseAnalyzer] Content match (${(matchRatio * 100).toFixed(0)}%): ${memoryId}`);
51
+ }
52
+ }
53
+
54
+ for (const pattern of REFERENCE_PATTERNS) {
55
+ const matches = responseText.match(pattern);
56
+ if (matches && matches.length > 0) {
57
+ logger.debug(`[ResponseAnalyzer] Reference pattern found: ${matches.length} matches`);
58
+ }
59
+ }
60
+
61
+ const result: AnalysisResult = {
62
+ referencedMemoryIds: [...new Set(referencedMemoryIds)],
63
+ referenceCount: referencedMemoryIds.length,
64
+ hasReferences: referencedMemoryIds.length > 0,
65
+ };
66
+
67
+ if (result.hasReferences) {
68
+ logger.info(`[ResponseAnalyzer] Found ${result.referenceCount} memory references`);
69
+ }
70
+
71
+ return result;
72
+ }
73
+
74
+ export function mightContainMemoryReferences(responseText: string): boolean {
75
+ const responseLower = responseText.toLowerCase();
76
+ const quickPatterns = [
77
+ 'remember', 'recall', 'mentioned', 'noted', 'earlier',
78
+ 'previous', 'as i', 'as we', 'from my', 'from our',
79
+ ];
80
+ return quickPatterns.some(pattern => responseLower.includes(pattern));
81
+ }
@@ -0,0 +1,276 @@
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
+
8
+ import { eq, and, sql } from 'drizzle-orm';
9
+ import { getDb } from '../../db/index.js';
10
+ import { getSchema } from '../../db/schema.js';
11
+ import { logger } from '../logger.js';
12
+
13
+ // ─── Types ──────────────────────────────────────────────────────────────────
14
+
15
+ export interface RetrievalFeedback {
16
+ memoryId: string;
17
+ query: string;
18
+ wasUseful: boolean;
19
+ cited: boolean; // Was the memory cited in the response?
20
+ responseId?: string;
21
+ timestamp: Date;
22
+ }
23
+
24
+ export interface FeedbackStats {
25
+ totalRetrievals: number;
26
+ usefulRetrievals: number;
27
+ citedRetrievals: number;
28
+ usefulnessRate: number;
29
+ citationRate: number;
30
+ }
31
+
32
+ // ─── In-Memory Feedback Buffer ───────────────────────────────────────────────
33
+
34
+ const feedbackBuffer = new Map<string, RetrievalFeedback[]>();
35
+ const MAX_BUFFER_SIZE = 1000;
36
+ const FLUSH_INTERVAL_MS = 60000; // 1 minute
37
+
38
+ let flushTimer: ReturnType<typeof setInterval> | null = null;
39
+
40
+ /**
41
+ * Record that a memory was retrieved for a query.
42
+ * Call this when a memory appears in search results.
43
+ */
44
+ export function recordRetrieval(
45
+ memoryId: string,
46
+ query: string,
47
+ options?: { sessionId?: string }
48
+ ): void {
49
+ const key = options?.sessionId || 'default';
50
+ const buffer = feedbackBuffer.get(key) || [];
51
+
52
+ buffer.push({
53
+ memoryId,
54
+ query,
55
+ wasUseful: false, // Will be updated later
56
+ cited: false,
57
+ timestamp: new Date(),
58
+ });
59
+
60
+ // Trim buffer if too large
61
+ if (buffer.length > MAX_BUFFER_SIZE) {
62
+ buffer.splice(0, buffer.length - MAX_BUFFER_SIZE);
63
+ }
64
+
65
+ feedbackBuffer.set(key, buffer);
66
+ }
67
+
68
+ /**
69
+ * Record that a retrieved memory was actually useful.
70
+ * Call this when a memory is cited or referenced in a response.
71
+ */
72
+ export function recordUsefulRetrieval(
73
+ memoryId: string,
74
+ query: string,
75
+ options?: {
76
+ cited?: boolean;
77
+ responseId?: string;
78
+ sessionId?: string;
79
+ }
80
+ ): void {
81
+ const key = options?.sessionId || 'default';
82
+ const buffer = feedbackBuffer.get(key) || [];
83
+
84
+ // Find the existing retrieval record and update it
85
+ const existing = buffer.find(f => f.memoryId === memoryId && f.query === query && !f.wasUseful);
86
+ if (existing) {
87
+ existing.wasUseful = true;
88
+ existing.cited = options?.cited ?? false;
89
+ existing.responseId = options?.responseId;
90
+ } else {
91
+ // Add a new record
92
+ buffer.push({
93
+ memoryId,
94
+ query,
95
+ wasUseful: true,
96
+ cited: options?.cited ?? false,
97
+ responseId: options?.responseId,
98
+ timestamp: new Date(),
99
+ });
100
+ }
101
+
102
+ feedbackBuffer.set(key, buffer);
103
+ }
104
+
105
+ /**
106
+ * Record that a memory was cited in a response.
107
+ * This is stronger feedback than just "useful" - it means the memory
108
+ * was explicitly referenced.
109
+ */
110
+ export function recordCitation(
111
+ memoryId: string,
112
+ responseId: string,
113
+ options?: { sessionId?: string }
114
+ ): void {
115
+ const key = options?.sessionId || 'default';
116
+ const buffer = feedbackBuffer.get(key) || [];
117
+
118
+ // Mark all retrievals of this memory as useful
119
+ for (const feedback of buffer) {
120
+ if (feedback.memoryId === memoryId) {
121
+ feedback.wasUseful = true;
122
+ feedback.cited = true;
123
+ feedback.responseId = responseId;
124
+ }
125
+ }
126
+
127
+ feedbackBuffer.set(key, buffer);
128
+ }
129
+
130
+ /**
131
+ * Get feedback statistics for a specific memory.
132
+ */
133
+ export function getRetrievalStats(memoryId: string): FeedbackStats {
134
+ let totalRetrievals = 0;
135
+ let usefulRetrievals = 0;
136
+ let citedRetrievals = 0;
137
+
138
+ for (const [, buffer] of feedbackBuffer) {
139
+ for (const feedback of buffer) {
140
+ if (feedback.memoryId === memoryId) {
141
+ totalRetrievals++;
142
+ if (feedback.wasUseful) usefulRetrievals++;
143
+ if (feedback.cited) citedRetrievals++;
144
+ }
145
+ }
146
+ }
147
+
148
+ return {
149
+ totalRetrievals,
150
+ usefulRetrievals,
151
+ citedRetrievals,
152
+ usefulnessRate: totalRetrievals > 0 ? usefulRetrievals / totalRetrievals : 0,
153
+ citationRate: totalRetrievals > 0 ? citedRetrievals / totalRetrievals : 0,
154
+ };
155
+ }
156
+
157
+ /**
158
+ * Get overall feedback statistics.
159
+ */
160
+ export function getOverallFeedbackStats(): FeedbackStats {
161
+ let totalRetrievals = 0;
162
+ let usefulRetrievals = 0;
163
+ let citedRetrievals = 0;
164
+
165
+ for (const [, buffer] of feedbackBuffer) {
166
+ for (const feedback of buffer) {
167
+ totalRetrievals++;
168
+ if (feedback.wasUseful) usefulRetrievals++;
169
+ if (feedback.cited) citedRetrievals++;
170
+ }
171
+ }
172
+
173
+ return {
174
+ totalRetrievals,
175
+ usefulRetrievals,
176
+ citedRetrievals,
177
+ usefulnessRate: totalRetrievals > 0 ? usefulRetrievals / totalRetrievals : 0,
178
+ citationRate: totalRetrievals > 0 ? citedRetrievals / totalRetrievals : 0,
179
+ };
180
+ }
181
+
182
+ /**
183
+ * Flush feedback to the database, updating association weights.
184
+ */
185
+ export async function flushFeedback(): Promise<{
186
+ strengthened: number;
187
+ weakened: number;
188
+ total: number;
189
+ }> {
190
+ const db = await getDb();
191
+ const schema = await getSchema();
192
+
193
+ let strengthened = 0;
194
+ let weakened = 0;
195
+ let total = 0;
196
+
197
+ for (const [, buffer] of feedbackBuffer) {
198
+ for (const feedback of buffer) {
199
+ total++;
200
+
201
+ try {
202
+ // Get associations involving this memory
203
+ const associations = await (db as any)
204
+ .select()
205
+ .from(schema.memoryAssociations)
206
+ .where(
207
+ sql`${schema.memoryAssociations.fromMemoryId} = ${feedback.memoryId} OR ${schema.memoryAssociations.toMemoryId} = ${feedback.memoryId}`
208
+ );
209
+
210
+ for (const assoc of associations) {
211
+ if (feedback.wasUseful) {
212
+ // Strengthen: increase weight and coactivation count
213
+ await (db as any)
214
+ .update(schema.memoryAssociations)
215
+ .set({
216
+ weight: sql`${schema.memoryAssociations.weight} + 1`,
217
+ coactivationCount: sql`${schema.memoryAssociations.coactivationCount} + 1`,
218
+ lastCoactivatedAt: new Date(),
219
+ })
220
+ .where(eq(schema.memoryAssociations.id, assoc.id));
221
+ strengthened++;
222
+ } else {
223
+ // Weaken: decrease weight slightly (but don't go below 1)
224
+ await (db as any)
225
+ .update(schema.memoryAssociations)
226
+ .set({
227
+ weight: sql`GREATEST(${schema.memoryAssociations.weight} - 0.5, 1)`,
228
+ })
229
+ .where(eq(schema.memoryAssociations.id, assoc.id));
230
+ weakened++;
231
+ }
232
+ }
233
+ } catch (error) {
234
+ logger.debug('Error updating association weights', {
235
+ memoryId: feedback.memoryId,
236
+ error: error as Error,
237
+ });
238
+ }
239
+ }
240
+ }
241
+
242
+ // Clear the buffer after flushing
243
+ feedbackBuffer.clear();
244
+
245
+ logger.info('Feedback flushed', { strengthened, weakened, total });
246
+
247
+ return { strengthened, weakened, total };
248
+ }
249
+
250
+ /**
251
+ * Start the periodic feedback flush timer.
252
+ */
253
+ export function startFeedbackFlushTimer(): void {
254
+ if (flushTimer) return;
255
+
256
+ flushTimer = setInterval(async () => {
257
+ try {
258
+ await flushFeedback();
259
+ } catch (error) {
260
+ logger.error('Error flushing feedback', { error: error as Error });
261
+ }
262
+ }, FLUSH_INTERVAL_MS);
263
+
264
+ logger.info('Feedback flush timer started', { intervalMs: FLUSH_INTERVAL_MS });
265
+ }
266
+
267
+ /**
268
+ * Stop the periodic feedback flush timer.
269
+ */
270
+ export function stopFeedbackFlushTimer(): void {
271
+ if (flushTimer) {
272
+ clearInterval(flushTimer);
273
+ flushTimer = null;
274
+ logger.info('Feedback flush timer stopped');
275
+ }
276
+ }
@@ -0,0 +1,83 @@
1
+ import { config } from '../../config.js';
2
+
3
+ export function normalizeTags(tags?: string[]): string[] {
4
+ return (tags || []).map((tag) => tag.trim()).filter((tag) => tag.length > 0);
5
+ }
6
+
7
+ export function toSqliteJson(value: unknown): string | null {
8
+ if (value === undefined || value === null) return null;
9
+ return JSON.stringify(value);
10
+ }
11
+
12
+ export function fromSqliteJson<T>(value: string | null | undefined): T | null {
13
+ if (!value) return null;
14
+ try {
15
+ return JSON.parse(value) as T;
16
+ } catch {
17
+ return null;
18
+ }
19
+ }
20
+
21
+ export function toSqliteTags(tags?: string[]): string | null {
22
+ if (!tags || tags.length === 0) return null;
23
+ return JSON.stringify(tags);
24
+ }
25
+
26
+ export function fromSqliteTags(value: string | null | undefined): string[] {
27
+ if (!value) return [];
28
+ try {
29
+ const parsed = JSON.parse(value);
30
+ return Array.isArray(parsed) ? parsed.map(String) : [];
31
+ } catch {
32
+ return value.split(',').map((tag) => tag.trim()).filter(Boolean);
33
+ }
34
+ }
35
+
36
+ // High-level helpers that abstract away team mode vs local mode
37
+
38
+ export function serializeTags(tags?: string[]): string[] | string | null | undefined {
39
+ if (config.isTeamMode) {
40
+ // PostgreSQL: store as array directly (or null if empty)
41
+ return tags && tags.length > 0 ? tags : null;
42
+ } else {
43
+ // SQLite: store as JSON string (or null)
44
+ return toSqliteTags(tags);
45
+ }
46
+ }
47
+
48
+ export function deserializeTags(value: string[] | string | null | undefined): string[] {
49
+ if (config.isTeamMode) {
50
+ // PostgreSQL: value is already an array or null/undefined
51
+ return Array.isArray(value) ? value : [];
52
+ } else {
53
+ // SQLite: value is a JSON string or null/undefined
54
+ if (typeof value === 'string' || value === null || value === undefined) {
55
+ return fromSqliteTags(value);
56
+ }
57
+ // Unexpected type, return empty array
58
+ return [];
59
+ }
60
+ }
61
+
62
+ export function serializeMetadata(metadata: Record<string, unknown> | null | undefined): Record<string, unknown> | string | null {
63
+ if (config.isTeamMode) {
64
+ // PostgreSQL: store object directly (or null if null/undefined, keep empty object as-is)
65
+ return metadata === undefined || metadata === null ? null : metadata;
66
+ } else {
67
+ // SQLite: store as JSON string (or null)
68
+ return toSqliteJson(metadata);
69
+ }
70
+ }
71
+
72
+ export function deserializeMetadata(value: Record<string, unknown> | string | null | undefined): Record<string, unknown> | null {
73
+ if (config.isTeamMode) {
74
+ // PostgreSQL: value is already an object or null/undefined
75
+ return value == null ? null : (value as Record<string, unknown>);
76
+ } else {
77
+ // SQLite: value is a JSON string or null/undefined
78
+ if (typeof value === 'string' || value === null) {
79
+ return fromSqliteJson<Record<string, unknown>>(value);
80
+ }
81
+ return null;
82
+ }
83
+ }
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Stale Memory Cleaner
3
+ * Deletes memories that are old, low-confidence, and low-importance
4
+ */
5
+
6
+ import { getDb } from '../../db/index.js';
7
+ import { getSchema } from '../../db/schema.js';
8
+ import { lt, or, and, eq, lte } from 'drizzle-orm';
9
+
10
+ export interface StaleMemory {
11
+ id: string;
12
+ content: string;
13
+ type: string;
14
+ createdAt: Date;
15
+ confidenceLevel: string | null;
16
+ importanceScore: number | null;
17
+ isPinned: boolean;
18
+ }
19
+
20
+ export interface StaleMemoryQuery {
21
+ olderThanDays: number;
22
+ confidenceLevels: string[];
23
+ minImportance: number;
24
+ projectId?: string;
25
+ }
26
+
27
+ export async function getStaleMemories(query: StaleMemoryQuery): Promise<StaleMemory[]> {
28
+ const db = await getDb();
29
+ if (!db) return [];
30
+
31
+ const schema = await getSchema();
32
+ const sqliteDb = db as any;
33
+
34
+ const cutoffDate = new Date(Date.now() - query.olderThanDays * 24 * 60 * 60 * 1000);
35
+
36
+ // Build conditions
37
+ const conditions = [
38
+ // Not pinned
39
+ or(
40
+ eq((schema.memories as any).isPinned, false),
41
+ eq((schema.memories as any).isPinned, null)
42
+ ),
43
+ // Older than cutoff
44
+ lt((schema.memories as any).createdAt, cutoffDate),
45
+ ];
46
+
47
+ // Confidence level filter
48
+ if (query.confidenceLevels.length > 0) {
49
+ conditions.push(
50
+ or(
51
+ ...query.confidenceLevels.map(level =>
52
+ eq((schema.memories as any).confidenceLevel, level)
53
+ )
54
+ )
55
+ );
56
+ }
57
+
58
+ // Importance filter (below threshold)
59
+ conditions.push(lte((schema.memories as any).importanceScore, query.minImportance));
60
+
61
+ // Project filter if specified
62
+ if (query.projectId) {
63
+ conditions.push(eq((schema.memories as any).projectId, query.projectId));
64
+ }
65
+
66
+ try {
67
+ const results = await sqliteDb
68
+ .select({
69
+ id: schema.memories.id,
70
+ content: schema.memories.content,
71
+ type: schema.memories.type,
72
+ createdAt: schema.memories.createdAt,
73
+ confidenceLevel: (schema.memories as any).confidenceLevel,
74
+ importanceScore: (schema.memories as any).importanceScore,
75
+ isPinned: (schema.memories as any).isPinned,
76
+ })
77
+ .from(schema.memories)
78
+ .where(and(...conditions.filter(Boolean)));
79
+
80
+ return results.map((r: any) => ({
81
+ ...r,
82
+ isPinned: Boolean(r.isPinned),
83
+ }));
84
+ } catch (error) {
85
+ console.error('[StaleCleaner] Error querying stale memories:', error);
86
+ return [];
87
+ }
88
+ }
89
+
90
+ export async function deleteMemoryPermanently(memoryId: string): Promise<void> {
91
+ const db = await getDb();
92
+ if (!db) return;
93
+
94
+ const schema = await getSchema();
95
+ const sqliteDb = db as any;
96
+
97
+ try {
98
+ // Delete associated records first
99
+ await sqliteDb.delete(schema.memoryAssociations).where(
100
+ or(
101
+ eq((schema.memoryAssociations as any).fromMemoryId, memoryId),
102
+ eq((schema.memoryAssociations as any).toMemoryId, memoryId)
103
+ )
104
+ ).catch(() => {}); // Ignore if table doesn't exist
105
+
106
+ // Delete memory tags
107
+ await sqliteDb.delete((schema as any).memoryTags).where(
108
+ eq((schema as any).memoryTags.memoryId, memoryId)
109
+ ).catch(() => {}); // Ignore if table doesn't exist
110
+
111
+ // Delete the memory itself
112
+ await sqliteDb.delete(schema.memories).where(eq(schema.memories.id, memoryId));
113
+ } catch (error) {
114
+ console.error(`[StaleCleaner] Error deleting memory ${memoryId}:`, error);
115
+ throw error;
116
+ }
117
+ }
118
+
119
+ export async function runAutoClean(options?: Partial<StaleMemoryQuery>): Promise<{
120
+ deleted: number;
121
+ summary: Record<string, unknown>;
122
+ }> {
123
+ const defaultOptions: StaleMemoryQuery = {
124
+ olderThanDays: options?.olderThanDays || 30,
125
+ confidenceLevels: options?.confidenceLevels || ['outdated', 'speculative'],
126
+ minImportance: options?.minImportance || 40,
127
+ };
128
+
129
+ const stale = await getStaleMemories(defaultOptions);
130
+ let deleted = 0;
131
+
132
+ for (const memory of stale) {
133
+ if (!memory.isPinned) {
134
+ await deleteMemoryPermanently(memory.id);
135
+ deleted++;
136
+ }
137
+ }
138
+
139
+ return {
140
+ deleted,
141
+ summary: {
142
+ scanned: stale.length,
143
+ skippedPinned: stale.length - deleted,
144
+ criteria: defaultOptions,
145
+ },
146
+ };
147
+ }