squish-memory 1.1.5 → 1.2.1

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 (646) 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 +44 -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/{dist/core/algorithms/index.js → core/algorithms/index.ts} +39 -26
  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/{dist/core/lib/db-client.d.ts → core/lib/db-client.ts} +168 -114
  81. package/core/lib/parse-embedding.ts +59 -0
  82. package/{dist/core/lib/schemas.js → core/lib/schemas.ts} +102 -87
  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/{dist/core/memory/index.js → core/memory/index.ts} +11 -10
  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/{dist/core/places/index.js → core/places/index.ts} +12 -12
  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 +590 -0
  140. package/core/scheduler/heartbeat.ts +91 -0
  141. package/{dist/core/scheduler/index.js → core/scheduler/index.ts} +8 -8
  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/{dist/core/search/index.js → core/search/index.ts} +4 -5
  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/{dist/core/session/index.js → core/session/index.ts} +7 -7
  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/{dist/core/snapshots/cleanup.js → core/snapshots/cleanup.ts} +13 -12
  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/{dist/core/summarization/cleanup.js → core/summarization/cleanup.ts} +13 -12
  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/{dist/core/utils/vector-operations.js → core/utils/vector-operations.ts} +135 -129
  185. package/core/utils/version-management.ts +74 -0
  186. package/core/worker.ts +333 -0
  187. package/db/adapter.ts +215 -0
  188. package/{dist/db/bootstrap.js → db/bootstrap.ts} +388 -418
  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/mcp.json.example +8 -11
  220. package/package.json +140 -159
  221. package/packages/cli/package.json +22 -0
  222. package/packages/cli/src/commands/clean.ts +68 -0
  223. package/packages/cli/src/commands/context.ts +79 -0
  224. package/packages/cli/src/commands/doctor.ts +357 -0
  225. package/packages/cli/src/commands/forget.ts +72 -0
  226. package/packages/cli/src/commands/health.ts +36 -0
  227. package/packages/cli/src/commands/inspect.ts +41 -0
  228. package/packages/cli/src/commands/link.ts +50 -0
  229. package/packages/cli/src/commands/migrate.ts +93 -0
  230. package/packages/cli/src/commands/recall.ts +99 -0
  231. package/packages/cli/src/commands/recent.ts +57 -0
  232. package/packages/cli/src/commands/remember.ts +139 -0
  233. package/packages/cli/src/commands/run.ts +58 -0
  234. package/packages/cli/src/commands/stale.ts +43 -0
  235. package/packages/cli/src/commands/stats.ts +42 -0
  236. package/packages/cli/src/index.ts +57 -0
  237. package/packages/cli/tsconfig.json +24 -0
  238. package/packages/mcp/package.json +26 -0
  239. package/packages/mcp/src/index.ts +940 -0
  240. package/packages/mcp/tsconfig.json +20 -0
  241. package/skills/squish-memory/SKILL.md +38 -35
  242. package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
  243. package/skills/squish-memory/references/claude-desktop.json +12 -0
  244. package/skills/squish-memory/references/openclaw.json +13 -0
  245. package/skills/squish-memory/references/opencode.json +14 -0
  246. package/config/hooks/claude-code-hooks.json +0 -39
  247. package/config/hooks/cursor-hooks.json +0 -30
  248. package/config/hooks/opencode-hooks.json +0 -30
  249. package/config/hooks/windsurf-hooks.json +0 -30
  250. package/config/mcp-cli-fallback-policy.json +0 -22
  251. package/config/mcp.json +0 -38
  252. package/config/plugin-manifest.json +0 -101
  253. package/config/plugin-manifest.schema.json +0 -244
  254. package/config/plugin.json +0 -32
  255. package/config/remote-memory-policy.json +0 -32
  256. package/core/commands/context-paging.md +0 -51
  257. package/core/commands/context-status.md +0 -22
  258. package/core/commands/context.md +0 -5
  259. package/core/commands/core-memory.md +0 -56
  260. package/core/commands/health.md +0 -5
  261. package/core/commands/init.md +0 -39
  262. package/core/commands/merge.md +0 -113
  263. package/core/commands/recall.md +0 -5
  264. package/core/commands/remember.md +0 -11
  265. package/core/commands/search.md +0 -10
  266. package/dist/config.d.ts +0 -83
  267. package/dist/config.js +0 -242
  268. package/dist/core/adapters/config/claude-code.d.ts +0 -45
  269. package/dist/core/adapters/config/claude-code.js +0 -113
  270. package/dist/core/adapters/config/cursor.d.ts +0 -26
  271. package/dist/core/adapters/config/cursor.js +0 -74
  272. package/dist/core/adapters/config/opencode.d.ts +0 -23
  273. package/dist/core/adapters/config/opencode.js +0 -73
  274. package/dist/core/adapters/config/windsurf.d.ts +0 -26
  275. package/dist/core/adapters/config/windsurf.js +0 -74
  276. package/dist/core/adapters/index.d.ts +0 -45
  277. package/dist/core/adapters/index.js +0 -84
  278. package/dist/core/adapters/scripts/install-adapter.d.ts +0 -19
  279. package/dist/core/adapters/scripts/install-adapter.js +0 -149
  280. package/dist/core/adapters/timeline.d.ts +0 -23
  281. package/dist/core/adapters/timeline.js +0 -88
  282. package/dist/core/adapters/types.d.ts +0 -157
  283. package/dist/core/adapters/types.js +0 -50
  284. package/dist/core/algorithms/analytics/token-estimator.d.ts +0 -50
  285. package/dist/core/algorithms/analytics/token-estimator.js +0 -154
  286. package/dist/core/algorithms/detection/hash-filters.d.ts +0 -47
  287. package/dist/core/algorithms/detection/hash-filters.js +0 -190
  288. package/dist/core/algorithms/detection/semantic-ranker.d.ts +0 -32
  289. package/dist/core/algorithms/detection/semantic-ranker.js +0 -118
  290. package/dist/core/algorithms/detection/two-stage-detector.d.ts +0 -52
  291. package/dist/core/algorithms/detection/two-stage-detector.js +0 -299
  292. package/dist/core/algorithms/handlers/approve-merge.d.ts +0 -22
  293. package/dist/core/algorithms/handlers/approve-merge.js +0 -179
  294. package/dist/core/algorithms/handlers/detect-duplicates.d.ts +0 -47
  295. package/dist/core/algorithms/handlers/detect-duplicates.js +0 -145
  296. package/dist/core/algorithms/handlers/get-stats.d.ts +0 -39
  297. package/dist/core/algorithms/handlers/get-stats.js +0 -88
  298. package/dist/core/algorithms/handlers/list-proposals.d.ts +0 -45
  299. package/dist/core/algorithms/handlers/list-proposals.js +0 -83
  300. package/dist/core/algorithms/handlers/preview-merge.d.ts +0 -39
  301. package/dist/core/algorithms/handlers/preview-merge.js +0 -93
  302. package/dist/core/algorithms/handlers/reject-merge.d.ts +0 -28
  303. package/dist/core/algorithms/handlers/reject-merge.js +0 -69
  304. package/dist/core/algorithms/handlers/reverse-merge.d.ts +0 -21
  305. package/dist/core/algorithms/handlers/reverse-merge.js +0 -121
  306. package/dist/core/algorithms/index.d.ts +0 -21
  307. package/dist/core/algorithms/operations/cache-maintenance.d.ts +0 -12
  308. package/dist/core/algorithms/operations/cache-maintenance.js +0 -157
  309. package/dist/core/algorithms/safety/safety-checks.d.ts +0 -22
  310. package/dist/core/algorithms/safety/safety-checks.js +0 -179
  311. package/dist/core/algorithms/strategies/merge-strategies.d.ts +0 -50
  312. package/dist/core/algorithms/strategies/merge-strategies.js +0 -288
  313. package/dist/core/algorithms/types.d.ts +0 -133
  314. package/dist/core/algorithms/types.js +0 -5
  315. package/dist/core/algorithms/utils/response-builder.d.ts +0 -28
  316. package/dist/core/algorithms/utils/response-builder.js +0 -37
  317. package/dist/core/associations.d.ts +0 -31
  318. package/dist/core/associations.js +0 -248
  319. package/dist/core/autosave.d.ts +0 -19
  320. package/dist/core/autosave.js +0 -16
  321. package/dist/core/commands/managed-sync.d.ts +0 -10
  322. package/dist/core/commands/managed-sync.js +0 -64
  323. package/dist/core/commands/mcp-server.d.ts +0 -3
  324. package/dist/core/commands/mcp-server.js +0 -739
  325. package/dist/core/consolidation.d.ts +0 -37
  326. package/dist/core/consolidation.js +0 -248
  327. package/dist/core/context/agent-context.d.ts +0 -106
  328. package/dist/core/context/agent-context.js +0 -274
  329. package/dist/core/context/context-paging.d.ts +0 -80
  330. package/dist/core/context/context-paging.js +0 -328
  331. package/dist/core/context/context-window.d.ts +0 -40
  332. package/dist/core/context/context-window.js +0 -177
  333. package/dist/core/context/context.d.ts +0 -7
  334. package/dist/core/context/context.js +0 -22
  335. package/dist/core/embeddings/google-multimodal.d.ts +0 -14
  336. package/dist/core/embeddings/google-multimodal.js +0 -142
  337. package/dist/core/embeddings/qmd-client.d.ts +0 -136
  338. package/dist/core/embeddings/qmd-client.js +0 -403
  339. package/dist/core/embeddings.d.ts +0 -29
  340. package/dist/core/embeddings.js +0 -454
  341. package/dist/core/error-handling.d.ts +0 -63
  342. package/dist/core/error-handling.js +0 -173
  343. package/dist/core/external-folder/index.d.ts +0 -102
  344. package/dist/core/external-folder/index.js +0 -294
  345. package/dist/core/hooks/agent-hooks.d.ts +0 -74
  346. package/dist/core/hooks/agent-hooks.js +0 -244
  347. package/dist/core/hooks/auto-tagger.d.ts +0 -19
  348. package/dist/core/hooks/auto-tagger.js +0 -155
  349. package/dist/core/hooks/capture-filter.d.ts +0 -41
  350. package/dist/core/hooks/capture-filter.js +0 -128
  351. package/dist/core/index.d.ts +0 -10
  352. package/dist/core/index.js +0 -14
  353. package/dist/core/ingestion/agent-memory.d.ts +0 -22
  354. package/dist/core/ingestion/agent-memory.js +0 -109
  355. package/dist/core/ingestion/core-memory.d.ts +0 -78
  356. package/dist/core/ingestion/core-memory.js +0 -226
  357. package/dist/core/ingestion/learnings.d.ts +0 -57
  358. package/dist/core/ingestion/learnings.js +0 -202
  359. package/dist/core/layers/generator.d.ts +0 -25
  360. package/dist/core/layers/generator.js +0 -76
  361. package/dist/core/lib/db-client.js +0 -130
  362. package/dist/core/lib/schemas.d.ts +0 -129
  363. package/dist/core/lib/utils.d.ts +0 -14
  364. package/dist/core/lib/utils.js +0 -90
  365. package/dist/core/lib/validation.d.ts +0 -38
  366. package/dist/core/lib/validation.js +0 -151
  367. package/dist/core/lifecycle.d.ts +0 -26
  368. package/dist/core/lifecycle.js +0 -302
  369. package/dist/core/local-embeddings.d.ts +0 -11
  370. package/dist/core/logger.d.ts +0 -16
  371. package/dist/core/logger.js +0 -40
  372. package/dist/core/mcp/client.d.ts +0 -17
  373. package/dist/core/mcp/client.js +0 -101
  374. package/dist/core/mcp/index.d.ts +0 -6
  375. package/dist/core/mcp/index.js +0 -6
  376. package/dist/core/mcp/server.d.ts +0 -18
  377. package/dist/core/mcp/server.js +0 -157
  378. package/dist/core/mcp/standalone-server.d.ts +0 -13
  379. package/dist/core/mcp/standalone-server.js +0 -46
  380. package/dist/core/mcp/tools.d.ts +0 -9
  381. package/dist/core/mcp/tools.js +0 -365
  382. package/dist/core/mcp/types.d.ts +0 -315
  383. package/dist/core/mcp/types.js +0 -48
  384. package/dist/core/memory/bridge-discovery.d.ts +0 -50
  385. package/dist/core/memory/bridge-discovery.js +0 -291
  386. package/dist/core/memory/categorizer.d.ts +0 -27
  387. package/dist/core/memory/categorizer.js +0 -305
  388. package/dist/core/memory/conflict-detector.d.ts +0 -7
  389. package/dist/core/memory/conflict-detector.js +0 -43
  390. package/dist/core/memory/consolidation.d.ts +0 -42
  391. package/dist/core/memory/consolidation.js +0 -303
  392. package/dist/core/memory/context-collector.d.ts +0 -10
  393. package/dist/core/memory/context-collector.js +0 -56
  394. package/dist/core/memory/contradiction-resolver.d.ts +0 -40
  395. package/dist/core/memory/contradiction-resolver.js +0 -368
  396. package/dist/core/memory/edit-workflow.d.ts +0 -19
  397. package/dist/core/memory/edit-workflow.js +0 -120
  398. package/dist/core/memory/entity-extractor.d.ts +0 -33
  399. package/dist/core/memory/entity-extractor.js +0 -336
  400. package/dist/core/memory/entity-resolver.d.ts +0 -23
  401. package/dist/core/memory/entity-resolver.js +0 -64
  402. package/dist/core/memory/fact-extractor.d.ts +0 -24
  403. package/dist/core/memory/fact-extractor.js +0 -89
  404. package/dist/core/memory/feedback-tracker.d.ts +0 -12
  405. package/dist/core/memory/feedback-tracker.js +0 -155
  406. package/dist/core/memory/hooks.d.ts +0 -88
  407. package/dist/core/memory/hooks.js +0 -174
  408. package/dist/core/memory/hybrid-retrieval.d.ts +0 -29
  409. package/dist/core/memory/hybrid-retrieval.js +0 -139
  410. package/dist/core/memory/hybrid-scorer.d.ts +0 -40
  411. package/dist/core/memory/hybrid-scorer.js +0 -284
  412. package/dist/core/memory/hybrid-search.d.ts +0 -20
  413. package/dist/core/memory/hybrid-search.js +0 -359
  414. package/dist/core/memory/importance.d.ts +0 -63
  415. package/dist/core/memory/importance.js +0 -298
  416. package/dist/core/memory/index.d.ts +0 -8
  417. package/dist/core/memory/loader.d.ts +0 -31
  418. package/dist/core/memory/loader.js +0 -141
  419. package/dist/core/memory/markdown/markdown-storage.d.ts +0 -72
  420. package/dist/core/memory/markdown/markdown-storage.js +0 -243
  421. package/dist/core/memory/memories.d.ts +0 -47
  422. package/dist/core/memory/memories.js +0 -449
  423. package/dist/core/memory/memory-lifecycle.d.ts +0 -8
  424. package/dist/core/memory/memory-lifecycle.js +0 -55
  425. package/dist/core/memory/memory-manager.d.ts +0 -15
  426. package/dist/core/memory/memory-manager.js +0 -46
  427. package/dist/core/memory/migrate.d.ts +0 -21
  428. package/dist/core/memory/migrate.js +0 -134
  429. package/dist/core/memory/normalization.d.ts +0 -22
  430. package/dist/core/memory/normalization.js +0 -26
  431. package/dist/core/memory/progressive-disclosure.d.ts +0 -43
  432. package/dist/core/memory/progressive-disclosure.js +0 -280
  433. package/dist/core/memory/query-processor.d.ts +0 -21
  434. package/dist/core/memory/query-processor.js +0 -72
  435. package/dist/core/memory/query-rewriter.d.ts +0 -13
  436. package/dist/core/memory/query-rewriter.js +0 -118
  437. package/dist/core/memory/response-analyzer.d.ts +0 -9
  438. package/dist/core/memory/response-analyzer.js +0 -61
  439. package/dist/core/memory/serialization.d.ts +0 -10
  440. package/dist/core/memory/serialization.js +0 -84
  441. package/dist/core/memory/stats.d.ts +0 -22
  442. package/dist/core/memory/stats.js +0 -138
  443. package/dist/core/memory/telemetry.d.ts +0 -69
  444. package/dist/core/memory/telemetry.js +0 -313
  445. package/dist/core/memory/temporal-facts.d.ts +0 -41
  446. package/dist/core/memory/temporal-facts.js +0 -283
  447. package/dist/core/memory/temporal-parser.d.ts +0 -32
  448. package/dist/core/memory/temporal-parser.js +0 -385
  449. package/dist/core/memory/trigger-detector.d.ts +0 -14
  450. package/dist/core/memory/trigger-detector.js +0 -42
  451. package/dist/core/memory/write-gate.d.ts +0 -54
  452. package/dist/core/memory/write-gate.js +0 -210
  453. package/dist/core/namespaces/index.d.ts +0 -71
  454. package/dist/core/namespaces/index.js +0 -305
  455. package/dist/core/namespaces/uri-parser.d.ts +0 -31
  456. package/dist/core/namespaces/uri-parser.js +0 -74
  457. package/dist/core/obsidian-vault.d.ts +0 -30
  458. package/dist/core/obsidian-vault.js +0 -94
  459. package/dist/core/places/index.d.ts +0 -14
  460. package/dist/core/places/memory-places.d.ts +0 -68
  461. package/dist/core/places/memory-places.js +0 -261
  462. package/dist/core/places/places.d.ts +0 -88
  463. package/dist/core/places/places.js +0 -314
  464. package/dist/core/places/rules.d.ts +0 -74
  465. package/dist/core/places/rules.js +0 -240
  466. package/dist/core/places/walking.d.ts +0 -56
  467. package/dist/core/places/walking.js +0 -121
  468. package/dist/core/projects.d.ts +0 -17
  469. package/dist/core/projects.js +0 -108
  470. package/dist/core/redis.d.ts +0 -11
  471. package/dist/core/redis.js +0 -69
  472. package/dist/core/responses.d.ts +0 -96
  473. package/dist/core/responses.js +0 -122
  474. package/dist/core/scheduler/cron-scheduler.d.ts +0 -32
  475. package/dist/core/scheduler/cron-scheduler.js +0 -332
  476. package/dist/core/scheduler/heartbeat.d.ts +0 -11
  477. package/dist/core/scheduler/heartbeat.js +0 -73
  478. package/dist/core/scheduler/index.d.ts +0 -8
  479. package/dist/core/scheduler/job-runner.d.ts +0 -11
  480. package/dist/core/scheduler/job-runner.js +0 -164
  481. package/dist/core/search/conversations.d.ts +0 -25
  482. package/dist/core/search/conversations.js +0 -110
  483. package/dist/core/search/entities.d.ts +0 -12
  484. package/dist/core/search/entities.js +0 -31
  485. package/dist/core/search/folder-context.d.ts +0 -25
  486. package/dist/core/search/folder-context.js +0 -119
  487. package/dist/core/search/graph-boost.d.ts +0 -7
  488. package/dist/core/search/graph-boost.js +0 -23
  489. package/dist/core/search/index.d.ts +0 -4
  490. package/dist/core/search/qmd-search.d.ts +0 -61
  491. package/dist/core/search/qmd-search.js +0 -178
  492. package/dist/core/security/encrypt.d.ts +0 -6
  493. package/dist/core/security/encrypt.js +0 -47
  494. package/dist/core/security/governance.d.ts +0 -26
  495. package/dist/core/security/governance.js +0 -79
  496. package/dist/core/security/privacy.d.ts +0 -23
  497. package/dist/core/security/privacy.js +0 -82
  498. package/dist/core/security/secret-detector.d.ts +0 -32
  499. package/dist/core/security/secret-detector.js +0 -88
  500. package/dist/core/session/auto-load.d.ts +0 -6
  501. package/dist/core/session/auto-load.js +0 -119
  502. package/dist/core/session/index.d.ts +0 -7
  503. package/dist/core/session/self-iteration-job.d.ts +0 -20
  504. package/dist/core/session/self-iteration-job.js +0 -282
  505. package/dist/core/session/session-hooks.d.ts +0 -18
  506. package/dist/core/session/session-hooks.js +0 -58
  507. package/dist/core/session/types.d.ts +0 -26
  508. package/dist/core/session/types.js +0 -10
  509. package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
  510. package/dist/core/session-hooks/self-iteration-job.js +0 -282
  511. package/dist/core/session-hooks/session-hooks.d.ts +0 -18
  512. package/dist/core/session-hooks/session-hooks.js +0 -58
  513. package/dist/core/snapshots/cleanup.d.ts +0 -9
  514. package/dist/core/snapshots/comparison.d.ts +0 -19
  515. package/dist/core/snapshots/comparison.js +0 -43
  516. package/dist/core/snapshots/creation.d.ts +0 -19
  517. package/dist/core/snapshots/creation.js +0 -126
  518. package/dist/core/snapshots/retrieval.d.ts +0 -7
  519. package/dist/core/snapshots/retrieval.js +0 -41
  520. package/dist/core/snapshots/stats.d.ts +0 -11
  521. package/dist/core/snapshots/stats.js +0 -52
  522. package/dist/core/snapshots.d.ts +0 -29
  523. package/dist/core/snapshots.js +0 -220
  524. package/dist/core/storage/cache.d.ts +0 -13
  525. package/dist/core/storage/cache.js +0 -202
  526. package/dist/core/storage/database.d.ts +0 -12
  527. package/dist/core/storage/database.js +0 -12
  528. package/dist/core/summarization/cleanup.d.ts +0 -9
  529. package/dist/core/summarization/queries.d.ts +0 -9
  530. package/dist/core/summarization/queries.js +0 -28
  531. package/dist/core/summarization/stats.d.ts +0 -14
  532. package/dist/core/summarization/stats.js +0 -52
  533. package/dist/core/summarization/strategies.d.ts +0 -24
  534. package/dist/core/summarization/strategies.js +0 -28
  535. package/dist/core/summarization.d.ts +0 -37
  536. package/dist/core/summarization.js +0 -188
  537. package/dist/core/sync/qmd-sync.d.ts +0 -94
  538. package/dist/core/sync/qmd-sync.js +0 -201
  539. package/dist/core/temporal-facts.d.ts +0 -54
  540. package/dist/core/temporal-facts.js +0 -193
  541. package/dist/core/toon.d.ts +0 -43
  542. package/dist/core/toon.js +0 -160
  543. package/dist/core/tracing/collector.d.ts +0 -111
  544. package/dist/core/tracing/collector.js +0 -350
  545. package/dist/core/tracing/visualizer.d.ts +0 -32
  546. package/dist/core/tracing/visualizer.js +0 -165
  547. package/dist/core/utils/cleanup-operations.d.ts +0 -13
  548. package/dist/core/utils/cleanup-operations.js +0 -44
  549. package/dist/core/utils/content-extraction.d.ts +0 -19
  550. package/dist/core/utils/content-extraction.js +0 -75
  551. package/dist/core/utils/filter-builder.d.ts +0 -13
  552. package/dist/core/utils/filter-builder.js +0 -44
  553. package/dist/core/utils/history-traversal.d.ts +0 -13
  554. package/dist/core/utils/history-traversal.js +0 -50
  555. package/dist/core/utils/memory-operations.d.ts +0 -17
  556. package/dist/core/utils/memory-operations.js +0 -43
  557. package/dist/core/utils/query-operations.d.ts +0 -18
  558. package/dist/core/utils/query-operations.js +0 -65
  559. package/dist/core/utils/summarization-helpers.d.ts +0 -21
  560. package/dist/core/utils/summarization-helpers.js +0 -38
  561. package/dist/core/utils/temporal-queries.d.ts +0 -13
  562. package/dist/core/utils/temporal-queries.js +0 -27
  563. package/dist/core/utils/vector-operations.d.ts +0 -71
  564. package/dist/core/utils/version-management.d.ts +0 -9
  565. package/dist/core/utils/version-management.js +0 -61
  566. package/dist/core/worker.d.ts +0 -82
  567. package/dist/core/worker.js +0 -272
  568. package/dist/db/adapter.d.ts +0 -7
  569. package/dist/db/adapter.js +0 -175
  570. package/dist/db/bootstrap.d.ts +0 -9
  571. package/dist/db/drizzle/schema-sqlite.d.ts +0 -4837
  572. package/dist/db/drizzle/schema-sqlite.js +0 -684
  573. package/dist/db/drizzle/schema.d.ts +0 -4082
  574. package/dist/db/drizzle/schema.js +0 -770
  575. package/dist/db/drizzle.config.d.ts +0 -3
  576. package/dist/db/drizzle.config.js +0 -12
  577. package/dist/db/index.d.ts +0 -7
  578. package/dist/db/index.js +0 -89
  579. package/dist/db/neon.d.ts +0 -8
  580. package/dist/db/neon.js +0 -20
  581. package/dist/db/schema/index.d.ts +0 -40
  582. package/dist/db/schema/index.js +0 -105
  583. package/dist/db/schema/tables/context-sessions.d.ts +0 -9
  584. package/dist/db/schema/tables/context-sessions.js +0 -37
  585. package/dist/db/schema/tables/conversations.d.ts +0 -9
  586. package/dist/db/schema/tables/conversations.js +0 -47
  587. package/dist/db/schema/tables/core-memory.d.ts +0 -9
  588. package/dist/db/schema/tables/core-memory.js +0 -41
  589. package/dist/db/schema/tables/entities.d.ts +0 -9
  590. package/dist/db/schema/tables/entities.js +0 -39
  591. package/dist/db/schema/tables/entity-relations.d.ts +0 -9
  592. package/dist/db/schema/tables/entity-relations.js +0 -31
  593. package/dist/db/schema/tables/learnings.d.ts +0 -9
  594. package/dist/db/schema/tables/learnings.js +0 -66
  595. package/dist/db/schema/tables/memories.d.ts +0 -9
  596. package/dist/db/schema/tables/memories.js +0 -161
  597. package/dist/db/schema/tables/memory-associations.d.ts +0 -9
  598. package/dist/db/schema/tables/memory-associations.js +0 -39
  599. package/dist/db/schema/tables/memory-hash-cache.d.ts +0 -9
  600. package/dist/db/schema/tables/memory-hash-cache.js +0 -29
  601. package/dist/db/schema/tables/memory-merge-history.d.ts +0 -9
  602. package/dist/db/schema/tables/memory-merge-history.js +0 -33
  603. package/dist/db/schema/tables/memory-merge-proposals.d.ts +0 -9
  604. package/dist/db/schema/tables/memory-merge-proposals.js +0 -39
  605. package/dist/db/schema/tables/messages.d.ts +0 -9
  606. package/dist/db/schema/tables/messages.js +0 -41
  607. package/dist/db/schema/tables/namespaces.d.ts +0 -9
  608. package/dist/db/schema/tables/namespaces.js +0 -37
  609. package/dist/db/schema/tables/projects.d.ts +0 -9
  610. package/dist/db/schema/tables/projects.js +0 -31
  611. package/dist/db/schema/tables/users.d.ts +0 -9
  612. package/dist/db/schema/tables/users.js +0 -27
  613. package/dist/db/schema.d.ts +0 -3
  614. package/dist/db/schema.js +0 -11
  615. package/dist/db/supabase.d.ts +0 -9
  616. package/dist/db/supabase.js +0 -24
  617. package/dist/index.d.ts +0 -7
  618. package/dist/index.js +0 -1677
  619. package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
  620. package/dist/webui/server.d.ts +0 -5
  621. package/dist/webui/server.js +0 -642
  622. package/generated/mcp/manifest.json +0 -23
  623. package/generated/mcp/mcp-servers.json +0 -25
  624. package/generated/mcp/mcporter.json +0 -34
  625. package/generated/mcp/openclaw-memory-qmd.json +0 -17
  626. package/generated/mcp/runtime.json +0 -12
  627. package/scripts/README.md +0 -60
  628. package/scripts/build-release.sh +0 -36
  629. package/scripts/check-secrets.js +0 -132
  630. package/scripts/copy-runtime-assets.mjs +0 -26
  631. package/scripts/generate-mcp.mjs +0 -264
  632. package/scripts/github-release.sh +0 -77
  633. package/scripts/init-dirs.mjs +0 -13
  634. package/scripts/install-claude-code.sh +0 -85
  635. package/scripts/install-cursor.sh +0 -56
  636. package/scripts/install-hooks.sh +0 -73
  637. package/scripts/install-interactive.mjs +0 -357
  638. package/scripts/install-opencode.sh +0 -75
  639. package/scripts/install-plugin.mjs +0 -415
  640. package/scripts/install-windsurf.sh +0 -67
  641. package/scripts/remote-preflight.mjs +0 -62
  642. package/scripts/squish-fallback.mjs +0 -132
  643. package/scripts/test-interactive.mjs +0 -131
  644. package/scripts/verify-mcp.mjs +0 -214
  645. package/skills/squish-memory/scripts/install.mjs +0 -335
  646. package/skills/squish-memory/write_skill.js +0 -2
@@ -0,0 +1,244 @@
1
+ /**
2
+ * Temporal Facts System
3
+ * Manages versioned facts with validity windows
4
+ */
5
+
6
+ import { and, eq, lte, gte, or, isNull, desc } from 'drizzle-orm';
7
+ import { randomUUID } from 'crypto';
8
+ import { getDb } from '../db/index.js';
9
+ import { getSchema } from '../db/schema.js';
10
+ import { traverseSupersededChain } from './utils/history-traversal.js';
11
+ import { createNewFactVersion } from './utils/version-management.js';
12
+ import { buildFactAtTimeQuery } from './utils/temporal-queries.js';
13
+ import { logger } from './logger.js';
14
+
15
+ /**
16
+ * Store a new fact with temporal validity
17
+ */
18
+ export async function storeFact(
19
+ content: string,
20
+ options: {
21
+ validFrom?: Date;
22
+ validTo?: Date;
23
+ confidence?: number;
24
+ tags?: string[];
25
+ projectId?: string;
26
+ } = {}
27
+ ): Promise<string> {
28
+ try {
29
+ const db = await getDb();
30
+ const schema = await getSchema();
31
+
32
+ const factId = randomUUID();
33
+
34
+ await (db as any).insert(schema.memories).values({
35
+ id: factId,
36
+ type: 'fact',
37
+ sector: 'semantic',
38
+ content,
39
+ confidence: options.confidence || 100,
40
+ validFrom: options.validFrom || new Date(),
41
+ validTo: options.validTo || null,
42
+ version: 1,
43
+ tags: options.tags || [],
44
+ projectId: options.projectId || null,
45
+ createdAt: new Date(),
46
+ updatedAt: new Date(),
47
+ });
48
+
49
+ return factId;
50
+ } catch (error) {
51
+ logger.error('Error storing fact', error);
52
+ throw error;
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Update a fact by creating a new version
58
+ */
59
+ export async function updateFact(
60
+ previousFactId: string,
61
+ newContent: string,
62
+ reason: string
63
+ ): Promise<string> {
64
+ return createNewFactVersion(previousFactId, newContent, {}, reason);
65
+ }
66
+
67
+ /**
68
+ * Query facts valid at a specific point in time
69
+ */
70
+ export async function queryFactsAtTime(
71
+ timestamp: Date = new Date(),
72
+ options: {
73
+ minConfidence?: number;
74
+ tags?: string[];
75
+ projectId?: string;
76
+ limit?: number;
77
+ } = {}
78
+ ): Promise<any[]> {
79
+ try {
80
+ const db = await getDb();
81
+ const schema = await getSchema();
82
+
83
+ const minConfidence = options.minConfidence || 0;
84
+ const limit = options.limit || 100;
85
+
86
+ const additionalFilters = [gte(schema.memories.confidence as any, minConfidence)];
87
+ if (options.projectId) {
88
+ additionalFilters.push(eq(schema.memories.projectId, options.projectId));
89
+ }
90
+
91
+ const where = buildFactAtTimeQuery(schema, timestamp, additionalFilters);
92
+
93
+ const results = await (db as any)
94
+ .select()
95
+ .from(schema.memories)
96
+ .where(where)
97
+ .orderBy(desc(schema.memories.confidence))
98
+ .limit(limit);
99
+
100
+ return results;
101
+ } catch (error) {
102
+ logger.error('Error querying facts at time', error);
103
+ return [];
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Get the complete version history of a fact
109
+ */
110
+ export async function getFactHistory(factId: string): Promise<any[]> {
111
+ return traverseSupersededChain(factId);
112
+ }
113
+
114
+ /**
115
+ * Apply confidence decay based on temporal distance
116
+ */
117
+ export async function applyConfidenceDecay(factId: string, ageDays: number): Promise<void> {
118
+ try {
119
+ const db = await getDb();
120
+ const schema = await getSchema();
121
+
122
+ // Confidence decays exponentially: newConfidence = originalConfidence * e^(-lambda * ageDays)
123
+ // Using lambda = 0.01 for moderate decay
124
+ const decayFactor = Math.exp(-0.01 * ageDays);
125
+
126
+ const fact = await (db as any)
127
+ .select()
128
+ .from(schema.memories)
129
+ .where(eq(schema.memories.id, factId))
130
+ .limit(1);
131
+
132
+ if (fact.length === 0) return;
133
+
134
+ const newConfidence = Math.max(0, Math.floor(fact[0].confidence * decayFactor));
135
+
136
+ await (db as any)
137
+ .update(schema.memories)
138
+ .set({ confidence: newConfidence })
139
+ .where(eq(schema.memories.id, factId));
140
+ } catch (error) {
141
+ logger.error('Error applying confidence decay', error);
142
+ }
143
+ }
144
+
145
+ /**
146
+ * Invalidate a fact (mark as no longer valid)
147
+ */
148
+ export async function invalidateFact(factId: string, reason: string): Promise<void> {
149
+ try {
150
+ const db = await getDb();
151
+ const schema = await getSchema();
152
+
153
+ await (db as any)
154
+ .update(schema.memories)
155
+ .set({
156
+ validTo: new Date(),
157
+ metadata: { invalidationReason: reason, invalidatedAt: new Date().toISOString() },
158
+ })
159
+ .where(eq(schema.memories.id, factId));
160
+ } catch (error) {
161
+ logger.error('Error invalidating fact', error);
162
+ }
163
+ }
164
+
165
+ /**
166
+ * Check if a fact is currently valid
167
+ */
168
+ export async function isFactValid(factId: string, atTime: Date = new Date()): Promise<boolean> {
169
+ try {
170
+ const db = await getDb();
171
+ const schema = await getSchema();
172
+
173
+ const additionalFilters = [eq(schema.memories.id, factId)];
174
+ const where = buildFactAtTimeQuery(schema, atTime, additionalFilters);
175
+
176
+ const fact = await (db as any)
177
+ .select()
178
+ .from(schema.memories)
179
+ .where(where)
180
+ .limit(1);
181
+
182
+ return fact.length > 0;
183
+ } catch (error) {
184
+ logger.error('Error checking fact validity', error);
185
+ return false;
186
+ }
187
+ }
188
+
189
+ /**
190
+ * Get statistics about facts
191
+ */
192
+ export async function getFactStats(projectId?: string): Promise<{
193
+ totalFacts: number;
194
+ activeFacts: number;
195
+ expiredFacts: number;
196
+ avgConfidence: number;
197
+ avgAge: number;
198
+ }> {
199
+ try {
200
+ const db = await getDb();
201
+ const schema = await getSchema();
202
+
203
+ const now = new Date();
204
+ const where = projectId
205
+ ? and(eq(schema.memories.type as any, 'fact'), eq(schema.memories.projectId, projectId))
206
+ : eq(schema.memories.type as any, 'fact');
207
+
208
+ const facts = await (db as any).select().from(schema.memories).where(where);
209
+
210
+ let active = 0;
211
+ let expired = 0;
212
+ let totalConfidence = 0;
213
+ let totalAge = 0;
214
+
215
+ for (const fact of facts) {
216
+ totalConfidence += fact.confidence || 0;
217
+
218
+ if (fact.validTo && new Date(fact.validTo) < now) {
219
+ expired++;
220
+ } else if (!fact.validTo || new Date(fact.validTo) >= now) {
221
+ active++;
222
+ }
223
+
224
+ totalAge += (now.getTime() - new Date(fact.createdAt).getTime()) / (1000 * 60 * 60 * 24);
225
+ }
226
+
227
+ return {
228
+ totalFacts: facts.length,
229
+ activeFacts: active,
230
+ expiredFacts: expired,
231
+ avgConfidence: facts.length > 0 ? totalConfidence / facts.length : 0,
232
+ avgAge: facts.length > 0 ? totalAge / facts.length : 0,
233
+ };
234
+ } catch (error) {
235
+ logger.error('Error getting fact stats', error);
236
+ return {
237
+ totalFacts: 0,
238
+ activeFacts: 0,
239
+ expiredFacts: 0,
240
+ avgConfidence: 0,
241
+ avgAge: 0,
242
+ };
243
+ }
244
+ }
@@ -0,0 +1,470 @@
1
+ /** Trace Collector - Collects search pipeline traces for debugging and performance analysis
2
+ *
3
+ * Trace storage format - All search operations are logged with timing information
4
+ * Trace retrieval - Get traces by session or ID
5
+ */
6
+
7
+ import { logger } from '../logger.js';
8
+ import { getDb } from '../../db/index.js';
9
+ import { getSchema } from '../../db/schema.js';
10
+ import { eq, desc, sql } from 'drizzle-orm';
11
+
12
+ export interface SearchTrace {
13
+ id: string; // UUID of this trace
14
+ sessionId: string | null; // Session that originated this trace
15
+ query: string;
16
+ timestamp: Date; // When trace started
17
+ totalDurationMs: number; // Total trace duration in milliseconds
18
+ metadata: Record<string, unknown>; // Additional metadata about the trace
19
+ // Stage data (stored as JSONB in schema)
20
+ queryRewrite?: QueryRewriteStage;
21
+ candidateRetrieval?: RetrievalStage;
22
+ entityFiltering?: RetrievalStage;
23
+ hybridScoring?: ScoringStage;
24
+ reranking?: RerankingStage;
25
+ resultCount?: number;
26
+ topResults?: TopResult[];
27
+ }
28
+
29
+ export interface QueryRewriteStage {
30
+ original?: string;
31
+ rewritten?: string;
32
+ method?: string;
33
+ timeMs?: number;
34
+ }
35
+
36
+ export interface RetrievalStage {
37
+ candidates?: number;
38
+ results?: number;
39
+ timeMs?: number;
40
+ entities?: string[];
41
+ }
42
+
43
+ export interface ScoringStage {
44
+ results?: number;
45
+ timeMs?: number;
46
+ }
47
+
48
+ export interface RerankingStage {
49
+ results?: number;
50
+ timeMs?: number;
51
+ }
52
+
53
+ export interface TopResult {
54
+ type?: string;
55
+ content?: string;
56
+ hybridScore?: number;
57
+ }
58
+
59
+ export interface TraceOptions {
60
+ sessionId?: string;
61
+ limit?: number; // Limit traces to retrieve
62
+ session?: string; // Filter by session ID
63
+ }
64
+
65
+ export interface TraceStats {
66
+ totalTraces: number;
67
+ totalDurationMs: number;
68
+ avgDurationMs: number;
69
+ recentSessions: number;
70
+ totalErrors: number;
71
+ errorRate: number;
72
+ }
73
+
74
+ /**
75
+ * Start a new search trace collection
76
+ */
77
+ export async function startTrace(sessionId: string, query: string): Promise<string> {
78
+ const db = await getDb();
79
+ if (!db) {
80
+ logger.error('Database unavailable for trace collection');
81
+ return '';
82
+ }
83
+
84
+ const schema = await getSchema();
85
+ const sqliteDb = db as any;
86
+
87
+ const traceId = crypto.randomUUID();
88
+ const timestamp = new Date();
89
+
90
+ // Create trace record
91
+ await sqliteDb.insert(schema.searchTraces).values({
92
+ id: traceId,
93
+ sessionId,
94
+ query,
95
+ timestamp,
96
+ resultCount: 0,
97
+ totalDurationMs: 0,
98
+ });
99
+
100
+ logger.info(`[Tracing] Started trace ${traceId}`);
101
+
102
+ return traceId;
103
+ }
104
+
105
+ /**
106
+ * Add query rewrite stage data
107
+ */
108
+ export async function addQueryRewriteStage(traceId: string, stage: QueryRewriteStage): Promise<void> {
109
+ const db = await getDb();
110
+ if (!db) return;
111
+
112
+ const schema = await getSchema();
113
+ const sqliteDb = db as any;
114
+ const data = JSON.stringify(stage);
115
+
116
+ await sqliteDb.update(schema.searchTraces)
117
+ .set({
118
+ queryRewrite: sql`CAST(? AS jsonb)`,
119
+ })
120
+ .where(eq(schema.searchTraces.id, traceId))
121
+ .set({ queryRewrite: data });
122
+
123
+ logger.debug(`[Tracing] Added queryRewrite stage to trace ${traceId}`);
124
+ }
125
+
126
+ /**
127
+ * Add candidate retrieval stage data
128
+ */
129
+ export async function addCandidateRetrievalStage(traceId: string, stage: RetrievalStage): Promise<void> {
130
+ const db = await getDb();
131
+ if (!db) return;
132
+
133
+ const schema = await getSchema();
134
+ const sqliteDb = db as any;
135
+ const data = JSON.stringify(stage);
136
+
137
+ await sqliteDb.update(schema.searchTraces)
138
+ .set({ candidateRetrieval: data })
139
+ .where(eq(schema.searchTraces.id, traceId));
140
+
141
+ logger.debug(`[Tracing] Added candidateRetrieval stage to trace ${traceId}`);
142
+ }
143
+
144
+ /**
145
+ * Add entity filtering stage data
146
+ */
147
+ export async function addEntityFilteringStage(traceId: string, stage: RetrievalStage): Promise<void> {
148
+ const db = await getDb();
149
+ if (!db) return;
150
+
151
+ const schema = await getSchema();
152
+ const sqliteDb = db as any;
153
+ const data = JSON.stringify(stage);
154
+
155
+ await sqliteDb.update(schema.searchTraces)
156
+ .set({ entityFiltering: data })
157
+ .where(eq(schema.searchTraces.id, traceId));
158
+
159
+ logger.debug(`[Tracing] Added entityFiltering stage to trace ${traceId}`);
160
+ }
161
+
162
+ /**
163
+ * Add hybrid scoring stage data
164
+ */
165
+ export async function addHybridScoringStage(traceId: string, stage: ScoringStage): Promise<void> {
166
+ const db = await getDb();
167
+ if (!db) return;
168
+
169
+ const schema = await getSchema();
170
+ const sqliteDb = db as any;
171
+ const data = JSON.stringify(stage);
172
+
173
+ await sqliteDb.update(schema.searchTraces)
174
+ .set({ hybridScoring: data })
175
+ .where(eq(schema.searchTraces.id, traceId));
176
+
177
+ logger.debug(`[Tracing] Added hybridScoring stage to trace ${traceId}`);
178
+ }
179
+
180
+ /**
181
+ * Add reranking stage data
182
+ */
183
+ export async function addRerankingStage(traceId: string, stage: RerankingStage): Promise<void> {
184
+ const db = await getDb();
185
+ if (!db) return;
186
+
187
+ const schema = await getSchema();
188
+ const sqliteDb = db as any;
189
+ const data = JSON.stringify(stage);
190
+
191
+ await sqliteDb.update(schema.searchTraces)
192
+ .set({ reranking: data })
193
+ .where(eq(schema.searchTraces.id, traceId));
194
+
195
+ logger.debug(`[Tracing] Added reranking stage to trace ${traceId}`);
196
+ }
197
+
198
+ /**
199
+ * Complete current trace (all stages done)
200
+ */
201
+ export async function completeTrace(traceId: string, results: TopResult[]): Promise<void> {
202
+ const db = await getDb();
203
+ if (!db) return;
204
+
205
+ const schema = await getSchema();
206
+ const sqliteDb = db as any;
207
+
208
+ // Get trace
209
+ const rows = await sqliteDb.select()
210
+ .from(schema.searchTraces)
211
+ .where(eq(schema.searchTraces.id, traceId))
212
+ .limit(1);
213
+
214
+ if (!rows || rows.length === 0) {
215
+ logger.warn(`[Tracing] Trace ${traceId} not found`);
216
+ return;
217
+ }
218
+
219
+ const trace = rows[0];
220
+ const startTime = trace.timestamp.getTime();
221
+ const endTime = Date.now();
222
+ const totalDurationMs = endTime - startTime;
223
+
224
+ const resultCount = results.length;
225
+ const topResults = results.slice(0, 10);
226
+
227
+ await sqliteDb.update(schema.searchTraces)
228
+ .set({
229
+ resultCount,
230
+ topResults: JSON.stringify(topResults),
231
+ totalDurationMs,
232
+ })
233
+ .where(eq(schema.searchTraces.id, traceId));
234
+
235
+ logger.info(`[Tracing] Completed trace ${traceId} with ${resultCount} results`);
236
+ }
237
+
238
+ /**
239
+ * Get traces for a session
240
+ */
241
+ export async function getTraces(options: TraceOptions = {}): Promise<SearchTrace[]> {
242
+ const db = await getDb();
243
+ if (!db) return [];
244
+
245
+ const schema = await getSchema();
246
+ const sqliteDb = db as any;
247
+
248
+ let conditions = [];
249
+
250
+ if (options.sessionId) {
251
+ conditions.push(eq(schema.searchTraces.sessionId, options.sessionId));
252
+ }
253
+
254
+ if (options.session && options.session.length > 0) {
255
+ conditions.push(eq(schema.searchTraces.sessionId, options.session));
256
+ }
257
+
258
+ const query = sqliteDb.select()
259
+ .from(schema.searchTraces)
260
+ .where(conditions.length > 0 ? eq(schema.searchTraces.sessionId, options.sessionId || options.session || '') : undefined)
261
+ .orderBy(desc(schema.searchTraces.timestamp));
262
+
263
+ if (options.limit) {
264
+ query.limit(options.limit);
265
+ }
266
+
267
+ const traces = await query;
268
+
269
+ return traces.map((row: any): SearchTrace => ({
270
+ id: row.id,
271
+ sessionId: row.session_id,
272
+ query: row.query,
273
+ timestamp: row.timestamp,
274
+ totalDurationMs: row.total_duration_ms,
275
+ metadata: row.metadata ? JSON.parse(String(row.metadata)) : {},
276
+ queryRewrite: row.query_rewrite ? JSON.parse(String(row.query_rewrite)) : undefined,
277
+ candidateRetrieval: row.candidate_retrieval ? JSON.parse(String(row.candidate_retrieval)) : undefined,
278
+ entityFiltering: row.entity_filtering ? JSON.parse(String(row.entity_filtering)) : undefined,
279
+ hybridScoring: row.hybrid_scoring ? JSON.parse(String(row.hybrid_scoring)) : undefined,
280
+ reranking: row.reranking ? JSON.parse(String(row.reranking)) : undefined,
281
+ resultCount: row.result_count,
282
+ topResults: row.top_results ? JSON.parse(String(row.top_results)) : undefined,
283
+ }));
284
+ }
285
+
286
+ /**
287
+ * Get a specific trace by ID
288
+ */
289
+ export async function getTraceById(traceId: string): Promise<SearchTrace | null> {
290
+ const db = await getDb();
291
+ if (!db) return null;
292
+
293
+ const schema = await getSchema();
294
+ const sqliteDb = db as any;
295
+
296
+ const rows = await sqliteDb.select()
297
+ .from(schema.searchTraces)
298
+ .where(eq(schema.searchTraces.id, traceId))
299
+ .limit(1);
300
+
301
+ if (rows.length === 0) return null;
302
+
303
+ const row = rows[0];
304
+
305
+ return {
306
+ id: row.id,
307
+ sessionId: row.session_id,
308
+ query: row.query,
309
+ timestamp: row.timestamp,
310
+ totalDurationMs: row.total_duration_ms,
311
+ metadata: row.metadata ? JSON.parse(String(row.metadata)) : {},
312
+ queryRewrite: row.query_rewrite ? JSON.parse(String(row.query_rewrite)) : undefined,
313
+ candidateRetrieval: row.candidate_retrieval ? JSON.parse(String(row.candidate_retrieval)) : undefined,
314
+ entityFiltering: row.entity_filtering ? JSON.parse(String(row.entity_filtering)) : undefined,
315
+ hybridScoring: row.hybrid_scoring ? JSON.parse(String(row.hybrid_scoring)) : undefined,
316
+ reranking: row.reranking ? JSON.parse(String(row.reranking)) : undefined,
317
+ resultCount: row.result_count,
318
+ topResults: row.top_results ? JSON.parse(String(row.top_results)) : undefined,
319
+ };
320
+ }
321
+
322
+ /**
323
+ * Get recent traces (limited)
324
+ */
325
+ export async function getRecentTraces(limit: number = 10): Promise<SearchTrace[]> {
326
+ const db = await getDb();
327
+ if (!db) return [];
328
+
329
+ const schema = await getSchema();
330
+ const sqliteDb = db as any;
331
+
332
+ const traces = await sqliteDb.select()
333
+ .from(schema.searchTraces)
334
+ .orderBy(desc(schema.searchTraces.timestamp))
335
+ .limit(limit);
336
+
337
+ return traces.map((row: any): SearchTrace => ({
338
+ id: row.id,
339
+ sessionId: row.session_id,
340
+ query: row.query,
341
+ timestamp: row.timestamp,
342
+ totalDurationMs: row.total_duration_ms,
343
+ metadata: row.metadata ? JSON.parse(String(row.metadata)) : {},
344
+ queryRewrite: row.query_rewrite ? JSON.parse(String(row.query_rewrite)) : undefined,
345
+ candidateRetrieval: row.candidate_retrieval ? JSON.parse(String(row.candidate_retrieval)) : undefined,
346
+ entityFiltering: row.entity_filtering ? JSON.parse(String(row.entity_filtering)) : undefined,
347
+ hybridScoring: row.hybrid_scoring ? JSON.parse(String(row.hybrid_scoring)) : undefined,
348
+ reranking: row.reranking ? JSON.parse(String(row.reranking)) : undefined,
349
+ resultCount: row.result_count,
350
+ topResults: row.top_results ? JSON.parse(String(row.top_results)) : undefined,
351
+ }));
352
+ }
353
+
354
+ /**
355
+ * Get recent session summary traces (aggregated by session)
356
+ */
357
+ export async function getSessionTraces(sessionId: string): Promise<SearchTrace[]> {
358
+ const db = await getDb();
359
+ if (!db) return [];
360
+
361
+ const schema = await getSchema();
362
+ const sqliteDb = db as any;
363
+
364
+ // Get all traces for this session
365
+ const traces = await sqliteDb.select()
366
+ .from(schema.searchTraces)
367
+ .where(eq(schema.searchTraces.sessionId, sessionId))
368
+ .orderBy(desc(schema.searchTraces.timestamp));
369
+
370
+ if (traces.length === 0) return [];
371
+
372
+ return traces.map((row: any): SearchTrace => ({
373
+ id: row.id,
374
+ sessionId: row.session_id,
375
+ query: row.query,
376
+ timestamp: row.timestamp,
377
+ totalDurationMs: row.total_duration_ms,
378
+ metadata: row.metadata ? JSON.parse(String(row.metadata)) : {},
379
+ queryRewrite: row.query_rewrite ? JSON.parse(String(row.query_rewrite)) : undefined,
380
+ candidateRetrieval: row.candidate_retrieval ? JSON.parse(String(row.candidate_retrieval)) : undefined,
381
+ entityFiltering: row.entity_filtering ? JSON.parse(String(row.entity_filtering)) : undefined,
382
+ hybridScoring: row.hybrid_scoring ? JSON.parse(String(row.hybrid_scoring)) : undefined,
383
+ reranking: row.reranking ? JSON.parse(String(row.reranking)) : undefined,
384
+ resultCount: row.result_count,
385
+ topResults: row.top_results ? JSON.parse(String(row.top_results)) : undefined,
386
+ }));
387
+ }
388
+
389
+ /**
390
+ * Create visual ASCII visualization of a trace
391
+ */
392
+ export function visualizeTrace(trace: SearchTrace): string {
393
+ const lines: string[] = [];
394
+
395
+ // Header
396
+ lines.push(`Search Trace: ${trace.id}`);
397
+ lines.push(`Session: ${trace.sessionId || 'N/A'}`);
398
+ lines.push(`Query: "${trace.query}"`);
399
+ lines.push('');
400
+
401
+ // Total duration
402
+ lines.push(`Duration: ${trace.totalDurationMs}ms (${(trace.totalDurationMs / 1000).toFixed(2)}s)`);
403
+ lines.push('');
404
+
405
+ // Stages summary
406
+ const stageNames: string[] = [];
407
+ if (trace.queryRewrite) stageNames.push(`Query Rewrite (${trace.queryRewrite.timeMs || 0}ms)`);
408
+ if (trace.candidateRetrieval) stageNames.push(`Candidate Retrieval (${trace.candidateRetrieval.timeMs || 0}ms)`);
409
+ if (trace.entityFiltering) stageNames.push(`Entity Filtering (${trace.entityFiltering.timeMs || 0}ms)`);
410
+ if (trace.hybridScoring) stageNames.push(`Hybrid Scoring (${trace.hybridScoring.timeMs || 0}ms)`);
411
+ if (trace.reranking) stageNames.push(`Reranking (${trace.reranking.timeMs || 0}ms)`);
412
+
413
+ if (stageNames.length > 0) {
414
+ lines.push('Stages:');
415
+ stageNames.forEach(name => lines.push(` - ${name}`));
416
+ }
417
+
418
+ lines.push('');
419
+
420
+ // Top results
421
+ if (trace.topResults && trace.topResults.length > 0) {
422
+ lines.push(`Top Results (${trace.topResults.length}):`);
423
+
424
+ trace.topResults.slice(0, 5).forEach((result, i) =>
425
+ lines.push(` ${i + 1}. [${result.type || 'memory'}] ${result.content?.substring(0, 50)}... (score: ${result.hybridScore?.toFixed(2)})`)
426
+ );
427
+ }
428
+
429
+ return lines.join('\n');
430
+ }
431
+
432
+ /**
433
+ * Get trace statistics (performance metrics)
434
+ */
435
+ export async function getTraceStats(): Promise<TraceStats> {
436
+ const db = await getDb();
437
+ if (!db) {
438
+ return {
439
+ totalTraces: 0,
440
+ totalDurationMs: 0,
441
+ avgDurationMs: 0,
442
+ recentSessions: 0,
443
+ totalErrors: 0,
444
+ errorRate: 0,
445
+ };
446
+ }
447
+
448
+ const schema = await getSchema();
449
+ const sqliteDb = db as any;
450
+
451
+ const traces = await sqliteDb.select()
452
+ .from(schema.searchTraces)
453
+ .limit(100);
454
+
455
+ const totalTraces = traces.length;
456
+ const totalDurationMs = traces.reduce((sum: number, t: any) => sum + (t.total_duration_ms || 0), 0);
457
+ const avgDurationMs = totalTraces > 0 ? Math.round(totalDurationMs / totalTraces) : 0;
458
+
459
+ const uniqueSessions = new Set(traces.map((t: any) => t.session_id).filter(Boolean));
460
+ const recentSessions = uniqueSessions.size;
461
+
462
+ return {
463
+ totalTraces,
464
+ totalDurationMs,
465
+ avgDurationMs,
466
+ recentSessions,
467
+ totalErrors: 0,
468
+ errorRate: 0,
469
+ };
470
+ }