squish-memory 1.1.5 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (646) hide show
  1. package/.env.example +32 -16
  2. package/CHANGELOG.md +147 -0
  3. package/README.md +120 -78
  4. package/{scripts → bin}/dependency-manager.mjs +217 -217
  5. package/{scripts → bin}/detect-clients.mjs +78 -78
  6. package/bin/install-interactive.mjs +321 -0
  7. package/bin/squish-mcp.mjs +44 -0
  8. package/bin/squish.mjs +33 -0
  9. package/config/mcp-migration-map.json +1 -6
  10. package/config/mcp-mode-semantics.json +19 -23
  11. package/config/mcp-remote-auth.json +3 -26
  12. package/config/mcp-universal.schema.json +5 -35
  13. package/config/settings.json +107 -52
  14. package/config.js +5 -0
  15. package/config.ts +218 -0
  16. package/core/adapters/config/claude-code.ts +133 -0
  17. package/core/adapters/config/cursor.ts +90 -0
  18. package/core/adapters/config/opencode.ts +89 -0
  19. package/core/adapters/config/windsurf.ts +90 -0
  20. package/core/adapters/index.ts +102 -0
  21. package/core/adapters/timeline.ts +116 -0
  22. package/core/adapters/types.ts +166 -0
  23. package/core/agent-preferences.ts +140 -0
  24. package/core/algorithms/analytics/token-estimator.ts +216 -0
  25. package/core/algorithms/detection/hash-filters.ts +260 -0
  26. package/core/algorithms/detection/semantic-ranker.ts +194 -0
  27. package/core/algorithms/detection/two-stage-detector.ts +421 -0
  28. package/core/algorithms/handlers/approve-merge.ts +215 -0
  29. package/core/algorithms/handlers/detect-duplicates.ts +192 -0
  30. package/core/algorithms/handlers/get-stats.ts +132 -0
  31. package/core/algorithms/handlers/list-proposals.ts +130 -0
  32. package/core/algorithms/handlers/preview-merge.ts +139 -0
  33. package/core/algorithms/handlers/reject-merge.ts +93 -0
  34. package/core/algorithms/handlers/reverse-merge.ts +155 -0
  35. package/{dist/core/algorithms/index.js → core/algorithms/index.ts} +39 -26
  36. package/core/algorithms/operations/cache-maintenance.ts +182 -0
  37. package/core/algorithms/safety/safety-checks.ts +256 -0
  38. package/core/algorithms/strategies/merge-strategies.ts +381 -0
  39. package/core/algorithms/types.ts +140 -0
  40. package/core/algorithms/utils/response-builder.ts +61 -0
  41. package/core/associations.ts +363 -0
  42. package/core/beliefs/decay.ts +289 -0
  43. package/core/beliefs/extractor.ts +131 -0
  44. package/core/beliefs/store.ts +557 -0
  45. package/core/beliefs/types.ts +38 -0
  46. package/core/commands/mcp-server.ts +5 -0
  47. package/core/compression.ts +177 -0
  48. package/core/config.js +2 -0
  49. package/core/consolidation.ts +330 -0
  50. package/core/context/agent-context.ts +388 -0
  51. package/core/context/context-paging.ts +449 -0
  52. package/core/context/context-window.ts +234 -0
  53. package/core/context/context.ts +35 -0
  54. package/core/embeddings/embeddings.ts +616 -0
  55. package/core/embeddings/google-multimodal.ts +200 -0
  56. package/{dist/core/local-embeddings.js → core/embeddings/local-embeddings.ts} +12 -11
  57. package/core/embeddings/qmd-client.ts +495 -0
  58. package/core/embeddings/transformers-local.ts +261 -0
  59. package/core/embeddings.js +4 -0
  60. package/core/error-handling.ts +206 -0
  61. package/core/external +219 -0
  62. package/core/graph/entity-deduplicator.ts +232 -0
  63. package/core/graph/graph-builder.ts +257 -0
  64. package/core/graph/graph-traversal.ts +490 -0
  65. package/core/graph/index.ts +24 -0
  66. package/core/graph/llm-entity-extractor.ts +402 -0
  67. package/core/graph/multi-hop-retrieval.ts +317 -0
  68. package/core/graph/relationship-extractor.ts +465 -0
  69. package/core/hooks/agent-hooks.ts +653 -0
  70. package/core/hooks/auto-tagger.ts +149 -0
  71. package/core/hooks/capture-filter.ts +169 -0
  72. package/core/hot-cache.ts +388 -0
  73. package/core/index.ts +10 -0
  74. package/core/ingestion/agent-memory.ts +167 -0
  75. package/core/ingestion/core-memory.ts +326 -0
  76. package/core/ingestion/learnings.ts +260 -0
  77. package/core/ingestion/signal-engine.ts +266 -0
  78. package/core/integrations/obsidian-vault.ts +197 -0
  79. package/core/layers/generator.ts +115 -0
  80. package/{dist/core/lib/db-client.d.ts → core/lib/db-client.ts} +168 -114
  81. package/core/lib/parse-embedding.ts +59 -0
  82. package/{dist/core/lib/schemas.js → core/lib/schemas.ts} +102 -87
  83. package/core/lib/types.ts +49 -0
  84. package/core/lib/utils.ts +151 -0
  85. package/core/lib/validation.ts +180 -0
  86. package/core/lifecycle.ts +353 -0
  87. package/core/logger.ts +59 -0
  88. package/core/memory/bridge-discovery.ts +395 -0
  89. package/core/memory/categorizer.ts +390 -0
  90. package/core/memory/conflict-detector.ts +62 -0
  91. package/core/memory/consolidation.ts +372 -0
  92. package/core/memory/context-collector.ts +75 -0
  93. package/core/memory/contradiction-resolver.ts +494 -0
  94. package/core/memory/edit-workflow.ts +174 -0
  95. package/core/memory/entity-extractor.ts +426 -0
  96. package/core/memory/entity-resolver.ts +89 -0
  97. package/core/memory/explain.ts +112 -0
  98. package/core/memory/fact-deriver.ts +300 -0
  99. package/core/memory/fact-extractor.ts +120 -0
  100. package/core/memory/feedback-tracker.ts +200 -0
  101. package/core/memory/hooks.ts +230 -0
  102. package/core/memory/hybrid-retrieval.ts +65 -0
  103. package/core/memory/hybrid-scorer.ts +325 -0
  104. package/core/memory/hybrid-search.ts +748 -0
  105. package/core/memory/importance.ts +319 -0
  106. package/{dist/core/memory/index.js → core/memory/index.ts} +11 -10
  107. package/core/memory/loader.ts +178 -0
  108. package/core/memory/markdown/markdown-storage.ts +318 -0
  109. package/core/memory/memories.ts +565 -0
  110. package/core/memory/memory-lifecycle.ts +51 -0
  111. package/core/memory/memory-manager.ts +53 -0
  112. package/core/memory/migrate.ts +173 -0
  113. package/core/memory/normalization.ts +30 -0
  114. package/core/memory/path-strengthener.ts +211 -0
  115. package/core/memory/progressive-disclosure.ts +392 -0
  116. package/core/memory/query-processor.ts +130 -0
  117. package/core/memory/query-rewriter.ts +153 -0
  118. package/core/memory/response-analyzer.ts +81 -0
  119. package/core/memory/retrieval-feedback.ts +276 -0
  120. package/core/memory/serialization.ts +83 -0
  121. package/core/memory/stale-cleaner.ts +147 -0
  122. package/core/memory/stats.ts +181 -0
  123. package/core/memory/telemetry.ts +392 -0
  124. package/core/memory/temporal-facts.ts +356 -0
  125. package/core/memory/temporal-parser.ts +477 -0
  126. package/core/memory/trigger-detector.ts +104 -0
  127. package/core/memory/write-gate.ts +288 -0
  128. package/{dist/core/places/index.js → core/places/index.ts} +12 -12
  129. package/core/places/memory-places.ts +339 -0
  130. package/core/places/places.ts +406 -0
  131. package/core/places/rules.ts +308 -0
  132. package/core/places/walking.ts +192 -0
  133. package/core/projects +89 -0
  134. package/core/projects.ts +131 -0
  135. package/core/redis.ts +82 -0
  136. package/core/responses.ts +187 -0
  137. package/core/runtime/trust-report.ts +195 -0
  138. package/core/runtime/trust-state.ts +360 -0
  139. package/core/scheduler/cron-scheduler.ts +590 -0
  140. package/core/scheduler/heartbeat.ts +91 -0
  141. package/{dist/core/scheduler/index.js → core/scheduler/index.ts} +8 -8
  142. package/core/scheduler/job-runner.ts +197 -0
  143. package/core/search/conversations.ts +166 -0
  144. package/core/search/entities.ts +46 -0
  145. package/core/search/folder-context.ts +154 -0
  146. package/core/search/graph-boost.ts +22 -0
  147. package/{dist/core/search/index.js → core/search/index.ts} +4 -5
  148. package/core/search/qmd-wrapper.ts +84 -0
  149. package/core/security/encrypt.ts +51 -0
  150. package/core/security/governance.ts +102 -0
  151. package/core/security/privacy.ts +108 -0
  152. package/core/security/secret-detector.ts +122 -0
  153. package/core/session/auto-load.ts +160 -0
  154. package/core/session/entity-tracker.ts +363 -0
  155. package/{dist/core/session/index.js → core/session/index.ts} +7 -7
  156. package/core/session/reference-resolver.ts +158 -0
  157. package/core/session/self-iteration-job.ts +478 -0
  158. package/core/session/session-hooks.ts +69 -0
  159. package/core/session/types.ts +36 -0
  160. package/core/session/working-set.ts +275 -0
  161. package/{dist/core/snapshots/cleanup.js → core/snapshots/cleanup.ts} +13 -12
  162. package/core/snapshots/comparison.ts +59 -0
  163. package/core/snapshots/creation.ts +139 -0
  164. package/core/snapshots/retrieval.ts +44 -0
  165. package/core/snapshots/stats.ts +63 -0
  166. package/core/storage/cache.ts +241 -0
  167. package/core/storage/database.ts +23 -0
  168. package/{dist/core/summarization/cleanup.js → core/summarization/cleanup.ts} +13 -12
  169. package/core/summarization/queries.ts +32 -0
  170. package/core/summarization/stats.ts +64 -0
  171. package/core/summarization/strategies.ts +52 -0
  172. package/core/summarization.ts +248 -0
  173. package/core/temporal-facts.ts +244 -0
  174. package/core/tracing/collector.ts +470 -0
  175. package/core/tracing/visualizer.ts +195 -0
  176. package/core/utils/cleanup-operations.ts +50 -0
  177. package/core/utils/content-extraction.ts +95 -0
  178. package/core/utils/filter-builder.ts +56 -0
  179. package/core/utils/history-traversal.ts +63 -0
  180. package/core/utils/memory-operations.ts +56 -0
  181. package/core/utils/query-operations.ts +83 -0
  182. package/core/utils/summarization-helpers.ts +45 -0
  183. package/core/utils/temporal-queries.ts +39 -0
  184. package/{dist/core/utils/vector-operations.js → core/utils/vector-operations.ts} +135 -129
  185. package/core/utils/version-management.ts +74 -0
  186. package/core/worker.ts +333 -0
  187. package/db/adapter.ts +215 -0
  188. package/{dist/db/bootstrap.js → db/bootstrap.ts} +388 -418
  189. package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
  190. package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
  191. package/db/drizzle/migrations/meta/_journal.json +13 -0
  192. package/db/drizzle/schema-sqlite.ts +1032 -0
  193. package/db/drizzle/schema.ts +1128 -0
  194. package/db/drizzle.config.ts +12 -0
  195. package/db/index.ts +83 -0
  196. package/db/init.sql +5 -0
  197. package/db/migrations/associations.ts +35 -0
  198. package/db/migrations/beliefs.ts +89 -0
  199. package/db/migrations/core-memory.ts +35 -0
  200. package/db/migrations/fts.ts +59 -0
  201. package/db/migrations/index.ts +54 -0
  202. package/db/migrations/indexes.ts +36 -0
  203. package/db/migrations/learnings.ts +34 -0
  204. package/db/migrations/maintenance.ts +68 -0
  205. package/db/migrations/memories.ts +22 -0
  206. package/db/migrations/memory-places.ts +35 -0
  207. package/db/migrations/places.ts +49 -0
  208. package/db/migrations/projects.ts +21 -0
  209. package/db/migrations/tier-conversion.ts +24 -0
  210. package/db/neon.ts +22 -0
  211. package/db/schema/beliefs.ts +50 -0
  212. package/db/schema/generator.ts +159 -0
  213. package/db/schema/index.ts +58 -0
  214. package/db/schema/learnings.ts +32 -0
  215. package/db/schema/memories.ts +83 -0
  216. package/db/schema/projects.ts +33 -0
  217. package/db/schema.ts +13 -0
  218. package/db/supabase.ts +27 -0
  219. package/mcp.json.example +8 -11
  220. package/package.json +140 -159
  221. package/packages/cli/package.json +22 -0
  222. package/packages/cli/src/commands/clean.ts +68 -0
  223. package/packages/cli/src/commands/context.ts +79 -0
  224. package/packages/cli/src/commands/doctor.ts +357 -0
  225. package/packages/cli/src/commands/forget.ts +72 -0
  226. package/packages/cli/src/commands/health.ts +36 -0
  227. package/packages/cli/src/commands/inspect.ts +41 -0
  228. package/packages/cli/src/commands/link.ts +50 -0
  229. package/packages/cli/src/commands/migrate.ts +93 -0
  230. package/packages/cli/src/commands/recall.ts +99 -0
  231. package/packages/cli/src/commands/recent.ts +57 -0
  232. package/packages/cli/src/commands/remember.ts +139 -0
  233. package/packages/cli/src/commands/run.ts +58 -0
  234. package/packages/cli/src/commands/stale.ts +43 -0
  235. package/packages/cli/src/commands/stats.ts +42 -0
  236. package/packages/cli/src/index.ts +57 -0
  237. package/packages/cli/tsconfig.json +24 -0
  238. package/packages/mcp/package.json +26 -0
  239. package/packages/mcp/src/index.ts +940 -0
  240. package/packages/mcp/tsconfig.json +20 -0
  241. package/skills/squish-memory/SKILL.md +38 -35
  242. package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
  243. package/skills/squish-memory/references/claude-desktop.json +12 -0
  244. package/skills/squish-memory/references/openclaw.json +13 -0
  245. package/skills/squish-memory/references/opencode.json +14 -0
  246. package/config/hooks/claude-code-hooks.json +0 -39
  247. package/config/hooks/cursor-hooks.json +0 -30
  248. package/config/hooks/opencode-hooks.json +0 -30
  249. package/config/hooks/windsurf-hooks.json +0 -30
  250. package/config/mcp-cli-fallback-policy.json +0 -22
  251. package/config/mcp.json +0 -38
  252. package/config/plugin-manifest.json +0 -101
  253. package/config/plugin-manifest.schema.json +0 -244
  254. package/config/plugin.json +0 -32
  255. package/config/remote-memory-policy.json +0 -32
  256. package/core/commands/context-paging.md +0 -51
  257. package/core/commands/context-status.md +0 -22
  258. package/core/commands/context.md +0 -5
  259. package/core/commands/core-memory.md +0 -56
  260. package/core/commands/health.md +0 -5
  261. package/core/commands/init.md +0 -39
  262. package/core/commands/merge.md +0 -113
  263. package/core/commands/recall.md +0 -5
  264. package/core/commands/remember.md +0 -11
  265. package/core/commands/search.md +0 -10
  266. package/dist/config.d.ts +0 -83
  267. package/dist/config.js +0 -242
  268. package/dist/core/adapters/config/claude-code.d.ts +0 -45
  269. package/dist/core/adapters/config/claude-code.js +0 -113
  270. package/dist/core/adapters/config/cursor.d.ts +0 -26
  271. package/dist/core/adapters/config/cursor.js +0 -74
  272. package/dist/core/adapters/config/opencode.d.ts +0 -23
  273. package/dist/core/adapters/config/opencode.js +0 -73
  274. package/dist/core/adapters/config/windsurf.d.ts +0 -26
  275. package/dist/core/adapters/config/windsurf.js +0 -74
  276. package/dist/core/adapters/index.d.ts +0 -45
  277. package/dist/core/adapters/index.js +0 -84
  278. package/dist/core/adapters/scripts/install-adapter.d.ts +0 -19
  279. package/dist/core/adapters/scripts/install-adapter.js +0 -149
  280. package/dist/core/adapters/timeline.d.ts +0 -23
  281. package/dist/core/adapters/timeline.js +0 -88
  282. package/dist/core/adapters/types.d.ts +0 -157
  283. package/dist/core/adapters/types.js +0 -50
  284. package/dist/core/algorithms/analytics/token-estimator.d.ts +0 -50
  285. package/dist/core/algorithms/analytics/token-estimator.js +0 -154
  286. package/dist/core/algorithms/detection/hash-filters.d.ts +0 -47
  287. package/dist/core/algorithms/detection/hash-filters.js +0 -190
  288. package/dist/core/algorithms/detection/semantic-ranker.d.ts +0 -32
  289. package/dist/core/algorithms/detection/semantic-ranker.js +0 -118
  290. package/dist/core/algorithms/detection/two-stage-detector.d.ts +0 -52
  291. package/dist/core/algorithms/detection/two-stage-detector.js +0 -299
  292. package/dist/core/algorithms/handlers/approve-merge.d.ts +0 -22
  293. package/dist/core/algorithms/handlers/approve-merge.js +0 -179
  294. package/dist/core/algorithms/handlers/detect-duplicates.d.ts +0 -47
  295. package/dist/core/algorithms/handlers/detect-duplicates.js +0 -145
  296. package/dist/core/algorithms/handlers/get-stats.d.ts +0 -39
  297. package/dist/core/algorithms/handlers/get-stats.js +0 -88
  298. package/dist/core/algorithms/handlers/list-proposals.d.ts +0 -45
  299. package/dist/core/algorithms/handlers/list-proposals.js +0 -83
  300. package/dist/core/algorithms/handlers/preview-merge.d.ts +0 -39
  301. package/dist/core/algorithms/handlers/preview-merge.js +0 -93
  302. package/dist/core/algorithms/handlers/reject-merge.d.ts +0 -28
  303. package/dist/core/algorithms/handlers/reject-merge.js +0 -69
  304. package/dist/core/algorithms/handlers/reverse-merge.d.ts +0 -21
  305. package/dist/core/algorithms/handlers/reverse-merge.js +0 -121
  306. package/dist/core/algorithms/index.d.ts +0 -21
  307. package/dist/core/algorithms/operations/cache-maintenance.d.ts +0 -12
  308. package/dist/core/algorithms/operations/cache-maintenance.js +0 -157
  309. package/dist/core/algorithms/safety/safety-checks.d.ts +0 -22
  310. package/dist/core/algorithms/safety/safety-checks.js +0 -179
  311. package/dist/core/algorithms/strategies/merge-strategies.d.ts +0 -50
  312. package/dist/core/algorithms/strategies/merge-strategies.js +0 -288
  313. package/dist/core/algorithms/types.d.ts +0 -133
  314. package/dist/core/algorithms/types.js +0 -5
  315. package/dist/core/algorithms/utils/response-builder.d.ts +0 -28
  316. package/dist/core/algorithms/utils/response-builder.js +0 -37
  317. package/dist/core/associations.d.ts +0 -31
  318. package/dist/core/associations.js +0 -248
  319. package/dist/core/autosave.d.ts +0 -19
  320. package/dist/core/autosave.js +0 -16
  321. package/dist/core/commands/managed-sync.d.ts +0 -10
  322. package/dist/core/commands/managed-sync.js +0 -64
  323. package/dist/core/commands/mcp-server.d.ts +0 -3
  324. package/dist/core/commands/mcp-server.js +0 -739
  325. package/dist/core/consolidation.d.ts +0 -37
  326. package/dist/core/consolidation.js +0 -248
  327. package/dist/core/context/agent-context.d.ts +0 -106
  328. package/dist/core/context/agent-context.js +0 -274
  329. package/dist/core/context/context-paging.d.ts +0 -80
  330. package/dist/core/context/context-paging.js +0 -328
  331. package/dist/core/context/context-window.d.ts +0 -40
  332. package/dist/core/context/context-window.js +0 -177
  333. package/dist/core/context/context.d.ts +0 -7
  334. package/dist/core/context/context.js +0 -22
  335. package/dist/core/embeddings/google-multimodal.d.ts +0 -14
  336. package/dist/core/embeddings/google-multimodal.js +0 -142
  337. package/dist/core/embeddings/qmd-client.d.ts +0 -136
  338. package/dist/core/embeddings/qmd-client.js +0 -403
  339. package/dist/core/embeddings.d.ts +0 -29
  340. package/dist/core/embeddings.js +0 -454
  341. package/dist/core/error-handling.d.ts +0 -63
  342. package/dist/core/error-handling.js +0 -173
  343. package/dist/core/external-folder/index.d.ts +0 -102
  344. package/dist/core/external-folder/index.js +0 -294
  345. package/dist/core/hooks/agent-hooks.d.ts +0 -74
  346. package/dist/core/hooks/agent-hooks.js +0 -244
  347. package/dist/core/hooks/auto-tagger.d.ts +0 -19
  348. package/dist/core/hooks/auto-tagger.js +0 -155
  349. package/dist/core/hooks/capture-filter.d.ts +0 -41
  350. package/dist/core/hooks/capture-filter.js +0 -128
  351. package/dist/core/index.d.ts +0 -10
  352. package/dist/core/index.js +0 -14
  353. package/dist/core/ingestion/agent-memory.d.ts +0 -22
  354. package/dist/core/ingestion/agent-memory.js +0 -109
  355. package/dist/core/ingestion/core-memory.d.ts +0 -78
  356. package/dist/core/ingestion/core-memory.js +0 -226
  357. package/dist/core/ingestion/learnings.d.ts +0 -57
  358. package/dist/core/ingestion/learnings.js +0 -202
  359. package/dist/core/layers/generator.d.ts +0 -25
  360. package/dist/core/layers/generator.js +0 -76
  361. package/dist/core/lib/db-client.js +0 -130
  362. package/dist/core/lib/schemas.d.ts +0 -129
  363. package/dist/core/lib/utils.d.ts +0 -14
  364. package/dist/core/lib/utils.js +0 -90
  365. package/dist/core/lib/validation.d.ts +0 -38
  366. package/dist/core/lib/validation.js +0 -151
  367. package/dist/core/lifecycle.d.ts +0 -26
  368. package/dist/core/lifecycle.js +0 -302
  369. package/dist/core/local-embeddings.d.ts +0 -11
  370. package/dist/core/logger.d.ts +0 -16
  371. package/dist/core/logger.js +0 -40
  372. package/dist/core/mcp/client.d.ts +0 -17
  373. package/dist/core/mcp/client.js +0 -101
  374. package/dist/core/mcp/index.d.ts +0 -6
  375. package/dist/core/mcp/index.js +0 -6
  376. package/dist/core/mcp/server.d.ts +0 -18
  377. package/dist/core/mcp/server.js +0 -157
  378. package/dist/core/mcp/standalone-server.d.ts +0 -13
  379. package/dist/core/mcp/standalone-server.js +0 -46
  380. package/dist/core/mcp/tools.d.ts +0 -9
  381. package/dist/core/mcp/tools.js +0 -365
  382. package/dist/core/mcp/types.d.ts +0 -315
  383. package/dist/core/mcp/types.js +0 -48
  384. package/dist/core/memory/bridge-discovery.d.ts +0 -50
  385. package/dist/core/memory/bridge-discovery.js +0 -291
  386. package/dist/core/memory/categorizer.d.ts +0 -27
  387. package/dist/core/memory/categorizer.js +0 -305
  388. package/dist/core/memory/conflict-detector.d.ts +0 -7
  389. package/dist/core/memory/conflict-detector.js +0 -43
  390. package/dist/core/memory/consolidation.d.ts +0 -42
  391. package/dist/core/memory/consolidation.js +0 -303
  392. package/dist/core/memory/context-collector.d.ts +0 -10
  393. package/dist/core/memory/context-collector.js +0 -56
  394. package/dist/core/memory/contradiction-resolver.d.ts +0 -40
  395. package/dist/core/memory/contradiction-resolver.js +0 -368
  396. package/dist/core/memory/edit-workflow.d.ts +0 -19
  397. package/dist/core/memory/edit-workflow.js +0 -120
  398. package/dist/core/memory/entity-extractor.d.ts +0 -33
  399. package/dist/core/memory/entity-extractor.js +0 -336
  400. package/dist/core/memory/entity-resolver.d.ts +0 -23
  401. package/dist/core/memory/entity-resolver.js +0 -64
  402. package/dist/core/memory/fact-extractor.d.ts +0 -24
  403. package/dist/core/memory/fact-extractor.js +0 -89
  404. package/dist/core/memory/feedback-tracker.d.ts +0 -12
  405. package/dist/core/memory/feedback-tracker.js +0 -155
  406. package/dist/core/memory/hooks.d.ts +0 -88
  407. package/dist/core/memory/hooks.js +0 -174
  408. package/dist/core/memory/hybrid-retrieval.d.ts +0 -29
  409. package/dist/core/memory/hybrid-retrieval.js +0 -139
  410. package/dist/core/memory/hybrid-scorer.d.ts +0 -40
  411. package/dist/core/memory/hybrid-scorer.js +0 -284
  412. package/dist/core/memory/hybrid-search.d.ts +0 -20
  413. package/dist/core/memory/hybrid-search.js +0 -359
  414. package/dist/core/memory/importance.d.ts +0 -63
  415. package/dist/core/memory/importance.js +0 -298
  416. package/dist/core/memory/index.d.ts +0 -8
  417. package/dist/core/memory/loader.d.ts +0 -31
  418. package/dist/core/memory/loader.js +0 -141
  419. package/dist/core/memory/markdown/markdown-storage.d.ts +0 -72
  420. package/dist/core/memory/markdown/markdown-storage.js +0 -243
  421. package/dist/core/memory/memories.d.ts +0 -47
  422. package/dist/core/memory/memories.js +0 -449
  423. package/dist/core/memory/memory-lifecycle.d.ts +0 -8
  424. package/dist/core/memory/memory-lifecycle.js +0 -55
  425. package/dist/core/memory/memory-manager.d.ts +0 -15
  426. package/dist/core/memory/memory-manager.js +0 -46
  427. package/dist/core/memory/migrate.d.ts +0 -21
  428. package/dist/core/memory/migrate.js +0 -134
  429. package/dist/core/memory/normalization.d.ts +0 -22
  430. package/dist/core/memory/normalization.js +0 -26
  431. package/dist/core/memory/progressive-disclosure.d.ts +0 -43
  432. package/dist/core/memory/progressive-disclosure.js +0 -280
  433. package/dist/core/memory/query-processor.d.ts +0 -21
  434. package/dist/core/memory/query-processor.js +0 -72
  435. package/dist/core/memory/query-rewriter.d.ts +0 -13
  436. package/dist/core/memory/query-rewriter.js +0 -118
  437. package/dist/core/memory/response-analyzer.d.ts +0 -9
  438. package/dist/core/memory/response-analyzer.js +0 -61
  439. package/dist/core/memory/serialization.d.ts +0 -10
  440. package/dist/core/memory/serialization.js +0 -84
  441. package/dist/core/memory/stats.d.ts +0 -22
  442. package/dist/core/memory/stats.js +0 -138
  443. package/dist/core/memory/telemetry.d.ts +0 -69
  444. package/dist/core/memory/telemetry.js +0 -313
  445. package/dist/core/memory/temporal-facts.d.ts +0 -41
  446. package/dist/core/memory/temporal-facts.js +0 -283
  447. package/dist/core/memory/temporal-parser.d.ts +0 -32
  448. package/dist/core/memory/temporal-parser.js +0 -385
  449. package/dist/core/memory/trigger-detector.d.ts +0 -14
  450. package/dist/core/memory/trigger-detector.js +0 -42
  451. package/dist/core/memory/write-gate.d.ts +0 -54
  452. package/dist/core/memory/write-gate.js +0 -210
  453. package/dist/core/namespaces/index.d.ts +0 -71
  454. package/dist/core/namespaces/index.js +0 -305
  455. package/dist/core/namespaces/uri-parser.d.ts +0 -31
  456. package/dist/core/namespaces/uri-parser.js +0 -74
  457. package/dist/core/obsidian-vault.d.ts +0 -30
  458. package/dist/core/obsidian-vault.js +0 -94
  459. package/dist/core/places/index.d.ts +0 -14
  460. package/dist/core/places/memory-places.d.ts +0 -68
  461. package/dist/core/places/memory-places.js +0 -261
  462. package/dist/core/places/places.d.ts +0 -88
  463. package/dist/core/places/places.js +0 -314
  464. package/dist/core/places/rules.d.ts +0 -74
  465. package/dist/core/places/rules.js +0 -240
  466. package/dist/core/places/walking.d.ts +0 -56
  467. package/dist/core/places/walking.js +0 -121
  468. package/dist/core/projects.d.ts +0 -17
  469. package/dist/core/projects.js +0 -108
  470. package/dist/core/redis.d.ts +0 -11
  471. package/dist/core/redis.js +0 -69
  472. package/dist/core/responses.d.ts +0 -96
  473. package/dist/core/responses.js +0 -122
  474. package/dist/core/scheduler/cron-scheduler.d.ts +0 -32
  475. package/dist/core/scheduler/cron-scheduler.js +0 -332
  476. package/dist/core/scheduler/heartbeat.d.ts +0 -11
  477. package/dist/core/scheduler/heartbeat.js +0 -73
  478. package/dist/core/scheduler/index.d.ts +0 -8
  479. package/dist/core/scheduler/job-runner.d.ts +0 -11
  480. package/dist/core/scheduler/job-runner.js +0 -164
  481. package/dist/core/search/conversations.d.ts +0 -25
  482. package/dist/core/search/conversations.js +0 -110
  483. package/dist/core/search/entities.d.ts +0 -12
  484. package/dist/core/search/entities.js +0 -31
  485. package/dist/core/search/folder-context.d.ts +0 -25
  486. package/dist/core/search/folder-context.js +0 -119
  487. package/dist/core/search/graph-boost.d.ts +0 -7
  488. package/dist/core/search/graph-boost.js +0 -23
  489. package/dist/core/search/index.d.ts +0 -4
  490. package/dist/core/search/qmd-search.d.ts +0 -61
  491. package/dist/core/search/qmd-search.js +0 -178
  492. package/dist/core/security/encrypt.d.ts +0 -6
  493. package/dist/core/security/encrypt.js +0 -47
  494. package/dist/core/security/governance.d.ts +0 -26
  495. package/dist/core/security/governance.js +0 -79
  496. package/dist/core/security/privacy.d.ts +0 -23
  497. package/dist/core/security/privacy.js +0 -82
  498. package/dist/core/security/secret-detector.d.ts +0 -32
  499. package/dist/core/security/secret-detector.js +0 -88
  500. package/dist/core/session/auto-load.d.ts +0 -6
  501. package/dist/core/session/auto-load.js +0 -119
  502. package/dist/core/session/index.d.ts +0 -7
  503. package/dist/core/session/self-iteration-job.d.ts +0 -20
  504. package/dist/core/session/self-iteration-job.js +0 -282
  505. package/dist/core/session/session-hooks.d.ts +0 -18
  506. package/dist/core/session/session-hooks.js +0 -58
  507. package/dist/core/session/types.d.ts +0 -26
  508. package/dist/core/session/types.js +0 -10
  509. package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
  510. package/dist/core/session-hooks/self-iteration-job.js +0 -282
  511. package/dist/core/session-hooks/session-hooks.d.ts +0 -18
  512. package/dist/core/session-hooks/session-hooks.js +0 -58
  513. package/dist/core/snapshots/cleanup.d.ts +0 -9
  514. package/dist/core/snapshots/comparison.d.ts +0 -19
  515. package/dist/core/snapshots/comparison.js +0 -43
  516. package/dist/core/snapshots/creation.d.ts +0 -19
  517. package/dist/core/snapshots/creation.js +0 -126
  518. package/dist/core/snapshots/retrieval.d.ts +0 -7
  519. package/dist/core/snapshots/retrieval.js +0 -41
  520. package/dist/core/snapshots/stats.d.ts +0 -11
  521. package/dist/core/snapshots/stats.js +0 -52
  522. package/dist/core/snapshots.d.ts +0 -29
  523. package/dist/core/snapshots.js +0 -220
  524. package/dist/core/storage/cache.d.ts +0 -13
  525. package/dist/core/storage/cache.js +0 -202
  526. package/dist/core/storage/database.d.ts +0 -12
  527. package/dist/core/storage/database.js +0 -12
  528. package/dist/core/summarization/cleanup.d.ts +0 -9
  529. package/dist/core/summarization/queries.d.ts +0 -9
  530. package/dist/core/summarization/queries.js +0 -28
  531. package/dist/core/summarization/stats.d.ts +0 -14
  532. package/dist/core/summarization/stats.js +0 -52
  533. package/dist/core/summarization/strategies.d.ts +0 -24
  534. package/dist/core/summarization/strategies.js +0 -28
  535. package/dist/core/summarization.d.ts +0 -37
  536. package/dist/core/summarization.js +0 -188
  537. package/dist/core/sync/qmd-sync.d.ts +0 -94
  538. package/dist/core/sync/qmd-sync.js +0 -201
  539. package/dist/core/temporal-facts.d.ts +0 -54
  540. package/dist/core/temporal-facts.js +0 -193
  541. package/dist/core/toon.d.ts +0 -43
  542. package/dist/core/toon.js +0 -160
  543. package/dist/core/tracing/collector.d.ts +0 -111
  544. package/dist/core/tracing/collector.js +0 -350
  545. package/dist/core/tracing/visualizer.d.ts +0 -32
  546. package/dist/core/tracing/visualizer.js +0 -165
  547. package/dist/core/utils/cleanup-operations.d.ts +0 -13
  548. package/dist/core/utils/cleanup-operations.js +0 -44
  549. package/dist/core/utils/content-extraction.d.ts +0 -19
  550. package/dist/core/utils/content-extraction.js +0 -75
  551. package/dist/core/utils/filter-builder.d.ts +0 -13
  552. package/dist/core/utils/filter-builder.js +0 -44
  553. package/dist/core/utils/history-traversal.d.ts +0 -13
  554. package/dist/core/utils/history-traversal.js +0 -50
  555. package/dist/core/utils/memory-operations.d.ts +0 -17
  556. package/dist/core/utils/memory-operations.js +0 -43
  557. package/dist/core/utils/query-operations.d.ts +0 -18
  558. package/dist/core/utils/query-operations.js +0 -65
  559. package/dist/core/utils/summarization-helpers.d.ts +0 -21
  560. package/dist/core/utils/summarization-helpers.js +0 -38
  561. package/dist/core/utils/temporal-queries.d.ts +0 -13
  562. package/dist/core/utils/temporal-queries.js +0 -27
  563. package/dist/core/utils/vector-operations.d.ts +0 -71
  564. package/dist/core/utils/version-management.d.ts +0 -9
  565. package/dist/core/utils/version-management.js +0 -61
  566. package/dist/core/worker.d.ts +0 -82
  567. package/dist/core/worker.js +0 -272
  568. package/dist/db/adapter.d.ts +0 -7
  569. package/dist/db/adapter.js +0 -175
  570. package/dist/db/bootstrap.d.ts +0 -9
  571. package/dist/db/drizzle/schema-sqlite.d.ts +0 -4837
  572. package/dist/db/drizzle/schema-sqlite.js +0 -684
  573. package/dist/db/drizzle/schema.d.ts +0 -4082
  574. package/dist/db/drizzle/schema.js +0 -770
  575. package/dist/db/drizzle.config.d.ts +0 -3
  576. package/dist/db/drizzle.config.js +0 -12
  577. package/dist/db/index.d.ts +0 -7
  578. package/dist/db/index.js +0 -89
  579. package/dist/db/neon.d.ts +0 -8
  580. package/dist/db/neon.js +0 -20
  581. package/dist/db/schema/index.d.ts +0 -40
  582. package/dist/db/schema/index.js +0 -105
  583. package/dist/db/schema/tables/context-sessions.d.ts +0 -9
  584. package/dist/db/schema/tables/context-sessions.js +0 -37
  585. package/dist/db/schema/tables/conversations.d.ts +0 -9
  586. package/dist/db/schema/tables/conversations.js +0 -47
  587. package/dist/db/schema/tables/core-memory.d.ts +0 -9
  588. package/dist/db/schema/tables/core-memory.js +0 -41
  589. package/dist/db/schema/tables/entities.d.ts +0 -9
  590. package/dist/db/schema/tables/entities.js +0 -39
  591. package/dist/db/schema/tables/entity-relations.d.ts +0 -9
  592. package/dist/db/schema/tables/entity-relations.js +0 -31
  593. package/dist/db/schema/tables/learnings.d.ts +0 -9
  594. package/dist/db/schema/tables/learnings.js +0 -66
  595. package/dist/db/schema/tables/memories.d.ts +0 -9
  596. package/dist/db/schema/tables/memories.js +0 -161
  597. package/dist/db/schema/tables/memory-associations.d.ts +0 -9
  598. package/dist/db/schema/tables/memory-associations.js +0 -39
  599. package/dist/db/schema/tables/memory-hash-cache.d.ts +0 -9
  600. package/dist/db/schema/tables/memory-hash-cache.js +0 -29
  601. package/dist/db/schema/tables/memory-merge-history.d.ts +0 -9
  602. package/dist/db/schema/tables/memory-merge-history.js +0 -33
  603. package/dist/db/schema/tables/memory-merge-proposals.d.ts +0 -9
  604. package/dist/db/schema/tables/memory-merge-proposals.js +0 -39
  605. package/dist/db/schema/tables/messages.d.ts +0 -9
  606. package/dist/db/schema/tables/messages.js +0 -41
  607. package/dist/db/schema/tables/namespaces.d.ts +0 -9
  608. package/dist/db/schema/tables/namespaces.js +0 -37
  609. package/dist/db/schema/tables/projects.d.ts +0 -9
  610. package/dist/db/schema/tables/projects.js +0 -31
  611. package/dist/db/schema/tables/users.d.ts +0 -9
  612. package/dist/db/schema/tables/users.js +0 -27
  613. package/dist/db/schema.d.ts +0 -3
  614. package/dist/db/schema.js +0 -11
  615. package/dist/db/supabase.d.ts +0 -9
  616. package/dist/db/supabase.js +0 -24
  617. package/dist/index.d.ts +0 -7
  618. package/dist/index.js +0 -1677
  619. package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
  620. package/dist/webui/server.d.ts +0 -5
  621. package/dist/webui/server.js +0 -642
  622. package/generated/mcp/manifest.json +0 -23
  623. package/generated/mcp/mcp-servers.json +0 -25
  624. package/generated/mcp/mcporter.json +0 -34
  625. package/generated/mcp/openclaw-memory-qmd.json +0 -17
  626. package/generated/mcp/runtime.json +0 -12
  627. package/scripts/README.md +0 -60
  628. package/scripts/build-release.sh +0 -36
  629. package/scripts/check-secrets.js +0 -132
  630. package/scripts/copy-runtime-assets.mjs +0 -26
  631. package/scripts/generate-mcp.mjs +0 -264
  632. package/scripts/github-release.sh +0 -77
  633. package/scripts/init-dirs.mjs +0 -13
  634. package/scripts/install-claude-code.sh +0 -85
  635. package/scripts/install-cursor.sh +0 -56
  636. package/scripts/install-hooks.sh +0 -73
  637. package/scripts/install-interactive.mjs +0 -357
  638. package/scripts/install-opencode.sh +0 -75
  639. package/scripts/install-plugin.mjs +0 -415
  640. package/scripts/install-windsurf.sh +0 -67
  641. package/scripts/remote-preflight.mjs +0 -62
  642. package/scripts/squish-fallback.mjs +0 -132
  643. package/scripts/test-interactive.mjs +0 -131
  644. package/scripts/verify-mcp.mjs +0 -214
  645. package/skills/squish-memory/scripts/install.mjs +0 -335
  646. package/skills/squish-memory/write_skill.js +0 -2
@@ -0,0 +1,131 @@
1
+ import type { MemoryType } from '../memory/memories.js';
2
+ import type { ExtractedBelief } from './types.js';
3
+
4
+ function cleanStatement(input: string): string {
5
+ return input
6
+ .replace(/^(decision:|constraint:|state change:|reject(?:ed)?:|failure:|preference:)\s*/i, '')
7
+ .replace(/\s+/g, ' ')
8
+ .trim();
9
+ }
10
+
11
+ function splitReason(text: string): { statement: string; reason?: string } {
12
+ const match = text.match(/^(.*?)(?:\s+because\s+|\s+due to\s+)(.+)$/i);
13
+ if (!match) return { statement: cleanStatement(text) };
14
+ return {
15
+ statement: cleanStatement(match[1]),
16
+ reason: cleanStatement(match[2]),
17
+ };
18
+ }
19
+
20
+ function deriveConfidence(type: ExtractedBelief['type'], hasReason: boolean): number {
21
+ const base =
22
+ type === 'decision' ? 0.84 :
23
+ type === 'preference' ? 0.8 :
24
+ type === 'failure_cause' ? 0.82 :
25
+ type === 'constraint' ? 0.78 :
26
+ type === 'state_change' ? 0.76 :
27
+ 0.74;
28
+ return hasReason ? Math.min(0.95, base + 0.05) : base;
29
+ }
30
+
31
+ export function extractBeliefsFromMemory(input: {
32
+ memoryId: string;
33
+ content: string;
34
+ type: MemoryType | string;
35
+ metadata?: Record<string, unknown> | null;
36
+ }): ExtractedBelief[] {
37
+ const text = input.content.trim();
38
+ const lowered = text.toLowerCase();
39
+ const beliefs: ExtractedBelief[] = [];
40
+
41
+ const addBelief = (belief: Omit<ExtractedBelief, 'sourceMemoryIds' | 'confidence'> & { confidence?: number }) => {
42
+ const cleanedStatement = cleanStatement(belief.statement);
43
+ if (!cleanedStatement || cleanedStatement.length < 8) return;
44
+ beliefs.push({
45
+ ...belief,
46
+ statement: cleanedStatement,
47
+ confidence: belief.confidence ?? deriveConfidence(belief.type, Boolean(belief.reason)),
48
+ sourceMemoryIds: [input.memoryId],
49
+ });
50
+ };
51
+
52
+ if (input.type === 'decision' || /\b(decision:|decided to|we chose|going with|final decision)\b/i.test(text)) {
53
+ const { statement, reason } = splitReason(text);
54
+ addBelief({
55
+ type: 'decision',
56
+ statement,
57
+ reason,
58
+ status: 'active',
59
+ evidenceSummary: text,
60
+ });
61
+ }
62
+
63
+ if (input.type === 'preference' || /\b(prefers?|likes?|dislikes?|hates?)\b/i.test(text)) {
64
+ const { statement, reason } = splitReason(text);
65
+ addBelief({
66
+ type: 'preference',
67
+ statement,
68
+ reason,
69
+ status: 'active',
70
+ evidenceSummary: text,
71
+ });
72
+ }
73
+
74
+ const failureMatch = text.match(/\b(?:failed|failure|broke|error)\b.*?(?:because|due to)\s+(.+)/i);
75
+ if (failureMatch) {
76
+ addBelief({
77
+ type: 'failure_cause',
78
+ statement: cleanStatement(text.split(/(?:because|due to)/i)[0] ?? text),
79
+ reason: cleanStatement(failureMatch[1]),
80
+ status: 'active',
81
+ evidenceSummary: text,
82
+ edges: [{ type: 'causes', targetStatement: cleanStatement(failureMatch[1]) }],
83
+ });
84
+ }
85
+
86
+ if (/\b(constraint:|must not|cannot|can't|blocked by|required to|needs to)\b/i.test(text)) {
87
+ addBelief({
88
+ type: 'constraint',
89
+ statement: text,
90
+ status: 'active',
91
+ evidenceSummary: text,
92
+ });
93
+ }
94
+
95
+ const stateMatch = text.match(/\b(?:state changed from|changed from)\s+(.+?)\s+to\s+(.+?)(?:\s+after\s+(.+))?$/i);
96
+ if (stateMatch) {
97
+ addBelief({
98
+ type: 'state_change',
99
+ statement: `${cleanStatement(stateMatch[1])} -> ${cleanStatement(stateMatch[2])}`,
100
+ reason: stateMatch[3] ? cleanStatement(stateMatch[3]) : undefined,
101
+ status: 'active',
102
+ evidenceSummary: text,
103
+ });
104
+ }
105
+
106
+ const disputePatterns = [
107
+ /\b(reject|rejected|do not use|don't use|instead of)\b/i,
108
+ /\bbandaid\b/i,
109
+ ];
110
+ if (disputePatterns.some((pattern) => pattern.test(text))) {
111
+ const sentence = text.split(/[.!?]/).find((part) => /reject|bandaid|instead of|do not use|don't use/i.test(part)) ?? text;
112
+ addBelief({
113
+ type: 'dispute',
114
+ statement: sentence,
115
+ status: 'disputed',
116
+ evidenceSummary: text,
117
+ });
118
+ }
119
+
120
+ const deduped = new Map<string, ExtractedBelief>();
121
+ for (const belief of beliefs) {
122
+ const key = `${belief.type}:${belief.statement.toLowerCase()}`;
123
+ if (!deduped.has(key)) deduped.set(key, belief);
124
+ }
125
+
126
+ if (deduped.size === 0 && !/\b(because|due to|prefer|decision|constraint|changed from|reject)\b/.test(lowered)) {
127
+ return [];
128
+ }
129
+
130
+ return [...deduped.values()];
131
+ }
@@ -0,0 +1,557 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { getDbClient } from '../lib/db-client.js';
3
+ import { deserializeMetadata, serializeMetadata } from '../memory/serialization.js';
4
+ import type { ExtractedBelief, StoredBelief } from './types.js';
5
+ import { runBeliefMigrations } from '../../db/migrations/beliefs.js';
6
+
7
+ /**
8
+ * Ensure belief tables exist by running migrations if needed.
9
+ * Delegates table creation to the migrations system.
10
+ */
11
+ async function ensureBeliefTables(): Promise<void> {
12
+ const { raw } = await getDbClient();
13
+
14
+ // For SQLite - check if table exists and run migrations if missing
15
+ const sqlite = (raw as any).$client;
16
+ if (sqlite && typeof sqlite.prepare === 'function') {
17
+ const tableCheck = sqlite.prepare(
18
+ "SELECT name FROM sqlite_master WHERE type='table' AND name='beliefs'"
19
+ ).get() as { name: string } | undefined;
20
+ if (!tableCheck) {
21
+ await runBeliefMigrations(sqlite);
22
+ }
23
+ return;
24
+ }
25
+
26
+ // For PostgreSQL - check if table exists (migrations are run elsewhere for PG)
27
+ if (typeof (raw as any).query === 'function') {
28
+ const result = await (raw as any).query(
29
+ "SELECT table_name FROM information_schema.tables WHERE table_name = 'beliefs' LIMIT 1"
30
+ );
31
+ if (!result.rows[0]) {
32
+ // For PostgreSQL, we assume migrations are run during bootstrap
33
+ throw new Error('Beliefs table does not exist for PostgreSQL. Run database migrations.');
34
+ }
35
+ }
36
+ }
37
+
38
+ function normalizeBeliefKey(belief: Pick<ExtractedBelief, 'type' | 'statement'>): string {
39
+ return `${belief.type}:${belief.statement.toLowerCase().replace(/\s+/g, ' ').trim()}`;
40
+ }
41
+
42
+ export async function upsertBeliefsForMemory(input: {
43
+ projectId: string;
44
+ memoryId: string;
45
+ beliefs: ExtractedBelief[];
46
+ }): Promise<StoredBelief[]> {
47
+ await ensureBeliefTables();
48
+ const { raw } = await getDbClient();
49
+ const sqlite = (raw as any).$client;
50
+ if (!sqlite && typeof (raw as any).query !== 'function') return [];
51
+
52
+ const stored: StoredBelief[] = [];
53
+
54
+ if (!sqlite && typeof (raw as any).query === 'function') {
55
+ const pg = raw as any;
56
+ for (const belief of input.beliefs) {
57
+ const normalizedKey = normalizeBeliefKey(belief);
58
+ const existingResult = await pg.query(
59
+ `SELECT * FROM beliefs WHERE project_id = $1 AND normalized_key = $2 LIMIT 1`,
60
+ [input.projectId, normalizedKey],
61
+ );
62
+ const existing = existingResult.rows[0];
63
+ const beliefId = existing?.id ?? randomUUID();
64
+ const nextStatus =
65
+ existing
66
+ ? (belief.type === 'dispute' ? 'disputed' : existing.status || belief.status)
67
+ : belief.status;
68
+
69
+ if (existing) {
70
+ await pg.query(
71
+ `UPDATE beliefs
72
+ SET confidence = $1, status = $2, reason = $3, context = $4, evidence_summary = $5, metadata = $6, updated_at = NOW()
73
+ WHERE id = $7`,
74
+ [
75
+ Math.max(Number(existing.confidence ?? 0.5), belief.confidence),
76
+ nextStatus,
77
+ belief.reason ?? null,
78
+ belief.context ?? null,
79
+ belief.evidenceSummary ?? null,
80
+ { edges: belief.edges ?? [] },
81
+ beliefId,
82
+ ],
83
+ );
84
+ } else {
85
+ await pg.query(
86
+ `INSERT INTO beliefs (id, project_id, belief_type, statement, normalized_key, confidence, status, reason, context, evidence_summary, metadata)
87
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)`,
88
+ [
89
+ beliefId,
90
+ input.projectId,
91
+ belief.type,
92
+ belief.statement,
93
+ normalizedKey,
94
+ belief.confidence,
95
+ belief.status,
96
+ belief.reason ?? null,
97
+ belief.context ?? null,
98
+ belief.evidenceSummary ?? null,
99
+ { edges: belief.edges ?? [] },
100
+ ],
101
+ );
102
+ }
103
+
104
+ await pg.query(
105
+ `INSERT INTO belief_memory_sources (id, belief_id, memory_id)
106
+ VALUES ($1, $2, $3)
107
+ ON CONFLICT (belief_id, memory_id) DO NOTHING`,
108
+ [randomUUID(), beliefId, input.memoryId],
109
+ );
110
+
111
+ stored.push({
112
+ id: beliefId,
113
+ projectId: input.projectId,
114
+ normalizedKey,
115
+ ...belief,
116
+ status: nextStatus,
117
+ });
118
+ }
119
+ return stored;
120
+ }
121
+
122
+ for (const belief of input.beliefs) {
123
+ const normalizedKey = normalizeBeliefKey(belief);
124
+ const existing = sqlite.prepare(`
125
+ SELECT * FROM beliefs WHERE project_id = ? AND normalized_key = ? LIMIT 1
126
+ `).get(input.projectId, normalizedKey) as any;
127
+
128
+ let beliefId = existing?.id ?? randomUUID();
129
+ let status = belief.status;
130
+
131
+ if (existing) {
132
+ const nextStatus =
133
+ belief.type === 'dispute' ? 'disputed'
134
+ : existing.belief_type === belief.type && existing.statement !== belief.statement ? 'superseded'
135
+ : existing.status || belief.status;
136
+ sqlite.prepare(`
137
+ UPDATE beliefs
138
+ SET confidence = ?, status = ?, reason = ?, context = ?, evidence_summary = ?, metadata = ?, updated_at = (strftime('%s','now'))
139
+ WHERE id = ?
140
+ `).run(
141
+ Math.max(existing.confidence ?? 0.5, belief.confidence),
142
+ nextStatus,
143
+ belief.reason ?? null,
144
+ belief.context ?? null,
145
+ belief.evidenceSummary ?? null,
146
+ serializeMetadata({ edges: belief.edges ?? [] }),
147
+ beliefId,
148
+ );
149
+ status = nextStatus as StoredBelief['status'];
150
+ } else {
151
+ sqlite.prepare(`
152
+ INSERT INTO beliefs (id, project_id, belief_type, statement, normalized_key, confidence, status, reason, context, evidence_summary, metadata)
153
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
154
+ `).run(
155
+ beliefId,
156
+ input.projectId,
157
+ belief.type,
158
+ belief.statement,
159
+ normalizedKey,
160
+ belief.confidence,
161
+ belief.status,
162
+ belief.reason ?? null,
163
+ belief.context ?? null,
164
+ belief.evidenceSummary ?? null,
165
+ serializeMetadata({ edges: belief.edges ?? [] }),
166
+ );
167
+ }
168
+
169
+ sqlite.prepare(`
170
+ INSERT OR IGNORE INTO belief_memory_sources (id, belief_id, memory_id)
171
+ VALUES (?, ?, ?)
172
+ `).run(randomUUID(), beliefId, input.memoryId);
173
+
174
+ stored.push({
175
+ id: beliefId,
176
+ projectId: input.projectId,
177
+ normalizedKey,
178
+ ...belief,
179
+ status,
180
+ });
181
+ }
182
+
183
+ for (const belief of stored) {
184
+ const edgeMetadata = deserializeMetadata((sqlite.prepare(`SELECT metadata FROM beliefs WHERE id = ?`).get(belief.id) as any)?.metadata ?? null) as any;
185
+ const edges = Array.isArray(edgeMetadata?.edges) ? edgeMetadata.edges : [];
186
+ for (const edge of edges) {
187
+ const target = stored.find((candidate) => candidate.statement === edge.targetStatement);
188
+ if (!target || target.id === belief.id) continue;
189
+ sqlite.prepare(`
190
+ INSERT OR IGNORE INTO belief_edges (id, from_belief_id, to_belief_id, edge_type, metadata)
191
+ VALUES (?, ?, ?, ?, ?)
192
+ `).run(randomUUID(), belief.id, target.id, edge.type, serializeMetadata({}));
193
+ }
194
+ }
195
+
196
+ return stored;
197
+ }
198
+
199
+ export async function getBeliefsForMemory(memoryId: string): Promise<StoredBelief[]> {
200
+ await ensureBeliefTables();
201
+ const { raw } = await getDbClient();
202
+ const sqlite = (raw as any).$client;
203
+ if (!sqlite && typeof (raw as any).query !== 'function') return [];
204
+
205
+ if (!sqlite && typeof (raw as any).query === 'function') {
206
+ const result = await (raw as any).query(`
207
+ SELECT b.*, array_agg(bms.memory_id) as source_memory_ids
208
+ FROM beliefs b
209
+ JOIN belief_memory_sources bms ON bms.belief_id = b.id
210
+ WHERE b.id IN (
211
+ SELECT belief_id FROM belief_memory_sources WHERE memory_id = $1
212
+ )
213
+ GROUP BY b.id
214
+ ORDER BY b.updated_at DESC
215
+ `, [memoryId]);
216
+ return result.rows.map((row: any) => ({
217
+ id: row.id,
218
+ projectId: row.project_id,
219
+ type: row.belief_type,
220
+ statement: row.statement,
221
+ normalizedKey: row.normalized_key,
222
+ confidence: Number(row.confidence ?? 0.5),
223
+ status: row.status,
224
+ reason: row.reason ?? undefined,
225
+ context: row.context ?? undefined,
226
+ evidenceSummary: row.evidence_summary ?? undefined,
227
+ sourceMemoryIds: row.source_memory_ids ?? [],
228
+ createdAt: row.created_at,
229
+ updatedAt: row.updated_at,
230
+ }));
231
+ }
232
+
233
+ const rows = sqlite.prepare(`
234
+ SELECT b.*, group_concat(bms.memory_id) as source_memory_ids
235
+ FROM beliefs b
236
+ JOIN belief_memory_sources bms ON bms.belief_id = b.id
237
+ WHERE b.id IN (
238
+ SELECT belief_id FROM belief_memory_sources WHERE memory_id = ?
239
+ )
240
+ GROUP BY b.id
241
+ ORDER BY b.updated_at DESC
242
+ `).all(memoryId) as any[];
243
+
244
+ return rows.map((row) => ({
245
+ id: row.id,
246
+ projectId: row.project_id,
247
+ type: row.belief_type,
248
+ statement: row.statement,
249
+ normalizedKey: row.normalized_key,
250
+ confidence: Number(row.confidence ?? 0.5),
251
+ status: row.status,
252
+ reason: row.reason ?? undefined,
253
+ context: row.context ?? undefined,
254
+ evidenceSummary: row.evidence_summary ?? undefined,
255
+ sourceMemoryIds: String(row.source_memory_ids ?? '').split(',').filter(Boolean),
256
+ createdAt: row.created_at,
257
+ updatedAt: row.updated_at,
258
+ }));
259
+ }
260
+
261
+ /**
262
+ * Get all beliefs for a project
263
+ */
264
+ export async function getAllBeliefs(projectId: string, options?: {
265
+ type?: string;
266
+ status?: string;
267
+ minConfidence?: number;
268
+ limit?: number;
269
+ }): Promise<StoredBelief[]> {
270
+ await ensureBeliefTables();
271
+ const { raw } = await getDbClient();
272
+ const sqlite = (raw as any).$client;
273
+ const isPg = typeof (raw as any).query === 'function';
274
+ if (!sqlite && !isPg) return [];
275
+
276
+ const limit = options?.limit ?? 100;
277
+ const conditions: string[] = ['project_id = ?'];
278
+ const params: any[] = [projectId];
279
+
280
+ if (options?.type) {
281
+ conditions.push('belief_type = ?');
282
+ params.push(options.type);
283
+ }
284
+ if (options?.status) {
285
+ conditions.push('status = ?');
286
+ params.push(options.status);
287
+ }
288
+ if (options?.minConfidence !== undefined) {
289
+ conditions.push('confidence >= ?');
290
+ params.push(options.minConfidence);
291
+ }
292
+
293
+ const whereClause = conditions.join(' AND ');
294
+ const sql = `
295
+ SELECT * FROM beliefs
296
+ WHERE ${whereClause}
297
+ ORDER BY confidence DESC, updated_at DESC
298
+ LIMIT ?
299
+ `;
300
+ params.push(limit);
301
+
302
+ if (isPg) {
303
+ const result = await (raw as any).query(sql, params);
304
+ return result.rows.map((row: any) => ({
305
+ id: row.id,
306
+ projectId: row.project_id,
307
+ type: row.belief_type,
308
+ statement: row.statement,
309
+ normalizedKey: row.normalized_key,
310
+ confidence: Number(row.confidence ?? 0.5),
311
+ status: row.status,
312
+ reason: row.reason ?? undefined,
313
+ context: row.context ?? undefined,
314
+ evidenceSummary: row.evidence_summary ?? undefined,
315
+ sourceMemoryIds: [],
316
+ lastConfirmedAt: row.last_confirmed_at,
317
+ sourceCount: row.source_count,
318
+ createdAt: row.created_at,
319
+ updatedAt: row.updated_at,
320
+ }));
321
+ }
322
+
323
+ const rows = sqlite.prepare(sql).all(...params) as any[];
324
+ return rows.map((row) => ({
325
+ id: row.id,
326
+ projectId: row.project_id,
327
+ type: row.belief_type,
328
+ statement: row.statement,
329
+ normalizedKey: row.normalized_key,
330
+ confidence: Number(row.confidence ?? 0.5),
331
+ status: row.status,
332
+ reason: row.reason ?? undefined,
333
+ context: row.context ?? undefined,
334
+ evidenceSummary: row.evidence_summary ?? undefined,
335
+ sourceMemoryIds: [],
336
+ lastConfirmedAt: row.last_confirmed_at,
337
+ sourceCount: row.source_count,
338
+ createdAt: row.created_at,
339
+ updatedAt: row.updated_at,
340
+ }));
341
+ }
342
+
343
+ /**
344
+ * Search beliefs by statement content
345
+ */
346
+ export async function searchBeliefs(projectId: string, query: string, options?: {
347
+ type?: string;
348
+ minConfidence?: number;
349
+ limit?: number;
350
+ }): Promise<StoredBelief[]> {
351
+ await ensureBeliefTables();
352
+ const { raw } = await getDbClient();
353
+ const sqlite = (raw as any).$client;
354
+ const isPg = typeof (raw as any).query === 'function';
355
+ if (!sqlite && !isPg) return [];
356
+
357
+ const limit = options?.limit ?? 50;
358
+ const conditions: string[] = ['project_id = ?', 'statement LIKE ?'];
359
+ const params: any[] = [projectId, `%${query}%`];
360
+
361
+ if (options?.type) {
362
+ conditions.push('belief_type = ?');
363
+ params.push(options.type);
364
+ }
365
+ if (options?.minConfidence !== undefined) {
366
+ conditions.push('confidence >= ?');
367
+ params.push(options.minConfidence);
368
+ }
369
+
370
+ const whereClause = conditions.join(' AND ');
371
+ const sql = `
372
+ SELECT * FROM beliefs
373
+ WHERE ${whereClause}
374
+ ORDER BY confidence DESC
375
+ LIMIT ?
376
+ `;
377
+ params.push(limit);
378
+
379
+ if (isPg) {
380
+ const result = await (raw as any).query(sql, params);
381
+ return result.rows.map((row: any) => ({
382
+ id: row.id,
383
+ projectId: row.project_id,
384
+ type: row.belief_type,
385
+ statement: row.statement,
386
+ normalizedKey: row.normalized_key,
387
+ confidence: Number(row.confidence ?? 0.5),
388
+ status: row.status,
389
+ reason: row.reason ?? undefined,
390
+ context: row.context ?? undefined,
391
+ evidenceSummary: row.evidence_summary ?? undefined,
392
+ sourceMemoryIds: [],
393
+ sourceCount: row.source_count,
394
+ createdAt: row.created_at,
395
+ updatedAt: row.updated_at,
396
+ }));
397
+ }
398
+
399
+ const rows = sqlite.prepare(sql).all(...params) as any[];
400
+ return rows.map((row) => ({
401
+ id: row.id,
402
+ projectId: row.project_id,
403
+ type: row.belief_type,
404
+ statement: row.statement,
405
+ normalizedKey: row.normalized_key,
406
+ confidence: Number(row.confidence ?? 0.5),
407
+ status: row.status,
408
+ reason: row.reason ?? undefined,
409
+ context: row.context ?? undefined,
410
+ evidenceSummary: row.evidence_summary ?? undefined,
411
+ sourceMemoryIds: [],
412
+ sourceCount: row.source_count,
413
+ createdAt: row.created_at,
414
+ updatedAt: row.updated_at,
415
+ }));
416
+ }
417
+
418
+ /**
419
+ * Get active constraint beliefs for session boot
420
+ * Returns beliefs that should shape next actions
421
+ */
422
+ export async function getActiveConstraints(projectId: string): Promise<StoredBelief[]> {
423
+ await ensureBeliefTables();
424
+ const { raw } = await getDbClient();
425
+ const sqlite = (raw as any).$client;
426
+ const isPg = typeof (raw as any).query === 'function';
427
+ if (!sqlite && !isPg) return [];
428
+
429
+ const sql = `
430
+ SELECT * FROM beliefs
431
+ WHERE project_id = ? AND belief_type = 'constraint' AND status = 'active'
432
+ ORDER BY confidence DESC, updated_at DESC
433
+ LIMIT 20
434
+ `;
435
+
436
+ if (isPg) {
437
+ const result = await (raw as any).query(sql, [projectId]);
438
+ return result.rows.map((row: any) => mapRowToBelief(row));
439
+ }
440
+
441
+ const rows = sqlite.prepare(sql).all(projectId) as any[];
442
+ return rows.map(mapRowToBelief);
443
+ }
444
+
445
+ /**
446
+ * Get active decision beliefs for session boot
447
+ * Returns decisions that should guide next actions
448
+ */
449
+ export async function getActiveDecisions(projectId: string): Promise<StoredBelief[]> {
450
+ await ensureBeliefTables();
451
+ const { raw } = await getDbClient();
452
+ const sqlite = (raw as any).$client;
453
+ const isPg = typeof (raw as any).query === 'function';
454
+ if (!sqlite && !isPg) return [];
455
+
456
+ const sql = `
457
+ SELECT * FROM beliefs
458
+ WHERE project_id = ? AND belief_type = 'decision' AND status = 'active'
459
+ ORDER BY confidence DESC, updated_at DESC
460
+ LIMIT 20
461
+ `;
462
+
463
+ if (isPg) {
464
+ const result = await (raw as any).query(sql, [projectId]);
465
+ return result.rows.map((row: any) => mapRowToBelief(row));
466
+ }
467
+
468
+ const rows = sqlite.prepare(sql).all(projectId) as any[];
469
+ return rows.map(mapRowToBelief);
470
+ }
471
+
472
+ /**
473
+ * Get recent failure beliefs for session boot
474
+ * Returns failure_cause beliefs to avoid repeating mistakes
475
+ * @param count - Number of recent failures to return (default 10)
476
+ */
477
+ export async function getRecentFailures(projectId: string, count: number = 10): Promise<StoredBelief[]> {
478
+ await ensureBeliefTables();
479
+ const { raw } = await getDbClient();
480
+ const sqlite = (raw as any).$client;
481
+ const isPg = typeof (raw as any).query === 'function';
482
+ if (!sqlite && !isPg) return [];
483
+
484
+ const sql = `
485
+ SELECT * FROM beliefs
486
+ WHERE project_id = ? AND belief_type = 'failure_cause' AND status = 'active'
487
+ ORDER BY updated_at DESC
488
+ LIMIT ?
489
+ `;
490
+
491
+ if (isPg) {
492
+ const result = await (raw as any).query(sql, [projectId, count]);
493
+ return result.rows.map((row: any) => mapRowToBelief(row));
494
+ }
495
+
496
+ const rows = sqlite.prepare(sql).all(projectId, count) as any[];
497
+ return rows.map(mapRowToBelief);
498
+ }
499
+
500
+ /**
501
+ * Get beliefs relevant to a task/query for session boot
502
+ * Used to inject relevant beliefs at session start
503
+ */
504
+ export async function getRelevantBeliefs(projectId: string, taskQuery: string, limit: number = 10): Promise<StoredBelief[]> {
505
+ await ensureBeliefTables();
506
+ const { raw } = await getDbClient();
507
+ const sqlite = (raw as any).$client;
508
+ const isPg = typeof (raw as any).query === 'function';
509
+ if (!sqlite && !isPg) return [];
510
+
511
+ // Match against statement, context, or normalized_key
512
+ const searchPattern = `%${taskQuery}%`;
513
+ const sql = `
514
+ SELECT * FROM beliefs
515
+ WHERE project_id = ?
516
+ AND status = 'active'
517
+ AND (
518
+ statement LIKE ? OR
519
+ context LIKE ? OR
520
+ normalized_key LIKE ?
521
+ )
522
+ ORDER BY confidence DESC, updated_at DESC
523
+ LIMIT ?
524
+ `;
525
+
526
+ const params = [projectId, searchPattern, searchPattern, searchPattern, limit];
527
+
528
+ if (isPg) {
529
+ const result = await (raw as any).query(sql, params);
530
+ return result.rows.map((row: any) => mapRowToBelief(row));
531
+ }
532
+
533
+ const rows = sqlite.prepare(sql).all(...params) as any[];
534
+ return rows.map(mapRowToBelief);
535
+ }
536
+
537
+ /**
538
+ * Helper to map DB row to StoredBelief
539
+ */
540
+ function mapRowToBelief(row: any): StoredBelief {
541
+ return {
542
+ id: row.id,
543
+ projectId: row.project_id,
544
+ type: row.belief_type,
545
+ statement: row.statement,
546
+ normalizedKey: row.normalized_key,
547
+ confidence: Number(row.confidence ?? 0.5),
548
+ status: row.status,
549
+ reason: row.reason ?? undefined,
550
+ context: row.context ?? undefined,
551
+ evidenceSummary: row.evidence_summary ?? undefined,
552
+ sourceMemoryIds: [],
553
+ sourceCount: row.source_count,
554
+ createdAt: row.created_at,
555
+ updatedAt: row.updated_at,
556
+ };
557
+ }