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,521 @@
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
+ import { randomUUID } from 'crypto';
14
+ import { createLearning } from '../ingestion/learnings.js';
15
+ import { getRecent, rememberMemory } from '../memory/memories.js';
16
+ import { logger } from '../logger.js';
17
+ import { shouldCaptureTool, categorizeTool } from './capture-filter.js';
18
+ import { inferTags } from './auto-tagger.js';
19
+ import { ensureProject, getProjectByPath } from '../projects.js';
20
+ import { autoAssignMemory, initializeDefaultPlaces } from '../places/index.js';
21
+ import { compressForContext } from '../compression.js';
22
+ import { getAgentPreferences } from '../agent-preferences.js';
23
+ import { classifySignalEvent, distillSignalEvent } from '../ingestion/signal-engine.js';
24
+ import { compactSessionWorkingSet, recordSessionSignal } from '../session/working-set.js';
25
+ import { getDbClient } from '../lib/db-client.js';
26
+ import { eq } from 'drizzle-orm';
27
+ import { serializeMetadata, deserializeMetadata } from '../memory/serialization.js';
28
+ import { addMemoryToGraph } from '../graph/graph-builder.js';
29
+ import { addSessionContextToHotCache } from '../hot-cache.js';
30
+ import { extractBeliefsFromMemory } from '../beliefs/extractor.js';
31
+ import { upsertBeliefsForMemory, getRecentFailures, getActiveConstraints, getActiveDecisions } from '../beliefs/store.js';
32
+ /** Session ID for tracking across agents */
33
+ let currentSessionId = null;
34
+ /**
35
+ * Generate a new session ID (universal across agents)
36
+ */
37
+ export function generateSessionId() {
38
+ currentSessionId = randomUUID();
39
+ return currentSessionId;
40
+ }
41
+ /**
42
+ * Get current session ID
43
+ */
44
+ export function getCurrentSessionId() {
45
+ return currentSessionId;
46
+ }
47
+ /**
48
+ * Set session ID (for resume/continue)
49
+ */
50
+ export function setSessionId(sessionId) {
51
+ currentSessionId = sessionId;
52
+ }
53
+ /**
54
+ * Session start hook - inject relevant context
55
+ */
56
+ export async function handleSessionStart(params) {
57
+ const { projectPath, mode, agentType } = params;
58
+ // Ensure project exists
59
+ await ensureProject(projectPath);
60
+ // Generate or get session ID
61
+ if (!currentSessionId) {
62
+ currentSessionId = generateSessionId();
63
+ }
64
+ logger.info(`[Hooks] Session start: ${mode} (agent: ${agentType}, session: ${currentSessionId})`);
65
+ // Get recent memories based on mode
66
+ const limit = mode === 'compact' ? 3 : 5;
67
+ const memories = await getRecent(projectPath, limit);
68
+ const compactedWorkingSet = await compactSessionWorkingSet(currentSessionId, projectPath);
69
+ // Get spatial memory context (places) for context injection
70
+ let placesContext = '';
71
+ try {
72
+ const { initializeDefaultPlaces, getProjectPlaces } = await import('../places/index.js');
73
+ const { getProjectByPath } = await import('../projects.js');
74
+ const project = await getProjectByPath(projectPath);
75
+ if (project) {
76
+ await initializeDefaultPlaces(project.id);
77
+ const places = await getProjectPlaces(project.id);
78
+ if (places.length > 0) {
79
+ const populatedPlaces = places.filter(p => p.memoryCount > 0).slice(0, 3);
80
+ if (populatedPlaces.length > 0) {
81
+ placesContext = '\n\nActive places: ' + populatedPlaces.map(p => `${p.name} (${p.memoryCount})`).join(', ');
82
+ }
83
+ }
84
+ }
85
+ }
86
+ catch (e) {
87
+ // Don't fail if places not available
88
+ logger.debug(`[Hooks] Places context not available: ${e}`);
89
+ }
90
+ // Format for injection with compression
91
+ const formatted = memories.map((m, i) => {
92
+ const compressed = compressForContext(m.content || '');
93
+ return `${i + 1}. [${m.type}] ${compressed}`;
94
+ }).join('\n');
95
+ const workingSetContext = compactedWorkingSet.summary ? `Session working set:\n${compactedWorkingSet.summary}\n\n` : '';
96
+ const allContent = workingSetContext + formatted + placesContext;
97
+ // Get agent preferences for context injection
98
+ let preferences = [];
99
+ try {
100
+ const project = await getProjectByPath(projectPath);
101
+ if (project) {
102
+ preferences = await getAgentPreferences(project.id);
103
+ // Get beliefs for state reconstruction on session boot
104
+ // This is the "state reconstruction" - active beliefs shape next actions
105
+ const [failures, constraints, decisions] = await Promise.all([
106
+ getRecentFailures(project.id, 5),
107
+ getActiveConstraints(project.id, 10),
108
+ getActiveDecisions(project.id, 10),
109
+ ]);
110
+ // Format beliefs into context
111
+ const beliefsSection = formatBeliefsForContext(failures, constraints, decisions);
112
+ // Add beliefs to injected context
113
+ if (beliefsSection) {
114
+ allContent = beliefsSection + '\n\n' + allContent;
115
+ }
116
+ logger.info(`[Hooks] Injected ${failures.length} failures, ${constraints.length} constraints, ${decisions.length} decisions`);
117
+ return {
118
+ memories: allContent ? allContent.split('\n') : [],
119
+ sessionId: currentSessionId,
120
+ count: memories.length,
121
+ preferences: preferences.length > 0 ? preferences : undefined,
122
+ beliefs: {
123
+ failures: failures.map(f => f.statement),
124
+ constraints: constraints.map(c => c.statement),
125
+ decisions: decisions.map(d => d.statement),
126
+ },
127
+ };
128
+ }
129
+ }
130
+ catch (e) {
131
+ logger.debug(`[Hooks] Agent preferences not available: ${e}`);
132
+ }
133
+ logger.info(`[Hooks] Injected ${memories.length} memories for session start`);
134
+ return {
135
+ memories: allContent ? allContent.split('\n') : [],
136
+ sessionId: currentSessionId,
137
+ count: memories.length,
138
+ preferences: preferences.length > 0 ? preferences : undefined,
139
+ };
140
+ }
141
+ /**
142
+ * Format beliefs into context section for session boot
143
+ * This drives "state reconstruction" - agent sees active constraints/failures/decisions
144
+ */
145
+ function formatBeliefsForContext(failures, constraints, decisions) {
146
+ const sections = [];
147
+ if (failures.length > 0) {
148
+ sections.push('AVOID:\n' + failures.map((f, i) => ` ${i + 1}. ${f.statement}${f.context ? ` (${f.context})` : ''}`).join('\n'));
149
+ }
150
+ if (constraints.length > 0) {
151
+ sections.push('CONSTRAINTS:\n' + constraints.map((c, i) => ` ${i + 1}. ${c.statement}${c.context ? ` (${c.context})` : ''}`).join('\n'));
152
+ }
153
+ if (decisions.length > 0) {
154
+ sections.push('DECISIONS:\n' + decisions.map((d, i) => ` ${i + 1}. ${d.statement}${d.context ? ` (${d.context})` : ''}`).join('\n'));
155
+ }
156
+ if (sections.length === 0)
157
+ return '';
158
+ return sections.join('\n\n');
159
+ }
160
+ /**
161
+ * Post-tool-use hook - record observations
162
+ */
163
+ export async function handlePostToolUse(params) {
164
+ const { toolName, toolInput, toolResult, projectPath, agentType } = params;
165
+ // Ensure project exists
166
+ await ensureProject(projectPath);
167
+ // Ensure session ID exists
168
+ if (!currentSessionId) {
169
+ currentSessionId = generateSessionId();
170
+ }
171
+ // Check if we should capture this tool
172
+ if (!shouldCaptureTool(toolName)) {
173
+ await recordSessionSignal({
174
+ sessionId: currentSessionId,
175
+ projectPath,
176
+ classification: 'discard',
177
+ distilledContent: `Filtered tool: ${toolName}`,
178
+ toolName,
179
+ target: extractTarget(toolName, toolInput),
180
+ });
181
+ return { captured: false, reason: `Tool ${toolName} filtered out` };
182
+ }
183
+ // Extract relevant information
184
+ const category = categorizeTool(toolName);
185
+ const target = extractTarget(toolName, toolInput);
186
+ const content = extractContent(toolName, toolInput, toolResult);
187
+ const signalDecision = classifySignalEvent({
188
+ toolName,
189
+ toolInput,
190
+ toolResult,
191
+ sessionId: currentSessionId,
192
+ });
193
+ const distilledContent = distillSignalEvent({
194
+ toolName,
195
+ command: String(toolInput.command || toolInput.cmd || ''),
196
+ content: signalDecision.content || content,
197
+ classification: signalDecision.classification,
198
+ });
199
+ // Infer tags from context
200
+ const tags = inferTags(toolName, toolInput, distilledContent || content);
201
+ await recordSessionSignal({
202
+ sessionId: currentSessionId,
203
+ projectPath,
204
+ classification: signalDecision.classification,
205
+ distilledContent,
206
+ toolName,
207
+ target,
208
+ metadata: {
209
+ activeFiles: extractActiveFiles(toolName, toolInput),
210
+ command: String(toolInput.command || toolInput.cmd || ''),
211
+ outcome: inferOutcome(signalDecision, toolResult),
212
+ contentHash: signalDecision.contentHash,
213
+ tokensSaved: signalDecision.estimatedSavings,
214
+ activePlaces: signalDecision.placeHint.placeType ? [signalDecision.placeHint.placeType] : [],
215
+ graphEntities: signalDecision.graphHint.entityTerms,
216
+ placeRouted: Boolean(signalDecision.placeHint.placeType),
217
+ graphEnriched: signalDecision.graphHint.shouldEnrich,
218
+ },
219
+ });
220
+ if (signalDecision.classification === 'discard') {
221
+ return { captured: false, reason: signalDecision.reasons.join(', ') };
222
+ }
223
+ if (signalDecision.classification === 'session-only') {
224
+ return { captured: false, reason: 'Stored in session working set only' };
225
+ }
226
+ try {
227
+ const memory = await rememberMemory({
228
+ content: `[${category}] ${distilledContent || content}`,
229
+ project: projectPath,
230
+ type: category === 'modification' ? 'decision' : category === 'planning' ? 'context' : 'observation',
231
+ source: 'auto-capture',
232
+ metadata: {
233
+ signal: {
234
+ classification: signalDecision.classification,
235
+ reasons: signalDecision.reasons,
236
+ nuanceSuppressed: signalDecision.classification === 'durable-raw+distilled',
237
+ wakeUpPriority: signalDecision.wakeUpPriority,
238
+ },
239
+ placeHint: signalDecision.placeHint,
240
+ graphHint: signalDecision.graphHint,
241
+ target,
242
+ toolName,
243
+ },
244
+ });
245
+ logger.info(`[Hooks] Captured ${toolName} → ${memory.id} (session: ${currentSessionId})`);
246
+ let placeAssignment;
247
+ try {
248
+ const project = await getProjectByPath(projectPath);
249
+ if (project) {
250
+ await initializeDefaultPlaces(project.id);
251
+ placeAssignment = await autoAssignMemory({
252
+ memoryId: memory.id,
253
+ projectId: project.id,
254
+ toolName,
255
+ content: memory.content,
256
+ tags,
257
+ memoryType: memory.type,
258
+ });
259
+ }
260
+ }
261
+ catch (placeError) {
262
+ logger.warn(`[Hooks] Place assignment failed: ${placeError}`);
263
+ }
264
+ let graphStatus = {
265
+ enriched: false,
266
+ entitiesCreated: 0,
267
+ relationsCreated: 0,
268
+ source: 'none',
269
+ entityTerms: signalDecision.graphHint.entityTerms,
270
+ };
271
+ if (signalDecision.graphHint.shouldEnrich) {
272
+ try {
273
+ const graphResult = await addMemoryToGraph(memory.id, { preferLLM: true });
274
+ graphStatus = {
275
+ enriched: graphResult.entitiesCreated > 0 || graphResult.relationsCreated > 0,
276
+ entitiesCreated: graphResult.entitiesCreated,
277
+ relationsCreated: graphResult.relationsCreated,
278
+ source: graphResult.source,
279
+ entityTerms: signalDecision.graphHint.entityTerms,
280
+ };
281
+ }
282
+ catch (graphError) {
283
+ logger.warn(`[Hooks] Graph enrichment failed: ${graphError}`);
284
+ }
285
+ }
286
+ let rawFallbackSnapshotId;
287
+ if (signalDecision.classification === 'durable-raw+distilled') {
288
+ rawFallbackSnapshotId = await attachRawFallbackSnapshot(memory.id, signalDecision.content, signalDecision.reasons);
289
+ }
290
+ await attachInspectionMetadata(memory.id, {
291
+ classification: signalDecision.classification,
292
+ reasons: signalDecision.reasons,
293
+ rawFallbackSnapshotId,
294
+ nuanceSuppressed: signalDecision.classification === 'durable-raw+distilled',
295
+ placeId: placeAssignment?.placeId,
296
+ placeType: placeAssignment?.placeType,
297
+ graph: graphStatus,
298
+ });
299
+ try {
300
+ const project = await getProjectByPath(projectPath);
301
+ if (project) {
302
+ const beliefs = extractBeliefsFromMemory({
303
+ memoryId: memory.id,
304
+ content: memory.content,
305
+ type: memory.type,
306
+ metadata: memory.metadata ?? null,
307
+ });
308
+ if (beliefs.length > 0) {
309
+ const storedBeliefs = await upsertBeliefsForMemory({
310
+ projectId: project.id,
311
+ memoryId: memory.id,
312
+ beliefs,
313
+ });
314
+ await attachBeliefInspectionMetadata(memory.id, storedBeliefs);
315
+ }
316
+ }
317
+ }
318
+ catch (beliefError) {
319
+ logger.warn(`[Hooks] Belief extraction failed: ${beliefError}`);
320
+ }
321
+ return {
322
+ captured: true,
323
+ memoryId: memory.id,
324
+ };
325
+ }
326
+ catch (error) {
327
+ logger.error(`[Hooks] Failed to capture:`, error);
328
+ return { captured: false, reason: 'Failed to create learning' };
329
+ }
330
+ }
331
+ async function attachRawFallbackSnapshot(memoryId, rawContent, reasons) {
332
+ const { db, schema } = await getDbClient();
333
+ const snapshotId = randomUUID();
334
+ await db.insert(schema.memorySnapshots).values({
335
+ id: snapshotId,
336
+ memoryId,
337
+ snapshotType: 'periodic',
338
+ content: rawContent,
339
+ metadata: serializeMetadata({
340
+ role: 'raw-fallback',
341
+ reasons,
342
+ createdBy: 'signal-engine',
343
+ }),
344
+ createdAt: new Date(),
345
+ });
346
+ return snapshotId;
347
+ }
348
+ async function attachInspectionMetadata(memoryId, signal) {
349
+ const { db, schema } = await getDbClient();
350
+ const rows = await db.select().from(schema.memories).where(eq(schema.memories.id, memoryId)).limit(1);
351
+ const row = rows[0];
352
+ if (!row)
353
+ return;
354
+ const details = deserializeMetadata(row.metadata ?? null) ?? {};
355
+ const next = {
356
+ ...details,
357
+ signal,
358
+ classification: signal.classification,
359
+ reasons: signal.reasons,
360
+ rawFallbackSnapshotId: signal.rawFallbackSnapshotId,
361
+ nuanceSuppressed: signal.nuanceSuppressed,
362
+ placeId: signal.placeId,
363
+ placeType: signal.placeType,
364
+ graph: signal.graph,
365
+ graphStatus: signal.graph
366
+ ? `${signal.graph.enriched ? 'enriched' : 'skipped'} (${signal.graph.entitiesCreated} entities, ${signal.graph.relationsCreated} relations)`
367
+ : 'none',
368
+ };
369
+ await db.update(schema.memories)
370
+ .set({ metadata: serializeMetadata(next), updatedAt: new Date() })
371
+ .where(eq(schema.memories.id, memoryId));
372
+ }
373
+ async function attachBeliefInspectionMetadata(memoryId, beliefs) {
374
+ const { db, schema } = await getDbClient();
375
+ const rows = await db.select().from(schema.memories).where(eq(schema.memories.id, memoryId)).limit(1);
376
+ const row = rows[0];
377
+ if (!row)
378
+ return;
379
+ const details = deserializeMetadata(row.metadata ?? null) ?? {};
380
+ const next = {
381
+ ...details,
382
+ beliefs: beliefs.map((belief) => ({
383
+ id: belief.id,
384
+ type: belief.type,
385
+ statement: belief.statement,
386
+ status: belief.status,
387
+ confidence: belief.confidence,
388
+ sourceMemoryIds: belief.sourceMemoryIds,
389
+ reason: belief.reason,
390
+ })),
391
+ };
392
+ await db.update(schema.memories)
393
+ .set({ metadata: serializeMetadata(next), updatedAt: new Date() })
394
+ .where(eq(schema.memories.id, memoryId));
395
+ }
396
+ function extractActiveFiles(toolName, toolInput) {
397
+ const path = String(toolInput.filePath || toolInput.path || '');
398
+ if (['Write', 'Edit', 'MultiEdit'].includes(toolName) && path) {
399
+ return [path];
400
+ }
401
+ return [];
402
+ }
403
+ function inferOutcome(signalDecision, toolResult) {
404
+ const content = typeof toolResult === 'string' ? toolResult.toLowerCase() : String(toolResult ?? '').toLowerCase();
405
+ if (signalDecision.classification === 'discard')
406
+ return 'suppressed';
407
+ if (/\bfail|error|exception|traceback\b/.test(content))
408
+ return 'failure';
409
+ if (/\bpass|success|completed\b/.test(content))
410
+ return 'success';
411
+ return undefined;
412
+ }
413
+ /**
414
+ * Session end hook - save snapshot and sync to persistent hot cache
415
+ */
416
+ export async function handleSessionEnd(params) {
417
+ const { projectPath, agentType, workInProgress } = params;
418
+ // Ensure project exists
419
+ await ensureProject(projectPath);
420
+ logger.info(`[Hooks] Session end (agent: ${agentType}, session: ${currentSessionId})`);
421
+ // Save session snapshot as a learning
422
+ if (workInProgress) {
423
+ const snapshot = await createLearning({
424
+ type: 'insight',
425
+ content: `[SESSION SNAPSHOT] ${workInProgress}`,
426
+ action: 'session-end',
427
+ project: projectPath,
428
+ autoLink: false,
429
+ });
430
+ logger.info(`[Hooks] Saved session snapshot: ${snapshot.id}`);
431
+ // NEW: Also save to persistent hot cache (survives restart)
432
+ try {
433
+ const workingSet = await compactSessionWorkingSet(projectPath);
434
+ await addSessionContextToHotCache({
435
+ activeFiles: workingSet?.activeFiles || [],
436
+ commands: workingSet?.recentCommands?.slice(-3).map(c => c.command) || [],
437
+ failures: workingSet?.recentFailures?.slice(-2) || [],
438
+ decisions: [], // Could extract from recent signals
439
+ hypotheses: workingSet?.currentHypotheses?.slice(-2) || [],
440
+ }, projectPath);
441
+ logger.info('[Hooks] Saved session context to hot cache');
442
+ }
443
+ catch (error) {
444
+ logger.warn('[Hooks] Failed to save hot cache', error);
445
+ }
446
+ currentSessionId = null; // Clear session
447
+ return {
448
+ snapshotId: snapshot.id,
449
+ memoriesSaved: 1,
450
+ };
451
+ }
452
+ currentSessionId = null;
453
+ return {
454
+ memoriesSaved: 0,
455
+ };
456
+ }
457
+ /**
458
+ * Pre-compact hook - save state for recovery
459
+ */
460
+ export async function handlePreCompact(params) {
461
+ const { projectPath, agentType } = params;
462
+ // Ensure project exists
463
+ await ensureProject(projectPath);
464
+ logger.info(`[Hooks] Pre-compact (agent: ${agentType})`);
465
+ // Get recent work for recovery
466
+ const recent = await getRecent(projectPath, 3);
467
+ // Save state
468
+ const state = await createLearning({
469
+ type: 'insight',
470
+ content: `[PRE-COMPACT] State saved for recovery. Recent: ${recent.map(r => r.content?.substring(0, 50)).join(' | ')}`,
471
+ action: 'pre-compact',
472
+ project: projectPath,
473
+ autoLink: false,
474
+ });
475
+ return {
476
+ stateSaved: true,
477
+ stateId: state.id,
478
+ };
479
+ }
480
+ /**
481
+ * Extract target from tool input
482
+ */
483
+ function extractTarget(toolName, toolInput) {
484
+ switch (toolName) {
485
+ case 'Write':
486
+ case 'Edit':
487
+ return String(toolInput.filePath || toolInput.path || 'unknown');
488
+ case 'Bash':
489
+ return String(toolInput.command || toolInput.cmd || 'unknown');
490
+ case 'Task':
491
+ return String(toolInput.description || toolInput.name || 'unknown');
492
+ default:
493
+ return 'unknown';
494
+ }
495
+ }
496
+ /**
497
+ * Extract content summary from tool result
498
+ */
499
+ function extractContent(toolName, toolInput, toolResult) {
500
+ switch (toolName) {
501
+ case 'Write':
502
+ return `Wrote: ${toolInput.filePath || toolInput.path}`;
503
+ case 'Edit':
504
+ return `Edited: ${toolInput.filePath || toolInput.path}`;
505
+ case 'Bash':
506
+ const cmd = String(toolInput.command || toolInput.cmd || '');
507
+ if (cmd.includes('commit'))
508
+ return `Git commit executed`;
509
+ if (cmd.includes('test'))
510
+ return `Tests run`;
511
+ return `Command: ${cmd.substring(0, 50)}`;
512
+ case 'Task':
513
+ return `Task: ${toolInput.description || toolInput.name || 'unknown'}`;
514
+ default:
515
+ return `Used: ${toolName}`;
516
+ }
517
+ }
518
+ // Re-export for convenience
519
+ export { shouldCaptureTool, categorizeTool } from './capture-filter.js';
520
+ export { inferTags } from './auto-tagger.js';
521
+ //# sourceMappingURL=agent-hooks.js.map
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Auto-Tagger - Infer tags from context
3
+ *
4
+ * Analyzes tool input/output to automatically infer relevant tags.
5
+ * Uses pattern matching to classify actions.
6
+ */
7
+ /**
8
+ * Infer tags based on tool, input, and content
9
+ */
10
+ export declare function inferTags(toolName: string, toolInput: Record<string, unknown>, content: string): string[];
11
+ /**
12
+ * Extract tags from commit message
13
+ */
14
+ export declare function extractCommitTags(commitMessage: string): string[];
15
+ /**
16
+ * Extract tags from file path
17
+ */
18
+ export declare function extractFileTags(filePath: string): string[];
19
+ //# sourceMappingURL=auto-tagger.d.ts.map
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Auto-Tagger - Infer tags from context
3
+ *
4
+ * Analyzes tool input/output to automatically infer relevant tags.
5
+ * Uses pattern matching to classify actions.
6
+ */
7
+ /**
8
+ * Infer tags based on tool, input, and content
9
+ */
10
+ export function inferTags(toolName, toolInput, content) {
11
+ const tags = ['hook', 'autocapture']; // Always add these
12
+ const tool = toolName.toLowerCase();
13
+ const inputStr = JSON.stringify(toolInput).toLowerCase();
14
+ const contentLower = content.toLowerCase();
15
+ // File type tags
16
+ if (tool === 'write' || tool === 'edit') {
17
+ const filePath = String(toolInput.filePath || toolInput.path || '');
18
+ if (filePath.endsWith('.ts') || filePath.endsWith('.tsx')) {
19
+ tags.push('typescript');
20
+ }
21
+ else if (filePath.endsWith('.js') || filePath.endsWith('.jsx')) {
22
+ tags.push('javascript');
23
+ }
24
+ else if (filePath.endsWith('.json')) {
25
+ tags.push('config');
26
+ }
27
+ else if (filePath.endsWith('.md')) {
28
+ tags.push('documentation');
29
+ }
30
+ else if (filePath.endsWith('.test.ts') || filePath.endsWith('.spec.ts')) {
31
+ tags.push('test');
32
+ }
33
+ // Feature/fix detection
34
+ if (contentLower.includes('fix') || contentLower.includes('bug')) {
35
+ tags.push('bugfix');
36
+ }
37
+ else if (contentLower.includes('refactor')) {
38
+ tags.push('refactor');
39
+ }
40
+ else if (contentLower.includes('feature') || contentLower.includes('add')) {
41
+ tags.push('feature');
42
+ }
43
+ else if (contentLower.includes('test')) {
44
+ tags.push('testing');
45
+ }
46
+ }
47
+ // Bash command tags
48
+ if (tool === 'bash') {
49
+ const cmd = String(toolInput.command || toolInput.cmd || '');
50
+ if (cmd.includes('git commit')) {
51
+ tags.push('commit', 'version-control');
52
+ }
53
+ else if (cmd.includes('test') || cmd.includes('jest') || cmd.includes('vitest')) {
54
+ tags.push('testing', 'test');
55
+ }
56
+ else if (cmd.includes('build') || cmd.includes('compile')) {
57
+ tags.push('build');
58
+ }
59
+ else if (cmd.includes('install')) {
60
+ tags.push('dependencies');
61
+ }
62
+ else if (cmd.includes('lint') || cmd.includes('format')) {
63
+ tags.push('linting');
64
+ }
65
+ }
66
+ // Task tags
67
+ if (tool === 'task' || tool === 'todowrite') {
68
+ tags.push('task', 'planning');
69
+ if (contentLower.includes('fix') || contentLower.includes('bug')) {
70
+ tags.push('bugfix');
71
+ }
72
+ else if (contentLower.includes('feature')) {
73
+ tags.push('feature');
74
+ }
75
+ else if (contentLower.includes('refactor')) {
76
+ tags.push('refactor');
77
+ }
78
+ }
79
+ // Deduplicate
80
+ return [...new Set(tags)];
81
+ }
82
+ /**
83
+ * Extract tags from commit message
84
+ */
85
+ export function extractCommitTags(commitMessage) {
86
+ const tags = ['commit'];
87
+ const msg = commitMessage.toLowerCase();
88
+ // Conventional commits
89
+ if (msg.startsWith('feat:') || msg.includes('feature')) {
90
+ tags.push('feature', 'conventional-commit');
91
+ }
92
+ else if (msg.startsWith('fix:') || msg.includes('bugfix')) {
93
+ tags.push('bugfix', 'conventional-commit');
94
+ }
95
+ else if (msg.startsWith('refactor:')) {
96
+ tags.push('refactor', 'conventional-commit');
97
+ }
98
+ else if (msg.startsWith('docs:')) {
99
+ tags.push('documentation', 'conventional-commit');
100
+ }
101
+ else if (msg.startsWith('test:')) {
102
+ tags.push('testing', 'conventional-commit');
103
+ }
104
+ else if (msg.startsWith('chore:')) {
105
+ tags.push('chore', 'conventional-commit');
106
+ }
107
+ return tags;
108
+ }
109
+ /**
110
+ * Extract tags from file path
111
+ */
112
+ export function extractFileTags(filePath) {
113
+ const tags = [];
114
+ const path = filePath.toLowerCase();
115
+ // By extension
116
+ if (path.endsWith('.ts') || path.endsWith('.tsx')) {
117
+ tags.push('typescript');
118
+ }
119
+ else if (path.endsWith('.js') || path.endsWith('.jsx')) {
120
+ tags.push('javascript');
121
+ }
122
+ else if (path.endsWith('.py')) {
123
+ tags.push('python');
124
+ }
125
+ else if (path.endsWith('.go')) {
126
+ tags.push('golang');
127
+ }
128
+ else if (path.endsWith('.rs')) {
129
+ tags.push('rust');
130
+ }
131
+ else if (path.endsWith('.java')) {
132
+ tags.push('java');
133
+ }
134
+ else if (path.endsWith('.json')) {
135
+ tags.push('config');
136
+ }
137
+ else if (path.endsWith('.md')) {
138
+ tags.push('documentation');
139
+ }
140
+ // By directory pattern
141
+ if (path.includes('/test') || path.includes('/tests') || path.includes('__tests__')) {
142
+ tags.push('test');
143
+ }
144
+ else if (path.includes('/src/')) {
145
+ tags.push('source');
146
+ }
147
+ else if (path.includes('/lib/') || path.includes('/utils/')) {
148
+ tags.push('library');
149
+ }
150
+ else if (path.includes('/config/') || path.includes('/scripts/')) {
151
+ tags.push('config');
152
+ }
153
+ return tags;
154
+ }
155
+ //# sourceMappingURL=auto-tagger.js.map