squish-memory 1.1.5 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. package/.env.example +32 -16
  2. package/CHANGELOG.md +147 -0
  3. package/README.md +120 -78
  4. package/{scripts → bin}/dependency-manager.mjs +217 -217
  5. package/{scripts → bin}/detect-clients.mjs +78 -78
  6. package/bin/install-interactive.mjs +321 -0
  7. package/bin/squish-mcp.mjs +46 -0
  8. package/bin/squish.mjs +33 -0
  9. package/config/mcp-migration-map.json +1 -6
  10. package/config/mcp-mode-semantics.json +19 -23
  11. package/config/mcp-remote-auth.json +3 -26
  12. package/config/mcp-universal.schema.json +5 -35
  13. package/config/settings.json +107 -52
  14. package/config.js +5 -0
  15. package/config.ts +218 -0
  16. package/core/adapters/config/claude-code.ts +133 -0
  17. package/core/adapters/config/cursor.ts +90 -0
  18. package/core/adapters/config/opencode.ts +89 -0
  19. package/core/adapters/config/windsurf.ts +90 -0
  20. package/core/adapters/index.ts +102 -0
  21. package/core/adapters/timeline.ts +116 -0
  22. package/core/adapters/types.ts +166 -0
  23. package/core/agent-preferences.ts +140 -0
  24. package/core/algorithms/analytics/token-estimator.ts +216 -0
  25. package/core/algorithms/detection/hash-filters.ts +260 -0
  26. package/core/algorithms/detection/semantic-ranker.ts +194 -0
  27. package/core/algorithms/detection/two-stage-detector.ts +421 -0
  28. package/core/algorithms/handlers/approve-merge.ts +215 -0
  29. package/core/algorithms/handlers/detect-duplicates.ts +192 -0
  30. package/core/algorithms/handlers/get-stats.ts +132 -0
  31. package/core/algorithms/handlers/list-proposals.ts +130 -0
  32. package/core/algorithms/handlers/preview-merge.ts +139 -0
  33. package/core/algorithms/handlers/reject-merge.ts +93 -0
  34. package/core/algorithms/handlers/reverse-merge.ts +155 -0
  35. package/core/algorithms/index.ts +39 -0
  36. package/core/algorithms/operations/cache-maintenance.ts +182 -0
  37. package/core/algorithms/safety/safety-checks.ts +256 -0
  38. package/core/algorithms/strategies/merge-strategies.ts +381 -0
  39. package/core/algorithms/types.ts +140 -0
  40. package/core/algorithms/utils/response-builder.ts +61 -0
  41. package/core/associations.ts +363 -0
  42. package/core/beliefs/decay.ts +289 -0
  43. package/core/beliefs/extractor.ts +131 -0
  44. package/core/beliefs/store.ts +557 -0
  45. package/core/beliefs/types.ts +38 -0
  46. package/core/commands/mcp-server.ts +5 -0
  47. package/core/compression.ts +177 -0
  48. package/core/config.js +2 -0
  49. package/core/consolidation.ts +330 -0
  50. package/core/context/agent-context.ts +388 -0
  51. package/core/context/context-paging.ts +449 -0
  52. package/core/context/context-window.ts +234 -0
  53. package/core/context/context.ts +35 -0
  54. package/core/embeddings/embeddings.ts +616 -0
  55. package/core/embeddings/google-multimodal.ts +200 -0
  56. package/{dist/core/local-embeddings.js → core/embeddings/local-embeddings.ts} +12 -11
  57. package/core/embeddings/qmd-client.ts +495 -0
  58. package/core/embeddings/transformers-local.ts +261 -0
  59. package/core/embeddings.js +4 -0
  60. package/core/error-handling.ts +206 -0
  61. package/core/external +219 -0
  62. package/core/graph/entity-deduplicator.ts +232 -0
  63. package/core/graph/graph-builder.ts +257 -0
  64. package/core/graph/graph-traversal.ts +490 -0
  65. package/core/graph/index.ts +24 -0
  66. package/core/graph/llm-entity-extractor.ts +402 -0
  67. package/core/graph/multi-hop-retrieval.ts +317 -0
  68. package/core/graph/relationship-extractor.ts +465 -0
  69. package/core/hooks/agent-hooks.ts +653 -0
  70. package/core/hooks/auto-tagger.ts +149 -0
  71. package/core/hooks/capture-filter.ts +169 -0
  72. package/core/hot-cache.ts +388 -0
  73. package/core/index.ts +10 -0
  74. package/core/ingestion/agent-memory.ts +167 -0
  75. package/core/ingestion/core-memory.ts +326 -0
  76. package/core/ingestion/learnings.ts +260 -0
  77. package/core/ingestion/signal-engine.ts +266 -0
  78. package/core/integrations/obsidian-vault.ts +197 -0
  79. package/core/layers/generator.ts +115 -0
  80. package/core/lib/db-client.ts +168 -0
  81. package/core/lib/parse-embedding.ts +59 -0
  82. package/core/lib/schemas.ts +102 -0
  83. package/core/lib/types.ts +49 -0
  84. package/core/lib/utils.ts +151 -0
  85. package/core/lib/validation.ts +180 -0
  86. package/core/lifecycle.ts +353 -0
  87. package/core/logger.ts +59 -0
  88. package/core/memory/bridge-discovery.ts +395 -0
  89. package/core/memory/categorizer.ts +390 -0
  90. package/core/memory/conflict-detector.ts +62 -0
  91. package/core/memory/consolidation.ts +372 -0
  92. package/core/memory/context-collector.ts +75 -0
  93. package/core/memory/contradiction-resolver.ts +494 -0
  94. package/core/memory/edit-workflow.ts +174 -0
  95. package/core/memory/entity-extractor.ts +426 -0
  96. package/core/memory/entity-resolver.ts +89 -0
  97. package/core/memory/explain.ts +112 -0
  98. package/core/memory/fact-deriver.ts +300 -0
  99. package/core/memory/fact-extractor.ts +120 -0
  100. package/core/memory/feedback-tracker.ts +200 -0
  101. package/core/memory/hooks.ts +230 -0
  102. package/core/memory/hybrid-retrieval.ts +65 -0
  103. package/core/memory/hybrid-scorer.ts +325 -0
  104. package/core/memory/hybrid-search.ts +748 -0
  105. package/core/memory/importance.ts +319 -0
  106. package/core/memory/index.ts +11 -0
  107. package/core/memory/loader.ts +178 -0
  108. package/core/memory/markdown/markdown-storage.ts +318 -0
  109. package/core/memory/memories.ts +565 -0
  110. package/core/memory/memory-lifecycle.ts +51 -0
  111. package/core/memory/memory-manager.ts +53 -0
  112. package/core/memory/migrate.ts +173 -0
  113. package/core/memory/normalization.ts +30 -0
  114. package/core/memory/path-strengthener.ts +211 -0
  115. package/core/memory/progressive-disclosure.ts +392 -0
  116. package/core/memory/query-processor.ts +130 -0
  117. package/core/memory/query-rewriter.ts +153 -0
  118. package/core/memory/response-analyzer.ts +81 -0
  119. package/core/memory/retrieval-feedback.ts +276 -0
  120. package/core/memory/serialization.ts +83 -0
  121. package/core/memory/stale-cleaner.ts +147 -0
  122. package/core/memory/stats.ts +181 -0
  123. package/core/memory/telemetry.ts +392 -0
  124. package/core/memory/temporal-facts.ts +356 -0
  125. package/core/memory/temporal-parser.ts +477 -0
  126. package/core/memory/trigger-detector.ts +104 -0
  127. package/core/memory/write-gate.ts +288 -0
  128. package/core/places/index.ts +14 -0
  129. package/core/places/memory-places.ts +339 -0
  130. package/core/places/places.ts +406 -0
  131. package/core/places/rules.ts +308 -0
  132. package/core/places/walking.ts +192 -0
  133. package/core/projects +89 -0
  134. package/core/projects.ts +131 -0
  135. package/core/redis.ts +82 -0
  136. package/core/responses.ts +187 -0
  137. package/core/runtime/trust-report.ts +195 -0
  138. package/core/runtime/trust-state.ts +360 -0
  139. package/core/scheduler/cron-scheduler.ts +581 -0
  140. package/core/scheduler/heartbeat.ts +91 -0
  141. package/core/scheduler/index.ts +8 -0
  142. package/core/scheduler/job-runner.ts +197 -0
  143. package/core/search/conversations.ts +166 -0
  144. package/core/search/entities.ts +46 -0
  145. package/core/search/folder-context.ts +154 -0
  146. package/core/search/graph-boost.ts +22 -0
  147. package/core/search/index.ts +4 -0
  148. package/core/search/qmd-wrapper.ts +84 -0
  149. package/core/security/encrypt.ts +51 -0
  150. package/core/security/governance.ts +102 -0
  151. package/core/security/privacy.ts +108 -0
  152. package/core/security/secret-detector.ts +122 -0
  153. package/core/session/auto-load.ts +160 -0
  154. package/core/session/entity-tracker.ts +363 -0
  155. package/core/session/index.ts +7 -0
  156. package/core/session/reference-resolver.ts +158 -0
  157. package/core/session/self-iteration-job.ts +478 -0
  158. package/core/session/session-hooks.ts +69 -0
  159. package/core/session/types.ts +36 -0
  160. package/core/session/working-set.ts +275 -0
  161. package/core/snapshots/cleanup.ts +13 -0
  162. package/core/snapshots/comparison.ts +59 -0
  163. package/core/snapshots/creation.ts +139 -0
  164. package/core/snapshots/retrieval.ts +44 -0
  165. package/core/snapshots/stats.ts +63 -0
  166. package/core/storage/cache.ts +241 -0
  167. package/core/storage/database.ts +23 -0
  168. package/core/summarization/cleanup.ts +13 -0
  169. package/core/summarization/queries.ts +32 -0
  170. package/core/summarization/stats.ts +64 -0
  171. package/core/summarization/strategies.ts +52 -0
  172. package/core/summarization.ts +248 -0
  173. package/core/temporal-facts.ts +244 -0
  174. package/core/tracing/collector.ts +470 -0
  175. package/core/tracing/visualizer.ts +195 -0
  176. package/core/utils/cleanup-operations.ts +50 -0
  177. package/core/utils/content-extraction.ts +95 -0
  178. package/core/utils/filter-builder.ts +56 -0
  179. package/core/utils/history-traversal.ts +63 -0
  180. package/core/utils/memory-operations.ts +56 -0
  181. package/core/utils/query-operations.ts +83 -0
  182. package/core/utils/summarization-helpers.ts +45 -0
  183. package/core/utils/temporal-queries.ts +39 -0
  184. package/core/utils/vector-operations.ts +135 -0
  185. package/core/utils/version-management.ts +74 -0
  186. package/core/worker.ts +324 -0
  187. package/db/adapter.ts +215 -0
  188. package/db/bootstrap.ts +1055 -0
  189. package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
  190. package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
  191. package/db/drizzle/migrations/meta/_journal.json +13 -0
  192. package/db/drizzle/schema-sqlite.ts +1032 -0
  193. package/db/drizzle/schema.ts +1128 -0
  194. package/db/drizzle.config.ts +12 -0
  195. package/db/index.ts +83 -0
  196. package/db/init.sql +5 -0
  197. package/db/migrations/associations.ts +35 -0
  198. package/db/migrations/beliefs.ts +89 -0
  199. package/db/migrations/core-memory.ts +35 -0
  200. package/db/migrations/fts.ts +59 -0
  201. package/db/migrations/index.ts +54 -0
  202. package/db/migrations/indexes.ts +36 -0
  203. package/db/migrations/learnings.ts +34 -0
  204. package/db/migrations/maintenance.ts +68 -0
  205. package/db/migrations/memories.ts +22 -0
  206. package/db/migrations/memory-places.ts +35 -0
  207. package/db/migrations/places.ts +49 -0
  208. package/db/migrations/projects.ts +21 -0
  209. package/db/migrations/tier-conversion.ts +24 -0
  210. package/db/neon.ts +22 -0
  211. package/db/schema/beliefs.ts +50 -0
  212. package/db/schema/generator.ts +159 -0
  213. package/db/schema/index.ts +58 -0
  214. package/db/schema/learnings.ts +32 -0
  215. package/db/schema/memories.ts +83 -0
  216. package/db/schema/projects.ts +33 -0
  217. package/db/schema.ts +13 -0
  218. package/db/supabase.ts +27 -0
  219. package/dist/config.d.ts +40 -17
  220. package/dist/config.js +150 -198
  221. package/dist/core/adapters/types.d.ts +13 -33
  222. package/dist/core/adapters/types.js +1 -1
  223. package/dist/core/agent-preferences.d.ts +16 -0
  224. package/dist/core/agent-preferences.js +124 -0
  225. package/dist/core/algorithms/safety/safety-checks.d.ts +1 -5
  226. package/dist/core/algorithms/types.d.ts +0 -8
  227. package/dist/core/associations.d.ts +3 -1
  228. package/dist/core/associations.js +37 -1
  229. package/dist/core/beliefs/decay.d.ts +27 -0
  230. package/dist/core/beliefs/decay.js +217 -0
  231. package/dist/core/beliefs/extractor.d.ts +9 -0
  232. package/dist/core/beliefs/extractor.js +113 -0
  233. package/dist/core/beliefs/store.d.ts +46 -0
  234. package/dist/core/beliefs/store.js +466 -0
  235. package/dist/core/beliefs/types.d.ts +28 -0
  236. package/dist/core/beliefs/types.js +2 -0
  237. package/dist/core/commands/mcp-server.d.ts +0 -1
  238. package/dist/core/commands/mcp-server.js +4 -737
  239. package/dist/core/commands/remember.d.ts +24 -0
  240. package/dist/core/commands/remember.js +144 -0
  241. package/dist/core/{toon.d.ts → compression.d.ts} +6 -4
  242. package/dist/core/{toon.js → compression.js} +8 -8
  243. package/dist/core/context/agent-context.js +1 -1
  244. package/dist/core/embeddings/embeddings.d.ts +29 -0
  245. package/dist/core/embeddings/embeddings.js +546 -0
  246. package/dist/core/embeddings/google-multimodal.js +6 -2
  247. package/dist/core/{local-embeddings.d.ts → embeddings/local-embeddings.d.ts} +1 -1
  248. package/dist/core/embeddings/local-embeddings.js +11 -0
  249. package/dist/core/embeddings/qmd-client.js +1 -1
  250. package/dist/core/embeddings/transformers-local.d.ts +64 -0
  251. package/dist/core/embeddings/transformers-local.js +213 -0
  252. package/dist/core/embeddings.d.ts +1 -28
  253. package/dist/core/embeddings.js +2 -453
  254. package/dist/core/graph/entity-deduplicator.d.ts +24 -0
  255. package/dist/core/graph/entity-deduplicator.js +183 -0
  256. package/dist/core/graph/graph-builder.d.ts +46 -0
  257. package/dist/core/graph/graph-builder.js +174 -0
  258. package/dist/core/graph/graph-traversal.d.ts +80 -0
  259. package/dist/core/graph/graph-traversal.js +315 -0
  260. package/dist/core/graph/index.d.ts +19 -0
  261. package/dist/core/graph/index.js +13 -0
  262. package/dist/core/graph/llm-entity-extractor.d.ts +49 -0
  263. package/dist/core/graph/llm-entity-extractor.js +313 -0
  264. package/dist/core/graph/multi-hop-retrieval.d.ts +48 -0
  265. package/dist/core/graph/multi-hop-retrieval.js +215 -0
  266. package/dist/core/graph/relationship-extractor.d.ts +48 -0
  267. package/dist/core/graph/relationship-extractor.js +351 -0
  268. package/dist/core/hooks/agent-hooks.d.ts +10 -1
  269. package/dist/core/hooks/agent-hooks.js +301 -24
  270. package/dist/core/hot-cache.d.ts +86 -0
  271. package/dist/core/hot-cache.js +285 -0
  272. package/dist/core/index.d.ts +9 -9
  273. package/dist/core/index.js +9 -12
  274. package/dist/core/ingestion/core-memory.d.ts +2 -2
  275. package/dist/core/ingestion/core-memory.js +3 -3
  276. package/dist/core/ingestion/learnings.js +3 -0
  277. package/dist/core/ingestion/signal-engine.d.ts +41 -0
  278. package/dist/core/ingestion/signal-engine.js +201 -0
  279. package/dist/core/{obsidian-vault.d.ts → integrations/obsidian-vault.d.ts} +2 -1
  280. package/dist/core/{obsidian-vault.js → integrations/obsidian-vault.js} +69 -7
  281. package/dist/core/lib/parse-embedding.d.ts +9 -0
  282. package/dist/core/lib/parse-embedding.js +58 -0
  283. package/dist/core/lib/schemas.d.ts +57 -54
  284. package/dist/core/lib/types.d.ts +45 -0
  285. package/dist/core/lib/types.js +6 -0
  286. package/dist/core/lib/utils.d.ts +4 -0
  287. package/dist/core/lib/utils.js +55 -0
  288. package/dist/core/lifecycle.d.ts +0 -1
  289. package/dist/core/lifecycle.js +13 -23
  290. package/dist/core/logger.d.ts +1 -0
  291. package/dist/core/logger.js +14 -8
  292. package/dist/core/mcp/tools.d.ts +0 -2
  293. package/dist/core/mcp/tools.js +0 -87
  294. package/dist/core/mcp/types.d.ts +25 -253
  295. package/dist/core/mcp/types.js +2 -2
  296. package/dist/core/memory/categorizer.js +1 -0
  297. package/dist/core/memory/consolidation.js +2 -28
  298. package/dist/core/memory/entity-extractor.d.ts +4 -0
  299. package/dist/core/memory/entity-extractor.js +30 -16
  300. package/dist/core/memory/explain.d.ts +18 -0
  301. package/dist/core/memory/explain.js +92 -0
  302. package/dist/core/memory/fact-deriver.d.ts +31 -0
  303. package/dist/core/memory/fact-deriver.js +236 -0
  304. package/dist/core/memory/hybrid-retrieval.d.ts +14 -16
  305. package/dist/core/memory/hybrid-retrieval.js +25 -127
  306. package/dist/core/memory/hybrid-scorer.js +6 -23
  307. package/dist/core/memory/hybrid-search.d.ts +10 -7
  308. package/dist/core/memory/hybrid-search.js +458 -221
  309. package/dist/core/memory/importance.d.ts +0 -17
  310. package/dist/core/memory/importance.js +1 -58
  311. package/dist/core/memory/index.d.ts +1 -0
  312. package/dist/core/memory/index.js +1 -0
  313. package/dist/core/memory/memories.d.ts +13 -17
  314. package/dist/core/memory/memories.js +78 -75
  315. package/dist/core/memory/memory-lifecycle.d.ts +2 -2
  316. package/dist/core/memory/memory-lifecycle.js +10 -18
  317. package/dist/core/memory/normalization.d.ts +1 -16
  318. package/dist/core/memory/path-strengthener.d.ts +39 -0
  319. package/dist/core/memory/path-strengthener.js +150 -0
  320. package/dist/core/memory/query-processor.js +37 -3
  321. package/dist/core/memory/retrieval-feedback.d.ts +70 -0
  322. package/dist/core/memory/retrieval-feedback.js +213 -0
  323. package/dist/core/memory/stale-cleaner.d.ts +26 -0
  324. package/dist/core/memory/stale-cleaner.js +97 -0
  325. package/dist/core/memory/stats.d.ts +10 -0
  326. package/dist/core/memory/stats.js +8 -3
  327. package/dist/core/memory/trigger-detector.d.ts +8 -1
  328. package/dist/core/memory/trigger-detector.js +42 -5
  329. package/dist/core/places/index.d.ts +1 -1
  330. package/dist/core/places/index.js +1 -1
  331. package/dist/core/places/places.d.ts +13 -13
  332. package/dist/core/places/places.js +27 -27
  333. package/dist/core/places/rules.js +23 -23
  334. package/dist/core/places/walking.d.ts +3 -3
  335. package/dist/core/places/walking.js +7 -7
  336. package/dist/core/projects.js +8 -0
  337. package/dist/core/runtime/trust-report.d.ts +102 -0
  338. package/dist/core/runtime/trust-report.js +107 -0
  339. package/dist/core/runtime/trust-state.d.ts +12 -0
  340. package/dist/core/runtime/trust-state.js +309 -0
  341. package/dist/core/scheduler/cron-scheduler.d.ts +1 -1
  342. package/dist/core/scheduler/cron-scheduler.js +164 -3
  343. package/dist/core/scheduler/job-runner.js +1 -1
  344. package/dist/core/search/qmd-wrapper.d.ts +36 -0
  345. package/dist/core/search/qmd-wrapper.js +58 -0
  346. package/dist/core/session/auto-load.js +28 -3
  347. package/dist/core/session/entity-tracker.d.ts +62 -0
  348. package/dist/core/session/entity-tracker.js +287 -0
  349. package/dist/core/session/reference-resolver.d.ts +26 -0
  350. package/dist/core/session/reference-resolver.js +121 -0
  351. package/dist/core/session/self-iteration-job.d.ts +15 -0
  352. package/dist/core/session/self-iteration-job.js +163 -58
  353. package/dist/core/session/working-set.d.ts +50 -0
  354. package/dist/core/session/working-set.js +212 -0
  355. package/dist/core/snapshots/creation.d.ts +2 -8
  356. package/dist/core/snapshots/creation.js +3 -12
  357. package/dist/core/utils/summarization-helpers.d.ts +0 -4
  358. package/dist/core/utils/summarization-helpers.js +1 -6
  359. package/dist/db/bootstrap.d.ts +2 -0
  360. package/dist/db/bootstrap.js +229 -280
  361. package/dist/db/drizzle/schema-sqlite.d.ts +702 -1
  362. package/dist/db/drizzle/schema-sqlite.js +83 -4
  363. package/dist/db/drizzle/schema.d.ts +653 -1
  364. package/dist/db/drizzle/schema.js +93 -4
  365. package/dist/db/migrations/associations.d.ts +6 -0
  366. package/dist/db/migrations/associations.js +29 -0
  367. package/dist/db/migrations/beliefs.d.ts +10 -0
  368. package/dist/db/migrations/beliefs.js +76 -0
  369. package/dist/db/migrations/core-memory.d.ts +6 -0
  370. package/dist/db/migrations/core-memory.js +29 -0
  371. package/dist/db/migrations/fts.d.ts +6 -0
  372. package/dist/db/migrations/fts.js +52 -0
  373. package/dist/db/migrations/index.d.ts +25 -0
  374. package/dist/db/migrations/index.js +51 -0
  375. package/dist/db/migrations/indexes.d.ts +6 -0
  376. package/dist/db/migrations/indexes.js +30 -0
  377. package/dist/db/migrations/learnings.d.ts +7 -0
  378. package/dist/db/migrations/learnings.js +26 -0
  379. package/dist/db/migrations/maintenance.d.ts +6 -0
  380. package/dist/db/migrations/maintenance.js +61 -0
  381. package/dist/db/migrations/memories.d.ts +7 -0
  382. package/dist/db/migrations/memories.js +16 -0
  383. package/dist/db/migrations/memory-places.d.ts +6 -0
  384. package/dist/db/migrations/memory-places.js +29 -0
  385. package/dist/db/migrations/places.d.ts +6 -0
  386. package/dist/db/migrations/places.js +43 -0
  387. package/dist/db/migrations/projects.d.ts +3 -0
  388. package/dist/db/migrations/projects.js +13 -0
  389. package/dist/db/migrations/tier-conversion.d.ts +7 -0
  390. package/dist/db/migrations/tier-conversion.js +20 -0
  391. package/dist/db/schema/beliefs.d.ts +9 -0
  392. package/dist/db/schema/beliefs.js +46 -0
  393. package/dist/db/schema/generator.d.ts +38 -0
  394. package/dist/db/schema/generator.js +108 -0
  395. package/dist/db/schema/index.d.ts +19 -20
  396. package/dist/db/schema/index.js +25 -79
  397. package/dist/db/schema/learnings.d.ts +7 -0
  398. package/dist/db/schema/learnings.js +30 -0
  399. package/dist/db/schema/memories.d.ts +7 -0
  400. package/dist/db/schema/memories.js +81 -0
  401. package/dist/db/schema/projects.d.ts +4 -0
  402. package/dist/db/schema/projects.js +31 -0
  403. package/dist/packages/mcp/src/index.d.ts +3 -0
  404. package/dist/packages/mcp/src/index.js +733 -0
  405. package/mcp.json.example +8 -11
  406. package/package.json +57 -76
  407. package/packages/cli/package.json +22 -0
  408. package/packages/cli/src/commands/clean.ts +68 -0
  409. package/packages/cli/src/commands/context.ts +79 -0
  410. package/packages/cli/src/commands/doctor.ts +357 -0
  411. package/packages/cli/src/commands/forget.ts +72 -0
  412. package/packages/cli/src/commands/health.ts +36 -0
  413. package/packages/cli/src/commands/inspect.ts +41 -0
  414. package/packages/cli/src/commands/link.ts +50 -0
  415. package/packages/cli/src/commands/migrate.ts +93 -0
  416. package/packages/cli/src/commands/recall.ts +99 -0
  417. package/packages/cli/src/commands/recent.ts +57 -0
  418. package/packages/cli/src/commands/remember.ts +139 -0
  419. package/packages/cli/src/commands/run.ts +58 -0
  420. package/packages/cli/src/commands/stale.ts +43 -0
  421. package/packages/cli/src/commands/stats.ts +42 -0
  422. package/packages/cli/src/index.ts +57 -0
  423. package/packages/cli/tsconfig.json +24 -0
  424. package/packages/mcp/package.json +26 -0
  425. package/packages/mcp/src/index.ts +877 -0
  426. package/packages/mcp/tsconfig.json +20 -0
  427. package/skills/squish-memory/SKILL.md +38 -35
  428. package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
  429. package/skills/squish-memory/references/claude-desktop.json +12 -0
  430. package/skills/squish-memory/references/openclaw.json +13 -0
  431. package/skills/squish-memory/references/opencode.json +14 -0
  432. package/config/hooks/claude-code-hooks.json +0 -39
  433. package/config/hooks/cursor-hooks.json +0 -30
  434. package/config/hooks/opencode-hooks.json +0 -30
  435. package/config/hooks/windsurf-hooks.json +0 -30
  436. package/config/mcp-cli-fallback-policy.json +0 -22
  437. package/config/mcp.json +0 -38
  438. package/config/plugin-manifest.json +0 -101
  439. package/config/plugin-manifest.schema.json +0 -244
  440. package/config/plugin.json +0 -32
  441. package/config/remote-memory-policy.json +0 -32
  442. package/core/commands/context-paging.md +0 -51
  443. package/core/commands/context-status.md +0 -22
  444. package/core/commands/context.md +0 -5
  445. package/core/commands/core-memory.md +0 -56
  446. package/core/commands/health.md +0 -5
  447. package/core/commands/init.md +0 -39
  448. package/core/commands/merge.md +0 -113
  449. package/core/commands/recall.md +0 -5
  450. package/core/commands/remember.md +0 -11
  451. package/core/commands/search.md +0 -10
  452. package/dist/core/commands/managed-sync.d.ts +0 -10
  453. package/dist/core/commands/managed-sync.js +0 -64
  454. package/dist/core/external-folder/index.d.ts +0 -102
  455. package/dist/core/external-folder/index.js +0 -294
  456. package/dist/core/namespaces/index.d.ts +0 -71
  457. package/dist/core/namespaces/index.js +0 -305
  458. package/dist/core/namespaces/uri-parser.d.ts +0 -31
  459. package/dist/core/namespaces/uri-parser.js +0 -74
  460. package/dist/core/search/qmd-search.d.ts +0 -61
  461. package/dist/core/search/qmd-search.js +0 -178
  462. package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
  463. package/dist/core/session-hooks/self-iteration-job.js +0 -282
  464. package/dist/core/session-hooks/session-hooks.d.ts +0 -18
  465. package/dist/core/session-hooks/session-hooks.js +0 -58
  466. package/dist/core/snapshots.d.ts +0 -29
  467. package/dist/core/snapshots.js +0 -220
  468. package/dist/core/sync/qmd-sync.d.ts +0 -94
  469. package/dist/core/sync/qmd-sync.js +0 -201
  470. package/dist/index.d.ts +0 -7
  471. package/dist/index.js +0 -1677
  472. package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
  473. package/dist/webui/server.d.ts +0 -5
  474. package/dist/webui/server.js +0 -642
  475. package/generated/mcp/manifest.json +0 -23
  476. package/generated/mcp/mcp-servers.json +0 -25
  477. package/generated/mcp/mcporter.json +0 -34
  478. package/generated/mcp/openclaw-memory-qmd.json +0 -17
  479. package/generated/mcp/runtime.json +0 -12
  480. package/scripts/README.md +0 -60
  481. package/scripts/build-release.sh +0 -36
  482. package/scripts/check-secrets.js +0 -132
  483. package/scripts/copy-runtime-assets.mjs +0 -26
  484. package/scripts/generate-mcp.mjs +0 -264
  485. package/scripts/github-release.sh +0 -77
  486. package/scripts/init-dirs.mjs +0 -13
  487. package/scripts/install-claude-code.sh +0 -85
  488. package/scripts/install-cursor.sh +0 -56
  489. package/scripts/install-hooks.sh +0 -73
  490. package/scripts/install-interactive.mjs +0 -357
  491. package/scripts/install-opencode.sh +0 -75
  492. package/scripts/install-plugin.mjs +0 -415
  493. package/scripts/install-windsurf.sh +0 -67
  494. package/scripts/remote-preflight.mjs +0 -62
  495. package/scripts/squish-fallback.mjs +0 -132
  496. package/scripts/test-interactive.mjs +0 -131
  497. package/scripts/verify-mcp.mjs +0 -214
  498. package/skills/squish-memory/scripts/install.mjs +0 -335
  499. package/skills/squish-memory/write_skill.js +0 -2
@@ -0,0 +1,195 @@
1
+ export interface CurrentProjectSummary {
2
+ id: string;
3
+ name: string;
4
+ path: string;
5
+ resolution: 'explicit' | 'inferred' | 'auto-created' | 'legacy-placeholder';
6
+ }
7
+
8
+ export interface ContextReportInput {
9
+ currentProject: CurrentProjectSummary;
10
+ otherProjects: CurrentProjectSummary[];
11
+ runtime: {
12
+ sessionSummary: string;
13
+ activePlaces: string[];
14
+ signalSummary: {
15
+ captured: number;
16
+ suppressed: number;
17
+ sessionOnly: number;
18
+ durable: number;
19
+ durableWithRaw: number;
20
+ };
21
+ graphSummary: string;
22
+ };
23
+ durableMemories: Array<{
24
+ id: string;
25
+ type: string;
26
+ content: string;
27
+ place?: string | null;
28
+ }>;
29
+ beliefs?: Array<{
30
+ type: string;
31
+ statement: string;
32
+ status: string;
33
+ }>;
34
+ nextStep: string | null;
35
+ }
36
+
37
+ export interface HealthReportInput {
38
+ severity: 'ok' | 'degraded' | 'broken';
39
+ currentProject: string;
40
+ checks: Array<{ name: string; status: 'ok' | 'degraded' | 'broken'; detail: string }>;
41
+ diagnostics?: Array<{ name: string; status: 'ok' | 'degraded' | 'broken'; detail: string; fix?: string }>;
42
+ nextStep: string | null;
43
+ }
44
+
45
+ export interface StatsReportInput {
46
+ currentProject: string;
47
+ totals: { memories: number; durable: number; sessionLocal: number };
48
+ signal: {
49
+ captured: number;
50
+ suppressed: number;
51
+ sessionOnly: number;
52
+ durable: number;
53
+ durableWithRaw: number;
54
+ tokensSaved: number;
55
+ placeRouted: number;
56
+ graphEnriched: number;
57
+ };
58
+ places: { active: number; named: string[] };
59
+ graph: { status: string; enrichments: number };
60
+ wakeUp: string;
61
+ signalNote?: string | null;
62
+ }
63
+
64
+ export interface InspectReportInput {
65
+ id: string;
66
+ classification: string;
67
+ storageReason: string;
68
+ durability: 'session-only' | 'durable';
69
+ place?: string | null;
70
+ placeType?: string | null;
71
+ graphStatus?: string | null;
72
+ rawFallback?: string | null;
73
+ wakeUpPriority?: string | null;
74
+ metadataAvailability?: string | null;
75
+ beliefs?: Array<{
76
+ id: string;
77
+ type: string;
78
+ statement: string;
79
+ status: string;
80
+ confidence: number;
81
+ }>;
82
+ }
83
+
84
+ export function formatContextReport(input: ContextReportInput): string {
85
+ const lines = [
86
+ 'Current project',
87
+ `- ${input.currentProject.name} (${input.currentProject.path})`,
88
+ `- resolution: ${input.currentProject.resolution}`,
89
+ '',
90
+ 'Runtime state',
91
+ `- session working set: ${input.runtime.sessionSummary || 'none'}`,
92
+ `- active places: ${input.runtime.activePlaces.join(', ') || 'none'}`,
93
+ `- signals: captured ${input.runtime.signalSummary.captured}, suppressed ${input.runtime.signalSummary.suppressed}, session-only ${input.runtime.signalSummary.sessionOnly}, durable ${input.runtime.signalSummary.durable}, durable+raw ${input.runtime.signalSummary.durableWithRaw}`,
94
+ `- graph: ${input.runtime.graphSummary}`,
95
+ '',
96
+ 'Recent durable memories',
97
+ ];
98
+
99
+ if (input.durableMemories.length === 0) {
100
+ lines.push('- none yet');
101
+ } else {
102
+ for (const memory of input.durableMemories) {
103
+ lines.push(`- [${memory.type}] ${memory.content}${memory.place ? ` @ ${memory.place}` : ''}`);
104
+ }
105
+ }
106
+
107
+ if (input.otherProjects.length > 0) {
108
+ lines.push('', 'Other projects');
109
+ for (const project of input.otherProjects) {
110
+ lines.push(`- ${project.name} (${project.path}) [${project.resolution}]`);
111
+ }
112
+ }
113
+
114
+ if (input.beliefs && input.beliefs.length > 0) {
115
+ lines.push('', 'Derived beliefs');
116
+ for (const belief of input.beliefs) {
117
+ lines.push(`- [${belief.type}] ${belief.statement} (${belief.status})`);
118
+ }
119
+ }
120
+
121
+ if (input.nextStep) {
122
+ lines.push('', `Next step: ${input.nextStep}`);
123
+ }
124
+
125
+ return lines.join('\n');
126
+ }
127
+
128
+ export function formatHealthReport(input: HealthReportInput): string {
129
+ const lines = [
130
+ `Status: ${input.severity}`,
131
+ `Current project: ${input.currentProject}`,
132
+ '',
133
+ 'Subsystems',
134
+ ...input.checks.map((check) => `- ${check.name}: ${check.status} (${check.detail})`),
135
+ ];
136
+ if (input.diagnostics && input.diagnostics.length > 0) {
137
+ lines.push('', 'Diagnostics');
138
+ for (const diagnostic of input.diagnostics) {
139
+ lines.push(`- ${diagnostic.name}: ${diagnostic.status} (${diagnostic.detail})`);
140
+ if (diagnostic.fix) {
141
+ lines.push(` fix: ${diagnostic.fix}`);
142
+ }
143
+ }
144
+ }
145
+ if (input.nextStep) lines.push('', `Next step: ${input.nextStep}`);
146
+ return lines.join('\n');
147
+ }
148
+
149
+ export function formatStatsReport(input: StatsReportInput): string {
150
+ const lines = [
151
+ `Current project: ${input.currentProject}`,
152
+ `Memory totals: ${input.totals.memories} total, ${input.totals.durable} durable, ${input.totals.sessionLocal} session-local`,
153
+ '',
154
+ 'Capture-era signals',
155
+ `- captured: ${input.signal.captured}`,
156
+ `- suppressed: ${input.signal.suppressed}`,
157
+ `- session-only: ${input.signal.sessionOnly}`,
158
+ `- signal-tracked durable: ${input.signal.durable}`,
159
+ `- signal-tracked durable+raw: ${input.signal.durableWithRaw}`,
160
+ `- token savings: ${input.signal.tokensSaved}`,
161
+ `- place routed: ${input.signal.placeRouted}`,
162
+ `- graph enriched: ${input.signal.graphEnriched}`,
163
+ '',
164
+ `Places: ${input.places.active} active (${input.places.named.join(', ') || 'none'})`,
165
+ `Graph: ${input.graph.status}; ${input.graph.enrichments} enrichments`,
166
+ `Wake-up: ${input.wakeUp}`,
167
+ ];
168
+ if (input.signalNote) {
169
+ lines.push(`Signal note: ${input.signalNote}`);
170
+ }
171
+ return lines.join('\n');
172
+ }
173
+
174
+ export function formatInspectReport(input: InspectReportInput): string {
175
+ const lines = [
176
+ `Memory ${input.id}`,
177
+ `Classification: ${input.classification}`,
178
+ `Storage reason: ${input.storageReason}`,
179
+ `Durability: ${input.durability}`,
180
+ `Place: ${input.place ?? 'none'}${input.placeType ? ` (${input.placeType})` : ''}`,
181
+ `Graph: ${input.graphStatus ?? 'none'}`,
182
+ `Raw fallback: ${input.rawFallback ?? 'none'}`,
183
+ `Wake-up priority: ${input.wakeUpPriority ?? 'n/a'}`,
184
+ ];
185
+ if (input.metadataAvailability) {
186
+ lines.push(`Metadata: ${input.metadataAvailability}`);
187
+ }
188
+ if (input.beliefs && input.beliefs.length > 0) {
189
+ lines.push('Beliefs:');
190
+ for (const belief of input.beliefs) {
191
+ lines.push(`- [${belief.type}] ${belief.statement} (${belief.status}, c=${belief.confidence.toFixed(2)})`);
192
+ }
193
+ }
194
+ return lines.join('\n');
195
+ }
@@ -0,0 +1,360 @@
1
+ import { getDbClient } from '../lib/db-client.js';
2
+ import { getRecent } from '../memory/memories.js';
3
+ import { getMemoryStats } from '../memory/stats.js';
4
+ import { explainMemory } from '../memory/explain.js';
5
+ import { getLatestProjectWorkingSetSummary, getProjectSignalStats } from '../session/working-set.js';
6
+ import { getGraphStats } from '../graph/index.js';
7
+ import { getAllProjects, getProjectByPath, ensureProject, type ProjectRecord } from '../projects.js';
8
+ import { getProjectPlaces } from '../places/places.js';
9
+ import { getMemoryPlace } from '../places/memory-places.js';
10
+ import { getPlace } from '../places/places.js';
11
+ import { config } from '../../config.js';
12
+ import { getBeliefsForMemory } from '../beliefs/store.js';
13
+ import type {
14
+ ContextReportInput,
15
+ CurrentProjectSummary,
16
+ HealthReportInput,
17
+ InspectReportInput,
18
+ StatsReportInput,
19
+ } from './trust-report.js';
20
+
21
+ export interface TrustProjectScope {
22
+ currentProject: CurrentProjectSummary;
23
+ otherProjects: CurrentProjectSummary[];
24
+ nextStep: string | null;
25
+ }
26
+
27
+ function isLegacyPlaceholderProject(project: ProjectRecord, currentWorkspacePath?: string): boolean {
28
+ const normalizedPath = project.path.trim();
29
+ if (normalizedPath === '.') return true;
30
+ if (!currentWorkspacePath) return false;
31
+ return normalizedPath === currentWorkspacePath && String(project.metadata?.source ?? '') === 'mcp';
32
+ }
33
+
34
+ function filterNormalOtherProjects(projects: ProjectRecord[], currentProjectId: string, currentWorkspacePath?: string) {
35
+ return projects.filter((candidate) => {
36
+ if (candidate.id === currentProjectId) return false;
37
+ return !isLegacyPlaceholderProject(candidate, currentWorkspacePath);
38
+ });
39
+ }
40
+
41
+ function inferResolution(
42
+ project: ProjectRecord,
43
+ mode: 'explicit' | 'inferred' | 'auto-created',
44
+ ): CurrentProjectSummary['resolution'] {
45
+ if (mode !== 'inferred') return mode;
46
+ const source = String(project.metadata?.source ?? '');
47
+ return source === 'mcp' ? 'auto-created' : 'inferred';
48
+ }
49
+
50
+ function toProjectSummary(
51
+ project: ProjectRecord,
52
+ mode: 'explicit' | 'inferred' | 'auto-created',
53
+ ): CurrentProjectSummary {
54
+ return {
55
+ id: project.id,
56
+ name: project.name,
57
+ path: project.path,
58
+ resolution: inferResolution(project, mode),
59
+ };
60
+ }
61
+
62
+ export async function resolveProjectScope(projectPath?: string): Promise<TrustProjectScope> {
63
+ const projects = await getAllProjects();
64
+ const explicitPath = projectPath?.trim();
65
+
66
+ if (explicitPath) {
67
+ let project = await getProjectByPath(explicitPath);
68
+ let resolution: 'explicit' | 'auto-created' = 'explicit';
69
+ if (!project) {
70
+ project = await ensureProject(explicitPath);
71
+ resolution = 'auto-created';
72
+ }
73
+ if (!project) {
74
+ throw new Error(`Unable to resolve project: ${explicitPath}`);
75
+ }
76
+
77
+ return {
78
+ currentProject: toProjectSummary(project, resolution),
79
+ otherProjects: filterNormalOtherProjects(projects, project.id, explicitPath)
80
+ .map((candidate) => toProjectSummary(candidate, 'inferred')),
81
+ nextStep: null,
82
+ };
83
+ }
84
+
85
+ const cwd = process.cwd();
86
+ const cwdProject = await getProjectByPath(cwd);
87
+ if (cwdProject) {
88
+ return {
89
+ currentProject: toProjectSummary(cwdProject, 'inferred'),
90
+ otherProjects: filterNormalOtherProjects(projects, cwdProject.id, cwd)
91
+ .map((candidate) => toProjectSummary(candidate, 'inferred')),
92
+ nextStep: null,
93
+ };
94
+ }
95
+
96
+ if (projects.length === 1) {
97
+ return {
98
+ currentProject: toProjectSummary(projects[0], 'inferred'),
99
+ otherProjects: [],
100
+ nextStep: null,
101
+ };
102
+ }
103
+
104
+ const autoProject = await ensureProject(cwd);
105
+ if (!autoProject) {
106
+ throw new Error(`Unable to create project for current workspace: ${cwd}`);
107
+ }
108
+
109
+ const otherProjects = projects
110
+ .filter((candidate) => candidate.id !== autoProject.id)
111
+ .filter((candidate) => !isLegacyPlaceholderProject(candidate, cwd))
112
+ .map((candidate) => toProjectSummary(candidate, 'inferred'));
113
+
114
+ return {
115
+ currentProject: toProjectSummary(autoProject, 'auto-created'),
116
+ otherProjects,
117
+ nextStep:
118
+ otherProjects.length > 0
119
+ ? 'Pass --project with the intended workspace path if this is not the project you meant.'
120
+ : null,
121
+ };
122
+ }
123
+
124
+ async function getMemoryPlaceName(memoryId: string): Promise<string | null> {
125
+ const placeId = await getMemoryPlace(memoryId);
126
+ if (!placeId) return null;
127
+ const place = await getPlace(placeId);
128
+ return place?.name ?? null;
129
+ }
130
+
131
+ export async function buildContextState(projectPath?: string, limit: number = 10): Promise<ContextReportInput> {
132
+ const scope = await resolveProjectScope(projectPath);
133
+ const projectPathResolved = scope.currentProject.path;
134
+ const [sessionSummary, signalSummary, graphStats, memories] = await Promise.all([
135
+ getLatestProjectWorkingSetSummary(projectPathResolved),
136
+ getProjectSignalStats(projectPathResolved),
137
+ getGraphStats(projectPathResolved),
138
+ getRecent(projectPathResolved, limit),
139
+ ]);
140
+
141
+ const project = await getProjectByPath(projectPathResolved);
142
+ const places = project ? await getProjectPlaces(project.id) : [];
143
+ const activePlaces = places.filter((place) => place.memoryCount > 0).map((place) => place.name);
144
+
145
+ const durableMemories = await Promise.all(
146
+ memories.map(async (memory) => ({
147
+ id: memory.id,
148
+ type: memory.type,
149
+ content: memory.content,
150
+ place: await getMemoryPlaceName(memory.id),
151
+ })),
152
+ );
153
+ const beliefRows = await Promise.all(memories.map((memory) => getBeliefsForMemory(memory.id)));
154
+ const beliefs = beliefRows.flat().slice(0, 6).map((belief) => ({
155
+ type: belief.type,
156
+ statement: belief.statement,
157
+ status: belief.status,
158
+ }));
159
+
160
+ return {
161
+ currentProject: scope.currentProject,
162
+ otherProjects: scope.otherProjects,
163
+ runtime: {
164
+ sessionSummary,
165
+ activePlaces,
166
+ signalSummary: {
167
+ captured: signalSummary.captured,
168
+ suppressed: signalSummary.suppressed,
169
+ sessionOnly: signalSummary.sessionOnly,
170
+ durable: signalSummary.durable,
171
+ durableWithRaw: signalSummary.durableWithRaw,
172
+ },
173
+ graphSummary:
174
+ graphStats.entityCount > 0 || graphStats.relationCount > 0
175
+ ? `enabled; ${graphStats.entityCount} entities, ${graphStats.relationCount} relations`
176
+ : 'enabled; no graph enrichments yet',
177
+ },
178
+ durableMemories,
179
+ beliefs,
180
+ nextStep: scope.nextStep,
181
+ };
182
+ }
183
+
184
+ export async function buildStatsState(projectPath?: string): Promise<StatsReportInput> {
185
+ const scope = await resolveProjectScope(projectPath);
186
+ const projectPathResolved = scope.currentProject.path;
187
+ const [stats, graphStats, sessionSummary] = await Promise.all([
188
+ getMemoryStats(projectPathResolved),
189
+ getGraphStats(projectPathResolved),
190
+ getLatestProjectWorkingSetSummary(projectPathResolved),
191
+ ]);
192
+
193
+ const project = await getProjectByPath(projectPathResolved);
194
+ const places = project ? await getProjectPlaces(project.id) : [];
195
+
196
+ return {
197
+ currentProject: `${scope.currentProject.name} (${scope.currentProject.path})`,
198
+ totals: {
199
+ memories: stats.totalMemories,
200
+ durable: Math.max(
201
+ stats.totalMemories,
202
+ (stats.signal?.durable ?? 0) + (stats.signal?.durableWithRaw ?? 0),
203
+ ),
204
+ sessionLocal: stats.signal?.sessionOnly ?? 0,
205
+ },
206
+ signal: {
207
+ captured: stats.signal?.captured ?? 0,
208
+ suppressed: stats.signal?.suppressed ?? 0,
209
+ sessionOnly: stats.signal?.sessionOnly ?? 0,
210
+ durable: stats.signal?.durable ?? 0,
211
+ durableWithRaw: stats.signal?.durableWithRaw ?? 0,
212
+ tokensSaved: stats.signal?.tokensSaved ?? 0,
213
+ placeRouted: stats.signal?.placeRouted ?? 0,
214
+ graphEnriched: stats.signal?.graphEnriched ?? 0,
215
+ },
216
+ places: {
217
+ active: places.filter((place) => place.memoryCount > 0).length,
218
+ named: places.filter((place) => place.memoryCount > 0).map((place) => place.name),
219
+ },
220
+ graph: {
221
+ status:
222
+ graphStats.entityCount > 0 || graphStats.relationCount > 0 ? 'enabled' : 'enabled (idle)',
223
+ enrichments: stats.signal?.graphEnriched ?? 0,
224
+ },
225
+ wakeUp: sessionSummary || 'No working set yet',
226
+ signalNote:
227
+ stats.totalMemories > 0 && (stats.signal?.captured ?? 0) === 0
228
+ ? 'Signal counts cover capture-era writes only. Legacy durable memories may exist without signal telemetry.'
229
+ : 'Signal counts cover capture-era writes only.',
230
+ };
231
+ }
232
+
233
+ export async function buildHealthState(projectPath?: string): Promise<HealthReportInput> {
234
+ const scope = await resolveProjectScope(projectPath);
235
+ const checks: HealthReportInput['checks'] = [];
236
+ let severity: HealthReportInput['severity'] = 'ok';
237
+ let nextStep: string | null = scope.nextStep;
238
+
239
+ try {
240
+ await getDbClient();
241
+ checks.push({ name: 'database', status: 'ok', detail: 'Database connection succeeded.' });
242
+ } catch (error: any) {
243
+ severity = 'broken';
244
+ nextStep = 'Fix database initialization before relying on memory reads or writes.';
245
+ checks.push({
246
+ name: 'database',
247
+ status: 'broken',
248
+ detail: error?.message ?? 'Database initialization failed.',
249
+ });
250
+ }
251
+
252
+ checks.push({
253
+ name: 'project resolution',
254
+ status: 'ok',
255
+ detail: `${scope.currentProject.name} at ${scope.currentProject.path} (${scope.currentProject.resolution})`,
256
+ });
257
+
258
+ try {
259
+ await getRecent(scope.currentProject.path, 1);
260
+ checks.push({ name: 'memory write path', status: 'ok', detail: 'Memory store is readable for this project.' });
261
+ } catch (error: any) {
262
+ severity = severity === 'broken' ? 'broken' : 'degraded';
263
+ nextStep = nextStep ?? 'Run `squish doctor` to repair local storage before writing memories.';
264
+ checks.push({
265
+ name: 'memory write path',
266
+ status: 'degraded',
267
+ detail: error?.message ?? 'Memory store could not be read.',
268
+ });
269
+ }
270
+
271
+ try {
272
+ const sessionSummary = await getLatestProjectWorkingSetSummary(scope.currentProject.path);
273
+ checks.push({
274
+ name: 'session working set',
275
+ status: sessionSummary ? 'ok' : 'degraded',
276
+ detail: sessionSummary || 'No compact working set has been captured yet.',
277
+ });
278
+ if (!sessionSummary && severity === 'ok') {
279
+ severity = 'degraded';
280
+ nextStep = nextStep ?? 'Run a normal session or memory write so Squish can build a working-set wake-up summary.';
281
+ }
282
+ } catch (error: any) {
283
+ severity = severity === 'broken' ? 'broken' : 'degraded';
284
+ checks.push({
285
+ name: 'session working set',
286
+ status: 'degraded',
287
+ detail: error?.message ?? 'Working-set state could not be loaded.',
288
+ });
289
+ }
290
+
291
+ const project = await getProjectByPath(scope.currentProject.path);
292
+ const places = project ? await getProjectPlaces(project.id) : [];
293
+ const activePlaces = places.filter((place) => place.memoryCount > 0);
294
+ checks.push({
295
+ name: 'places',
296
+ status: activePlaces.length > 0 ? 'ok' : 'degraded',
297
+ detail:
298
+ activePlaces.length > 0
299
+ ? `${activePlaces.length} active places: ${activePlaces.map((place) => place.name).join(', ')}`
300
+ : 'No populated places yet.',
301
+ });
302
+ if (activePlaces.length === 0 && severity === 'ok') {
303
+ severity = 'degraded';
304
+ nextStep = nextStep ?? 'Store or recall project memories to populate place routing.';
305
+ }
306
+
307
+ const graphStats = await getGraphStats(scope.currentProject.path);
308
+ checks.push({
309
+ name: 'graph',
310
+ status: graphStats.entityCount > 0 || graphStats.relationCount > 0 ? 'ok' : 'degraded',
311
+ detail:
312
+ graphStats.entityCount > 0 || graphStats.relationCount > 0
313
+ ? `${graphStats.entityCount} entities and ${graphStats.relationCount} relations available.`
314
+ : 'Graph is enabled but has no extracted entities yet.',
315
+ });
316
+ if (graphStats.entityCount === 0 && graphStats.relationCount === 0 && severity === 'ok') {
317
+ severity = 'degraded';
318
+ nextStep = nextStep ?? 'Write or recall durable memories so graph enrichment has material to process.';
319
+ }
320
+
321
+ checks.push({
322
+ name: 'mode',
323
+ status: 'ok',
324
+ detail: `${config.isManagedMode ? 'managed' : 'local'} mode; embeddings ${config.embeddingsProvider}`,
325
+ });
326
+
327
+ return {
328
+ severity,
329
+ currentProject: `${scope.currentProject.name} (${scope.currentProject.path})`,
330
+ checks,
331
+ nextStep,
332
+ };
333
+ }
334
+
335
+ export async function buildInspectState(id: string): Promise<InspectReportInput | null> {
336
+ const inspection = await explainMemory(id);
337
+ if (!inspection) return null;
338
+
339
+ return {
340
+ id: inspection.id,
341
+ classification: inspection.classification,
342
+ storageReason: inspection.reasons.join('; ') || 'Stored as durable memory.',
343
+ durability: inspection.classification === 'session-only' ? 'session-only' : 'durable',
344
+ place: inspection.place ?? null,
345
+ placeType: inspection.placeType ?? null,
346
+ graphStatus: inspection.graphStatus ?? null,
347
+ rawFallback: inspection.rawFallbackSnapshotId ?? null,
348
+ wakeUpPriority: inspection.nuanceSuppressed ? 'high' : 'normal',
349
+ metadataAvailability: inspection.legacyMetadata
350
+ ? 'Legacy durable record; signal-era metadata is unavailable.'
351
+ : 'Signal metadata available.',
352
+ beliefs: (inspection.beliefs ?? []).map((belief) => ({
353
+ id: belief.id,
354
+ type: belief.type,
355
+ statement: belief.statement,
356
+ status: belief.status,
357
+ confidence: belief.confidence,
358
+ })),
359
+ };
360
+ }