squish-memory 1.0.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (704) hide show
  1. package/.env.example +146 -0
  2. package/CHANGELOG.md +202 -0
  3. package/README.md +192 -287
  4. package/{scripts → bin}/dependency-manager.mjs +217 -217
  5. package/{scripts → bin}/detect-clients.mjs +78 -78
  6. package/bin/install-interactive.mjs +321 -0
  7. package/bin/squish-mcp.mjs +46 -0
  8. package/bin/squish.mjs +33 -0
  9. package/config/mcp-migration-map.json +1 -6
  10. package/config/mcp-mode-semantics.json +10 -12
  11. package/config/mcp-remote-auth.json +3 -26
  12. package/config/mcp-universal.schema.json +5 -35
  13. package/config/settings.json +78 -22
  14. package/config.js +5 -0
  15. package/config.ts +218 -0
  16. package/core/adapters/config/claude-code.ts +133 -0
  17. package/core/adapters/config/cursor.ts +90 -0
  18. package/core/adapters/config/opencode.ts +89 -0
  19. package/core/adapters/config/windsurf.ts +90 -0
  20. package/core/adapters/index.ts +102 -0
  21. package/core/adapters/timeline.ts +116 -0
  22. package/core/adapters/types.ts +166 -0
  23. package/core/agent-preferences.ts +140 -0
  24. package/core/algorithms/analytics/token-estimator.ts +216 -0
  25. package/core/algorithms/detection/hash-filters.ts +260 -0
  26. package/core/algorithms/detection/semantic-ranker.ts +194 -0
  27. package/core/algorithms/detection/two-stage-detector.ts +421 -0
  28. package/core/algorithms/handlers/approve-merge.ts +215 -0
  29. package/core/algorithms/handlers/detect-duplicates.ts +192 -0
  30. package/core/algorithms/handlers/get-stats.ts +132 -0
  31. package/core/algorithms/handlers/list-proposals.ts +130 -0
  32. package/core/algorithms/handlers/preview-merge.ts +139 -0
  33. package/core/algorithms/handlers/reject-merge.ts +93 -0
  34. package/core/algorithms/handlers/reverse-merge.ts +155 -0
  35. package/core/algorithms/index.ts +39 -0
  36. package/core/algorithms/operations/cache-maintenance.ts +182 -0
  37. package/core/algorithms/safety/safety-checks.ts +256 -0
  38. package/core/algorithms/strategies/merge-strategies.ts +381 -0
  39. package/core/algorithms/types.ts +140 -0
  40. package/core/algorithms/utils/response-builder.ts +61 -0
  41. package/core/associations.ts +363 -0
  42. package/core/beliefs/decay.ts +289 -0
  43. package/core/beliefs/extractor.ts +131 -0
  44. package/core/beliefs/store.ts +557 -0
  45. package/core/beliefs/types.ts +38 -0
  46. package/core/commands/mcp-server.ts +5 -0
  47. package/core/compression.ts +177 -0
  48. package/core/config.js +2 -0
  49. package/core/consolidation.ts +330 -0
  50. package/core/context/agent-context.ts +388 -0
  51. package/core/context/context-paging.ts +449 -0
  52. package/core/context/context-window.ts +234 -0
  53. package/core/context/context.ts +35 -0
  54. package/core/embeddings/embeddings.ts +616 -0
  55. package/core/embeddings/google-multimodal.ts +200 -0
  56. package/core/embeddings/local-embeddings.ts +12 -0
  57. package/core/embeddings/qmd-client.ts +495 -0
  58. package/core/embeddings/transformers-local.ts +261 -0
  59. package/core/embeddings.js +4 -0
  60. package/core/error-handling.ts +206 -0
  61. package/core/external +219 -0
  62. package/core/graph/entity-deduplicator.ts +232 -0
  63. package/core/graph/graph-builder.ts +257 -0
  64. package/core/graph/graph-traversal.ts +490 -0
  65. package/core/graph/index.ts +24 -0
  66. package/core/graph/llm-entity-extractor.ts +402 -0
  67. package/core/graph/multi-hop-retrieval.ts +317 -0
  68. package/core/graph/relationship-extractor.ts +465 -0
  69. package/core/hooks/agent-hooks.ts +653 -0
  70. package/core/hooks/auto-tagger.ts +149 -0
  71. package/core/hooks/capture-filter.ts +169 -0
  72. package/core/hot-cache.ts +388 -0
  73. package/core/index.ts +10 -0
  74. package/core/ingestion/agent-memory.ts +167 -0
  75. package/core/ingestion/core-memory.ts +326 -0
  76. package/core/ingestion/learnings.ts +260 -0
  77. package/core/ingestion/signal-engine.ts +266 -0
  78. package/core/integrations/obsidian-vault.ts +197 -0
  79. package/core/layers/generator.ts +115 -0
  80. package/core/lib/db-client.ts +168 -0
  81. package/core/lib/parse-embedding.ts +59 -0
  82. package/core/lib/schemas.ts +102 -0
  83. package/core/lib/types.ts +49 -0
  84. package/core/lib/utils.ts +151 -0
  85. package/core/lib/validation.ts +180 -0
  86. package/core/lifecycle.ts +353 -0
  87. package/core/logger.ts +59 -0
  88. package/core/memory/bridge-discovery.ts +395 -0
  89. package/core/memory/categorizer.ts +390 -0
  90. package/core/memory/conflict-detector.ts +62 -0
  91. package/core/memory/consolidation.ts +372 -0
  92. package/core/memory/context-collector.ts +75 -0
  93. package/core/memory/contradiction-resolver.ts +494 -0
  94. package/core/memory/edit-workflow.ts +174 -0
  95. package/core/memory/entity-extractor.ts +426 -0
  96. package/core/memory/entity-resolver.ts +89 -0
  97. package/core/memory/explain.ts +112 -0
  98. package/core/memory/fact-deriver.ts +300 -0
  99. package/core/memory/fact-extractor.ts +120 -0
  100. package/core/memory/feedback-tracker.ts +200 -0
  101. package/core/memory/hooks.ts +230 -0
  102. package/core/memory/hybrid-retrieval.ts +65 -0
  103. package/core/memory/hybrid-scorer.ts +325 -0
  104. package/core/memory/hybrid-search.ts +748 -0
  105. package/core/memory/importance.ts +319 -0
  106. package/core/memory/index.ts +11 -0
  107. package/core/memory/loader.ts +178 -0
  108. package/core/memory/markdown/markdown-storage.ts +318 -0
  109. package/core/memory/memories.ts +565 -0
  110. package/core/memory/memory-lifecycle.ts +51 -0
  111. package/core/memory/memory-manager.ts +53 -0
  112. package/core/memory/migrate.ts +173 -0
  113. package/core/memory/normalization.ts +30 -0
  114. package/core/memory/path-strengthener.ts +211 -0
  115. package/core/memory/progressive-disclosure.ts +392 -0
  116. package/core/memory/query-processor.ts +130 -0
  117. package/core/memory/query-rewriter.ts +153 -0
  118. package/core/memory/response-analyzer.ts +81 -0
  119. package/core/memory/retrieval-feedback.ts +276 -0
  120. package/core/memory/serialization.ts +83 -0
  121. package/core/memory/stale-cleaner.ts +147 -0
  122. package/core/memory/stats.ts +181 -0
  123. package/core/memory/telemetry.ts +392 -0
  124. package/core/memory/temporal-facts.ts +356 -0
  125. package/core/memory/temporal-parser.ts +477 -0
  126. package/core/memory/trigger-detector.ts +104 -0
  127. package/core/memory/write-gate.ts +288 -0
  128. package/core/places/index.ts +14 -0
  129. package/core/places/memory-places.ts +339 -0
  130. package/core/places/places.ts +406 -0
  131. package/core/places/rules.ts +308 -0
  132. package/core/places/walking.ts +192 -0
  133. package/core/projects +89 -0
  134. package/core/projects.ts +131 -0
  135. package/core/redis.ts +82 -0
  136. package/core/responses.ts +187 -0
  137. package/core/runtime/trust-report.ts +195 -0
  138. package/core/runtime/trust-state.ts +360 -0
  139. package/core/scheduler/cron-scheduler.ts +581 -0
  140. package/core/scheduler/heartbeat.ts +91 -0
  141. package/core/scheduler/index.ts +8 -0
  142. package/core/scheduler/job-runner.ts +197 -0
  143. package/core/search/conversations.ts +166 -0
  144. package/core/search/entities.ts +46 -0
  145. package/core/search/folder-context.ts +154 -0
  146. package/core/search/graph-boost.ts +22 -0
  147. package/core/search/index.ts +4 -0
  148. package/core/search/qmd-wrapper.ts +84 -0
  149. package/core/security/encrypt.ts +51 -0
  150. package/core/security/governance.ts +102 -0
  151. package/core/security/privacy.ts +108 -0
  152. package/core/security/secret-detector.ts +122 -0
  153. package/core/session/auto-load.ts +160 -0
  154. package/core/session/entity-tracker.ts +363 -0
  155. package/core/session/index.ts +7 -0
  156. package/core/session/reference-resolver.ts +158 -0
  157. package/core/session/self-iteration-job.ts +478 -0
  158. package/core/session/session-hooks.ts +69 -0
  159. package/core/session/types.ts +36 -0
  160. package/core/session/working-set.ts +275 -0
  161. package/core/snapshots/cleanup.ts +13 -0
  162. package/core/snapshots/comparison.ts +59 -0
  163. package/core/snapshots/creation.ts +139 -0
  164. package/core/snapshots/retrieval.ts +44 -0
  165. package/core/snapshots/stats.ts +63 -0
  166. package/core/storage/cache.ts +241 -0
  167. package/core/storage/database.ts +23 -0
  168. package/core/summarization/cleanup.ts +13 -0
  169. package/core/summarization/queries.ts +32 -0
  170. package/core/summarization/stats.ts +64 -0
  171. package/core/summarization/strategies.ts +52 -0
  172. package/core/summarization.ts +248 -0
  173. package/core/temporal-facts.ts +244 -0
  174. package/core/tracing/collector.ts +470 -0
  175. package/core/tracing/visualizer.ts +195 -0
  176. package/core/utils/cleanup-operations.ts +50 -0
  177. package/core/utils/content-extraction.ts +95 -0
  178. package/core/utils/filter-builder.ts +56 -0
  179. package/core/utils/history-traversal.ts +63 -0
  180. package/core/utils/memory-operations.ts +56 -0
  181. package/core/utils/query-operations.ts +83 -0
  182. package/core/utils/summarization-helpers.ts +45 -0
  183. package/core/utils/temporal-queries.ts +39 -0
  184. package/core/utils/vector-operations.ts +135 -0
  185. package/core/utils/version-management.ts +74 -0
  186. package/core/worker.ts +324 -0
  187. package/db/adapter.ts +215 -0
  188. package/db/bootstrap.ts +1055 -0
  189. package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
  190. package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
  191. package/db/drizzle/migrations/meta/_journal.json +13 -0
  192. package/db/drizzle/schema-sqlite.ts +1032 -0
  193. package/db/drizzle/schema.ts +1128 -0
  194. package/db/drizzle.config.ts +12 -0
  195. package/db/index.ts +83 -0
  196. package/db/init.sql +5 -0
  197. package/db/migrations/associations.ts +35 -0
  198. package/db/migrations/beliefs.ts +89 -0
  199. package/db/migrations/core-memory.ts +35 -0
  200. package/db/migrations/fts.ts +59 -0
  201. package/db/migrations/index.ts +54 -0
  202. package/db/migrations/indexes.ts +36 -0
  203. package/db/migrations/learnings.ts +34 -0
  204. package/db/migrations/maintenance.ts +68 -0
  205. package/db/migrations/memories.ts +22 -0
  206. package/db/migrations/memory-places.ts +35 -0
  207. package/db/migrations/places.ts +49 -0
  208. package/db/migrations/projects.ts +21 -0
  209. package/db/migrations/tier-conversion.ts +24 -0
  210. package/db/neon.ts +22 -0
  211. package/db/schema/beliefs.ts +50 -0
  212. package/db/schema/generator.ts +159 -0
  213. package/db/schema/index.ts +58 -0
  214. package/db/schema/learnings.ts +32 -0
  215. package/db/schema/memories.ts +83 -0
  216. package/db/schema/projects.ts +33 -0
  217. package/db/schema.ts +13 -0
  218. package/db/supabase.ts +27 -0
  219. package/dist/config.d.ts +61 -14
  220. package/dist/config.js +159 -139
  221. package/dist/core/adapters/config/claude-code.d.ts +45 -0
  222. package/dist/core/adapters/config/claude-code.js +113 -0
  223. package/dist/core/adapters/config/cursor.d.ts +26 -0
  224. package/dist/core/adapters/config/cursor.js +74 -0
  225. package/dist/core/adapters/config/opencode.d.ts +23 -0
  226. package/dist/core/adapters/config/opencode.js +73 -0
  227. package/dist/core/adapters/config/windsurf.d.ts +26 -0
  228. package/dist/core/adapters/config/windsurf.js +74 -0
  229. package/dist/core/adapters/index.d.ts +45 -0
  230. package/dist/core/adapters/index.js +84 -0
  231. package/dist/core/adapters/scripts/install-adapter.d.ts +19 -0
  232. package/dist/core/adapters/scripts/install-adapter.js +149 -0
  233. package/dist/core/adapters/timeline.d.ts +23 -0
  234. package/dist/core/adapters/timeline.js +88 -0
  235. package/dist/core/adapters/types.d.ts +137 -0
  236. package/dist/core/adapters/types.js +50 -0
  237. package/dist/core/agent-preferences.d.ts +16 -0
  238. package/dist/core/agent-preferences.js +124 -0
  239. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.d.ts +1 -1
  240. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.js +3 -3
  241. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.d.ts +1 -1
  242. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.js +1 -1
  243. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.d.ts +1 -1
  244. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.js +7 -10
  245. package/dist/{algorithms → core/algorithms}/handlers/approve-merge.js +4 -4
  246. package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.js +3 -3
  247. package/dist/{algorithms → core/algorithms}/handlers/get-stats.js +3 -3
  248. package/dist/{algorithms → core/algorithms}/handlers/list-proposals.js +3 -3
  249. package/dist/{algorithms → core/algorithms}/handlers/preview-merge.js +3 -3
  250. package/dist/{algorithms → core/algorithms}/handlers/reject-merge.js +3 -3
  251. package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.js +3 -3
  252. package/dist/core/algorithms/index.d.ts +21 -0
  253. package/dist/core/algorithms/index.js +26 -0
  254. package/dist/core/algorithms/operations/cache-maintenance.d.ts +12 -0
  255. package/dist/core/algorithms/operations/cache-maintenance.js +157 -0
  256. package/dist/{algorithms → core/algorithms}/safety/safety-checks.d.ts +2 -6
  257. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.d.ts +19 -1
  258. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.js +74 -123
  259. package/dist/core/algorithms/types.d.ts +125 -0
  260. package/dist/core/algorithms/types.js +5 -0
  261. package/dist/core/associations.d.ts +3 -2
  262. package/dist/core/associations.js +37 -2
  263. package/dist/core/autosave.d.ts +19 -0
  264. package/dist/core/autosave.js +16 -0
  265. package/dist/core/beliefs/decay.d.ts +27 -0
  266. package/dist/core/beliefs/decay.js +217 -0
  267. package/dist/core/beliefs/extractor.d.ts +9 -0
  268. package/dist/core/beliefs/extractor.js +113 -0
  269. package/dist/core/beliefs/store.d.ts +46 -0
  270. package/dist/core/beliefs/store.js +466 -0
  271. package/dist/core/beliefs/types.d.ts +28 -0
  272. package/dist/core/beliefs/types.js +2 -0
  273. package/dist/core/commands/mcp-server.d.ts +2 -0
  274. package/dist/core/commands/mcp-server.js +6 -0
  275. package/dist/core/commands/remember.d.ts +24 -0
  276. package/dist/core/commands/remember.js +144 -0
  277. package/dist/core/compression.d.ts +45 -0
  278. package/dist/core/compression.js +160 -0
  279. package/dist/core/context/agent-context.d.ts +106 -0
  280. package/dist/core/context/agent-context.js +274 -0
  281. package/dist/core/{context-paging.d.ts → context/context-paging.d.ts} +2 -12
  282. package/dist/core/{context-paging.js → context/context-paging.js} +19 -39
  283. package/dist/core/context/context-window.d.ts +40 -0
  284. package/dist/core/context/context-window.js +177 -0
  285. package/dist/core/context/context.js +22 -0
  286. package/dist/core/embeddings/embeddings.d.ts +29 -0
  287. package/dist/core/embeddings/embeddings.js +546 -0
  288. package/dist/core/embeddings/google-multimodal.js +6 -2
  289. package/dist/core/embeddings/local-embeddings.d.ts +11 -0
  290. package/dist/core/embeddings/local-embeddings.js +11 -0
  291. package/dist/core/embeddings/qmd-client.js +1 -1
  292. package/dist/core/embeddings/transformers-local.d.ts +64 -0
  293. package/dist/core/embeddings/transformers-local.js +213 -0
  294. package/dist/core/embeddings.d.ts +1 -28
  295. package/dist/core/embeddings.js +2 -401
  296. package/dist/core/error-handling.d.ts +63 -0
  297. package/dist/core/error-handling.js +173 -0
  298. package/dist/core/graph/entity-deduplicator.d.ts +24 -0
  299. package/dist/core/graph/entity-deduplicator.js +183 -0
  300. package/dist/core/graph/graph-builder.d.ts +46 -0
  301. package/dist/core/graph/graph-builder.js +174 -0
  302. package/dist/core/graph/graph-traversal.d.ts +80 -0
  303. package/dist/core/graph/graph-traversal.js +315 -0
  304. package/dist/core/graph/index.d.ts +19 -0
  305. package/dist/core/graph/index.js +13 -0
  306. package/dist/core/graph/llm-entity-extractor.d.ts +49 -0
  307. package/dist/core/graph/llm-entity-extractor.js +313 -0
  308. package/dist/core/graph/multi-hop-retrieval.d.ts +48 -0
  309. package/dist/core/graph/multi-hop-retrieval.js +215 -0
  310. package/dist/core/graph/relationship-extractor.d.ts +48 -0
  311. package/dist/core/graph/relationship-extractor.js +351 -0
  312. package/dist/core/hooks/agent-hooks.d.ts +83 -0
  313. package/dist/core/hooks/agent-hooks.js +521 -0
  314. package/dist/core/hooks/auto-tagger.d.ts +19 -0
  315. package/dist/core/hooks/auto-tagger.js +155 -0
  316. package/dist/core/hooks/capture-filter.d.ts +41 -0
  317. package/dist/core/hooks/capture-filter.js +128 -0
  318. package/dist/core/hot-cache.d.ts +86 -0
  319. package/dist/core/hot-cache.js +285 -0
  320. package/dist/core/index.d.ts +9 -9
  321. package/dist/core/index.js +9 -12
  322. package/dist/core/{agent-memory.js → ingestion/agent-memory.js} +5 -7
  323. package/dist/core/{core-memory.d.ts → ingestion/core-memory.d.ts} +2 -2
  324. package/dist/core/{core-memory.js → ingestion/core-memory.js} +7 -7
  325. package/dist/core/ingestion/learnings.d.ts +57 -0
  326. package/dist/core/ingestion/learnings.js +205 -0
  327. package/dist/core/ingestion/signal-engine.d.ts +41 -0
  328. package/dist/core/ingestion/signal-engine.js +201 -0
  329. package/dist/core/integrations/obsidian-vault.d.ts +31 -0
  330. package/dist/core/integrations/obsidian-vault.js +156 -0
  331. package/dist/core/lib/db-client.d.ts +114 -0
  332. package/dist/core/lib/db-client.js +130 -0
  333. package/dist/core/lib/parse-embedding.d.ts +9 -0
  334. package/dist/core/lib/parse-embedding.js +58 -0
  335. package/dist/core/lib/schemas.d.ts +132 -0
  336. package/dist/core/lib/schemas.js +87 -0
  337. package/dist/core/lib/types.d.ts +45 -0
  338. package/dist/core/lib/types.js +6 -0
  339. package/dist/core/{utils.d.ts → lib/utils.d.ts} +5 -0
  340. package/dist/core/lib/utils.js +145 -0
  341. package/dist/core/lib/validation.d.ts +38 -0
  342. package/dist/core/lib/validation.js +151 -0
  343. package/dist/core/lifecycle.d.ts +7 -1
  344. package/dist/core/lifecycle.js +152 -42
  345. package/dist/core/logger.d.ts +1 -0
  346. package/dist/core/logger.js +13 -1
  347. package/dist/core/mcp/tools.d.ts +0 -2
  348. package/dist/core/mcp/tools.js +35 -90
  349. package/dist/core/mcp/types.d.ts +25 -253
  350. package/dist/core/mcp/types.js +2 -2
  351. package/dist/core/memory/categorizer.js +2 -0
  352. package/dist/core/memory/conflict-detector.js +1 -1
  353. package/dist/core/memory/consolidation.d.ts +1 -10
  354. package/dist/core/memory/consolidation.js +4 -39
  355. package/dist/core/memory/context-collector.js +1 -1
  356. package/dist/core/memory/edit-workflow.js +1 -1
  357. package/dist/core/memory/entity-extractor.d.ts +4 -0
  358. package/dist/core/memory/entity-extractor.js +30 -16
  359. package/dist/core/memory/entity-resolver.js +7 -7
  360. package/dist/core/memory/explain.d.ts +18 -0
  361. package/dist/core/memory/explain.js +92 -0
  362. package/dist/core/memory/fact-deriver.d.ts +31 -0
  363. package/dist/core/memory/fact-deriver.js +236 -0
  364. package/dist/core/memory/fact-extractor.js +12 -12
  365. package/dist/core/memory/feedback-tracker.js +1 -1
  366. package/dist/core/memory/hooks.d.ts +88 -0
  367. package/dist/core/memory/hooks.js +174 -0
  368. package/dist/core/memory/hybrid-retrieval.d.ts +14 -16
  369. package/dist/core/memory/hybrid-retrieval.js +25 -127
  370. package/dist/core/memory/hybrid-scorer.js +6 -23
  371. package/dist/core/memory/hybrid-search.d.ts +9 -11
  372. package/dist/core/memory/hybrid-search.js +496 -273
  373. package/dist/core/memory/importance.d.ts +2 -24
  374. package/dist/core/memory/importance.js +7 -91
  375. package/dist/core/memory/index.d.ts +1 -0
  376. package/dist/core/memory/index.js +1 -0
  377. package/dist/core/memory/loader.d.ts +31 -0
  378. package/dist/core/memory/loader.js +141 -0
  379. package/dist/core/memory/markdown/markdown-storage.d.ts +72 -0
  380. package/dist/core/memory/markdown/markdown-storage.js +243 -0
  381. package/dist/core/memory/memories.d.ts +23 -19
  382. package/dist/core/memory/memories.js +243 -228
  383. package/dist/core/memory/memory-lifecycle.d.ts +8 -0
  384. package/dist/core/memory/memory-lifecycle.js +47 -0
  385. package/dist/core/memory/migrate.d.ts +21 -0
  386. package/dist/core/memory/migrate.js +134 -0
  387. package/dist/core/memory/normalization.d.ts +7 -0
  388. package/dist/core/memory/normalization.js +26 -0
  389. package/dist/core/memory/path-strengthener.d.ts +39 -0
  390. package/dist/core/memory/path-strengthener.js +150 -0
  391. package/dist/core/memory/progressive-disclosure.js +1 -1
  392. package/dist/core/memory/query-processor.js +37 -3
  393. package/dist/core/memory/query-rewriter.js +9 -9
  394. package/dist/core/memory/retrieval-feedback.d.ts +70 -0
  395. package/dist/core/memory/retrieval-feedback.js +213 -0
  396. package/dist/core/memory/serialization.d.ts +4 -0
  397. package/dist/core/memory/serialization.js +49 -0
  398. package/dist/core/memory/stale-cleaner.d.ts +26 -0
  399. package/dist/core/memory/stale-cleaner.js +97 -0
  400. package/dist/core/memory/stats.d.ts +15 -0
  401. package/dist/core/memory/stats.js +69 -13
  402. package/dist/core/memory/temporal-facts.js +21 -0
  403. package/dist/core/memory/trigger-detector.d.ts +8 -1
  404. package/dist/core/memory/trigger-detector.js +42 -5
  405. package/dist/core/memory/write-gate.js +1 -1
  406. package/dist/core/places/index.d.ts +14 -0
  407. package/dist/core/places/index.js +14 -0
  408. package/dist/core/places/memory-places.d.ts +68 -0
  409. package/dist/core/places/memory-places.js +261 -0
  410. package/dist/core/places/places.d.ts +88 -0
  411. package/dist/core/places/places.js +314 -0
  412. package/dist/core/places/rules.d.ts +74 -0
  413. package/dist/core/places/rules.js +240 -0
  414. package/dist/core/places/walking.d.ts +56 -0
  415. package/dist/core/places/walking.js +121 -0
  416. package/dist/core/projects.d.ts +5 -0
  417. package/dist/core/projects.js +47 -18
  418. package/dist/core/responses.d.ts +96 -0
  419. package/dist/core/responses.js +122 -0
  420. package/dist/core/runtime/trust-report.d.ts +102 -0
  421. package/dist/core/runtime/trust-report.js +107 -0
  422. package/dist/core/runtime/trust-state.d.ts +12 -0
  423. package/dist/core/runtime/trust-state.js +309 -0
  424. package/dist/core/scheduler/cron-scheduler.d.ts +1 -1
  425. package/dist/core/scheduler/cron-scheduler.js +193 -10
  426. package/dist/core/scheduler/index.d.ts +1 -1
  427. package/dist/core/scheduler/index.js +1 -1
  428. package/dist/core/scheduler/job-runner.js +2 -2
  429. package/dist/core/search/conversations.js +40 -42
  430. package/dist/core/search/entities.js +6 -9
  431. package/dist/core/search/graph-boost.d.ts +7 -0
  432. package/dist/core/search/graph-boost.js +23 -0
  433. package/dist/core/search/qmd-wrapper.d.ts +36 -0
  434. package/dist/core/search/qmd-wrapper.js +58 -0
  435. package/dist/core/security/encrypt.d.ts +6 -0
  436. package/dist/core/security/encrypt.js +47 -0
  437. package/dist/core/{governance.d.ts → security/governance.d.ts} +6 -1
  438. package/dist/core/security/governance.js +79 -0
  439. package/dist/core/session/auto-load.js +34 -9
  440. package/dist/core/session/entity-tracker.d.ts +62 -0
  441. package/dist/core/session/entity-tracker.js +287 -0
  442. package/dist/core/session/index.d.ts +1 -1
  443. package/dist/core/session/index.js +1 -1
  444. package/dist/core/session/reference-resolver.d.ts +26 -0
  445. package/dist/core/session/reference-resolver.js +121 -0
  446. package/dist/core/{session-hooks → session}/self-iteration-job.d.ts +15 -0
  447. package/dist/core/{session-hooks → session}/self-iteration-job.js +195 -90
  448. package/dist/core/session/working-set.d.ts +50 -0
  449. package/dist/core/session/working-set.js +212 -0
  450. package/dist/core/snapshots/creation.d.ts +2 -8
  451. package/dist/core/snapshots/creation.js +3 -12
  452. package/dist/core/{cache.js → storage/cache.js} +2 -2
  453. package/dist/core/utils/memory-operations.js +1 -1
  454. package/dist/core/utils/summarization-helpers.d.ts +0 -4
  455. package/dist/core/utils/summarization-helpers.js +1 -6
  456. package/dist/core/utils/vector-operations.d.ts +71 -0
  457. package/dist/core/utils/vector-operations.js +129 -0
  458. package/dist/db/adapter.d.ts +3 -3
  459. package/dist/db/adapter.js +99 -88
  460. package/dist/db/bootstrap.d.ts +2 -0
  461. package/dist/db/bootstrap.js +921 -674
  462. package/dist/{drizzle → db/drizzle}/schema-sqlite.d.ts +775 -25
  463. package/dist/{drizzle → db/drizzle}/schema-sqlite.js +170 -24
  464. package/dist/{drizzle → db/drizzle}/schema.d.ts +731 -32
  465. package/dist/{drizzle → db/drizzle}/schema.js +192 -32
  466. package/dist/db/drizzle.config.d.ts +3 -0
  467. package/dist/db/drizzle.config.js +12 -0
  468. package/dist/db/index.d.ts +1 -5
  469. package/dist/db/index.js +51 -8
  470. package/dist/db/migrations/associations.d.ts +6 -0
  471. package/dist/db/migrations/associations.js +29 -0
  472. package/dist/db/migrations/beliefs.d.ts +10 -0
  473. package/dist/db/migrations/beliefs.js +76 -0
  474. package/dist/db/migrations/core-memory.d.ts +6 -0
  475. package/dist/db/migrations/core-memory.js +29 -0
  476. package/dist/db/migrations/fts.d.ts +6 -0
  477. package/dist/db/migrations/fts.js +52 -0
  478. package/dist/db/migrations/index.d.ts +25 -0
  479. package/dist/db/migrations/index.js +51 -0
  480. package/dist/db/migrations/indexes.d.ts +6 -0
  481. package/dist/db/migrations/indexes.js +30 -0
  482. package/dist/db/migrations/learnings.d.ts +7 -0
  483. package/dist/db/migrations/learnings.js +26 -0
  484. package/dist/db/migrations/maintenance.d.ts +6 -0
  485. package/dist/db/migrations/maintenance.js +61 -0
  486. package/dist/db/migrations/memories.d.ts +7 -0
  487. package/dist/db/migrations/memories.js +16 -0
  488. package/dist/db/migrations/memory-places.d.ts +6 -0
  489. package/dist/db/migrations/memory-places.js +29 -0
  490. package/dist/db/migrations/places.d.ts +6 -0
  491. package/dist/db/migrations/places.js +43 -0
  492. package/dist/db/migrations/projects.d.ts +3 -0
  493. package/dist/db/migrations/projects.js +13 -0
  494. package/dist/db/migrations/tier-conversion.d.ts +7 -0
  495. package/dist/db/migrations/tier-conversion.js +20 -0
  496. package/dist/db/neon.d.ts +8 -0
  497. package/dist/db/neon.js +20 -0
  498. package/dist/db/schema/beliefs.d.ts +9 -0
  499. package/dist/db/schema/beliefs.js +46 -0
  500. package/dist/db/schema/generator.d.ts +38 -0
  501. package/dist/db/schema/generator.js +108 -0
  502. package/dist/db/schema/index.d.ts +39 -0
  503. package/dist/db/schema/index.js +51 -0
  504. package/dist/db/schema/learnings.d.ts +7 -0
  505. package/dist/db/schema/learnings.js +30 -0
  506. package/dist/db/schema/memories.d.ts +7 -0
  507. package/dist/db/schema/memories.js +81 -0
  508. package/dist/db/schema/projects.d.ts +4 -0
  509. package/dist/db/schema/projects.js +31 -0
  510. package/dist/db/schema/tables/context-sessions.d.ts +9 -0
  511. package/dist/db/schema/tables/context-sessions.js +37 -0
  512. package/dist/db/schema/tables/conversations.d.ts +9 -0
  513. package/dist/db/schema/tables/conversations.js +47 -0
  514. package/dist/db/schema/tables/core-memory.d.ts +9 -0
  515. package/dist/db/schema/tables/core-memory.js +41 -0
  516. package/dist/db/schema/tables/entities.d.ts +9 -0
  517. package/dist/db/schema/tables/entities.js +39 -0
  518. package/dist/db/schema/tables/entity-relations.d.ts +9 -0
  519. package/dist/db/schema/tables/entity-relations.js +31 -0
  520. package/dist/db/schema/tables/learnings.d.ts +9 -0
  521. package/dist/db/schema/tables/learnings.js +66 -0
  522. package/dist/db/schema/tables/memories.d.ts +9 -0
  523. package/dist/db/schema/tables/memories.js +161 -0
  524. package/dist/db/schema/tables/memory-associations.d.ts +9 -0
  525. package/dist/db/schema/tables/memory-associations.js +39 -0
  526. package/dist/db/schema/tables/memory-hash-cache.d.ts +9 -0
  527. package/dist/db/schema/tables/memory-hash-cache.js +29 -0
  528. package/dist/db/schema/tables/memory-merge-history.d.ts +9 -0
  529. package/dist/db/schema/tables/memory-merge-history.js +33 -0
  530. package/dist/db/schema/tables/memory-merge-proposals.d.ts +9 -0
  531. package/dist/db/schema/tables/memory-merge-proposals.js +39 -0
  532. package/dist/db/schema/tables/messages.d.ts +9 -0
  533. package/dist/db/schema/tables/messages.js +41 -0
  534. package/dist/db/schema/tables/namespaces.d.ts +9 -0
  535. package/dist/db/schema/tables/namespaces.js +37 -0
  536. package/dist/db/schema/tables/projects.d.ts +9 -0
  537. package/dist/db/schema/tables/projects.js +31 -0
  538. package/dist/db/schema/tables/users.d.ts +9 -0
  539. package/dist/db/schema/tables/users.js +27 -0
  540. package/dist/db/schema.d.ts +1 -1
  541. package/dist/db/schema.js +2 -2
  542. package/dist/db/supabase.d.ts +9 -0
  543. package/dist/db/supabase.js +24 -0
  544. package/dist/packages/mcp/src/index.d.ts +3 -0
  545. package/dist/packages/mcp/src/index.js +733 -0
  546. package/mcp.json.example +8 -0
  547. package/package.json +132 -173
  548. package/packages/cli/package.json +22 -0
  549. package/packages/cli/src/commands/clean.ts +68 -0
  550. package/packages/cli/src/commands/context.ts +79 -0
  551. package/packages/cli/src/commands/doctor.ts +357 -0
  552. package/packages/cli/src/commands/forget.ts +72 -0
  553. package/packages/cli/src/commands/health.ts +36 -0
  554. package/packages/cli/src/commands/inspect.ts +41 -0
  555. package/packages/cli/src/commands/link.ts +50 -0
  556. package/packages/cli/src/commands/migrate.ts +93 -0
  557. package/packages/cli/src/commands/recall.ts +99 -0
  558. package/packages/cli/src/commands/recent.ts +57 -0
  559. package/packages/cli/src/commands/remember.ts +139 -0
  560. package/packages/cli/src/commands/run.ts +58 -0
  561. package/packages/cli/src/commands/stale.ts +43 -0
  562. package/packages/cli/src/commands/stats.ts +42 -0
  563. package/packages/cli/src/index.ts +57 -0
  564. package/packages/cli/tsconfig.json +24 -0
  565. package/packages/mcp/package.json +26 -0
  566. package/packages/mcp/src/index.ts +877 -0
  567. package/packages/mcp/tsconfig.json +20 -0
  568. package/skills/squish-memory/SKILL.md +107 -114
  569. package/skills/squish-memory/install.sh +3 -3
  570. package/skills/squish-memory/{claude-desktop.json → references/claude-desktop.json} +12 -12
  571. package/skills/squish-memory/{openclaw.json → references/openclaw.json} +13 -13
  572. package/skills/squish-memory/{opencode.json → references/opencode.json} +14 -14
  573. package/.claude-plugin/marketplace.json +0 -20
  574. package/.claude-plugin/plugin.json +0 -32
  575. package/.env.mcp.example +0 -60
  576. package/.mcp.json +0 -11
  577. package/QUICK-START.md +0 -71
  578. package/bin/squish-add.mjs +0 -32
  579. package/bin/squish-rm.mjs +0 -21
  580. package/commands/context-paging.md +0 -51
  581. package/commands/context-status.md +0 -22
  582. package/commands/context.md +0 -5
  583. package/commands/core-memory.md +0 -56
  584. package/commands/health.md +0 -5
  585. package/commands/init.md +0 -39
  586. package/commands/merge.md +0 -113
  587. package/commands/observe.md +0 -5
  588. package/commands/recall.md +0 -5
  589. package/commands/remember.md +0 -11
  590. package/commands/search.md +0 -10
  591. package/config/mcp-cli-fallback-policy.json +0 -22
  592. package/config/mcp.json +0 -38
  593. package/config/plugin-manifest.json +0 -152
  594. package/config/plugin-manifest.schema.json +0 -244
  595. package/config/remote-memory-policy.json +0 -32
  596. package/dist/api/web/index.d.ts +0 -3
  597. package/dist/api/web/index.js +0 -4
  598. package/dist/api/web/web-server.d.ts +0 -3
  599. package/dist/api/web/web-server.js +0 -6
  600. package/dist/api/web/web.d.ts +0 -4
  601. package/dist/api/web/web.js +0 -639
  602. package/dist/commands/managed-sync.d.ts +0 -10
  603. package/dist/commands/managed-sync.js +0 -64
  604. package/dist/commands/mcp-server.d.ts +0 -3
  605. package/dist/commands/mcp-server.js +0 -393
  606. package/dist/core/context.js +0 -24
  607. package/dist/core/governance.js +0 -64
  608. package/dist/core/local-embeddings.d.ts +0 -6
  609. package/dist/core/local-embeddings.js +0 -20
  610. package/dist/core/namespaces/index.d.ts +0 -71
  611. package/dist/core/namespaces/index.js +0 -305
  612. package/dist/core/namespaces/uri-parser.d.ts +0 -31
  613. package/dist/core/namespaces/uri-parser.js +0 -74
  614. package/dist/core/observations.d.ts +0 -26
  615. package/dist/core/observations.js +0 -110
  616. package/dist/core/requirements.d.ts +0 -20
  617. package/dist/core/requirements.js +0 -35
  618. package/dist/core/search/qmd-search.d.ts +0 -61
  619. package/dist/core/search/qmd-search.js +0 -178
  620. package/dist/core/snapshots.d.ts +0 -29
  621. package/dist/core/snapshots.js +0 -220
  622. package/dist/core/sync/qmd-sync.d.ts +0 -106
  623. package/dist/core/sync/qmd-sync.js +0 -213
  624. package/dist/core/utils.js +0 -74
  625. package/dist/index.d.ts +0 -19
  626. package/dist/index.js +0 -997
  627. package/generated/mcp/manifest.json +0 -23
  628. package/generated/mcp/mcp-servers.json +0 -25
  629. package/generated/mcp/mcporter.json +0 -34
  630. package/generated/mcp/openclaw-memory-qmd.json +0 -17
  631. package/generated/mcp/runtime.json +0 -12
  632. package/hooks/hooks.json +0 -52
  633. package/hooks/post-tool-use.js +0 -26
  634. package/hooks/session-end.js +0 -28
  635. package/hooks/session-start.js +0 -33
  636. package/hooks/user-prompt-submit.js +0 -26
  637. package/hooks/utils.js +0 -153
  638. package/npx-installer.js +0 -208
  639. package/packages/plugin-claude-code/README.md +0 -73
  640. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +0 -35
  641. package/packages/plugin-claude-code/dist/plugin-wrapper.js +0 -191
  642. package/packages/plugin-claude-code/package.json +0 -31
  643. package/packages/plugin-openclaw/README.md +0 -70
  644. package/packages/plugin-openclaw/dist/index.d.ts +0 -49
  645. package/packages/plugin-openclaw/dist/index.js +0 -262
  646. package/packages/plugin-openclaw/openclaw.plugin.json +0 -94
  647. package/packages/plugin-openclaw/package.json +0 -31
  648. package/packages/plugin-opencode/install.mjs +0 -217
  649. package/packages/plugin-opencode/package.json +0 -21
  650. package/plugin.json +0 -32
  651. package/scripts/build-release.sh +0 -36
  652. package/scripts/check-secrets.js +0 -132
  653. package/scripts/db/check-db.mjs +0 -88
  654. package/scripts/db/fix-all-columns.mjs +0 -52
  655. package/scripts/db/fix-schema-all.mjs +0 -55
  656. package/scripts/db/fix-schema-full.mjs +0 -46
  657. package/scripts/db/fix-schema.mjs +0 -38
  658. package/scripts/db/init-db.mjs +0 -13
  659. package/scripts/db/recreate-db.mjs +0 -14
  660. package/scripts/generate-mcp.mjs +0 -264
  661. package/scripts/github-release.sh +0 -77
  662. package/scripts/init-dirs.mjs +0 -13
  663. package/scripts/install-interactive.mjs +0 -677
  664. package/scripts/install-mcp.mjs +0 -116
  665. package/scripts/install-plugin.mjs +0 -415
  666. package/scripts/install-web.sh +0 -120
  667. package/scripts/install.mjs +0 -340
  668. package/scripts/openclaw-bootstrap.mjs +0 -127
  669. package/scripts/package-release.sh +0 -71
  670. package/scripts/remote-preflight.mjs +0 -62
  671. package/scripts/squish-fallback.mjs +0 -132
  672. package/scripts/test/test-all-systems.mjs +0 -139
  673. package/scripts/test/test-memory-system.mjs +0 -139
  674. package/scripts/test/test-v0.5.0.mjs +0 -210
  675. package/scripts/test-interactive.mjs +0 -131
  676. package/scripts/verify-mcp.mjs +0 -214
  677. package/skills/memory-guide/SKILL.md +0 -332
  678. package/skills/squish-cli/SKILL.md +0 -240
  679. package/skills/squish-mcp/SKILL.md +0 -355
  680. package/skills/squish-memory/install.mjs +0 -335
  681. package/skills/squish-memory/skill.json +0 -32
  682. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.d.ts +0 -0
  683. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.js +0 -0
  684. /package/dist/{algorithms → core/algorithms}/handlers/approve-merge.d.ts +0 -0
  685. /package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.d.ts +0 -0
  686. /package/dist/{algorithms → core/algorithms}/handlers/get-stats.d.ts +0 -0
  687. /package/dist/{algorithms → core/algorithms}/handlers/list-proposals.d.ts +0 -0
  688. /package/dist/{algorithms → core/algorithms}/handlers/preview-merge.d.ts +0 -0
  689. /package/dist/{algorithms → core/algorithms}/handlers/reject-merge.d.ts +0 -0
  690. /package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.d.ts +0 -0
  691. /package/dist/{algorithms → core/algorithms}/safety/safety-checks.js +0 -0
  692. /package/dist/{algorithms → core/algorithms}/utils/response-builder.d.ts +0 -0
  693. /package/dist/{algorithms → core/algorithms}/utils/response-builder.js +0 -0
  694. /package/dist/core/{context.d.ts → context/context.d.ts} +0 -0
  695. /package/dist/core/{agent-memory.d.ts → ingestion/agent-memory.d.ts} +0 -0
  696. /package/dist/core/{privacy.d.ts → security/privacy.d.ts} +0 -0
  697. /package/dist/core/{privacy.js → security/privacy.js} +0 -0
  698. /package/dist/core/{secret-detector.d.ts → security/secret-detector.d.ts} +0 -0
  699. /package/dist/core/{secret-detector.js → security/secret-detector.js} +0 -0
  700. /package/dist/core/{session-hooks → session}/session-hooks.d.ts +0 -0
  701. /package/dist/core/{session-hooks → session}/session-hooks.js +0 -0
  702. /package/dist/core/{cache.d.ts → storage/cache.d.ts} +0 -0
  703. /package/dist/core/{database.d.ts → storage/database.d.ts} +0 -0
  704. /package/dist/core/{database.js → storage/database.js} +0 -0
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Transformers.js Local Embedding Provider
3
+ *
4
+ * Uses ONNX-based transformer models for high-quality local embeddings.
5
+ * Supports Hugging Face ONNX embedding models.
6
+ *
7
+ * Usage:
8
+ * Set SQUISH_EMBEDDINGS_PROVIDER=transformers
9
+ * Required: SQUISH_LOCAL_MODEL=<huggingface-onnx-model>
10
+ *
11
+ * Download models automatically on first use. Models cached in HuggingFace cache directory.
12
+ */
13
+
14
+ import { pipeline, Pipeline } from '@huggingface/transformers';
15
+ import { logger } from '../logger.js';
16
+ import { config } from '../../config.js';
17
+
18
+ export interface TransformersLocalConfig {
19
+ model: string;
20
+ device: 'cpu' | 'webgpu';
21
+ dtype: 'q8' | 'q4' | 'f16' | 'f32';
22
+ }
23
+
24
+ const DEFAULT_CONFIG: TransformersLocalConfig = {
25
+ model: '',
26
+ device: 'cpu',
27
+ dtype: 'q8', // Quantized for smaller size + faster loading
28
+ };
29
+
30
+ // Singleton pipeline instance
31
+ let embeddingPipeline: Pipeline | null = null;
32
+ let isLoading = false;
33
+ let loadPromise: Promise<Pipeline | null> | null = null;
34
+
35
+ /**
36
+ * Get or initialize the embedding pipeline (lazy loading)
37
+ */
38
+ async function getPipeline(): Promise<Pipeline | null> {
39
+ // Return existing pipeline
40
+ if (embeddingPipeline) {
41
+ return embeddingPipeline;
42
+ }
43
+
44
+ // Already loading - wait for it
45
+ if (isLoading && loadPromise) {
46
+ return loadPromise;
47
+ }
48
+
49
+ // Start loading
50
+ isLoading = true;
51
+ const model = config.transformersLocalModel;
52
+ if (!model) {
53
+ isLoading = false;
54
+ throw new Error('Transformers provider requires SQUISH_LOCAL_MODEL to be set');
55
+ }
56
+
57
+ logger.info(`Loading transformers local model: ${model}`);
58
+
59
+ loadPromise = (async () => {
60
+ try {
61
+ embeddingPipeline = await pipeline(
62
+ 'feature-extraction',
63
+ model as any,
64
+ {
65
+ device: DEFAULT_CONFIG.device as any,
66
+ dtype: DEFAULT_CONFIG.dtype as any,
67
+ }
68
+ );
69
+
70
+ logger.info(`Transformers local model loaded: ${model}`);
71
+ return embeddingPipeline;
72
+ } catch (error) {
73
+ logger.error(`Failed to load transformers model: ${error}`);
74
+ embeddingPipeline = null;
75
+ throw error;
76
+ } finally {
77
+ isLoading = false;
78
+ loadPromise = null;
79
+ }
80
+ })();
81
+
82
+ return loadPromise;
83
+ }
84
+
85
+ /**
86
+ * Check if pipeline is loaded
87
+ */
88
+ export function isReady(): boolean {
89
+ return embeddingPipeline !== null;
90
+ }
91
+
92
+ /**
93
+ * Get embedding dimension for current model
94
+ */
95
+ export function getEmbeddingDimension(): number {
96
+ return 0;
97
+ }
98
+
99
+ /**
100
+ * Generate embedding for a single text input
101
+ * Uses mean pooling + L2 normalization
102
+ */
103
+ export async function getEmbedding(text: string): Promise<number[] | null> {
104
+ if (!text || typeof text !== 'string') {
105
+ return null;
106
+ }
107
+
108
+ try {
109
+ const pipeline = await getPipeline();
110
+ if (!pipeline) {
111
+ return null;
112
+ }
113
+
114
+ // Truncate to max sequence length (256 tokens)
115
+ const truncatedText = text.slice(0, 512);
116
+
117
+ // Run feature extraction with pooling
118
+ const output = await pipeline(truncatedText, {
119
+ pooling: 'mean',
120
+ normalize: true,
121
+ });
122
+
123
+ // Convert tensor to array
124
+ const embedding = Array.from(output.data);
125
+
126
+ return embedding;
127
+ } catch (error) {
128
+ logger.warn(`Transformers embedding error: ${error}`);
129
+ return null;
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Generate embeddings for multiple texts in batch
135
+ * Processes efficiently with batching
136
+ */
137
+ export async function getBatchEmbeddings(
138
+ texts: string[],
139
+ batchSize: number = 8
140
+ ): Promise<Array<number[] | null>> {
141
+ if (texts.length === 0) {
142
+ return [];
143
+ }
144
+
145
+ const results: Array<number[] | null> = new Array(texts.length).fill(null);
146
+
147
+ // Process in batches
148
+ for (let i = 0; i < texts.length; i += batchSize) {
149
+ const batchEnd = Math.min(i + batchSize, texts.length);
150
+ const batch = texts.slice(i, batchEnd);
151
+ const indices = [...Array(batch.length).keys()].map(j => i + j);
152
+
153
+ try {
154
+ const pipeline = await getPipeline();
155
+ if (!pipeline) {
156
+ continue;
157
+ }
158
+
159
+ // Truncate each text
160
+ const truncatedBatch = batch.map(t => t.slice(0, 512));
161
+
162
+ // Process batch
163
+ const outputs = await Promise.all(
164
+ truncatedBatch.map(text =>
165
+ pipeline(text, { pooling: 'mean', normalize: true })
166
+ )
167
+ );
168
+
169
+ // Store results
170
+ for (let j = 0; j < outputs.length; j++) {
171
+ results[indices[j]] = Array.from(outputs[j].data);
172
+ }
173
+ } catch (error) {
174
+ logger.warn(`Transformers batch embedding error: ${error}`);
175
+ }
176
+ }
177
+
178
+ return results;
179
+ }
180
+
181
+ /**
182
+ * Check health of the transformers provider
183
+ */
184
+ export async function checkHealth(): Promise<{
185
+ available: boolean;
186
+ latencyMs?: number;
187
+ error?: string;
188
+ model?: string;
189
+ dimension?: number;
190
+ }> {
191
+ const model = config.transformersLocalModel;
192
+ if (!model) {
193
+ return {
194
+ available: false,
195
+ error: 'SQUISH_LOCAL_MODEL is not configured',
196
+ };
197
+ }
198
+
199
+ // Check if library is available
200
+ try {
201
+ await import('@huggingface/transformers');
202
+ } catch (error) {
203
+ return {
204
+ available: false,
205
+ error: '@huggingface/transformers not installed',
206
+ };
207
+ }
208
+
209
+ // Try quick embedding
210
+ const start = Date.now();
211
+ try {
212
+ const embedding = await getEmbedding('health check test');
213
+ const latency = Date.now() - start;
214
+
215
+ return {
216
+ available: embedding !== null && embedding.length > 0,
217
+ latencyMs: latency,
218
+ model,
219
+ dimension: embedding?.length || 0,
220
+ };
221
+ } catch (error) {
222
+ return {
223
+ available: false,
224
+ error: (error as Error).message,
225
+ model,
226
+ };
227
+ }
228
+ }
229
+
230
+ /**
231
+ * Unload the pipeline (for testing or memory management)
232
+ */
233
+ export async function unload(): Promise<void> {
234
+ if (embeddingPipeline) {
235
+ // Pipeline doesn't have explicit cleanup, just release reference
236
+ embeddingPipeline = null;
237
+ logger.info('Transformers pipeline unloaded');
238
+ }
239
+ }
240
+
241
+ /**
242
+ * Warm up the model with a test input
243
+ */
244
+ export async function warmup(): Promise<boolean> {
245
+ try {
246
+ const result = await getEmbedding('warmup test');
247
+ return result !== null && result.length > 0;
248
+ } catch {
249
+ return false;
250
+ }
251
+ }
252
+
253
+ export default {
254
+ isReady,
255
+ getEmbeddingDimension,
256
+ getEmbedding,
257
+ getBatchEmbeddings,
258
+ checkHealth,
259
+ unload,
260
+ warmup,
261
+ };
@@ -0,0 +1,4 @@
1
+ // Re-export from embeddings directory
2
+ export * from './embeddings/embeddings';
3
+ export * from './embeddings/google-multimodal';
4
+ export * from './embeddings/local-embeddings';
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Unified Error Handling System for Squish
3
+ * Provides standardized error handling across CLI, Web API, MCP server, and algorithm handlers
4
+ */
5
+
6
+ import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
7
+ import { isDatabaseUnavailableError } from './lib/utils.js';
8
+
9
+ export { isDatabaseUnavailableError };
10
+
11
+ // Database operation wrapper
12
+
13
+ /**
14
+ * Wraps database operations with standardized error handling
15
+ */
16
+ export async function withDbErrorHandling<T>(
17
+ operation: () => Promise<T>,
18
+ context: string
19
+ ): Promise<T> {
20
+ try {
21
+ return await operation();
22
+ } catch (dbError: any) {
23
+ if (isDatabaseUnavailableError(dbError)) {
24
+ throw new Error(`Database unavailable: ${context}. Please check your database connection.`);
25
+ }
26
+ throw dbError;
27
+ }
28
+ }
29
+
30
+ // API Response Formatters
31
+
32
+ /**
33
+ * Formats errors for Web API responses
34
+ */
35
+ export function formatApiError(
36
+ error: any,
37
+ defaultStatus: number = 500
38
+ ): { status: number; response: { status: string; message: string } } {
39
+ let message: string;
40
+
41
+ if (typeof error === 'string') {
42
+ message = error;
43
+ } else if (error instanceof Error) {
44
+ message = error.message;
45
+ } else if (error && typeof error === 'object' && 'message' in error) {
46
+ message = String(error.message);
47
+ } else if (error && typeof error === 'object') {
48
+ message = 'Unknown error';
49
+ } else {
50
+ message = 'Unknown error';
51
+ }
52
+
53
+ // Check if it's a database unavailable error
54
+ if (isDatabaseUnavailableError(error)) {
55
+ return {
56
+ status: 503,
57
+ response: {
58
+ status: 'error',
59
+ message: `Service unavailable: ${message}`
60
+ }
61
+ };
62
+ }
63
+
64
+ // Check for custom error classes with status hints
65
+ if (error.status) {
66
+ return {
67
+ status: error.status,
68
+ response: {
69
+ status: 'error',
70
+ message
71
+ }
72
+ };
73
+ }
74
+
75
+ return {
76
+ status: defaultStatus,
77
+ response: {
78
+ status: 'error',
79
+ message
80
+ }
81
+ };
82
+ }
83
+
84
+ // MCP Error Formatter
85
+
86
+ /**
87
+ * Formats errors for MCP tool responses
88
+ */
89
+ export function formatMcpError(
90
+ error: any,
91
+ context?: string
92
+ ): never {
93
+ const message = error?.message || error?.toString() || 'Unknown error';
94
+ const fullMessage = context ? `${context}: ${message}` : message;
95
+
96
+ // Determine appropriate error code
97
+ let code: ErrorCode;
98
+
99
+ if (isDatabaseUnavailableError(error)) {
100
+ code = ErrorCode.InternalError; // -32603
101
+ } else if (error instanceof ValidationError) {
102
+ code = ErrorCode.InvalidParams; // -32602
103
+ } else {
104
+ code = ErrorCode.InternalError;
105
+ }
106
+
107
+ throw new McpError(code, fullMessage);
108
+ }
109
+
110
+ // CLI Error Formatter
111
+
112
+ /**
113
+ * Formats errors for CLI commands
114
+ */
115
+ export function formatCliError(
116
+ error: any,
117
+ exitCode: number = 1
118
+ ): never {
119
+ let message: string;
120
+
121
+ if (typeof error === 'string') {
122
+ message = error;
123
+ } else if (error instanceof Error) {
124
+ message = error.message;
125
+ } else if (error && typeof error === 'object' && 'message' in error) {
126
+ message = String(error.message);
127
+ } else {
128
+ message = 'Unknown error';
129
+ }
130
+
131
+ // Output JSON to stdout for CLI consumers
132
+ console.log(JSON.stringify({ ok: false, error: message }, null, 2));
133
+ process.exit(exitCode);
134
+ }
135
+
136
+ // Algorithm Handler Formatters
137
+
138
+ /**
139
+ * Formats errors for algorithm handlers
140
+ */
141
+ export function formatAlgorithmError(
142
+ error: any,
143
+ context?: string
144
+ ): { ok: false; error: string } {
145
+ let message: string;
146
+
147
+ if (typeof error === 'string') {
148
+ message = error;
149
+ } else if (error instanceof Error) {
150
+ message = error.message;
151
+ } else if (error && typeof error === 'object' && 'message' in error) {
152
+ message = String(error.message);
153
+ } else {
154
+ message = 'Unknown error';
155
+ }
156
+
157
+ const fullMessage = context ? `${context}: ${message}` : message;
158
+ return { ok: false, error: fullMessage };
159
+ }
160
+
161
+ /**
162
+ * Formats successful responses for algorithm handlers.
163
+ *
164
+ * @param data - The success data to return
165
+ * @param message - Optional success message
166
+ * @returns Object with ok: true, optional message, and data
167
+ */
168
+ export function formatAlgorithmSuccess<T>(
169
+ data: T,
170
+ message?: string
171
+ ): { ok: true; data: T; message?: string } {
172
+ const result: { ok: true; data: T; message?: string } = { ok: true, data };
173
+ if (message) {
174
+ result.message = message;
175
+ }
176
+ return result;
177
+ }
178
+
179
+ // Custom Error Classes
180
+
181
+ /**
182
+ * Error thrown when validation fails
183
+ */
184
+ export class ValidationError extends Error {
185
+ constructor(
186
+ message: string,
187
+ public field?: string
188
+ ) {
189
+ super(message);
190
+ this.name = 'ValidationError';
191
+ }
192
+ }
193
+
194
+ /**
195
+ * Error thrown when a requested resource is not found.
196
+ * Used for missing memories, projects, etc.
197
+ */
198
+ export class NotFoundError extends Error {
199
+ constructor(
200
+ message: string,
201
+ public resource?: string
202
+ ) {
203
+ super(message);
204
+ this.name = 'NotFoundError';
205
+ }
206
+ }
package/core/external ADDED
@@ -0,0 +1,219 @@
1
+ import { config } from '../config.js';
2
+ import { logger } from './logger.js';
3
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, statSync, unlinkSync } from 'fs';
4
+ import { join, dirname } from 'path';
5
+
6
+ const QMD_DIR = 'qmd';
7
+
8
+ interface QMDMemory {
9
+ id: string;
10
+ content: string;
11
+ type: string;
12
+ tags: string[];
13
+ createdAt: string;
14
+ updatedAt: string;
15
+ tier: string;
16
+ projectPath?: string;
17
+ }
18
+
19
+ export function getQMDDir(projectPath?: string): string {
20
+ const project = projectPath || config.dataDir;
21
+ return join(project, QMD_DIR);
22
+ }
23
+
24
+ export function ensureQMDDir(projectPath?: string): string {
25
+ const dir = getQMDDir(projectPath);
26
+ if (!existsSync(dir)) {
27
+ mkdirSync(dir, { recursive: true });
28
+ logger.info(`[QMD] Created QMD directory: ${dir}`);
29
+ }
30
+ return dir;
31
+ }
32
+
33
+ function parseFrontMatter(content: string): { metadata: Record<string, any>; body: string } {
34
+ const match = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
35
+ if (!match) {
36
+ return { metadata: {}, body: content };
37
+ }
38
+
39
+ const yamlContent = match[1];
40
+ const body = match[2];
41
+
42
+ const metadata: Record<string, any> = {};
43
+ const lines = yamlContent.split('\n');
44
+ let currentKey = '';
45
+ let currentArray: string[] = [];
46
+
47
+ for (const line of lines) {
48
+ const keyMatch = line.match(/^(\w+):\s*(.*)$/);
49
+ if (keyMatch) {
50
+ if (currentKey) {
51
+ if (currentArray.length > 0) {
52
+ metadata[currentKey] = currentArray;
53
+ currentArray = [];
54
+ } else {
55
+ metadata[currentKey] = currentKey;
56
+ }
57
+ }
58
+ currentKey = keyMatch[1];
59
+ const value = keyMatch[2].trim();
60
+
61
+ if (value.startsWith('[') && value.endsWith(']')) {
62
+ currentArray = value.slice(1, -1).split(',').map(s => s.trim().replace(/['"]/g, ''));
63
+ } else if (value) {
64
+ metadata[currentKey] = value.replace(/['"]/g, '');
65
+ }
66
+ } else if (line.trim().startsWith('-')) {
67
+ currentArray.push(line.trim().slice(1).trim().replace(/['"]/g, ''));
68
+ }
69
+ }
70
+
71
+ if (currentKey) {
72
+ if (currentArray.length > 0) {
73
+ metadata[currentKey] = currentArray;
74
+ }
75
+ }
76
+
77
+ return { metadata, body };
78
+ }
79
+
80
+ function serializeMemory(memory: QMDMemory): string {
81
+ const lines = ['---'];
82
+ lines.push(`id: ${memory.id}`);
83
+ lines.push(`type: ${memory.type}`);
84
+ if (memory.tags && memory.tags.length > 0) {
85
+ lines.push(`tags: [${memory.tags.join(', ')}]`);
86
+ }
87
+ lines.push(`tier: ${memory.tier}`);
88
+ lines.push(`createdAt: ${memory.createdAt}`);
89
+ lines.push(`updatedAt: ${memory.updatedAt}`);
90
+ if (memory.projectPath) {
91
+ lines.push(`projectPath: ${memory.projectPath}`);
92
+ }
93
+ lines.push('---');
94
+ lines.push('');
95
+ lines.push(memory.content);
96
+ return lines.join('\n');
97
+ }
98
+
99
+ export async function writeMemory(memory: QMDMemory): Promise<void> {
100
+ const dir = ensureQMDDir(memory.projectPath);
101
+ const filePath = join(dir, `${memory.id}.md`);
102
+ const content = serializeMemory(memory);
103
+ writeFileSync(filePath, content, 'utf-8');
104
+ logger.debug(`[QMD] Wrote memory to ${filePath}`);
105
+ }
106
+
107
+ export async function readMemory(memoryId: string, projectPath?: string): Promise<QMDMemory | null> {
108
+ const dir = getQMDDir(projectPath);
109
+ const filePath = join(dir, `${memoryId}.md`);
110
+
111
+ if (!existsSync(filePath)) {
112
+ return null;
113
+ }
114
+
115
+ try {
116
+ const content = readFileSync(filePath, 'utf-8');
117
+ const { metadata, body } = parseFrontMatter(content);
118
+
119
+ return {
120
+ id: memoryId,
121
+ content: body,
122
+ type: metadata.type || 'observation',
123
+ tags: metadata.tags || [],
124
+ tier: metadata.tier || 'hot',
125
+ createdAt: metadata.createdAt || new Date().toISOString(),
126
+ updatedAt: metadata.updatedAt || new Date().toISOString(),
127
+ projectPath: metadata.projectPath,
128
+ };
129
+ } catch (error) {
130
+ logger.error(`[QMD] Failed to read memory ${memoryId}:`, error);
131
+ return null;
132
+ }
133
+ }
134
+
135
+ export async function deleteMemory(memoryId: string, projectPath?: string): Promise<boolean> {
136
+ const dir = getQMDDir(projectPath);
137
+ const filePath = join(dir, `${memoryId}.md`);
138
+
139
+ if (!existsSync(filePath)) {
140
+ return false;
141
+ }
142
+
143
+ try {
144
+ unlinkSync(filePath);
145
+ logger.debug(`[QMD] Deleted memory ${memoryId}`);
146
+ return true;
147
+ } catch (error) {
148
+ logger.error(`[QMD] Failed to delete memory ${memoryId}:`, error);
149
+ return false;
150
+ }
151
+ }
152
+
153
+ export async function searchMemories(
154
+ query: string,
155
+ projectPath?: string,
156
+ options?: { limit?: number; tier?: string }
157
+ ): Promise<QMDMemory[]> {
158
+ const dir = getQMDDir(projectPath);
159
+ const { limit = 50, tier } = options || {};
160
+
161
+ if (!existsSync(dir)) {
162
+ return [];
163
+ }
164
+
165
+ const files = readdirSync(dir).filter(f => f.endsWith('.md'));
166
+ const results: QMDMemory[] = [];
167
+ const queryLower = query.toLowerCase();
168
+
169
+ for (const file of files) {
170
+ try {
171
+ const content = readFileSync(join(dir, file), 'utf-8');
172
+ const { metadata, body } = parseFrontMatter(content);
173
+
174
+ if (tier && metadata.tier !== tier) {
175
+ continue;
176
+ }
177
+
178
+ const searchText = `${metadata.type || ''} ${metadata.tags?.join(' ') || ''} ${body}`.toLowerCase();
179
+
180
+ if (searchText.includes(queryLower)) {
181
+ results.push({
182
+ id: file.replace('.md', ''),
183
+ content: body,
184
+ type: metadata.type || 'observation',
185
+ tags: metadata.tags || [],
186
+ tier: metadata.tier || 'hot',
187
+ createdAt: metadata.createdAt || '',
188
+ updatedAt: metadata.updatedAt || '',
189
+ projectPath: metadata.projectPath,
190
+ });
191
+ }
192
+ } catch {
193
+ // Skip unreadable files
194
+ }
195
+
196
+ if (results.length >= limit) break;
197
+ }
198
+
199
+ return results.slice(0, limit);
200
+ }
201
+
202
+ export async function getHotMemories(projectPath?: string, limit = 100): Promise<QMDMemory[]> {
203
+ return searchMemories('', projectPath, { limit, tier: 'hot' });
204
+ }
205
+
206
+ export async function updateMemoryTier(memoryId: string, newTier: string, projectPath?: string): Promise<boolean> {
207
+ const memory = await readMemory(memoryId, projectPath);
208
+ if (!memory) return false;
209
+
210
+ memory.tier = newTier;
211
+ memory.updatedAt = new Date().toISOString();
212
+
213
+ await writeMemory(memory);
214
+ return true;
215
+ }
216
+
217
+ export function isQMDEnabled(): boolean {
218
+ return config.qmdEnabled !== false;
219
+ }