squish-memory 1.0.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (704) hide show
  1. package/.env.example +146 -0
  2. package/CHANGELOG.md +202 -0
  3. package/README.md +192 -287
  4. package/{scripts → bin}/dependency-manager.mjs +217 -217
  5. package/{scripts → bin}/detect-clients.mjs +78 -78
  6. package/bin/install-interactive.mjs +321 -0
  7. package/bin/squish-mcp.mjs +46 -0
  8. package/bin/squish.mjs +33 -0
  9. package/config/mcp-migration-map.json +1 -6
  10. package/config/mcp-mode-semantics.json +10 -12
  11. package/config/mcp-remote-auth.json +3 -26
  12. package/config/mcp-universal.schema.json +5 -35
  13. package/config/settings.json +78 -22
  14. package/config.js +5 -0
  15. package/config.ts +218 -0
  16. package/core/adapters/config/claude-code.ts +133 -0
  17. package/core/adapters/config/cursor.ts +90 -0
  18. package/core/adapters/config/opencode.ts +89 -0
  19. package/core/adapters/config/windsurf.ts +90 -0
  20. package/core/adapters/index.ts +102 -0
  21. package/core/adapters/timeline.ts +116 -0
  22. package/core/adapters/types.ts +166 -0
  23. package/core/agent-preferences.ts +140 -0
  24. package/core/algorithms/analytics/token-estimator.ts +216 -0
  25. package/core/algorithms/detection/hash-filters.ts +260 -0
  26. package/core/algorithms/detection/semantic-ranker.ts +194 -0
  27. package/core/algorithms/detection/two-stage-detector.ts +421 -0
  28. package/core/algorithms/handlers/approve-merge.ts +215 -0
  29. package/core/algorithms/handlers/detect-duplicates.ts +192 -0
  30. package/core/algorithms/handlers/get-stats.ts +132 -0
  31. package/core/algorithms/handlers/list-proposals.ts +130 -0
  32. package/core/algorithms/handlers/preview-merge.ts +139 -0
  33. package/core/algorithms/handlers/reject-merge.ts +93 -0
  34. package/core/algorithms/handlers/reverse-merge.ts +155 -0
  35. package/core/algorithms/index.ts +39 -0
  36. package/core/algorithms/operations/cache-maintenance.ts +182 -0
  37. package/core/algorithms/safety/safety-checks.ts +256 -0
  38. package/core/algorithms/strategies/merge-strategies.ts +381 -0
  39. package/core/algorithms/types.ts +140 -0
  40. package/core/algorithms/utils/response-builder.ts +61 -0
  41. package/core/associations.ts +363 -0
  42. package/core/beliefs/decay.ts +289 -0
  43. package/core/beliefs/extractor.ts +131 -0
  44. package/core/beliefs/store.ts +557 -0
  45. package/core/beliefs/types.ts +38 -0
  46. package/core/commands/mcp-server.ts +5 -0
  47. package/core/compression.ts +177 -0
  48. package/core/config.js +2 -0
  49. package/core/consolidation.ts +330 -0
  50. package/core/context/agent-context.ts +388 -0
  51. package/core/context/context-paging.ts +449 -0
  52. package/core/context/context-window.ts +234 -0
  53. package/core/context/context.ts +35 -0
  54. package/core/embeddings/embeddings.ts +616 -0
  55. package/core/embeddings/google-multimodal.ts +200 -0
  56. package/core/embeddings/local-embeddings.ts +12 -0
  57. package/core/embeddings/qmd-client.ts +495 -0
  58. package/core/embeddings/transformers-local.ts +261 -0
  59. package/core/embeddings.js +4 -0
  60. package/core/error-handling.ts +206 -0
  61. package/core/external +219 -0
  62. package/core/graph/entity-deduplicator.ts +232 -0
  63. package/core/graph/graph-builder.ts +257 -0
  64. package/core/graph/graph-traversal.ts +490 -0
  65. package/core/graph/index.ts +24 -0
  66. package/core/graph/llm-entity-extractor.ts +402 -0
  67. package/core/graph/multi-hop-retrieval.ts +317 -0
  68. package/core/graph/relationship-extractor.ts +465 -0
  69. package/core/hooks/agent-hooks.ts +653 -0
  70. package/core/hooks/auto-tagger.ts +149 -0
  71. package/core/hooks/capture-filter.ts +169 -0
  72. package/core/hot-cache.ts +388 -0
  73. package/core/index.ts +10 -0
  74. package/core/ingestion/agent-memory.ts +167 -0
  75. package/core/ingestion/core-memory.ts +326 -0
  76. package/core/ingestion/learnings.ts +260 -0
  77. package/core/ingestion/signal-engine.ts +266 -0
  78. package/core/integrations/obsidian-vault.ts +197 -0
  79. package/core/layers/generator.ts +115 -0
  80. package/core/lib/db-client.ts +168 -0
  81. package/core/lib/parse-embedding.ts +59 -0
  82. package/core/lib/schemas.ts +102 -0
  83. package/core/lib/types.ts +49 -0
  84. package/core/lib/utils.ts +151 -0
  85. package/core/lib/validation.ts +180 -0
  86. package/core/lifecycle.ts +353 -0
  87. package/core/logger.ts +59 -0
  88. package/core/memory/bridge-discovery.ts +395 -0
  89. package/core/memory/categorizer.ts +390 -0
  90. package/core/memory/conflict-detector.ts +62 -0
  91. package/core/memory/consolidation.ts +372 -0
  92. package/core/memory/context-collector.ts +75 -0
  93. package/core/memory/contradiction-resolver.ts +494 -0
  94. package/core/memory/edit-workflow.ts +174 -0
  95. package/core/memory/entity-extractor.ts +426 -0
  96. package/core/memory/entity-resolver.ts +89 -0
  97. package/core/memory/explain.ts +112 -0
  98. package/core/memory/fact-deriver.ts +300 -0
  99. package/core/memory/fact-extractor.ts +120 -0
  100. package/core/memory/feedback-tracker.ts +200 -0
  101. package/core/memory/hooks.ts +230 -0
  102. package/core/memory/hybrid-retrieval.ts +65 -0
  103. package/core/memory/hybrid-scorer.ts +325 -0
  104. package/core/memory/hybrid-search.ts +748 -0
  105. package/core/memory/importance.ts +319 -0
  106. package/core/memory/index.ts +11 -0
  107. package/core/memory/loader.ts +178 -0
  108. package/core/memory/markdown/markdown-storage.ts +318 -0
  109. package/core/memory/memories.ts +565 -0
  110. package/core/memory/memory-lifecycle.ts +51 -0
  111. package/core/memory/memory-manager.ts +53 -0
  112. package/core/memory/migrate.ts +173 -0
  113. package/core/memory/normalization.ts +30 -0
  114. package/core/memory/path-strengthener.ts +211 -0
  115. package/core/memory/progressive-disclosure.ts +392 -0
  116. package/core/memory/query-processor.ts +130 -0
  117. package/core/memory/query-rewriter.ts +153 -0
  118. package/core/memory/response-analyzer.ts +81 -0
  119. package/core/memory/retrieval-feedback.ts +276 -0
  120. package/core/memory/serialization.ts +83 -0
  121. package/core/memory/stale-cleaner.ts +147 -0
  122. package/core/memory/stats.ts +181 -0
  123. package/core/memory/telemetry.ts +392 -0
  124. package/core/memory/temporal-facts.ts +356 -0
  125. package/core/memory/temporal-parser.ts +477 -0
  126. package/core/memory/trigger-detector.ts +104 -0
  127. package/core/memory/write-gate.ts +288 -0
  128. package/core/places/index.ts +14 -0
  129. package/core/places/memory-places.ts +339 -0
  130. package/core/places/places.ts +406 -0
  131. package/core/places/rules.ts +308 -0
  132. package/core/places/walking.ts +192 -0
  133. package/core/projects +89 -0
  134. package/core/projects.ts +131 -0
  135. package/core/redis.ts +82 -0
  136. package/core/responses.ts +187 -0
  137. package/core/runtime/trust-report.ts +195 -0
  138. package/core/runtime/trust-state.ts +360 -0
  139. package/core/scheduler/cron-scheduler.ts +581 -0
  140. package/core/scheduler/heartbeat.ts +91 -0
  141. package/core/scheduler/index.ts +8 -0
  142. package/core/scheduler/job-runner.ts +197 -0
  143. package/core/search/conversations.ts +166 -0
  144. package/core/search/entities.ts +46 -0
  145. package/core/search/folder-context.ts +154 -0
  146. package/core/search/graph-boost.ts +22 -0
  147. package/core/search/index.ts +4 -0
  148. package/core/search/qmd-wrapper.ts +84 -0
  149. package/core/security/encrypt.ts +51 -0
  150. package/core/security/governance.ts +102 -0
  151. package/core/security/privacy.ts +108 -0
  152. package/core/security/secret-detector.ts +122 -0
  153. package/core/session/auto-load.ts +160 -0
  154. package/core/session/entity-tracker.ts +363 -0
  155. package/core/session/index.ts +7 -0
  156. package/core/session/reference-resolver.ts +158 -0
  157. package/core/session/self-iteration-job.ts +478 -0
  158. package/core/session/session-hooks.ts +69 -0
  159. package/core/session/types.ts +36 -0
  160. package/core/session/working-set.ts +275 -0
  161. package/core/snapshots/cleanup.ts +13 -0
  162. package/core/snapshots/comparison.ts +59 -0
  163. package/core/snapshots/creation.ts +139 -0
  164. package/core/snapshots/retrieval.ts +44 -0
  165. package/core/snapshots/stats.ts +63 -0
  166. package/core/storage/cache.ts +241 -0
  167. package/core/storage/database.ts +23 -0
  168. package/core/summarization/cleanup.ts +13 -0
  169. package/core/summarization/queries.ts +32 -0
  170. package/core/summarization/stats.ts +64 -0
  171. package/core/summarization/strategies.ts +52 -0
  172. package/core/summarization.ts +248 -0
  173. package/core/temporal-facts.ts +244 -0
  174. package/core/tracing/collector.ts +470 -0
  175. package/core/tracing/visualizer.ts +195 -0
  176. package/core/utils/cleanup-operations.ts +50 -0
  177. package/core/utils/content-extraction.ts +95 -0
  178. package/core/utils/filter-builder.ts +56 -0
  179. package/core/utils/history-traversal.ts +63 -0
  180. package/core/utils/memory-operations.ts +56 -0
  181. package/core/utils/query-operations.ts +83 -0
  182. package/core/utils/summarization-helpers.ts +45 -0
  183. package/core/utils/temporal-queries.ts +39 -0
  184. package/core/utils/vector-operations.ts +135 -0
  185. package/core/utils/version-management.ts +74 -0
  186. package/core/worker.ts +324 -0
  187. package/db/adapter.ts +215 -0
  188. package/db/bootstrap.ts +1055 -0
  189. package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
  190. package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
  191. package/db/drizzle/migrations/meta/_journal.json +13 -0
  192. package/db/drizzle/schema-sqlite.ts +1032 -0
  193. package/db/drizzle/schema.ts +1128 -0
  194. package/db/drizzle.config.ts +12 -0
  195. package/db/index.ts +83 -0
  196. package/db/init.sql +5 -0
  197. package/db/migrations/associations.ts +35 -0
  198. package/db/migrations/beliefs.ts +89 -0
  199. package/db/migrations/core-memory.ts +35 -0
  200. package/db/migrations/fts.ts +59 -0
  201. package/db/migrations/index.ts +54 -0
  202. package/db/migrations/indexes.ts +36 -0
  203. package/db/migrations/learnings.ts +34 -0
  204. package/db/migrations/maintenance.ts +68 -0
  205. package/db/migrations/memories.ts +22 -0
  206. package/db/migrations/memory-places.ts +35 -0
  207. package/db/migrations/places.ts +49 -0
  208. package/db/migrations/projects.ts +21 -0
  209. package/db/migrations/tier-conversion.ts +24 -0
  210. package/db/neon.ts +22 -0
  211. package/db/schema/beliefs.ts +50 -0
  212. package/db/schema/generator.ts +159 -0
  213. package/db/schema/index.ts +58 -0
  214. package/db/schema/learnings.ts +32 -0
  215. package/db/schema/memories.ts +83 -0
  216. package/db/schema/projects.ts +33 -0
  217. package/db/schema.ts +13 -0
  218. package/db/supabase.ts +27 -0
  219. package/dist/config.d.ts +61 -14
  220. package/dist/config.js +159 -139
  221. package/dist/core/adapters/config/claude-code.d.ts +45 -0
  222. package/dist/core/adapters/config/claude-code.js +113 -0
  223. package/dist/core/adapters/config/cursor.d.ts +26 -0
  224. package/dist/core/adapters/config/cursor.js +74 -0
  225. package/dist/core/adapters/config/opencode.d.ts +23 -0
  226. package/dist/core/adapters/config/opencode.js +73 -0
  227. package/dist/core/adapters/config/windsurf.d.ts +26 -0
  228. package/dist/core/adapters/config/windsurf.js +74 -0
  229. package/dist/core/adapters/index.d.ts +45 -0
  230. package/dist/core/adapters/index.js +84 -0
  231. package/dist/core/adapters/scripts/install-adapter.d.ts +19 -0
  232. package/dist/core/adapters/scripts/install-adapter.js +149 -0
  233. package/dist/core/adapters/timeline.d.ts +23 -0
  234. package/dist/core/adapters/timeline.js +88 -0
  235. package/dist/core/adapters/types.d.ts +137 -0
  236. package/dist/core/adapters/types.js +50 -0
  237. package/dist/core/agent-preferences.d.ts +16 -0
  238. package/dist/core/agent-preferences.js +124 -0
  239. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.d.ts +1 -1
  240. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.js +3 -3
  241. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.d.ts +1 -1
  242. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.js +1 -1
  243. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.d.ts +1 -1
  244. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.js +7 -10
  245. package/dist/{algorithms → core/algorithms}/handlers/approve-merge.js +4 -4
  246. package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.js +3 -3
  247. package/dist/{algorithms → core/algorithms}/handlers/get-stats.js +3 -3
  248. package/dist/{algorithms → core/algorithms}/handlers/list-proposals.js +3 -3
  249. package/dist/{algorithms → core/algorithms}/handlers/preview-merge.js +3 -3
  250. package/dist/{algorithms → core/algorithms}/handlers/reject-merge.js +3 -3
  251. package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.js +3 -3
  252. package/dist/core/algorithms/index.d.ts +21 -0
  253. package/dist/core/algorithms/index.js +26 -0
  254. package/dist/core/algorithms/operations/cache-maintenance.d.ts +12 -0
  255. package/dist/core/algorithms/operations/cache-maintenance.js +157 -0
  256. package/dist/{algorithms → core/algorithms}/safety/safety-checks.d.ts +2 -6
  257. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.d.ts +19 -1
  258. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.js +74 -123
  259. package/dist/core/algorithms/types.d.ts +125 -0
  260. package/dist/core/algorithms/types.js +5 -0
  261. package/dist/core/associations.d.ts +3 -2
  262. package/dist/core/associations.js +37 -2
  263. package/dist/core/autosave.d.ts +19 -0
  264. package/dist/core/autosave.js +16 -0
  265. package/dist/core/beliefs/decay.d.ts +27 -0
  266. package/dist/core/beliefs/decay.js +217 -0
  267. package/dist/core/beliefs/extractor.d.ts +9 -0
  268. package/dist/core/beliefs/extractor.js +113 -0
  269. package/dist/core/beliefs/store.d.ts +46 -0
  270. package/dist/core/beliefs/store.js +466 -0
  271. package/dist/core/beliefs/types.d.ts +28 -0
  272. package/dist/core/beliefs/types.js +2 -0
  273. package/dist/core/commands/mcp-server.d.ts +2 -0
  274. package/dist/core/commands/mcp-server.js +6 -0
  275. package/dist/core/commands/remember.d.ts +24 -0
  276. package/dist/core/commands/remember.js +144 -0
  277. package/dist/core/compression.d.ts +45 -0
  278. package/dist/core/compression.js +160 -0
  279. package/dist/core/context/agent-context.d.ts +106 -0
  280. package/dist/core/context/agent-context.js +274 -0
  281. package/dist/core/{context-paging.d.ts → context/context-paging.d.ts} +2 -12
  282. package/dist/core/{context-paging.js → context/context-paging.js} +19 -39
  283. package/dist/core/context/context-window.d.ts +40 -0
  284. package/dist/core/context/context-window.js +177 -0
  285. package/dist/core/context/context.js +22 -0
  286. package/dist/core/embeddings/embeddings.d.ts +29 -0
  287. package/dist/core/embeddings/embeddings.js +546 -0
  288. package/dist/core/embeddings/google-multimodal.js +6 -2
  289. package/dist/core/embeddings/local-embeddings.d.ts +11 -0
  290. package/dist/core/embeddings/local-embeddings.js +11 -0
  291. package/dist/core/embeddings/qmd-client.js +1 -1
  292. package/dist/core/embeddings/transformers-local.d.ts +64 -0
  293. package/dist/core/embeddings/transformers-local.js +213 -0
  294. package/dist/core/embeddings.d.ts +1 -28
  295. package/dist/core/embeddings.js +2 -401
  296. package/dist/core/error-handling.d.ts +63 -0
  297. package/dist/core/error-handling.js +173 -0
  298. package/dist/core/graph/entity-deduplicator.d.ts +24 -0
  299. package/dist/core/graph/entity-deduplicator.js +183 -0
  300. package/dist/core/graph/graph-builder.d.ts +46 -0
  301. package/dist/core/graph/graph-builder.js +174 -0
  302. package/dist/core/graph/graph-traversal.d.ts +80 -0
  303. package/dist/core/graph/graph-traversal.js +315 -0
  304. package/dist/core/graph/index.d.ts +19 -0
  305. package/dist/core/graph/index.js +13 -0
  306. package/dist/core/graph/llm-entity-extractor.d.ts +49 -0
  307. package/dist/core/graph/llm-entity-extractor.js +313 -0
  308. package/dist/core/graph/multi-hop-retrieval.d.ts +48 -0
  309. package/dist/core/graph/multi-hop-retrieval.js +215 -0
  310. package/dist/core/graph/relationship-extractor.d.ts +48 -0
  311. package/dist/core/graph/relationship-extractor.js +351 -0
  312. package/dist/core/hooks/agent-hooks.d.ts +83 -0
  313. package/dist/core/hooks/agent-hooks.js +521 -0
  314. package/dist/core/hooks/auto-tagger.d.ts +19 -0
  315. package/dist/core/hooks/auto-tagger.js +155 -0
  316. package/dist/core/hooks/capture-filter.d.ts +41 -0
  317. package/dist/core/hooks/capture-filter.js +128 -0
  318. package/dist/core/hot-cache.d.ts +86 -0
  319. package/dist/core/hot-cache.js +285 -0
  320. package/dist/core/index.d.ts +9 -9
  321. package/dist/core/index.js +9 -12
  322. package/dist/core/{agent-memory.js → ingestion/agent-memory.js} +5 -7
  323. package/dist/core/{core-memory.d.ts → ingestion/core-memory.d.ts} +2 -2
  324. package/dist/core/{core-memory.js → ingestion/core-memory.js} +7 -7
  325. package/dist/core/ingestion/learnings.d.ts +57 -0
  326. package/dist/core/ingestion/learnings.js +205 -0
  327. package/dist/core/ingestion/signal-engine.d.ts +41 -0
  328. package/dist/core/ingestion/signal-engine.js +201 -0
  329. package/dist/core/integrations/obsidian-vault.d.ts +31 -0
  330. package/dist/core/integrations/obsidian-vault.js +156 -0
  331. package/dist/core/lib/db-client.d.ts +114 -0
  332. package/dist/core/lib/db-client.js +130 -0
  333. package/dist/core/lib/parse-embedding.d.ts +9 -0
  334. package/dist/core/lib/parse-embedding.js +58 -0
  335. package/dist/core/lib/schemas.d.ts +132 -0
  336. package/dist/core/lib/schemas.js +87 -0
  337. package/dist/core/lib/types.d.ts +45 -0
  338. package/dist/core/lib/types.js +6 -0
  339. package/dist/core/{utils.d.ts → lib/utils.d.ts} +5 -0
  340. package/dist/core/lib/utils.js +145 -0
  341. package/dist/core/lib/validation.d.ts +38 -0
  342. package/dist/core/lib/validation.js +151 -0
  343. package/dist/core/lifecycle.d.ts +7 -1
  344. package/dist/core/lifecycle.js +152 -42
  345. package/dist/core/logger.d.ts +1 -0
  346. package/dist/core/logger.js +13 -1
  347. package/dist/core/mcp/tools.d.ts +0 -2
  348. package/dist/core/mcp/tools.js +35 -90
  349. package/dist/core/mcp/types.d.ts +25 -253
  350. package/dist/core/mcp/types.js +2 -2
  351. package/dist/core/memory/categorizer.js +2 -0
  352. package/dist/core/memory/conflict-detector.js +1 -1
  353. package/dist/core/memory/consolidation.d.ts +1 -10
  354. package/dist/core/memory/consolidation.js +4 -39
  355. package/dist/core/memory/context-collector.js +1 -1
  356. package/dist/core/memory/edit-workflow.js +1 -1
  357. package/dist/core/memory/entity-extractor.d.ts +4 -0
  358. package/dist/core/memory/entity-extractor.js +30 -16
  359. package/dist/core/memory/entity-resolver.js +7 -7
  360. package/dist/core/memory/explain.d.ts +18 -0
  361. package/dist/core/memory/explain.js +92 -0
  362. package/dist/core/memory/fact-deriver.d.ts +31 -0
  363. package/dist/core/memory/fact-deriver.js +236 -0
  364. package/dist/core/memory/fact-extractor.js +12 -12
  365. package/dist/core/memory/feedback-tracker.js +1 -1
  366. package/dist/core/memory/hooks.d.ts +88 -0
  367. package/dist/core/memory/hooks.js +174 -0
  368. package/dist/core/memory/hybrid-retrieval.d.ts +14 -16
  369. package/dist/core/memory/hybrid-retrieval.js +25 -127
  370. package/dist/core/memory/hybrid-scorer.js +6 -23
  371. package/dist/core/memory/hybrid-search.d.ts +9 -11
  372. package/dist/core/memory/hybrid-search.js +496 -273
  373. package/dist/core/memory/importance.d.ts +2 -24
  374. package/dist/core/memory/importance.js +7 -91
  375. package/dist/core/memory/index.d.ts +1 -0
  376. package/dist/core/memory/index.js +1 -0
  377. package/dist/core/memory/loader.d.ts +31 -0
  378. package/dist/core/memory/loader.js +141 -0
  379. package/dist/core/memory/markdown/markdown-storage.d.ts +72 -0
  380. package/dist/core/memory/markdown/markdown-storage.js +243 -0
  381. package/dist/core/memory/memories.d.ts +23 -19
  382. package/dist/core/memory/memories.js +243 -228
  383. package/dist/core/memory/memory-lifecycle.d.ts +8 -0
  384. package/dist/core/memory/memory-lifecycle.js +47 -0
  385. package/dist/core/memory/migrate.d.ts +21 -0
  386. package/dist/core/memory/migrate.js +134 -0
  387. package/dist/core/memory/normalization.d.ts +7 -0
  388. package/dist/core/memory/normalization.js +26 -0
  389. package/dist/core/memory/path-strengthener.d.ts +39 -0
  390. package/dist/core/memory/path-strengthener.js +150 -0
  391. package/dist/core/memory/progressive-disclosure.js +1 -1
  392. package/dist/core/memory/query-processor.js +37 -3
  393. package/dist/core/memory/query-rewriter.js +9 -9
  394. package/dist/core/memory/retrieval-feedback.d.ts +70 -0
  395. package/dist/core/memory/retrieval-feedback.js +213 -0
  396. package/dist/core/memory/serialization.d.ts +4 -0
  397. package/dist/core/memory/serialization.js +49 -0
  398. package/dist/core/memory/stale-cleaner.d.ts +26 -0
  399. package/dist/core/memory/stale-cleaner.js +97 -0
  400. package/dist/core/memory/stats.d.ts +15 -0
  401. package/dist/core/memory/stats.js +69 -13
  402. package/dist/core/memory/temporal-facts.js +21 -0
  403. package/dist/core/memory/trigger-detector.d.ts +8 -1
  404. package/dist/core/memory/trigger-detector.js +42 -5
  405. package/dist/core/memory/write-gate.js +1 -1
  406. package/dist/core/places/index.d.ts +14 -0
  407. package/dist/core/places/index.js +14 -0
  408. package/dist/core/places/memory-places.d.ts +68 -0
  409. package/dist/core/places/memory-places.js +261 -0
  410. package/dist/core/places/places.d.ts +88 -0
  411. package/dist/core/places/places.js +314 -0
  412. package/dist/core/places/rules.d.ts +74 -0
  413. package/dist/core/places/rules.js +240 -0
  414. package/dist/core/places/walking.d.ts +56 -0
  415. package/dist/core/places/walking.js +121 -0
  416. package/dist/core/projects.d.ts +5 -0
  417. package/dist/core/projects.js +47 -18
  418. package/dist/core/responses.d.ts +96 -0
  419. package/dist/core/responses.js +122 -0
  420. package/dist/core/runtime/trust-report.d.ts +102 -0
  421. package/dist/core/runtime/trust-report.js +107 -0
  422. package/dist/core/runtime/trust-state.d.ts +12 -0
  423. package/dist/core/runtime/trust-state.js +309 -0
  424. package/dist/core/scheduler/cron-scheduler.d.ts +1 -1
  425. package/dist/core/scheduler/cron-scheduler.js +193 -10
  426. package/dist/core/scheduler/index.d.ts +1 -1
  427. package/dist/core/scheduler/index.js +1 -1
  428. package/dist/core/scheduler/job-runner.js +2 -2
  429. package/dist/core/search/conversations.js +40 -42
  430. package/dist/core/search/entities.js +6 -9
  431. package/dist/core/search/graph-boost.d.ts +7 -0
  432. package/dist/core/search/graph-boost.js +23 -0
  433. package/dist/core/search/qmd-wrapper.d.ts +36 -0
  434. package/dist/core/search/qmd-wrapper.js +58 -0
  435. package/dist/core/security/encrypt.d.ts +6 -0
  436. package/dist/core/security/encrypt.js +47 -0
  437. package/dist/core/{governance.d.ts → security/governance.d.ts} +6 -1
  438. package/dist/core/security/governance.js +79 -0
  439. package/dist/core/session/auto-load.js +34 -9
  440. package/dist/core/session/entity-tracker.d.ts +62 -0
  441. package/dist/core/session/entity-tracker.js +287 -0
  442. package/dist/core/session/index.d.ts +1 -1
  443. package/dist/core/session/index.js +1 -1
  444. package/dist/core/session/reference-resolver.d.ts +26 -0
  445. package/dist/core/session/reference-resolver.js +121 -0
  446. package/dist/core/{session-hooks → session}/self-iteration-job.d.ts +15 -0
  447. package/dist/core/{session-hooks → session}/self-iteration-job.js +195 -90
  448. package/dist/core/session/working-set.d.ts +50 -0
  449. package/dist/core/session/working-set.js +212 -0
  450. package/dist/core/snapshots/creation.d.ts +2 -8
  451. package/dist/core/snapshots/creation.js +3 -12
  452. package/dist/core/{cache.js → storage/cache.js} +2 -2
  453. package/dist/core/utils/memory-operations.js +1 -1
  454. package/dist/core/utils/summarization-helpers.d.ts +0 -4
  455. package/dist/core/utils/summarization-helpers.js +1 -6
  456. package/dist/core/utils/vector-operations.d.ts +71 -0
  457. package/dist/core/utils/vector-operations.js +129 -0
  458. package/dist/db/adapter.d.ts +3 -3
  459. package/dist/db/adapter.js +99 -88
  460. package/dist/db/bootstrap.d.ts +2 -0
  461. package/dist/db/bootstrap.js +921 -674
  462. package/dist/{drizzle → db/drizzle}/schema-sqlite.d.ts +775 -25
  463. package/dist/{drizzle → db/drizzle}/schema-sqlite.js +170 -24
  464. package/dist/{drizzle → db/drizzle}/schema.d.ts +731 -32
  465. package/dist/{drizzle → db/drizzle}/schema.js +192 -32
  466. package/dist/db/drizzle.config.d.ts +3 -0
  467. package/dist/db/drizzle.config.js +12 -0
  468. package/dist/db/index.d.ts +1 -5
  469. package/dist/db/index.js +51 -8
  470. package/dist/db/migrations/associations.d.ts +6 -0
  471. package/dist/db/migrations/associations.js +29 -0
  472. package/dist/db/migrations/beliefs.d.ts +10 -0
  473. package/dist/db/migrations/beliefs.js +76 -0
  474. package/dist/db/migrations/core-memory.d.ts +6 -0
  475. package/dist/db/migrations/core-memory.js +29 -0
  476. package/dist/db/migrations/fts.d.ts +6 -0
  477. package/dist/db/migrations/fts.js +52 -0
  478. package/dist/db/migrations/index.d.ts +25 -0
  479. package/dist/db/migrations/index.js +51 -0
  480. package/dist/db/migrations/indexes.d.ts +6 -0
  481. package/dist/db/migrations/indexes.js +30 -0
  482. package/dist/db/migrations/learnings.d.ts +7 -0
  483. package/dist/db/migrations/learnings.js +26 -0
  484. package/dist/db/migrations/maintenance.d.ts +6 -0
  485. package/dist/db/migrations/maintenance.js +61 -0
  486. package/dist/db/migrations/memories.d.ts +7 -0
  487. package/dist/db/migrations/memories.js +16 -0
  488. package/dist/db/migrations/memory-places.d.ts +6 -0
  489. package/dist/db/migrations/memory-places.js +29 -0
  490. package/dist/db/migrations/places.d.ts +6 -0
  491. package/dist/db/migrations/places.js +43 -0
  492. package/dist/db/migrations/projects.d.ts +3 -0
  493. package/dist/db/migrations/projects.js +13 -0
  494. package/dist/db/migrations/tier-conversion.d.ts +7 -0
  495. package/dist/db/migrations/tier-conversion.js +20 -0
  496. package/dist/db/neon.d.ts +8 -0
  497. package/dist/db/neon.js +20 -0
  498. package/dist/db/schema/beliefs.d.ts +9 -0
  499. package/dist/db/schema/beliefs.js +46 -0
  500. package/dist/db/schema/generator.d.ts +38 -0
  501. package/dist/db/schema/generator.js +108 -0
  502. package/dist/db/schema/index.d.ts +39 -0
  503. package/dist/db/schema/index.js +51 -0
  504. package/dist/db/schema/learnings.d.ts +7 -0
  505. package/dist/db/schema/learnings.js +30 -0
  506. package/dist/db/schema/memories.d.ts +7 -0
  507. package/dist/db/schema/memories.js +81 -0
  508. package/dist/db/schema/projects.d.ts +4 -0
  509. package/dist/db/schema/projects.js +31 -0
  510. package/dist/db/schema/tables/context-sessions.d.ts +9 -0
  511. package/dist/db/schema/tables/context-sessions.js +37 -0
  512. package/dist/db/schema/tables/conversations.d.ts +9 -0
  513. package/dist/db/schema/tables/conversations.js +47 -0
  514. package/dist/db/schema/tables/core-memory.d.ts +9 -0
  515. package/dist/db/schema/tables/core-memory.js +41 -0
  516. package/dist/db/schema/tables/entities.d.ts +9 -0
  517. package/dist/db/schema/tables/entities.js +39 -0
  518. package/dist/db/schema/tables/entity-relations.d.ts +9 -0
  519. package/dist/db/schema/tables/entity-relations.js +31 -0
  520. package/dist/db/schema/tables/learnings.d.ts +9 -0
  521. package/dist/db/schema/tables/learnings.js +66 -0
  522. package/dist/db/schema/tables/memories.d.ts +9 -0
  523. package/dist/db/schema/tables/memories.js +161 -0
  524. package/dist/db/schema/tables/memory-associations.d.ts +9 -0
  525. package/dist/db/schema/tables/memory-associations.js +39 -0
  526. package/dist/db/schema/tables/memory-hash-cache.d.ts +9 -0
  527. package/dist/db/schema/tables/memory-hash-cache.js +29 -0
  528. package/dist/db/schema/tables/memory-merge-history.d.ts +9 -0
  529. package/dist/db/schema/tables/memory-merge-history.js +33 -0
  530. package/dist/db/schema/tables/memory-merge-proposals.d.ts +9 -0
  531. package/dist/db/schema/tables/memory-merge-proposals.js +39 -0
  532. package/dist/db/schema/tables/messages.d.ts +9 -0
  533. package/dist/db/schema/tables/messages.js +41 -0
  534. package/dist/db/schema/tables/namespaces.d.ts +9 -0
  535. package/dist/db/schema/tables/namespaces.js +37 -0
  536. package/dist/db/schema/tables/projects.d.ts +9 -0
  537. package/dist/db/schema/tables/projects.js +31 -0
  538. package/dist/db/schema/tables/users.d.ts +9 -0
  539. package/dist/db/schema/tables/users.js +27 -0
  540. package/dist/db/schema.d.ts +1 -1
  541. package/dist/db/schema.js +2 -2
  542. package/dist/db/supabase.d.ts +9 -0
  543. package/dist/db/supabase.js +24 -0
  544. package/dist/packages/mcp/src/index.d.ts +3 -0
  545. package/dist/packages/mcp/src/index.js +733 -0
  546. package/mcp.json.example +8 -0
  547. package/package.json +132 -173
  548. package/packages/cli/package.json +22 -0
  549. package/packages/cli/src/commands/clean.ts +68 -0
  550. package/packages/cli/src/commands/context.ts +79 -0
  551. package/packages/cli/src/commands/doctor.ts +357 -0
  552. package/packages/cli/src/commands/forget.ts +72 -0
  553. package/packages/cli/src/commands/health.ts +36 -0
  554. package/packages/cli/src/commands/inspect.ts +41 -0
  555. package/packages/cli/src/commands/link.ts +50 -0
  556. package/packages/cli/src/commands/migrate.ts +93 -0
  557. package/packages/cli/src/commands/recall.ts +99 -0
  558. package/packages/cli/src/commands/recent.ts +57 -0
  559. package/packages/cli/src/commands/remember.ts +139 -0
  560. package/packages/cli/src/commands/run.ts +58 -0
  561. package/packages/cli/src/commands/stale.ts +43 -0
  562. package/packages/cli/src/commands/stats.ts +42 -0
  563. package/packages/cli/src/index.ts +57 -0
  564. package/packages/cli/tsconfig.json +24 -0
  565. package/packages/mcp/package.json +26 -0
  566. package/packages/mcp/src/index.ts +877 -0
  567. package/packages/mcp/tsconfig.json +20 -0
  568. package/skills/squish-memory/SKILL.md +107 -114
  569. package/skills/squish-memory/install.sh +3 -3
  570. package/skills/squish-memory/{claude-desktop.json → references/claude-desktop.json} +12 -12
  571. package/skills/squish-memory/{openclaw.json → references/openclaw.json} +13 -13
  572. package/skills/squish-memory/{opencode.json → references/opencode.json} +14 -14
  573. package/.claude-plugin/marketplace.json +0 -20
  574. package/.claude-plugin/plugin.json +0 -32
  575. package/.env.mcp.example +0 -60
  576. package/.mcp.json +0 -11
  577. package/QUICK-START.md +0 -71
  578. package/bin/squish-add.mjs +0 -32
  579. package/bin/squish-rm.mjs +0 -21
  580. package/commands/context-paging.md +0 -51
  581. package/commands/context-status.md +0 -22
  582. package/commands/context.md +0 -5
  583. package/commands/core-memory.md +0 -56
  584. package/commands/health.md +0 -5
  585. package/commands/init.md +0 -39
  586. package/commands/merge.md +0 -113
  587. package/commands/observe.md +0 -5
  588. package/commands/recall.md +0 -5
  589. package/commands/remember.md +0 -11
  590. package/commands/search.md +0 -10
  591. package/config/mcp-cli-fallback-policy.json +0 -22
  592. package/config/mcp.json +0 -38
  593. package/config/plugin-manifest.json +0 -152
  594. package/config/plugin-manifest.schema.json +0 -244
  595. package/config/remote-memory-policy.json +0 -32
  596. package/dist/api/web/index.d.ts +0 -3
  597. package/dist/api/web/index.js +0 -4
  598. package/dist/api/web/web-server.d.ts +0 -3
  599. package/dist/api/web/web-server.js +0 -6
  600. package/dist/api/web/web.d.ts +0 -4
  601. package/dist/api/web/web.js +0 -639
  602. package/dist/commands/managed-sync.d.ts +0 -10
  603. package/dist/commands/managed-sync.js +0 -64
  604. package/dist/commands/mcp-server.d.ts +0 -3
  605. package/dist/commands/mcp-server.js +0 -393
  606. package/dist/core/context.js +0 -24
  607. package/dist/core/governance.js +0 -64
  608. package/dist/core/local-embeddings.d.ts +0 -6
  609. package/dist/core/local-embeddings.js +0 -20
  610. package/dist/core/namespaces/index.d.ts +0 -71
  611. package/dist/core/namespaces/index.js +0 -305
  612. package/dist/core/namespaces/uri-parser.d.ts +0 -31
  613. package/dist/core/namespaces/uri-parser.js +0 -74
  614. package/dist/core/observations.d.ts +0 -26
  615. package/dist/core/observations.js +0 -110
  616. package/dist/core/requirements.d.ts +0 -20
  617. package/dist/core/requirements.js +0 -35
  618. package/dist/core/search/qmd-search.d.ts +0 -61
  619. package/dist/core/search/qmd-search.js +0 -178
  620. package/dist/core/snapshots.d.ts +0 -29
  621. package/dist/core/snapshots.js +0 -220
  622. package/dist/core/sync/qmd-sync.d.ts +0 -106
  623. package/dist/core/sync/qmd-sync.js +0 -213
  624. package/dist/core/utils.js +0 -74
  625. package/dist/index.d.ts +0 -19
  626. package/dist/index.js +0 -997
  627. package/generated/mcp/manifest.json +0 -23
  628. package/generated/mcp/mcp-servers.json +0 -25
  629. package/generated/mcp/mcporter.json +0 -34
  630. package/generated/mcp/openclaw-memory-qmd.json +0 -17
  631. package/generated/mcp/runtime.json +0 -12
  632. package/hooks/hooks.json +0 -52
  633. package/hooks/post-tool-use.js +0 -26
  634. package/hooks/session-end.js +0 -28
  635. package/hooks/session-start.js +0 -33
  636. package/hooks/user-prompt-submit.js +0 -26
  637. package/hooks/utils.js +0 -153
  638. package/npx-installer.js +0 -208
  639. package/packages/plugin-claude-code/README.md +0 -73
  640. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +0 -35
  641. package/packages/plugin-claude-code/dist/plugin-wrapper.js +0 -191
  642. package/packages/plugin-claude-code/package.json +0 -31
  643. package/packages/plugin-openclaw/README.md +0 -70
  644. package/packages/plugin-openclaw/dist/index.d.ts +0 -49
  645. package/packages/plugin-openclaw/dist/index.js +0 -262
  646. package/packages/plugin-openclaw/openclaw.plugin.json +0 -94
  647. package/packages/plugin-openclaw/package.json +0 -31
  648. package/packages/plugin-opencode/install.mjs +0 -217
  649. package/packages/plugin-opencode/package.json +0 -21
  650. package/plugin.json +0 -32
  651. package/scripts/build-release.sh +0 -36
  652. package/scripts/check-secrets.js +0 -132
  653. package/scripts/db/check-db.mjs +0 -88
  654. package/scripts/db/fix-all-columns.mjs +0 -52
  655. package/scripts/db/fix-schema-all.mjs +0 -55
  656. package/scripts/db/fix-schema-full.mjs +0 -46
  657. package/scripts/db/fix-schema.mjs +0 -38
  658. package/scripts/db/init-db.mjs +0 -13
  659. package/scripts/db/recreate-db.mjs +0 -14
  660. package/scripts/generate-mcp.mjs +0 -264
  661. package/scripts/github-release.sh +0 -77
  662. package/scripts/init-dirs.mjs +0 -13
  663. package/scripts/install-interactive.mjs +0 -677
  664. package/scripts/install-mcp.mjs +0 -116
  665. package/scripts/install-plugin.mjs +0 -415
  666. package/scripts/install-web.sh +0 -120
  667. package/scripts/install.mjs +0 -340
  668. package/scripts/openclaw-bootstrap.mjs +0 -127
  669. package/scripts/package-release.sh +0 -71
  670. package/scripts/remote-preflight.mjs +0 -62
  671. package/scripts/squish-fallback.mjs +0 -132
  672. package/scripts/test/test-all-systems.mjs +0 -139
  673. package/scripts/test/test-memory-system.mjs +0 -139
  674. package/scripts/test/test-v0.5.0.mjs +0 -210
  675. package/scripts/test-interactive.mjs +0 -131
  676. package/scripts/verify-mcp.mjs +0 -214
  677. package/skills/memory-guide/SKILL.md +0 -332
  678. package/skills/squish-cli/SKILL.md +0 -240
  679. package/skills/squish-mcp/SKILL.md +0 -355
  680. package/skills/squish-memory/install.mjs +0 -335
  681. package/skills/squish-memory/skill.json +0 -32
  682. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.d.ts +0 -0
  683. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.js +0 -0
  684. /package/dist/{algorithms → core/algorithms}/handlers/approve-merge.d.ts +0 -0
  685. /package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.d.ts +0 -0
  686. /package/dist/{algorithms → core/algorithms}/handlers/get-stats.d.ts +0 -0
  687. /package/dist/{algorithms → core/algorithms}/handlers/list-proposals.d.ts +0 -0
  688. /package/dist/{algorithms → core/algorithms}/handlers/preview-merge.d.ts +0 -0
  689. /package/dist/{algorithms → core/algorithms}/handlers/reject-merge.d.ts +0 -0
  690. /package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.d.ts +0 -0
  691. /package/dist/{algorithms → core/algorithms}/safety/safety-checks.js +0 -0
  692. /package/dist/{algorithms → core/algorithms}/utils/response-builder.d.ts +0 -0
  693. /package/dist/{algorithms → core/algorithms}/utils/response-builder.js +0 -0
  694. /package/dist/core/{context.d.ts → context/context.d.ts} +0 -0
  695. /package/dist/core/{agent-memory.d.ts → ingestion/agent-memory.d.ts} +0 -0
  696. /package/dist/core/{privacy.d.ts → security/privacy.d.ts} +0 -0
  697. /package/dist/core/{privacy.js → security/privacy.js} +0 -0
  698. /package/dist/core/{secret-detector.d.ts → security/secret-detector.d.ts} +0 -0
  699. /package/dist/core/{secret-detector.js → security/secret-detector.js} +0 -0
  700. /package/dist/core/{session-hooks → session}/session-hooks.d.ts +0 -0
  701. /package/dist/core/{session-hooks → session}/session-hooks.js +0 -0
  702. /package/dist/core/{cache.d.ts → storage/cache.d.ts} +0 -0
  703. /package/dist/core/{database.d.ts → storage/database.d.ts} +0 -0
  704. /package/dist/core/{database.js → storage/database.js} +0 -0
@@ -0,0 +1,195 @@
1
+ /** Trace Visualizer - Creates ASCII visualizations of search traces
2
+ *
3
+ * Provides tree-format output showing search pipeline stages and timing
4
+ */
5
+
6
+ import { logger } from '../logger.js';
7
+ import { SearchTrace } from './collector.js';
8
+
9
+ /**
10
+ * Create visual ASCII visualization of a trace
11
+ */
12
+ export function visualizeTrace(trace: SearchTrace): string {
13
+ const lines: string[] = [];
14
+
15
+ // Header
16
+ lines.push('='.repeat(60));
17
+ lines.push(`Search Trace: ${trace.id}`);
18
+ lines.push(`Session: ${trace.sessionId || 'N/A'}`);
19
+ lines.push(`Query: "${trace.query}"`);
20
+ lines.push('='.repeat(60));
21
+ lines.push('');
22
+
23
+ // Total duration
24
+ lines.push(`Total Duration: ${trace.totalDurationMs}ms (${(trace.totalDurationMs / 1000).toFixed(2)}s)`);
25
+ lines.push('');
26
+
27
+ // Stage timeline visualization
28
+ lines.push('─'.repeat(60));
29
+ lines.push('Pipeline Stages:');
30
+ lines.push('─'.repeat(60));
31
+ lines.push('');
32
+
33
+ const stageNames: string[] = [];
34
+ const stageTimings: number[] = [];
35
+
36
+ if (trace.queryRewrite) {
37
+ stageNames.push('Query Rewrite');
38
+ stageTimings.push(trace.queryRewrite.timeMs || 0);
39
+ }
40
+ if (trace.candidateRetrieval) {
41
+ stageNames.push('Candidate Retrieval');
42
+ stageTimings.push(trace.candidateRetrieval.timeMs || 0);
43
+ }
44
+ if (trace.entityFiltering) {
45
+ stageNames.push('Entity Filtering');
46
+ stageTimings.push(trace.entityFiltering.timeMs || 0);
47
+ }
48
+ if (trace.hybridScoring) {
49
+ stageNames.push('Hybrid Scoring');
50
+ stageTimings.push(trace.hybridScoring.timeMs || 0);
51
+ }
52
+ if (trace.reranking) {
53
+ stageNames.push('Reranking');
54
+ stageTimings.push(trace.reranking.timeMs || 0);
55
+ }
56
+
57
+ if (stageNames.length > 0) {
58
+ let cumulativeTime = 0;
59
+ const maxStageNameLength = Math.max(...stageNames.map(n => n.length));
60
+
61
+ stageNames.forEach((name, i) => {
62
+ const duration = stageTimings[i] || 0;
63
+ cumulativeTime += duration;
64
+ const progressPercent = ((cumulativeTime / trace.totalDurationMs) * 100).toFixed(1);
65
+ const barLength = Math.max(0, Math.min(40, Math.round((duration / trace.totalDurationMs) * 40)));
66
+
67
+ // Stage name with timing
68
+ const paddedName = name.padEnd(maxStageNameLength + 2);
69
+ lines.push(`${paddedName} │ ${duration.toString().padStart(4)}ms │ ${progressPercent.padStart(5)}%`);
70
+
71
+ // Visualization bar
72
+ const bar = '█'.repeat(barLength) + '░'.repeat(40 - barLength);
73
+ lines.push(` └─ ${bar}`);
74
+
75
+ lines.push('');
76
+ });
77
+ } else {
78
+ lines.push(' No stage data available');
79
+ lines.push('');
80
+ }
81
+
82
+ // Top results
83
+ if (trace.topResults && trace.topResults.length > 0) {
84
+ lines.push('─'.repeat(60));
85
+ lines.push(`Top Results (${trace.topResults.length}):`);
86
+ lines.push('─'.repeat(60));
87
+ lines.push('');
88
+
89
+ trace.topResults.slice(0, 5).forEach((result, i) => {
90
+ const type = result.type || 'memory';
91
+ const content = result.content?.substring(0, 60) || '';
92
+ const score = result.hybridScore?.toFixed(2) || 'N/A';
93
+ lines.push(`${(i + 1).toString().padStart(2)}. [${type.padEnd(8)}] (score: ${score})`);
94
+ if (content.length > 0) {
95
+ lines.push(` ${content}`);
96
+ }
97
+ lines.push('');
98
+ });
99
+ } else if (trace.resultCount !== undefined) {
100
+ lines.push('─'.repeat(60));
101
+ lines.push(`Results: ${trace.resultCount} returned`);
102
+ lines.push('─'.repeat(60));
103
+ lines.push('');
104
+ }
105
+
106
+ // Footer
107
+ lines.push('='.repeat(60));
108
+ lines.push('');
109
+
110
+ return lines.join('\n');
111
+ }
112
+
113
+ /**
114
+ * Create compact single-line trace summary
115
+ */
116
+ export function summarizeTrace(trace: SearchTrace): string {
117
+ const parts: string[] = [];
118
+
119
+ parts.push(`[${trace.id.substring(0, 8)}]`);
120
+ parts.push(`"${trace.query.substring(0, 30)}${trace.query.length > 30 ? '...' : ''}"`);
121
+ parts.push(`${trace.totalDurationMs}ms`);
122
+ parts.push(trace.resultCount !== undefined ? `${trace.resultCount} results` : 'unknown');
123
+
124
+ return parts.join(' | ');
125
+ }
126
+
127
+ /**
128
+ * Compare multiple traces
129
+ */
130
+ export function compareTraces(traces: SearchTrace[]): string {
131
+ const lines: string[] = [];
132
+
133
+ lines.push('─'.repeat(80));
134
+ lines.push('Trace Comparison');
135
+ lines.push('─'.repeat(80));
136
+ lines.push('');
137
+ lines.push('ID'.padEnd(10) + ' | ' + 'Query'.padEnd(30) + ' | ' + 'Duration'.padEnd(10) + ' | ' + 'Results');
138
+ lines.push('─'.repeat(80));
139
+
140
+ traces.forEach(trace => {
141
+ const id = trace.id.substring(0, 8);
142
+ const query = trace.query.substring(0, 30);
143
+ const duration = `${trace.totalDurationMs}ms`;
144
+ const results = trace.resultCount !== undefined ? trace.resultCount.toString() : '?';
145
+ lines.push(`${id.padEnd(10)} | ${query.padEnd(30)} | ${duration.padEnd(10)} | ${results.padEnd(8)}`);
146
+ });
147
+
148
+ return lines.join('\n');
149
+ }
150
+
151
+ /**
152
+ * Get stage breakdown table
153
+ */
154
+ export function getStageBreakdown(trace: SearchTrace): string {
155
+ const lines: string[] = [];
156
+
157
+ lines.push('Stage Timing Breakdown:');
158
+ lines.push('');
159
+
160
+ const stages = [
161
+ { name: 'Query Rewrite', data: trace.queryRewrite, timeMs: trace.queryRewrite?.timeMs || 0 },
162
+ { name: 'Candidate Retrieval', data: trace.candidateRetrieval, timeMs: trace.candidateRetrieval?.timeMs || 0 },
163
+ { name: 'Entity Filtering', data: trace.entityFiltering, timeMs: trace.entityFiltering?.timeMs || 0 },
164
+ { name: 'Hybrid Scoring', data: trace.hybridScoring, timeMs: trace.hybridScoring?.timeMs || 0 },
165
+ { name: 'Reranking', data: trace.reranking, timeMs: trace.reranking?.timeMs || 0 },
166
+ ];
167
+
168
+ const validStages = stages.filter(s => s.data && s.timeMs !== undefined);
169
+
170
+ if (validStages.length > 0) {
171
+ const maxNameLength = Math.max(...validStages.map(s => s.name.length));
172
+
173
+ validStages.forEach(stage => {
174
+ const percentage = ((stage.timeMs / trace.totalDurationMs) * 100).toFixed(1);
175
+ lines.push(` ${stage.name.padEnd(maxNameLength)} │ ${stage.timeMs.toString().padStart(4)}ms │ ${percentage.padStart(5)}%`);
176
+ });
177
+
178
+ lines.push('');
179
+ lines.push(' ' + '─'.repeat(maxNameLength + 4 + 5 + 6));
180
+ } else {
181
+ lines.push(' No stage timing data available');
182
+ }
183
+
184
+ return lines.join('\n');
185
+ }
186
+
187
+ /**
188
+ * Export all visualizer functions
189
+ */
190
+ export default {
191
+ visualizeTrace,
192
+ summarizeTrace,
193
+ compareTraces,
194
+ getStageBreakdown,
195
+ };
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Shared Cleanup Operations Utilities
3
+ * Common patterns for age-based cleanup operations
4
+ */
5
+
6
+ import { getDb } from '../../db/index.js';
7
+ import { getSchema } from '../../db/schema.js';
8
+ import { logger } from '../logger.js';
9
+
10
+ /**
11
+ * Cleanup old session summaries
12
+ */
13
+ export async function cleanupOldSessionSummaries(olderThanDays: number = 30): Promise<number> {
14
+ try {
15
+ const db = await getDb();
16
+ const schema = await getSchema();
17
+
18
+ const threshold = new Date(Date.now() - olderThanDays * 24 * 60 * 60 * 1000);
19
+
20
+ const result = await (db as any)
21
+ .delete(schema.sessionSummaries)
22
+ .where((schema.sessionSummaries.createdAt as any) < threshold);
23
+
24
+ return result?.rowCount || 0;
25
+ } catch (error) {
26
+ logger.error('Error pruning old summaries', error);
27
+ return 0;
28
+ }
29
+ }
30
+
31
+ /**
32
+ * Cleanup old memory snapshots
33
+ */
34
+ export async function cleanupOldMemorySnapshots(olderThanDays: number = 90): Promise<number> {
35
+ try {
36
+ const db = await getDb();
37
+ const schema = await getSchema();
38
+
39
+ const threshold = new Date(Date.now() - olderThanDays * 24 * 60 * 60 * 1000);
40
+
41
+ const result = await (db as any)
42
+ .delete(schema.memorySnapshots)
43
+ .where((schema.memorySnapshots.createdAt as any) < threshold);
44
+
45
+ return result?.rowCount || 0;
46
+ } catch (error) {
47
+ logger.error('Error deleting old snapshots', error);
48
+ return 0;
49
+ }
50
+ }
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Shared Content Extraction Utilities
3
+ * Common patterns for extracting information from messages
4
+ */
5
+
6
+ /**
7
+ * Extract key information from conversation messages
8
+ */
9
+ export function extractMessageContent(messages: any[]): {
10
+ userMessages: any[];
11
+ assistantMessages: any[];
12
+ toolCalls: Set<string>;
13
+ topics: Set<string>;
14
+ timestamp: string;
15
+ } {
16
+ // Extract key information from messages
17
+ const userMessages = messages.filter((m: any) => m.role === 'user');
18
+ const assistantMessages = messages.filter((m: any) => m.role === 'assistant');
19
+
20
+ // Extract tool calls
21
+ const toolCalls = new Set<string>();
22
+ for (const msg of messages) {
23
+ if (msg.toolCalls && Array.isArray(msg.toolCalls)) {
24
+ for (const tc of msg.toolCalls) {
25
+ toolCalls.add(tc.name);
26
+ }
27
+ }
28
+ }
29
+
30
+ // Extract topics from first and last user messages
31
+ const topics = new Set<string>();
32
+ if (userMessages.length > 0) {
33
+ const firstUser = userMessages[0].content || '';
34
+ const lastUser = userMessages[userMessages.length - 1].content || '';
35
+
36
+ // Simple topic extraction (first 10 words)
37
+ const extractTopics = (text: string) => {
38
+ const words = text.split(/\s+/).slice(0, 10);
39
+ return words.join(' ');
40
+ };
41
+
42
+ if (firstUser) topics.add(extractTopics(firstUser));
43
+ if (lastUser && lastUser !== firstUser) topics.add(extractTopics(lastUser));
44
+ }
45
+
46
+ const timestamp = messages.length > 0 ? messages[messages.length - 1].createdAt : 'unknown';
47
+
48
+ return {
49
+ userMessages,
50
+ assistantMessages,
51
+ toolCalls,
52
+ topics,
53
+ timestamp,
54
+ };
55
+ }
56
+
57
+ /**
58
+ * Generate basic extractive summary from extracted content
59
+ */
60
+ export function generateExtractiveSummary(extracted: ReturnType<typeof extractMessageContent>): string {
61
+ const hasContent =
62
+ extracted.userMessages.length > 0 ||
63
+ extracted.assistantMessages.length > 0 ||
64
+ extracted.toolCalls.size > 0 ||
65
+ extracted.topics.size > 0 ||
66
+ extracted.timestamp !== 'unknown';
67
+
68
+ if (!hasContent) {
69
+ return '';
70
+ }
71
+
72
+ const parts: string[] = [];
73
+
74
+ if (extracted.userMessages.length > 0) {
75
+ parts.push(`User prompts: ${extracted.userMessages.length}`);
76
+ }
77
+
78
+ if (extracted.assistantMessages.length > 0) {
79
+ parts.push(`Assistant responses: ${extracted.assistantMessages.length}`);
80
+ }
81
+
82
+ if (extracted.toolCalls.size > 0) {
83
+ parts.push(`Tools used: ${Array.from(extracted.toolCalls).join(', ')}`);
84
+ }
85
+
86
+ if (extracted.topics.size > 0) {
87
+ parts.push(`Topics: ${Array.from(extracted.topics).join('; ')}`);
88
+ }
89
+
90
+ if (extracted.timestamp !== 'unknown') {
91
+ parts.push(`Last activity: ${extracted.timestamp}`);
92
+ }
93
+
94
+ return parts.join('. ');
95
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Shared Requirements Filter Builder
3
+ * Common patterns for building database filters from criteria objects
4
+ */
5
+
6
+ import { eq, inArray, gte } from 'drizzle-orm';
7
+
8
+ /**
9
+ * Build database filter array from MemoryCriteria
10
+ */
11
+ export function buildMemoryFilters(criteria: any, schema: any): any[] {
12
+ const filters: any[] = [];
13
+
14
+ if (criteria.type) {
15
+ filters.push(eq(schema.memories.type as any, criteria.type));
16
+ }
17
+
18
+ if (criteria.types && criteria.types.length > 0) {
19
+ filters.push(inArray(schema.memories.type as any, criteria.types));
20
+ }
21
+
22
+ if (criteria.sector) {
23
+ filters.push(eq(schema.memories.sector as any, criteria.sector));
24
+ }
25
+
26
+ if (criteria.minConfidence !== undefined) {
27
+ filters.push(gte(schema.memories.confidence as any, criteria.minConfidence));
28
+ }
29
+
30
+ if (criteria.minRelevance !== undefined) {
31
+ filters.push(gte(schema.memories.relevanceScore as any, criteria.minRelevance));
32
+ }
33
+
34
+ if (criteria.projectId) {
35
+ filters.push(eq(schema.memories.projectId, criteria.projectId));
36
+ }
37
+
38
+ if (criteria.agentId) {
39
+ filters.push(eq(schema.memories.agentId as any, criteria.agentId));
40
+ }
41
+
42
+ return filters;
43
+ }
44
+
45
+ /**
46
+ * Build database filter array from partial criteria (for assertions)
47
+ */
48
+ export function buildMemoryFiltersPartial(criteria: any, schema: any): any[] {
49
+ const filters: any[] = [];
50
+
51
+ if (criteria.type) {
52
+ filters.push(eq(schema.memories.type as any, criteria.type));
53
+ }
54
+
55
+ return filters;
56
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Shared History and Version Tracking Utilities
3
+ * Common patterns for traversing version chains and history
4
+ */
5
+
6
+ import { eq } from 'drizzle-orm';
7
+ import { getDb } from '../../db/index.js';
8
+ import { getSchema } from '../../db/schema.js';
9
+ import { logger } from '../logger.js';
10
+
11
+ /**
12
+ * Traverse superseded fact chain (specific to memories table)
13
+ * Follows the supersededBy chain to build complete version history
14
+ */
15
+ export async function traverseSupersededChain(
16
+ startFactId: string,
17
+ options: {
18
+ maxDepth?: number;
19
+ includeStart?: boolean;
20
+ } = {}
21
+ ): Promise<any[]> {
22
+ const { maxDepth = 50, includeStart = true } = options;
23
+
24
+ try {
25
+ const db = await getDb();
26
+ const schema = await getSchema();
27
+
28
+ // Get the starting fact
29
+ const initial = await (db as any)
30
+ .select()
31
+ .from(schema.memories)
32
+ .where(eq(schema.memories.id, startFactId))
33
+ .limit(1);
34
+
35
+ if (initial.length === 0) {
36
+ return [];
37
+ }
38
+
39
+ const history: any[] = includeStart ? [initial[0]] : [];
40
+ let currentId = initial[0].supersededBy;
41
+ let depth = 0;
42
+
43
+ // Follow the superseded chain
44
+ while (currentId && depth < maxDepth) {
45
+ const next = await (db as any)
46
+ .select()
47
+ .from(schema.memories)
48
+ .where(eq(schema.memories.id, currentId))
49
+ .limit(1);
50
+
51
+ if (next.length === 0) break;
52
+
53
+ history.push(next[0]);
54
+ currentId = next[0].supersededBy;
55
+ depth++;
56
+ }
57
+
58
+ return history;
59
+ } catch (error) {
60
+ logger.error('Error traversing superseded chain', error);
61
+ return [];
62
+ }
63
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Shared Memory Operations Utilities
3
+ * Common patterns for memory governance operations
4
+ */
5
+
6
+ import { eq } from 'drizzle-orm';
7
+ import { getDb } from '../../db/index.js';
8
+ import { getSchema } from '../../db/schema.js';
9
+ import { createDatabaseClient } from '../storage/database.js';
10
+ import { config } from '../../config.js';
11
+ import { logger } from '../logger.js';
12
+
13
+ /**
14
+ * Generic memory operation with governance checks and error handling
15
+ */
16
+ export async function performMemoryOperation(
17
+ memoryId: string,
18
+ operation: {
19
+ name: string;
20
+ updates: Record<string, any>;
21
+ requiresGovernance?: boolean;
22
+ }
23
+ ): Promise<void> {
24
+ if (operation.requiresGovernance !== false && !config.governanceEnabled) {
25
+ return;
26
+ }
27
+
28
+ try {
29
+ const db = await getDb();
30
+ const client = createDatabaseClient(db);
31
+ const schema = await getSchema();
32
+
33
+ await client
34
+ .update(schema.memories)
35
+ .set(operation.updates)
36
+ .where(eq(schema.memories.id, memoryId));
37
+ } catch (error) {
38
+ logger.error(`Error ${operation.name.toLowerCase()}`, error);
39
+ }
40
+ }
41
+
42
+ /**
43
+ * Redis publish operation with error handling
44
+ */
45
+ export async function performRedisPublish(
46
+ getRedisClient: () => Promise<any>,
47
+ channel: string,
48
+ message: unknown
49
+ ): Promise<void> {
50
+ try {
51
+ const redis = await getRedisClient();
52
+ await redis.publish(channel, JSON.stringify(message));
53
+ } catch (error) {
54
+ logger.error('Error publishing to Redis', error);
55
+ }
56
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Shared Requirements Query Operations
3
+ * Common patterns for database queries with error handling
4
+ */
5
+
6
+ import { and } from 'drizzle-orm';
7
+ import { getDb } from '../../db/index.js';
8
+ import { getSchema } from '../../db/schema.js';
9
+
10
+ export class MemoryRequirementError extends Error {
11
+ constructor(
12
+ message: string,
13
+ public readonly missingCriteria: any,
14
+ public readonly context?: any
15
+ ) {
16
+ super(message);
17
+ this.name = 'MemoryRequirementError';
18
+ Object.setPrototypeOf(this, MemoryRequirementError.prototype);
19
+ }
20
+ }
21
+
22
+ /**
23
+ * Execute a memory requirement query with standard error handling
24
+ */
25
+ export async function executeMemoryQuery(
26
+ criteria: any,
27
+ filters: any[],
28
+ limit: number = 1,
29
+ operation: string = 'memory requirement'
30
+ ): Promise<any[]> {
31
+ try {
32
+ const db = await getDb();
33
+ const schema = await getSchema();
34
+
35
+ const query = filters.length > 0 ? and(...filters) : undefined;
36
+
37
+ const memories = await (db as any)
38
+ .select()
39
+ .from(schema.memories)
40
+ .where(query)
41
+ .limit(limit);
42
+
43
+ return memories;
44
+ } catch (error) {
45
+ if (error instanceof MemoryRequirementError) {
46
+ throw error;
47
+ }
48
+ const msg = error instanceof Error ? error.message : String(error);
49
+ throw new MemoryRequirementError(`Error checking ${operation}: ${msg}`, criteria);
50
+ }
51
+ }
52
+
53
+ /**
54
+ * Execute a memory assertion query (expecting specific results)
55
+ */
56
+ export async function executeMemoryAssertion(
57
+ criteria: any,
58
+ filters: any[],
59
+ expectedCount: number,
60
+ operation: string,
61
+ errorMessage: string
62
+ ): Promise<any[]> {
63
+ try {
64
+ const memories = await executeMemoryQuery(criteria, filters, 100, operation);
65
+
66
+ if (expectedCount === 0 && memories.length > 0) {
67
+ throw new MemoryRequirementError(errorMessage, criteria, { found: memories[0].id });
68
+ }
69
+
70
+ if (expectedCount > 0 && memories.length < expectedCount) {
71
+ const msg = `Required ${expectedCount} memories but found ${memories.length}`;
72
+ throw new MemoryRequirementError(msg, criteria, { found: memories.length, required: expectedCount });
73
+ }
74
+
75
+ return memories;
76
+ } catch (error) {
77
+ if (error instanceof MemoryRequirementError) {
78
+ throw error;
79
+ }
80
+ const msg = error instanceof Error ? error.message : String(error);
81
+ throw new MemoryRequirementError(`Error ${operation}: ${msg}`, criteria);
82
+ }
83
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Shared Summarization Strategy Utilities
3
+ * Common patterns for different summarization approaches
4
+ */
5
+
6
+ import { getDb } from '../../db/index.js';
7
+ import { getSchema } from '../../db/schema.js';
8
+ import { config } from '../../config.js';
9
+ import { estimateTokens } from '../context/context-window.js';
10
+
11
+ export { estimateTokens };
12
+
13
+ /**
14
+ * Chunk messages for incremental summarization
15
+ */
16
+ export function chunkMessages(messages: any[], chunkSize: number): any[][] {
17
+ const chunks: any[][] = [];
18
+ for (let i = 0; i < messages.length; i += chunkSize) {
19
+ chunks.push(messages.slice(i, i + chunkSize));
20
+ }
21
+ return chunks;
22
+ }
23
+
24
+ /**
25
+ * Get rolling window of messages
26
+ */
27
+ export function getRollingWindow(messages: any[], windowSize: number): any[] {
28
+ if (windowSize <= 0) {
29
+ return [];
30
+ }
31
+
32
+ return messages.slice(-windowSize);
33
+ }
34
+
35
+ /**
36
+ * Calculate tokens saved by summarization
37
+ */
38
+ export function calculateTokensSaved(messages: any[], summary: string): number {
39
+ const originalTokens = messages.reduce(
40
+ (sum: number, m: any) => sum + estimateTokens(m.content || ''),
41
+ 0
42
+ );
43
+ const summaryTokens = estimateTokens(summary);
44
+ return Math.max(0, originalTokens - summaryTokens);
45
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Shared Temporal Query Utilities
3
+ * Common patterns for temporal database queries
4
+ */
5
+
6
+ import { and, eq, lte, gte, or, isNull } from 'drizzle-orm';
7
+
8
+ /**
9
+ * Build temporal validity filters for queries
10
+ */
11
+ export function buildTemporalFilters(
12
+ schema: any,
13
+ timestamp: Date = new Date(),
14
+ additionalFilters: any[] = []
15
+ ): any[] {
16
+ const filters = [
17
+ lte(schema.validFrom as any, timestamp),
18
+ or(isNull(schema.validTo), gte(schema.validTo as any, timestamp)),
19
+ ...additionalFilters
20
+ ];
21
+
22
+ return filters;
23
+ }
24
+
25
+ /**
26
+ * Build temporal query for facts at a specific time
27
+ */
28
+ export function buildFactAtTimeQuery(
29
+ schema: any,
30
+ timestamp: Date = new Date(),
31
+ additionalFilters: any[] = []
32
+ ): any {
33
+ const filters = buildTemporalFilters(schema, timestamp, [
34
+ eq(schema.type as any, 'fact'),
35
+ ...additionalFilters
36
+ ]);
37
+
38
+ return and(...filters);
39
+ }