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,357 @@
1
+ /**
2
+ * Squish Doctor Command
3
+ *
4
+ * Diagnose and fix common Squish issues automatically.
5
+ *
6
+ * Usage:
7
+ * squish doctor # Run diagnostics
8
+ * squish doctor --fix # Auto-fix issues
9
+ * squish doctor --migrate # Force run database migrations
10
+ */
11
+
12
+ import { Command } from 'commander';
13
+ import fs from 'node:fs';
14
+ import path from 'node:path';
15
+ import { getDataDir, config } from '../../../../config.js';
16
+ import { createDb, getDb } from '../../../../db/index.js';
17
+ import { buildHealthState } from '../../../../core/runtime/trust-state.js';
18
+ import { formatHealthReport } from '../../../../core/runtime/trust-report.js';
19
+
20
+ interface DiagnosticResult {
21
+ name: string;
22
+ status: 'ok' | 'degraded' | 'broken';
23
+ message: string;
24
+ fix?: string;
25
+ }
26
+
27
+ export function registerDoctorCommand(program: Command) {
28
+ program
29
+ .command('doctor')
30
+ .description('Diagnose and fix Squish issues')
31
+ .option('-f, --fix', 'Auto-fix issues when possible')
32
+ .option('-m, --migrate', 'Force run database migrations')
33
+ .option('-v, --verbose', 'Show detailed output')
34
+ .option('-p, --project <project>', 'Project path')
35
+ .option('--json', 'Emit machine-readable output', false)
36
+ .action(async (options) => {
37
+ const previousQuiet = process.env.SQUISH_QUIET;
38
+ if (options.json) {
39
+ process.env.SQUISH_QUIET = '1';
40
+ }
41
+ try {
42
+ await runDoctorDiagnostics(options);
43
+ } finally {
44
+ if (options.json) {
45
+ if (previousQuiet === undefined) {
46
+ delete process.env.SQUISH_QUIET;
47
+ } else {
48
+ process.env.SQUISH_QUIET = previousQuiet;
49
+ }
50
+ }
51
+ }
52
+ });
53
+ }
54
+
55
+ async function runDoctorDiagnostics(options: { fix?: boolean; migrate?: boolean; verbose?: boolean; project?: string; json?: boolean }) {
56
+ const results: DiagnosticResult[] = [];
57
+ const dataDir = getDataDir();
58
+
59
+ // Check 1: Data directory exists
60
+ const diagnostic1 = await checkDataDirectory(dataDir);
61
+ results.push(diagnostic1);
62
+
63
+ // Check 2: Database file
64
+ const diagnostic2 = await checkDatabaseFile(dataDir);
65
+ results.push(diagnostic2);
66
+
67
+ // Check 3: Schema version (if database exists)
68
+ if (diagnostic2.status !== 'fail') {
69
+ const diagnostic3 = await checkSchemaVersion(options.migrate || false);
70
+ results.push(diagnostic3);
71
+ }
72
+
73
+ // Check 4: Config valid
74
+ const diagnostic4 = checkConfig();
75
+ results.push(diagnostic4);
76
+
77
+ // Check 5: bin/ files exist
78
+ const diagnostic5 = checkBinFiles();
79
+ results.push(diagnostic5);
80
+
81
+ let health;
82
+ try {
83
+ health = await buildHealthState(options.project);
84
+ } catch (error: any) {
85
+ health = {
86
+ severity: 'degraded' as const,
87
+ currentProject: options.project || process.cwd(),
88
+ checks: [
89
+ {
90
+ name: 'runtime health',
91
+ status: 'degraded' as const,
92
+ detail: `Skipped until schema is readable: ${error.message}`,
93
+ },
94
+ ],
95
+ nextStep: 'Run `squish doctor --migrate` to repair the local schema, then rerun diagnostics.',
96
+ };
97
+ }
98
+
99
+ const combinedSeverity = [health.severity, ...results.map((result) => result.status)].includes('broken')
100
+ ? 'broken'
101
+ : ([health.severity, ...results.map((result) => result.status)].includes('degraded') ? 'degraded' : 'ok');
102
+ const nextStep =
103
+ health.nextStep ??
104
+ results.find((result) => result.fix)?.fix ??
105
+ (options.fix ? 'Apply the suggested fixes, then rerun `squish doctor`.' : null);
106
+
107
+ const combined = {
108
+ severity: combinedSeverity as 'ok' | 'degraded' | 'broken',
109
+ currentProject: health.currentProject,
110
+ checks: health.checks,
111
+ diagnostics: results.map((result) => ({
112
+ name: result.name,
113
+ status: result.status,
114
+ detail: result.message,
115
+ fix: result.fix,
116
+ })),
117
+ nextStep,
118
+ };
119
+
120
+ if (options.json) {
121
+ console.log(JSON.stringify({ ok: combined.severity !== 'broken', ...combined }, null, 2));
122
+ process.exit(combined.severity === 'broken' ? 1 : 0);
123
+ }
124
+
125
+ console.log('\n=== Squish Doctor v1.2.0 ===\n');
126
+ console.log(formatHealthReport({
127
+ severity: combined.severity,
128
+ currentProject: combined.currentProject,
129
+ checks: combined.checks,
130
+ diagnostics: combined.diagnostics,
131
+ nextStep: combined.nextStep,
132
+ }));
133
+
134
+ if (options.verbose) {
135
+ console.log('\nDiagnostic detail');
136
+ for (const result of results) {
137
+ console.log(`- ${result.name}: ${result.message}`);
138
+ if (result.fix) {
139
+ console.log(` fix: ${result.fix}`);
140
+ }
141
+ }
142
+ }
143
+
144
+ process.exit(combined.severity === 'broken' ? 1 : 0);
145
+ }
146
+
147
+ async function checkDataDirectory(dataDir: string): Promise<DiagnosticResult> {
148
+ try {
149
+ if (!fs.existsSync(dataDir)) {
150
+ // Try to create it
151
+ fs.mkdirSync(dataDir, { recursive: true });
152
+ return { name: 'data directory', status: 'ok', message: 'Created data directory' };
153
+ }
154
+ return { name: 'data directory', status: 'ok', message: dataDir };
155
+ } catch (error) {
156
+ return { name: 'data directory', status: 'broken', message: 'Cannot access data directory', fix: 'Check file permissions' };
157
+ }
158
+ }
159
+
160
+ async function checkDatabaseFile(dataDir: string): Promise<DiagnosticResult> {
161
+ const dbPath = path.join(dataDir, 'squish.db');
162
+
163
+ try {
164
+ if (!fs.existsSync(dbPath)) {
165
+ return { name: 'database file', status: 'degraded', message: 'Database not found (will be created on first use)', fix: 'Run any squish command to create the local database.' };
166
+ }
167
+ return { name: 'database file', status: 'ok', message: dbPath };
168
+ } catch (error) {
169
+ return { name: 'database file', status: 'broken', message: 'Cannot access database file', fix: 'Check file permissions' };
170
+ }
171
+ }
172
+
173
+ async function checkSchemaVersion(forceMigrate: boolean): Promise<DiagnosticResult> {
174
+ let dbClient: any;
175
+ try {
176
+ dbClient = await getDb();
177
+ } catch (error) {
178
+ if (!config.isTeamMode) {
179
+ return checkSqliteSchemaDirect(forceMigrate);
180
+ }
181
+ return { name: 'schema version', status: 'degraded', message: 'Cannot connect to database (no driver available)' };
182
+ }
183
+ if (!dbClient) {
184
+ return { name: 'schema version', status: 'degraded', message: 'Cannot connect to database (no driver available)' };
185
+ }
186
+
187
+ // Check for required tables
188
+ const requiredTables = [
189
+ 'memories',
190
+ 'learnings',
191
+ 'projects',
192
+ 'users',
193
+ 'conversations',
194
+ 'messages',
195
+ 'entities',
196
+ 'core_memory',
197
+ 'context_sessions',
198
+ 'memory_associations',
199
+ 'namespaces',
200
+ 'maintenance_jobs',
201
+ 'places',
202
+ 'memory_places',
203
+ 'place_rules',
204
+ 'session_summaries',
205
+ 'beliefs',
206
+ 'belief_memory_sources',
207
+ 'belief_edges',
208
+ ];
209
+
210
+ // Get SQLite vs Postgres client handling
211
+ const dbAny = dbClient as any;
212
+ const isSqlite = typeof dbAny.exec === 'function';
213
+
214
+ let existingTables: string[] = [];
215
+ if (isSqlite) {
216
+ const tables = dbAny.prepare("SELECT name FROM sqlite_master WHERE type='table'").all() as Array<{name: string}>;
217
+ existingTables = tables.map(t => t.name);
218
+ } else {
219
+ // Postgres
220
+ try {
221
+ const result = await dbAny.query("SELECT tablename FROM pg_tables WHERE schemaname = 'public'");
222
+ existingTables = result.rows?.map((r: any) => r.tablename) ?? [];
223
+ } catch {
224
+ existingTables = [];
225
+ }
226
+ }
227
+
228
+ const missingTables = requiredTables.filter(t => !existingTables.includes(t));
229
+
230
+ // If forceMigrate or missing tables, run migrations
231
+ if (forceMigrate || missingTables.length > 0) {
232
+ try {
233
+ // Import bootstrap functions
234
+ const { ensureSqliteSchema } = await import('../../../../db/bootstrap.js');
235
+ const { getSchemaVersion } = await import('../../../../db/bootstrap.js');
236
+
237
+ if (isSqlite) {
238
+ await ensureSqliteSchema(dbAny);
239
+ const version = await getSchemaVersion(dbAny);
240
+ return {
241
+ name: 'schema version',
242
+ status: 'ok',
243
+ message: `Migrations applied. Schema: ${version}`
244
+ };
245
+ }
246
+
247
+ return { name: 'schema version', status: 'ok', message: 'Database schema OK' };
248
+ } catch (error) {
249
+ const msg = error instanceof Error ? error.message : String(error);
250
+ return {
251
+ name: 'schema version',
252
+ status: 'degraded',
253
+ message: `Migration note: ${msg}`,
254
+ fix: 'Run "squish doctor --migrate" to retry'
255
+ };
256
+ }
257
+ }
258
+
259
+ return { name: 'schema version', status: 'ok', message: `Tables OK (${existingTables.length})` };
260
+ }
261
+
262
+ async function checkSqliteSchemaDirect(forceMigrate: boolean): Promise<DiagnosticResult> {
263
+ const dbPath = path.join(getDataDir(), 'squish.db');
264
+
265
+ try {
266
+ const sqliteModule = await import('bun:sqlite');
267
+ const sqlite = new sqliteModule.default(dbPath);
268
+ try {
269
+ const tables = sqlite.prepare("SELECT name FROM sqlite_master WHERE type='table'").all() as Array<{ name: string }>;
270
+ const existingTables = tables.map((table) => table.name);
271
+ const requiredTables = [
272
+ 'memories',
273
+ 'learnings',
274
+ 'projects',
275
+ 'users',
276
+ 'conversations',
277
+ 'messages',
278
+ 'entities',
279
+ 'core_memory',
280
+ 'context_sessions',
281
+ 'memory_associations',
282
+ 'namespaces',
283
+ 'maintenance_jobs',
284
+ 'places',
285
+ 'memory_places',
286
+ 'place_rules',
287
+ 'session_summaries',
288
+ 'beliefs',
289
+ 'belief_memory_sources',
290
+ 'belief_edges',
291
+ ];
292
+ const missingTables = requiredTables.filter((table) => !existingTables.includes(table));
293
+
294
+ if (forceMigrate || missingTables.length > 0) {
295
+ const { ensureSqliteSchema, getSchemaVersion } = await import('../../../../db/bootstrap.js');
296
+ await ensureSqliteSchema(sqlite as any);
297
+ const version = await getSchemaVersion(sqlite as any);
298
+ return {
299
+ name: 'schema version',
300
+ status: 'ok',
301
+ message: `Migrations applied. Schema: ${version}`,
302
+ };
303
+ }
304
+
305
+ return { name: 'schema version', status: 'ok', message: `Tables OK (${existingTables.length})` };
306
+ } finally {
307
+ sqlite.close();
308
+ }
309
+ } catch (error) {
310
+ const msg = error instanceof Error ? error.message : String(error);
311
+ return {
312
+ name: 'schema version',
313
+ status: 'degraded',
314
+ message: `Migration note: ${msg}`,
315
+ fix: 'Run "squish doctor --migrate" to retry',
316
+ };
317
+ }
318
+ }
319
+
320
+ function checkConfig(): DiagnosticResult {
321
+ try {
322
+ // Basic config validation
323
+ const dataDir = getDataDir();
324
+ const embeddingsProvider = config.embeddingsProvider;
325
+
326
+ return {
327
+ name: 'configuration',
328
+ status: 'ok',
329
+ message: `Provider: ${embeddingsProvider}, Data: ${dataDir}`
330
+ };
331
+ } catch (error) {
332
+ return { name: 'configuration', status: 'broken', message: 'Config validation failed', fix: 'Check config.ts' };
333
+ }
334
+ }
335
+
336
+ function checkBinFiles(): DiagnosticResult {
337
+ const binDir = path.join(process.cwd(), 'bin');
338
+
339
+ try {
340
+ const files = ['squish.mjs', 'squish-mcp.mjs', 'install-interactive.mjs'];
341
+ const missing: string[] = [];
342
+
343
+ for (const file of files) {
344
+ if (!fs.existsSync(path.join(binDir, file))) {
345
+ missing.push(file);
346
+ }
347
+ }
348
+
349
+ if (missing.length > 0) {
350
+ return { name: 'cli binaries', status: 'broken', message: `Missing: ${missing.join(', ')}` };
351
+ }
352
+
353
+ return { name: 'cli binaries', status: 'ok', message: 'All binaries present' };
354
+ } catch (error) {
355
+ return { name: 'cli binaries', status: 'broken', message: 'Cannot check binaries', fix: 'Reinstall squish-memory' };
356
+ }
357
+ }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Forget Command - Delete memory
3
+ *
4
+ * Usage: squish forget <memoryId> [--confirm] [--older-than "30 days"]
5
+ */
6
+
7
+ import { Command } from 'commander';
8
+ import { eq } from 'drizzle-orm';
9
+ import { getDbClient } from '../../../../core/lib/db-client.js';
10
+ import { search } from '../../../../core/memory/memories.js';
11
+ import { filterByDateRange } from '../../../../core/lib/utils.js';
12
+
13
+ export function registerForgetCommand(program: Command) {
14
+ program
15
+ .command('forget <memoryId>')
16
+ .description('Delete memory (single or bulk with --older-than --search)')
17
+ .option('--older-than <period>', 'Bulk delete memories older than')
18
+ .option('--search <query>', 'Search query to match specific memories')
19
+ .option('--type <type>', 'Filter by memory type')
20
+ .option('--confirm', 'Actually delete (default is dry-run)', false)
21
+ .option('-l, --limit <number>', 'Max memories to delete', '100')
22
+ .option('-p, --project <project>', 'Project path', process.cwd())
23
+ .action(async (memoryId: string, options: any) => {
24
+ try {
25
+ const { db, schema } = await getDbClient();
26
+
27
+ if (memoryId && memoryId !== 'all') {
28
+ await db.delete(schema.memories).where(eq(schema.memories.id, memoryId));
29
+ console.log(JSON.stringify({ ok: true, deleted: 1, memoryId }));
30
+ return;
31
+ }
32
+
33
+ if (!options.olderThan && !options.search) {
34
+ console.error(JSON.stringify({
35
+ ok: false,
36
+ error: 'Provide memoryId or use --older-than / --search for bulk delete'
37
+ }));
38
+ process.exit(1);
39
+ }
40
+
41
+ const results = await search({
42
+ query: options.search || '',
43
+ project: options.project,
44
+ limit: parseInt(options.limit) || 100,
45
+ type: options.type
46
+ });
47
+
48
+ let filtered = results;
49
+ if (options.olderThan) {
50
+ filtered = filterByDateRange(results, '', options.olderThan);
51
+ }
52
+
53
+ const deleted = [];
54
+ if (options.confirm) {
55
+ for (const mem of filtered) {
56
+ await db.delete(schema.memories).where(eq(schema.memories.id, mem.id));
57
+ deleted.push(mem.id);
58
+ }
59
+ }
60
+
61
+ console.log(JSON.stringify({
62
+ ok: true,
63
+ matched: filtered.length,
64
+ deleted: deleted.length,
65
+ dryRun: !options.confirm
66
+ }, null, 2));
67
+ } catch (error: any) {
68
+ console.error(JSON.stringify({ ok: false, error: error.message }));
69
+ process.exit(1);
70
+ }
71
+ });
72
+ }
@@ -0,0 +1,36 @@
1
+ import { Command } from 'commander';
2
+ import { buildHealthState } from '../../../../core/runtime/trust-state.js';
3
+ import { formatHealthReport } from '../../../../core/runtime/trust-report.js';
4
+
5
+ export function registerHealthCommand(program: Command) {
6
+ program
7
+ .command('health')
8
+ .description('Show runtime health for the current project')
9
+ .option('-p, --project <project>', 'Project path')
10
+ .option('--json', 'Emit machine-readable output', false)
11
+ .action(async (options: any) => {
12
+ const previousQuiet = process.env.SQUISH_QUIET;
13
+ if (options.json) {
14
+ process.env.SQUISH_QUIET = '1';
15
+ }
16
+ try {
17
+ const health = await buildHealthState(options.project);
18
+ if (options.json) {
19
+ console.log(JSON.stringify({ ok: true, ...health }, null, 2));
20
+ return;
21
+ }
22
+ console.log(formatHealthReport(health));
23
+ } catch (error: any) {
24
+ console.error(JSON.stringify({ ok: false, error: error.message }));
25
+ process.exit(1);
26
+ } finally {
27
+ if (options.json) {
28
+ if (previousQuiet === undefined) {
29
+ delete process.env.SQUISH_QUIET;
30
+ } else {
31
+ process.env.SQUISH_QUIET = previousQuiet;
32
+ }
33
+ }
34
+ }
35
+ });
36
+ }
@@ -0,0 +1,41 @@
1
+ import { Command } from 'commander';
2
+ import { buildInspectState } from '../../../../core/runtime/trust-state.js';
3
+ import { formatInspectReport } from '../../../../core/runtime/trust-report.js';
4
+
5
+ export function registerInspectCommand(program: Command) {
6
+ program
7
+ .command('inspect <id>')
8
+ .description('Inspect how and why a memory was stored')
9
+ .option('-P, --pretty', 'Human-friendly output', false)
10
+ .option('--json', 'Emit machine-readable output', false)
11
+ .action(async (id: string, options: any) => {
12
+ const previousQuiet = process.env.SQUISH_QUIET;
13
+ if (options.json) {
14
+ process.env.SQUISH_QUIET = '1';
15
+ }
16
+ try {
17
+ const inspection = await buildInspectState(id);
18
+ if (!inspection) {
19
+ console.error(JSON.stringify({ ok: false, error: 'Memory not found' }));
20
+ process.exit(1);
21
+ }
22
+
23
+ if (options.json) {
24
+ console.log(JSON.stringify({ ok: true, inspection }, null, 2));
25
+ } else {
26
+ console.log(formatInspectReport(inspection));
27
+ }
28
+ } catch (error: any) {
29
+ console.error(JSON.stringify({ ok: false, error: error.message }));
30
+ process.exit(1);
31
+ } finally {
32
+ if (options.json) {
33
+ if (previousQuiet === undefined) {
34
+ delete process.env.SQUISH_QUIET;
35
+ } else {
36
+ process.env.SQUISH_QUIET = previousQuiet;
37
+ }
38
+ }
39
+ }
40
+ });
41
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Link Command - Manage memory associations
3
+ *
4
+ * Usage: squish link find <memoryId> [--depth 2]
5
+ * squish link add <fromId> <toId> [--type relates_to]
6
+ */
7
+
8
+ import { Command } from 'commander';
9
+ import { createAssociation, getRelatedMemories } from '../../../../core/associations.js';
10
+
11
+ export function registerLinkCommand(program: Command) {
12
+ program
13
+ .command('link <action> [args...]')
14
+ .description('Manage links (find/add/list)')
15
+ .option('-d, --depth <number>', 'Graph traversal depth', '2')
16
+ .option('-t, --type <type>', 'Association type', 'relates_to')
17
+ .option('-w, --weight <number>', 'Association weight', '0.5')
18
+ .action(async (action: string, args: string[], options: any) => {
19
+ try {
20
+ if (action === 'find' && args[0]) {
21
+ const related = await getRelatedMemories(args[0], options.depth * 5);
22
+ console.log(JSON.stringify({ ok: true, count: related.length, related }, null, 2));
23
+ } else if (action === 'add' && args[0] && args[1]) {
24
+ await createAssociation(args[0], args[1], options.type as any, options.weight);
25
+
26
+ // Auto-update knowledge graph (fire-and-forget)
27
+ try {
28
+ const { addMemoryToGraph } = await import('../../../../core/graph/graph-builder.js');
29
+ const [result1, result2] = await Promise.all([
30
+ addMemoryToGraph(args[0]).catch(() => null),
31
+ addMemoryToGraph(args[1]).catch(() => null)
32
+ ]);
33
+ if (result1 || result2) {
34
+ console.error(`[Graph] Updated graph for linked memories`);
35
+ }
36
+ } catch (e) {
37
+ // Ignore graph errors
38
+ }
39
+
40
+ console.log(JSON.stringify({ ok: true, action: 'created', from: args[0], to: args[1], type: options.type }));
41
+ } else {
42
+ console.log(JSON.stringify({ ok: false, error: 'Usage: squish link find <id> OR squish link add <from> <to>' }));
43
+ process.exit(1);
44
+ }
45
+ } catch (error: any) {
46
+ console.error(JSON.stringify({ ok: false, error: error.message }));
47
+ process.exit(1);
48
+ }
49
+ });
50
+ }
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Migrate Command - Migrate memories between .squish directories
3
+ *
4
+ * Usage: squish migrate <source-path> [--target <path>] [--delete-source] [--dry-run]
5
+ */
6
+
7
+ import { Command } from 'commander';
8
+ import { migrateMemories, type MigrateResult } from '../../../../core/memory/migrate.js';
9
+ import { existsSync } from 'fs';
10
+ import { join } from 'path';
11
+
12
+ export function registerMigrateCommand(program: Command) {
13
+ program
14
+ .command('migrate <source>')
15
+ .description('Migrate memories from one .squish directory to another (unify multiple .squish folders)')
16
+ .option('-t, --target <path>', 'Target .squish directory (default: current directory)', process.cwd())
17
+ .option('-d, --delete-source', 'Delete source directory after successful migration (requires --yes)')
18
+ .option('-y, --yes', 'Skip confirmation prompts')
19
+ .option('-n, --dry-run', 'Preview migration without making changes', false)
20
+ .action(async (source: string, options: any) => {
21
+ const target = options.target || process.cwd();
22
+ const dryRun = options.dryRun || false;
23
+ const deleteSource = options.deleteSource || false;
24
+ const confirmed = options.yes || false;
25
+
26
+ // Validate paths
27
+ if (!existsSync(source)) {
28
+ console.error(`Error: Source directory does not exist: ${source}`);
29
+ process.exit(1);
30
+ }
31
+
32
+ const sourceDbPath = join(source, 'squish.db');
33
+ const targetDbPath = join(target, 'squish.db');
34
+
35
+ if (!existsSync(sourceDbPath)) {
36
+ console.error(`Error: Source is not a .squish directory (no squish.db found): ${source}`);
37
+ process.exit(1);
38
+ }
39
+
40
+ if (!existsSync(targetDbPath)) {
41
+ console.error(`Error: Target is not a .squish directory (no squish.db found): ${target}`);
42
+ process.exit(1);
43
+ }
44
+
45
+ // Show plan
46
+ console.log('\n=== Migration Plan ===');
47
+ console.log(`Source: ${source}`);
48
+ console.log(`Target: ${target}`);
49
+ console.log(`Dry-run: ${dryRun ? 'YES (no changes)' : 'NO'}`);
50
+ console.log(`Delete source: ${deleteSource ? 'YES (after success)' : 'NO'}`);
51
+
52
+ if (!confirmed && !dryRun) {
53
+ console.log('\nThis will copy ALL memories from source to target.');
54
+ console.log('The source directory will NOT be deleted unless you also pass --delete-source');
55
+ console.log('Use --yes to confirm or --dry-run to preview.\n');
56
+ process.exit(1);
57
+ }
58
+
59
+ try {
60
+ console.log('\nMigrating...\n');
61
+
62
+ const result: MigrateResult = await migrateMemories(source, target, {
63
+ dryRun,
64
+ deleteSource,
65
+ });
66
+
67
+ console.log('=== Migration Result ===');
68
+ console.log(`Memories copied: ${result.memoriesCopied}`);
69
+ console.log(`Learnings copied: ${result.observationsCopied}`);
70
+ console.log(`Associations copied: ${result.associationsCopied}`);
71
+ console.log(`Projects mapped: ${result.projectsMapped}`);
72
+
73
+ if (deleteSource && !dryRun && result.sourceDeleted) {
74
+ console.log(`Source deleted: YES`);
75
+ } else if (deleteSource && !dryRun && !result.sourceDeleted) {
76
+ console.log(`Source deleted: NO (manual deletion required)`);
77
+ } else if (deleteSource && dryRun) {
78
+ console.log(`Source would be deleted after confirmation`);
79
+ }
80
+
81
+ console.log(`\n${result.message}`);
82
+
83
+ if (result.memoriesCopied > 0 && !dryRun) {
84
+ console.log('\nTip: After verifying the migration worked, you can manually delete the source directory:');
85
+ console.log(` rm -rf ${source}`);
86
+ }
87
+
88
+ } catch (error) {
89
+ console.error(`Migration failed:`, error instanceof Error ? error.message : error);
90
+ process.exit(1);
91
+ }
92
+ });
93
+ }