squish-memory 1.2.0 → 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 (449) hide show
  1. package/bin/squish-mcp.mjs +40 -42
  2. package/core/scheduler/cron-scheduler.ts +10 -1
  3. package/core/worker.ts +10 -1
  4. package/package.json +119 -119
  5. package/packages/mcp/src/index.ts +99 -36
  6. package/dist/config.d.ts +0 -106
  7. package/dist/config.js +0 -194
  8. package/dist/core/adapters/config/claude-code.d.ts +0 -45
  9. package/dist/core/adapters/config/claude-code.js +0 -113
  10. package/dist/core/adapters/config/cursor.d.ts +0 -26
  11. package/dist/core/adapters/config/cursor.js +0 -74
  12. package/dist/core/adapters/config/opencode.d.ts +0 -23
  13. package/dist/core/adapters/config/opencode.js +0 -73
  14. package/dist/core/adapters/config/windsurf.d.ts +0 -26
  15. package/dist/core/adapters/config/windsurf.js +0 -74
  16. package/dist/core/adapters/index.d.ts +0 -45
  17. package/dist/core/adapters/index.js +0 -84
  18. package/dist/core/adapters/scripts/install-adapter.d.ts +0 -19
  19. package/dist/core/adapters/scripts/install-adapter.js +0 -149
  20. package/dist/core/adapters/timeline.d.ts +0 -23
  21. package/dist/core/adapters/timeline.js +0 -88
  22. package/dist/core/adapters/types.d.ts +0 -137
  23. package/dist/core/adapters/types.js +0 -50
  24. package/dist/core/agent-preferences.d.ts +0 -16
  25. package/dist/core/agent-preferences.js +0 -124
  26. package/dist/core/algorithms/analytics/token-estimator.d.ts +0 -50
  27. package/dist/core/algorithms/analytics/token-estimator.js +0 -154
  28. package/dist/core/algorithms/detection/hash-filters.d.ts +0 -47
  29. package/dist/core/algorithms/detection/hash-filters.js +0 -190
  30. package/dist/core/algorithms/detection/semantic-ranker.d.ts +0 -32
  31. package/dist/core/algorithms/detection/semantic-ranker.js +0 -118
  32. package/dist/core/algorithms/detection/two-stage-detector.d.ts +0 -52
  33. package/dist/core/algorithms/detection/two-stage-detector.js +0 -299
  34. package/dist/core/algorithms/handlers/approve-merge.d.ts +0 -22
  35. package/dist/core/algorithms/handlers/approve-merge.js +0 -179
  36. package/dist/core/algorithms/handlers/detect-duplicates.d.ts +0 -47
  37. package/dist/core/algorithms/handlers/detect-duplicates.js +0 -145
  38. package/dist/core/algorithms/handlers/get-stats.d.ts +0 -39
  39. package/dist/core/algorithms/handlers/get-stats.js +0 -88
  40. package/dist/core/algorithms/handlers/list-proposals.d.ts +0 -45
  41. package/dist/core/algorithms/handlers/list-proposals.js +0 -83
  42. package/dist/core/algorithms/handlers/preview-merge.d.ts +0 -39
  43. package/dist/core/algorithms/handlers/preview-merge.js +0 -93
  44. package/dist/core/algorithms/handlers/reject-merge.d.ts +0 -28
  45. package/dist/core/algorithms/handlers/reject-merge.js +0 -69
  46. package/dist/core/algorithms/handlers/reverse-merge.d.ts +0 -21
  47. package/dist/core/algorithms/handlers/reverse-merge.js +0 -121
  48. package/dist/core/algorithms/index.d.ts +0 -21
  49. package/dist/core/algorithms/index.js +0 -26
  50. package/dist/core/algorithms/operations/cache-maintenance.d.ts +0 -12
  51. package/dist/core/algorithms/operations/cache-maintenance.js +0 -157
  52. package/dist/core/algorithms/safety/safety-checks.d.ts +0 -18
  53. package/dist/core/algorithms/safety/safety-checks.js +0 -179
  54. package/dist/core/algorithms/strategies/merge-strategies.d.ts +0 -50
  55. package/dist/core/algorithms/strategies/merge-strategies.js +0 -288
  56. package/dist/core/algorithms/types.d.ts +0 -125
  57. package/dist/core/algorithms/types.js +0 -5
  58. package/dist/core/algorithms/utils/response-builder.d.ts +0 -28
  59. package/dist/core/algorithms/utils/response-builder.js +0 -37
  60. package/dist/core/associations.d.ts +0 -33
  61. package/dist/core/associations.js +0 -284
  62. package/dist/core/autosave.d.ts +0 -19
  63. package/dist/core/autosave.js +0 -16
  64. package/dist/core/beliefs/decay.d.ts +0 -27
  65. package/dist/core/beliefs/decay.js +0 -217
  66. package/dist/core/beliefs/extractor.d.ts +0 -9
  67. package/dist/core/beliefs/extractor.js +0 -113
  68. package/dist/core/beliefs/store.d.ts +0 -46
  69. package/dist/core/beliefs/store.js +0 -466
  70. package/dist/core/beliefs/types.d.ts +0 -28
  71. package/dist/core/beliefs/types.js +0 -2
  72. package/dist/core/commands/mcp-server.d.ts +0 -2
  73. package/dist/core/commands/mcp-server.js +0 -6
  74. package/dist/core/commands/remember.d.ts +0 -24
  75. package/dist/core/commands/remember.js +0 -144
  76. package/dist/core/compression.d.ts +0 -45
  77. package/dist/core/compression.js +0 -160
  78. package/dist/core/consolidation.d.ts +0 -37
  79. package/dist/core/consolidation.js +0 -248
  80. package/dist/core/context/agent-context.d.ts +0 -106
  81. package/dist/core/context/agent-context.js +0 -274
  82. package/dist/core/context/context-paging.d.ts +0 -80
  83. package/dist/core/context/context-paging.js +0 -328
  84. package/dist/core/context/context-window.d.ts +0 -40
  85. package/dist/core/context/context-window.js +0 -177
  86. package/dist/core/context/context.d.ts +0 -7
  87. package/dist/core/context/context.js +0 -22
  88. package/dist/core/embeddings/embeddings.d.ts +0 -29
  89. package/dist/core/embeddings/embeddings.js +0 -546
  90. package/dist/core/embeddings/google-multimodal.d.ts +0 -14
  91. package/dist/core/embeddings/google-multimodal.js +0 -146
  92. package/dist/core/embeddings/local-embeddings.d.ts +0 -11
  93. package/dist/core/embeddings/local-embeddings.js +0 -11
  94. package/dist/core/embeddings/qmd-client.d.ts +0 -136
  95. package/dist/core/embeddings/qmd-client.js +0 -403
  96. package/dist/core/embeddings/transformers-local.d.ts +0 -64
  97. package/dist/core/embeddings/transformers-local.js +0 -213
  98. package/dist/core/embeddings.d.ts +0 -2
  99. package/dist/core/embeddings.js +0 -3
  100. package/dist/core/error-handling.d.ts +0 -63
  101. package/dist/core/error-handling.js +0 -173
  102. package/dist/core/graph/entity-deduplicator.d.ts +0 -24
  103. package/dist/core/graph/entity-deduplicator.js +0 -183
  104. package/dist/core/graph/graph-builder.d.ts +0 -46
  105. package/dist/core/graph/graph-builder.js +0 -174
  106. package/dist/core/graph/graph-traversal.d.ts +0 -80
  107. package/dist/core/graph/graph-traversal.js +0 -315
  108. package/dist/core/graph/index.d.ts +0 -19
  109. package/dist/core/graph/index.js +0 -13
  110. package/dist/core/graph/llm-entity-extractor.d.ts +0 -49
  111. package/dist/core/graph/llm-entity-extractor.js +0 -313
  112. package/dist/core/graph/multi-hop-retrieval.d.ts +0 -48
  113. package/dist/core/graph/multi-hop-retrieval.js +0 -215
  114. package/dist/core/graph/relationship-extractor.d.ts +0 -48
  115. package/dist/core/graph/relationship-extractor.js +0 -351
  116. package/dist/core/hooks/agent-hooks.d.ts +0 -83
  117. package/dist/core/hooks/agent-hooks.js +0 -521
  118. package/dist/core/hooks/auto-tagger.d.ts +0 -19
  119. package/dist/core/hooks/auto-tagger.js +0 -155
  120. package/dist/core/hooks/capture-filter.d.ts +0 -41
  121. package/dist/core/hooks/capture-filter.js +0 -128
  122. package/dist/core/hot-cache.d.ts +0 -86
  123. package/dist/core/hot-cache.js +0 -285
  124. package/dist/core/index.d.ts +0 -10
  125. package/dist/core/index.js +0 -11
  126. package/dist/core/ingestion/agent-memory.d.ts +0 -22
  127. package/dist/core/ingestion/agent-memory.js +0 -109
  128. package/dist/core/ingestion/core-memory.d.ts +0 -78
  129. package/dist/core/ingestion/core-memory.js +0 -226
  130. package/dist/core/ingestion/learnings.d.ts +0 -57
  131. package/dist/core/ingestion/learnings.js +0 -205
  132. package/dist/core/ingestion/signal-engine.d.ts +0 -41
  133. package/dist/core/ingestion/signal-engine.js +0 -201
  134. package/dist/core/integrations/obsidian-vault.d.ts +0 -31
  135. package/dist/core/integrations/obsidian-vault.js +0 -156
  136. package/dist/core/layers/generator.d.ts +0 -25
  137. package/dist/core/layers/generator.js +0 -76
  138. package/dist/core/lib/db-client.d.ts +0 -114
  139. package/dist/core/lib/db-client.js +0 -130
  140. package/dist/core/lib/parse-embedding.d.ts +0 -9
  141. package/dist/core/lib/parse-embedding.js +0 -58
  142. package/dist/core/lib/schemas.d.ts +0 -132
  143. package/dist/core/lib/schemas.js +0 -87
  144. package/dist/core/lib/types.d.ts +0 -45
  145. package/dist/core/lib/types.js +0 -6
  146. package/dist/core/lib/utils.d.ts +0 -18
  147. package/dist/core/lib/utils.js +0 -145
  148. package/dist/core/lib/validation.d.ts +0 -38
  149. package/dist/core/lib/validation.js +0 -151
  150. package/dist/core/lifecycle.d.ts +0 -25
  151. package/dist/core/lifecycle.js +0 -292
  152. package/dist/core/logger.d.ts +0 -17
  153. package/dist/core/logger.js +0 -46
  154. package/dist/core/mcp/client.d.ts +0 -17
  155. package/dist/core/mcp/client.js +0 -101
  156. package/dist/core/mcp/index.d.ts +0 -6
  157. package/dist/core/mcp/index.js +0 -6
  158. package/dist/core/mcp/server.d.ts +0 -18
  159. package/dist/core/mcp/server.js +0 -157
  160. package/dist/core/mcp/standalone-server.d.ts +0 -13
  161. package/dist/core/mcp/standalone-server.js +0 -46
  162. package/dist/core/mcp/tools.d.ts +0 -7
  163. package/dist/core/mcp/tools.js +0 -278
  164. package/dist/core/mcp/types.d.ts +0 -87
  165. package/dist/core/mcp/types.js +0 -48
  166. package/dist/core/memory/bridge-discovery.d.ts +0 -50
  167. package/dist/core/memory/bridge-discovery.js +0 -291
  168. package/dist/core/memory/categorizer.d.ts +0 -27
  169. package/dist/core/memory/categorizer.js +0 -306
  170. package/dist/core/memory/conflict-detector.d.ts +0 -7
  171. package/dist/core/memory/conflict-detector.js +0 -43
  172. package/dist/core/memory/consolidation.d.ts +0 -42
  173. package/dist/core/memory/consolidation.js +0 -277
  174. package/dist/core/memory/context-collector.d.ts +0 -10
  175. package/dist/core/memory/context-collector.js +0 -56
  176. package/dist/core/memory/contradiction-resolver.d.ts +0 -40
  177. package/dist/core/memory/contradiction-resolver.js +0 -368
  178. package/dist/core/memory/edit-workflow.d.ts +0 -19
  179. package/dist/core/memory/edit-workflow.js +0 -120
  180. package/dist/core/memory/entity-extractor.d.ts +0 -37
  181. package/dist/core/memory/entity-extractor.js +0 -350
  182. package/dist/core/memory/entity-resolver.d.ts +0 -23
  183. package/dist/core/memory/entity-resolver.js +0 -64
  184. package/dist/core/memory/explain.d.ts +0 -18
  185. package/dist/core/memory/explain.js +0 -92
  186. package/dist/core/memory/fact-deriver.d.ts +0 -31
  187. package/dist/core/memory/fact-deriver.js +0 -236
  188. package/dist/core/memory/fact-extractor.d.ts +0 -24
  189. package/dist/core/memory/fact-extractor.js +0 -89
  190. package/dist/core/memory/feedback-tracker.d.ts +0 -12
  191. package/dist/core/memory/feedback-tracker.js +0 -155
  192. package/dist/core/memory/hooks.d.ts +0 -88
  193. package/dist/core/memory/hooks.js +0 -174
  194. package/dist/core/memory/hybrid-retrieval.d.ts +0 -27
  195. package/dist/core/memory/hybrid-retrieval.js +0 -37
  196. package/dist/core/memory/hybrid-scorer.d.ts +0 -40
  197. package/dist/core/memory/hybrid-scorer.js +0 -267
  198. package/dist/core/memory/hybrid-search.d.ts +0 -23
  199. package/dist/core/memory/hybrid-search.js +0 -596
  200. package/dist/core/memory/importance.d.ts +0 -46
  201. package/dist/core/memory/importance.js +0 -241
  202. package/dist/core/memory/index.d.ts +0 -9
  203. package/dist/core/memory/index.js +0 -11
  204. package/dist/core/memory/loader.d.ts +0 -31
  205. package/dist/core/memory/loader.js +0 -141
  206. package/dist/core/memory/markdown/markdown-storage.d.ts +0 -72
  207. package/dist/core/memory/markdown/markdown-storage.js +0 -243
  208. package/dist/core/memory/memories.d.ts +0 -43
  209. package/dist/core/memory/memories.js +0 -452
  210. package/dist/core/memory/memory-lifecycle.d.ts +0 -8
  211. package/dist/core/memory/memory-lifecycle.js +0 -47
  212. package/dist/core/memory/memory-manager.d.ts +0 -15
  213. package/dist/core/memory/memory-manager.js +0 -46
  214. package/dist/core/memory/migrate.d.ts +0 -21
  215. package/dist/core/memory/migrate.js +0 -134
  216. package/dist/core/memory/normalization.d.ts +0 -7
  217. package/dist/core/memory/normalization.js +0 -26
  218. package/dist/core/memory/path-strengthener.d.ts +0 -39
  219. package/dist/core/memory/path-strengthener.js +0 -150
  220. package/dist/core/memory/progressive-disclosure.d.ts +0 -43
  221. package/dist/core/memory/progressive-disclosure.js +0 -280
  222. package/dist/core/memory/query-processor.d.ts +0 -21
  223. package/dist/core/memory/query-processor.js +0 -106
  224. package/dist/core/memory/query-rewriter.d.ts +0 -13
  225. package/dist/core/memory/query-rewriter.js +0 -118
  226. package/dist/core/memory/response-analyzer.d.ts +0 -9
  227. package/dist/core/memory/response-analyzer.js +0 -61
  228. package/dist/core/memory/retrieval-feedback.d.ts +0 -70
  229. package/dist/core/memory/retrieval-feedback.js +0 -213
  230. package/dist/core/memory/serialization.d.ts +0 -10
  231. package/dist/core/memory/serialization.js +0 -84
  232. package/dist/core/memory/stale-cleaner.d.ts +0 -26
  233. package/dist/core/memory/stale-cleaner.js +0 -97
  234. package/dist/core/memory/stats.d.ts +0 -32
  235. package/dist/core/memory/stats.js +0 -143
  236. package/dist/core/memory/telemetry.d.ts +0 -69
  237. package/dist/core/memory/telemetry.js +0 -313
  238. package/dist/core/memory/temporal-facts.d.ts +0 -41
  239. package/dist/core/memory/temporal-facts.js +0 -283
  240. package/dist/core/memory/temporal-parser.d.ts +0 -32
  241. package/dist/core/memory/temporal-parser.js +0 -385
  242. package/dist/core/memory/trigger-detector.d.ts +0 -21
  243. package/dist/core/memory/trigger-detector.js +0 -79
  244. package/dist/core/memory/write-gate.d.ts +0 -54
  245. package/dist/core/memory/write-gate.js +0 -210
  246. package/dist/core/places/index.d.ts +0 -14
  247. package/dist/core/places/index.js +0 -14
  248. package/dist/core/places/memory-places.d.ts +0 -68
  249. package/dist/core/places/memory-places.js +0 -261
  250. package/dist/core/places/places.d.ts +0 -88
  251. package/dist/core/places/places.js +0 -314
  252. package/dist/core/places/rules.d.ts +0 -74
  253. package/dist/core/places/rules.js +0 -240
  254. package/dist/core/places/walking.d.ts +0 -56
  255. package/dist/core/places/walking.js +0 -121
  256. package/dist/core/projects.d.ts +0 -17
  257. package/dist/core/projects.js +0 -116
  258. package/dist/core/redis.d.ts +0 -11
  259. package/dist/core/redis.js +0 -69
  260. package/dist/core/responses.d.ts +0 -96
  261. package/dist/core/responses.js +0 -122
  262. package/dist/core/runtime/trust-report.d.ts +0 -102
  263. package/dist/core/runtime/trust-report.js +0 -107
  264. package/dist/core/runtime/trust-state.d.ts +0 -12
  265. package/dist/core/runtime/trust-state.js +0 -309
  266. package/dist/core/scheduler/cron-scheduler.d.ts +0 -32
  267. package/dist/core/scheduler/cron-scheduler.js +0 -493
  268. package/dist/core/scheduler/heartbeat.d.ts +0 -11
  269. package/dist/core/scheduler/heartbeat.js +0 -73
  270. package/dist/core/scheduler/index.d.ts +0 -8
  271. package/dist/core/scheduler/index.js +0 -8
  272. package/dist/core/scheduler/job-runner.d.ts +0 -11
  273. package/dist/core/scheduler/job-runner.js +0 -164
  274. package/dist/core/search/conversations.d.ts +0 -25
  275. package/dist/core/search/conversations.js +0 -110
  276. package/dist/core/search/entities.d.ts +0 -12
  277. package/dist/core/search/entities.js +0 -31
  278. package/dist/core/search/folder-context.d.ts +0 -25
  279. package/dist/core/search/folder-context.js +0 -119
  280. package/dist/core/search/graph-boost.d.ts +0 -7
  281. package/dist/core/search/graph-boost.js +0 -23
  282. package/dist/core/search/index.d.ts +0 -4
  283. package/dist/core/search/index.js +0 -5
  284. package/dist/core/search/qmd-wrapper.d.ts +0 -36
  285. package/dist/core/search/qmd-wrapper.js +0 -58
  286. package/dist/core/security/encrypt.d.ts +0 -6
  287. package/dist/core/security/encrypt.js +0 -47
  288. package/dist/core/security/governance.d.ts +0 -26
  289. package/dist/core/security/governance.js +0 -79
  290. package/dist/core/security/privacy.d.ts +0 -23
  291. package/dist/core/security/privacy.js +0 -82
  292. package/dist/core/security/secret-detector.d.ts +0 -32
  293. package/dist/core/security/secret-detector.js +0 -88
  294. package/dist/core/session/auto-load.d.ts +0 -6
  295. package/dist/core/session/auto-load.js +0 -144
  296. package/dist/core/session/entity-tracker.d.ts +0 -62
  297. package/dist/core/session/entity-tracker.js +0 -287
  298. package/dist/core/session/index.d.ts +0 -7
  299. package/dist/core/session/index.js +0 -7
  300. package/dist/core/session/reference-resolver.d.ts +0 -26
  301. package/dist/core/session/reference-resolver.js +0 -121
  302. package/dist/core/session/self-iteration-job.d.ts +0 -35
  303. package/dist/core/session/self-iteration-job.js +0 -387
  304. package/dist/core/session/session-hooks.d.ts +0 -18
  305. package/dist/core/session/session-hooks.js +0 -58
  306. package/dist/core/session/types.d.ts +0 -26
  307. package/dist/core/session/types.js +0 -10
  308. package/dist/core/session/working-set.d.ts +0 -50
  309. package/dist/core/session/working-set.js +0 -212
  310. package/dist/core/snapshots/cleanup.d.ts +0 -9
  311. package/dist/core/snapshots/cleanup.js +0 -12
  312. package/dist/core/snapshots/comparison.d.ts +0 -19
  313. package/dist/core/snapshots/comparison.js +0 -43
  314. package/dist/core/snapshots/creation.d.ts +0 -13
  315. package/dist/core/snapshots/creation.js +0 -117
  316. package/dist/core/snapshots/retrieval.d.ts +0 -7
  317. package/dist/core/snapshots/retrieval.js +0 -41
  318. package/dist/core/snapshots/stats.d.ts +0 -11
  319. package/dist/core/snapshots/stats.js +0 -52
  320. package/dist/core/storage/cache.d.ts +0 -13
  321. package/dist/core/storage/cache.js +0 -202
  322. package/dist/core/storage/database.d.ts +0 -12
  323. package/dist/core/storage/database.js +0 -12
  324. package/dist/core/summarization/cleanup.d.ts +0 -9
  325. package/dist/core/summarization/cleanup.js +0 -12
  326. package/dist/core/summarization/queries.d.ts +0 -9
  327. package/dist/core/summarization/queries.js +0 -28
  328. package/dist/core/summarization/stats.d.ts +0 -14
  329. package/dist/core/summarization/stats.js +0 -52
  330. package/dist/core/summarization/strategies.d.ts +0 -24
  331. package/dist/core/summarization/strategies.js +0 -28
  332. package/dist/core/summarization.d.ts +0 -37
  333. package/dist/core/summarization.js +0 -188
  334. package/dist/core/temporal-facts.d.ts +0 -54
  335. package/dist/core/temporal-facts.js +0 -193
  336. package/dist/core/tracing/collector.d.ts +0 -111
  337. package/dist/core/tracing/collector.js +0 -350
  338. package/dist/core/tracing/visualizer.d.ts +0 -32
  339. package/dist/core/tracing/visualizer.js +0 -165
  340. package/dist/core/utils/cleanup-operations.d.ts +0 -13
  341. package/dist/core/utils/cleanup-operations.js +0 -44
  342. package/dist/core/utils/content-extraction.d.ts +0 -19
  343. package/dist/core/utils/content-extraction.js +0 -75
  344. package/dist/core/utils/filter-builder.d.ts +0 -13
  345. package/dist/core/utils/filter-builder.js +0 -44
  346. package/dist/core/utils/history-traversal.d.ts +0 -13
  347. package/dist/core/utils/history-traversal.js +0 -50
  348. package/dist/core/utils/memory-operations.d.ts +0 -17
  349. package/dist/core/utils/memory-operations.js +0 -43
  350. package/dist/core/utils/query-operations.d.ts +0 -18
  351. package/dist/core/utils/query-operations.js +0 -65
  352. package/dist/core/utils/summarization-helpers.d.ts +0 -17
  353. package/dist/core/utils/summarization-helpers.js +0 -33
  354. package/dist/core/utils/temporal-queries.d.ts +0 -13
  355. package/dist/core/utils/temporal-queries.js +0 -27
  356. package/dist/core/utils/vector-operations.d.ts +0 -71
  357. package/dist/core/utils/vector-operations.js +0 -129
  358. package/dist/core/utils/version-management.d.ts +0 -9
  359. package/dist/core/utils/version-management.js +0 -61
  360. package/dist/core/worker.d.ts +0 -82
  361. package/dist/core/worker.js +0 -272
  362. package/dist/db/adapter.d.ts +0 -7
  363. package/dist/db/adapter.js +0 -175
  364. package/dist/db/bootstrap.d.ts +0 -11
  365. package/dist/db/bootstrap.js +0 -1034
  366. package/dist/db/drizzle/schema-sqlite.d.ts +0 -5538
  367. package/dist/db/drizzle/schema-sqlite.js +0 -763
  368. package/dist/db/drizzle/schema.d.ts +0 -4734
  369. package/dist/db/drizzle/schema.js +0 -859
  370. package/dist/db/drizzle.config.d.ts +0 -3
  371. package/dist/db/drizzle.config.js +0 -12
  372. package/dist/db/index.d.ts +0 -7
  373. package/dist/db/index.js +0 -89
  374. package/dist/db/migrations/associations.d.ts +0 -6
  375. package/dist/db/migrations/associations.js +0 -29
  376. package/dist/db/migrations/beliefs.d.ts +0 -10
  377. package/dist/db/migrations/beliefs.js +0 -76
  378. package/dist/db/migrations/core-memory.d.ts +0 -6
  379. package/dist/db/migrations/core-memory.js +0 -29
  380. package/dist/db/migrations/fts.d.ts +0 -6
  381. package/dist/db/migrations/fts.js +0 -52
  382. package/dist/db/migrations/index.d.ts +0 -25
  383. package/dist/db/migrations/index.js +0 -51
  384. package/dist/db/migrations/indexes.d.ts +0 -6
  385. package/dist/db/migrations/indexes.js +0 -30
  386. package/dist/db/migrations/learnings.d.ts +0 -7
  387. package/dist/db/migrations/learnings.js +0 -26
  388. package/dist/db/migrations/maintenance.d.ts +0 -6
  389. package/dist/db/migrations/maintenance.js +0 -61
  390. package/dist/db/migrations/memories.d.ts +0 -7
  391. package/dist/db/migrations/memories.js +0 -16
  392. package/dist/db/migrations/memory-places.d.ts +0 -6
  393. package/dist/db/migrations/memory-places.js +0 -29
  394. package/dist/db/migrations/places.d.ts +0 -6
  395. package/dist/db/migrations/places.js +0 -43
  396. package/dist/db/migrations/projects.d.ts +0 -3
  397. package/dist/db/migrations/projects.js +0 -13
  398. package/dist/db/migrations/tier-conversion.d.ts +0 -7
  399. package/dist/db/migrations/tier-conversion.js +0 -20
  400. package/dist/db/neon.d.ts +0 -8
  401. package/dist/db/neon.js +0 -20
  402. package/dist/db/schema/beliefs.d.ts +0 -9
  403. package/dist/db/schema/beliefs.js +0 -46
  404. package/dist/db/schema/generator.d.ts +0 -38
  405. package/dist/db/schema/generator.js +0 -108
  406. package/dist/db/schema/index.d.ts +0 -39
  407. package/dist/db/schema/index.js +0 -51
  408. package/dist/db/schema/learnings.d.ts +0 -7
  409. package/dist/db/schema/learnings.js +0 -30
  410. package/dist/db/schema/memories.d.ts +0 -7
  411. package/dist/db/schema/memories.js +0 -81
  412. package/dist/db/schema/projects.d.ts +0 -4
  413. package/dist/db/schema/projects.js +0 -31
  414. package/dist/db/schema/tables/context-sessions.d.ts +0 -9
  415. package/dist/db/schema/tables/context-sessions.js +0 -37
  416. package/dist/db/schema/tables/conversations.d.ts +0 -9
  417. package/dist/db/schema/tables/conversations.js +0 -47
  418. package/dist/db/schema/tables/core-memory.d.ts +0 -9
  419. package/dist/db/schema/tables/core-memory.js +0 -41
  420. package/dist/db/schema/tables/entities.d.ts +0 -9
  421. package/dist/db/schema/tables/entities.js +0 -39
  422. package/dist/db/schema/tables/entity-relations.d.ts +0 -9
  423. package/dist/db/schema/tables/entity-relations.js +0 -31
  424. package/dist/db/schema/tables/learnings.d.ts +0 -9
  425. package/dist/db/schema/tables/learnings.js +0 -66
  426. package/dist/db/schema/tables/memories.d.ts +0 -9
  427. package/dist/db/schema/tables/memories.js +0 -161
  428. package/dist/db/schema/tables/memory-associations.d.ts +0 -9
  429. package/dist/db/schema/tables/memory-associations.js +0 -39
  430. package/dist/db/schema/tables/memory-hash-cache.d.ts +0 -9
  431. package/dist/db/schema/tables/memory-hash-cache.js +0 -29
  432. package/dist/db/schema/tables/memory-merge-history.d.ts +0 -9
  433. package/dist/db/schema/tables/memory-merge-history.js +0 -33
  434. package/dist/db/schema/tables/memory-merge-proposals.d.ts +0 -9
  435. package/dist/db/schema/tables/memory-merge-proposals.js +0 -39
  436. package/dist/db/schema/tables/messages.d.ts +0 -9
  437. package/dist/db/schema/tables/messages.js +0 -41
  438. package/dist/db/schema/tables/namespaces.d.ts +0 -9
  439. package/dist/db/schema/tables/namespaces.js +0 -37
  440. package/dist/db/schema/tables/projects.d.ts +0 -9
  441. package/dist/db/schema/tables/projects.js +0 -31
  442. package/dist/db/schema/tables/users.d.ts +0 -9
  443. package/dist/db/schema/tables/users.js +0 -27
  444. package/dist/db/schema.d.ts +0 -3
  445. package/dist/db/schema.js +0 -11
  446. package/dist/db/supabase.d.ts +0 -9
  447. package/dist/db/supabase.js +0 -24
  448. package/dist/packages/mcp/src/index.d.ts +0 -3
  449. package/dist/packages/mcp/src/index.js +0 -733
@@ -1,733 +0,0 @@
1
- #!/usr/bin/env node
2
- // CRITICAL: Redirect console.log to stderr to prevent JSON-RPC stream corruption
3
- // MCP stdio requires stdout to contain ONLY valid JSON-RPC messages
4
- console.log = console.error;
5
- console.info = console.error;
6
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
8
- import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
9
- import express from "express";
10
- import { z } from "zod";
11
- import { config } from "../../../config.js";
12
- import { getDb } from "../../../db/index.js";
13
- import { getSchema } from "../../../db/schema.js";
14
- import { eq } from "drizzle-orm";
15
- import { startWorker, stopWorker } from "../../../core/worker.js";
16
- import { initializeScheduler } from "../../../core/scheduler/cron-scheduler.js";
17
- import { filterByDateRange } from "../../../core/lib/utils.js";
18
- import { buildContextState, buildHealthState, buildInspectState, buildStatsState, resolveProjectScope, } from "../../../core/runtime/trust-state.js";
19
- import { rememberMemory, search as searchMemories, getMemory, getRecent } from "../../../core/memory/memories.js";
20
- import { getQMDClient } from "../../../core/embeddings/qmd-client.js";
21
- import { createAssociation, getRelatedMemories } from "../../../core/associations.js";
22
- import { createLearning } from "../../../core/ingestion/learnings.js";
23
- import { getAllProjects } from "../../../core/projects.js";
24
- const SERVER_NAME = "squish-memory";
25
- const SERVER_VERSION = "1.2.0";
26
- // Create server instance ONCE (not per-session)
27
- const { server: SQUISH_SERVER, toolCount: SQUISH_TOOL_COUNT } = createSquishServer();
28
- console.error(`[MCP] Server created with ${SQUISH_TOOL_COUNT} tools`);
29
- function parseArgs() {
30
- const args = process.argv.slice(2);
31
- let mode = "stdio";
32
- let port = config.mcpServerPort || 8767;
33
- let health = false;
34
- for (let i = 0; i < args.length; i++) {
35
- if (args[i] === "--http" || args[i] === "-h") {
36
- mode = "http";
37
- }
38
- else if (args[i] === "--stdio" || args[i] === "-s") {
39
- mode = "stdio";
40
- }
41
- else if (args[i] === "--port" || args[i] === "-p") {
42
- port = parseInt(args[i + 1], 10) || 8767;
43
- i++;
44
- }
45
- else if (args[i] === "--health" || args[i] === "--check") {
46
- health = true;
47
- }
48
- }
49
- if (process.env.SQUISH_MCP_MODE === "http") {
50
- mode = "http";
51
- }
52
- return { mode, port, health };
53
- }
54
- function safeRegisterTool(server, name, definition, handler) {
55
- try {
56
- server.registerTool(name, definition, handler);
57
- console.error(`[MCP] Registered tool: ${name}`);
58
- return true;
59
- }
60
- catch (error) {
61
- console.error(`[MCP] Failed to register tool ${name}:`, error);
62
- return false;
63
- }
64
- }
65
- function createSquishServer() {
66
- const server = new McpServer({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: { tools: {} } });
67
- let toolCount = 0;
68
- console.error(`[MCP] Starting tool registration...`);
69
- // squish_timeline - 3-layer progressive disclosure
70
- if (safeRegisterTool(server, "squish_timeline", {
71
- description: "3-layer progressive disclosure - index (~50 tokens), timeline (~200 tokens), detail (~2000 tokens)",
72
- inputSchema: {
73
- query: z.string().describe("Search query"),
74
- depth: z.enum(["index", "timeline", "detail"]).default("index").describe("Progressive disclosure depth"),
75
- limit: z.number().min(1).max(100).default(10).describe("Max results"),
76
- project: z.string().optional().describe("Project path")
77
- }
78
- }, async ({ query, depth = "index", limit = 10, project }) => {
79
- const { getTimeline } = await import('../../../core/adapters/timeline.js');
80
- const result = await getTimeline(query, depth, limit, project);
81
- const formatted = result.results.map((r, i) => {
82
- if (depth === "index") {
83
- return `${i + 1}. ${r.title}`;
84
- }
85
- else if (depth === "timeline") {
86
- return `${i + 1}. [${r.type}] ${r.content} (${r.tags?.join(', ') || 'no tags'})`;
87
- }
88
- else {
89
- return `${i + 1}. [${r.type}] ${r.content?.substring(0, 200)}...`;
90
- }
91
- }).join("\n");
92
- return { content: [{ type: "text", text: `Timeline (${depth}, ~${result.tokenEstimate} tokens):\n\n${formatted}` }] };
93
- }))
94
- toolCount++;
95
- // squish_remember - UNIFIED MEMORY WRITE
96
- // Single smart write path: auto-detects intent and routes to memory or learning
97
- if (safeRegisterTool(server, "squish_remember", {
98
- description: "Store any memory or learning. System auto-detects type and routes appropriately. This is THE memory write tool for agents - handles hot/cold tiers, confidence, and all memory types.",
99
- inputSchema: {
100
- content: z.string().describe("What to remember - can be a fact, decision, lesson, observation, or note"),
101
- project: z.string().optional().describe("Project path (auto-detected if not provided)"),
102
- tags: z.array(z.string()).optional().describe("Optional tags for organization"),
103
- tier: z.enum(["hot", "cold"]).default("hot").describe("Memory tier: hot=active/frequently accessed, cold=archived (simplified, warm removed)"),
104
- type: z.enum(["observation", "fact", "decision", "context", "preference", "note"]).optional().describe("Memory type - auto-detected if not provided"),
105
- learningType: z.enum(["success", "failure", "fix", "insight"]).optional().describe("Learning type when routing to learning storage"),
106
- confidence: z.number().min(0).max(100).optional().describe("Confidence level 0-100 (default: auto-calculated)"),
107
- source: z.string().optional().describe("Source of memory: mcp, cli, voice, chat, document (default: mcp)"),
108
- route: z.enum(["auto", "memory", "learning", "note"]).default("auto").describe("Force routing: auto=detect, memory=store as memory, learning=store as learning, note=store as note"),
109
- pin: z.boolean().default(false).describe("Pin memory to prevent pruning/consolidation"),
110
- unpin: z.boolean().default(false).describe("Unpin memory")
111
- }
112
- }, async ({ content, project, tags = [], tier = "hot", type, learningType, confidence, source, route = "auto", pin = false, unpin = false }) => {
113
- // Import detection function
114
- const { detectMemorySignals } = await import('../../../core/memory/trigger-detector.js');
115
- const signals = detectMemorySignals(content);
116
- let routing = "memory";
117
- let inferredType = type || signals.suggestedType;
118
- let routingReason = "";
119
- // Check for learning patterns if auto mode
120
- if (route === "auto") {
121
- const hasLessonPattern = /(\bfailed\s+because\b|\blesson\s+learned\b|\bnext\s+time\b|\broot\s+cause\b|\bsuccess\b.*\bbecause\b|\bi\s+learned\b|\binsight\b)/i.test(content);
122
- const hasLearningType = /(\bsuccess\b|\bfailure\b|\bfix\b|\binsight\b)/i.test(content);
123
- // Enhanced learning detection from rationale patterns
124
- const hasHackPattern = /(\bHACK\b|\bworkaround\b|\btemporary\s+fix\b)/i.test(content);
125
- const hasFixmePattern = /(\bFIXME\b|\bXXX\b|\bbug\b.*\bfix\b)/i.test(content);
126
- if (hasLessonPattern || hasLearningType || hasHackPattern || hasFixmePattern) {
127
- routing = "learning";
128
- if (hasHackPattern || hasFixmePattern) {
129
- routingReason = "Detected code pattern (HACK/FIXME)";
130
- }
131
- else {
132
- routingReason = "Detected learning pattern in content";
133
- }
134
- }
135
- else if (signals.suggestedType === 'task') {
136
- routing = "memory";
137
- routingReason = "Detected TODO pattern";
138
- }
139
- else if (signals.suggestedType === 'observation' && /\b(note|note\s+that|log|remember)\b/i.test(content)) {
140
- routing = "note";
141
- routingReason = "Detected note pattern";
142
- }
143
- else {
144
- routing = "memory";
145
- routingReason = `Detected as ${inferredType}`;
146
- }
147
- }
148
- else if (route === "learning") {
149
- routing = "learning";
150
- routingReason = "Override: forced to learning";
151
- }
152
- else if (route === "note") {
153
- routing = "note";
154
- routingReason = "Override: forced to note";
155
- }
156
- else {
157
- routing = "memory";
158
- routingReason = "Override: forced to memory";
159
- }
160
- let result;
161
- if (routing === "learning") {
162
- // Determine learning type from content or override
163
- let finalLearningType = learningType || "insight";
164
- if (!learningType) {
165
- if (/(\bsuccess\b|\bworked\b|\bfinished\b)/i.test(content))
166
- finalLearningType = "success";
167
- else if (/(\bfailed\b|\berror\b|\bbroke\b)/i.test(content))
168
- finalLearningType = "failure";
169
- else if (/(\bfix\b|\b workaround\b|\bsolved\b)/i.test(content))
170
- finalLearningType = "fix";
171
- }
172
- const learning = await createLearning({
173
- type: finalLearningType,
174
- content,
175
- project,
176
- autoLink: true
177
- });
178
- result = { id: learning.id, type: "learning", learningType: finalLearningType, content };
179
- }
180
- else {
181
- // Store as memory with all options
182
- const memory = await rememberMemory({
183
- content,
184
- type: inferredType,
185
- tags,
186
- project,
187
- tier,
188
- source: source || 'mcp'
189
- });
190
- // Handle pin/unpin after creation
191
- if (pin) {
192
- const { pinMemory } = await import('../../../core/security/governance.js');
193
- await pinMemory(memory.id);
194
- }
195
- else if (unpin) {
196
- const { unpinMemory } = await import('../../../core/security/governance.js');
197
- await unpinMemory(memory.id);
198
- }
199
- result = { id: memory.id, type: "memory", memoryType: inferredType, tier, content, pined: pin };
200
- // Auto-update knowledge graph (fire-and-forget)
201
- const { addMemoryToGraph } = await import('../../../core/graph/graph-builder.js');
202
- const graphResult = await addMemoryToGraph(memory.id).catch((e) => {
203
- console.warn('[Graph] Auto-update failed:', e.message);
204
- return null;
205
- });
206
- if (graphResult) {
207
- result.graph = { entities: graphResult.entitiesCreated, relations: graphResult.relationsCreated };
208
- }
209
- }
210
- return {
211
- content: [{
212
- type: "text",
213
- text: `Remembered: ${result.id}\nRouting: ${routing}\nType: ${routing === "learning" ? result.learningType : result.memoryType}\nTier: ${routing === "memory" ? tier : 'N/A'}\nPriority: ${signals.priority}\nConfidence: ${signals.confidence}\nPined: ${result.pinned}\nReason: ${routingReason}\n\n${content.substring(0, 100)}${content.length > 100 ? '...' : ''}`
214
- }]
215
- };
216
- }))
217
- toolCount++;
218
- // squish_recall - Retrieve a memory by ID or query
219
- if (safeRegisterTool(server, "squish_recall", {
220
- description: "Recall memories by query, or retrieve a specific memory by ID",
221
- inputSchema: {
222
- query: z.string().describe("Query text or memory ID to recall"),
223
- limit: z.number().min(1).max(100).default(5).describe("Maximum results for query recall"),
224
- project: z.string().optional().describe("Project path filter"),
225
- type: z.enum(["observation", "fact", "decision", "context", "preference", "note", "task"]).optional().describe("Filter by memory type"),
226
- place: z.string().optional().describe("Filter by place (inbox, ref, wip, sandbox, board, sparks, archive)")
227
- }
228
- }, async ({ query, limit = 5, project, type, place }) => {
229
- const isUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(query);
230
- if (isUuid) {
231
- const memory = await getMemory(query);
232
- if (!memory) {
233
- return { content: [{ type: "text", text: `Memory not found: ${query}` }], isError: true };
234
- }
235
- return { content: [{ type: "text", text: JSON.stringify({ ok: true, count: 1, results: [memory] }, null, 2) }] };
236
- }
237
- const results = await searchMemories({
238
- query,
239
- limit,
240
- project,
241
- type,
242
- placeType: place
243
- });
244
- return { content: [{ type: "text", text: JSON.stringify({ ok: true, count: results.length, results }, null, 2) }] };
245
- }))
246
- toolCount++;
247
- // squish_forget - Delete a memory by ID, or bulk delete with filters
248
- if (safeRegisterTool(server, "squish_forget", {
249
- description: "Delete a memory by ID, or bulk delete with filters (older-than, search, type)",
250
- inputSchema: {
251
- memoryId: z.string().optional().describe("Memory ID to delete (single)"),
252
- olderThan: z.string().optional().describe("Bulk delete memories older than (e.g., '30 days', '6 months')"),
253
- search: z.string().optional().describe("Search query to match specific memories"),
254
- type: z.string().optional().describe("Filter by memory type"),
255
- confirm: z.boolean().optional().describe("Actually delete (default is dry-run)"),
256
- limit: z.number().optional().describe("Max memories to delete"),
257
- project: z.string().optional().describe("Project path (defaults to current)")
258
- }
259
- }, async ({ memoryId, olderThan, search, type, confirm = false, limit = 100, project }) => {
260
- const db = await getDb();
261
- const schema = await getSchema();
262
- const sqliteDb = db;
263
- const proj = project || process.cwd();
264
- // Single memory deletion
265
- if (memoryId) {
266
- await sqliteDb.delete(schema.memories).where(eq(schema.memories.id, memoryId));
267
- return { content: [{ type: "text", text: `Memory deleted: ${memoryId}` }] };
268
- }
269
- // Bulk deletion
270
- if (!olderThan && !search) {
271
- return { content: [{ type: "text", text: "Error: Provide memoryId or use --older-than / --search for bulk delete" }], isError: true };
272
- }
273
- const results = await searchMemories({ query: search || '', type: type, limit, project: proj });
274
- let filtered = results;
275
- if (olderThan) {
276
- filtered = filterByDateRange(results, '', olderThan);
277
- }
278
- const deleted = [];
279
- if (confirm) {
280
- for (const mem of filtered) {
281
- await sqliteDb.delete(schema.memories).where(eq(schema.memories.id, mem.id));
282
- deleted.push(mem.id);
283
- }
284
- }
285
- return { content: [{ type: "text", text: JSON.stringify({ ok: true, matched: filtered.length, deleted: deleted.length, dryRun: !confirm }, null, 2) }] };
286
- }))
287
- toolCount++;
288
- // squish_link - Unified graph operations (find related, add links, list)
289
- if (safeRegisterTool(server, "squish_link", {
290
- description: "Manage memory associations: find related memories, add links, or list associations",
291
- inputSchema: {
292
- action: z.enum(["find", "add", "list"]).describe("Action: find, add, or list"),
293
- memoryId: z.string().optional().describe("Memory ID (for find action)"),
294
- fromMemoryId: z.string().optional().describe("Source memory ID (for add action)"),
295
- toMemoryId: z.string().optional().describe("Target memory ID (for add action)"),
296
- type: z.string().optional().describe("Association type (for add action): relates_to, supports, contradicts, supersedes, duplicate"),
297
- weight: z.number().min(0).max(1).default(0.5).describe("Association strength (0-1)"),
298
- depth: z.number().min(1).max(5).default(2).describe("Graph traversal depth (for find action)"),
299
- minWeight: z.number().min(0).max(1).default(0.3).describe("Minimum weight (for find action)")
300
- }
301
- }, async ({ action, memoryId, fromMemoryId, toMemoryId, type = "relates_to", weight = 0.5, depth = 2, minWeight = 0.3 }) => {
302
- if (action === "find") {
303
- if (!memoryId) {
304
- return { content: [{ type: "text", text: "Error: memoryId required for find action" }], isError: true };
305
- }
306
- const related = await getRelatedMemories(memoryId, depth * 5);
307
- const filtered = related.filter((r) => r.weight >= minWeight);
308
- const formatted = filtered.map((r, i) => `${i + 1}. [${r.type || "memory"}] ${r.content?.substring(0, 100)}... (weight: ${r.weight?.toFixed(2)})`).join("\n");
309
- return { content: [{ type: "text", text: `Found ${filtered.length} related memories:\n\n${formatted}` }] };
310
- }
311
- if (action === "add") {
312
- if (!fromMemoryId || !toMemoryId) {
313
- return { content: [{ type: "text", text: "Error: fromMemoryId and toMemoryId required for add action" }], isError: true };
314
- }
315
- await createAssociation(fromMemoryId, toMemoryId, type, weight);
316
- // Auto-update knowledge graph (fire-and-forget)
317
- try {
318
- const { addMemoryToGraph } = await import('../../../core/graph/graph-builder.js');
319
- await Promise.all([
320
- addMemoryToGraph(fromMemoryId).catch(() => null),
321
- addMemoryToGraph(toMemoryId).catch(() => null)
322
- ]);
323
- }
324
- catch (e) {
325
- // Ignore graph errors
326
- }
327
- return { content: [{ type: "text", text: `Association created: ${fromMemoryId} -> ${toMemoryId} (${type})` }] };
328
- }
329
- if (action === "list") {
330
- const db = await getDb();
331
- const schema = await getSchema();
332
- const sqliteDb = db;
333
- const associations = await sqliteDb.select().from(schema.memoryAssociations).limit(100);
334
- return { content: [{ type: "text", text: JSON.stringify({ ok: true, count: associations.length, associations }, null, 2) }] };
335
- }
336
- return { content: [{ type: "text", text: "Error: invalid action. Use find, add, or list" }], isError: true };
337
- }))
338
- toolCount++;
339
- // squish_context - Get project context or list registered projects
340
- if (safeRegisterTool(server, "squish_context", {
341
- description: "Get project context or list registered projects",
342
- inputSchema: {
343
- project: z.string().optional().describe("Project path"),
344
- limit: z.number().min(1).max(50).default(10).describe("Maximum memories to return"),
345
- listProjects: z.boolean().optional().describe("List registered projects instead of loading context")
346
- }
347
- }, async ({ project, limit = 10, listProjects = false }) => {
348
- if (listProjects) {
349
- const projects = await getAllProjects();
350
- const scope = await resolveProjectScope(project);
351
- return {
352
- content: [{
353
- type: "text",
354
- text: JSON.stringify({
355
- ok: true,
356
- count: projects.length,
357
- currentProject: scope.currentProject,
358
- otherProjects: scope.otherProjects,
359
- projects: projects.map((entry) => ({
360
- id: entry.id,
361
- name: entry.name,
362
- path: entry.path,
363
- resolution: entry.path === '.' ? 'legacy-placeholder' : (entry.metadata?.source === 'mcp' ? 'auto-created' : 'inferred'),
364
- })),
365
- nextStep: scope.nextStep,
366
- }, null, 2),
367
- }],
368
- };
369
- }
370
- const context = await buildContextState(project, limit);
371
- return { content: [{ type: "text", text: JSON.stringify({ ok: true, ...context }, null, 2) }] };
372
- }))
373
- toolCount++;
374
- // squish_health - Check Squish system health status
375
- if (safeRegisterTool(server, "squish_health", {
376
- description: "Check Squish system health status",
377
- inputSchema: {
378
- project: z.string().optional().describe("Project path")
379
- }
380
- }, async ({ project }) => {
381
- const qmdClient = await getQMDClient();
382
- const qmdAvailable = await qmdClient.isAvailable();
383
- const health = await buildHealthState(project);
384
- return { content: [{ type: "text", text: JSON.stringify({
385
- ok: health.severity !== "broken",
386
- version: SERVER_VERSION,
387
- qmd: qmdAvailable ? "available" : "unavailable",
388
- timestamp: new Date().toISOString(),
389
- ...health,
390
- }, null, 2) }] };
391
- }))
392
- toolCount++;
393
- // squish_stats - Get memory statistics for a project
394
- if (safeRegisterTool(server, "squish_stats", {
395
- description: "Get memory statistics for a project",
396
- inputSchema: {
397
- project: z.string().optional().describe("Project path (defaults to current)")
398
- }
399
- }, async ({ project }) => {
400
- const stats = await buildStatsState(project || process.cwd());
401
- return { content: [{ type: "text", text: JSON.stringify({ ok: true, ...stats }, null, 2) }] };
402
- }))
403
- toolCount++;
404
- // squish_inspect - Explain why a memory was retained
405
- if (safeRegisterTool(server, "squish_inspect", {
406
- description: "Explain why a memory was retained, where it was routed, and whether raw fallback exists",
407
- inputSchema: {
408
- memoryId: z.string().uuid().describe("Memory ID to inspect")
409
- }
410
- }, async ({ memoryId }) => {
411
- const inspection = await buildInspectState(memoryId);
412
- if (!inspection) {
413
- return { content: [{ type: "text", text: `Memory not found: ${memoryId}` }], isError: true };
414
- }
415
- return { content: [{ type: "text", text: JSON.stringify({ ok: true, inspection }, null, 2) }] };
416
- }))
417
- toolCount++;
418
- // squish_pin - Pin or unpin a memory to prevent consolidation
419
- if (safeRegisterTool(server, "squish_pin", {
420
- description: "Pin or unpin a memory to prevent consolidation",
421
- inputSchema: {
422
- memoryId: z.string().uuid().describe("Memory ID"),
423
- pinned: z.boolean().default(true).describe("Pin (true) or unpin (false)")
424
- }
425
- }, async ({ memoryId, pinned }) => {
426
- const db = await getDb();
427
- const schema = await getSchema();
428
- const sqliteDb = db;
429
- await sqliteDb.update(schema.memories)
430
- .set({ isPinned: pinned })
431
- .where(eq(schema.memories.id, memoryId));
432
- return { content: [{ type: "text", text: `Memory ${memoryId} ${pinned ? 'pinned' : 'unpinned'}` }] };
433
- }))
434
- toolCount++;
435
- // squish_recent - Get recent memories by period
436
- if (safeRegisterTool(server, "squish_recent", {
437
- description: "Get recent memories by period (today, yesterday, thisweek, 7days, 30days, or custom)",
438
- inputSchema: {
439
- period: z.string().optional().describe("Period: today, yesterday, thisweek, 7days, 14days, 30days, 90days"),
440
- since: z.string().optional().describe("Start date (alternative to period, e.g., '3 days', '2026-01-01')"),
441
- until: z.string().optional().describe("End date (alternative to period, e.g., 'now', '2026-01-15')"),
442
- limit: z.number().optional().describe("Max results to return"),
443
- project: z.string().optional().describe("Project path (defaults to current)")
444
- }
445
- }, async ({ period = 'today', since, until, limit = 10, project }) => {
446
- const proj = project || process.cwd();
447
- let sinceDate, untilDate;
448
- if (since && until) {
449
- sinceDate = since;
450
- untilDate = until;
451
- }
452
- else if (since) {
453
- sinceDate = since;
454
- untilDate = 'now';
455
- }
456
- else {
457
- const periodMap = {
458
- today: ['today', 'now'],
459
- yesterday: ['yesterday', 'today'],
460
- thisweek: ['thisweek', 'now'],
461
- '7days': ['7 days', 'now'],
462
- '14days': ['14 days', 'now'],
463
- '30days': ['30 days', 'now'],
464
- '90days': ['90 days', 'now'],
465
- };
466
- const mapped = periodMap[period];
467
- if (mapped) {
468
- [sinceDate, untilDate] = mapped;
469
- }
470
- else {
471
- sinceDate = period;
472
- untilDate = 'now';
473
- }
474
- }
475
- const results = await getRecent(proj, 100);
476
- const filtered = filterByDateRange(results, sinceDate, untilDate);
477
- const limited = filtered.slice(0, limit);
478
- return { content: [{ type: "text", text: JSON.stringify({ ok: true, period, since: sinceDate, until: untilDate, count: limited.length, results: limited }, null, 2) }] };
479
- }))
480
- toolCount++;
481
- // squish_stale - Show stale memories
482
- if (safeRegisterTool(server, "squish_stale", {
483
- description: "Show stale memories (old, low-confidence, or rarely accessed)",
484
- inputSchema: {
485
- days: z.number().optional().describe("Show memories older than N days"),
486
- limit: z.number().optional().describe("Max results to return"),
487
- project: z.string().optional().describe("Project path (defaults to current)")
488
- }
489
- }, async ({ days = 30, limit = 20, project }) => {
490
- const proj = project || process.cwd();
491
- const cutoffDate = new Date(Date.now() - days * 86400000);
492
- const results = await getRecent(proj, 500);
493
- const stale = results.filter((m) => {
494
- const created = m.createdAt ? new Date(m.createdAt) : null;
495
- const isOld = created && created < cutoffDate;
496
- const isLowConfidence = m.confidenceLevel === 'outdated' || m.confidenceLevel === 'speculative';
497
- const hasLowImportance = (m.importance || 50) < 40;
498
- return isOld || isLowConfidence || hasLowImportance;
499
- });
500
- const limited = stale.slice(0, limit);
501
- const summary = {
502
- totalStale: stale.length,
503
- old: stale.filter((m) => m.createdAt && new Date(m.createdAt) < cutoffDate).length,
504
- lowConfidence: stale.filter((m) => m.confidenceLevel === 'outdated' || m.confidenceLevel === 'speculative').length,
505
- lowImportance: stale.filter((m) => (m.importance || 50) < 40).length,
506
- };
507
- return { content: [{ type: "text", text: JSON.stringify({ ok: true, summary, memories: limited }, null, 2) }] };
508
- }))
509
- toolCount++;
510
- console.error(`[MCP] Tool registration complete. Registered ${toolCount} tools.`);
511
- return { server, toolCount };
512
- }
513
- async function runStdio(server, toolCount) {
514
- console.error(`[MCP] Starting in STDIO mode...`);
515
- const transport = new StdioServerTransport();
516
- transport.onclose = () => {
517
- console.error(`[MCP] STDIO transport closed`);
518
- };
519
- await server.connect(transport);
520
- console.error(`[MCP] Connected via stdio. ${toolCount} tools available.`);
521
- // Keep process alive - wait for stdin to close or process signals
522
- await new Promise((resolve) => {
523
- process.stdin.on('close', () => {
524
- console.error(`[MCP] STDIO stdin closed, shutting down`);
525
- resolve();
526
- });
527
- process.on('SIGINT', () => {
528
- console.error(`[MCP] Received SIGINT, shutting down`);
529
- resolve();
530
- });
531
- process.on('SIGTERM', () => {
532
- console.error(`[MCP] Received SIGTERM, shutting down`);
533
- resolve();
534
- });
535
- });
536
- }
537
- async function runHttp(server, port) {
538
- console.error(`[MCP] Starting in Streamable HTTP mode on port ${port}...`);
539
- const app = express();
540
- app.use(express.json({ strict: false }));
541
- // Store transports by session ID
542
- const transports = new Map();
543
- // Helper to check if request is an initialization request
544
- function isInitializeRequest(body) {
545
- return body?.method === 'initialize';
546
- }
547
- // Health check endpoint
548
- app.get("/health", (req, res) => {
549
- res.json({ status: "ok", server: SERVER_NAME, version: SERVER_VERSION });
550
- });
551
- // Streamable HTTP POST endpoint
552
- app.post("/mcp", async (req, res) => {
553
- const sessionId = req.headers["mcp-session-id"];
554
- const body = req.body;
555
- let transport;
556
- let serverToUse;
557
- // Check if we have an existing transport for this session
558
- if (sessionId && transports.has(sessionId)) {
559
- transport = transports.get(sessionId);
560
- serverToUse = server;
561
- }
562
- // If no existing transport, create new one (only for initialize requests)
563
- if (!transport) {
564
- if (!isInitializeRequest(body)) {
565
- res.status(400).json({
566
- jsonrpc: '2.0',
567
- error: { code: -32000, message: 'Bad Request: No valid session ID and not an initialize request' },
568
- id: body?.id || null
569
- });
570
- return;
571
- }
572
- // Create NEW server instance for this session (required - can't reuse)
573
- const { server: newServer } = createSquishServer();
574
- serverToUse = newServer;
575
- // Create new transport with JSON response mode
576
- transport = new StreamableHTTPServerTransport({
577
- sessionIdGenerator: () => crypto.randomUUID(),
578
- enableJsonResponse: true,
579
- onsessioninitialized: (newSessionId) => {
580
- console.error(`[MCP] Session initialized: ${newSessionId}`);
581
- transports.set(newSessionId, transport);
582
- }
583
- });
584
- // Connect the NEW session-specific server to this transport
585
- try {
586
- await serverToUse.connect(transport);
587
- }
588
- catch (connectError) {
589
- // Ignore "Already connected" errors - can happen if server was used before
590
- if (connectError.message?.includes('Already connected')) {
591
- console.error(`[MCP] Server already connected, creating fresh server...`);
592
- const { server: freshServer } = createSquishServer();
593
- serverToUse = freshServer;
594
- await serverToUse.connect(transport);
595
- }
596
- else {
597
- console.error(`[MCP] Connect error:`, connectError.message);
598
- }
599
- }
600
- // Set up onclose handler
601
- transport.onclose = () => {
602
- const sid = transport?.sessionId;
603
- if (sid) {
604
- console.error(`[MCP] Session closed: ${sid}`);
605
- transports.delete(sid);
606
- }
607
- };
608
- transport.onerror = (error) => {
609
- console.error(`[MCP] Transport error:`, error);
610
- };
611
- }
612
- try {
613
- // Handle the request with the parsed body
614
- await transport.handleRequest(req, res, body);
615
- }
616
- catch (error) {
617
- console.error(`[MCP] Error handling request:`, error);
618
- if (!res.headersSent) {
619
- res.status(500).json({ error: "Internal server error" });
620
- }
621
- }
622
- });
623
- // Streamable HTTP GET endpoint (for SSE)
624
- app.get("/mcp", async (req, res) => {
625
- const sessionId = req.headers["mcp-session-id"];
626
- if (!sessionId || !transports.has(sessionId)) {
627
- res.status(400).send('Invalid or missing session ID');
628
- return;
629
- }
630
- const transport = transports.get(sessionId);
631
- try {
632
- await transport.handleRequest(req, res);
633
- }
634
- catch (error) {
635
- console.error(`[MCP] Error handling GET request:`, error);
636
- if (!res.headersSent) {
637
- res.status(500).json({ error: "Internal server error" });
638
- }
639
- }
640
- });
641
- // DELETE endpoint to close session
642
- app.delete("/mcp", async (req, res) => {
643
- const sessionId = req.headers["mcp-session-id"];
644
- if (!sessionId || !transports.has(sessionId)) {
645
- res.status(400).send('Invalid or missing session ID');
646
- return;
647
- }
648
- const transport = transports.get(sessionId);
649
- try {
650
- await transport.handleRequest(req, res);
651
- }
652
- catch (error) {
653
- console.error(`[MCP] Error handling DELETE request:`, error);
654
- if (!res.headersSent) {
655
- res.status(500).json({ error: "Internal server error" });
656
- }
657
- }
658
- });
659
- await new Promise((resolve) => app.listen(port, () => {
660
- console.error(`[MCP] HTTP server listening on port ${port}`);
661
- console.error(`[MCP] Streamable HTTP endpoint: http://localhost:${port}/mcp`);
662
- console.error(`[MCP] Health: http://localhost:${port}/health`);
663
- resolve();
664
- }));
665
- }
666
- async function runHealthCheck() {
667
- console.error(`[MCP] Running health check...`);
668
- try {
669
- const { server, toolCount } = createSquishServer();
670
- console.error(`[MCP] Health check passed. Server initialized with ${toolCount} tools.`);
671
- process.exit(0);
672
- }
673
- catch (error) {
674
- console.error(`[MCP] Health check failed:`, error);
675
- process.exit(1);
676
- }
677
- }
678
- async function main() {
679
- try {
680
- console.error(`[${SERVER_NAME}] v${SERVER_VERSION} initializing...`);
681
- console.error(`[${SERVER_NAME}] Mode: ${config.isManagedMode ? "managed" : "local"}`);
682
- console.error(`[${SERVER_NAME}] Embeddings: ${config.embeddingsProvider}`);
683
- const { mode, port, health } = parseArgs();
684
- if (health) {
685
- await runHealthCheck();
686
- return;
687
- }
688
- // Start background worker for lifecycle maintenance, decay, etc.
689
- try {
690
- await startWorker();
691
- console.error(`[${SERVER_NAME}] Background worker started`);
692
- }
693
- catch (error) {
694
- console.error(`[${SERVER_NAME}] Warning: Failed to start background worker:`, error);
695
- }
696
- // Initialize cron scheduler for scheduled jobs
697
- try {
698
- await initializeScheduler();
699
- console.error(`[${SERVER_NAME}] Cron scheduler initialized`);
700
- }
701
- catch (error) {
702
- console.error(`[${SERVER_NAME}] Warning: Failed to initialize scheduler:`, error);
703
- }
704
- const shutdown = async () => {
705
- console.error(`[${SERVER_NAME}] Shutting down...`);
706
- try {
707
- await stopWorker();
708
- console.error(`[${SERVER_NAME}] Background worker stopped`);
709
- }
710
- catch (error) {
711
- console.error(`[${SERVER_NAME}] Error stopping worker:`, error);
712
- }
713
- process.exit(0);
714
- };
715
- process.on("SIGINT", shutdown);
716
- process.on("SIGTERM", shutdown);
717
- if (mode === "stdio") {
718
- await runStdio(SQUISH_SERVER, SQUISH_TOOL_COUNT);
719
- }
720
- else {
721
- await runHttp(SQUISH_SERVER, port);
722
- }
723
- }
724
- catch (error) {
725
- console.error(`[${SERVER_NAME}] Fatal error:`, error);
726
- process.exit(1);
727
- }
728
- }
729
- main().catch((error) => {
730
- console.error(`[${SERVER_NAME}] Fatal error:`, error);
731
- process.exit(1);
732
- });
733
- //# sourceMappingURL=index.js.map