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,1128 @@
1
+ import { pgTable, text, timestamp, uuid, integer, boolean, jsonb, index, vector, numeric } from 'drizzle-orm/pg-core';
2
+ import { relations } from 'drizzle-orm';
3
+
4
+ // Type Definitions
5
+ // ============================================================================
6
+
7
+ export type MemoryType = 'observation' | 'fact' | 'decision' | 'context' | 'preference' | 'reflection' | 'note';
8
+
9
+ // Core Tables
10
+ // ============================================================================
11
+
12
+ /**
13
+ * Users - represents Claude Code users
14
+ */
15
+ export const users = pgTable('users', {
16
+ id: uuid('id').primaryKey().defaultRandom(),
17
+ externalId: text('external_id').unique(), // Claude user ID if available
18
+ name: text('name'),
19
+ email: text('email'),
20
+ preferences: jsonb('preferences').$type<Record<string, unknown>>(),
21
+ createdAt: timestamp('created_at').defaultNow().notNull(),
22
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
23
+ });
24
+
25
+ // Memory Editing Tables
26
+ // ============================================================================
27
+
28
+ /**
29
+ * Memory Edit Proposals - tracks suggested edits before user approval
30
+ */
31
+ export const memoryEditProposals = pgTable('memory_edit_proposals', {
32
+ id: uuid('id').primaryKey().defaultRandom(),
33
+ projectId: uuid('project_id').references(() => projects.id, { onDelete: 'cascade' }).notNull(),
34
+ userId: uuid('user_id').references(() => users.id, { onDelete: 'set null' }),
35
+
36
+ // Memory to edit
37
+ memoryId: uuid('memory_id').references(() => memories.id, { onDelete: 'cascade' }).notNull(),
38
+
39
+ // Current content
40
+ currentContent: text('current_content').notNull(),
41
+ proposedContent: text('proposed_content').notNull(),
42
+
43
+ // Edit metadata
44
+ reason: text('reason').notNull(),
45
+ conflictWarnings: jsonb('conflict_warnings').$type<string[]>(),
46
+ status: text('status').notNull().$type<'pending' | 'approved' | 'rejected' | 'expired'>().default('pending'),
47
+
48
+ // Versioning
49
+ version: integer('version').default(1).notNull(),
50
+ createdAt: timestamp('created_at').defaultNow().notNull(),
51
+ reviewedAt: timestamp('reviewed_at'),
52
+ reviewNotes: text('review_notes'),
53
+ }, (table) => [
54
+ index('memory_edit_proposals_memory_idx').on(table.memoryId),
55
+ index('memory_edit_proposals_status_idx').on(table.status),
56
+ index('memory_edit_proposals_created_at_idx').on(table.createdAt),
57
+ ]);
58
+
59
+ /**
60
+ * Core Memory - Always-in-context memory (Tier 1)
61
+ * Small, persistent, always-visible memory block (< 2KB total)
62
+ */
63
+ export const projects = pgTable('projects', {
64
+ id: uuid('id').primaryKey().defaultRandom(),
65
+ name: text('name').notNull(),
66
+ path: text('path').notNull(), // Absolute path to project root
67
+ description: text('description'),
68
+ metadata: jsonb('metadata').$type<Record<string, unknown>>(),
69
+ createdAt: timestamp('created_at').defaultNow().notNull(),
70
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
71
+ }, (table) => [
72
+ index('projects_path_idx').on(table.path),
73
+ ]);
74
+
75
+ /**
76
+ * Memories - core memory storage with semantic search
77
+ */
78
+ export const memories = pgTable(
79
+ 'memories',
80
+ {
81
+ id: uuid('id').primaryKey().defaultRandom(),
82
+ projectId: uuid('project_id').references(() => projects.id, { onDelete: 'cascade' }),
83
+ userId: uuid('user_id').references(() => users.id, { onDelete: 'set null' }),
84
+
85
+ // Content
86
+ type: text('type').notNull().$type<'observation' | 'fact' | 'decision' | 'context' | 'preference'>(),
87
+ content: text('content').notNull(),
88
+ summary: text('summary'), // Compressed/summarized version
89
+
90
+ // Semantic search
91
+ embedding: vector('embedding', { dimensions: 1536 }), // OpenAI ada-002 compatible
92
+
93
+ // Metadata
94
+ source: text('source'), // Where this memory came from (tool, hook, user)
95
+ confidence: integer('confidence').default(50), // 0-100 confidence score (default: speculative)
96
+ confidenceLevel: text('confidence_level').default('speculative').$type<'certain' | 'speculative' | 'outdated'>(), // Iteration 3: Confidence flags (default: speculative)
97
+ tags: text('tags').array(),
98
+ metadata: jsonb('metadata').$type<Record<string, unknown>>(),
99
+
100
+ // v0.2.0: Privacy and relevance
101
+ isPrivate: boolean('is_private').default(false),
102
+ hasSecrets: boolean('has_secrets').default(false),
103
+ relevanceScore: integer('relevance_score').default(50), // 0-100
104
+
105
+ // v0.3.0: Lifecycle Management
106
+ sector: text('sector').default('episodic').$type<'episodic' | 'semantic' | 'procedural' | 'autobiographical' | 'working'>(),
107
+ tier: text('tier').default('hot').$type<'hot' | 'cold'>(),
108
+ status: text('status').notNull().default('active'),
109
+ encrypted_content: text('encrypted_content'),
110
+ encryption_nonce: text('encryption_nonce'),
111
+ is_encrypted: boolean('is_encrypted').default(false),
112
+ // Per-memory decay rate (integer percentage, e.g., 30 = 30% decay per cycle)
113
+ decayRate: integer('decay_rate').default(30),
114
+ coactivationScore: integer('coactivation_score').default(0), // 0-100
115
+ lastDecayAt: timestamp('last_decay_at').defaultNow(),
116
+
117
+ // v0.3.0: Agent-Aware
118
+ agentId: text('agent_id'), // e.g., 'main', 'research-agent'
119
+ agentRole: text('agent_role'), // e.g., 'general', 'specialist'
120
+ visibilityScope: text('visibility_scope').default('private').$type<'private' | 'project' | 'team' | 'global'>(),
121
+
122
+ // v0.3.0: Governance
123
+ isProtected: boolean('is_protected').default(false), // Cannot be evicted
124
+ isPinned: boolean('is_pinned').default(false), // Always inject
125
+ isImmutable: boolean('is_immutable').default(false), // Cannot be updated
126
+ writeScope: text('write_scope').array(), // Who can modify
127
+ readScope: text('read_scope').array(), // Who can read
128
+
129
+ // v0.3.0: Provenance
130
+ triggeredBy: text('triggered_by'), // What triggered this memory
131
+ captureReason: text('capture_reason'), // Why was this remembered
132
+ lastUsedAt: timestamp('last_used_at'),
133
+ usageCount: integer('usage_count').default(0),
134
+
135
+ // v0.3.0: Temporal Facts
136
+ validFrom: timestamp('valid_from'),
137
+ validTo: timestamp('valid_to'),
138
+ recordedAt: timestamp('recorded_at').defaultNow().notNull(), // When agent learned/stored the fact
139
+ supersededBy: uuid('superseded_by').references((): any => (memories as any).id),
140
+ version: integer('version').default(1),
141
+
142
+ // Lifecycle
143
+ isActive: boolean('is_active').default(true),
144
+ expiresAt: timestamp('expires_at'),
145
+ accessCount: integer('access_count').default(0),
146
+ lastAccessedAt: timestamp('last_accessed_at'),
147
+
148
+ // Merge tracking
149
+ isMerged: boolean('is_merged').default(false), // Soft archive flag
150
+ mergedIntoId: uuid('merged_into_id').references((): any => (memories as any).id), // Points to canonical memory
151
+ mergedAt: timestamp('merged_at'),
152
+ isCanonical: boolean('is_canonical').default(false), // True if result of merge
153
+ mergeSourceIds: jsonb('merge_source_ids').$type<string[]>(), // IDs merged into this one
154
+ isMergeable: boolean('is_mergeable').default(true), // Immutability flag
155
+ mergeVersion: integer('merge_version').default(1), // Incremented on each merge
156
+
157
+ // v0.4.2: Namespace support
158
+ namespaceId: uuid('namespace_id').references(() => namespaces.id, { onDelete: 'set null' }),
159
+ namespacePath: text('namespace_path'),
160
+
161
+ // v1.1.5: Places support (spatial memory organization)
162
+ placeId: uuid('place_id').references(() => places.id, { onDelete: 'set null' }),
163
+ placeSortOrder: integer('place_sort_order'),
164
+
165
+ // v0.4.3: Layer support
166
+ hasL0Abstract: boolean('has_l0_abstract').default(false),
167
+ hasL1Overview: boolean('has_l1_overview').default(false),
168
+ lastLayerUpdate: timestamp('last_layer_update'),
169
+
170
+ // v1.0.x: Token tracking
171
+ tokensEstimate: integer('tokens_estimate').default(0).notNull(),
172
+
173
+ createdAt: timestamp('created_at').defaultNow().notNull(),
174
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
175
+ },
176
+ (table): any => [
177
+ index('memories_project_idx').on(table.projectId),
178
+ index('memories_type_idx').on(table.type),
179
+ index('memories_created_idx').on(table.createdAt),
180
+ index('memories_tags_idx').on(table.tags),
181
+ index('memories_relevance_idx').on(table.relevanceScore),
182
+ index('memories_private_idx').on(table.isPrivate),
183
+ index('memories_merged_idx').on(table.isMerged),
184
+ index('memories_canonical_idx').on(table.isCanonical),
185
+ // v0.3.0: Lifecycle indexes
186
+ index('memories_sector_idx').on(table.sector),
187
+ index('memories_tier_idx').on(table.tier),
188
+ index('memories_agent_idx').on(table.agentId),
189
+ index('memories_visibility_idx').on(table.visibilityScope),
190
+ index('memories_protected_idx').on(table.isProtected),
191
+ index('memories_pinned_idx').on(table.isPinned),
192
+ index('memories_valid_from_idx').on(table.validFrom),
193
+ index('memories_valid_to_idx').on(table.validTo),
194
+
195
+ // v0.4.2: Composite indexes for performance optimization
196
+ // Duplicate detection query optimization
197
+ index('memories_duplicate_detection_idx').on(
198
+ table.projectId,
199
+ table.isMerged,
200
+ table.isMergeable,
201
+ table.isActive
202
+ ),
203
+ // Eviction query optimization (lifecycle.ts line 170-183)
204
+ index('memories_eviction_idx').on(
205
+ table.projectId,
206
+ table.tier,
207
+ table.relevanceScore,
208
+ table.createdAt
209
+ ),
210
+ // Decay operations optimization (lifecycle.ts line 70-100)
211
+ index('memories_decay_idx').on(
212
+ table.sector,
213
+ table.lastDecayAt,
214
+ table.isProtected
215
+ ),
216
+ // Temporal query optimization
217
+ index('memories_temporal_idx').on(
218
+ table.projectId,
219
+ table.validFrom,
220
+ table.validTo
221
+ ),
222
+ // Agent-aware retrieval optimization
223
+ index('memories_agent_visibility_idx').on(
224
+ table.agentId,
225
+ table.visibilityScope,
226
+ table.isActive
227
+ ),
228
+ ],
229
+ ) as any;
230
+
231
+ /**
232
+ * Conversations - chat session tracking
233
+ */
234
+ export const conversations = pgTable('conversations', {
235
+ id: uuid('id').primaryKey().defaultRandom(),
236
+ projectId: uuid('project_id').references(() => projects.id, { onDelete: 'cascade' }),
237
+ userId: uuid('user_id').references(() => users.id, { onDelete: 'set null' }),
238
+
239
+ sessionId: text('session_id').notNull(), // Claude session ID
240
+ title: text('title'),
241
+ summary: text('summary'),
242
+
243
+ // Stats
244
+ messageCount: integer('message_count').default(0),
245
+ tokenCount: integer('token_count').default(0),
246
+
247
+ startedAt: timestamp('started_at').defaultNow().notNull(),
248
+ endedAt: timestamp('ended_at'),
249
+
250
+ metadata: jsonb('metadata').$type<Record<string, unknown>>(),
251
+ createdAt: timestamp('created_at').defaultNow().notNull(),
252
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
253
+ }, (table) => [
254
+ index('conversations_project_idx').on(table.projectId),
255
+ index('conversations_session_idx').on(table.sessionId),
256
+ index('conversations_started_idx').on(table.startedAt),
257
+ ]);
258
+
259
+ /**
260
+ * Messages - individual messages within conversations
261
+ */
262
+ export const messages = pgTable('messages', {
263
+ id: uuid('id').primaryKey().defaultRandom(),
264
+ conversationId: uuid('conversation_id').references(() => conversations.id, { onDelete: 'cascade' }).notNull(),
265
+
266
+ role: text('role').notNull().$type<'user' | 'assistant' | 'system'>(),
267
+ content: text('content').notNull(),
268
+
269
+ // Semantic search
270
+ embedding: vector('embedding', { dimensions: 1536 }),
271
+
272
+ // Token tracking
273
+ tokenCount: integer('token_count'),
274
+
275
+ // Tool usage
276
+ toolCalls: jsonb('tool_calls').$type<Array<{ name: string; args: unknown; result?: unknown }>>(),
277
+
278
+ metadata: jsonb('metadata').$type<Record<string, unknown>>(),
279
+ createdAt: timestamp('created_at').defaultNow().notNull(),
280
+ }, (table) => [
281
+ index('messages_conversation_idx').on(table.conversationId),
282
+ index('messages_role_idx').on(table.role),
283
+ index('messages_created_idx').on(table.createdAt),
284
+ ]);
285
+
286
+ /**
287
+ * Learnings - agent learnings: success, failure, fix, insight
288
+ */
289
+ export const learnings = pgTable('learnings', {
290
+ id: uuid('id').primaryKey().defaultRandom(),
291
+ projectId: uuid('project_id').references(() => projects.id, { onDelete: 'cascade' }),
292
+ conversationId: uuid('conversation_id').references(() => conversations.id, { onDelete: 'set null' }),
293
+
294
+ // Learning type: success, failure, fix, insight
295
+ type: text('type').notNull().$type<'success' | 'failure' | 'fix' | 'insight'>(),
296
+ action: text('action').notNull(),
297
+ target: text('target'),
298
+
299
+ // Details
300
+ summary: text('summary').notNull(),
301
+ details: jsonb('details').$type<Record<string, unknown>>(),
302
+
303
+ // Semantic search
304
+ embedding: vector('embedding', { dimensions: 1536 }),
305
+
306
+ // Optional link to a memory
307
+ memoryId: uuid('memory_id').references(() => memories.id, { onDelete: 'set null' }),
308
+
309
+ // Folder-scoped
310
+ folderPath: text('folder_path'),
311
+ projectPath: text('project_path'),
312
+
313
+ // Privacy and relevance
314
+ isPrivate: boolean('is_private').default(false),
315
+ hasSecrets: boolean('has_secrets').default(false),
316
+ relevanceScore: integer('relevance_score').default(50),
317
+
318
+ // Classification
319
+ category: text('category'),
320
+ importance: integer('importance').default(50),
321
+
322
+ metadata: jsonb('metadata').$type<Record<string, unknown>>(),
323
+
324
+ // Migration tracking
325
+ isImported: boolean('is_imported').default(false),
326
+
327
+ createdAt: timestamp('created_at').defaultNow().notNull(),
328
+ }, (table) => [
329
+ index('learnings_project_idx').on(table.projectId),
330
+ index('learnings_type_idx').on(table.type),
331
+ index('learnings_action_idx').on(table.action),
332
+ index('learnings_created_idx').on(table.createdAt),
333
+ index('learnings_folder_idx').on(table.folderPath),
334
+ index('learnings_relevance_idx').on(table.relevanceScore),
335
+ index('learnings_private_idx').on(table.isPrivate),
336
+ index('learnings_memory_idx').on(table.memoryId),
337
+ ]);
338
+
339
+ /**
340
+ * Agent Preferences - learned agent preferences from learnings
341
+ * Enables agents to evolve and remember preferences over time
342
+ */
343
+ export const agentPreferences = pgTable('agent_preferences', {
344
+ id: uuid('id').primaryKey().defaultRandom(),
345
+ projectId: uuid('project_id').references(() => projects.id, { onDelete: 'cascade' }).notNull(),
346
+
347
+ key: text('key').notNull(), // e.g., "prefer_bun", "prefer_typescript"
348
+ value: text('value').notNull(), // e.g., "bun", "true"
349
+
350
+ sourceMemoryId: uuid('source_memory_id').references(() => memories.id, { onDelete: 'set null' }),
351
+ confidence: numeric('confidence', { precision: 3, scale: 2 }).default('0.5'), // 0.00 to 1.00
352
+ usageCount: integer('usage_count').default(1),
353
+
354
+ lastUpdated: timestamp('last_updated').defaultNow().notNull(),
355
+ createdAt: timestamp('created_at').defaultNow().notNull(),
356
+ }, (table) => [
357
+ index('agent_preferences_project_idx').on(table.projectId),
358
+ index('agent_preferences_key_idx').on(table.key),
359
+ ]);
360
+
361
+ /**
362
+ * Entities - knowledge graph nodes
363
+ */
364
+ export const entities = pgTable('entities', {
365
+ id: uuid('id').primaryKey().defaultRandom(),
366
+ projectId: uuid('project_id').references(() => projects.id, { onDelete: 'cascade' }),
367
+
368
+ name: text('name').notNull(),
369
+ type: text('type').notNull().$type<'person' | 'file' | 'function' | 'class' | 'concept' | 'tool' | 'other'>(),
370
+ description: text('description'),
371
+
372
+ // Semantic search
373
+ embedding: vector('embedding', { dimensions: 1536 }),
374
+
375
+ properties: jsonb('properties').$type<Record<string, unknown>>(),
376
+
377
+ createdAt: timestamp('created_at').defaultNow().notNull(),
378
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
379
+ }, (table) => [
380
+ index('entities_project_idx').on(table.projectId),
381
+ index('entities_type_idx').on(table.type),
382
+ index('entities_name_idx').on(table.name),
383
+ ]);
384
+
385
+ /**
386
+ * Namespaces - Hierarchical folder-like namespaces for memory organization
387
+ */
388
+ export const namespaces: any = pgTable('namespaces', {
389
+ id: uuid('id').primaryKey().defaultRandom(),
390
+ projectId: uuid('project_id').references(() => projects.id, { onDelete: 'cascade' }).notNull(),
391
+
392
+ name: text('name').notNull(),
393
+ parentId: uuid('parent_id').references(() => namespaces.id, { onDelete: 'set null' }),
394
+ type: text('type').notNull().$type<'root' | 'user' | 'agent' | 'project' | 'custom'>(),
395
+ description: text('description'),
396
+
397
+ path: text('path').notNull(), // Full path like 'user/preferences' or 'projectX/docs/api'
398
+
399
+ createdAt: timestamp('created_at').defaultNow().notNull(),
400
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
401
+ }, (table) => [
402
+ index('namespaces_project_idx').on(table.projectId),
403
+ index('namespaces_parent_idx').on(table.parentId),
404
+ ]);
405
+
406
+ /**
407
+ * Places - Spatial memory organization
408
+ */
409
+ export const places: any = pgTable('places', {
410
+ id: uuid('id').primaryKey().defaultRandom(),
411
+ projectId: uuid('project_id').references(() => projects.id, { onDelete: 'cascade' }).notNull(),
412
+
413
+ name: text('name').notNull(),
414
+ placeType: text('place_type').notNull(),
415
+ parentId: uuid('parent_id').references(() => places.id, { onDelete: 'set null' }),
416
+
417
+ sortOrder: integer('sort_order').default(0),
418
+ positionX: integer('position_x').default(0),
419
+ positionY: integer('position_y').default(0),
420
+ description: text('description'),
421
+ purpose: text('purpose'),
422
+ memoryCount: integer('memory_count').default(0),
423
+
424
+ createdAt: timestamp('created_at').defaultNow().notNull(),
425
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
426
+ }, (table) => [
427
+ index('places_project_idx').on(table.projectId),
428
+ index('places_type_idx').on(table.placeType),
429
+ index('places_parent_idx').on(table.parentId),
430
+ index('places_sort_order_idx').on(table.projectId, table.sortOrder),
431
+ ]);
432
+
433
+ /**
434
+ * Memory-Place assignments
435
+ */
436
+ export const memoryPlaces: any = pgTable('memory_places', {
437
+ id: uuid('id').primaryKey().defaultRandom(),
438
+ memoryId: uuid('memory_id').references(() => memories.id, { onDelete: 'cascade' }).notNull(),
439
+ placeId: uuid('place_id').references(() => places.id, { onDelete: 'cascade' }).notNull(),
440
+ isManual: boolean('is_manual').default(false),
441
+ ruleId: uuid('rule_id'),
442
+
443
+ createdAt: timestamp('created_at').defaultNow().notNull(),
444
+ }, (table) => [
445
+ index('memory_places_memory_idx').on(table.memoryId),
446
+ index('memory_places_place_idx').on(table.placeId),
447
+ ]);
448
+
449
+ /**
450
+ * Place auto-assignment rules
451
+ */
452
+ export const placeRules: any = pgTable('place_rules', {
453
+ id: uuid('id').primaryKey().defaultRandom(),
454
+ projectId: uuid('project_id').references(() => projects.id, { onDelete: 'cascade' }).notNull(),
455
+
456
+ name: text('name').notNull(),
457
+ placeType: text('place_type').notNull(),
458
+
459
+ matchTool: text('match_tool'),
460
+ matchKeyword: text('match_keyword'),
461
+ matchTag: text('match_tag'),
462
+ matchMemoryType: text('match_memory_type'),
463
+
464
+ priority: integer('priority').default(0),
465
+ enabled: boolean('enabled').default(true),
466
+
467
+ createdAt: timestamp('created_at').defaultNow().notNull(),
468
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
469
+ }, (table) => [
470
+ index('place_rules_project_idx').on(table.projectId),
471
+ index('place_rules_type_idx').on(table.placeType),
472
+ ]);
473
+
474
+ /**
475
+ * Memory Layers - Tiered L0/L1/L2 summaries for token-efficient retrieval
476
+ */
477
+ export const memoryLayers = pgTable('memory_layers', {
478
+ id: uuid('id').primaryKey().defaultRandom(),
479
+ memoryId: uuid('memory_id').references(() => memories.id, { onDelete: 'cascade' }).notNull(),
480
+
481
+ layerType: text('layer_type').notNull().$type<'l0_abstract' | 'l1_overview' | 'l2_full'>(),
482
+ content: text('content').notNull(),
483
+ tokenCount: integer('token_count').default(0),
484
+ embedding: vector('embedding', { dimensions: 1536 }),
485
+
486
+ createdAt: timestamp('created_at').defaultNow().notNull(),
487
+ }, (table) => [
488
+ index('memory_layers_memory_idx').on(table.memoryId),
489
+ index('memory_layers_type_idx').on(table.layerType),
490
+ ]);
491
+
492
+ /**
493
+ * Relations - knowledge graph edges
494
+ */
495
+ export const entityRelations = pgTable('entity_relations', {
496
+ id: uuid('id').primaryKey().defaultRandom(),
497
+
498
+ fromEntityId: uuid('from_entity_id').references(() => entities.id, { onDelete: 'cascade' }).notNull(),
499
+ toEntityId: uuid('to_entity_id').references(() => entities.id, { onDelete: 'cascade' }).notNull(),
500
+
501
+ type: text('type').notNull(), // e.g., 'uses', 'extends', 'contains', 'depends_on'
502
+ weight: integer('weight').default(1),
503
+
504
+ properties: jsonb('properties').$type<Record<string, unknown>>(),
505
+
506
+ createdAt: timestamp('created_at').defaultNow().notNull(),
507
+ }, (table) => [
508
+ index('relations_from_idx').on(table.fromEntityId),
509
+ index('relations_to_idx').on(table.toEntityId),
510
+ index('relations_type_idx').on(table.type),
511
+ ]);
512
+
513
+ // v0.3.0: Lifecycle & Governance Tables
514
+ // ============================================================================
515
+
516
+ /**
517
+ * Memory Associations - Waypoint graph tracking memory relationships
518
+ */
519
+ export const memoryAssociations = pgTable('memory_associations', {
520
+ id: uuid('id').primaryKey().defaultRandom(),
521
+ fromMemoryId: uuid('from_memory_id').references(() => memories.id, { onDelete: 'cascade' }).notNull(),
522
+ toMemoryId: uuid('to_memory_id').references(() => memories.id, { onDelete: 'cascade' }).notNull(),
523
+
524
+ associationType: text('association_type').notNull().$type<'co_occurred' | 'supersedes' | 'contradicts' | 'supports' | 'relates_to'>(),
525
+ weight: integer('weight').default(1), // Association strength
526
+ coactivationCount: integer('coactivation_count').default(0),
527
+
528
+ metadata: jsonb('metadata').$type<Record<string, unknown>>(),
529
+ createdAt: timestamp('created_at').defaultNow().notNull(),
530
+ lastCoactivatedAt: timestamp('last_coactivated_at'),
531
+ }, (table) => [
532
+ index('associations_from_idx').on(table.fromMemoryId),
533
+ index('associations_to_idx').on(table.toMemoryId),
534
+ index('associations_type_idx').on(table.associationType),
535
+ index('associations_weight_idx').on(table.weight),
536
+ // v0.4.2: Composite index for graph traversal optimization
537
+ index('associations_graph_traversal_idx').on(
538
+ table.fromMemoryId,
539
+ table.toMemoryId,
540
+ table.weight,
541
+ table.associationType
542
+ ),
543
+ ]);
544
+
545
+ /**
546
+ * Session Summaries - Compressed conversation snapshots
547
+ */
548
+ export const sessionSummaries = pgTable('session_summaries', {
549
+ id: uuid('id').primaryKey().defaultRandom(),
550
+ conversationId: uuid('conversation_id').references(() => conversations.id, { onDelete: 'cascade' }).notNull(),
551
+ projectId: uuid('project_id').references(() => projects.id, { onDelete: 'cascade' }),
552
+
553
+ summaryType: text('summary_type').notNull().$type<'incremental' | 'rolling' | 'final'>(),
554
+ content: text('content').notNull(),
555
+ compressedFrom: integer('compressed_from'), // How many messages compressed
556
+ tokensSaved: integer('tokens_saved'),
557
+
558
+ embedding: vector('embedding', { dimensions: 1536 }),
559
+
560
+ createdAt: timestamp('created_at').defaultNow().notNull(),
561
+ }, (table) => [
562
+ index('session_summaries_conversation_idx').on(table.conversationId),
563
+ index('session_summaries_project_idx').on(table.projectId),
564
+ index('session_summaries_type_idx').on(table.summaryType),
565
+ ]);
566
+
567
+ /**
568
+ * Memory Snapshots - Before/after diffs for auditability
569
+ */
570
+ export const memorySnapshots = pgTable('memory_snapshots', {
571
+ id: uuid('id').primaryKey().defaultRandom(),
572
+ memoryId: uuid('memory_id').references(() => memories.id, { onDelete: 'cascade' }).notNull(),
573
+
574
+ snapshotType: text('snapshot_type').notNull().$type<'before_update' | 'after_update' | 'periodic'>(),
575
+ content: text('content').notNull(),
576
+ metadata: jsonb('metadata').$type<Record<string, unknown>>(),
577
+ diff: jsonb('diff').$type<{ added?: string[]; removed?: string[]; changed?: Record<string, { from: unknown; to: unknown }> }>(),
578
+
579
+ createdAt: timestamp('created_at').defaultNow().notNull(),
580
+ }, (table) => [
581
+ index('snapshots_memory_idx').on(table.memoryId),
582
+ index('snapshots_type_idx').on(table.snapshotType),
583
+ index('snapshots_created_idx').on(table.createdAt),
584
+ ]);
585
+
586
+ // Progressive Disclosure & Context Paging Tables
587
+ // ============================================================================
588
+
589
+ /**
590
+ * Lightweight memory indices for progressive disclosure - previews and metadata
591
+ * used for quick filtering before loading full memories
592
+ */
593
+ export const lightweightMemoryIndices = pgTable('lightweight_memory_indices', {
594
+ id: uuid('id').primaryKey().defaultRandom(),
595
+ memoryId: uuid('memory_id').references(() => memories.id, { onDelete: 'cascade' }),
596
+
597
+ // Hash for quick comparison
598
+ contentHash: text('content_hash').notNull(),
599
+ contentPreview: text('content_preview').notNull(),
600
+ keyTerms: text('key_terms').array(), // JSON array of keywords
601
+
602
+ // Categorization
603
+ category: text('category').notNull(),
604
+ importanceScore: integer('importance_score').notNull(),
605
+
606
+ createdAt: timestamp('created_at').defaultNow().notNull(),
607
+ }, (table) => [
608
+ index('lightweight_indices_memory_idx').on(table.memoryId),
609
+ index('lightweight_indices_category_idx').on(table.category),
610
+ index('lightweight_indices_importance_idx').on(table.importanceScore),
611
+ ]);
612
+
613
+ /**
614
+ * Context paging sessions for tracking loaded/preloaded memories
615
+ * Agent-controlled memory loading system
616
+ */
617
+ export const contextPagingSessions = pgTable('context_paging_sessions', {
618
+ id: uuid('id').primaryKey().defaultRandom(),
619
+ sessionId: text('session_id').notNull().unique(),
620
+ projectId: uuid('project_id').references(() => projects.id, { onDelete: 'cascade' }),
621
+ userId: uuid('user_id').references(() => users.id, { onDelete: 'set null' }),
622
+
623
+ // Loaded memories (actively in context)
624
+ loadedMemoryIds: text('loaded_memory_ids').array().default([]),
625
+
626
+ // Preload candidates (ready to load if needed)
627
+ preloadCandidateIds: text('preload_candidate_ids').array().default([]),
628
+
629
+ // Token tracking
630
+ tokenBudget: integer('token_budget').default(8000).notNull(),
631
+ tokensUsed: integer('tokens_used').default(0).notNull(),
632
+ loadedMemoriesTokens: integer('loaded_memories_tokens').default(0).notNull(),
633
+
634
+ // Session metadata
635
+ metadata: jsonb('metadata').$type<Record<string, unknown>>(),
636
+
637
+ createdAt: timestamp('created_at').defaultNow().notNull(),
638
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
639
+ }, (table) => [
640
+ index('context_paging_session_idx').on(table.sessionId),
641
+ index('context_paging_project_idx').on(table.projectId),
642
+ index('context_paging_created_idx').on(table.createdAt),
643
+ ]);
644
+
645
+ // Memory Merging Tables
646
+ // ============================================================================
647
+
648
+ /**
649
+ * Memory Merge Proposals - tracks suggested merges before user approval
650
+ */
651
+ export const memoryMergeProposals = pgTable('memory_merge_proposals', {
652
+ id: uuid('id').primaryKey().defaultRandom(),
653
+ projectId: uuid('project_id').references(() => projects.id, { onDelete: 'cascade' }).notNull(),
654
+ userId: uuid('user_id').references(() => users.id, { onDelete: 'set null' }),
655
+
656
+ // Source memories to be merged
657
+ sourceMemoryIds: jsonb('source_memory_ids').$type<string[]>().notNull(),
658
+
659
+ // Proposed merged content
660
+ proposedContent: text('proposed_content').notNull(),
661
+ proposedSummary: text('proposed_summary'),
662
+ proposedTags: jsonb('proposed_tags').$type<string[]>(),
663
+ proposedMetadata: jsonb('proposed_metadata').$type<Record<string, unknown>>(),
664
+
665
+ // Detection metadata
666
+ detectionMethod: text('detection_method').notNull().$type<'simhash' | 'minhash' | 'embedding'>(),
667
+ similarityScore: numeric('similarity_score').notNull(), // 0-1
668
+ confidenceLevel: text('confidence_level').notNull().$type<'high' | 'medium' | 'low'>(),
669
+
670
+ // Merge rationale
671
+ mergeReason: text('merge_reason').notNull(),
672
+ conflictWarnings: jsonb('conflict_warnings').$type<string[]>(),
673
+
674
+ // Status
675
+ status: text('status').notNull().$type<'pending' | 'approved' | 'rejected' | 'expired'>().default('pending'),
676
+ reviewedAt: timestamp('reviewed_at'),
677
+ reviewNotes: text('review_notes'),
678
+
679
+ // Timestamps
680
+ createdAt: timestamp('created_at').defaultNow().notNull(),
681
+ expiresAt: timestamp('expires_at'), // Auto-expire old proposals
682
+ }, (table) => [
683
+ index('memory_merge_proposals_project_status_idx').on(table.projectId, table.status),
684
+ index('memory_merge_proposals_created_at_idx').on(table.createdAt),
685
+ ]);
686
+
687
+ /**
688
+ * Memory Merge History - audit trail of completed merges
689
+ */
690
+ export const memoryMergeHistory = pgTable('memory_merge_history', {
691
+ id: uuid('id').primaryKey().defaultRandom(),
692
+ projectId: uuid('project_id').references(() => projects.id, { onDelete: 'cascade' }).notNull(),
693
+ userId: uuid('user_id').references(() => users.id, { onDelete: 'set null' }),
694
+
695
+ // Merge details
696
+ proposalId: uuid('proposal_id').references(() => memoryMergeProposals.id, { onDelete: 'set null' }),
697
+ sourceMemoryIds: jsonb('source_memory_ids').$type<string[]>().notNull(),
698
+ canonicalMemoryId: uuid('canonical_memory_id').references(() => memories.id, { onDelete: 'cascade' }).notNull(),
699
+
700
+ // Snapshot of merged memories (for reversibility)
701
+ sourceMemoriesSnapshot: jsonb('source_memories_snapshot').$type<Record<string, unknown>[]>().notNull(),
702
+
703
+ // Merge metadata
704
+ mergeStrategy: text('merge_strategy').notNull().$type<'union' | 'latest' | 'voting' | 'custom'>(),
705
+ tokensSaved: integer('tokens_saved'), // Estimated context window savings
706
+
707
+ // Reversibility
708
+ isReversed: boolean('is_reversed').default(false),
709
+ reversedAt: timestamp('reversed_at'),
710
+ reversedBy: uuid('reversed_by'),
711
+
712
+ // Timestamps
713
+ mergedAt: timestamp('merged_at').defaultNow().notNull(),
714
+ });
715
+
716
+ /**
717
+ * Memory Hash Cache - cached hash signatures for efficient duplicate detection
718
+ */
719
+ export const memoryHashCache = pgTable('memory_hash_cache', {
720
+ memoryId: uuid('memory_id').primaryKey().references(() => memories.id, { onDelete: 'cascade' }),
721
+ projectId: uuid('project_id').references(() => projects.id, { onDelete: 'cascade' }).notNull(),
722
+
723
+ // Hash signatures
724
+ simhash: text('simhash'), // 64-bit hash as hex string
725
+ minhash: jsonb('minhash').$type<number[]>(), // Array of 128 hash values
726
+
727
+ // Metadata for cache invalidation
728
+ contentHash: text('content_hash').notNull(), // MD5/SHA of content for invalidation
729
+ lastUpdated: timestamp('last_updated').defaultNow().notNull(),
730
+ }, (table) => [
731
+ index('memory_hash_cache_project_id_idx').on(table.projectId),
732
+ index('memory_hash_cache_simhash_idx').on(table.simhash), // For Hamming distance queries
733
+ ]);
734
+
735
+ /**
736
+ * Search Traces - Stores retrieval logs for debugging and performance analysis
737
+ */
738
+ export const searchTraces = pgTable('search_traces', {
739
+ id: uuid('id').primaryKey().defaultRandom(),
740
+ sessionId: text('session_id').notNull(),
741
+ query: text('query').notNull(),
742
+ timestamp: timestamp('timestamp_at').defaultNow(),
743
+
744
+ // Search pipeline stages (JSONB for flexibility)
745
+ queryRewrite: jsonb('query_rewrite'), // { original, rewritten, method }
746
+ candidateRetrieval: jsonb('candidate_retrieval'), // { candidates, timeMs }
747
+ entityFiltering: jsonb('entity_filtering'), // { entities: string[], results: timeMs }
748
+ hybridScoring: jsonb('hybrid_scoring'), // { results, timeMs }
749
+ reranking: jsonb('reranking'), // { results, timeMs }
750
+
751
+ // Final results
752
+ resultCount: integer('result_count').default(0),
753
+ topResults: jsonb('top_results'),
754
+
755
+ // Performance metrics
756
+ totalDurationMs: integer('total_duration_ms').default(0),
757
+ metadata: jsonb('metadata'),
758
+ }, (table) => [
759
+ index('search_traces_session_idx').on(table.sessionId),
760
+ index('search_traces_timestamp_idx').on(table.timestamp),
761
+ ]);
762
+
763
+ /**
764
+ * Core Memory - Always-in-context memory (Tier 1)
765
+ * Small, persistent, always-visible memory block (< 2KB total)
766
+ */
767
+ export const coreMemory = pgTable('core_memory', {
768
+ id: uuid('id').primaryKey().defaultRandom(),
769
+ projectId: uuid('project_id').references(() => projects.id, { onDelete: 'cascade' }),
770
+ userId: uuid('user_id').references(() => users.id, { onDelete: 'set null' }),
771
+
772
+ // Core memory sections
773
+ section: text('section').notNull().$type<'persona' | 'user_info' | 'project_context' | 'working_notes'>(),
774
+ content: text('content').notNull().default(''),
775
+ sizeBytes: integer('size_bytes').default(0).notNull(),
776
+ tokensEstimate: integer('tokens_estimate').default(0).notNull(),
777
+
778
+ // Version tracking
779
+ version: integer('version').default(1).notNull(),
780
+
781
+ createdAt: timestamp('created_at').defaultNow().notNull(),
782
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
783
+ }, (table) => [
784
+ index('core_memory_project_idx').on(table.projectId),
785
+ index('core_memory_user_idx').on(table.userId),
786
+ index('core_memory_section_idx').on(table.section),
787
+ ]);
788
+
789
+ /**
790
+ * Context Sessions - Track loaded memories and context window usage
791
+ */
792
+ export const contextSessions = pgTable('context_sessions', {
793
+ id: uuid('id').primaryKey().defaultRandom(),
794
+ sessionId: text('session_id').notNull().unique(),
795
+ projectId: uuid('project_id').references(() => projects.id, { onDelete: 'cascade' }),
796
+ userId: uuid('user_id').references(() => users.id, { onDelete: 'set null' }),
797
+
798
+ // Loaded memories (paging system)
799
+ loadedMemoryIds: text('loaded_memory_ids').array().default([]),
800
+
801
+ // Token tracking
802
+ tokenBudget: integer('token_budget').default(8000).notNull(),
803
+ tokensUsed: integer('tokens_used').default(0).notNull(),
804
+ coreMemoryTokens: integer('core_memory_tokens').default(0).notNull(),
805
+ loadedMemoriesTokens: integer('loaded_memories_tokens').default(0).notNull(),
806
+
807
+ // Session metadata
808
+ metadata: jsonb('metadata').$type<Record<string, unknown>>(),
809
+
810
+ createdAt: timestamp('created_at').defaultNow().notNull(),
811
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
812
+ }, (table) => [
813
+ index('context_sessions_session_idx').on(table.sessionId),
814
+ index('context_sessions_project_idx').on(table.projectId),
815
+ index('context_sessions_created_idx').on(table.createdAt),
816
+ ]);
817
+
818
+ // Relations (Drizzle ORM)
819
+ // ============================================================================
820
+
821
+ export const usersRelations = relations(users, ({ many }) => ({
822
+ memories: many(memories),
823
+ conversations: many(conversations),
824
+ }));
825
+
826
+ export const projectsRelations = relations(projects, ({ many }) => ({
827
+ memories: many(memories),
828
+ conversations: many(conversations),
829
+ learnings: many(learnings),
830
+ entities: many(entities),
831
+ }));
832
+
833
+ export const memoriesRelations = relations(memories, ({ one }) => ({
834
+ project: one(projects, {
835
+ fields: [memories.projectId],
836
+ references: [projects.id],
837
+ }),
838
+ user: one(users, {
839
+ fields: [memories.userId],
840
+ references: [users.id],
841
+ }),
842
+ }));
843
+
844
+ export const conversationsRelations = relations(conversations, ({ one, many }) => ({
845
+ project: one(projects, {
846
+ fields: [conversations.projectId],
847
+ references: [projects.id],
848
+ }),
849
+ user: one(users, {
850
+ fields: [conversations.userId],
851
+ references: [users.id],
852
+ }),
853
+ messages: many(messages),
854
+ learnings: many(learnings),
855
+ }));
856
+
857
+ export const learningsRelations = relations(learnings, ({ one }) => ({
858
+ project: one(projects, {
859
+ fields: [learnings.projectId],
860
+ references: [projects.id],
861
+ }),
862
+ conversation: one(conversations, {
863
+ fields: [learnings.conversationId],
864
+ references: [conversations.id],
865
+ }),
866
+ memory: one(memories, {
867
+ fields: [learnings.memoryId],
868
+ references: [memories.id],
869
+ }),
870
+ }));
871
+
872
+ export const agentPreferencesRelations = relations(agentPreferences, ({ one }) => ({
873
+ project: one(projects, {
874
+ fields: [agentPreferences.projectId],
875
+ references: [projects.id],
876
+ }),
877
+ sourceMemory: one(memories, {
878
+ fields: [agentPreferences.sourceMemoryId],
879
+ references: [memories.id],
880
+ }),
881
+ }));
882
+
883
+ export const messagesRelations = relations(messages, ({ one }) => ({
884
+ conversation: one(conversations, {
885
+ fields: [messages.conversationId],
886
+ references: [conversations.id],
887
+ }),
888
+ }));
889
+
890
+ export const entitiesRelations = relations(entities, ({ one, many }) => ({
891
+ project: one(projects, {
892
+ fields: [entities.projectId],
893
+ references: [projects.id],
894
+ }),
895
+ outgoingRelations: many(entityRelations, { relationName: 'fromEntity' }),
896
+ incomingRelations: many(entityRelations, { relationName: 'toEntity' }),
897
+ }));
898
+
899
+ export const entityRelationsRelations = relations(entityRelations, ({ one }) => ({
900
+ fromEntity: one(entities, {
901
+ fields: [entityRelations.fromEntityId],
902
+ references: [entities.id],
903
+ relationName: 'fromEntity',
904
+ }),
905
+ toEntity: one(entities, {
906
+ fields: [entityRelations.toEntityId],
907
+ references: [entities.id],
908
+ relationName: 'toEntity',
909
+ }),
910
+ }));
911
+
912
+ export const memoryAssociationsRelations = relations(memoryAssociations, ({ one }) => ({
913
+ fromMemory: one(memories, {
914
+ fields: [memoryAssociations.fromMemoryId],
915
+ references: [memories.id],
916
+ relationName: 'fromAssociations',
917
+ }),
918
+ toMemory: one(memories, {
919
+ fields: [memoryAssociations.toMemoryId],
920
+ references: [memories.id],
921
+ relationName: 'toAssociations',
922
+ }),
923
+ }));
924
+
925
+ export const sessionSummariesRelations = relations(sessionSummaries, ({ one }) => ({
926
+ conversation: one(conversations, {
927
+ fields: [sessionSummaries.conversationId],
928
+ references: [conversations.id],
929
+ }),
930
+ project: one(projects, {
931
+ fields: [sessionSummaries.projectId],
932
+ references: [projects.id],
933
+ }),
934
+ }));
935
+
936
+ export const memorySnapshotsRelations = relations(memorySnapshots, ({ one }) => ({
937
+ memory: one(memories, {
938
+ fields: [memorySnapshots.memoryId],
939
+ references: [memories.id],
940
+ }),
941
+ }));
942
+
943
+ export const memoryMergeProposalsRelations = relations(memoryMergeProposals, ({ one }) => ({
944
+ project: one(projects, {
945
+ fields: [memoryMergeProposals.projectId],
946
+ references: [projects.id],
947
+ }),
948
+ user: one(users, {
949
+ fields: [memoryMergeProposals.userId],
950
+ references: [users.id],
951
+ }),
952
+ }));
953
+
954
+ export const memoryMergeHistoryRelations = relations(memoryMergeHistory, ({ one }) => ({
955
+ project: one(projects, {
956
+ fields: [memoryMergeHistory.projectId],
957
+ references: [projects.id],
958
+ }),
959
+ user: one(users, {
960
+ fields: [memoryMergeHistory.userId],
961
+ references: [users.id],
962
+ }),
963
+ canonicalMemory: one(memories, {
964
+ fields: [memoryMergeHistory.canonicalMemoryId],
965
+ references: [memories.id],
966
+ }),
967
+ proposal: one(memoryMergeProposals, {
968
+ fields: [memoryMergeHistory.proposalId],
969
+ references: [memoryMergeProposals.id],
970
+ }),
971
+ }));
972
+
973
+ export const memoryHashCacheRelations = relations(memoryHashCache, ({ one }) => ({
974
+ memory: one(memories, {
975
+ fields: [memoryHashCache.memoryId],
976
+ references: [memories.id],
977
+ }),
978
+ project: one(projects, {
979
+ fields: [memoryHashCache.projectId],
980
+ references: [projects.id],
981
+ }),
982
+ }));
983
+
984
+ // Types
985
+ // ============================================================================
986
+
987
+ export type User = typeof users.$inferSelect;
988
+ export type NewUser = typeof users.$inferInsert;
989
+
990
+ export type Project = typeof projects.$inferSelect;
991
+ export type NewProject = typeof projects.$inferInsert;
992
+
993
+ export type Memory = typeof memories.$inferSelect;
994
+ export type NewMemory = typeof memories.$inferInsert;
995
+
996
+ export type Conversation = typeof conversations.$inferSelect;
997
+ export type NewConversation = typeof conversations.$inferInsert;
998
+
999
+ export type Message = typeof messages.$inferSelect;
1000
+ export type NewMessage = typeof messages.$inferInsert;
1001
+
1002
+ export type Learning = typeof learnings.$inferSelect;
1003
+ export type NewLearning = typeof learnings.$inferInsert;
1004
+
1005
+ export type AgentPreference = typeof agentPreferences.$inferSelect;
1006
+ export type NewAgentPreference = typeof agentPreferences.$inferInsert;
1007
+
1008
+ export type Entity = typeof entities.$inferSelect;
1009
+ export type NewEntity = typeof entities.$inferInsert;
1010
+
1011
+ export type EntityRelation = typeof entityRelations.$inferSelect;
1012
+ export type NewEntityRelation = typeof entityRelations.$inferInsert;
1013
+
1014
+ export type MemoryMergeProposal = typeof memoryMergeProposals.$inferSelect;
1015
+ export type NewMemoryMergeProposal = typeof memoryMergeProposals.$inferInsert;
1016
+
1017
+ export type MemoryMergeHistory = typeof memoryMergeHistory.$inferSelect;
1018
+ export type NewMemoryMergeHistory = typeof memoryMergeHistory.$inferInsert;
1019
+
1020
+ export type MemoryHashCache = typeof memoryHashCache.$inferSelect;
1021
+ export type NewMemoryHashCache = typeof memoryHashCache.$inferInsert;
1022
+
1023
+ export type MemoryAssociation = typeof memoryAssociations.$inferSelect;
1024
+ export type NewMemoryAssociation = typeof memoryAssociations.$inferInsert;
1025
+
1026
+ export type SessionSummary = typeof sessionSummaries.$inferSelect;
1027
+ export type NewSessionSummary = typeof sessionSummaries.$inferInsert;
1028
+
1029
+
1030
+
1031
+ export type LightweightMemoryIndex = typeof lightweightMemoryIndices.$inferSelect;
1032
+ export type NewLightweightMemoryIndex = typeof lightweightMemoryIndices.$inferInsert;
1033
+
1034
+ export type ContextPagingSession = typeof contextPagingSessions.$inferSelect;
1035
+ export type MemoryEditProposal = typeof memoryEditProposals.$inferSelect;
1036
+ export type NewMemoryEditProposal = typeof memoryEditProposals.$inferInsert;
1037
+
1038
+
1039
+ export type CoreMemory = typeof coreMemory.$inferSelect;
1040
+ export type NewCoreMemory = typeof coreMemory.$inferInsert;
1041
+
1042
+ export type ContextSession = typeof contextSessions.$inferSelect;
1043
+ export type NewContextSession = typeof contextSessions.$inferInsert;
1044
+
1045
+ // Belief Systems - Derived Beliefs from Memory
1046
+ // ============================================================================
1047
+
1048
+ /**
1049
+ * Beliefs - Derived semantic beliefs extracted from memories
1050
+ * Represents inferred decisions, preferences, constraints, failure causes
1051
+ */
1052
+ export const beliefs = pgTable('beliefs', {
1053
+ id: uuid('id').primaryKey().defaultRandom(),
1054
+ projectId: uuid('project_id').references(() => projects.id, { onDelete: 'cascade' }),
1055
+
1056
+ // Belief identification
1057
+ beliefType: text('belief_type').notNull(),
1058
+ statement: text('statement').notNull(),
1059
+ normalizedKey: text('normalized_key').notNull(),
1060
+
1061
+ // Confidence and decay
1062
+ confidence: integer('confidence').default(50), // 0-100
1063
+ beliefDecayRate: integer('belief_decay_rate').default(30), // days half-life
1064
+ lastConfirmedAt: timestamp('last_confirmed_at'),
1065
+ sourceCount: integer('source_count').default(1),
1066
+
1067
+ // Status
1068
+ status: text('status').default('active'),
1069
+
1070
+ // Context and evidence
1071
+ reason: text('reason'),
1072
+ context: text('context'),
1073
+ evidenceSummary: text('evidence_summary'),
1074
+
1075
+ // Metadata (stores edges, derivation info)
1076
+ metadata: jsonb('metadata'),
1077
+
1078
+ createdAt: timestamp('created_at').defaultNow().notNull(),
1079
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
1080
+ }, (table) => [
1081
+ index('beliefs_project_idx').on(table.projectId),
1082
+ index('beliefs_type_idx').on(table.beliefType),
1083
+ index('beliefs_status_idx').on(table.status),
1084
+ index('beliefs_confidence_idx').on(table.confidence),
1085
+ index('beliefs_normalized_key_idx').on(table.normalizedKey),
1086
+ ]);
1087
+
1088
+ /**
1089
+ * Belief Memory Sources - Links beliefs to source memories
1090
+ */
1091
+ export const beliefMemorySources = pgTable('belief_memory_sources', {
1092
+ id: uuid('id').primaryKey().defaultRandom(),
1093
+ beliefId: uuid('belief_id').references(() => beliefs.id, { onDelete: 'cascade' }).notNull(),
1094
+ memoryId: uuid('memory_id').references(() => memories.id, { onDelete: 'cascade' }).notNull(),
1095
+
1096
+ createdAt: timestamp('created_at').defaultNow().notNull(),
1097
+ }, (table) => [
1098
+ index('belief_sources_belief_idx').on(table.beliefId),
1099
+ index('belief_sources_memory_idx').on(table.memoryId),
1100
+ ]);
1101
+
1102
+ /**
1103
+ * Belief Edges - Relationships between beliefs
1104
+ */
1105
+ export const beliefEdges = pgTable('belief_edges', {
1106
+ id: uuid('id').primaryKey().defaultRandom(),
1107
+ fromBeliefId: uuid('from_belief_id').references(() => beliefs.id, { onDelete: 'cascade' }).notNull(),
1108
+ toBeliefId: uuid('to_belief_id').references(() => beliefs.id, { onDelete: 'cascade' }).notNull(),
1109
+
1110
+ edgeType: text('edge_type').notNull(),
1111
+ metadata: jsonb('metadata'),
1112
+
1113
+ createdAt: timestamp('created_at').defaultNow().notNull(),
1114
+ }, (table) => [
1115
+ index('belief_edges_from_idx').on(table.fromBeliefId),
1116
+ index('belief_edges_to_idx').on(table.toBeliefId),
1117
+ ]);
1118
+
1119
+ export type BeliefType = 'decision' | 'preference' | 'failure_cause' | 'constraint' | 'state_change' | 'dispute';
1120
+ export type BeliefStatus = 'active' | 'superseded' | 'disputed';
1121
+ export type BeliefEdgeType = 'causes' | 'supports' | 'rejects' | 'supersedes' | 'depends_on';
1122
+
1123
+ export type Belief = typeof beliefs.$inferSelect;
1124
+ export type NewBelief = typeof beliefs.$inferInsert;
1125
+ export type BeliefMemorySource = typeof beliefMemorySources.$inferSelect;
1126
+ export type NewBeliefMemorySource = typeof beliefMemorySources.$inferInsert;
1127
+ export type BeliefEdge = typeof beliefEdges.$inferSelect;
1128
+ export type NewBeliefEdge = typeof beliefEdges.$inferInsert;