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,57 @@
1
+ /**
2
+ * Learnings Module
3
+ * Agent learnings: success, failure, fix, insight
4
+ * With auto-linking to similar memories and learnings
5
+ */
6
+ export type LearningType = 'success' | 'failure' | 'fix' | 'insight';
7
+ export interface LearningInput {
8
+ type: LearningType;
9
+ content: string;
10
+ context?: string;
11
+ action?: string;
12
+ target?: string;
13
+ project?: string;
14
+ memoryId?: string;
15
+ autoLink?: boolean;
16
+ }
17
+ export interface LearningRecord {
18
+ id: string;
19
+ projectId?: string | null;
20
+ conversationId?: string | null;
21
+ type: LearningType;
22
+ action: string;
23
+ target?: string | null;
24
+ summary: string;
25
+ details?: Record<string, unknown> | null;
26
+ memoryId?: string | null;
27
+ isImported?: boolean;
28
+ createdAt?: string | null;
29
+ }
30
+ /**
31
+ * Create a learning and optionally auto-link to similar memories/learnings
32
+ */
33
+ export declare function createLearning(input: LearningInput): Promise<LearningRecord>;
34
+ /**
35
+ * Get learnings for a project
36
+ */
37
+ export declare function getLearnings(projectPath: string, limit: number): Promise<LearningRecord[]>;
38
+ /**
39
+ * Get recent learnings
40
+ */
41
+ export declare function getRecentLearnings(projectPath: string, limit?: number): Promise<LearningRecord[]>;
42
+ /**
43
+ * Get learning by ID
44
+ */
45
+ export declare function getLearningById(learningId: string): Promise<LearningRecord | null>;
46
+ /**
47
+ * Get learnings linked to a specific memory
48
+ */
49
+ export declare function getLearningsForMemory(memoryId: string): Promise<LearningRecord[]>;
50
+ /**
51
+ * Delete a learning
52
+ */
53
+ export declare function deleteLearning(learningId: string): Promise<boolean>;
54
+ export declare const getObservations: typeof getLearnings;
55
+ export declare const getRecentObservations: typeof getRecentLearnings;
56
+ export declare const getObservationById: typeof getLearningById;
57
+ //# sourceMappingURL=learnings.d.ts.map
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Learnings Module
3
+ * Agent learnings: success, failure, fix, insight
4
+ * With auto-linking to similar memories and learnings
5
+ */
6
+ import { randomUUID } from 'crypto';
7
+ import { desc, eq } from 'drizzle-orm';
8
+ import { getEmbedding } from '../embeddings.js';
9
+ import { getOrCreateProject, requireProject } from '../projects.js';
10
+ import { serializeMetadata, deserializeMetadata } from '../memory/serialization.js';
11
+ import { normalizeTimestamp, prepareEmbedding } from '../lib/utils.js';
12
+ import { logger } from '../logger.js';
13
+ import { getDbClient } from '../lib/db-client.js';
14
+ import { createAssociation } from '../associations.js';
15
+ import { search } from '../memory/memories.js';
16
+ import { updateAgentPreference } from '../agent-preferences.js';
17
+ /**
18
+ * Create a learning and optionally auto-link to similar memories/learnings
19
+ */
20
+ export async function createLearning(input) {
21
+ const { db, schema } = await getDbClient();
22
+ const project = await getOrCreateProject(input.project);
23
+ const embedding = await getEmbedding(input.content);
24
+ const id = randomUUID();
25
+ const learningType = input.type;
26
+ const autoLink = input.autoLink !== false; // default true
27
+ // Build details with learning metadata
28
+ const details = serializeMetadata({
29
+ learningType: learningType,
30
+ learningContent: input.content,
31
+ learningContext: input.context,
32
+ });
33
+ const embeddingValues = prepareEmbedding(embedding);
34
+ // Insert the learning
35
+ await db.insert(schema.learnings).values({
36
+ id,
37
+ projectId: project?.id ?? null,
38
+ type: learningType,
39
+ action: input.action ?? input.content,
40
+ summary: input.context || input.content,
41
+ target: input.target ?? null,
42
+ details,
43
+ memoryId: input.memoryId ?? null,
44
+ ...embeddingValues,
45
+ createdAt: new Date(),
46
+ });
47
+ // If memoryId provided, create bidirectional link
48
+ if (input.memoryId) {
49
+ await createAssociation(input.memoryId, // from memory
50
+ id, // to learning
51
+ 'relates_to', 1);
52
+ }
53
+ // Auto-link to similar memories and learnings (if enabled)
54
+ if (autoLink) {
55
+ await autoLinkLearning(id, input.content, project?.id ?? null);
56
+ }
57
+ // Extract and store agent preferences from this learning
58
+ await updateAgentPreference(project?.id ?? 'default', input.content, id);
59
+ return {
60
+ id,
61
+ projectId: project?.id ?? null,
62
+ conversationId: null,
63
+ type: learningType,
64
+ action: input.action ?? input.content,
65
+ target: input.target ?? null,
66
+ summary: input.context || input.content,
67
+ details: { learningType: learningType, learningContent: input.content, learningContext: input.context },
68
+ memoryId: input.memoryId ?? null,
69
+ createdAt: new Date().toISOString(),
70
+ };
71
+ }
72
+ /**
73
+ * Auto-link a learning to similar memories above threshold
74
+ */
75
+ async function autoLinkLearning(learningId, content, projectId) {
76
+ const SIMILARITY_THRESHOLD = 0.85;
77
+ const MAX_LINKS = 5;
78
+ if (!projectId)
79
+ return;
80
+ try {
81
+ // Search for similar memories using the search function
82
+ const similarMemories = await search({
83
+ query: content,
84
+ limit: MAX_LINKS,
85
+ });
86
+ // Filter by similarity threshold
87
+ const relevantMemories = similarMemories.filter((m) => (m.similarity ?? 0) >= SIMILARITY_THRESHOLD);
88
+ // Create associations with memories
89
+ for (const mem of relevantMemories) {
90
+ await createAssociation(learningId, // from learning
91
+ mem.id, // to memory
92
+ 'relates_to', mem.similarity ?? 0.9);
93
+ }
94
+ logger.info(`Auto-linked learning ${learningId} to ${relevantMemories.length} memories`);
95
+ }
96
+ catch (error) {
97
+ logger.error('Error in auto-linking:', error);
98
+ // Don't fail learning creation if auto-link fails
99
+ }
100
+ }
101
+ /**
102
+ * Get learnings for a project
103
+ */
104
+ export async function getLearnings(projectPath, limit) {
105
+ try {
106
+ const { db, schema } = await getDbClient();
107
+ const project = await requireProject(projectPath);
108
+ const rows = await db.select().from(schema.learnings)
109
+ .where(eq(schema.learnings.projectId, project.id))
110
+ .orderBy(desc(schema.learnings.createdAt))
111
+ .limit(limit);
112
+ return rows.map((row) => normalizeLearning(row));
113
+ }
114
+ catch (error) {
115
+ throw error;
116
+ }
117
+ }
118
+ /**
119
+ * Get recent learnings
120
+ */
121
+ export async function getRecentLearnings(projectPath, limit = 10) {
122
+ try {
123
+ const { db, schema } = await getDbClient();
124
+ const project = await requireProject(projectPath);
125
+ const rows = await db.select().from(schema.learnings)
126
+ .where(eq(schema.learnings.projectId, project.id))
127
+ .orderBy(desc(schema.learnings.createdAt))
128
+ .limit(limit);
129
+ return rows.map((row) => normalizeLearning(row));
130
+ }
131
+ catch (error) {
132
+ logger.error('Error getting recent learnings', error);
133
+ throw error;
134
+ }
135
+ }
136
+ /**
137
+ * Get learning by ID
138
+ */
139
+ export async function getLearningById(learningId) {
140
+ try {
141
+ const { db, schema } = await getDbClient();
142
+ const rows = await db.select().from(schema.learnings)
143
+ .where(eq(schema.learnings.id, learningId))
144
+ .limit(1);
145
+ if (rows.length === 0)
146
+ return null;
147
+ return normalizeLearning(rows[0]);
148
+ }
149
+ catch (error) {
150
+ logger.error('Error getting learning', error);
151
+ throw error;
152
+ }
153
+ }
154
+ /**
155
+ * Get learnings linked to a specific memory
156
+ */
157
+ export async function getLearningsForMemory(memoryId) {
158
+ try {
159
+ const { db, schema } = await getDbClient();
160
+ const rows = await db.select().from(schema.learnings)
161
+ .where(eq(schema.learnings.memoryId, memoryId))
162
+ .orderBy(desc(schema.learnings.createdAt));
163
+ return rows.map((row) => normalizeLearning(row));
164
+ }
165
+ catch (error) {
166
+ logger.error('Error getting learnings for memory', error);
167
+ throw error;
168
+ }
169
+ }
170
+ /**
171
+ * Delete a learning
172
+ */
173
+ export async function deleteLearning(learningId) {
174
+ try {
175
+ const { db, schema } = await getDbClient();
176
+ await db.delete(schema.learnings)
177
+ .where(eq(schema.learnings.id, learningId));
178
+ return true;
179
+ }
180
+ catch (error) {
181
+ logger.error('Error deleting learning', error);
182
+ return false;
183
+ }
184
+ }
185
+ function normalizeLearning(row) {
186
+ const details = deserializeMetadata(row.details ?? null);
187
+ return {
188
+ id: row.id,
189
+ projectId: row.projectId ?? row.project_id ?? null,
190
+ conversationId: row.conversationId ?? row.conversation_id ?? null,
191
+ type: row.type,
192
+ action: row.action,
193
+ target: row.target ?? null,
194
+ summary: row.summary,
195
+ details,
196
+ memoryId: row.memoryId ?? row.memory_id ?? null,
197
+ isImported: row.isImported ?? row.is_imported ?? false,
198
+ createdAt: normalizeTimestamp(row.createdAt ?? row.created_at),
199
+ };
200
+ }
201
+ // Backwards compatibility aliases
202
+ export const getObservations = getLearnings;
203
+ export const getRecentObservations = getRecentLearnings;
204
+ export const getObservationById = getLearningById;
205
+ //# sourceMappingURL=learnings.js.map
@@ -0,0 +1,41 @@
1
+ export type SignalClassification = 'discard' | 'session-only' | 'durable-distilled' | 'durable-raw+distilled';
2
+ export interface SignalEventInput {
3
+ toolName: string;
4
+ toolInput?: Record<string, unknown>;
5
+ toolResult?: unknown;
6
+ sessionId?: string | null;
7
+ }
8
+ export interface SignalDecision {
9
+ classification: SignalClassification;
10
+ reasons: string[];
11
+ storeRaw: boolean;
12
+ importance: 'low' | 'medium' | 'high';
13
+ wakeUpPriority: 'low' | 'medium' | 'high';
14
+ placeHint: {
15
+ placeType: 'inbox' | 'ref' | 'wip' | 'sandbox' | 'board' | 'sparks' | 'archive' | null;
16
+ confidence: number;
17
+ };
18
+ graphHint: {
19
+ shouldEnrich: boolean;
20
+ entityTerms: string[];
21
+ reason?: string;
22
+ };
23
+ content: string;
24
+ contentHash: string;
25
+ estimatedSavings: number;
26
+ }
27
+ export interface DistillInput {
28
+ toolName: string;
29
+ command?: string;
30
+ content: string;
31
+ classification: SignalClassification;
32
+ }
33
+ export declare function hashSignalContent(content: string): string;
34
+ export declare function classifySignalEvent(input: SignalEventInput): SignalDecision;
35
+ export declare function distillSignalEvent(input: DistillInput): string;
36
+ export declare function shouldReturnRawFallback(input: {
37
+ query: string;
38
+ hasRawFallback: boolean;
39
+ nuanceSuppressed: boolean;
40
+ }): boolean;
41
+ //# sourceMappingURL=signal-engine.d.ts.map
@@ -0,0 +1,201 @@
1
+ import { createHash } from 'crypto';
2
+ function normalizeContent(toolResult) {
3
+ if (typeof toolResult === 'string')
4
+ return toolResult;
5
+ if (toolResult == null)
6
+ return '';
7
+ if (typeof toolResult === 'object') {
8
+ try {
9
+ return JSON.stringify(toolResult, null, 2);
10
+ }
11
+ catch {
12
+ return String(toolResult);
13
+ }
14
+ }
15
+ return String(toolResult);
16
+ }
17
+ function estimateNoiseSavings(raw, distilled) {
18
+ return Math.max(0, raw.length - distilled.length);
19
+ }
20
+ function extractEntityTerms(content) {
21
+ const matches = content.match(/\b([A-Z][A-Za-z0-9]+|[a-z]+(?:\.[a-z0-9_-]+)+|[A-Za-z0-9_-]+\.ts)\b/g) ?? [];
22
+ return [...new Set(matches.filter((term) => term.length > 2))].slice(0, 6);
23
+ }
24
+ function inferPlaceHint(toolName, normalized) {
25
+ if (['write', 'edit', 'multiedit'].includes(toolName.toLowerCase()) || /\b(fix|bug|implement|refactor|edited|wrote)\b/.test(normalized)) {
26
+ return { placeType: 'wip', confidence: 0.88 };
27
+ }
28
+ if (/\b(test|assertionerror|traceback|exception|experiment|verify)\b/.test(normalized)) {
29
+ return { placeType: 'sandbox', confidence: 0.92 };
30
+ }
31
+ if (/\b(hypothesis|plan|decided|roadmap|task|todo|investigate)\b/.test(normalized)) {
32
+ return { placeType: 'board', confidence: 0.74 };
33
+ }
34
+ if (/\b(research|docs|pattern|reference|api|architecture)\b/.test(normalized)) {
35
+ return { placeType: 'ref', confidence: 0.72 };
36
+ }
37
+ if (/\b(idea|explore|future|concept)\b/.test(normalized)) {
38
+ return { placeType: 'sparks', confidence: 0.68 };
39
+ }
40
+ return { placeType: null, confidence: 0 };
41
+ }
42
+ function inferGraphHint(normalized, content, classification) {
43
+ if (classification === 'discard' || classification === 'session-only') {
44
+ return { shouldEnrich: false, entityTerms: [], reason: 'non-durable signal' };
45
+ }
46
+ const entityTerms = extractEntityTerms(content);
47
+ const hasStructuredSignal = entityTerms.length > 0 || /\b(fix|decision|preference|error|graph|ranking|entity|relationship)\b/.test(normalized);
48
+ if (!hasStructuredSignal) {
49
+ return { shouldEnrich: false, entityTerms: [], reason: 'no graph-worthy entities' };
50
+ }
51
+ return {
52
+ shouldEnrich: true,
53
+ entityTerms,
54
+ reason: 'durable signal with identifiable entities',
55
+ };
56
+ }
57
+ export function hashSignalContent(content) {
58
+ return createHash('sha1').update(content).digest('hex');
59
+ }
60
+ export function classifySignalEvent(input) {
61
+ const toolName = input.toolName;
62
+ const command = String(input.toolInput?.command ?? input.toolInput?.cmd ?? '');
63
+ const content = normalizeContent(input.toolResult);
64
+ const normalized = `${command}\n${content}`.toLowerCase();
65
+ const reasons = [];
66
+ const noisyCommand = /\b(npm|bun|pnpm|yarn)\s+(install|add)\b/.test(normalized) ||
67
+ /\bdownload(ed|ing)?\b|\bfetch(ed|ing)?\b|\bprogress\b|\bresolved\b/.test(normalized);
68
+ if (noisyCommand) {
69
+ const placeHint = inferPlaceHint(toolName, normalized);
70
+ reasons.push('noise filtered from install/build output');
71
+ return {
72
+ classification: 'discard',
73
+ reasons,
74
+ storeRaw: false,
75
+ importance: 'low',
76
+ wakeUpPriority: 'low',
77
+ placeHint,
78
+ graphHint: inferGraphHint(normalized, content, 'discard'),
79
+ content,
80
+ contentHash: hashSignalContent(normalized),
81
+ estimatedSavings: content.length,
82
+ };
83
+ }
84
+ if (/\b(current hypothesis|hypothesis:|investigate|trying next)\b/.test(normalized)) {
85
+ const placeHint = inferPlaceHint(toolName, normalized);
86
+ reasons.push('active session hypothesis');
87
+ return {
88
+ classification: 'session-only',
89
+ reasons,
90
+ storeRaw: false,
91
+ importance: 'medium',
92
+ wakeUpPriority: 'high',
93
+ placeHint,
94
+ graphHint: inferGraphHint(normalized, content, 'session-only'),
95
+ content,
96
+ contentHash: hashSignalContent(normalized),
97
+ estimatedSavings: 0,
98
+ };
99
+ }
100
+ if (/\bcorrection:|actually\b|\binstead of\b|\bprefer(s)?\b/.test(normalized)) {
101
+ const placeHint = inferPlaceHint(toolName, normalized);
102
+ reasons.push('correction or preference worth durable retention');
103
+ return {
104
+ classification: 'durable-distilled',
105
+ reasons,
106
+ storeRaw: false,
107
+ importance: 'high',
108
+ wakeUpPriority: 'high',
109
+ placeHint,
110
+ graphHint: inferGraphHint(normalized, content, 'durable-distilled'),
111
+ content,
112
+ contentHash: hashSignalContent(normalized),
113
+ estimatedSavings: estimateNoiseSavings(content, distillSignalEvent({
114
+ toolName,
115
+ command,
116
+ content,
117
+ classification: 'durable-distilled',
118
+ })),
119
+ };
120
+ }
121
+ if (/\b(fail|failed|failing|assertionerror|stack trace|traceback|exception)\b/.test(normalized) ||
122
+ /\b(test|pytest|vitest|jest|bun test)\b/.test(normalized)) {
123
+ const placeHint = inferPlaceHint(toolName, normalized);
124
+ reasons.push('test or debugging signal with nuance-sensitive output');
125
+ return {
126
+ classification: 'durable-raw+distilled',
127
+ reasons,
128
+ storeRaw: true,
129
+ importance: 'high',
130
+ wakeUpPriority: 'high',
131
+ placeHint,
132
+ graphHint: inferGraphHint(normalized, content, 'durable-raw+distilled'),
133
+ content,
134
+ contentHash: hashSignalContent(normalized),
135
+ estimatedSavings: estimateNoiseSavings(content, distillSignalEvent({
136
+ toolName,
137
+ command,
138
+ content,
139
+ classification: 'durable-raw+distilled',
140
+ })),
141
+ };
142
+ }
143
+ if (['write', 'edit', 'multiedit'].includes(toolName.toLowerCase())) {
144
+ const placeHint = inferPlaceHint(toolName, normalized);
145
+ reasons.push('meaningful file modification');
146
+ return {
147
+ classification: 'durable-distilled',
148
+ reasons,
149
+ storeRaw: false,
150
+ importance: 'medium',
151
+ wakeUpPriority: 'medium',
152
+ placeHint,
153
+ graphHint: inferGraphHint(normalized, content, 'durable-distilled'),
154
+ content,
155
+ contentHash: hashSignalContent(normalized),
156
+ estimatedSavings: estimateNoiseSavings(content, distillSignalEvent({
157
+ toolName,
158
+ command,
159
+ content,
160
+ classification: 'durable-distilled',
161
+ })),
162
+ };
163
+ }
164
+ reasons.push('session-scoped operational context');
165
+ const placeHint = inferPlaceHint(toolName, normalized);
166
+ return {
167
+ classification: 'session-only',
168
+ reasons,
169
+ storeRaw: false,
170
+ importance: 'low',
171
+ wakeUpPriority: 'low',
172
+ placeHint,
173
+ graphHint: inferGraphHint(normalized, content, 'session-only'),
174
+ content,
175
+ contentHash: hashSignalContent(normalized),
176
+ estimatedSavings: 0,
177
+ };
178
+ }
179
+ export function distillSignalEvent(input) {
180
+ const lines = input.content
181
+ .split(/\r?\n/)
182
+ .map((line) => line.trim())
183
+ .filter(Boolean);
184
+ const important = lines.filter((line) => /\b(fail|error|exception|traceback|assert|stack|correction|prefer|decision|fix|edited|wrote)\b/i.test(line));
185
+ const selected = important.length > 0 ? important : lines.slice(0, 4);
186
+ const cleaned = selected.filter((line) => !/\b(pass(ing)?|resolved|download(ed|ing)?|progress|packages? added)\b/i.test(line));
187
+ if (/assertionerror|traceback|exception|stack/i.test(input.content) && !cleaned.some((line) => /assertionerror|traceback|exception|stack/i.test(line))) {
188
+ const extra = lines.find((line) => /assertionerror|traceback|exception|stack/i.test(line));
189
+ if (extra)
190
+ cleaned.push(extra);
191
+ }
192
+ return cleaned.slice(0, 6).join('\n');
193
+ }
194
+ export function shouldReturnRawFallback(input) {
195
+ if (!input.hasRawFallback)
196
+ return false;
197
+ if (input.nuanceSuppressed)
198
+ return true;
199
+ return /\b(raw|original|full|stack trace|traceback|stderr|stdout|rewind)\b/i.test(input.query);
200
+ }
201
+ //# sourceMappingURL=signal-engine.js.map
@@ -0,0 +1,31 @@
1
+ /** Obsidian Vault Integration
2
+ *
3
+ * Appends hot memories to Obsidian daily notes
4
+ * Format: YYYY-MM-DD.md with memory blocks
5
+ */
6
+ export interface ObsidianMemoryInput {
7
+ content: string;
8
+ id: string;
9
+ type: string;
10
+ tags: string[];
11
+ reasoning?: string;
12
+ memoryContext?: string;
13
+ examples?: string;
14
+ exceptions?: string;
15
+ source?: string;
16
+ }
17
+ /**
18
+ * Append a memory to the daily note in Obsidian vault
19
+ * Creates YYYY-MM-DD.md file if it doesn't exist
20
+ */
21
+ export declare function appendToObsidianVault(memory: ObsidianMemoryInput, vaultPath: string): Promise<void>;
22
+ /**
23
+ * Check if Obsidian vault is connected and accessible
24
+ */
25
+ export declare function isObsidianConnected(vaultPath: string): boolean;
26
+ /**
27
+ * Read existing memories from Obsidian vault (for import feature)
28
+ * Scans vault for .md files and extracts memory blocks
29
+ */
30
+ export declare function readFromVault(vaultPath: string): Promise<ObsidianMemoryInput[]>;
31
+ //# sourceMappingURL=obsidian-vault.d.ts.map
@@ -0,0 +1,156 @@
1
+ /** Obsidian Vault Integration
2
+ *
3
+ * Appends hot memories to Obsidian daily notes
4
+ * Format: YYYY-MM-DD.md with memory blocks
5
+ */
6
+ import { existsSync, mkdirSync, appendFileSync, readFileSync, readdirSync } from 'fs';
7
+ import { join } from 'path';
8
+ import { randomUUID } from 'crypto';
9
+ import { logger } from '../logger.js';
10
+ /**
11
+ * Append a memory to the daily note in Obsidian vault
12
+ * Creates YYYY-MM-DD.md file if it doesn't exist
13
+ */
14
+ export async function appendToObsidianVault(memory, vaultPath) {
15
+ const today = new Date();
16
+ const year = today.getFullYear();
17
+ const month = String(today.getMonth() + 1).padStart(2, '0');
18
+ const day = String(today.getDate()).padStart(2, '0');
19
+ const dateStr = `${year}-${month}-${day}`;
20
+ const dailyNotePath = join(vaultPath, `${dateStr}.md`);
21
+ // Ensure vault directory exists
22
+ if (!existsSync(vaultPath)) {
23
+ mkdirSync(vaultPath, { recursive: true });
24
+ logger.info(`[Obsidian] Created vault directory: ${vaultPath}`);
25
+ }
26
+ // Build memory block content
27
+ const memoryBlock = formatMemoryAsBlock(memory);
28
+ // Check if daily note exists, if not create with header
29
+ if (!existsSync(dailyNotePath)) {
30
+ const header = `# ${dateStr}\n\n## Squish Memories\n\n`;
31
+ appendFileSync(dailyNotePath, header, 'utf-8');
32
+ logger.info(`[Obsidian] Created daily note: ${dailyNotePath}`);
33
+ }
34
+ // Append memory block
35
+ appendFileSync(dailyNotePath, memoryBlock + '\n\n', 'utf-8');
36
+ logger.info(`[Obsidian] Appended memory to ${dateStr}.md`);
37
+ }
38
+ /**
39
+ * Format memory as Obsidian-compatible block
40
+ */
41
+ function formatMemoryAsBlock(memory) {
42
+ const lines = [];
43
+ // Memory content as checkbox (can be toggled in Obsidian)
44
+ lines.push(`- [ ] "${memory.content}"`);
45
+ // Add ID reference for linking
46
+ lines.push(` - **id:** \`${memory.id}\``);
47
+ // Type and tags
48
+ if (memory.type) {
49
+ lines.push(` - **type:** ${memory.type}`);
50
+ }
51
+ if (memory.tags && memory.tags.length > 0) {
52
+ const tagList = memory.tags.map(t => `#${t.replace(/\s+/g, '-')}`).join(' ');
53
+ lines.push(` - **tags:** ${tagList}`);
54
+ }
55
+ // Rich context fields
56
+ if (memory.source) {
57
+ lines.push(` - **source:** ${memory.source}`);
58
+ }
59
+ if (memory.reasoning) {
60
+ lines.push(` - **reasoning:** ${memory.reasoning}`);
61
+ }
62
+ if (memory.memoryContext) {
63
+ lines.push(` - **context:** ${memory.memoryContext}`);
64
+ }
65
+ if (memory.examples) {
66
+ lines.push(` - **examples:** ${memory.examples}`);
67
+ }
68
+ if (memory.exceptions) {
69
+ lines.push(` - **exceptions:** ${memory.exceptions}`);
70
+ }
71
+ return lines.join('\n');
72
+ }
73
+ /**
74
+ * Check if Obsidian vault is connected and accessible
75
+ */
76
+ export function isObsidianConnected(vaultPath) {
77
+ if (!vaultPath || vaultPath === '') {
78
+ return false;
79
+ }
80
+ // Check if path exists or can be created
81
+ const parentDir = vaultPath.includes('/')
82
+ ? vaultPath.split('/').slice(0, -1).join('/')
83
+ : vaultPath.split('\\').slice(0, -1).join('\\');
84
+ return existsSync(parentDir) || true; // Assume creatable if parent exists
85
+ }
86
+ /**
87
+ * Read existing memories from Obsidian vault (for import feature)
88
+ * Scans vault for .md files and extracts memory blocks
89
+ */
90
+ export async function readFromVault(vaultPath) {
91
+ if (!existsSync(vaultPath)) {
92
+ logger.warn(`[Obsidian] Vault path does not exist: ${vaultPath}`);
93
+ return [];
94
+ }
95
+ const memories = [];
96
+ // Recursively find all .md files
97
+ const mdFiles = await findMarkdownFiles(vaultPath);
98
+ for (const filePath of mdFiles) {
99
+ try {
100
+ const content = readFileSync(filePath, 'utf-8');
101
+ const filename = filePath.split(/[/\\]/).pop() || '';
102
+ // Extract frontmatter if present
103
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
104
+ let tags = [];
105
+ if (frontmatterMatch) {
106
+ const tagMatch = frontmatterMatch[1].match(/tags:\s*\[([^\]]*)\]/);
107
+ if (tagMatch) {
108
+ tags = tagMatch[1].split(',').map((t) => t.trim()).filter(Boolean);
109
+ }
110
+ }
111
+ // Extract content after frontmatter
112
+ const body = frontmatterMatch ? content.slice(frontmatterMatch[0].length).trim() : content;
113
+ // Skip empty files or very short ones
114
+ if (body.length < 10)
115
+ continue;
116
+ memories.push({
117
+ id: randomUUID(),
118
+ content: body,
119
+ tags,
120
+ type: 'observation'
121
+ });
122
+ }
123
+ catch (error) {
124
+ logger.warn(`[Obsidian] Failed to read file ${filePath}: ${error}`);
125
+ }
126
+ }
127
+ logger.info(`[Obsidian] Found ${memories.length} memories in vault`);
128
+ return memories;
129
+ }
130
+ /**
131
+ * Recursively find all markdown files in a directory
132
+ */
133
+ async function findMarkdownFiles(dir) {
134
+ const files = [];
135
+ try {
136
+ const entries = readdirSync(dir, { withFileTypes: true });
137
+ for (const entry of entries) {
138
+ const fullPath = join(dir, entry.name);
139
+ if (entry.isDirectory()) {
140
+ // Skip hidden directories
141
+ if (!entry.name.startsWith('.')) {
142
+ const subFiles = await findMarkdownFiles(fullPath);
143
+ files.push(...subFiles);
144
+ }
145
+ }
146
+ else if (entry.isFile() && entry.name.endsWith('.md')) {
147
+ files.push(fullPath);
148
+ }
149
+ }
150
+ }
151
+ catch (error) {
152
+ logger.warn(`[Obsidian] Failed to read directory ${dir}: ${error}`);
153
+ }
154
+ return files;
155
+ }
156
+ //# sourceMappingURL=obsidian-vault.js.map