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,653 @@
1
+ /**
2
+ * Agent Hooks - Core Logic
3
+ *
4
+ * Universal hooks for auto-capturing agent activities.
5
+ * Works with Claude Code, OpenCode, Cursor, Windsurf.
6
+ *
7
+ * Hook events:
8
+ * - sessionStart: Inject relevant memories on session start
9
+ * - postToolUse: Record observations after tool execution
10
+ * - sessionEnd: Save snapshot and sync learnings
11
+ * - preCompact: Save state before context compaction
12
+ */
13
+
14
+ import { randomUUID } from 'crypto';
15
+ import { createLearning, type LearningInput } from '../ingestion/learnings.js';
16
+ import { getRecent, search, rememberMemory } from '../memory/memories.js';
17
+ import { config } from '../../config.js';
18
+ import { logger } from '../logger.js';
19
+ import { shouldCaptureTool, categorizeTool } from './capture-filter.js';
20
+ import { inferTags } from './auto-tagger.js';
21
+ import { ensureProject, getProjectByPath } from '../projects.js';
22
+ import { autoAssignMemory, initializeDefaultPlaces } from '../places/index.js';
23
+ import { compressForContext } from '../compression.js';
24
+ import { getAgentPreferences } from '../agent-preferences.js';
25
+ import { classifySignalEvent, distillSignalEvent } from '../ingestion/signal-engine.js';
26
+ import { compactSessionWorkingSet, recordSessionSignal } from '../session/working-set.js';
27
+ import { getDbClient } from '../lib/db-client.js';
28
+ import { eq } from 'drizzle-orm';
29
+ import { serializeMetadata, deserializeMetadata } from '../memory/serialization.js';
30
+ import { addMemoryToGraph } from '../graph/graph-builder.js';
31
+ import { addToHotCache, addSessionContextToHotCache } from '../hot-cache.js';
32
+ import { extractBeliefsFromMemory } from '../beliefs/extractor.js';
33
+ import { upsertBeliefsForMemory, getRecentFailures, getActiveConstraints, getActiveDecisions } from '../beliefs/store.js';
34
+
35
+ /** Session ID for tracking across agents */
36
+ let currentSessionId: string | null = null;
37
+
38
+ /**
39
+ * Generate a new session ID (universal across agents)
40
+ */
41
+ export function generateSessionId(): string {
42
+ currentSessionId = randomUUID();
43
+ return currentSessionId;
44
+ }
45
+
46
+ /**
47
+ * Get current session ID
48
+ */
49
+ export function getCurrentSessionId(): string | null {
50
+ return currentSessionId;
51
+ }
52
+
53
+ /**
54
+ * Set session ID (for resume/continue)
55
+ */
56
+ export function setSessionId(sessionId: string): void {
57
+ currentSessionId = sessionId;
58
+ }
59
+
60
+ /**
61
+ * Session start hook - inject relevant context
62
+ */
63
+ export async function handleSessionStart(params: {
64
+ projectPath: string;
65
+ mode: 'startup' | 'resume' | 'compact';
66
+ agentType: 'claude-code' | 'opencode' | 'cursor' | 'windsurf';
67
+ }): Promise<{
68
+ memories: string[];
69
+ sessionId: string;
70
+ count: number;
71
+ preferences?: Array<{key: string; value: string}>;
72
+ beliefs?: {
73
+ failures: string[];
74
+ constraints: string[];
75
+ decisions: string[];
76
+ };
77
+ }> {
78
+ const { projectPath, mode, agentType } = params;
79
+
80
+ // Ensure project exists
81
+ await ensureProject(projectPath);
82
+
83
+ // Generate or get session ID
84
+ if (!currentSessionId) {
85
+ currentSessionId = generateSessionId();
86
+ }
87
+
88
+ logger.info(`[Hooks] Session start: ${mode} (agent: ${agentType}, session: ${currentSessionId})`);
89
+
90
+ // Get recent memories based on mode
91
+ const limit = mode === 'compact' ? 3 : 5;
92
+ const memories = await getRecent(projectPath, limit);
93
+ const compactedWorkingSet = await compactSessionWorkingSet(currentSessionId, projectPath);
94
+
95
+ // Get spatial memory context (places) for context injection
96
+ let placesContext = '';
97
+ try {
98
+ const { initializeDefaultPlaces, getProjectPlaces } = await import('../places/index.js');
99
+ const { getProjectByPath } = await import('../projects.js');
100
+ const project = await getProjectByPath(projectPath);
101
+ if (project) {
102
+ await initializeDefaultPlaces(project.id);
103
+ const places = await getProjectPlaces(project.id);
104
+ if (places.length > 0) {
105
+ const populatedPlaces = places.filter(p => p.memoryCount > 0).slice(0, 3);
106
+ if (populatedPlaces.length > 0) {
107
+ placesContext = '\n\nActive places: ' + populatedPlaces.map(p => `${p.name} (${p.memoryCount})`).join(', ');
108
+ }
109
+ }
110
+ }
111
+ } catch (e) {
112
+ // Don't fail if places not available
113
+ logger.debug(`[Hooks] Places context not available: ${e}`);
114
+ }
115
+
116
+ // Format for injection with compression
117
+ const formatted = memories.map((m, i) => {
118
+ const compressed = compressForContext(m.content || '');
119
+ return `${i + 1}. [${m.type}] ${compressed}`;
120
+ }).join('\n');
121
+
122
+ const workingSetContext = compactedWorkingSet.summary ? `Session working set:\n${compactedWorkingSet.summary}\n\n` : '';
123
+ const allContent = workingSetContext + formatted + placesContext;
124
+
125
+ // Get agent preferences for context injection
126
+ let preferences: Array<{key: string; value: string}> = [];
127
+ try {
128
+ const project = await getProjectByPath(projectPath);
129
+ if (project) {
130
+ preferences = await getAgentPreferences(project.id);
131
+
132
+ // Get beliefs for state reconstruction on session boot
133
+ // This is the "state reconstruction" - active beliefs shape next actions
134
+ const [failures, constraints, decisions] = await Promise.all([
135
+ getRecentFailures(project.id, 5),
136
+ getActiveConstraints(project.id, 10),
137
+ getActiveDecisions(project.id, 10),
138
+ ]);
139
+
140
+ // Format beliefs into context
141
+ const beliefsSection = formatBeliefsForContext(failures, constraints, decisions);
142
+
143
+ // Add beliefs to injected context
144
+ if (beliefsSection) {
145
+ allContent = beliefsSection + '\n\n' + allContent;
146
+ }
147
+
148
+ logger.info(`[Hooks] Injected ${failures.length} failures, ${constraints.length} constraints, ${decisions.length} decisions`);
149
+
150
+ return {
151
+ memories: allContent ? allContent.split('\n') : [],
152
+ sessionId: currentSessionId,
153
+ count: memories.length,
154
+ preferences: preferences.length > 0 ? preferences : undefined,
155
+ beliefs: {
156
+ failures: failures.map(f => f.statement),
157
+ constraints: constraints.map(c => c.statement),
158
+ decisions: decisions.map(d => d.statement),
159
+ },
160
+ };
161
+ }
162
+ } catch (e) {
163
+ logger.debug(`[Hooks] Agent preferences not available: ${e}`);
164
+ }
165
+
166
+ logger.info(`[Hooks] Injected ${memories.length} memories for session start`);
167
+
168
+ return {
169
+ memories: allContent ? allContent.split('\n') : [],
170
+ sessionId: currentSessionId,
171
+ count: memories.length,
172
+ preferences: preferences.length > 0 ? preferences : undefined,
173
+ };
174
+ }
175
+
176
+ /**
177
+ * Format beliefs into context section for session boot
178
+ * This drives "state reconstruction" - agent sees active constraints/failures/decisions
179
+ */
180
+ function formatBeliefsForContext(
181
+ failures: Array<{statement: string; context?: string}>,
182
+ constraints: Array<{statement: string; context?: string}>,
183
+ decisions: Array<{statement: string; context?: string}>
184
+ ): string {
185
+ const sections: string[] = [];
186
+
187
+ if (failures.length > 0) {
188
+ sections.push('AVOID:\n' + failures.map((f, i) =>
189
+ ` ${i + 1}. ${f.statement}${f.context ? ` (${f.context})` : ''}`
190
+ ).join('\n'));
191
+ }
192
+
193
+ if (constraints.length > 0) {
194
+ sections.push('CONSTRAINTS:\n' + constraints.map((c, i) =>
195
+ ` ${i + 1}. ${c.statement}${c.context ? ` (${c.context})` : ''}`
196
+ ).join('\n'));
197
+ }
198
+
199
+ if (decisions.length > 0) {
200
+ sections.push('DECISIONS:\n' + decisions.map((d, i) =>
201
+ ` ${i + 1}. ${d.statement}${d.context ? ` (${d.context})` : ''}`
202
+ ).join('\n'));
203
+ }
204
+
205
+ if (sections.length === 0) return '';
206
+ return sections.join('\n\n');
207
+ }
208
+
209
+ /**
210
+ * Post-tool-use hook - record observations
211
+ */
212
+ export async function handlePostToolUse(params: {
213
+ toolName: string;
214
+ toolInput: Record<string, unknown>;
215
+ toolResult: unknown;
216
+ projectPath: string;
217
+ agentType: 'claude-code' | 'opencode' | 'cursor' | 'windsurf';
218
+ }): Promise<{
219
+ captured: boolean;
220
+ memoryId?: string;
221
+ reason?: string;
222
+ }> {
223
+ const { toolName, toolInput, toolResult, projectPath, agentType } = params;
224
+
225
+ // Ensure project exists
226
+ await ensureProject(projectPath);
227
+
228
+ // Ensure session ID exists
229
+ if (!currentSessionId) {
230
+ currentSessionId = generateSessionId();
231
+ }
232
+
233
+ // Check if we should capture this tool
234
+ if (!shouldCaptureTool(toolName)) {
235
+ await recordSessionSignal({
236
+ sessionId: currentSessionId,
237
+ projectPath,
238
+ classification: 'discard',
239
+ distilledContent: `Filtered tool: ${toolName}`,
240
+ toolName,
241
+ target: extractTarget(toolName, toolInput),
242
+ });
243
+ return { captured: false, reason: `Tool ${toolName} filtered out` };
244
+ }
245
+
246
+ // Extract relevant information
247
+ const category = categorizeTool(toolName);
248
+ const target = extractTarget(toolName, toolInput);
249
+ const content = extractContent(toolName, toolInput, toolResult);
250
+ const signalDecision = classifySignalEvent({
251
+ toolName,
252
+ toolInput,
253
+ toolResult,
254
+ sessionId: currentSessionId,
255
+ });
256
+ const distilledContent = distillSignalEvent({
257
+ toolName,
258
+ command: String(toolInput.command || toolInput.cmd || ''),
259
+ content: signalDecision.content || content,
260
+ classification: signalDecision.classification,
261
+ });
262
+
263
+ // Infer tags from context
264
+ const tags = inferTags(toolName, toolInput, distilledContent || content);
265
+
266
+ await recordSessionSignal({
267
+ sessionId: currentSessionId,
268
+ projectPath,
269
+ classification: signalDecision.classification,
270
+ distilledContent,
271
+ toolName,
272
+ target,
273
+ metadata: {
274
+ activeFiles: extractActiveFiles(toolName, toolInput),
275
+ command: String(toolInput.command || toolInput.cmd || ''),
276
+ outcome: inferOutcome(signalDecision, toolResult),
277
+ contentHash: signalDecision.contentHash,
278
+ tokensSaved: signalDecision.estimatedSavings,
279
+ activePlaces: signalDecision.placeHint.placeType ? [signalDecision.placeHint.placeType] : [],
280
+ graphEntities: signalDecision.graphHint.entityTerms,
281
+ placeRouted: Boolean(signalDecision.placeHint.placeType),
282
+ graphEnriched: signalDecision.graphHint.shouldEnrich,
283
+ },
284
+ });
285
+
286
+ if (signalDecision.classification === 'discard') {
287
+ return { captured: false, reason: signalDecision.reasons.join(', ') };
288
+ }
289
+
290
+ if (signalDecision.classification === 'session-only') {
291
+ return { captured: false, reason: 'Stored in session working set only' };
292
+ }
293
+
294
+ try {
295
+ const memory = await rememberMemory({
296
+ content: `[${category}] ${distilledContent || content}`,
297
+ project: projectPath,
298
+ type: category === 'modification' ? 'decision' : category === 'planning' ? 'context' : 'observation',
299
+ source: 'auto-capture',
300
+ metadata: {
301
+ signal: {
302
+ classification: signalDecision.classification,
303
+ reasons: signalDecision.reasons,
304
+ nuanceSuppressed: signalDecision.classification === 'durable-raw+distilled',
305
+ wakeUpPriority: signalDecision.wakeUpPriority,
306
+ },
307
+ placeHint: signalDecision.placeHint,
308
+ graphHint: signalDecision.graphHint,
309
+ target,
310
+ toolName,
311
+ },
312
+ });
313
+
314
+ logger.info(`[Hooks] Captured ${toolName} → ${memory.id} (session: ${currentSessionId})`);
315
+
316
+ let placeAssignment: { assigned: boolean; placeId?: string; placeType?: string } | undefined;
317
+ try {
318
+ const project = await getProjectByPath(projectPath);
319
+ if (project) {
320
+ await initializeDefaultPlaces(project.id);
321
+ placeAssignment = await autoAssignMemory({
322
+ memoryId: memory.id,
323
+ projectId: project.id,
324
+ toolName,
325
+ content: memory.content,
326
+ tags,
327
+ memoryType: memory.type,
328
+ });
329
+ }
330
+ } catch (placeError) {
331
+ logger.warn(`[Hooks] Place assignment failed: ${placeError}`);
332
+ }
333
+
334
+ let graphStatus: {
335
+ enriched: boolean;
336
+ entitiesCreated: number;
337
+ relationsCreated: number;
338
+ source: string;
339
+ entityTerms: string[];
340
+ } = {
341
+ enriched: false,
342
+ entitiesCreated: 0,
343
+ relationsCreated: 0,
344
+ source: 'none',
345
+ entityTerms: signalDecision.graphHint.entityTerms,
346
+ };
347
+
348
+ if (signalDecision.graphHint.shouldEnrich) {
349
+ try {
350
+ const graphResult = await addMemoryToGraph(memory.id, { preferLLM: true });
351
+ graphStatus = {
352
+ enriched: graphResult.entitiesCreated > 0 || graphResult.relationsCreated > 0,
353
+ entitiesCreated: graphResult.entitiesCreated,
354
+ relationsCreated: graphResult.relationsCreated,
355
+ source: graphResult.source,
356
+ entityTerms: signalDecision.graphHint.entityTerms,
357
+ };
358
+ } catch (graphError) {
359
+ logger.warn(`[Hooks] Graph enrichment failed: ${graphError}`);
360
+ }
361
+ }
362
+
363
+ let rawFallbackSnapshotId: string | undefined;
364
+ if (signalDecision.classification === 'durable-raw+distilled') {
365
+ rawFallbackSnapshotId = await attachRawFallbackSnapshot(memory.id, signalDecision.content, signalDecision.reasons);
366
+ }
367
+
368
+ await attachInspectionMetadata(memory.id, {
369
+ classification: signalDecision.classification,
370
+ reasons: signalDecision.reasons,
371
+ rawFallbackSnapshotId,
372
+ nuanceSuppressed: signalDecision.classification === 'durable-raw+distilled',
373
+ placeId: placeAssignment?.placeId,
374
+ placeType: placeAssignment?.placeType,
375
+ graph: graphStatus,
376
+ });
377
+
378
+ try {
379
+ const project = await getProjectByPath(projectPath);
380
+ if (project) {
381
+ const beliefs = extractBeliefsFromMemory({
382
+ memoryId: memory.id,
383
+ content: memory.content,
384
+ type: memory.type,
385
+ metadata: memory.metadata ?? null,
386
+ });
387
+ if (beliefs.length > 0) {
388
+ const storedBeliefs = await upsertBeliefsForMemory({
389
+ projectId: project.id,
390
+ memoryId: memory.id,
391
+ beliefs,
392
+ });
393
+ await attachBeliefInspectionMetadata(memory.id, storedBeliefs);
394
+ }
395
+ }
396
+ } catch (beliefError) {
397
+ logger.warn(`[Hooks] Belief extraction failed: ${beliefError}`);
398
+ }
399
+
400
+ return {
401
+ captured: true,
402
+ memoryId: memory.id,
403
+ };
404
+ } catch (error) {
405
+ logger.error(`[Hooks] Failed to capture:`, error);
406
+ return { captured: false, reason: 'Failed to create learning' };
407
+ }
408
+ }
409
+
410
+ async function attachRawFallbackSnapshot(memoryId: string, rawContent: string, reasons: string[]): Promise<string> {
411
+ const { db, schema } = await getDbClient();
412
+ const snapshotId = randomUUID();
413
+ await db.insert(schema.memorySnapshots).values({
414
+ id: snapshotId,
415
+ memoryId,
416
+ snapshotType: 'periodic',
417
+ content: rawContent,
418
+ metadata: serializeMetadata({
419
+ role: 'raw-fallback',
420
+ reasons,
421
+ createdBy: 'signal-engine',
422
+ }),
423
+ createdAt: new Date(),
424
+ });
425
+ return snapshotId;
426
+ }
427
+
428
+ async function attachInspectionMetadata(memoryId: string, signal: {
429
+ classification: string;
430
+ reasons: string[];
431
+ rawFallbackSnapshotId?: string;
432
+ nuanceSuppressed: boolean;
433
+ placeId?: string;
434
+ placeType?: string;
435
+ graph?: {
436
+ enriched: boolean;
437
+ entitiesCreated: number;
438
+ relationsCreated: number;
439
+ source: string;
440
+ entityTerms: string[];
441
+ };
442
+ }) {
443
+ const { db, schema } = await getDbClient();
444
+ const rows = await db.select().from(schema.memories).where(eq(schema.memories.id, memoryId)).limit(1);
445
+ const row = rows[0];
446
+ if (!row) return;
447
+ const details = deserializeMetadata(row.metadata ?? null) ?? {};
448
+ const next = {
449
+ ...details,
450
+ signal,
451
+ classification: signal.classification,
452
+ reasons: signal.reasons,
453
+ rawFallbackSnapshotId: signal.rawFallbackSnapshotId,
454
+ nuanceSuppressed: signal.nuanceSuppressed,
455
+ placeId: signal.placeId,
456
+ placeType: signal.placeType,
457
+ graph: signal.graph,
458
+ graphStatus: signal.graph
459
+ ? `${signal.graph.enriched ? 'enriched' : 'skipped'} (${signal.graph.entitiesCreated} entities, ${signal.graph.relationsCreated} relations)`
460
+ : 'none',
461
+ };
462
+ await db.update(schema.memories)
463
+ .set({ metadata: serializeMetadata(next), updatedAt: new Date() })
464
+ .where(eq(schema.memories.id, memoryId));
465
+ }
466
+
467
+ async function attachBeliefInspectionMetadata(memoryId: string, beliefs: Array<{
468
+ id: string;
469
+ type: string;
470
+ statement: string;
471
+ status: string;
472
+ confidence: number;
473
+ sourceMemoryIds: string[];
474
+ reason?: string;
475
+ }>) {
476
+ const { db, schema } = await getDbClient();
477
+ const rows = await db.select().from(schema.memories).where(eq(schema.memories.id, memoryId)).limit(1);
478
+ const row = rows[0];
479
+ if (!row) return;
480
+ const details = deserializeMetadata(row.metadata ?? null) ?? {};
481
+ const next = {
482
+ ...details,
483
+ beliefs: beliefs.map((belief) => ({
484
+ id: belief.id,
485
+ type: belief.type,
486
+ statement: belief.statement,
487
+ status: belief.status,
488
+ confidence: belief.confidence,
489
+ sourceMemoryIds: belief.sourceMemoryIds,
490
+ reason: belief.reason,
491
+ })),
492
+ };
493
+ await db.update(schema.memories)
494
+ .set({ metadata: serializeMetadata(next), updatedAt: new Date() })
495
+ .where(eq(schema.memories.id, memoryId));
496
+ }
497
+
498
+ function extractActiveFiles(toolName: string, toolInput: Record<string, unknown>): string[] {
499
+ const path = String(toolInput.filePath || toolInput.path || '');
500
+ if (['Write', 'Edit', 'MultiEdit'].includes(toolName) && path) {
501
+ return [path];
502
+ }
503
+ return [];
504
+ }
505
+
506
+ function inferOutcome(signalDecision: { classification: string }, toolResult: unknown): string | undefined {
507
+ const content = typeof toolResult === 'string' ? toolResult.toLowerCase() : String(toolResult ?? '').toLowerCase();
508
+ if (signalDecision.classification === 'discard') return 'suppressed';
509
+ if (/\bfail|error|exception|traceback\b/.test(content)) return 'failure';
510
+ if (/\bpass|success|completed\b/.test(content)) return 'success';
511
+ return undefined;
512
+ }
513
+
514
+ /**
515
+ * Session end hook - save snapshot and sync to persistent hot cache
516
+ */
517
+ export async function handleSessionEnd(params: {
518
+ projectPath: string;
519
+ agentType: 'claude-code' | 'opencode' | 'cursor' | 'windsurf';
520
+ workInProgress?: string;
521
+ }): Promise<{
522
+ snapshotId?: string;
523
+ memoriesSaved: number;
524
+ }> {
525
+ const { projectPath, agentType, workInProgress } = params;
526
+
527
+ // Ensure project exists
528
+ await ensureProject(projectPath);
529
+
530
+ logger.info(`[Hooks] Session end (agent: ${agentType}, session: ${currentSessionId})`);
531
+
532
+ // Save session snapshot as a learning
533
+ if (workInProgress) {
534
+ const snapshot = await createLearning({
535
+ type: 'insight',
536
+ content: `[SESSION SNAPSHOT] ${workInProgress}`,
537
+ action: 'session-end',
538
+ project: projectPath,
539
+ autoLink: false,
540
+ });
541
+
542
+ logger.info(`[Hooks] Saved session snapshot: ${snapshot.id}`);
543
+
544
+ // NEW: Also save to persistent hot cache (survives restart)
545
+ try {
546
+ const workingSet = await compactSessionWorkingSet(projectPath);
547
+ await addSessionContextToHotCache({
548
+ activeFiles: workingSet?.activeFiles || [],
549
+ commands: workingSet?.recentCommands?.slice(-3).map(c => c.command) || [],
550
+ failures: workingSet?.recentFailures?.slice(-2) || [],
551
+ decisions: [], // Could extract from recent signals
552
+ hypotheses: workingSet?.currentHypotheses?.slice(-2) || [],
553
+ }, projectPath);
554
+ logger.info('[Hooks] Saved session context to hot cache');
555
+ } catch (error) {
556
+ logger.warn('[Hooks] Failed to save hot cache', error);
557
+ }
558
+
559
+ currentSessionId = null; // Clear session
560
+
561
+ return {
562
+ snapshotId: snapshot.id,
563
+ memoriesSaved: 1,
564
+ };
565
+ }
566
+
567
+ currentSessionId = null;
568
+
569
+ return {
570
+ memoriesSaved: 0,
571
+ };
572
+ }
573
+
574
+ /**
575
+ * Pre-compact hook - save state for recovery
576
+ */
577
+ export async function handlePreCompact(params: {
578
+ projectPath: string;
579
+ agentType: 'claude-code' | 'opencode' | 'cursor' | 'windsurf';
580
+ }): Promise<{
581
+ stateSaved: boolean;
582
+ stateId?: string;
583
+ }> {
584
+ const { projectPath, agentType } = params;
585
+
586
+ // Ensure project exists
587
+ await ensureProject(projectPath);
588
+
589
+ logger.info(`[Hooks] Pre-compact (agent: ${agentType})`);
590
+
591
+ // Get recent work for recovery
592
+ const recent = await getRecent(projectPath, 3);
593
+
594
+ // Save state
595
+ const state = await createLearning({
596
+ type: 'insight',
597
+ content: `[PRE-COMPACT] State saved for recovery. Recent: ${recent.map(r => r.content?.substring(0, 50)).join(' | ')}`,
598
+ action: 'pre-compact',
599
+ project: projectPath,
600
+ autoLink: false,
601
+ });
602
+
603
+ return {
604
+ stateSaved: true,
605
+ stateId: state.id,
606
+ };
607
+ }
608
+
609
+ /**
610
+ * Extract target from tool input
611
+ */
612
+ function extractTarget(toolName: string, toolInput: Record<string, unknown>): string {
613
+ switch (toolName) {
614
+ case 'Write':
615
+ case 'Edit':
616
+ return String(toolInput.filePath || toolInput.path || 'unknown');
617
+ case 'Bash':
618
+ return String(toolInput.command || toolInput.cmd || 'unknown');
619
+ case 'Task':
620
+ return String(toolInput.description || toolInput.name || 'unknown');
621
+ default:
622
+ return 'unknown';
623
+ }
624
+ }
625
+
626
+ /**
627
+ * Extract content summary from tool result
628
+ */
629
+ function extractContent(
630
+ toolName: string,
631
+ toolInput: Record<string, unknown>,
632
+ toolResult: unknown
633
+ ): string {
634
+ switch (toolName) {
635
+ case 'Write':
636
+ return `Wrote: ${toolInput.filePath || toolInput.path}`;
637
+ case 'Edit':
638
+ return `Edited: ${toolInput.filePath || toolInput.path}`;
639
+ case 'Bash':
640
+ const cmd = String(toolInput.command || toolInput.cmd || '');
641
+ if (cmd.includes('commit')) return `Git commit executed`;
642
+ if (cmd.includes('test')) return `Tests run`;
643
+ return `Command: ${cmd.substring(0, 50)}`;
644
+ case 'Task':
645
+ return `Task: ${toolInput.description || toolInput.name || 'unknown'}`;
646
+ default:
647
+ return `Used: ${toolName}`;
648
+ }
649
+ }
650
+
651
+ // Re-export for convenience
652
+ export { shouldCaptureTool, categorizeTool } from './capture-filter.js';
653
+ export { inferTags } from './auto-tagger.js';