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
package/dist/config.js CHANGED
@@ -4,239 +4,191 @@ import { fileURLToPath } from 'url';
4
4
  import { dirname } from 'path';
5
5
  const __filename = fileURLToPath(import.meta.url);
6
6
  const __dirname = dirname(__filename);
7
- export function getDataDir() {
8
- const projectRoot = process.env.CLAUDE_WORKING_DIRECTORY || process.cwd();
9
- const dir = process.env.SQUISH_DATA_DIR || join(projectRoot, '.squish');
10
- if (!existsSync(dir))
11
- mkdirSync(dir, { recursive: true });
12
- return dir;
13
- }
14
- // Load settings from config/settings.json
7
+ const EMBEDDINGS_PROVIDERS = ['openai', 'ollama', 'lmstudio', 'transformers', 'local', 'none', 'google', 'auto'];
8
+ const LLM_PROVIDERS = ['openai', 'anthropic', 'ollama', 'lmstudio', 'local'];
9
+ const GRAPH_EXTRACTION_METHODS = ['llm', 'regex', 'auto'];
10
+ const SCHEDULER_MODES = ['cron', 'interval', 'heartbeat'];
11
+ const VISIBILITY_SCOPES = ['private', 'project', 'team', 'global'];
15
12
  function loadSettings() {
16
13
  const settingsPath = join(__dirname, 'config', 'settings.json');
17
14
  try {
18
15
  if (existsSync(settingsPath)) {
19
- const content = readFileSync(settingsPath, 'utf-8');
20
- return JSON.parse(content);
16
+ return JSON.parse(readFileSync(settingsPath, 'utf-8'));
21
17
  }
22
18
  }
23
- catch (error) {
19
+ catch {
24
20
  console.warn('Failed to load settings.json, using defaults');
25
21
  }
26
22
  return {};
27
23
  }
28
24
  const settings = loadSettings();
29
- // Helper to get env var or settings value
30
- function getConfig(path, envVar, defaultValue) {
31
- // Priority 1: Environment variable
32
- if (envVar && process.env[envVar]) {
33
- return process.env[envVar];
34
- }
35
- // Priority 2: Settings file
36
- const keys = path.split('.');
25
+ function readPath(path) {
37
26
  let value = settings;
38
- for (const key of keys) {
27
+ for (const key of path.split('.')) {
39
28
  if (value && typeof value === 'object' && key in value) {
40
29
  value = value[key];
41
30
  }
42
31
  else {
43
- value = undefined;
44
- break;
32
+ return undefined;
45
33
  }
46
34
  }
47
- if (value !== undefined) {
35
+ return value;
36
+ }
37
+ function rawConfig(path, envVar, defaultValue) {
38
+ if (envVar && Object.prototype.hasOwnProperty.call(process.env, envVar)) {
39
+ return process.env[envVar];
40
+ }
41
+ const settingsValue = readPath(path);
42
+ return settingsValue === undefined ? defaultValue : settingsValue;
43
+ }
44
+ function getString(path, envVar, defaultValue) {
45
+ const value = rawConfig(path, envVar, defaultValue);
46
+ return typeof value === 'string' ? value : String(value ?? defaultValue);
47
+ }
48
+ function getBoolean(path, envVar, defaultValue) {
49
+ const value = rawConfig(path, envVar, defaultValue);
50
+ if (typeof value === 'boolean')
48
51
  return value;
52
+ if (typeof value === 'number')
53
+ return value !== 0;
54
+ if (typeof value === 'string') {
55
+ const normalized = value.trim().toLowerCase();
56
+ if (['true', '1', 'yes', 'on'].includes(normalized))
57
+ return true;
58
+ if (['false', '0', 'no', 'off', ''].includes(normalized))
59
+ return false;
49
60
  }
50
- // Priority 3: Default value
51
61
  return defaultValue;
52
62
  }
53
- // Mode detection: local (default), team (cloud with own db), remote (integrations)
54
- // Priority: remote > team > local
55
- const DATABASE_URL = process.env.DATABASE_URL || '';
56
- const SUPABASE_URL = process.env.SUPABASE_URL || '';
57
- const NEON_PROJECT_ID = process.env.NEON_PROJECT_ID || '';
58
- // Determine mode based on environment
63
+ function getNumber(path, envVar, defaultValue) {
64
+ const value = rawConfig(path, envVar, defaultValue);
65
+ const parsed = typeof value === 'number' ? value : Number(value);
66
+ return Number.isFinite(parsed) ? parsed : defaultValue;
67
+ }
68
+ function getEnum(path, envVar, allowed, defaultValue) {
69
+ const value = getString(path, envVar, defaultValue).toLowerCase();
70
+ return allowed.includes(value) ? value : defaultValue;
71
+ }
72
+ export function getDataDir() {
73
+ const projectRoot = process.env.CLAUDE_WORKING_DIRECTORY || process.cwd();
74
+ const dir = getString('data.dir', 'SQUISH_DATA_DIR', join(projectRoot, '.squish'));
75
+ if (!existsSync(dir))
76
+ mkdirSync(dir, { recursive: true });
77
+ return dir;
78
+ }
79
+ const databaseUrl = process.env.DATABASE_URL || '';
80
+ const supabaseUrlEnv = process.env.SUPABASE_URL || '';
81
+ const neonProjectIdEnv = process.env.NEON_PROJECT_ID || '';
59
82
  function detectMode() {
60
- // Remote mode: user has their own Supabase or Neon
61
- if (SUPABASE_URL || NEON_PROJECT_ID) {
83
+ if (supabaseUrlEnv || neonProjectIdEnv)
62
84
  return 'remote';
63
- }
64
- // Team mode: PostgreSQL (self-hosted "local cloud")
65
- if (DATABASE_URL.startsWith('postgres')) {
85
+ if (databaseUrl.startsWith('postgres'))
66
86
  return 'team';
67
- }
68
- // Local mode: default SQLite
69
87
  return 'local';
70
88
  }
71
89
  const detectedMode = detectMode();
72
- const isTeamMode = detectedMode === 'team';
73
- const isRemoteMode = detectedMode === 'remote';
74
- const isLocalMode = detectedMode === 'local';
75
- const isManagedMode = process.env.SQUISH_MANAGED_MODE === 'true';
76
- // Team/Remote backend selection
77
- const teamBackend = (() => {
78
- const explicit = getConfig('team.backend', 'SQUISH_TEAM_BACKEND', '').toLowerCase();
79
- if (explicit === 'supabase' || explicit === 'neon' || explicit === 'postgres') {
80
- return explicit;
81
- }
82
- // Auto-detect based on env vars
83
- if (SUPABASE_URL)
84
- return 'supabase';
85
- if (NEON_PROJECT_ID)
86
- return 'neon';
87
- return 'postgres'; // default to PostgreSQL
88
- })();
89
- const remoteBackend = (() => {
90
- const explicit = getConfig('remote.backend', 'SQUISH_REMOTE_BACKEND', '').toLowerCase();
91
- if (explicit === 'supabase' || explicit === 'neon') {
92
- return explicit;
93
- }
94
- // Auto-detect based on env vars
95
- if (SUPABASE_URL)
96
- return 'supabase';
97
- if (NEON_PROJECT_ID)
98
- return 'neon';
99
- return 'supabase'; // default to Supabase
100
- })();
101
- // Neon configuration
102
- const neonProjectId = process.env.NEON_PROJECT_ID || '';
103
- const neonServiceKey = process.env.NEON_SERVICE_KEY || '';
104
- // Embeddings providers:
105
- // - openai: OpenAI API (requires API key)
106
- // - ollama: Local Ollama server (any model)
107
- // - lmstudio: LM Studio local server (any model)
108
- // - local: TF-IDF offline (no dependencies)
109
- // - none: Disable embeddings (stub)
110
- // - google: Google Cloud embeddings
111
- // - auto: Smart fallback (cloud if available, local fallback)
112
- const VALID_PROVIDERS = new Set(['openai', 'ollama', 'lmstudio', 'local', 'none', 'google', 'auto']);
113
- const embeddingsProvider = (() => {
114
- const explicit = getConfig('embeddings.provider', 'SQUISH_EMBEDDINGS_PROVIDER', 'local').toLowerCase();
115
- if (VALID_PROVIDERS.has(explicit)) {
116
- return explicit;
117
- }
118
- return 'local';
119
- })();
120
- // OpenAI Configuration
121
- const openAiApiKey = process.env.SQUISH_OPENAI_API_KEY || process.env.OPENAI_API_KEY || '';
122
- const openAiApiUrl = getConfig('api.openai.apiUrl', 'SQUISH_OPENAI_API_URL', 'https://api.openai.com/v1/embeddings');
123
- const openAiEmbeddingModel = getConfig('embeddings.models.openai.model', 'SQUISH_OPENAI_EMBEDDING_MODEL', 'text-embedding-3-small');
124
- // Google Configuration
125
- const googleCloudApiKey = process.env.GOOGLE_CLOUD_API_KEY || process.env.SQUISH_GOOGLE_CLOUD_API_KEY || '';
126
- const googleCloudProject = process.env.GOOGLE_CLOUD_PROJECT || process.env.SQUISH_GOOGLE_CLOUD_PROJECT || '';
127
- const googleCloudLocation = process.env.GOOGLE_CLOUD_LOCATION || process.env.SQUISH_GOOGLE_CLOUD_LOCATION || 'us-central1';
128
- const googleEmbeddingModel = getConfig('embeddings.models.google.model', 'SQUISH_GOOGLE_EMBEDDING_MODEL', 'gemini-embedding-001');
129
- // Ollama Configuration
130
- const ollamaUrl = getConfig('api.ollama.url', 'SQUISH_OLLAMA_URL', 'http://localhost:11434');
131
- const ollamaEmbeddingModel = getConfig('embeddings.models.ollama.model', 'SQUISH_OLLAMA_EMBEDDING_MODEL', '');
132
- // LM Studio Configuration (OpenAI-compatible local server)
133
- const lmStudioUrl = getConfig('api.lmstudio.url', 'SQUISH_LM_STUDIO_URL', 'http://localhost:1234');
134
- const lmStudioEmbeddingModel = getConfig('embeddings.models.lmstudio.model', 'SQUISH_LM_STUDIO_EMBEDDING_MODEL', '');
90
+ const embeddingsProvider = getEnum('embeddings.provider', 'SQUISH_EMBEDDINGS_PROVIDER', EMBEDDINGS_PROVIDERS, 'local');
91
+ const llmEnabled = getBoolean('llm.enabled', 'SQUISH_LLM_ENABLED', false);
92
+ const llmProvider = getEnum('llm.provider', 'SQUISH_LLM_PROVIDER', LLM_PROVIDERS, 'openai');
93
+ const llmEndpoint = getString('llm.endpoint', 'SQUISH_LLM_ENDPOINT', '');
94
+ const graphAutoBuild = getBoolean('graph.autoBuild', 'SQUISH_GRAPH_AUTO_BUILD', true);
95
+ const graphExtractionMethod = getEnum('graph.extractionMethod', 'SQUISH_GRAPH_EXTRACTION_METHOD', GRAPH_EXTRACTION_METHODS, 'auto');
96
+ const graphMaxContentLength = getNumber('graph.maxContentLength', 'SQUISH_GRAPH_MAX_CONTENT_LENGTH', 10000);
97
+ const scoringWeights = {
98
+ recency: getNumber('scoring.weights.recency', 'SQUISH_WEIGHT_RECENCY', 0.5),
99
+ relevance: getNumber('scoring.weights.relevance', 'SQUISH_WEIGHT_RELEVANCE', 3),
100
+ importance: getNumber('scoring.weights.importance', 'SQUISH_WEIGHT_IMPORTANCE', 2),
101
+ vectorSim: getNumber('scoring.weights.vectorSim', 'SQUISH_WEIGHT_VECTOR_SIM', 3),
102
+ graphBoost: getNumber('scoring.weights.graphBoost', 'SQUISH_WEIGHT_GRAPH_BOOST', 1.5),
103
+ };
135
104
  export const config = {
136
- // Mode detection
137
105
  mode: detectedMode,
138
- isLocalMode,
139
- isTeamMode,
140
- isRemoteMode,
141
- // Backend selection
142
- teamBackend: teamBackend,
143
- remoteBackend: remoteBackend,
144
- // Legacy support
145
- isManagedMode,
146
- redisEnabled: !!process.env.REDIS_URL,
106
+ isLocalMode: detectedMode === 'local',
107
+ isTeamMode: detectedMode === 'team',
108
+ isRemoteMode: detectedMode === 'remote',
109
+ teamBackend: getEnum('team.backend', 'SQUISH_TEAM_BACKEND', ['postgres', 'supabase', 'neon'], 'postgres'),
110
+ remoteBackend: getEnum('remote.backend', 'SQUISH_REMOTE_BACKEND', ['supabase', 'neon'], 'supabase'),
111
+ isManagedMode: getBoolean('managed.enabled', 'SQUISH_MANAGED_MODE', false),
112
+ managedMode: getBoolean('managed.enabled', 'SQUISH_MANAGED_MODE', false),
113
+ managedApiUrl: getString('managed.apiUrl', 'SQUISH_MANAGED_API_URL', 'https://api.squish.dev'),
114
+ managedApiKey: getString('managed.apiKey', 'SQUISH_MANAGED_API_KEY', ''),
115
+ redisEnabled: Boolean(process.env.REDIS_URL),
147
116
  dataDir: getDataDir(),
148
- mcpServerPort: parseInt(getConfig('mcp.serverPort', 'SQUISH_MCP_PORT', '8767')),
149
- embeddingsProvider: embeddingsProvider,
150
- // OpenAI
151
- openAiApiKey,
152
- openAiApiUrl,
153
- openAiEmbeddingModel,
154
- // Google
155
- googleCloudApiKey,
156
- googleCloudProject,
157
- googleCloudLocation,
158
- googleEmbeddingModel,
159
- // Ollama
160
- ollamaUrl,
161
- ollamaEmbeddingModel,
162
- // LM Studio (OpenAI-compatible local)
163
- lmStudioUrl,
164
- lmStudioEmbeddingModel,
165
- // Supabase configuration
166
- supabaseUrl: getConfig('supabase.url', 'SUPABASE_URL', ''),
167
- supabaseKey: getConfig('supabase.key', 'SUPABASE_SERVICE_KEY', ''),
168
- // Neon configuration
117
+ mcpServerPort: getNumber('mcp.serverPort', 'SQUISH_MCP_PORT', 8767),
118
+ embeddingsProvider,
119
+ openAiApiKey: process.env.SQUISH_OPENAI_API_KEY || process.env.OPENAI_API_KEY || '',
120
+ openAiApiUrl: getString('api.openai.apiUrl', 'SQUISH_OPENAI_API_URL', 'https://api.openai.com/v1/embeddings'),
121
+ openAiEmbeddingModel: getString('embeddings.models.openai.model', 'SQUISH_OPENAI_EMBEDDING_MODEL', ''),
122
+ googleCloudApiKey: process.env.GOOGLE_CLOUD_API_KEY || process.env.SQUISH_GOOGLE_CLOUD_API_KEY || '',
123
+ googleCloudProject: process.env.GOOGLE_CLOUD_PROJECT || process.env.SQUISH_GOOGLE_CLOUD_PROJECT || '',
124
+ googleCloudLocation: process.env.GOOGLE_CLOUD_LOCATION || process.env.SQUISH_GOOGLE_CLOUD_LOCATION || 'us-central1',
125
+ googleEmbeddingModel: getString('embeddings.models.google.model', 'SQUISH_GOOGLE_EMBEDDING_MODEL', ''),
126
+ ollamaUrl: getString('api.ollama.url', 'SQUISH_OLLAMA_URL', 'http://localhost:11434'),
127
+ ollamaEmbeddingModel: getString('embeddings.models.ollama.model', 'SQUISH_OLLAMA_EMBEDDING_MODEL', ''),
128
+ lmStudioUrl: getString('api.lmstudio.url', 'SQUISH_LM_STUDIO_URL', 'http://localhost:1234'),
129
+ lmStudioEmbeddingModel: getString('embeddings.models.lmstudio.model', 'SQUISH_LM_STUDIO_EMBEDDING_MODEL', ''),
130
+ transformersLocalModel: getString('embeddings.models.transformers.model', 'SQUISH_LOCAL_MODEL', ''),
131
+ supabaseUrl: getString('supabase.url', 'SUPABASE_URL', ''),
132
+ supabaseKey: getString('supabase.key', 'SUPABASE_SERVICE_KEY', ''),
169
133
  neonProjectId: process.env.NEON_PROJECT_ID || '',
170
134
  neonServiceKey: process.env.NEON_SERVICE_KEY || '',
171
- // Encryption configuration
172
- clientEncryptionEnabled: getConfig('security.encryptionEnabled', null, false) !== false,
135
+ clientEncryptionEnabled: getBoolean('security.encryptionEnabled', null, false),
173
136
  encryptionPassphrase: process.env.SQUISH_ENCRYPTION_PASSPHRASE || '',
174
- // Lifecycle Management
175
- lifecycleEnabled: getConfig('features.lifecycleEnabled', 'SQUISH_LIFECYCLE_ENABLED', true) !== false,
176
- lifecycleInterval: parseInt(process.env.SQUISH_LIFECYCLE_INTERVAL || '3600000'),
177
- decayThreshold: parseFloat(process.env.SQUISH_DECAY_THRESHOLD || '0.1'),
178
- // Session Summarization
179
- summarizationEnabled: getConfig('features.summarizationEnabled', 'SQUISH_SUMMARIZATION_ENABLED', true) !== false,
180
- incrementalThreshold: parseInt(process.env.SQUISH_INCREMENTAL_THRESHOLD || '10'),
181
- rollingWindowSize: parseInt(process.env.SQUISH_ROLLING_WINDOW_SIZE || '50'),
182
- // Agent-Aware Memory
183
- agentIsolationEnabled: getConfig('features.agentIsolation', 'SQUISH_AGENT_ISOLATION_ENABLED', true) !== false,
184
- defaultVisibilityScope: (process.env.SQUISH_DEFAULT_VISIBILITY || 'private'),
185
- // Memory Governance
186
- governanceEnabled: process.env.SQUISH_GOVERNANCE_ENABLED !== 'false',
187
- // Memory Consolidation
188
- consolidationEnabled: process.env.SQUISH_CONSOLIDATION_ENABLED === 'true',
189
- consolidationSimilarityThreshold: parseFloat(process.env.SQUISH_CONSOLIDATION_THRESHOLD || '0.8'),
190
- // Obsidian Integration (NEW)
191
- obsidianEnabled: process.env.SQUISH_OBSIDIAN_ENABLED === 'true',
192
- obsidianVaultPath: process.env.SQUISH_OBSIDIAN_VAULT_PATH || '',
193
- // External Folder Memory (QMD Wrapper)
194
- externalMemoryEnabled: process.env.SQUISH_EXTERNAL_MEMORY_ENABLED === 'true',
195
- externalMemoryPath: process.env.SQUISH_EXTERNAL_MEMORY_PATH || '',
196
- // DEPRECATED: QMD (kept for backward compat during transition)
197
- qmdEnabled: false, // DEPRECATED - use Obsidian integration instead
198
- qmdCollectionsPath: '', // DEPRECATED
199
- qmdFallbackMode: 'local-only', // DEPRECATED
200
- qmdCollectionMapping: {}, // DEPRECATED
201
- // Managed Mode
202
- managedMode: process.env.SQUISH_MANAGED_MODE === 'true',
203
- managedApiUrl: process.env.SQUISH_MANAGED_API_URL || 'https://api.squish.dev',
204
- managedApiKey: process.env.SQUISH_MANAGED_API_KEY || '',
205
- // Session Auto-Load
206
- sessionAutoLoadEnabled: process.env.SQUISH_SESSION_AUTO_LOAD !== 'false',
207
- sessionAutoLoadRecentCount: parseInt(process.env.SQUISH_SESSION_AUTO_LOAD_RECENT_COUNT || '5'),
208
- sessionAutoLoadImportanceThreshold: parseInt(process.env.SQUISH_SESSION_AUTO_LOAD_IMPORTANCE_THRESHOLD || '70'),
209
- // Query Rewriting
210
- queryRewritingEnabled: process.env.SQUISH_QUERY_REWRITING !== 'false',
211
- queryRewritingContextMessages: parseInt(process.env.SQUISH_QUERY_REWRITING_CONTEXT_MESSAGES || '5'),
212
- queryRewritingFallbackEnabled: process.env.SQUISH_QUERY_REWRITING_FALLBACK !== 'false',
213
- // Feedback Tracking
214
- feedbackTrackingEnabled: process.env.SQUISH_FEEDBACK_TRACKING !== 'false',
215
- feedbackEchoBonus: parseInt(process.env.SQUISH_FEEDBACK_ECHO_BONUS || '10'),
216
- feedbackFizzlePenalty: parseInt(process.env.SQUISH_FEEDBACK_FIZZLE_PENALTY || '5'),
217
- // Scoring Weights (override defaults)
218
- scoringWeights: {
219
- recency: parseFloat(process.env.SQUISH_WEIGHT_RECENCY || '0.5'),
220
- relevance: parseFloat(process.env.SQUISH_WEIGHT_RELEVANCE || '3'),
221
- importance: parseFloat(process.env.SQUISH_WEIGHT_IMPORTANCE || '2'),
222
- vectorSim: parseFloat(process.env.SQUISH_WEIGHT_VECTOR_SIM || '3'),
223
- graphBoost: parseFloat(process.env.SQUISH_WEIGHT_GRAPH_BOOST || '1.5'),
137
+ lifecycleEnabled: getBoolean('features.lifecycleEnabled', 'SQUISH_LIFECYCLE_ENABLED', true),
138
+ lifecycleInterval: getNumber('lifecycle.interval', 'SQUISH_LIFECYCLE_INTERVAL', 3600000),
139
+ decayThreshold: getNumber('lifecycle.decay.threshold', 'SQUISH_DECAY_THRESHOLD', 0.1),
140
+ sectorDecayIntervals: {
141
+ episodic: getNumber('lifecycle.decay.episodic', 'SQUISH_DECAY_EPISODIC', 30),
142
+ semantic: getNumber('lifecycle.decay.semantic', 'SQUISH_DECAY_SEMANTIC', 90),
143
+ procedural: getNumber('lifecycle.decay.procedural', 'SQUISH_DECAY_PROCEDURAL', 180),
144
+ autobiographical: getNumber('lifecycle.decay.autobiographical', 'SQUISH_DECAY_AUTOBIOGRAPHICAL', 365),
145
+ working: getNumber('lifecycle.decay.working', 'SQUISH_DECAY_WORKING', 7),
224
146
  },
225
- // Scheduler
226
- schedulerMode: (process.env.SQUISH_SCHEDULER_MODE || 'cron'),
227
- cronEnabled: process.env.SQUISH_CRON_ENABLED !== 'false',
228
- heartbeatInterval: parseInt(process.env.SQUISH_HEARTBEAT_INTERVAL || '60000'),
229
- jobRetentionDays: parseInt(process.env.SQUISH_JOB_RETENTION_DAYS || '30'),
230
- // Core Memory
231
- coreMemoryTotalBytes: parseInt(process.env.SQUISH_CORE_MEMORY_TOTAL_BYTES || '16384'),
232
- coreMemorySectionBytes: parseInt(process.env.SQUISH_CORE_MEMORY_SECTION_BYTES || '4096'),
233
- // Embeddings Performance
234
- embeddingsTimeoutMs: parseInt(process.env.SQUISH_EMBEDDINGS_TIMEOUT_MS || '30000'),
235
- embeddingsMaxRetries: parseInt(process.env.SQUISH_EMBEDDINGS_MAX_RETRIES || '3'),
236
- embeddingsRetryDelayMs: parseInt(process.env.SQUISH_EMBEDDINGS_RETRY_DELAY_MS || '1000'),
237
- openAiTimeoutMs: parseInt(process.env.SQUISH_OPENAI_TIMEOUT_MS || process.env.SQUISH_EMBEDDINGS_TIMEOUT_MS || '30000'),
238
- ollamaTimeoutMs: parseInt(process.env.SQUISH_OLLAMA_TIMEOUT_MS || process.env.SQUISH_EMBEDDINGS_TIMEOUT_MS || '30000'),
239
- googleTimeoutMs: parseInt(process.env.SQUISH_GOOGLE_TIMEOUT_MS || process.env.SQUISH_EMBEDDINGS_TIMEOUT_MS || '30000'),
147
+ summarizationEnabled: getBoolean('features.summarizationEnabled', 'SQUISH_SUMMARIZATION_ENABLED', true),
148
+ incrementalThreshold: getNumber('summarization.incrementalThreshold', 'SQUISH_INCREMENTAL_THRESHOLD', 10),
149
+ rollingWindowSize: getNumber('summarization.rollingWindowSize', 'SQUISH_ROLLING_WINDOW_SIZE', 50),
150
+ agentIsolationEnabled: getBoolean('features.agentIsolation', 'SQUISH_AGENT_ISOLATION_ENABLED', true),
151
+ defaultVisibilityScope: getEnum('visibility.defaultScope', 'SQUISH_DEFAULT_VISIBILITY', VISIBILITY_SCOPES, 'private'),
152
+ governanceEnabled: getBoolean('features.governanceEnabled', 'SQUISH_GOVERNANCE_ENABLED', true),
153
+ consolidationEnabled: getBoolean('features.consolidationEnabled', 'SQUISH_CONSOLIDATION_ENABLED', false),
154
+ consolidationSimilarityThreshold: getNumber('consolidation.similarityThreshold', 'SQUISH_CONSOLIDATION_THRESHOLD', 0.8),
155
+ obsidianEnabled: getBoolean('features.obsidianEnabled', 'SQUISH_OBSIDIAN_ENABLED', false),
156
+ obsidianVaultPath: getString('obsidian.vaultPath', 'SQUISH_OBSIDIAN_VAULT_PATH', ''),
157
+ externalMemoryEnabled: getBoolean('features.externalMemoryEnabled', 'SQUISH_EXTERNAL_MEMORY_ENABLED', false),
158
+ externalMemoryPath: getString('external.memoryPath', 'SQUISH_EXTERNAL_MEMORY_PATH', ''),
159
+ sessionAutoLoadEnabled: getBoolean('features.sessionAutoLoadEnabled', 'SQUISH_SESSION_AUTO_LOAD', true),
160
+ sessionAutoLoadRecentCount: getNumber('session.autoLoadRecentCount', 'SQUISH_SESSION_AUTO_LOAD_RECENT_COUNT', 5),
161
+ sessionAutoLoadImportanceThreshold: getNumber('session.autoLoadImportanceThreshold', 'SQUISH_SESSION_AUTO_LOAD_IMPORTANCE_THRESHOLD', 70),
162
+ queryRewritingEnabled: getBoolean('features.queryRewritingEnabled', 'SQUISH_QUERY_REWRITING', true),
163
+ queryRewritingContextMessages: getNumber('query.rewritingContextMessages', 'SQUISH_QUERY_REWRITING_CONTEXT_MESSAGES', 5),
164
+ queryRewritingFallbackEnabled: getBoolean('features.queryRewritingFallbackEnabled', 'SQUISH_QUERY_REWRITING_FALLBACK', true),
165
+ feedbackTrackingEnabled: getBoolean('features.feedbackTrackingEnabled', 'SQUISH_FEEDBACK_TRACKING', true),
166
+ feedbackEchoBonus: getNumber('feedback.echoBonus', 'SQUISH_FEEDBACK_ECHO_BONUS', 10),
167
+ feedbackFizzlePenalty: getNumber('feedback.fizzlePenalty', 'SQUISH_FEEDBACK_FIZZLE_PENALTY', 5),
168
+ scoringWeights,
169
+ schedulerMode: getEnum('scheduler.mode', 'SQUISH_SCHEDULER_MODE', SCHEDULER_MODES, 'cron'),
170
+ cronEnabled: getBoolean('scheduler.cronEnabled', 'SQUISH_CRON_ENABLED', true),
171
+ heartbeatInterval: getNumber('scheduler.heartbeatInterval', 'SQUISH_HEARTBEAT_INTERVAL', 60000),
172
+ jobRetentionDays: getNumber('scheduler.jobRetentionDays', 'SQUISH_JOB_RETENTION_DAYS', 30),
173
+ coreMemoryTotalBytes: getNumber('coreMemory.totalBytes', 'SQUISH_CORE_MEMORY_TOTAL_BYTES', 16384),
174
+ coreMemorySectionBytes: getNumber('coreMemory.sectionBytes', 'SQUISH_CORE_MEMORY_SECTION_BYTES', 4096),
175
+ embeddingsTimeoutMs: getNumber('embeddings.timeout', 'SQUISH_EMBEDDINGS_TIMEOUT_MS', 30000),
176
+ embeddingsMaxRetries: getNumber('embeddings.maxRetries', 'SQUISH_EMBEDDINGS_MAX_RETRIES', 3),
177
+ embeddingsRetryDelayMs: getNumber('embeddings.retryDelay', 'SQUISH_EMBEDDINGS_RETRY_DELAY_MS', 1000),
178
+ openAiTimeoutMs: getNumber('embeddings.models.openai.timeout', 'SQUISH_OPENAI_TIMEOUT_MS', getNumber('embeddings.timeout', 'SQUISH_EMBEDDINGS_TIMEOUT_MS', 30000)),
179
+ ollamaTimeoutMs: getNumber('embeddings.models.ollama.timeout', 'SQUISH_OLLAMA_TIMEOUT_MS', getNumber('embeddings.timeout', 'SQUISH_EMBEDDINGS_TIMEOUT_MS', 30000)),
180
+ googleTimeoutMs: getNumber('embeddings.models.google.timeout', 'SQUISH_GOOGLE_TIMEOUT_MS', getNumber('embeddings.timeout', 'SQUISH_EMBEDDINGS_TIMEOUT_MS', 30000)),
181
+ llmEnabled,
182
+ llmApiKey: process.env.SQUISH_LLM_API_KEY || process.env.OPENAI_API_KEY || '',
183
+ llmProvider,
184
+ llmExtractionModel: getString('llm.models.extraction', 'SQUISH_LLM_EXTRACTION_MODEL', ''),
185
+ llmReasoningModel: getString('llm.models.reasoning', 'SQUISH_LLM_REASONING_MODEL', ''),
186
+ llmEndpoint,
187
+ llm: { enabled: llmEnabled, provider: llmProvider, endpoint: llmEndpoint },
188
+ graphAutoBuild,
189
+ graphExtractionMethod,
190
+ graphMaxContentLength,
191
+ graph: { autoBuild: graphAutoBuild, extractionMethod: graphExtractionMethod, maxContentLength: graphMaxContentLength },
240
192
  };
241
193
  export default config;
242
194
  //# sourceMappingURL=config.js.map
@@ -105,49 +105,29 @@ export interface AdapterRegistry {
105
105
  /** Zod schemas for validation */
106
106
  export declare const SessionContextInputSchema: z.ZodObject<{
107
107
  project: z.ZodString;
108
- mode: z.ZodDefault<z.ZodEnum<["startup", "resume", "compact"]>>;
108
+ mode: z.ZodDefault<z.ZodEnum<{
109
+ startup: "startup";
110
+ resume: "resume";
111
+ compact: "compact";
112
+ }>>;
109
113
  sessionId: z.ZodOptional<z.ZodString>;
110
- }, "strip", z.ZodTypeAny, {
111
- project: string;
112
- mode: "resume" | "startup" | "compact";
113
- sessionId?: string | undefined;
114
- }, {
115
- project: string;
116
- mode?: "resume" | "startup" | "compact" | undefined;
117
- sessionId?: string | undefined;
118
- }>;
114
+ }, z.core.$strip>;
119
115
  export declare const ToolObservationInputSchema: z.ZodObject<{
120
116
  toolName: z.ZodString;
121
117
  toolInput: z.ZodRecord<z.ZodString, z.ZodUnknown>;
122
118
  toolResult: z.ZodUnknown;
123
119
  project: z.ZodString;
124
120
  sessionId: z.ZodOptional<z.ZodString>;
125
- }, "strip", z.ZodTypeAny, {
126
- project: string;
127
- toolName: string;
128
- toolInput: Record<string, unknown>;
129
- sessionId?: string | undefined;
130
- toolResult?: unknown;
131
- }, {
132
- project: string;
133
- toolName: string;
134
- toolInput: Record<string, unknown>;
135
- sessionId?: string | undefined;
136
- toolResult?: unknown;
137
- }>;
121
+ }, z.core.$strip>;
138
122
  export declare const TimelineInputSchema: z.ZodObject<{
139
123
  query: z.ZodString;
140
- depth: z.ZodDefault<z.ZodEnum<["index", "timeline", "detail"]>>;
124
+ depth: z.ZodDefault<z.ZodEnum<{
125
+ index: "index";
126
+ timeline: "timeline";
127
+ detail: "detail";
128
+ }>>;
141
129
  limit: z.ZodDefault<z.ZodNumber>;
142
- }, "strip", z.ZodTypeAny, {
143
- query: string;
144
- limit: number;
145
- depth: "index" | "timeline" | "detail";
146
- }, {
147
- query: string;
148
- limit?: number | undefined;
149
- depth?: "index" | "timeline" | "detail" | undefined;
150
- }>;
130
+ }, z.core.$strip>;
151
131
  /** Tool category mapping */
152
132
  export declare const TOOL_CATEGORIES: Record<string, ToolObservationOutput['category']>;
153
133
  /**
@@ -19,7 +19,7 @@ export const SessionContextInputSchema = z.object({
19
19
  });
20
20
  export const ToolObservationInputSchema = z.object({
21
21
  toolName: z.string(),
22
- toolInput: z.record(z.unknown()),
22
+ toolInput: z.record(z.string(), z.unknown()),
23
23
  toolResult: z.unknown(),
24
24
  project: z.string(),
25
25
  sessionId: z.string().optional(),
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Agent Preferences - Accumulate and retrieve agent preferences from learnings
3
+ * Enables agents to learn and evolve over time
4
+ */
5
+ /**
6
+ * Update agent preference from a learning
7
+ */
8
+ export declare function updateAgentPreference(projectId: string, content: string, sourceMemoryId?: string): Promise<void>;
9
+ /**
10
+ * Get all agent preferences for a project
11
+ */
12
+ export declare function getAgentPreferences(projectId: string): Promise<Array<{
13
+ key: string;
14
+ value: string;
15
+ }>>;
16
+ //# sourceMappingURL=agent-preferences.d.ts.map
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Agent Preferences - Accumulate and retrieve agent preferences from learnings
3
+ * Enables agents to learn and evolve over time
4
+ */
5
+ import { getDb } from '../db/index.js';
6
+ import { eq, and } from 'drizzle-orm';
7
+ import { logger } from './logger.js';
8
+ /**
9
+ * Extract preference from learning content
10
+ * E.g., "Prefer bun over npm" -> key: "prefer_bun", value: "bun"
11
+ */
12
+ function extractPreference(content) {
13
+ const patterns = [
14
+ // "Prefer X over Y"
15
+ /prefer\s+(\w+)\s+over\s+(\w+)/i,
16
+ // "Always use X"
17
+ /always\s+use\s+(\w+)/i,
18
+ // "Use X instead of Y"
19
+ /use\s+(\w+)\s+instead\s+of\s+(\w+)/i,
20
+ // "X is better than Y"
21
+ /(\w+)\s+is\s+better\s+than\s+(\w+)/i,
22
+ // "Don't use X"
23
+ /(?:don't|do not|never)\s+use\s+(\w+)/i,
24
+ ];
25
+ for (const pattern of patterns) {
26
+ const match = content.match(pattern);
27
+ if (match) {
28
+ const key = `prefer_${match[1].toLowerCase()}`;
29
+ const value = match[2]?.toLowerCase() || 'true';
30
+ return { key, value };
31
+ }
32
+ }
33
+ return null;
34
+ }
35
+ /**
36
+ * Update agent preference from a learning
37
+ */
38
+ export async function updateAgentPreference(projectId, content, sourceMemoryId) {
39
+ const preference = extractPreference(content);
40
+ if (!preference)
41
+ return;
42
+ try {
43
+ const db = getDb();
44
+ // Check if preference exists
45
+ const existing = await db.query.agentPreferences?.findFirst(and(eq(db.schema.agentPreferences.projectId, projectId), eq(db.schema.agentPreferences.key, preference.key))).catch(() => null);
46
+ if (existing) {
47
+ // Update existing preference
48
+ await db.update(db.schema.agentPreferences)
49
+ .set({
50
+ value: preference.value,
51
+ sourceMemoryId: sourceMemoryId,
52
+ usageCount: (existing.usageCount ?? 0) + 1,
53
+ lastUpdated: Math.floor(Date.now() / 1000)
54
+ })
55
+ .where(eq(db.schema.agentPreferences.id, existing.id))
56
+ .catch(() => {
57
+ // Fallback for SQLite which uses different table name
58
+ const sqlite = db._?.sqlite || db;
59
+ if (sqlite) {
60
+ sqlite.prepare(`
61
+ UPDATE agent_preferences
62
+ SET value = ?, source_memory_id = ?, usage_count = usage_count + 1, last_updated = ?
63
+ WHERE project_id = ? AND key = ?
64
+ `).run(preference.value, sourceMemoryId, Math.floor(Date.now() / 1000), projectId, preference.key);
65
+ }
66
+ });
67
+ logger.info(`[AgentPrefs] Updated preference: ${preference.key} = ${preference.value}`);
68
+ }
69
+ else {
70
+ // Insert new preference
71
+ const id = `pref_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
72
+ await db.insert(db.schema.agentPreferences)
73
+ .values({
74
+ id,
75
+ projectId,
76
+ key: preference.key,
77
+ value: preference.value,
78
+ sourceMemoryId: sourceMemoryId ?? null,
79
+ confidence: 0.5,
80
+ usageCount: 1
81
+ })
82
+ .catch(() => {
83
+ // Fallback for SQLite
84
+ const sqlite = db._?.sqlite || db;
85
+ if (sqlite) {
86
+ sqlite.prepare(`
87
+ INSERT INTO agent_preferences (id, project_id, key, value, source_memory_id, confidence, usage_count)
88
+ VALUES (?, ?, ?, ?, ?, 0.5, 1)
89
+ `).run(id, projectId, preference.key, preference.value, sourceMemoryId ?? null);
90
+ }
91
+ });
92
+ logger.info(`[AgentPrefs] Created preference: ${preference.key} = ${preference.value}`);
93
+ }
94
+ }
95
+ catch (error) {
96
+ logger.warn(`[AgentPrefs] Failed to update preference:`, error);
97
+ }
98
+ }
99
+ /**
100
+ * Get all agent preferences for a project
101
+ */
102
+ export async function getAgentPreferences(projectId) {
103
+ try {
104
+ const db = getDb();
105
+ const results = await db.query.agentPreferences?.findMany({
106
+ where: eq(db.schema.agentPreferences.projectId, projectId)
107
+ }).catch(() => []);
108
+ if (results && results.length > 0) {
109
+ return results.map(p => ({ key: p.key, value: p.value }));
110
+ }
111
+ // Fallback for SQLite
112
+ const sqlite = db._?.sqlite || db;
113
+ if (sqlite) {
114
+ const rows = sqlite.prepare('SELECT key, value FROM agent_preferences WHERE project_id = ?').all(projectId);
115
+ return rows.map(r => ({ key: r.key, value: r.value }));
116
+ }
117
+ return [];
118
+ }
119
+ catch (error) {
120
+ logger.warn(`[AgentPrefs] Failed to get preferences:`, error);
121
+ return [];
122
+ }
123
+ }
124
+ //# sourceMappingURL=agent-preferences.js.map
@@ -3,11 +3,7 @@
3
3
  * Checks run before creating merge proposals and are categorized as BLOCKER or WARNING.
4
4
  */
5
5
  import type { Memory } from '../../../db/drizzle/schema.js';
6
- export interface SafetyCheckResult {
7
- passed: boolean;
8
- warnings: string[];
9
- blockers: string[];
10
- }
6
+ import type { SafetyCheckResult } from '../../lib/types.js';
11
7
  export interface SafetyCheck {
12
8
  name: string;
13
9
  description: string;
@@ -102,14 +102,6 @@ export interface ProjectMergeStatistics {
102
102
  };
103
103
  averageMergeSize: number;
104
104
  }
105
- /**
106
- * Merge safety check result
107
- */
108
- export interface SafetyCheckResult {
109
- passed: boolean;
110
- warnings: string[];
111
- blockers: string[];
112
- }
113
105
  /**
114
106
  * Hash cache entry for fast duplicate detection
115
107
  */