squish-memory 1.0.2 → 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 (704) hide show
  1. package/.env.example +146 -0
  2. package/CHANGELOG.md +202 -0
  3. package/README.md +192 -287
  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 +10 -12
  11. package/config/mcp-remote-auth.json +3 -26
  12. package/config/mcp-universal.schema.json +5 -35
  13. package/config/settings.json +78 -22
  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/core/embeddings/local-embeddings.ts +12 -0
  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 +61 -14
  220. package/dist/config.js +159 -139
  221. package/dist/core/adapters/config/claude-code.d.ts +45 -0
  222. package/dist/core/adapters/config/claude-code.js +113 -0
  223. package/dist/core/adapters/config/cursor.d.ts +26 -0
  224. package/dist/core/adapters/config/cursor.js +74 -0
  225. package/dist/core/adapters/config/opencode.d.ts +23 -0
  226. package/dist/core/adapters/config/opencode.js +73 -0
  227. package/dist/core/adapters/config/windsurf.d.ts +26 -0
  228. package/dist/core/adapters/config/windsurf.js +74 -0
  229. package/dist/core/adapters/index.d.ts +45 -0
  230. package/dist/core/adapters/index.js +84 -0
  231. package/dist/core/adapters/scripts/install-adapter.d.ts +19 -0
  232. package/dist/core/adapters/scripts/install-adapter.js +149 -0
  233. package/dist/core/adapters/timeline.d.ts +23 -0
  234. package/dist/core/adapters/timeline.js +88 -0
  235. package/dist/core/adapters/types.d.ts +137 -0
  236. package/dist/core/adapters/types.js +50 -0
  237. package/dist/core/agent-preferences.d.ts +16 -0
  238. package/dist/core/agent-preferences.js +124 -0
  239. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.d.ts +1 -1
  240. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.js +3 -3
  241. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.d.ts +1 -1
  242. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.js +1 -1
  243. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.d.ts +1 -1
  244. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.js +7 -10
  245. package/dist/{algorithms → core/algorithms}/handlers/approve-merge.js +4 -4
  246. package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.js +3 -3
  247. package/dist/{algorithms → core/algorithms}/handlers/get-stats.js +3 -3
  248. package/dist/{algorithms → core/algorithms}/handlers/list-proposals.js +3 -3
  249. package/dist/{algorithms → core/algorithms}/handlers/preview-merge.js +3 -3
  250. package/dist/{algorithms → core/algorithms}/handlers/reject-merge.js +3 -3
  251. package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.js +3 -3
  252. package/dist/core/algorithms/index.d.ts +21 -0
  253. package/dist/core/algorithms/index.js +26 -0
  254. package/dist/core/algorithms/operations/cache-maintenance.d.ts +12 -0
  255. package/dist/core/algorithms/operations/cache-maintenance.js +157 -0
  256. package/dist/{algorithms → core/algorithms}/safety/safety-checks.d.ts +2 -6
  257. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.d.ts +19 -1
  258. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.js +74 -123
  259. package/dist/core/algorithms/types.d.ts +125 -0
  260. package/dist/core/algorithms/types.js +5 -0
  261. package/dist/core/associations.d.ts +3 -2
  262. package/dist/core/associations.js +37 -2
  263. package/dist/core/autosave.d.ts +19 -0
  264. package/dist/core/autosave.js +16 -0
  265. package/dist/core/beliefs/decay.d.ts +27 -0
  266. package/dist/core/beliefs/decay.js +217 -0
  267. package/dist/core/beliefs/extractor.d.ts +9 -0
  268. package/dist/core/beliefs/extractor.js +113 -0
  269. package/dist/core/beliefs/store.d.ts +46 -0
  270. package/dist/core/beliefs/store.js +466 -0
  271. package/dist/core/beliefs/types.d.ts +28 -0
  272. package/dist/core/beliefs/types.js +2 -0
  273. package/dist/core/commands/mcp-server.d.ts +2 -0
  274. package/dist/core/commands/mcp-server.js +6 -0
  275. package/dist/core/commands/remember.d.ts +24 -0
  276. package/dist/core/commands/remember.js +144 -0
  277. package/dist/core/compression.d.ts +45 -0
  278. package/dist/core/compression.js +160 -0
  279. package/dist/core/context/agent-context.d.ts +106 -0
  280. package/dist/core/context/agent-context.js +274 -0
  281. package/dist/core/{context-paging.d.ts → context/context-paging.d.ts} +2 -12
  282. package/dist/core/{context-paging.js → context/context-paging.js} +19 -39
  283. package/dist/core/context/context-window.d.ts +40 -0
  284. package/dist/core/context/context-window.js +177 -0
  285. package/dist/core/context/context.js +22 -0
  286. package/dist/core/embeddings/embeddings.d.ts +29 -0
  287. package/dist/core/embeddings/embeddings.js +546 -0
  288. package/dist/core/embeddings/google-multimodal.js +6 -2
  289. package/dist/core/embeddings/local-embeddings.d.ts +11 -0
  290. package/dist/core/embeddings/local-embeddings.js +11 -0
  291. package/dist/core/embeddings/qmd-client.js +1 -1
  292. package/dist/core/embeddings/transformers-local.d.ts +64 -0
  293. package/dist/core/embeddings/transformers-local.js +213 -0
  294. package/dist/core/embeddings.d.ts +1 -28
  295. package/dist/core/embeddings.js +2 -401
  296. package/dist/core/error-handling.d.ts +63 -0
  297. package/dist/core/error-handling.js +173 -0
  298. package/dist/core/graph/entity-deduplicator.d.ts +24 -0
  299. package/dist/core/graph/entity-deduplicator.js +183 -0
  300. package/dist/core/graph/graph-builder.d.ts +46 -0
  301. package/dist/core/graph/graph-builder.js +174 -0
  302. package/dist/core/graph/graph-traversal.d.ts +80 -0
  303. package/dist/core/graph/graph-traversal.js +315 -0
  304. package/dist/core/graph/index.d.ts +19 -0
  305. package/dist/core/graph/index.js +13 -0
  306. package/dist/core/graph/llm-entity-extractor.d.ts +49 -0
  307. package/dist/core/graph/llm-entity-extractor.js +313 -0
  308. package/dist/core/graph/multi-hop-retrieval.d.ts +48 -0
  309. package/dist/core/graph/multi-hop-retrieval.js +215 -0
  310. package/dist/core/graph/relationship-extractor.d.ts +48 -0
  311. package/dist/core/graph/relationship-extractor.js +351 -0
  312. package/dist/core/hooks/agent-hooks.d.ts +83 -0
  313. package/dist/core/hooks/agent-hooks.js +521 -0
  314. package/dist/core/hooks/auto-tagger.d.ts +19 -0
  315. package/dist/core/hooks/auto-tagger.js +155 -0
  316. package/dist/core/hooks/capture-filter.d.ts +41 -0
  317. package/dist/core/hooks/capture-filter.js +128 -0
  318. package/dist/core/hot-cache.d.ts +86 -0
  319. package/dist/core/hot-cache.js +285 -0
  320. package/dist/core/index.d.ts +9 -9
  321. package/dist/core/index.js +9 -12
  322. package/dist/core/{agent-memory.js → ingestion/agent-memory.js} +5 -7
  323. package/dist/core/{core-memory.d.ts → ingestion/core-memory.d.ts} +2 -2
  324. package/dist/core/{core-memory.js → ingestion/core-memory.js} +7 -7
  325. package/dist/core/ingestion/learnings.d.ts +57 -0
  326. package/dist/core/ingestion/learnings.js +205 -0
  327. package/dist/core/ingestion/signal-engine.d.ts +41 -0
  328. package/dist/core/ingestion/signal-engine.js +201 -0
  329. package/dist/core/integrations/obsidian-vault.d.ts +31 -0
  330. package/dist/core/integrations/obsidian-vault.js +156 -0
  331. package/dist/core/lib/db-client.d.ts +114 -0
  332. package/dist/core/lib/db-client.js +130 -0
  333. package/dist/core/lib/parse-embedding.d.ts +9 -0
  334. package/dist/core/lib/parse-embedding.js +58 -0
  335. package/dist/core/lib/schemas.d.ts +132 -0
  336. package/dist/core/lib/schemas.js +87 -0
  337. package/dist/core/lib/types.d.ts +45 -0
  338. package/dist/core/lib/types.js +6 -0
  339. package/dist/core/{utils.d.ts → lib/utils.d.ts} +5 -0
  340. package/dist/core/lib/utils.js +145 -0
  341. package/dist/core/lib/validation.d.ts +38 -0
  342. package/dist/core/lib/validation.js +151 -0
  343. package/dist/core/lifecycle.d.ts +7 -1
  344. package/dist/core/lifecycle.js +152 -42
  345. package/dist/core/logger.d.ts +1 -0
  346. package/dist/core/logger.js +13 -1
  347. package/dist/core/mcp/tools.d.ts +0 -2
  348. package/dist/core/mcp/tools.js +35 -90
  349. package/dist/core/mcp/types.d.ts +25 -253
  350. package/dist/core/mcp/types.js +2 -2
  351. package/dist/core/memory/categorizer.js +2 -0
  352. package/dist/core/memory/conflict-detector.js +1 -1
  353. package/dist/core/memory/consolidation.d.ts +1 -10
  354. package/dist/core/memory/consolidation.js +4 -39
  355. package/dist/core/memory/context-collector.js +1 -1
  356. package/dist/core/memory/edit-workflow.js +1 -1
  357. package/dist/core/memory/entity-extractor.d.ts +4 -0
  358. package/dist/core/memory/entity-extractor.js +30 -16
  359. package/dist/core/memory/entity-resolver.js +7 -7
  360. package/dist/core/memory/explain.d.ts +18 -0
  361. package/dist/core/memory/explain.js +92 -0
  362. package/dist/core/memory/fact-deriver.d.ts +31 -0
  363. package/dist/core/memory/fact-deriver.js +236 -0
  364. package/dist/core/memory/fact-extractor.js +12 -12
  365. package/dist/core/memory/feedback-tracker.js +1 -1
  366. package/dist/core/memory/hooks.d.ts +88 -0
  367. package/dist/core/memory/hooks.js +174 -0
  368. package/dist/core/memory/hybrid-retrieval.d.ts +14 -16
  369. package/dist/core/memory/hybrid-retrieval.js +25 -127
  370. package/dist/core/memory/hybrid-scorer.js +6 -23
  371. package/dist/core/memory/hybrid-search.d.ts +9 -11
  372. package/dist/core/memory/hybrid-search.js +496 -273
  373. package/dist/core/memory/importance.d.ts +2 -24
  374. package/dist/core/memory/importance.js +7 -91
  375. package/dist/core/memory/index.d.ts +1 -0
  376. package/dist/core/memory/index.js +1 -0
  377. package/dist/core/memory/loader.d.ts +31 -0
  378. package/dist/core/memory/loader.js +141 -0
  379. package/dist/core/memory/markdown/markdown-storage.d.ts +72 -0
  380. package/dist/core/memory/markdown/markdown-storage.js +243 -0
  381. package/dist/core/memory/memories.d.ts +23 -19
  382. package/dist/core/memory/memories.js +243 -228
  383. package/dist/core/memory/memory-lifecycle.d.ts +8 -0
  384. package/dist/core/memory/memory-lifecycle.js +47 -0
  385. package/dist/core/memory/migrate.d.ts +21 -0
  386. package/dist/core/memory/migrate.js +134 -0
  387. package/dist/core/memory/normalization.d.ts +7 -0
  388. package/dist/core/memory/normalization.js +26 -0
  389. package/dist/core/memory/path-strengthener.d.ts +39 -0
  390. package/dist/core/memory/path-strengthener.js +150 -0
  391. package/dist/core/memory/progressive-disclosure.js +1 -1
  392. package/dist/core/memory/query-processor.js +37 -3
  393. package/dist/core/memory/query-rewriter.js +9 -9
  394. package/dist/core/memory/retrieval-feedback.d.ts +70 -0
  395. package/dist/core/memory/retrieval-feedback.js +213 -0
  396. package/dist/core/memory/serialization.d.ts +4 -0
  397. package/dist/core/memory/serialization.js +49 -0
  398. package/dist/core/memory/stale-cleaner.d.ts +26 -0
  399. package/dist/core/memory/stale-cleaner.js +97 -0
  400. package/dist/core/memory/stats.d.ts +15 -0
  401. package/dist/core/memory/stats.js +69 -13
  402. package/dist/core/memory/temporal-facts.js +21 -0
  403. package/dist/core/memory/trigger-detector.d.ts +8 -1
  404. package/dist/core/memory/trigger-detector.js +42 -5
  405. package/dist/core/memory/write-gate.js +1 -1
  406. package/dist/core/places/index.d.ts +14 -0
  407. package/dist/core/places/index.js +14 -0
  408. package/dist/core/places/memory-places.d.ts +68 -0
  409. package/dist/core/places/memory-places.js +261 -0
  410. package/dist/core/places/places.d.ts +88 -0
  411. package/dist/core/places/places.js +314 -0
  412. package/dist/core/places/rules.d.ts +74 -0
  413. package/dist/core/places/rules.js +240 -0
  414. package/dist/core/places/walking.d.ts +56 -0
  415. package/dist/core/places/walking.js +121 -0
  416. package/dist/core/projects.d.ts +5 -0
  417. package/dist/core/projects.js +47 -18
  418. package/dist/core/responses.d.ts +96 -0
  419. package/dist/core/responses.js +122 -0
  420. package/dist/core/runtime/trust-report.d.ts +102 -0
  421. package/dist/core/runtime/trust-report.js +107 -0
  422. package/dist/core/runtime/trust-state.d.ts +12 -0
  423. package/dist/core/runtime/trust-state.js +309 -0
  424. package/dist/core/scheduler/cron-scheduler.d.ts +1 -1
  425. package/dist/core/scheduler/cron-scheduler.js +193 -10
  426. package/dist/core/scheduler/index.d.ts +1 -1
  427. package/dist/core/scheduler/index.js +1 -1
  428. package/dist/core/scheduler/job-runner.js +2 -2
  429. package/dist/core/search/conversations.js +40 -42
  430. package/dist/core/search/entities.js +6 -9
  431. package/dist/core/search/graph-boost.d.ts +7 -0
  432. package/dist/core/search/graph-boost.js +23 -0
  433. package/dist/core/search/qmd-wrapper.d.ts +36 -0
  434. package/dist/core/search/qmd-wrapper.js +58 -0
  435. package/dist/core/security/encrypt.d.ts +6 -0
  436. package/dist/core/security/encrypt.js +47 -0
  437. package/dist/core/{governance.d.ts → security/governance.d.ts} +6 -1
  438. package/dist/core/security/governance.js +79 -0
  439. package/dist/core/session/auto-load.js +34 -9
  440. package/dist/core/session/entity-tracker.d.ts +62 -0
  441. package/dist/core/session/entity-tracker.js +287 -0
  442. package/dist/core/session/index.d.ts +1 -1
  443. package/dist/core/session/index.js +1 -1
  444. package/dist/core/session/reference-resolver.d.ts +26 -0
  445. package/dist/core/session/reference-resolver.js +121 -0
  446. package/dist/core/{session-hooks → session}/self-iteration-job.d.ts +15 -0
  447. package/dist/core/{session-hooks → session}/self-iteration-job.js +195 -90
  448. package/dist/core/session/working-set.d.ts +50 -0
  449. package/dist/core/session/working-set.js +212 -0
  450. package/dist/core/snapshots/creation.d.ts +2 -8
  451. package/dist/core/snapshots/creation.js +3 -12
  452. package/dist/core/{cache.js → storage/cache.js} +2 -2
  453. package/dist/core/utils/memory-operations.js +1 -1
  454. package/dist/core/utils/summarization-helpers.d.ts +0 -4
  455. package/dist/core/utils/summarization-helpers.js +1 -6
  456. package/dist/core/utils/vector-operations.d.ts +71 -0
  457. package/dist/core/utils/vector-operations.js +129 -0
  458. package/dist/db/adapter.d.ts +3 -3
  459. package/dist/db/adapter.js +99 -88
  460. package/dist/db/bootstrap.d.ts +2 -0
  461. package/dist/db/bootstrap.js +921 -674
  462. package/dist/{drizzle → db/drizzle}/schema-sqlite.d.ts +775 -25
  463. package/dist/{drizzle → db/drizzle}/schema-sqlite.js +170 -24
  464. package/dist/{drizzle → db/drizzle}/schema.d.ts +731 -32
  465. package/dist/{drizzle → db/drizzle}/schema.js +192 -32
  466. package/dist/db/drizzle.config.d.ts +3 -0
  467. package/dist/db/drizzle.config.js +12 -0
  468. package/dist/db/index.d.ts +1 -5
  469. package/dist/db/index.js +51 -8
  470. package/dist/db/migrations/associations.d.ts +6 -0
  471. package/dist/db/migrations/associations.js +29 -0
  472. package/dist/db/migrations/beliefs.d.ts +10 -0
  473. package/dist/db/migrations/beliefs.js +76 -0
  474. package/dist/db/migrations/core-memory.d.ts +6 -0
  475. package/dist/db/migrations/core-memory.js +29 -0
  476. package/dist/db/migrations/fts.d.ts +6 -0
  477. package/dist/db/migrations/fts.js +52 -0
  478. package/dist/db/migrations/index.d.ts +25 -0
  479. package/dist/db/migrations/index.js +51 -0
  480. package/dist/db/migrations/indexes.d.ts +6 -0
  481. package/dist/db/migrations/indexes.js +30 -0
  482. package/dist/db/migrations/learnings.d.ts +7 -0
  483. package/dist/db/migrations/learnings.js +26 -0
  484. package/dist/db/migrations/maintenance.d.ts +6 -0
  485. package/dist/db/migrations/maintenance.js +61 -0
  486. package/dist/db/migrations/memories.d.ts +7 -0
  487. package/dist/db/migrations/memories.js +16 -0
  488. package/dist/db/migrations/memory-places.d.ts +6 -0
  489. package/dist/db/migrations/memory-places.js +29 -0
  490. package/dist/db/migrations/places.d.ts +6 -0
  491. package/dist/db/migrations/places.js +43 -0
  492. package/dist/db/migrations/projects.d.ts +3 -0
  493. package/dist/db/migrations/projects.js +13 -0
  494. package/dist/db/migrations/tier-conversion.d.ts +7 -0
  495. package/dist/db/migrations/tier-conversion.js +20 -0
  496. package/dist/db/neon.d.ts +8 -0
  497. package/dist/db/neon.js +20 -0
  498. package/dist/db/schema/beliefs.d.ts +9 -0
  499. package/dist/db/schema/beliefs.js +46 -0
  500. package/dist/db/schema/generator.d.ts +38 -0
  501. package/dist/db/schema/generator.js +108 -0
  502. package/dist/db/schema/index.d.ts +39 -0
  503. package/dist/db/schema/index.js +51 -0
  504. package/dist/db/schema/learnings.d.ts +7 -0
  505. package/dist/db/schema/learnings.js +30 -0
  506. package/dist/db/schema/memories.d.ts +7 -0
  507. package/dist/db/schema/memories.js +81 -0
  508. package/dist/db/schema/projects.d.ts +4 -0
  509. package/dist/db/schema/projects.js +31 -0
  510. package/dist/db/schema/tables/context-sessions.d.ts +9 -0
  511. package/dist/db/schema/tables/context-sessions.js +37 -0
  512. package/dist/db/schema/tables/conversations.d.ts +9 -0
  513. package/dist/db/schema/tables/conversations.js +47 -0
  514. package/dist/db/schema/tables/core-memory.d.ts +9 -0
  515. package/dist/db/schema/tables/core-memory.js +41 -0
  516. package/dist/db/schema/tables/entities.d.ts +9 -0
  517. package/dist/db/schema/tables/entities.js +39 -0
  518. package/dist/db/schema/tables/entity-relations.d.ts +9 -0
  519. package/dist/db/schema/tables/entity-relations.js +31 -0
  520. package/dist/db/schema/tables/learnings.d.ts +9 -0
  521. package/dist/db/schema/tables/learnings.js +66 -0
  522. package/dist/db/schema/tables/memories.d.ts +9 -0
  523. package/dist/db/schema/tables/memories.js +161 -0
  524. package/dist/db/schema/tables/memory-associations.d.ts +9 -0
  525. package/dist/db/schema/tables/memory-associations.js +39 -0
  526. package/dist/db/schema/tables/memory-hash-cache.d.ts +9 -0
  527. package/dist/db/schema/tables/memory-hash-cache.js +29 -0
  528. package/dist/db/schema/tables/memory-merge-history.d.ts +9 -0
  529. package/dist/db/schema/tables/memory-merge-history.js +33 -0
  530. package/dist/db/schema/tables/memory-merge-proposals.d.ts +9 -0
  531. package/dist/db/schema/tables/memory-merge-proposals.js +39 -0
  532. package/dist/db/schema/tables/messages.d.ts +9 -0
  533. package/dist/db/schema/tables/messages.js +41 -0
  534. package/dist/db/schema/tables/namespaces.d.ts +9 -0
  535. package/dist/db/schema/tables/namespaces.js +37 -0
  536. package/dist/db/schema/tables/projects.d.ts +9 -0
  537. package/dist/db/schema/tables/projects.js +31 -0
  538. package/dist/db/schema/tables/users.d.ts +9 -0
  539. package/dist/db/schema/tables/users.js +27 -0
  540. package/dist/db/schema.d.ts +1 -1
  541. package/dist/db/schema.js +2 -2
  542. package/dist/db/supabase.d.ts +9 -0
  543. package/dist/db/supabase.js +24 -0
  544. package/dist/packages/mcp/src/index.d.ts +3 -0
  545. package/dist/packages/mcp/src/index.js +733 -0
  546. package/mcp.json.example +8 -0
  547. package/package.json +132 -173
  548. package/packages/cli/package.json +22 -0
  549. package/packages/cli/src/commands/clean.ts +68 -0
  550. package/packages/cli/src/commands/context.ts +79 -0
  551. package/packages/cli/src/commands/doctor.ts +357 -0
  552. package/packages/cli/src/commands/forget.ts +72 -0
  553. package/packages/cli/src/commands/health.ts +36 -0
  554. package/packages/cli/src/commands/inspect.ts +41 -0
  555. package/packages/cli/src/commands/link.ts +50 -0
  556. package/packages/cli/src/commands/migrate.ts +93 -0
  557. package/packages/cli/src/commands/recall.ts +99 -0
  558. package/packages/cli/src/commands/recent.ts +57 -0
  559. package/packages/cli/src/commands/remember.ts +139 -0
  560. package/packages/cli/src/commands/run.ts +58 -0
  561. package/packages/cli/src/commands/stale.ts +43 -0
  562. package/packages/cli/src/commands/stats.ts +42 -0
  563. package/packages/cli/src/index.ts +57 -0
  564. package/packages/cli/tsconfig.json +24 -0
  565. package/packages/mcp/package.json +26 -0
  566. package/packages/mcp/src/index.ts +877 -0
  567. package/packages/mcp/tsconfig.json +20 -0
  568. package/skills/squish-memory/SKILL.md +107 -114
  569. package/skills/squish-memory/install.sh +3 -3
  570. package/skills/squish-memory/{claude-desktop.json → references/claude-desktop.json} +12 -12
  571. package/skills/squish-memory/{openclaw.json → references/openclaw.json} +13 -13
  572. package/skills/squish-memory/{opencode.json → references/opencode.json} +14 -14
  573. package/.claude-plugin/marketplace.json +0 -20
  574. package/.claude-plugin/plugin.json +0 -32
  575. package/.env.mcp.example +0 -60
  576. package/.mcp.json +0 -11
  577. package/QUICK-START.md +0 -71
  578. package/bin/squish-add.mjs +0 -32
  579. package/bin/squish-rm.mjs +0 -21
  580. package/commands/context-paging.md +0 -51
  581. package/commands/context-status.md +0 -22
  582. package/commands/context.md +0 -5
  583. package/commands/core-memory.md +0 -56
  584. package/commands/health.md +0 -5
  585. package/commands/init.md +0 -39
  586. package/commands/merge.md +0 -113
  587. package/commands/observe.md +0 -5
  588. package/commands/recall.md +0 -5
  589. package/commands/remember.md +0 -11
  590. package/commands/search.md +0 -10
  591. package/config/mcp-cli-fallback-policy.json +0 -22
  592. package/config/mcp.json +0 -38
  593. package/config/plugin-manifest.json +0 -152
  594. package/config/plugin-manifest.schema.json +0 -244
  595. package/config/remote-memory-policy.json +0 -32
  596. package/dist/api/web/index.d.ts +0 -3
  597. package/dist/api/web/index.js +0 -4
  598. package/dist/api/web/web-server.d.ts +0 -3
  599. package/dist/api/web/web-server.js +0 -6
  600. package/dist/api/web/web.d.ts +0 -4
  601. package/dist/api/web/web.js +0 -639
  602. package/dist/commands/managed-sync.d.ts +0 -10
  603. package/dist/commands/managed-sync.js +0 -64
  604. package/dist/commands/mcp-server.d.ts +0 -3
  605. package/dist/commands/mcp-server.js +0 -393
  606. package/dist/core/context.js +0 -24
  607. package/dist/core/governance.js +0 -64
  608. package/dist/core/local-embeddings.d.ts +0 -6
  609. package/dist/core/local-embeddings.js +0 -20
  610. package/dist/core/namespaces/index.d.ts +0 -71
  611. package/dist/core/namespaces/index.js +0 -305
  612. package/dist/core/namespaces/uri-parser.d.ts +0 -31
  613. package/dist/core/namespaces/uri-parser.js +0 -74
  614. package/dist/core/observations.d.ts +0 -26
  615. package/dist/core/observations.js +0 -110
  616. package/dist/core/requirements.d.ts +0 -20
  617. package/dist/core/requirements.js +0 -35
  618. package/dist/core/search/qmd-search.d.ts +0 -61
  619. package/dist/core/search/qmd-search.js +0 -178
  620. package/dist/core/snapshots.d.ts +0 -29
  621. package/dist/core/snapshots.js +0 -220
  622. package/dist/core/sync/qmd-sync.d.ts +0 -106
  623. package/dist/core/sync/qmd-sync.js +0 -213
  624. package/dist/core/utils.js +0 -74
  625. package/dist/index.d.ts +0 -19
  626. package/dist/index.js +0 -997
  627. package/generated/mcp/manifest.json +0 -23
  628. package/generated/mcp/mcp-servers.json +0 -25
  629. package/generated/mcp/mcporter.json +0 -34
  630. package/generated/mcp/openclaw-memory-qmd.json +0 -17
  631. package/generated/mcp/runtime.json +0 -12
  632. package/hooks/hooks.json +0 -52
  633. package/hooks/post-tool-use.js +0 -26
  634. package/hooks/session-end.js +0 -28
  635. package/hooks/session-start.js +0 -33
  636. package/hooks/user-prompt-submit.js +0 -26
  637. package/hooks/utils.js +0 -153
  638. package/npx-installer.js +0 -208
  639. package/packages/plugin-claude-code/README.md +0 -73
  640. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +0 -35
  641. package/packages/plugin-claude-code/dist/plugin-wrapper.js +0 -191
  642. package/packages/plugin-claude-code/package.json +0 -31
  643. package/packages/plugin-openclaw/README.md +0 -70
  644. package/packages/plugin-openclaw/dist/index.d.ts +0 -49
  645. package/packages/plugin-openclaw/dist/index.js +0 -262
  646. package/packages/plugin-openclaw/openclaw.plugin.json +0 -94
  647. package/packages/plugin-openclaw/package.json +0 -31
  648. package/packages/plugin-opencode/install.mjs +0 -217
  649. package/packages/plugin-opencode/package.json +0 -21
  650. package/plugin.json +0 -32
  651. package/scripts/build-release.sh +0 -36
  652. package/scripts/check-secrets.js +0 -132
  653. package/scripts/db/check-db.mjs +0 -88
  654. package/scripts/db/fix-all-columns.mjs +0 -52
  655. package/scripts/db/fix-schema-all.mjs +0 -55
  656. package/scripts/db/fix-schema-full.mjs +0 -46
  657. package/scripts/db/fix-schema.mjs +0 -38
  658. package/scripts/db/init-db.mjs +0 -13
  659. package/scripts/db/recreate-db.mjs +0 -14
  660. package/scripts/generate-mcp.mjs +0 -264
  661. package/scripts/github-release.sh +0 -77
  662. package/scripts/init-dirs.mjs +0 -13
  663. package/scripts/install-interactive.mjs +0 -677
  664. package/scripts/install-mcp.mjs +0 -116
  665. package/scripts/install-plugin.mjs +0 -415
  666. package/scripts/install-web.sh +0 -120
  667. package/scripts/install.mjs +0 -340
  668. package/scripts/openclaw-bootstrap.mjs +0 -127
  669. package/scripts/package-release.sh +0 -71
  670. package/scripts/remote-preflight.mjs +0 -62
  671. package/scripts/squish-fallback.mjs +0 -132
  672. package/scripts/test/test-all-systems.mjs +0 -139
  673. package/scripts/test/test-memory-system.mjs +0 -139
  674. package/scripts/test/test-v0.5.0.mjs +0 -210
  675. package/scripts/test-interactive.mjs +0 -131
  676. package/scripts/verify-mcp.mjs +0 -214
  677. package/skills/memory-guide/SKILL.md +0 -332
  678. package/skills/squish-cli/SKILL.md +0 -240
  679. package/skills/squish-mcp/SKILL.md +0 -355
  680. package/skills/squish-memory/install.mjs +0 -335
  681. package/skills/squish-memory/skill.json +0 -32
  682. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.d.ts +0 -0
  683. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.js +0 -0
  684. /package/dist/{algorithms → core/algorithms}/handlers/approve-merge.d.ts +0 -0
  685. /package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.d.ts +0 -0
  686. /package/dist/{algorithms → core/algorithms}/handlers/get-stats.d.ts +0 -0
  687. /package/dist/{algorithms → core/algorithms}/handlers/list-proposals.d.ts +0 -0
  688. /package/dist/{algorithms → core/algorithms}/handlers/preview-merge.d.ts +0 -0
  689. /package/dist/{algorithms → core/algorithms}/handlers/reject-merge.d.ts +0 -0
  690. /package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.d.ts +0 -0
  691. /package/dist/{algorithms → core/algorithms}/safety/safety-checks.js +0 -0
  692. /package/dist/{algorithms → core/algorithms}/utils/response-builder.d.ts +0 -0
  693. /package/dist/{algorithms → core/algorithms}/utils/response-builder.js +0 -0
  694. /package/dist/core/{context.d.ts → context/context.d.ts} +0 -0
  695. /package/dist/core/{agent-memory.d.ts → ingestion/agent-memory.d.ts} +0 -0
  696. /package/dist/core/{privacy.d.ts → security/privacy.d.ts} +0 -0
  697. /package/dist/core/{privacy.js → security/privacy.js} +0 -0
  698. /package/dist/core/{secret-detector.d.ts → security/secret-detector.d.ts} +0 -0
  699. /package/dist/core/{secret-detector.js → security/secret-detector.js} +0 -0
  700. /package/dist/core/{session-hooks → session}/session-hooks.d.ts +0 -0
  701. /package/dist/core/{session-hooks → session}/session-hooks.js +0 -0
  702. /package/dist/core/{cache.d.ts → storage/cache.d.ts} +0 -0
  703. /package/dist/core/{database.d.ts → storage/database.d.ts} +0 -0
  704. /package/dist/core/{database.js → storage/database.js} +0 -0
@@ -0,0 +1,241 @@
1
+ import { config } from '../../config.js';
2
+ import { logger } from '../logger.js';
3
+
4
+ let redis: any = null;
5
+
6
+ // LRU Cache with configurable size limits and TTL
7
+ interface CacheEntry<T> {
8
+ value: T;
9
+ expires: number;
10
+ lastAccessed: number;
11
+ }
12
+
13
+ class LRUCache {
14
+ private cache = new Map<string, CacheEntry<unknown>>();
15
+ private maxSize: number;
16
+ private maxSizeBytes: number;
17
+ private currentSizeBytes: number = 0;
18
+ private cleanupTimer: NodeJS.Timeout | null = null;
19
+
20
+ constructor(maxSize: number = 1000, maxSizeBytes: number = 50 * 1024 * 1024) {
21
+ this.maxSize = maxSize;
22
+ this.maxSizeBytes = maxSizeBytes; // 50MB default
23
+ this.startCleanupTimer();
24
+ }
25
+
26
+ get<T>(key: string): T | null {
27
+ const entry = this.cache.get(key);
28
+
29
+ if (!entry) return null;
30
+
31
+ // Check expiration
32
+ if (entry.expires < Date.now()) {
33
+ this.delete(key);
34
+ return null;
35
+ }
36
+
37
+ // Update LRU access time
38
+ entry.lastAccessed = Date.now();
39
+
40
+ return entry.value as T;
41
+ }
42
+
43
+ set<T>(key: string, value: T, ttlMs: number = 3600000): void {
44
+ const size = this.estimateSize(value);
45
+
46
+ // Evict if needed
47
+ while (
48
+ (this.cache.size >= this.maxSize || this.currentSizeBytes + size > this.maxSizeBytes) &&
49
+ this.cache.size > 0
50
+ ) {
51
+ this.evictLRU();
52
+ }
53
+
54
+ // Delete old entry if exists
55
+ if (this.cache.has(key)) {
56
+ this.delete(key);
57
+ }
58
+
59
+ // Add new entry
60
+ this.cache.set(key, {
61
+ value,
62
+ expires: Date.now() + ttlMs,
63
+ lastAccessed: Date.now(),
64
+ });
65
+
66
+ this.currentSizeBytes += size;
67
+ }
68
+
69
+ delete(key: string): boolean {
70
+ const entry = this.cache.get(key);
71
+ if (entry) {
72
+ const size = this.estimateSize(entry.value);
73
+ this.currentSizeBytes = Math.max(0, this.currentSizeBytes - size);
74
+ }
75
+ return this.cache.delete(key);
76
+ }
77
+
78
+ clear(): void {
79
+ this.cache.clear();
80
+ this.currentSizeBytes = 0;
81
+ }
82
+
83
+ size(): number {
84
+ return this.cache.size;
85
+ }
86
+
87
+ sizeBytes(): number {
88
+ return this.currentSizeBytes;
89
+ }
90
+
91
+ private evictLRU(): void {
92
+ let oldestKey: string | null = null;
93
+ let oldestTime = Infinity;
94
+
95
+ for (const [key, entry] of this.cache.entries()) {
96
+ if (entry.lastAccessed < oldestTime) {
97
+ oldestTime = entry.lastAccessed;
98
+ oldestKey = key;
99
+ }
100
+ }
101
+
102
+ if (oldestKey) {
103
+ logger.debug('Evicting LRU cache entry', { key: oldestKey });
104
+ this.delete(oldestKey);
105
+ }
106
+ }
107
+
108
+ private estimateSize(value: unknown): number {
109
+ try {
110
+ return JSON.stringify(value).length * 2; // UTF-16, rough estimate
111
+ } catch {
112
+ return 1024; // Default 1KB for non-serializable objects
113
+ }
114
+ }
115
+
116
+ private cleanup(): void {
117
+ const now = Date.now();
118
+ const toDelete: string[] = [];
119
+
120
+ for (const [key, entry] of this.cache.entries()) {
121
+ if (entry.expires < now) {
122
+ toDelete.push(key);
123
+ }
124
+ }
125
+
126
+ for (const key of toDelete) {
127
+ this.delete(key);
128
+ }
129
+
130
+ if (toDelete.length > 0) {
131
+ logger.debug('Cache cleanup removed expired entries', { count: toDelete.length });
132
+ }
133
+ }
134
+
135
+ private startCleanupTimer(): void {
136
+ // Cleanup every 5 minutes
137
+ this.cleanupTimer = setInterval(() => this.cleanup(), 5 * 60 * 1000);
138
+
139
+ // Prevent timer from keeping process alive
140
+ if (this.cleanupTimer.unref) {
141
+ this.cleanupTimer.unref();
142
+ }
143
+ }
144
+
145
+ stopCleanupTimer(): void {
146
+ if (this.cleanupTimer) {
147
+ clearInterval(this.cleanupTimer);
148
+ this.cleanupTimer = null;
149
+ }
150
+ }
151
+
152
+ getStats() {
153
+ return {
154
+ entries: this.cache.size,
155
+ sizeBytes: this.currentSizeBytes,
156
+ maxSize: this.maxSize,
157
+ maxSizeBytes: this.maxSizeBytes,
158
+ utilizationPercent: (this.cache.size / this.maxSize) * 100,
159
+ memoryUtilizationPercent: (this.currentSizeBytes / this.maxSizeBytes) * 100,
160
+ };
161
+ }
162
+ }
163
+
164
+ // Create LRU cache with configurable limits
165
+ const memoryCache = new LRUCache(
166
+ parseInt(process.env.SQUISH_CACHE_MAX_ENTRIES || '1000'),
167
+ parseInt(process.env.SQUISH_CACHE_MAX_BYTES || '52428800') // 50MB
168
+ );
169
+
170
+ async function initRedis() {
171
+ if (!config.redisEnabled) return null;
172
+ if (redis) return redis;
173
+
174
+ try {
175
+ const { createClient } = await import('redis');
176
+ redis = createClient({ url: process.env.REDIS_URL });
177
+ await redis.connect();
178
+ logger.info('Redis connected');
179
+ return redis;
180
+ } catch (error) {
181
+ logger.error('Failed to connect to Redis, using memory cache', error);
182
+ redis = null;
183
+ return null;
184
+ }
185
+ }
186
+
187
+ export async function cacheGet<T>(key: string): Promise<T | null> {
188
+ try {
189
+ const r = await initRedis();
190
+ if (r) {
191
+ const value = await r.get(key);
192
+ return value ? (JSON.parse(value) as T) : null;
193
+ }
194
+ } catch (error) {
195
+ logger.error('Redis GET failed, falling back to memory', error);
196
+ }
197
+
198
+ // Memory cache fallback with LRU
199
+ return memoryCache.get<T>(key);
200
+ }
201
+
202
+ export async function cacheSet<T>(key: string, value: T, ttlMs: number = 3600000): Promise<void> {
203
+ try {
204
+ const r = await initRedis();
205
+ if (r) {
206
+ await r.setEx(key, Math.floor(ttlMs / 1000), JSON.stringify(value));
207
+ return;
208
+ }
209
+ } catch (error) {
210
+ logger.error('Redis SET failed, falling back to memory', error);
211
+ }
212
+
213
+ // Memory cache fallback with LRU
214
+ memoryCache.set(key, value, ttlMs);
215
+ }
216
+
217
+ export function getCacheStats() {
218
+ return memoryCache.getStats();
219
+ }
220
+
221
+ export async function closeCache(): Promise<void> {
222
+ if (redis) {
223
+ await redis.quit();
224
+ redis = null;
225
+ }
226
+ memoryCache.stopCleanupTimer();
227
+ memoryCache.clear();
228
+ }
229
+
230
+ export async function checkRedisHealth(): Promise<boolean> {
231
+ if (!config.redisEnabled) return true;
232
+ try {
233
+ const r = await initRedis();
234
+ if (!r) return false;
235
+ const pong = await r.ping();
236
+ return pong === 'PONG';
237
+ } catch (error) {
238
+ logger.error('Redis health check failed', error);
239
+ return false;
240
+ }
241
+ }
@@ -0,0 +1,23 @@
1
+ import type { Database } from 'better-sqlite3';
2
+ import type { Pool } from 'pg';
3
+
4
+ export interface DatabaseClient {
5
+ $client: Database | Pool;
6
+ $clientType: 'sqlite' | 'postgres';
7
+ select: (...args: any[]) => any;
8
+ insert: (...args: any[]) => any;
9
+ update: (...args: any[]) => any;
10
+ delete: (...args: any[]) => any;
11
+ }
12
+
13
+ export function createDatabaseClient(db: any): DatabaseClient {
14
+ const isSqlite = typeof (db.$client as any).prepare === 'function';
15
+ return {
16
+ $client: db.$client,
17
+ $clientType: isSqlite ? 'sqlite' : 'postgres',
18
+ select: (...args: any[]) => db.select(...args),
19
+ insert: (...args: any[]) => db.insert(...args),
20
+ update: (...args: any[]) => db.update(...args),
21
+ delete: (...args: any[]) => db.delete(...args),
22
+ };
23
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Summarization Cleanup Operations
3
+ * Maintenance and cleanup for summarization data
4
+ */
5
+
6
+ import { cleanupOldSessionSummaries } from '../utils/cleanup-operations.js';
7
+
8
+ /**
9
+ * Delete old summaries to save space
10
+ */
11
+ export async function pruneOldSummaries(olderThanDays: number = 30): Promise<number> {
12
+ return cleanupOldSessionSummaries(olderThanDays);
13
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Summarization Queries
3
+ * Database operations for summary retrieval
4
+ */
5
+
6
+ import { eq, desc } from 'drizzle-orm';
7
+ import { getDb } from '../../db/index.js';
8
+ import { getSchema } from '../../db/schema.js';
9
+ import { logger } from '../logger.js';
10
+
11
+ /**
12
+ * Get recent summaries for a conversation
13
+ */
14
+ export async function getRecentSummaries(
15
+ conversationId: string,
16
+ limit: number = 10
17
+ ): Promise<any[]> {
18
+ try {
19
+ const db = await getDb();
20
+ const schema = await getSchema();
21
+
22
+ return await (db as any)
23
+ .select()
24
+ .from(schema.sessionSummaries)
25
+ .where(eq(schema.sessionSummaries.conversationId, conversationId))
26
+ .orderBy(desc(schema.sessionSummaries.createdAt))
27
+ .limit(limit);
28
+ } catch (error) {
29
+ logger.error('Error getting recent summaries', error);
30
+ return [];
31
+ }
32
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Summarization Statistics
3
+ * Analytics and statistics for summarization operations
4
+ */
5
+
6
+ import { eq } from 'drizzle-orm';
7
+ import { getDb } from '../../db/index.js';
8
+ import { getSchema } from '../../db/schema.js';
9
+ import { logger } from '../logger.js';
10
+
11
+ /**
12
+ * Get summarization statistics
13
+ */
14
+ export async function getSummarizationStats(projectId?: string): Promise<{
15
+ totalSummaries: number;
16
+ byType: Record<string, number>;
17
+ totalTokensSaved: number;
18
+ avgCompressionRatio: number;
19
+ }> {
20
+ try {
21
+ const db = await getDb();
22
+ const schema = await getSchema();
23
+
24
+ const where = projectId ? eq(schema.sessionSummaries.projectId, projectId) : undefined;
25
+
26
+ const summaries = await (db as any).select().from(schema.sessionSummaries).where(where);
27
+
28
+ const stats = {
29
+ totalSummaries: summaries.length,
30
+ byType: {
31
+ incremental: 0,
32
+ rolling: 0,
33
+ final: 0,
34
+ } as Record<string, number>,
35
+ totalTokensSaved: 0,
36
+ avgCompressionRatio: 0,
37
+ };
38
+
39
+ for (const s of summaries) {
40
+ stats.byType[s.summaryType] = (stats.byType[s.summaryType] || 0) + 1;
41
+ stats.totalTokensSaved += s.tokensSaved || 0;
42
+ }
43
+
44
+ // Calculate average compression ratio
45
+ let totalRatio = 0;
46
+ for (const s of summaries) {
47
+ if (s.compressedFrom && s.compressedFrom > 0) {
48
+ totalRatio += s.tokensSaved / (s.compressedFrom * 100); // Rough estimate
49
+ }
50
+ }
51
+
52
+ stats.avgCompressionRatio = summaries.length > 0 ? totalRatio / summaries.length : 0;
53
+
54
+ return stats;
55
+ } catch (error) {
56
+ logger.error('Error getting summarization stats', error);
57
+ return {
58
+ totalSummaries: 0,
59
+ byType: {},
60
+ totalTokensSaved: 0,
61
+ avgCompressionRatio: 0,
62
+ };
63
+ }
64
+ }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Summarization Strategies
3
+ * Implements different summarization algorithms
4
+ */
5
+
6
+ import {
7
+ chunkMessages,
8
+ getRollingWindow,
9
+ } from '../utils/summarization-helpers.js';
10
+ import { extractMessageContent, generateExtractiveSummary } from '../utils/content-extraction.js';
11
+
12
+ export type SummaryType = 'incremental' | 'rolling' | 'final';
13
+
14
+ export interface SummarizationConfig {
15
+ incrementalThreshold: number; // Summarize every N messages
16
+ rollingWindowSize: number; // Rolling summary window
17
+ compressionRatio: number; // Target compression ratio
18
+ enabled: boolean;
19
+ }
20
+
21
+ /**
22
+ * Create incremental summary (summary in chunks)
23
+ */
24
+ export async function createIncrementalSummary(
25
+ messages: any[],
26
+ config: SummarizationConfig
27
+ ): Promise<string> {
28
+ const chunks = chunkMessages(messages, config.incrementalThreshold);
29
+ const summaries = chunks.map(chunk => generateExtractiveSummary(extractMessageContent(chunk)));
30
+ return summaries.join('\n---\n');
31
+ }
32
+
33
+ /**
34
+ * Create rolling summary (last N messages)
35
+ */
36
+ export async function createRollingSummary(
37
+ messages: any[],
38
+ config: SummarizationConfig
39
+ ): Promise<string> {
40
+ const window = getRollingWindow(messages, config.rollingWindowSize);
41
+ return generateExtractiveSummary(extractMessageContent(window));
42
+ }
43
+
44
+ /**
45
+ * Create final summary (entire conversation)
46
+ */
47
+ export async function createFinalSummary(
48
+ messages: any[],
49
+ config: SummarizationConfig
50
+ ): Promise<string> {
51
+ return generateExtractiveSummary(extractMessageContent(messages));
52
+ }
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Aggressive Session Summarization
3
+ * Implements incremental, rolling, and final summarization
4
+ */
5
+
6
+ import { eq, and, gte, desc } from 'drizzle-orm';
7
+ import { randomUUID } from 'crypto';
8
+ import { getDb } from '../db/index.js';
9
+ import { getSchema } from '../db/schema.js';
10
+ import { config } from '../config.js';
11
+ import { getEmbedding } from './embeddings.js';
12
+ import { cleanupOldSessionSummaries } from './utils/cleanup-operations.js';
13
+ import {
14
+ chunkMessages,
15
+ getRollingWindow,
16
+ calculateTokensSaved,
17
+ estimateTokens
18
+ } from './utils/summarization-helpers.js';
19
+ import { extractMessageContent, generateExtractiveSummary } from './utils/content-extraction.js';
20
+ import { logger } from './logger.js';
21
+
22
+ export type SummaryType = 'incremental' | 'rolling' | 'final';
23
+
24
+ export interface SummarizationConfig {
25
+ incrementalThreshold: number; // Summarize every N messages
26
+ rollingWindowSize: number; // Rolling summary window
27
+ compressionRatio: number; // Target compression ratio
28
+ enabled: boolean;
29
+ }
30
+
31
+ const DEFAULT_CONFIG: SummarizationConfig = {
32
+ incrementalThreshold: config.incrementalThreshold || 10,
33
+ rollingWindowSize: 50,
34
+ compressionRatio: 0.2, // 5:1 compression
35
+ enabled: config.summarizationEnabled !== false,
36
+ };
37
+
38
+ /**
39
+ * Summarize a conversation session
40
+ */
41
+ export async function summarizeSession(
42
+ conversationId: string,
43
+ summaryType: SummaryType,
44
+ customConfig: Partial<SummarizationConfig> = {}
45
+ ): Promise<{ summaryId: string; tokensSaved: number; summary: string }> {
46
+ const finalConfig = { ...DEFAULT_CONFIG, ...customConfig };
47
+
48
+ if (!finalConfig.enabled) {
49
+ return { summaryId: '', tokensSaved: 0, summary: '' };
50
+ }
51
+
52
+ try {
53
+ const db = await getDb();
54
+ const schema = await getSchema();
55
+
56
+ // Fetch messages for this conversation
57
+ const messages = await (db as any)
58
+ .select()
59
+ .from(schema.messages)
60
+ .where(eq(schema.messages.conversationId, conversationId))
61
+ .orderBy(schema.messages.createdAt);
62
+
63
+ if (messages.length === 0) {
64
+ return { summaryId: '', tokensSaved: 0, summary: '' };
65
+ }
66
+
67
+ let summary = '';
68
+
69
+ switch (summaryType) {
70
+ case 'incremental':
71
+ summary = await createIncrementalSummary(messages, finalConfig);
72
+ break;
73
+ case 'rolling':
74
+ summary = await createRollingSummary(messages, finalConfig);
75
+ break;
76
+ case 'final':
77
+ summary = await createFinalSummary(messages, finalConfig);
78
+ break;
79
+ }
80
+
81
+ if (summary) {
82
+ // Store summary with embedding
83
+ const embedding = await getEmbedding(summary);
84
+ const conversation = await (db as any)
85
+ .select()
86
+ .from(schema.conversations)
87
+ .where(eq(schema.conversations.id, conversationId))
88
+ .limit(1);
89
+
90
+ if (conversation.length > 0) {
91
+ const tokensSaved = estimateTokensSaved(messages, summary);
92
+ const summaryId = randomUUID();
93
+
94
+ await (db as any).insert(schema.sessionSummaries).values({
95
+ id: summaryId,
96
+ conversationId,
97
+ projectId: conversation[0].projectId,
98
+ summaryType,
99
+ content: summary,
100
+ compressedFrom: messages.length,
101
+ tokensSaved,
102
+ embedding: embedding || null,
103
+ createdAt: new Date(),
104
+ });
105
+
106
+ return { summaryId, tokensSaved, summary };
107
+ }
108
+ }
109
+
110
+ return { summaryId: '', tokensSaved: 0, summary };
111
+ } catch (error) {
112
+ logger.error('Error summarizing session', error);
113
+ return { summaryId: '', tokensSaved: 0, summary: '' };
114
+ }
115
+ }
116
+
117
+ /**
118
+ * Create incremental summary (summary in chunks)
119
+ */
120
+ async function createIncrementalSummary(
121
+ messages: any[],
122
+ config: SummarizationConfig
123
+ ): Promise<string> {
124
+ const chunks = chunkMessages(messages, config.incrementalThreshold);
125
+ const summaries = chunks.map(chunk => generateExtractiveSummary(extractMessageContent(chunk)));
126
+ return summaries.join('\n---\n');
127
+ }
128
+
129
+ /**
130
+ * Create rolling summary (last N messages)
131
+ */
132
+ async function createRollingSummary(
133
+ messages: any[],
134
+ config: SummarizationConfig
135
+ ): Promise<string> {
136
+ const window = getRollingWindow(messages, config.rollingWindowSize);
137
+ return generateExtractiveSummary(extractMessageContent(window));
138
+ }
139
+
140
+ /**
141
+ * Create final summary (entire conversation)
142
+ */
143
+ async function createFinalSummary(
144
+ messages: any[],
145
+ config: SummarizationConfig
146
+ ): Promise<string> {
147
+ return generateExtractiveSummary(extractMessageContent(messages));
148
+ }
149
+
150
+ /**
151
+ * Generate basic extractive summary of messages
152
+ */
153
+ function summarizeChunk(messages: any[]): string {
154
+ if (messages.length === 0) return '';
155
+ return generateExtractiveSummary(extractMessageContent(messages));
156
+ }
157
+
158
+ /**
159
+ * Estimate tokens saved by summarization
160
+ */
161
+ function estimateTokensSaved(messages: any[], summary: string): number {
162
+ return calculateTokensSaved(messages, summary);
163
+ }
164
+
165
+ /**
166
+ * Get recent summaries for a conversation
167
+ */
168
+ export async function getRecentSummaries(
169
+ conversationId: string,
170
+ limit: number = 10
171
+ ): Promise<any[]> {
172
+ try {
173
+ const db = await getDb();
174
+ const schema = await getSchema();
175
+
176
+ return await (db as any)
177
+ .select()
178
+ .from(schema.sessionSummaries)
179
+ .where(eq(schema.sessionSummaries.conversationId, conversationId))
180
+ .orderBy(desc(schema.sessionSummaries.createdAt))
181
+ .limit(limit);
182
+ } catch (error) {
183
+ logger.error('Error getting recent summaries', error);
184
+ return [];
185
+ }
186
+ }
187
+
188
+ /**
189
+ * Get summarization statistics
190
+ */
191
+ export async function getSummarizationStats(projectId?: string): Promise<{
192
+ totalSummaries: number;
193
+ byType: Record<string, number>;
194
+ totalTokensSaved: number;
195
+ avgCompressionRatio: number;
196
+ }> {
197
+ try {
198
+ const db = await getDb();
199
+ const schema = await getSchema();
200
+
201
+ const where = projectId ? eq(schema.sessionSummaries.projectId, projectId) : undefined;
202
+
203
+ const summaries = await (db as any).select().from(schema.sessionSummaries).where(where);
204
+
205
+ const stats = {
206
+ totalSummaries: summaries.length,
207
+ byType: {
208
+ incremental: 0,
209
+ rolling: 0,
210
+ final: 0,
211
+ } as Record<string, number>,
212
+ totalTokensSaved: 0,
213
+ avgCompressionRatio: 0,
214
+ };
215
+
216
+ for (const s of summaries) {
217
+ stats.byType[s.summaryType] = (stats.byType[s.summaryType] || 0) + 1;
218
+ stats.totalTokensSaved += s.tokensSaved || 0;
219
+ }
220
+
221
+ // Calculate average compression ratio
222
+ let totalRatio = 0;
223
+ for (const s of summaries) {
224
+ if (s.compressedFrom && s.compressedFrom > 0) {
225
+ totalRatio += s.tokensSaved / (s.compressedFrom * 100); // Rough estimate
226
+ }
227
+ }
228
+
229
+ stats.avgCompressionRatio = summaries.length > 0 ? totalRatio / summaries.length : 0;
230
+
231
+ return stats;
232
+ } catch (error) {
233
+ logger.error('Error getting summarization stats', error);
234
+ return {
235
+ totalSummaries: 0,
236
+ byType: {},
237
+ totalTokensSaved: 0,
238
+ avgCompressionRatio: 0,
239
+ };
240
+ }
241
+ }
242
+
243
+ /**
244
+ * Delete old summaries to save space
245
+ */
246
+ export async function pruneOldSummaries(olderThanDays: number = 30): Promise<number> {
247
+ return cleanupOldSessionSummaries(olderThanDays);
248
+ }