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,260 @@
1
+ /**
2
+ * Learnings Module
3
+ * Agent learnings: success, failure, fix, insight
4
+ * With auto-linking to similar memories and learnings
5
+ */
6
+
7
+ import { randomUUID } from 'crypto';
8
+ import { desc, eq, sql, and } from 'drizzle-orm';
9
+ import { config } from '../../config.js';
10
+ import { getEmbedding } from '../embeddings.js';
11
+ import { getOrCreateProject, requireProject } from '../projects.js';
12
+ import { serializeMetadata, deserializeMetadata } from '../memory/serialization.js';
13
+ import { normalizeTimestamp, prepareEmbedding } from '../lib/utils.js';
14
+ import { logger } from '../logger.js';
15
+ import { getDbClient } from '../lib/db-client.js';
16
+ import { createAssociation } from '../associations.js';
17
+ import { search, type SearchResult } from '../memory/memories.js';
18
+ import { updateAgentPreference } from '../agent-preferences.js';
19
+
20
+ // Learning type: success, failure, fix, insight
21
+ export type LearningType = 'success' | 'failure' | 'fix' | 'insight';
22
+
23
+ export interface LearningInput {
24
+ type: LearningType;
25
+ content: string;
26
+ context?: string;
27
+ action?: string;
28
+ target?: string;
29
+ project?: string;
30
+ memoryId?: string; // Optional link to a memory
31
+ autoLink?: boolean; // Auto-link to similar memories/learnings (default: true)
32
+ }
33
+
34
+ export interface LearningRecord {
35
+ id: string;
36
+ projectId?: string | null;
37
+ conversationId?: string | null;
38
+ type: LearningType;
39
+ action: string;
40
+ target?: string | null;
41
+ summary: string;
42
+ details?: Record<string, unknown> | null;
43
+ memoryId?: string | null;
44
+ isImported?: boolean;
45
+ createdAt?: string | null;
46
+ }
47
+
48
+ /**
49
+ * Create a learning and optionally auto-link to similar memories/learnings
50
+ */
51
+ export async function createLearning(input: LearningInput): Promise<LearningRecord> {
52
+ const { db, schema } = await getDbClient();
53
+ const project = await getOrCreateProject(input.project);
54
+ const embedding = await getEmbedding(input.content);
55
+ const id = randomUUID();
56
+
57
+ const learningType = input.type;
58
+ const autoLink = input.autoLink !== false; // default true
59
+
60
+ // Build details with learning metadata
61
+ const details = serializeMetadata({
62
+ learningType: learningType,
63
+ learningContent: input.content,
64
+ learningContext: input.context,
65
+ });
66
+
67
+ const embeddingValues = prepareEmbedding(embedding);
68
+
69
+ // Insert the learning
70
+ await db.insert(schema.learnings).values({
71
+ id,
72
+ projectId: project?.id ?? null,
73
+ type: learningType,
74
+ action: input.action ?? input.content,
75
+ summary: input.context || input.content,
76
+ target: input.target ?? null,
77
+ details,
78
+ memoryId: input.memoryId ?? null,
79
+ ...embeddingValues,
80
+ createdAt: new Date(),
81
+ });
82
+
83
+ // If memoryId provided, create bidirectional link
84
+ if (input.memoryId) {
85
+ await createAssociation(
86
+ input.memoryId, // from memory
87
+ id, // to learning
88
+ 'relates_to',
89
+ 1
90
+ );
91
+ }
92
+
93
+ // Auto-link to similar memories and learnings (if enabled)
94
+ if (autoLink) {
95
+ await autoLinkLearning(id, input.content, project?.id ?? null);
96
+ }
97
+
98
+ // Extract and store agent preferences from this learning
99
+ await updateAgentPreference(project?.id ?? 'default', input.content, id);
100
+
101
+ return {
102
+ id,
103
+ projectId: project?.id ?? null,
104
+ conversationId: null,
105
+ type: learningType,
106
+ action: input.action ?? input.content,
107
+ target: input.target ?? null,
108
+ summary: input.context || input.content,
109
+ details: { learningType: learningType, learningContent: input.content, learningContext: input.context },
110
+ memoryId: input.memoryId ?? null,
111
+ createdAt: new Date().toISOString(),
112
+ };
113
+ }
114
+
115
+ /**
116
+ * Auto-link a learning to similar memories above threshold
117
+ */
118
+ async function autoLinkLearning(learningId: string, content: string, projectId: string | null) {
119
+ const SIMILARITY_THRESHOLD = 0.85;
120
+ const MAX_LINKS = 5;
121
+
122
+ if (!projectId) return;
123
+
124
+ try {
125
+ // Search for similar memories using the search function
126
+ const similarMemories = await search({
127
+ query: content,
128
+ limit: MAX_LINKS,
129
+ });
130
+
131
+ // Filter by similarity threshold
132
+ const relevantMemories = (similarMemories as SearchResult[]).filter((m: SearchResult) => (m.similarity ?? 0) >= SIMILARITY_THRESHOLD);
133
+
134
+ // Create associations with memories
135
+ for (const mem of relevantMemories) {
136
+ await createAssociation(
137
+ learningId, // from learning
138
+ mem.id, // to memory
139
+ 'relates_to',
140
+ mem.similarity ?? 0.9
141
+ );
142
+ }
143
+
144
+ logger.info(`Auto-linked learning ${learningId} to ${relevantMemories.length} memories`);
145
+ } catch (error) {
146
+ logger.error('Error in auto-linking:', error);
147
+ // Don't fail learning creation if auto-link fails
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Get learnings for a project
153
+ */
154
+ export async function getLearnings(projectPath: string, limit: number): Promise<LearningRecord[]> {
155
+ try {
156
+ const { db, schema } = await getDbClient();
157
+ const project = await requireProject(projectPath);
158
+
159
+ const rows = await db.select().from(schema.learnings)
160
+ .where(eq(schema.learnings.projectId, project.id))
161
+ .orderBy(desc(schema.learnings.createdAt))
162
+ .limit(limit);
163
+
164
+ return rows.map((row: any) => normalizeLearning(row));
165
+ } catch (error: any) {
166
+ throw error;
167
+ }
168
+ }
169
+
170
+ /**
171
+ * Get recent learnings
172
+ */
173
+ export async function getRecentLearnings(projectPath: string, limit: number = 10): Promise<LearningRecord[]> {
174
+ try {
175
+ const { db, schema } = await getDbClient();
176
+ const project = await requireProject(projectPath);
177
+
178
+ const rows = await db.select().from(schema.learnings)
179
+ .where(eq(schema.learnings.projectId, project.id))
180
+ .orderBy(desc(schema.learnings.createdAt))
181
+ .limit(limit);
182
+
183
+ return rows.map((row: any) => normalizeLearning(row));
184
+ } catch (error: any) {
185
+ logger.error('Error getting recent learnings', error);
186
+ throw error;
187
+ }
188
+ }
189
+
190
+ /**
191
+ * Get learning by ID
192
+ */
193
+ export async function getLearningById(learningId: string): Promise<LearningRecord | null> {
194
+ try {
195
+ const { db, schema } = await getDbClient();
196
+ const rows = await db.select().from(schema.learnings)
197
+ .where(eq(schema.learnings.id, learningId))
198
+ .limit(1);
199
+
200
+ if (rows.length === 0) return null;
201
+ return normalizeLearning(rows[0]);
202
+ } catch (error: any) {
203
+ logger.error('Error getting learning', error);
204
+ throw error;
205
+ }
206
+ }
207
+
208
+ /**
209
+ * Get learnings linked to a specific memory
210
+ */
211
+ export async function getLearningsForMemory(memoryId: string): Promise<LearningRecord[]> {
212
+ try {
213
+ const { db, schema } = await getDbClient();
214
+ const rows = await db.select().from(schema.learnings)
215
+ .where(eq(schema.learnings.memoryId, memoryId))
216
+ .orderBy(desc(schema.learnings.createdAt));
217
+
218
+ return rows.map((row: any) => normalizeLearning(row));
219
+ } catch (error: any) {
220
+ logger.error('Error getting learnings for memory', error);
221
+ throw error;
222
+ }
223
+ }
224
+
225
+ /**
226
+ * Delete a learning
227
+ */
228
+ export async function deleteLearning(learningId: string): Promise<boolean> {
229
+ try {
230
+ const { db, schema } = await getDbClient();
231
+ await db.delete(schema.learnings)
232
+ .where(eq(schema.learnings.id, learningId));
233
+ return true;
234
+ } catch (error: any) {
235
+ logger.error('Error deleting learning', error);
236
+ return false;
237
+ }
238
+ }
239
+
240
+ function normalizeLearning(row: any): LearningRecord {
241
+ const details = deserializeMetadata(row.details ?? null);
242
+ return {
243
+ id: row.id,
244
+ projectId: row.projectId ?? row.project_id ?? null,
245
+ conversationId: row.conversationId ?? row.conversation_id ?? null,
246
+ type: row.type as LearningType,
247
+ action: row.action,
248
+ target: row.target ?? null,
249
+ summary: row.summary,
250
+ details,
251
+ memoryId: row.memoryId ?? row.memory_id ?? null,
252
+ isImported: row.isImported ?? row.is_imported ?? false,
253
+ createdAt: normalizeTimestamp(row.createdAt ?? row.created_at),
254
+ };
255
+ }
256
+
257
+ // Backwards compatibility aliases
258
+ export const getObservations = getLearnings;
259
+ export const getRecentObservations = getRecentLearnings;
260
+ export const getObservationById = getLearningById;
@@ -0,0 +1,266 @@
1
+ import { createHash } from 'crypto';
2
+
3
+ export type SignalClassification =
4
+ | 'discard'
5
+ | 'session-only'
6
+ | 'durable-distilled'
7
+ | 'durable-raw+distilled';
8
+
9
+ export interface SignalEventInput {
10
+ toolName: string;
11
+ toolInput?: Record<string, unknown>;
12
+ toolResult?: unknown;
13
+ sessionId?: string | null;
14
+ }
15
+
16
+ export interface SignalDecision {
17
+ classification: SignalClassification;
18
+ reasons: string[];
19
+ storeRaw: boolean;
20
+ importance: 'low' | 'medium' | 'high';
21
+ wakeUpPriority: 'low' | 'medium' | 'high';
22
+ placeHint: {
23
+ placeType: 'inbox' | 'ref' | 'wip' | 'sandbox' | 'board' | 'sparks' | 'archive' | null;
24
+ confidence: number;
25
+ };
26
+ graphHint: {
27
+ shouldEnrich: boolean;
28
+ entityTerms: string[];
29
+ reason?: string;
30
+ };
31
+ content: string;
32
+ contentHash: string;
33
+ estimatedSavings: number;
34
+ }
35
+
36
+ export interface DistillInput {
37
+ toolName: string;
38
+ command?: string;
39
+ content: string;
40
+ classification: SignalClassification;
41
+ }
42
+
43
+ function normalizeContent(toolResult: unknown): string {
44
+ if (typeof toolResult === 'string') return toolResult;
45
+ if (toolResult == null) return '';
46
+ if (typeof toolResult === 'object') {
47
+ try {
48
+ return JSON.stringify(toolResult, null, 2);
49
+ } catch {
50
+ return String(toolResult);
51
+ }
52
+ }
53
+ return String(toolResult);
54
+ }
55
+
56
+ function estimateNoiseSavings(raw: string, distilled: string): number {
57
+ return Math.max(0, raw.length - distilled.length);
58
+ }
59
+
60
+ function extractEntityTerms(content: string): string[] {
61
+ const matches = content.match(/\b([A-Z][A-Za-z0-9]+|[a-z]+(?:\.[a-z0-9_-]+)+|[A-Za-z0-9_-]+\.ts)\b/g) ?? [];
62
+ return [...new Set(matches.filter((term) => term.length > 2))].slice(0, 6);
63
+ }
64
+
65
+ function inferPlaceHint(toolName: string, normalized: string): SignalDecision['placeHint'] {
66
+ if (['write', 'edit', 'multiedit'].includes(toolName.toLowerCase()) || /\b(fix|bug|implement|refactor|edited|wrote)\b/.test(normalized)) {
67
+ return { placeType: 'wip', confidence: 0.88 };
68
+ }
69
+ if (/\b(test|assertionerror|traceback|exception|experiment|verify)\b/.test(normalized)) {
70
+ return { placeType: 'sandbox', confidence: 0.92 };
71
+ }
72
+ if (/\b(hypothesis|plan|decided|roadmap|task|todo|investigate)\b/.test(normalized)) {
73
+ return { placeType: 'board', confidence: 0.74 };
74
+ }
75
+ if (/\b(research|docs|pattern|reference|api|architecture)\b/.test(normalized)) {
76
+ return { placeType: 'ref', confidence: 0.72 };
77
+ }
78
+ if (/\b(idea|explore|future|concept)\b/.test(normalized)) {
79
+ return { placeType: 'sparks', confidence: 0.68 };
80
+ }
81
+ return { placeType: null, confidence: 0 };
82
+ }
83
+
84
+ function inferGraphHint(normalized: string, content: string, classification: SignalClassification): SignalDecision['graphHint'] {
85
+ if (classification === 'discard' || classification === 'session-only') {
86
+ return { shouldEnrich: false, entityTerms: [], reason: 'non-durable signal' };
87
+ }
88
+
89
+ const entityTerms = extractEntityTerms(content);
90
+ const hasStructuredSignal = entityTerms.length > 0 || /\b(fix|decision|preference|error|graph|ranking|entity|relationship)\b/.test(normalized);
91
+ if (!hasStructuredSignal) {
92
+ return { shouldEnrich: false, entityTerms: [], reason: 'no graph-worthy entities' };
93
+ }
94
+
95
+ return {
96
+ shouldEnrich: true,
97
+ entityTerms,
98
+ reason: 'durable signal with identifiable entities',
99
+ };
100
+ }
101
+
102
+ export function hashSignalContent(content: string): string {
103
+ return createHash('sha1').update(content).digest('hex');
104
+ }
105
+
106
+ export function classifySignalEvent(input: SignalEventInput): SignalDecision {
107
+ const toolName = input.toolName;
108
+ const command = String(input.toolInput?.command ?? input.toolInput?.cmd ?? '');
109
+ const content = normalizeContent(input.toolResult);
110
+ const normalized = `${command}\n${content}`.toLowerCase();
111
+ const reasons: string[] = [];
112
+
113
+ const noisyCommand =
114
+ /\b(npm|bun|pnpm|yarn)\s+(install|add)\b/.test(normalized) ||
115
+ /\bdownload(ed|ing)?\b|\bfetch(ed|ing)?\b|\bprogress\b|\bresolved\b/.test(normalized);
116
+ if (noisyCommand) {
117
+ const placeHint = inferPlaceHint(toolName, normalized);
118
+ reasons.push('noise filtered from install/build output');
119
+ return {
120
+ classification: 'discard',
121
+ reasons,
122
+ storeRaw: false,
123
+ importance: 'low',
124
+ wakeUpPriority: 'low',
125
+ placeHint,
126
+ graphHint: inferGraphHint(normalized, content, 'discard'),
127
+ content,
128
+ contentHash: hashSignalContent(normalized),
129
+ estimatedSavings: content.length,
130
+ };
131
+ }
132
+
133
+ if (/\b(current hypothesis|hypothesis:|investigate|trying next)\b/.test(normalized)) {
134
+ const placeHint = inferPlaceHint(toolName, normalized);
135
+ reasons.push('active session hypothesis');
136
+ return {
137
+ classification: 'session-only',
138
+ reasons,
139
+ storeRaw: false,
140
+ importance: 'medium',
141
+ wakeUpPriority: 'high',
142
+ placeHint,
143
+ graphHint: inferGraphHint(normalized, content, 'session-only'),
144
+ content,
145
+ contentHash: hashSignalContent(normalized),
146
+ estimatedSavings: 0,
147
+ };
148
+ }
149
+
150
+ if (/\bcorrection:|actually\b|\binstead of\b|\bprefer(s)?\b/.test(normalized)) {
151
+ const placeHint = inferPlaceHint(toolName, normalized);
152
+ reasons.push('correction or preference worth durable retention');
153
+ return {
154
+ classification: 'durable-distilled',
155
+ reasons,
156
+ storeRaw: false,
157
+ importance: 'high',
158
+ wakeUpPriority: 'high',
159
+ placeHint,
160
+ graphHint: inferGraphHint(normalized, content, 'durable-distilled'),
161
+ content,
162
+ contentHash: hashSignalContent(normalized),
163
+ estimatedSavings: estimateNoiseSavings(content, distillSignalEvent({
164
+ toolName,
165
+ command,
166
+ content,
167
+ classification: 'durable-distilled',
168
+ })),
169
+ };
170
+ }
171
+
172
+ if (
173
+ /\b(fail|failed|failing|assertionerror|stack trace|traceback|exception)\b/.test(normalized) ||
174
+ /\b(test|pytest|vitest|jest|bun test)\b/.test(normalized)
175
+ ) {
176
+ const placeHint = inferPlaceHint(toolName, normalized);
177
+ reasons.push('test or debugging signal with nuance-sensitive output');
178
+ return {
179
+ classification: 'durable-raw+distilled',
180
+ reasons,
181
+ storeRaw: true,
182
+ importance: 'high',
183
+ wakeUpPriority: 'high',
184
+ placeHint,
185
+ graphHint: inferGraphHint(normalized, content, 'durable-raw+distilled'),
186
+ content,
187
+ contentHash: hashSignalContent(normalized),
188
+ estimatedSavings: estimateNoiseSavings(content, distillSignalEvent({
189
+ toolName,
190
+ command,
191
+ content,
192
+ classification: 'durable-raw+distilled',
193
+ })),
194
+ };
195
+ }
196
+
197
+ if (['write', 'edit', 'multiedit'].includes(toolName.toLowerCase())) {
198
+ const placeHint = inferPlaceHint(toolName, normalized);
199
+ reasons.push('meaningful file modification');
200
+ return {
201
+ classification: 'durable-distilled',
202
+ reasons,
203
+ storeRaw: false,
204
+ importance: 'medium',
205
+ wakeUpPriority: 'medium',
206
+ placeHint,
207
+ graphHint: inferGraphHint(normalized, content, 'durable-distilled'),
208
+ content,
209
+ contentHash: hashSignalContent(normalized),
210
+ estimatedSavings: estimateNoiseSavings(content, distillSignalEvent({
211
+ toolName,
212
+ command,
213
+ content,
214
+ classification: 'durable-distilled',
215
+ })),
216
+ };
217
+ }
218
+
219
+ reasons.push('session-scoped operational context');
220
+ const placeHint = inferPlaceHint(toolName, normalized);
221
+ return {
222
+ classification: 'session-only',
223
+ reasons,
224
+ storeRaw: false,
225
+ importance: 'low',
226
+ wakeUpPriority: 'low',
227
+ placeHint,
228
+ graphHint: inferGraphHint(normalized, content, 'session-only'),
229
+ content,
230
+ contentHash: hashSignalContent(normalized),
231
+ estimatedSavings: 0,
232
+ };
233
+ }
234
+
235
+ export function distillSignalEvent(input: DistillInput): string {
236
+ const lines = input.content
237
+ .split(/\r?\n/)
238
+ .map((line) => line.trim())
239
+ .filter(Boolean);
240
+
241
+ const important = lines.filter((line) =>
242
+ /\b(fail|error|exception|traceback|assert|stack|correction|prefer|decision|fix|edited|wrote)\b/i.test(line)
243
+ );
244
+
245
+ const selected = important.length > 0 ? important : lines.slice(0, 4);
246
+ const cleaned = selected.filter(
247
+ (line) => !/\b(pass(ing)?|resolved|download(ed|ing)?|progress|packages? added)\b/i.test(line)
248
+ );
249
+
250
+ if (/assertionerror|traceback|exception|stack/i.test(input.content) && !cleaned.some((line) => /assertionerror|traceback|exception|stack/i.test(line))) {
251
+ const extra = lines.find((line) => /assertionerror|traceback|exception|stack/i.test(line));
252
+ if (extra) cleaned.push(extra);
253
+ }
254
+
255
+ return cleaned.slice(0, 6).join('\n');
256
+ }
257
+
258
+ export function shouldReturnRawFallback(input: {
259
+ query: string;
260
+ hasRawFallback: boolean;
261
+ nuanceSuppressed: boolean;
262
+ }): boolean {
263
+ if (!input.hasRawFallback) return false;
264
+ if (input.nuanceSuppressed) return true;
265
+ return /\b(raw|original|full|stack trace|traceback|stderr|stdout|rewind)\b/i.test(input.query);
266
+ }