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
@@ -1,305 +0,0 @@
1
- /** Namespace Management - Hierarchical folder-like namespaces for memories */
2
- import { randomUUID } from 'crypto';
3
- import { eq, and, isNull } from 'drizzle-orm';
4
- import { getDb } from '../../db/index.js';
5
- import { getSchema } from '../../db/schema.js';
6
- import { logger } from '../logger.js';
7
- /**
8
- * Create a new namespace
9
- */
10
- export async function createNamespace(input) {
11
- const db = await getDb();
12
- if (!db) {
13
- throw new Error('Database unavailable');
14
- }
15
- const schema = await getSchema();
16
- const id = randomUUID();
17
- // Check if namespace with same name exists under parent
18
- const sqliteDb = db;
19
- const existing = await sqliteDb.select()
20
- .from(schema.namespaces)
21
- .where(and(eq(schema.namespaces.projectId, input.projectId), eq(schema.namespaces.name, input.name), input.parentId
22
- ? eq(schema.namespaces.parentId, input.parentId)
23
- : isNull(schema.namespaces.parentId)))
24
- .limit(1);
25
- if (existing.length > 0) {
26
- throw new Error(`Namespace "${input.name}" already exists under ${input.parentId || 'root'}`);
27
- }
28
- // Build namespace path
29
- const path = await buildNamespacePath(input.projectId, input.name, input.parentId ?? null);
30
- await sqliteDb.insert(schema.namespaces).values({
31
- id,
32
- projectId: input.projectId,
33
- name: input.name,
34
- type: input.type,
35
- parentId: input.parentId || null,
36
- description: input.description || null,
37
- createdAt: new Date(),
38
- updatedAt: new Date(),
39
- });
40
- logger.info(`[Namespaces] Created namespace: ${path}`);
41
- return {
42
- id,
43
- projectId: input.projectId,
44
- name: input.name,
45
- type: input.type,
46
- parentId: input.parentId || null,
47
- description: input.description || null,
48
- path,
49
- createdAt: new Date(),
50
- updatedAt: new Date(),
51
- };
52
- }
53
- /**
54
- * Build full namespace path from parent
55
- */
56
- async function buildNamespacePath(projectId, name, parentId) {
57
- if (!parentId) {
58
- return name;
59
- }
60
- const db = await getDb();
61
- const schema = await getSchema();
62
- const sqliteDb = db;
63
- const [parent] = await sqliteDb.select()
64
- .from(schema.namespaces)
65
- .where(eq(schema.namespaces.id, parentId))
66
- .limit(1);
67
- if (!parent) {
68
- return name;
69
- }
70
- return `${parent.path}/${name}`;
71
- }
72
- /**
73
- * Get a namespace by ID
74
- */
75
- export async function getNamespaceById(id) {
76
- const db = await getDb();
77
- if (!db)
78
- return null;
79
- const schema = await getSchema();
80
- const sqliteDb = db;
81
- const [row] = await sqliteDb.select()
82
- .from(schema.namespaces)
83
- .where(eq(schema.namespaces.id, id))
84
- .limit(1);
85
- if (!row)
86
- return null;
87
- return {
88
- id: row.id,
89
- projectId: row.projectId,
90
- name: row.name,
91
- type: row.type,
92
- parentId: row.parentId,
93
- description: row.description,
94
- path: row.path,
95
- createdAt: new Date(row.createdAt),
96
- updatedAt: new Date(row.updatedAt),
97
- };
98
- }
99
- /**
100
- * Resolve a namespace path to a namespace ID
101
- * @example resolveNamespacePath('my-project', ['user', 'preferences']) -> namespaceId
102
- */
103
- export async function resolveNamespacePath(projectId, path) {
104
- if (path.length === 0)
105
- return null;
106
- const db = await getDb();
107
- if (!db)
108
- return null;
109
- const schema = await getSchema();
110
- const sqliteDb = db;
111
- let parentId = null;
112
- let targetNamespace = null;
113
- // Traverse path segments
114
- for (const segment of path) {
115
- const [result] = await sqliteDb.select()
116
- .from(schema.namespaces)
117
- .where(and(eq(schema.namespaces.projectId, projectId), eq(schema.namespaces.name, segment), parentId
118
- ? eq(schema.namespaces.parentId, parentId)
119
- : isNull(schema.namespaces.parentId)))
120
- .limit(1);
121
- if (!result)
122
- return null;
123
- targetNamespace = result;
124
- parentId = result.id;
125
- }
126
- return targetNamespace?.id || null;
127
- }
128
- /**
129
- * Get namespace tree for a project
130
- */
131
- export async function getNamespaceTree(projectId) {
132
- const db = await getDb();
133
- if (!db)
134
- return [];
135
- const schema = await getSchema();
136
- const sqliteDb = db;
137
- // Get all namespaces for project
138
- const all = await sqliteDb.select()
139
- .from(schema.namespaces)
140
- .where(eq(schema.namespaces.projectId, projectId))
141
- .orderBy(schema.namespaces.name);
142
- // Build tree structure
143
- const map = new Map();
144
- const roots = [];
145
- for (const row of all) {
146
- const node = {
147
- id: row.id,
148
- name: row.name,
149
- type: row.type,
150
- description: row.description,
151
- path: row.path,
152
- children: [],
153
- };
154
- map.set(row.id, node);
155
- if (!row.parentId) {
156
- roots.push(node);
157
- }
158
- else {
159
- const parent = map.get(row.parentId);
160
- if (parent) {
161
- parent.children.push(node);
162
- }
163
- }
164
- }
165
- return roots;
166
- }
167
- /**
168
- * Get or create default namespaces for a project
169
- */
170
- export async function getDefaultNamespaces(projectId) {
171
- const db = await getDb();
172
- if (!db)
173
- return [];
174
- const schema = await getSchema();
175
- const sqliteDb = db;
176
- const created = [];
177
- const defaults = [
178
- { name: 'user', type: 'user', description: 'User-specific memories and preferences' },
179
- { name: 'agent', type: 'agent', description: 'Agent-specific knowledge and state' },
180
- { name: 'project', type: 'project', description: 'Project-specific decisions and context' },
181
- ];
182
- const defaultNames = ['user', 'agent', 'project'];
183
- // Check all default namespaces at once with IN clause
184
- const existing = await sqliteDb.select()
185
- .from(schema.namespaces)
186
- .where(and(eq(schema.namespaces.projectId, projectId), eq(schema.namespaces.name, defaultNames[0]), eq(schema.namespaces.type, 'user'), isNull(schema.namespaces.parentId)));
187
- if (existing.length > 0) {
188
- const ns = await createNamespace({
189
- projectId,
190
- name: defaultNames[0],
191
- type: 'user',
192
- parentId: null,
193
- });
194
- created.push({
195
- id: ns.id,
196
- projectId: ns.projectId,
197
- name: ns.name,
198
- type: ns.type,
199
- parentId: ns.parentId,
200
- description: ns.description,
201
- path: ns.path,
202
- createdAt: new Date(ns.createdAt),
203
- updatedAt: new Date(ns.updatedAt),
204
- });
205
- }
206
- // Check remaining defaults sequentially (agent and project)
207
- for (const defName of defaultNames.slice(1)) {
208
- const existing = await sqliteDb.select()
209
- .from(schema.namespaces)
210
- .where(and(eq(schema.namespaces.projectId, projectId), eq(schema.namespaces.name, defName), eq(schema.namespaces.type, defName), isNull(schema.namespaces.parentId)))
211
- .limit(1);
212
- if (existing.length === 0) {
213
- const ns = await createNamespace({
214
- projectId,
215
- name: defName,
216
- type: defName === 'agent' ? 'agent' : 'project',
217
- parentId: null,
218
- });
219
- created.push(ns);
220
- }
221
- else {
222
- created.push({
223
- id: existing[0].id,
224
- projectId: existing[0].projectId,
225
- name: existing[0].name,
226
- type: existing[0].type,
227
- parentId: existing[0].parentId,
228
- description: existing[0].description,
229
- path: existing[0].path,
230
- createdAt: new Date(existing[0].createdAt),
231
- updatedAt: new Date(existing[0].updatedAt),
232
- });
233
- }
234
- }
235
- logger.info(`[Namespaces] Default namespaces ready for project: ${projectId}`);
236
- return created;
237
- }
238
- /**
239
- * List namespaces with optional filtering
240
- */
241
- export async function listNamespaces(options = {}) {
242
- const db = await getDb();
243
- if (!db)
244
- return [];
245
- const schema = await getSchema();
246
- const sqliteDb = db;
247
- const conditions = [];
248
- if (options.projectId) {
249
- conditions.push(eq(schema.namespaces.projectId, options.projectId));
250
- }
251
- if (options.type) {
252
- conditions.push(eq(schema.namespaces.type, options.type));
253
- }
254
- if (options.parentId !== undefined) {
255
- if (options.parentId === null) {
256
- conditions.push(isNull(schema.namespaces.parentId));
257
- }
258
- else {
259
- conditions.push(eq(schema.namespaces.parentId, options.parentId));
260
- }
261
- }
262
- const rows = await sqliteDb.select()
263
- .from(schema.namespaces)
264
- .where(conditions.length > 0 ? and(...conditions) : undefined)
265
- .orderBy(schema.namespaces.name);
266
- return rows.map((row) => ({
267
- id: row.id,
268
- projectId: row.projectId,
269
- name: row.name,
270
- type: row.type,
271
- parentId: row.parentId,
272
- description: row.description,
273
- path: row.path,
274
- createdAt: new Date(row.createdAt),
275
- updatedAt: new Date(row.updatedAt),
276
- }));
277
- }
278
- /**
279
- * Delete a namespace (cascades to child namespaces)
280
- */
281
- export async function deleteNamespace(id) {
282
- const db = await getDb();
283
- if (!db)
284
- return;
285
- const schema = await getSchema();
286
- const sqliteDb = db;
287
- await sqliteDb.delete(schema.namespaces).where(eq(schema.namespaces.id, id));
288
- logger.info(`[Namespaces] Deleted namespace: ${id}`);
289
- }
290
- /**
291
- * Update namespace
292
- */
293
- export async function updateNamespace(id, updates) {
294
- const db = await getDb();
295
- if (!db)
296
- return;
297
- const schema = await getSchema();
298
- const sqliteDb = db;
299
- await sqliteDb.update(schema.namespaces).set({
300
- ...updates,
301
- updatedAt: new Date(),
302
- }).where(eq(schema.namespaces.id, id));
303
- logger.info(`[Namespaces] Updated namespace: ${id}`);
304
- }
305
- //# sourceMappingURL=index.js.map
@@ -1,31 +0,0 @@
1
- /** URI Parser for Squish namespace scheme (squish://) */
2
- export interface SquishURIParsed {
3
- type: 'namespace';
4
- projectId: string;
5
- namespacePath: string[];
6
- memoryId?: string;
7
- }
8
- /**
9
- * Parse a squish:// URI into components
10
- * @example parseSquishURI('squish://my-project/user/preferences') -> { type: 'namespace', projectId: 'my-project', namespacePath: ['user', 'preferences'] }
11
- */
12
- export declare function parseSquishURI(uri: string): SquishURIParsed | null;
13
- /**
14
- * Build a squish:// URI from components
15
- * @example buildSquishURI('my-project', ['user', 'preferences']) -> 'squish://my-project/user/preferences'
16
- */
17
- export declare function buildSquishURI(projectId: string, path: string[], memoryId?: string): string;
18
- /**
19
- * Validate a namespace path (no "..", no empty segments)
20
- */
21
- export declare function validateNamespacePath(path: string[]): boolean;
22
- /**
23
- * Get parent namespace path
24
- * @example getParentPath(['user', 'preferences', 'coding']) -> ['user', 'preferences']
25
- */
26
- export declare function getParentPath(path: string[]): string[] | null;
27
- /**
28
- * Join namespace path segments
29
- */
30
- export declare function joinNamespacePath(...segments: (string | string[])[]): string[];
31
- //# sourceMappingURL=uri-parser.d.ts.map
@@ -1,74 +0,0 @@
1
- /** URI Parser for Squish namespace scheme (squish://) */
2
- /**
3
- * Parse a squish:// URI into components
4
- * @example parseSquishURI('squish://my-project/user/preferences') -> { type: 'namespace', projectId: 'my-project', namespacePath: ['user', 'preferences'] }
5
- */
6
- export function parseSquishURI(uri) {
7
- if (!uri || typeof uri !== 'string') {
8
- return null;
9
- }
10
- // Match squish://project/path/to/memory
11
- const match = uri.match(/^squish:\/\/([^\/]+)\/(.*)$/);
12
- if (!match) {
13
- return null;
14
- }
15
- const [, projectId, pathPart] = match;
16
- const namespacePath = pathPart ? pathPart.split('/').filter(Boolean) : [];
17
- // If path ends with a UUID, it's a memory ID
18
- const lastSegment = namespacePath[namespacePath.length - 1];
19
- let memoryId;
20
- if (lastSegment && /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(lastSegment)) {
21
- memoryId = lastSegment;
22
- namespacePath.pop();
23
- }
24
- return {
25
- type: 'namespace',
26
- projectId,
27
- namespacePath,
28
- memoryId,
29
- };
30
- }
31
- /**
32
- * Build a squish:// URI from components
33
- * @example buildSquishURI('my-project', ['user', 'preferences']) -> 'squish://my-project/user/preferences'
34
- */
35
- export function buildSquishURI(projectId, path, memoryId) {
36
- if (!projectId) {
37
- throw new Error('Project ID is required');
38
- }
39
- const cleanPath = path.filter(Boolean);
40
- const basePath = `squish://${projectId}${cleanPath.length > 0 ? '/' + cleanPath.join('/') : ''}`;
41
- return memoryId ? `${basePath}/${memoryId}` : basePath;
42
- }
43
- /**
44
- * Validate a namespace path (no "..", no empty segments)
45
- */
46
- export function validateNamespacePath(path) {
47
- if (path.length === 0)
48
- return true;
49
- for (const segment of path) {
50
- if (!segment || segment.length === 0) {
51
- return false;
52
- }
53
- if (segment.includes('..')) {
54
- return false;
55
- }
56
- }
57
- return true;
58
- }
59
- /**
60
- * Get parent namespace path
61
- * @example getParentPath(['user', 'preferences', 'coding']) -> ['user', 'preferences']
62
- */
63
- export function getParentPath(path) {
64
- if (path.length <= 1)
65
- return null;
66
- return path.slice(0, -1);
67
- }
68
- /**
69
- * Join namespace path segments
70
- */
71
- export function joinNamespacePath(...segments) {
72
- return segments.flat().filter(Boolean);
73
- }
74
- //# sourceMappingURL=uri-parser.js.map
@@ -1,61 +0,0 @@
1
- /**
2
- * QMD Hybrid Search Integration
3
- *
4
- * Integrates QMD's BM25+vector+rerank pipeline with Squish memories.
5
- * Provides enhanced search capabilities when QMD is available.
6
- *
7
- * QMD Search Pipeline:
8
- * 1. Query Expansion (LLM generates alternative queries)
9
- * 2. Parallel BM25 (FTS5) + Vector Search
10
- * 3. RRF Fusion (Reciprocal Rank Fusion)
11
- * 4. LLM Re-ranking (yes/no with logprobs)
12
- * 5. Position-Aware Blending
13
- *
14
- * Installation: bun install -g qmd
15
- * GitHub: https://github.com/tobi/qmd
16
- */
17
- import type { SearchInput, SearchResult } from '../memory/memories.js';
18
- export interface QMDSearchOptions extends SearchInput {
19
- useHybrid?: boolean;
20
- collection?: string;
21
- includeSquishResults?: boolean;
22
- }
23
- export interface QMDHybridSearchResult extends SearchResult {
24
- qmdScore?: number;
25
- source: 'squish' | 'qmd' | 'hybrid';
26
- }
27
- /**
28
- * Search memories using QMD's hybrid search
29
- *
30
- * @param options - Search options including query, type, limit, etc.
31
- * @returns QMD-enhanced search results
32
- */
33
- export declare function searchWithQMD(options: QMDSearchOptions): Promise<QMDHybridSearchResult[]>;
34
- /**
35
- * Fused search: combine Squish and QMD results
36
- *
37
- * Runs both searches in parallel and merges results with deduplication.
38
- *
39
- * @param options - Search options
40
- * @returns Fused search results from both sources
41
- */
42
- export declare function fusedSearch(options: QMDSearchOptions): Promise<QMDHybridSearchResult[]>;
43
- /**
44
- * Check if QMD is available and configured
45
- *
46
- * @returns true if QMD is enabled and available
47
- */
48
- export declare function isQMDAvailable(): Promise<boolean>;
49
- /**
50
- * Get QMD status and collection info
51
- *
52
- * @returns QMD status or null if unavailable
53
- */
54
- export declare function getQMDStatus(): Promise<{
55
- available: boolean;
56
- collections: Array<{
57
- name: string;
58
- documentCount: number;
59
- }>;
60
- } | null>;
61
- //# sourceMappingURL=qmd-search.d.ts.map
@@ -1,178 +0,0 @@
1
- /**
2
- * QMD Hybrid Search Integration
3
- *
4
- * Integrates QMD's BM25+vector+rerank pipeline with Squish memories.
5
- * Provides enhanced search capabilities when QMD is available.
6
- *
7
- * QMD Search Pipeline:
8
- * 1. Query Expansion (LLM generates alternative queries)
9
- * 2. Parallel BM25 (FTS5) + Vector Search
10
- * 3. RRF Fusion (Reciprocal Rank Fusion)
11
- * 4. LLM Re-ranking (yes/no with logprobs)
12
- * 5. Position-Aware Blending
13
- *
14
- * Installation: bun install -g qmd
15
- * GitHub: https://github.com/tobi/qmd
16
- */
17
- import { getQMDClient } from '../embeddings/qmd-client.js';
18
- import { search } from '../memory/memories.js';
19
- import { logger } from '../logger.js';
20
- import { config } from '../../config.js';
21
- /**
22
- * Search memories using QMD's hybrid search
23
- *
24
- * @param options - Search options including query, type, limit, etc.
25
- * @returns QMD-enhanced search results
26
- */
27
- export async function searchWithQMD(options) {
28
- const client = await getQMDClient();
29
- if (!(await client.isAvailable())) {
30
- logger.warn('QMD unavailable, falling back to Squish search');
31
- // Fallback to Squish search
32
- const squishResults = await search(options);
33
- return squishResults.map((r) => ({
34
- ...r,
35
- source: 'squish'
36
- }));
37
- }
38
- // Determine collection based on memory type mapping
39
- const collection = options.collection || getCollectionForType(options.type);
40
- try {
41
- let qmdResults = [];
42
- if (options.useHybrid !== false) {
43
- // Use qmd_query (hybrid with reranking) - best quality
44
- qmdResults = await client.query({
45
- query: options.query,
46
- collection,
47
- limit: options.limit || 10,
48
- minScore: 0.2
49
- });
50
- }
51
- else {
52
- // Use qmd_vsearch (semantic only) - faster
53
- qmdResults = await client.vsearch({
54
- query: options.query,
55
- collection,
56
- limit: options.limit || 10,
57
- minScore: 0.2
58
- });
59
- }
60
- // Map QMD results to Squish format
61
- return qmdResults.map((result) => ({
62
- id: result.docid || result.path,
63
- content: result.snippet || result.title,
64
- type: options.type || 'observation',
65
- tags: [],
66
- projectId: options.project ? options.project : null,
67
- similarity: result.score,
68
- qmdScore: result.score,
69
- source: 'qmd',
70
- createdAt: new Date().toISOString() // QMD doesn't provide timestamps
71
- }));
72
- }
73
- catch (error) {
74
- logger.error(`QMD search failed: ${error}`);
75
- // Fallback to Squish search
76
- const squishResults = await search(options);
77
- return squishResults.map((r) => ({
78
- ...r,
79
- source: 'squish'
80
- }));
81
- }
82
- }
83
- /**
84
- * Fused search: combine Squish and QMD results
85
- *
86
- * Runs both searches in parallel and merges results with deduplication.
87
- *
88
- * @param options - Search options
89
- * @returns Fused search results from both sources
90
- */
91
- export async function fusedSearch(options) {
92
- const client = await getQMDClient();
93
- const qmdAvailable = await client.isAvailable();
94
- // Run searches in parallel
95
- const results = await Promise.allSettled([
96
- search(options),
97
- qmdAvailable ? searchWithQMD({ ...options, includeSquishResults: false }) : []
98
- ]);
99
- const squishResults = results[0].status === 'fulfilled'
100
- ? results[0].value.map((r) => ({ ...r, source: 'squish' }))
101
- : [];
102
- const qmdResults = results[1].status === 'fulfilled'
103
- ? results[1].value
104
- : [];
105
- // Deduplicate by content similarity
106
- const seenContent = new Set();
107
- const merged = [];
108
- for (const result of [...squishResults, ...qmdResults]) {
109
- // Create a content key for deduplication (first 100 chars)
110
- const contentKey = result.content.substring(0, 100);
111
- if (!seenContent.has(contentKey)) {
112
- seenContent.add(contentKey);
113
- merged.push(result);
114
- }
115
- }
116
- // Re-rank by combined score
117
- merged.sort((a, b) => {
118
- const scoreA = (a.similarity || 0) + (a.qmdScore || 0) / 2;
119
- const scoreB = (b.similarity || 0) + (b.qmdScore || 0) / 2;
120
- return scoreB - scoreA;
121
- });
122
- return merged.slice(0, options.limit || 10);
123
- }
124
- /**
125
- * Get QMD collection name for a memory type
126
- *
127
- * Uses the configured collection mapping from config.
128
- *
129
- * @param type - Memory type (observation, fact, decision, context, preference)
130
- * @returns QMD collection name
131
- */
132
- function getCollectionForType(type) {
133
- if (!type) {
134
- return 'squish-all';
135
- }
136
- const mapping = config.qmdCollectionMapping || {};
137
- return mapping[type] || `squish-${type}`;
138
- }
139
- /**
140
- * Check if QMD is available and configured
141
- *
142
- * @returns true if QMD is enabled and available
143
- */
144
- export async function isQMDAvailable() {
145
- if (!config.qmdEnabled) {
146
- return false;
147
- }
148
- try {
149
- const client = await getQMDClient();
150
- return await client.isAvailable();
151
- }
152
- catch {
153
- return false;
154
- }
155
- }
156
- /**
157
- * Get QMD status and collection info
158
- *
159
- * @returns QMD status or null if unavailable
160
- */
161
- export async function getQMDStatus() {
162
- try {
163
- const client = await getQMDClient();
164
- const available = await client.isAvailable();
165
- if (!available) {
166
- return { available: false, collections: [] };
167
- }
168
- const status = await client.status();
169
- return {
170
- available: true,
171
- collections: status?.collections || []
172
- };
173
- }
174
- catch {
175
- return null;
176
- }
177
- }
178
- //# sourceMappingURL=qmd-search.js.map
@@ -1,20 +0,0 @@
1
- /** Self-Iteration Job - Auto-extract key facts from ended conversations
2
- *
3
- * Processes conversations to extract memories and generate summaries
4
- */
5
- import { type JobHandler } from '../scheduler/cron-scheduler.js';
6
- export interface SelfIterationConfig {
7
- enabled: boolean;
8
- extractFacts: boolean;
9
- generateSummaries: boolean;
10
- consolidateMemories: boolean;
11
- minMessageCount: number;
12
- maxMessagesToProcess: number;
13
- }
14
- declare const DEFAULT_CONFIG: SelfIterationConfig;
15
- /**
16
- * Register self-iteration job handler
17
- */
18
- declare const selfIterationHandler: JobHandler;
19
- export { selfIterationHandler, DEFAULT_CONFIG };
20
- //# sourceMappingURL=self-iteration-job.d.ts.map