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
@@ -1,14 +1,43 @@
1
- import { existsSync, mkdirSync } from 'fs';
2
- import { logger } from '../core/logger.js';
3
- import { getDataDir } from '../config.js';
4
- /**
5
- * Note on boolean columns:
6
- * SQLite uses INTEGER 0/1 for boolean values (no native boolean type)
7
- * PostgreSQL uses native BOOLEAN type
8
- */
1
+ import type { Database } from 'better-sqlite3';
2
+ import type { Pool } from 'pg';
3
+ import { existsSync, mkdirSync } from 'fs';
4
+ import { logger } from '../core/logger.js';
5
+ import { getDataDir } from '../config.js';
6
+ import { runAllMigrations } from './migrations/index.js';
7
+
8
+ /**
9
+ * Note on boolean columns:
10
+ * SQLite uses INTEGER 0/1 for boolean values (no native boolean type)
11
+ * PostgreSQL uses native BOOLEAN type
12
+ */
13
+
9
14
  const sqliteSchemaSql = `
10
15
  PRAGMA foreign_keys = ON;
11
16
 
17
+ -- Schema version tracking table (v1.2.0+)
18
+ CREATE TABLE IF NOT EXISTS _schema_versions (
19
+ version TEXT PRIMARY KEY,
20
+ description TEXT NOT NULL,
21
+ applied_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
22
+ );
23
+
24
+ -- Agent preferences table (v1.2.0+) - stores accumulated agent preferences from learnings
25
+ CREATE TABLE IF NOT EXISTS agent_preferences (
26
+ id TEXT PRIMARY KEY,
27
+ project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
28
+ key TEXT NOT NULL,
29
+ value TEXT NOT NULL,
30
+ source_memory_id TEXT,
31
+ confidence REAL DEFAULT 0.5,
32
+ usage_count INTEGER DEFAULT 1,
33
+ last_updated INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
34
+ created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
35
+ UNIQUE(project_id, key)
36
+ );
37
+
38
+ CREATE INDEX IF NOT EXISTS agent_preferences_project_idx ON agent_preferences(project_id);
39
+ CREATE INDEX IF NOT EXISTS agent_preferences_key_idx ON agent_preferences(key);
40
+
12
41
  CREATE TABLE IF NOT EXISTS users (
13
42
  id TEXT PRIMARY KEY,
14
43
  external_id TEXT UNIQUE,
@@ -55,22 +84,33 @@ CREATE TABLE IF NOT EXISTS memories (
55
84
  is_merged INTEGER DEFAULT 0,
56
85
  merged_into_id TEXT,
57
86
  merged_at INTEGER,
58
- is_canonical INTEGER DEFAULT 0,
59
- merge_source_ids TEXT,
60
- is_mergeable INTEGER DEFAULT 1,
61
- merge_version INTEGER DEFAULT 1,
62
- importance_score INTEGER DEFAULT 50,
63
- importance_decay_rate INTEGER DEFAULT 30,
64
- last_importance_recalc INTEGER,
65
- consolidated_into TEXT,
66
- consolidated_at INTEGER,
67
- is_consolidated INTEGER DEFAULT 0,
68
- sector TEXT DEFAULT 'episodic',
69
- tier TEXT DEFAULT 'hot',
70
- context_status TEXT DEFAULT 'out-of-context',
71
- decay_rate INTEGER DEFAULT 30,
72
- coactivation_score INTEGER DEFAULT 0,
73
- last_decay_at INTEGER DEFAULT (strftime('%s','now')),
87
+ is_canonical INTEGER DEFAULT 0,
88
+ merge_source_ids TEXT,
89
+ is_mergeable INTEGER DEFAULT 1,
90
+ merge_version INTEGER DEFAULT 1,
91
+ namespace_id TEXT REFERENCES namespaces(id) ON DELETE SET NULL,
92
+ namespace_path TEXT,
93
+ has_l0_abstract INTEGER DEFAULT 0,
94
+ has_l1_overview INTEGER DEFAULT 0,
95
+ last_layer_update INTEGER,
96
+ importance_score INTEGER DEFAULT 50,
97
+ importance_decay_rate INTEGER DEFAULT 30,
98
+ last_importance_recalc INTEGER,
99
+ retrieval_priority INTEGER DEFAULT 50,
100
+ tokens_estimate INTEGER DEFAULT 0,
101
+ consolidated_into TEXT,
102
+ consolidated_at INTEGER,
103
+ is_consolidated INTEGER DEFAULT 0,
104
+ sector TEXT DEFAULT 'episodic',
105
+ tier TEXT DEFAULT 'hot',
106
+ status TEXT DEFAULT 'active',
107
+ encrypted_content TEXT,
108
+ encryption_nonce TEXT,
109
+ is_encrypted INTEGER DEFAULT 0,
110
+ context_status TEXT DEFAULT 'out-of-context',
111
+ decay_rate INTEGER DEFAULT 30,
112
+ coactivation_score INTEGER DEFAULT 0,
113
+ last_decay_at INTEGER DEFAULT (strftime('%s','now')),
74
114
  agent_id TEXT,
75
115
  agent_role TEXT,
76
116
  visibility_scope TEXT DEFAULT 'private',
@@ -82,11 +122,14 @@ CREATE TABLE IF NOT EXISTS memories (
82
122
  triggered_by TEXT,
83
123
  capture_reason TEXT,
84
124
  last_used_at INTEGER,
85
- usage_count INTEGER DEFAULT 0,
86
- valid_from INTEGER,
87
- valid_to INTEGER,
88
- superseded_by TEXT,
89
- version INTEGER DEFAULT 1,
125
+ usage_count INTEGER DEFAULT 0,
126
+ valid_from INTEGER,
127
+ valid_to INTEGER,
128
+ recorded_at INTEGER DEFAULT (strftime('%s','now')),
129
+ superseded_by TEXT,
130
+ version INTEGER DEFAULT 1,
131
+ place_id TEXT,
132
+ place_sort_order INTEGER DEFAULT 0,
90
133
  created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
91
134
  updated_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
92
135
  );
@@ -168,6 +211,7 @@ CREATE TABLE IF NOT EXISTS learnings (
168
211
  relevance_score INTEGER DEFAULT 50,
169
212
  category TEXT,
170
213
  importance INTEGER DEFAULT 50,
214
+ confidence INTEGER DEFAULT 50,
171
215
  metadata TEXT,
172
216
  is_imported INTEGER DEFAULT 0,
173
217
  -- UAM: Agent integration columns
@@ -180,7 +224,7 @@ CREATE TABLE IF NOT EXISTS learnings (
180
224
  CREATE INDEX IF NOT EXISTS learnings_project_idx ON learnings(project_id);
181
225
  CREATE INDEX IF NOT EXISTS learnings_type_idx ON learnings(type);
182
226
  CREATE INDEX IF NOT EXISTS learnings_action_idx ON learnings(action);
183
- CREATE INDEX IF NOT EXISTS observations_created_idx ON observations(created_at);
227
+ CREATE INDEX IF NOT EXISTS learnings_created_idx ON learnings(created_at);
184
228
 
185
229
  CREATE TABLE IF NOT EXISTS entities (
186
230
  id TEXT PRIMARY KEY,
@@ -393,7 +437,7 @@ CREATE TABLE IF NOT EXISTS places (
393
437
  name TEXT NOT NULL,
394
438
  place_type TEXT NOT NULL,
395
439
  parent_id TEXT REFERENCES places(id) ON DELETE SET NULL,
396
- loci_index INTEGER DEFAULT 0,
440
+ sort_order INTEGER DEFAULT 0,
397
441
  position_x INTEGER DEFAULT 0,
398
442
  position_y INTEGER DEFAULT 0,
399
443
  description TEXT,
@@ -405,13 +449,14 @@ CREATE TABLE IF NOT EXISTS places (
405
449
  CREATE INDEX IF NOT EXISTS places_project_idx ON places(project_id);
406
450
  CREATE INDEX IF NOT EXISTS places_type_idx ON places(place_type);
407
451
  CREATE INDEX IF NOT EXISTS places_parent_idx ON places(parent_id);
408
- CREATE INDEX IF NOT EXISTS places_loci_idx ON places(project_id, loci_index);
452
+ CREATE INDEX IF NOT EXISTS places_sort_order_idx ON places(project_id, sort_order);
409
453
 
410
454
  -- Memory-Place assignments
411
455
  CREATE TABLE IF NOT EXISTS memory_places (
412
456
  id TEXT PRIMARY KEY,
413
457
  memory_id TEXT REFERENCES memories(id) ON DELETE CASCADE NOT NULL,
414
458
  place_id TEXT REFERENCES places(id) ON DELETE CASCADE NOT NULL,
459
+ place_sort_order INTEGER DEFAULT 0,
415
460
  is_manual INTEGER DEFAULT 0,
416
461
  rule_id TEXT,
417
462
  created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
@@ -436,12 +481,76 @@ CREATE TABLE IF NOT EXISTS place_rules (
436
481
  );
437
482
  CREATE INDEX IF NOT EXISTS place_rules_project_idx ON place_rules(project_id);
438
483
  CREATE INDEX IF NOT EXISTS place_rules_type_idx ON place_rules(place_type);
439
- `;
440
- const postgresStatements = [
441
- `CREATE EXTENSION IF NOT EXISTS pgcrypto;`,
442
- `CREATE EXTENSION IF NOT EXISTS vector;`,
443
- `CREATE EXTENSION IF NOT EXISTS pg_trgm;`,
444
- `CREATE TABLE IF NOT EXISTS users (
484
+ -- session_summaries table
485
+ CREATE TABLE IF NOT EXISTS session_summaries (
486
+ id TEXT PRIMARY KEY,
487
+ conversation_id TEXT REFERENCES conversations(id) ON DELETE CASCADE NOT NULL,
488
+ project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
489
+ summary_type TEXT NOT NULL,
490
+ content TEXT NOT NULL,
491
+ compressed_from INTEGER,
492
+ tokens_saved INTEGER,
493
+ embedding BLOB,
494
+ created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
495
+ );
496
+ CREATE INDEX IF NOT EXISTS session_summaries_conversation_idx ON session_summaries(conversation_id);
497
+ CREATE INDEX IF NOT EXISTS session_summaries_project_idx ON session_summaries(project_id);
498
+ CREATE INDEX IF NOT EXISTS session_summaries_type_idx ON session_summaries(summary_type);
499
+ CREATE INDEX IF NOT EXISTS session_summaries_created_idx ON session_summaries(created_at);
500
+
501
+ -- Belief Systems - Derived Beliefs from Memory (v1.3.0+)
502
+ CREATE TABLE IF NOT EXISTS beliefs (
503
+ id TEXT PRIMARY KEY,
504
+ project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
505
+ belief_type TEXT NOT NULL,
506
+ statement TEXT NOT NULL,
507
+ normalized_key TEXT NOT NULL,
508
+ confidence REAL DEFAULT 0.5,
509
+ belief_decay_rate INTEGER DEFAULT 30,
510
+ last_confirmed_at INTEGER,
511
+ source_count INTEGER DEFAULT 1,
512
+ status TEXT DEFAULT 'active',
513
+ reason TEXT,
514
+ context TEXT,
515
+ evidence_summary TEXT,
516
+ metadata TEXT,
517
+ created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
518
+ updated_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
519
+ UNIQUE(project_id, normalized_key)
520
+ );
521
+ CREATE INDEX IF NOT EXISTS beliefs_project_idx ON beliefs(project_id);
522
+ CREATE INDEX IF NOT EXISTS beliefs_type_idx ON beliefs(belief_type);
523
+ CREATE INDEX IF NOT EXISTS beliefs_status_idx ON beliefs(status);
524
+ CREATE INDEX IF NOT EXISTS beliefs_confidence_idx ON beliefs(confidence);
525
+
526
+ CREATE TABLE IF NOT EXISTS belief_memory_sources (
527
+ id TEXT PRIMARY KEY,
528
+ belief_id TEXT REFERENCES beliefs(id) ON DELETE CASCADE,
529
+ memory_id TEXT REFERENCES memories(id) ON DELETE CASCADE,
530
+ created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
531
+ UNIQUE(belief_id, memory_id)
532
+ );
533
+ CREATE INDEX IF NOT EXISTS belief_sources_belief_idx ON belief_memory_sources(belief_id);
534
+ CREATE INDEX IF NOT EXISTS belief_sources_memory_idx ON belief_memory_sources(memory_id);
535
+
536
+ CREATE TABLE IF NOT EXISTS belief_edges (
537
+ id TEXT PRIMARY KEY,
538
+ from_belief_id TEXT REFERENCES beliefs(id) ON DELETE CASCADE,
539
+ to_belief_id TEXT REFERENCES beliefs(id) ON DELETE CASCADE,
540
+ edge_type TEXT NOT NULL,
541
+ metadata TEXT,
542
+ created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
543
+ UNIQUE(from_belief_id, to_belief_id, edge_type)
544
+ );
545
+ CREATE INDEX IF NOT EXISTS belief_edges_from_idx ON belief_edges(from_belief_id);
546
+ CREATE INDEX IF NOT EXISTS belief_edges_to_idx ON belief_edges(to_belief_id);
547
+ `;
548
+
549
+ const postgresStatements = [
550
+ `CREATE EXTENSION IF NOT EXISTS pgcrypto;`,
551
+ `CREATE EXTENSION IF NOT EXISTS vector;`,
552
+ `CREATE EXTENSION IF NOT EXISTS pg_trgm;`,
553
+ `CREATE TABLE IF NOT EXISTS users (
445
554
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
446
555
  external_id TEXT UNIQUE,
447
556
  name TEXT,
@@ -449,8 +558,8 @@ const postgresStatements = [
449
558
  preferences JSONB,
450
559
  created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
451
560
  updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
452
- );`,
453
- `CREATE TABLE IF NOT EXISTS projects (
561
+ );`,
562
+ `CREATE TABLE IF NOT EXISTS projects (
454
563
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
455
564
  name TEXT NOT NULL,
456
565
  path TEXT NOT NULL,
@@ -458,9 +567,9 @@ const postgresStatements = [
458
567
  metadata JSONB,
459
568
  created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
460
569
  updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
461
- );`,
462
- `CREATE INDEX IF NOT EXISTS projects_path_idx ON projects(path);`,
463
- `CREATE TABLE IF NOT EXISTS memories (
570
+ );`,
571
+ `CREATE INDEX IF NOT EXISTS projects_path_idx ON projects(path);`,
572
+ `CREATE TABLE IF NOT EXISTS memories (
464
573
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
465
574
  project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
466
575
  user_id UUID REFERENCES users(id) ON DELETE SET NULL,
@@ -521,13 +630,13 @@ const postgresStatements = [
521
630
  last_accessed_at TIMESTAMPTZ,
522
631
  created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
523
632
  updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
524
- );`,
525
- `CREATE INDEX IF NOT EXISTS memories_project_idx ON memories(project_id);`,
526
- `CREATE INDEX IF NOT EXISTS memories_type_idx ON memories(type);`,
527
- `CREATE INDEX IF NOT EXISTS memories_created_idx ON memories(created_at);`,
528
- `CREATE INDEX IF NOT EXISTS memories_tags_idx ON memories USING GIN(tags);`,
529
- `CREATE INDEX IF NOT EXISTS memories_content_trgm_idx ON memories USING GIN (content gin_trgm_ops);`,
530
- `CREATE TABLE IF NOT EXISTS conversations (
633
+ );`,
634
+ `CREATE INDEX IF NOT EXISTS memories_project_idx ON memories(project_id);`,
635
+ `CREATE INDEX IF NOT EXISTS memories_type_idx ON memories(type);`,
636
+ `CREATE INDEX IF NOT EXISTS memories_created_idx ON memories(created_at);`,
637
+ `CREATE INDEX IF NOT EXISTS memories_tags_idx ON memories USING GIN(tags);`,
638
+ `CREATE INDEX IF NOT EXISTS memories_content_trgm_idx ON memories USING GIN (content gin_trgm_ops);`,
639
+ `CREATE TABLE IF NOT EXISTS conversations (
531
640
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
532
641
  project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
533
642
  user_id UUID REFERENCES users(id) ON DELETE SET NULL,
@@ -541,11 +650,11 @@ const postgresStatements = [
541
650
  metadata JSONB,
542
651
  created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
543
652
  updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
544
- );`,
545
- `CREATE INDEX IF NOT EXISTS conversations_project_idx ON conversations(project_id);`,
546
- `CREATE INDEX IF NOT EXISTS conversations_session_idx ON conversations(session_id);`,
547
- `CREATE INDEX IF NOT EXISTS conversations_started_idx ON conversations(started_at);`,
548
- `CREATE TABLE IF NOT EXISTS messages (
653
+ );`,
654
+ `CREATE INDEX IF NOT EXISTS conversations_project_idx ON conversations(project_id);`,
655
+ `CREATE INDEX IF NOT EXISTS conversations_session_idx ON conversations(session_id);`,
656
+ `CREATE INDEX IF NOT EXISTS conversations_started_idx ON conversations(started_at);`,
657
+ `CREATE TABLE IF NOT EXISTS messages (
549
658
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
550
659
  conversation_id UUID NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
551
660
  role TEXT NOT NULL,
@@ -555,13 +664,13 @@ const postgresStatements = [
555
664
  tool_calls JSONB,
556
665
  metadata JSONB,
557
666
  created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
558
- );`,
559
- `CREATE INDEX IF NOT EXISTS messages_conversation_idx ON messages(conversation_id);`,
560
- `CREATE INDEX IF NOT EXISTS messages_role_idx ON messages(role);`,
561
- `CREATE INDEX IF NOT EXISTS messages_created_idx ON messages(created_at);`,
562
- `CREATE INDEX IF NOT EXISTS messages_content_trgm_idx ON messages USING GIN (content gin_trgm_ops);`,
563
- // Learnings table (renamed from observations)
564
- `CREATE TABLE IF NOT EXISTS learnings (
667
+ );`,
668
+ `CREATE INDEX IF NOT EXISTS messages_conversation_idx ON messages(conversation_id);`,
669
+ `CREATE INDEX IF NOT EXISTS messages_role_idx ON messages(role);`,
670
+ `CREATE INDEX IF NOT EXISTS messages_created_idx ON messages(created_at);`,
671
+ `CREATE INDEX IF NOT EXISTS messages_content_trgm_idx ON messages USING GIN (content gin_trgm_ops);`,
672
+ // Learnings table (renamed from observations)
673
+ `CREATE TABLE IF NOT EXISTS learnings (
565
674
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
566
675
  project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
567
676
  conversation_id UUID REFERENCES conversations(id) ON DELETE SET NULL,
@@ -574,6 +683,7 @@ const postgresStatements = [
574
683
  memory_id UUID REFERENCES memories(id) ON DELETE SET NULL,
575
684
  category TEXT,
576
685
  importance INTEGER DEFAULT 50,
686
+ confidence INTEGER DEFAULT 50,
577
687
  metadata JSONB,
578
688
  is_imported BOOLEAN DEFAULT FALSE,
579
689
  -- UAM: Agent integration columns
@@ -581,11 +691,11 @@ const postgresStatements = [
581
691
  tool_name TEXT,
582
692
  session_id TEXT,
583
693
  created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
584
- );`,
585
- `CREATE INDEX IF NOT EXISTS learnings_project_idx ON learnings(project_id);`,
586
- `CREATE INDEX IF NOT EXISTS learnings_type_idx ON learnings(type);`,
587
- `CREATE INDEX IF NOT EXISTS learnings_action_idx ON learnings(action);`,
588
- `CREATE TABLE IF NOT EXISTS entities (
694
+ );`,
695
+ `CREATE INDEX IF NOT EXISTS learnings_project_idx ON learnings(project_id);`,
696
+ `CREATE INDEX IF NOT EXISTS learnings_type_idx ON learnings(type);`,
697
+ `CREATE INDEX IF NOT EXISTS learnings_action_idx ON learnings(action);`,
698
+ `CREATE TABLE IF NOT EXISTS entities (
589
699
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
590
700
  project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
591
701
  name TEXT NOT NULL,
@@ -595,11 +705,11 @@ const postgresStatements = [
595
705
  properties JSONB,
596
706
  created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
597
707
  updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
598
- );`,
599
- `CREATE INDEX IF NOT EXISTS entities_project_idx ON entities(project_id);`,
600
- `CREATE INDEX IF NOT EXISTS entities_type_idx ON entities(type);`,
601
- `CREATE INDEX IF NOT EXISTS entities_name_idx ON entities(name);`,
602
- `CREATE TABLE IF NOT EXISTS entity_relations (
708
+ );`,
709
+ `CREATE INDEX IF NOT EXISTS entities_project_idx ON entities(project_id);`,
710
+ `CREATE INDEX IF NOT EXISTS entities_type_idx ON entities(type);`,
711
+ `CREATE INDEX IF NOT EXISTS entities_name_idx ON entities(name);`,
712
+ `CREATE TABLE IF NOT EXISTS entity_relations (
603
713
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
604
714
  from_entity_id UUID NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
605
715
  to_entity_id UUID NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
@@ -607,11 +717,11 @@ const postgresStatements = [
607
717
  weight INTEGER DEFAULT 1,
608
718
  properties JSONB,
609
719
  created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
610
- );`,
611
- `CREATE INDEX IF NOT EXISTS relations_from_idx ON entity_relations(from_entity_id);`,
612
- `CREATE INDEX IF NOT EXISTS relations_to_idx ON entity_relations(to_entity_id);`,
613
- `CREATE INDEX IF NOT EXISTS relations_type_idx ON entity_relations(type);`,
614
- `CREATE TABLE IF NOT EXISTS core_memory (
720
+ );`,
721
+ `CREATE INDEX IF NOT EXISTS relations_from_idx ON entity_relations(from_entity_id);`,
722
+ `CREATE INDEX IF NOT EXISTS relations_to_idx ON entity_relations(to_entity_id);`,
723
+ `CREATE INDEX IF NOT EXISTS relations_type_idx ON entity_relations(type);`,
724
+ `CREATE TABLE IF NOT EXISTS core_memory (
615
725
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
616
726
  project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
617
727
  user_id UUID REFERENCES users(id) ON DELETE SET NULL,
@@ -621,11 +731,11 @@ const postgresStatements = [
621
731
  version INTEGER DEFAULT 1 NOT NULL,
622
732
  created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
623
733
  updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
624
- );`,
625
- `CREATE INDEX IF NOT EXISTS core_memory_project_idx ON core_memory(project_id);`,
626
- `CREATE INDEX IF NOT EXISTS core_memory_user_idx ON core_memory(user_id);`,
627
- `CREATE INDEX IF NOT EXISTS core_memory_section_idx ON core_memory(section);`,
628
- `CREATE TABLE IF NOT EXISTS context_sessions (
734
+ );`,
735
+ `CREATE INDEX IF NOT EXISTS core_memory_project_idx ON core_memory(project_id);`,
736
+ `CREATE INDEX IF NOT EXISTS core_memory_user_idx ON core_memory(user_id);`,
737
+ `CREATE INDEX IF NOT EXISTS core_memory_section_idx ON core_memory(section);`,
738
+ `CREATE TABLE IF NOT EXISTS context_sessions (
629
739
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
630
740
  session_id TEXT NOT NULL UNIQUE,
631
741
  project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
@@ -638,11 +748,11 @@ const postgresStatements = [
638
748
  metadata JSONB,
639
749
  created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
640
750
  updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
641
- );`,
642
- `CREATE INDEX IF NOT EXISTS context_sessions_session_idx ON context_sessions(session_id);`,
643
- `CREATE INDEX IF NOT EXISTS context_sessions_project_idx ON context_sessions(project_id);`,
644
- `CREATE INDEX IF NOT EXISTS context_sessions_created_idx ON context_sessions(created_at);`,
645
- `CREATE TABLE IF NOT EXISTS memory_merge_proposals (
751
+ );`,
752
+ `CREATE INDEX IF NOT EXISTS context_sessions_session_idx ON context_sessions(session_id);`,
753
+ `CREATE INDEX IF NOT EXISTS context_sessions_project_idx ON context_sessions(project_id);`,
754
+ `CREATE INDEX IF NOT EXISTS context_sessions_created_idx ON context_sessions(created_at);`,
755
+ `CREATE TABLE IF NOT EXISTS memory_merge_proposals (
646
756
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
647
757
  project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
648
758
  user_id UUID REFERENCES users(id) ON DELETE SET NULL,
@@ -661,10 +771,10 @@ const postgresStatements = [
661
771
  review_notes TEXT,
662
772
  created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
663
773
  expires_at TIMESTAMPTZ
664
- );`,
665
- `CREATE INDEX IF NOT EXISTS memory_merge_proposals_project_status_idx ON memory_merge_proposals(project_id, status);`,
666
- `CREATE INDEX IF NOT EXISTS memory_merge_proposals_created_at_idx ON memory_merge_proposals(created_at);`,
667
- `CREATE TABLE IF NOT EXISTS memory_merge_history (
774
+ );`,
775
+ `CREATE INDEX IF NOT EXISTS memory_merge_proposals_project_status_idx ON memory_merge_proposals(project_id, status);`,
776
+ `CREATE INDEX IF NOT EXISTS memory_merge_proposals_created_at_idx ON memory_merge_proposals(created_at);`,
777
+ `CREATE TABLE IF NOT EXISTS memory_merge_history (
668
778
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
669
779
  project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
670
780
  user_id UUID REFERENCES users(id) ON DELETE SET NULL,
@@ -678,19 +788,19 @@ const postgresStatements = [
678
788
  reversed_at TIMESTAMPTZ,
679
789
  reversed_by UUID,
680
790
  merged_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
681
- );`,
682
- `CREATE TABLE IF NOT EXISTS memory_hash_cache (
791
+ );`,
792
+ `CREATE TABLE IF NOT EXISTS memory_hash_cache (
683
793
  memory_id UUID PRIMARY KEY REFERENCES memories(id) ON DELETE CASCADE,
684
794
  project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
685
795
  simhash TEXT,
686
796
  minhash TEXT,
687
797
  content_hash TEXT NOT NULL,
688
798
  last_updated TIMESTAMPTZ DEFAULT NOW() NOT NULL
689
- );`,
690
- `CREATE INDEX IF NOT EXISTS memory_hash_cache_project_id_idx ON memory_hash_cache(project_id);`,
691
- `CREATE INDEX IF NOT EXISTS memory_hash_cache_simhash_idx ON memory_hash_cache(simhash);`,
692
- // memory_associations table (v1.1.0+)
693
- `CREATE TABLE IF NOT EXISTS memory_associations (
799
+ );`,
800
+ `CREATE INDEX IF NOT EXISTS memory_hash_cache_project_id_idx ON memory_hash_cache(project_id);`,
801
+ `CREATE INDEX IF NOT EXISTS memory_hash_cache_simhash_idx ON memory_hash_cache(simhash);`,
802
+ // memory_associations table (v1.1.0+)
803
+ `CREATE TABLE IF NOT EXISTS memory_associations (
694
804
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
695
805
  from_memory_id UUID NOT NULL REFERENCES memories(id) ON DELETE CASCADE,
696
806
  to_memory_id UUID NOT NULL REFERENCES memories(id) ON DELETE CASCADE,
@@ -701,10 +811,10 @@ const postgresStatements = [
701
811
  last_coactivated_at TIMESTAMPTZ,
702
812
  created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
703
813
  UNIQUE(from_memory_id, to_memory_id)
704
- );`,
705
- `CREATE INDEX IF NOT EXISTS associations_graph_traversal_idx ON memory_associations(from_memory_id, to_memory_id, weight, association_type);`,
706
- // namespaces table
707
- `CREATE TABLE IF NOT EXISTS namespaces (
814
+ );`,
815
+ `CREATE INDEX IF NOT EXISTS associations_graph_traversal_idx ON memory_associations(from_memory_id, to_memory_id, weight, association_type);`,
816
+ // namespaces table
817
+ `CREATE TABLE IF NOT EXISTS namespaces (
708
818
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
709
819
  project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
710
820
  name TEXT NOT NULL,
@@ -714,11 +824,11 @@ const postgresStatements = [
714
824
  metadata TEXT,
715
825
  created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
716
826
  updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
717
- );`,
718
- `CREATE INDEX IF NOT EXISTS namespaces_project_idx ON namespaces(project_id);`,
719
- `CREATE INDEX IF NOT EXISTS namespaces_parent_idx ON namespaces(parent_id);`,
720
- // maintenance_jobs table
721
- `CREATE TABLE IF NOT EXISTS maintenance_jobs (
827
+ );`,
828
+ `CREATE INDEX IF NOT EXISTS namespaces_project_idx ON namespaces(project_id);`,
829
+ `CREATE INDEX IF NOT EXISTS namespaces_parent_idx ON namespaces(parent_id);`,
830
+ // maintenance_jobs table
831
+ `CREATE TABLE IF NOT EXISTS maintenance_jobs (
722
832
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
723
833
  project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
724
834
  job_name TEXT NOT NULL,
@@ -738,19 +848,19 @@ const postgresStatements = [
738
848
  job_config TEXT,
739
849
  created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
740
850
  updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
741
- );`,
742
- `CREATE INDEX IF NOT EXISTS maintenance_jobs_name_idx ON maintenance_jobs(job_name);`,
743
- `CREATE INDEX IF NOT EXISTS maintenance_jobs_next_run_idx ON maintenance_jobs(next_run_at);`,
744
- `CREATE INDEX IF NOT EXISTS maintenance_jobs_type_idx ON maintenance_jobs(job_type);`,
745
- `CREATE INDEX IF NOT EXISTS maintenance_jobs_enabled_idx ON maintenance_jobs(enabled);`,
746
- // places table (v1.1.5) - Spatial memory organization
747
- `CREATE TABLE IF NOT EXISTS places (
851
+ );`,
852
+ `CREATE INDEX IF NOT EXISTS maintenance_jobs_name_idx ON maintenance_jobs(job_name);`,
853
+ `CREATE INDEX IF NOT EXISTS maintenance_jobs_next_run_idx ON maintenance_jobs(next_run_at);`,
854
+ `CREATE INDEX IF NOT EXISTS maintenance_jobs_type_idx ON maintenance_jobs(job_type);`,
855
+ `CREATE INDEX IF NOT EXISTS maintenance_jobs_enabled_idx ON maintenance_jobs(enabled);`,
856
+ // places table (v1.1.5) - Spatial memory organization
857
+ `CREATE TABLE IF NOT EXISTS places (
748
858
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
749
859
  project_id UUID REFERENCES projects(id) ON DELETE CASCADE NOT NULL,
750
860
  name TEXT NOT NULL,
751
861
  place_type TEXT NOT NULL,
752
862
  parent_id UUID REFERENCES places(id) ON DELETE SET NULL,
753
- loci_index INTEGER DEFAULT 0,
863
+ sort_order INTEGER DEFAULT 0,
754
864
  position_x INTEGER DEFAULT 0,
755
865
  position_y INTEGER DEFAULT 0,
756
866
  description TEXT,
@@ -758,24 +868,24 @@ const postgresStatements = [
758
868
  memory_count INTEGER DEFAULT 0,
759
869
  created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
760
870
  updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
761
- );`,
762
- `CREATE INDEX IF NOT EXISTS places_project_idx ON places(project_id);`,
763
- `CREATE INDEX IF NOT EXISTS places_type_idx ON places(place_type);`,
764
- `CREATE INDEX IF NOT EXISTS places_parent_idx ON places(parent_id);`,
765
- `CREATE INDEX IF NOT EXISTS places_loci_idx ON places(project_id, loci_index);`,
766
- // memory_places table
767
- `CREATE TABLE IF NOT EXISTS memory_places (
871
+ );`,
872
+ `CREATE INDEX IF NOT EXISTS places_project_idx ON places(project_id);`,
873
+ `CREATE INDEX IF NOT EXISTS places_type_idx ON places(place_type);`,
874
+ `CREATE INDEX IF NOT EXISTS places_parent_idx ON places(parent_id);`,
875
+ `CREATE INDEX IF NOT EXISTS places_sort_order_idx ON places(project_id, sort_order);`,
876
+ // memory_places table
877
+ `CREATE TABLE IF NOT EXISTS memory_places (
768
878
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
769
879
  memory_id UUID REFERENCES memories(id) ON DELETE CASCADE NOT NULL,
770
880
  place_id UUID REFERENCES places(id) ON DELETE CASCADE NOT NULL,
771
881
  is_manual BOOLEAN DEFAULT FALSE,
772
882
  rule_id UUID,
773
883
  created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
774
- );`,
775
- `CREATE INDEX IF NOT EXISTS memory_places_memory_idx ON memory_places(memory_id);`,
776
- `CREATE INDEX IF NOT EXISTS memory_places_place_idx ON memory_places(place_id);`,
777
- // place_rules table
778
- `CREATE TABLE IF NOT EXISTS place_rules (
884
+ );`,
885
+ `CREATE INDEX IF NOT EXISTS memory_places_memory_idx ON memory_places(memory_id);`,
886
+ `CREATE INDEX IF NOT EXISTS memory_places_place_idx ON memory_places(place_id);`,
887
+ // place_rules table
888
+ `CREATE TABLE IF NOT EXISTS place_rules (
779
889
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
780
890
  project_id UUID REFERENCES projects(id) ON DELETE CASCADE NOT NULL,
781
891
  name TEXT NOT NULL,
@@ -788,298 +898,158 @@ const postgresStatements = [
788
898
  enabled BOOLEAN DEFAULT TRUE,
789
899
  created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
790
900
  updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
791
- );`,
792
- `CREATE INDEX IF NOT EXISTS place_rules_project_idx ON place_rules(project_id);`,
793
- `CREATE INDEX IF NOT EXISTS place_rules_type_idx ON place_rules(place_type);`
794
- ];
795
- /**
796
- * Ensure the data directory exists (.squish folder in project root)
797
- */
798
- export async function ensureDataDirectory() {
799
- try {
800
- const dataDir = getDataDir();
801
- if (!existsSync(dataDir)) {
802
- mkdirSync(dataDir, { recursive: true });
803
- logger.info(`Created data directory at: ${dataDir}`);
804
- }
805
- }
806
- catch (error) {
807
- logger.error('Failed to create data directory', error);
808
- throw new Error(`Failed to initialize data directory: ${error instanceof Error ? error.message : 'Unknown error'}`);
809
- }
810
- }
811
- export async function ensureSqliteSchema(sqlite) {
812
- // Run schema creation FIRST (creates tables with latest schema)
813
- sqlite.exec(sqliteSchemaSql);
814
- // Run migrations AFTER (for existing databases that need column additions)
815
- await runSqliteMigrations(sqlite);
901
+ );`,
902
+ `CREATE INDEX IF NOT EXISTS place_rules_project_idx ON place_rules(project_id);`,
903
+ `CREATE INDEX IF NOT EXISTS place_rules_type_idx ON place_rules(place_type);`,
904
+ // Belief Systems - Derived Beliefs from Memory (v1.3.0+)
905
+ `CREATE TABLE IF NOT EXISTS beliefs (
906
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
907
+ project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
908
+ belief_type TEXT NOT NULL,
909
+ statement TEXT NOT NULL,
910
+ normalized_key TEXT NOT NULL,
911
+ confidence REAL DEFAULT 0.5,
912
+ belief_decay_rate INTEGER DEFAULT 30,
913
+ last_confirmed_at TIMESTAMPTZ,
914
+ source_count INTEGER DEFAULT 1,
915
+ status TEXT DEFAULT 'active',
916
+ reason TEXT,
917
+ context TEXT,
918
+ evidence_summary TEXT,
919
+ metadata JSONB,
920
+ created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
921
+ updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
922
+ UNIQUE(project_id, normalized_key)
923
+ );`,
924
+ `CREATE INDEX IF NOT EXISTS beliefs_project_idx ON beliefs(project_id);`,
925
+ `CREATE INDEX IF NOT EXISTS beliefs_type_idx ON beliefs(belief_type);`,
926
+ `CREATE INDEX IF NOT EXISTS beliefs_status_idx ON beliefs(status);`,
927
+ `CREATE INDEX IF NOT EXISTS beliefs_confidence_idx ON beliefs(confidence);`,
928
+ `CREATE TABLE IF NOT EXISTS belief_memory_sources (
929
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
930
+ belief_id UUID REFERENCES beliefs(id) ON DELETE CASCADE,
931
+ memory_id UUID REFERENCES memories(id) ON DELETE CASCADE,
932
+ created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
933
+ UNIQUE(belief_id, memory_id)
934
+ );`,
935
+ `CREATE INDEX IF NOT EXISTS belief_sources_belief_idx ON belief_memory_sources(belief_id);`,
936
+ `CREATE INDEX IF NOT EXISTS belief_sources_memory_idx ON belief_memory_sources(memory_id);`,
937
+ `CREATE TABLE IF NOT EXISTS belief_edges (
938
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
939
+ from_belief_id UUID REFERENCES beliefs(id) ON DELETE CASCADE,
940
+ to_belief_id UUID REFERENCES beliefs(id) ON DELETE CASCADE,
941
+ edge_type TEXT NOT NULL,
942
+ metadata JSONB,
943
+ created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
944
+ UNIQUE(from_belief_id, to_belief_id, edge_type)
945
+ );`,
946
+ `CREATE INDEX IF NOT EXISTS belief_edges_from_idx ON belief_edges(from_belief_id);`,
947
+ `CREATE INDEX IF NOT EXISTS belief_edges_to_idx ON belief_edges(to_belief_id);`
948
+ ];
949
+
950
+ /**
951
+ * Ensure the data directory exists (.squish folder in project root)
952
+ */
953
+ export async function ensureDataDirectory(): Promise<void> {
954
+ try {
955
+ const dataDir = getDataDir();
956
+ if (!existsSync(dataDir)) {
957
+ mkdirSync(dataDir, { recursive: true });
958
+ logger.info(`Created data directory at: ${dataDir}`);
959
+ }
960
+ } catch (error) {
961
+ logger.error('Failed to create data directory', error);
962
+ throw new Error(`Failed to initialize data directory: ${error instanceof Error ? error.message : 'Unknown error'}`);
963
+ }
964
+ }
965
+
966
+ export async function ensureSqliteSchema(sqlite: Database): Promise<void> {
967
+ // Run schema creation FIRST (creates tables with latest schema).
968
+ // Older installs may fail partway through when later indexes/triggers refer
969
+ // to columns that migrations have not added yet, so tolerate that first pass.
970
+ execSqliteSchema(sqlite, { tolerant: true });
971
+
972
+ // Initialize schema version tracking
973
+ await initializeSchemaVersionTable(sqlite);
974
+
975
+ // Run migrations AFTER (for existing databases that need column additions)
976
+ await runSqliteMigrations(sqlite);
977
+
978
+ // Replay the full schema after migrations so deferred indexes/triggers land.
979
+ execSqliteSchema(sqlite, { tolerant: false });
816
980
  }
817
- async function runSqliteMigrations(sqlite) {
818
- // Check if memories table exists
819
- const tableCheck = sqlite.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='memories'").get();
820
- if (!tableCheck) {
821
- // Table doesn't exist yet - it will be created by schema SQL with all columns
822
- // No migrations needed
823
- return;
824
- }
825
- // Migrations for memories table (deduplicated, ordered by version)
826
- const memoriesMigrations = [
827
- // Base columns (v0.1.x - v0.5.x)
828
- { col: 'embedding', sql: 'ALTER TABLE memories ADD COLUMN embedding BLOB' },
829
- { col: 'relevance_score', sql: 'ALTER TABLE memories ADD COLUMN relevance_score INTEGER DEFAULT 50' },
830
- // Merge tracking (v0.6.x)
831
- { col: 'is_merged', sql: 'ALTER TABLE memories ADD COLUMN is_merged INTEGER DEFAULT 0' },
832
- { col: 'merged_into_id', sql: 'ALTER TABLE memories ADD COLUMN merged_into_id TEXT' },
833
- { col: 'is_mergeable', sql: 'ALTER TABLE memories ADD COLUMN is_mergeable INTEGER DEFAULT 1' },
834
- { col: 'is_canonical', sql: 'ALTER TABLE memories ADD COLUMN is_canonical INTEGER DEFAULT 0' },
835
- { col: 'merged_at', sql: 'ALTER TABLE memories ADD COLUMN merged_at INTEGER' },
836
- { col: 'merge_source_ids', sql: 'ALTER TABLE memories ADD COLUMN merge_source_ids TEXT' },
837
- { col: 'merge_version', sql: 'ALTER TABLE memories ADD COLUMN merge_version INTEGER DEFAULT 1' },
838
- // Importance scoring (v0.8.0)
839
- { col: 'importance_score', sql: 'ALTER TABLE memories ADD COLUMN importance_score INTEGER DEFAULT 50' },
840
- { col: 'importance_decay_rate', sql: 'ALTER TABLE memories ADD COLUMN importance_decay_rate INTEGER DEFAULT 30' },
841
- { col: 'last_importance_recalc', sql: 'ALTER TABLE memories ADD COLUMN last_importance_recalc INTEGER' },
842
- // Consolidation (v0.8.0)
843
- { col: 'consolidated_into', sql: 'ALTER TABLE memories ADD COLUMN consolidated_into TEXT' },
844
- { col: 'consolidated_at', sql: 'ALTER TABLE memories ADD COLUMN consolidated_at INTEGER' },
845
- { col: 'is_consolidated', sql: 'ALTER TABLE memories ADD COLUMN is_consolidated INTEGER DEFAULT 0' },
846
- // Memory lifecycle (v0.8.0)
847
- { col: 'sector', sql: 'ALTER TABLE memories ADD COLUMN sector TEXT DEFAULT "episodic"' },
848
- { col: 'tier', sql: 'ALTER TABLE memories ADD COLUMN tier TEXT DEFAULT "hot"' },
849
- { col: 'context_status', sql: 'ALTER TABLE memories ADD COLUMN context_status TEXT DEFAULT "out-of-context"' },
850
- { col: 'decay_rate', sql: 'ALTER TABLE memories ADD COLUMN decay_rate INTEGER DEFAULT 30' },
851
- { col: 'coactivation_score', sql: 'ALTER TABLE memories ADD COLUMN coactivation_score INTEGER DEFAULT 0' },
852
- { col: 'last_decay_at', sql: 'ALTER TABLE memories ADD COLUMN last_decay_at INTEGER DEFAULT (strftime(\'%s\',\'now\'))' },
853
- // Agent tracking (v0.8.0)
854
- { col: 'agent_id', sql: 'ALTER TABLE memories ADD COLUMN agent_id TEXT' },
855
- { col: 'agent_role', sql: 'ALTER TABLE memories ADD COLUMN agent_role TEXT' },
856
- { col: 'retrieval_priority', sql: 'ALTER TABLE memories ADD COLUMN retrieval_priority INTEGER DEFAULT 50' },
857
- // Data governance (v0.9.0)
858
- { col: 'recorded_at', sql: 'ALTER TABLE memories ADD COLUMN recorded_at INTEGER DEFAULT (strftime(\'%s\',\'now\'))' },
859
- { col: 'confidence', sql: 'ALTER TABLE memories ADD COLUMN confidence INTEGER DEFAULT 50' },
860
- { col: 'valid_from', sql: 'ALTER TABLE memories ADD COLUMN valid_from INTEGER' },
861
- { col: 'valid_to', sql: 'ALTER TABLE memories ADD COLUMN valid_to INTEGER' },
862
- { col: 'superseded_by', sql: 'ALTER TABLE memories ADD COLUMN superseded_by TEXT' },
863
- { col: 'version', sql: 'ALTER TABLE memories ADD COLUMN version INTEGER DEFAULT 1' },
864
- { col: 'is_active', sql: 'ALTER TABLE memories ADD COLUMN is_active INTEGER DEFAULT 1' },
865
- { col: 'expires_at', sql: 'ALTER TABLE memories ADD COLUMN expires_at INTEGER' },
866
- // Privacy & access (v0.9.0)
867
- { col: 'is_private', sql: 'ALTER TABLE memories ADD COLUMN is_private INTEGER DEFAULT 0' },
868
- { col: 'has_secrets', sql: 'ALTER TABLE memories ADD COLUMN has_secrets INTEGER DEFAULT 0' },
869
- { col: 'visibility_scope', sql: 'ALTER TABLE memories ADD COLUMN visibility_scope TEXT DEFAULT "private"' },
870
- { col: 'is_protected', sql: 'ALTER TABLE memories ADD COLUMN is_protected INTEGER DEFAULT 0' },
871
- { col: 'is_pinned', sql: 'ALTER TABLE memories ADD COLUMN is_pinned INTEGER DEFAULT 0' },
872
- { col: 'is_immutable', sql: 'ALTER TABLE memories ADD COLUMN is_immutable INTEGER DEFAULT 0' },
873
- { col: 'write_scope', sql: 'ALTER TABLE memories ADD COLUMN write_scope TEXT' },
874
- { col: 'read_scope', sql: 'ALTER TABLE memories ADD COLUMN read_scope TEXT' },
875
- // Usage tracking (v0.9.0)
876
- { col: 'triggered_by', sql: 'ALTER TABLE memories ADD COLUMN triggered_by TEXT' },
877
- { col: 'capture_reason', sql: 'ALTER TABLE memories ADD COLUMN capture_reason TEXT' },
878
- { col: 'last_used_at', sql: 'ALTER TABLE memories ADD COLUMN last_used_at INTEGER' },
879
- { col: 'usage_count', sql: 'ALTER TABLE memories ADD COLUMN usage_count INTEGER DEFAULT 0' },
880
- { col: 'user_id', sql: 'ALTER TABLE memories ADD COLUMN user_id TEXT' },
881
- // Layer tracking (v0.9.x)
882
- { col: 'has_l0_abstract', sql: 'ALTER TABLE memories ADD COLUMN has_l0_abstract INTEGER DEFAULT 0' },
883
- { col: 'has_l1_overview', sql: 'ALTER TABLE memories ADD COLUMN has_l1_overview INTEGER DEFAULT 0' },
884
- { col: 'last_layer_update', sql: 'ALTER TABLE memories ADD COLUMN last_layer_update INTEGER' },
885
- // Namespace support (v1.0.x)
886
- { col: 'namespace_id', sql: 'ALTER TABLE memories ADD COLUMN namespace_id TEXT REFERENCES namespaces(id) ON DELETE SET NULL' },
887
- { col: 'namespace_path', sql: 'ALTER TABLE memories ADD COLUMN namespace_path TEXT' },
888
- // Places support (v1.1.5) - Spatial memory organization
889
- { col: 'place_id', sql: 'ALTER TABLE memories ADD COLUMN place_id TEXT REFERENCES places(id) ON DELETE SET NULL' },
890
- { col: 'place_loci_index', sql: 'ALTER TABLE memories ADD COLUMN place_loci_index INTEGER' },
891
- // Token tracking (v1.0.x)
892
- { col: 'tokens_estimate', sql: 'ALTER TABLE memories ADD COLUMN tokens_estimate INTEGER DEFAULT 0' },
893
- // Iteration 3: Confidence flags (default: speculative)
894
- { col: 'confidence_level', sql: 'ALTER TABLE memories ADD COLUMN confidence_level TEXT DEFAULT "speculative"' },
895
- // v1.1.0: Status and encryption
896
- { col: 'status', sql: 'ALTER TABLE memories ADD COLUMN status TEXT DEFAULT "active"' },
897
- { col: 'encrypted_content', sql: 'ALTER TABLE memories ADD COLUMN encrypted_content TEXT' },
898
- { col: 'encryption_nonce', sql: 'ALTER TABLE memories ADD COLUMN encryption_nonce TEXT' },
899
- { col: 'is_encrypted', sql: 'ALTER TABLE memories ADD COLUMN is_encrypted INTEGER DEFAULT 0' },
900
- // Places support (v1.1.5) - Spatial memory organization
901
- { col: 'place_id', sql: 'ALTER TABLE memories ADD COLUMN place_id UUID REFERENCES places(id) ON DELETE SET NULL' },
902
- { col: 'place_loci_index', sql: 'ALTER TABLE memories ADD COLUMN place_loci_index INTEGER' }
903
- ];
904
- // Get existing columns for memories table
905
- const tableInfo = sqlite.prepare("PRAGMA table_info(memories)").all();
906
- const existingColumns = new Set(tableInfo.map(col => col.name));
907
- for (const migration of memoriesMigrations) {
908
- if (!existingColumns.has(migration.col)) {
909
- try {
910
- sqlite.exec(migration.sql);
911
- logger.info(`Migration: Added column ${migration.col} to memories table`);
912
- }
913
- catch (error) {
914
- // Re-throw real errors - only ignore "duplicate column" errors
915
- const msg = error instanceof Error ? error.message : String(error);
916
- if (msg.includes('duplicate column name')) {
917
- logger.debug(`Migration skipped for ${migration.col}: column already exists`);
918
- }
919
- else {
920
- throw new Error(`Migration failed for column ${migration.col}: ${msg}`);
921
- }
922
- }
923
- }
924
- }
925
- // v0.9.2: Add tokens_estimate to core_memory
926
- const coreMemoryTableCheck = sqlite.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='core_memory'").get();
927
- if (coreMemoryTableCheck) {
928
- const coreMemoryInfo = sqlite.prepare("PRAGMA table_info(core_memory)").all();
929
- const existingCoreMemoryColumns = new Set(coreMemoryInfo.map(col => col.name));
930
- const coreMemoryMigrations = [
931
- { col: 'tokens_estimate', sql: 'ALTER TABLE core_memory ADD COLUMN tokens_estimate INTEGER DEFAULT 0 NOT NULL' },
932
- ];
933
- for (const migration of coreMemoryMigrations) {
934
- if (!existingCoreMemoryColumns.has(migration.col)) {
935
- try {
936
- sqlite.exec(migration.sql);
937
- logger.info(`Migration: Added column ${migration.col} to core_memory table`);
938
- }
939
- catch (error) {
940
- const msg = error instanceof Error ? error.message : String(error);
941
- if (msg.includes('duplicate column name')) {
942
- logger.debug(`Migration skipped for ${migration.col}: column already exists`);
943
- }
944
- else {
945
- throw new Error(`Migration failed for column ${migration.col}: ${msg}`);
946
- }
947
- }
948
- }
949
- }
950
- }
951
- // Migrations for learnings table (v1.2.x) - renamed from observations
952
- // First, check if we need to rename observations -> learnings
953
- const observationsTableCheck = sqlite.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='observations'").get();
954
- const learningsTableCheck = sqlite.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='learnings'").get();
955
- if (observationsTableCheck && !learningsTableCheck) {
956
- // Rename observations to learnings
957
- try {
958
- sqlite.exec("ALTER TABLE observations RENAME TO learnings");
959
- logger.info("Migration: Renamed observations table to learnings");
960
- }
961
- catch (error) {
962
- const err = error instanceof Error ? error.message : String(error);
963
- logger.warn(`Migration note: Could not rename observations to learnings: ${err}`);
964
- }
965
- }
966
- // Now run migrations on learnings table (whether renamed or new)
967
- const learningsInfo = sqlite.prepare("PRAGMA table_info(learnings)").all();
968
- const existingLearningsColumns = new Set(learningsInfo.map(col => col.name));
969
- const learningsMigrations = [
970
- { col: 'embedding', sql: 'ALTER TABLE learnings ADD COLUMN embedding BLOB' },
971
- { col: 'folder_path', sql: 'ALTER TABLE learnings ADD COLUMN folder_path TEXT' },
972
- { col: 'project_path', sql: 'ALTER TABLE learnings ADD COLUMN project_path TEXT' },
973
- { col: 'is_private', sql: 'ALTER TABLE learnings ADD COLUMN is_private INTEGER DEFAULT 0' },
974
- { col: 'has_secrets', sql: 'ALTER TABLE learnings ADD COLUMN has_secrets INTEGER DEFAULT 0' },
975
- { col: 'relevance_score', sql: 'ALTER TABLE learnings ADD COLUMN relevance_score INTEGER DEFAULT 50' },
976
- { col: 'memory_id', sql: 'ALTER TABLE learnings ADD COLUMN memory_id TEXT REFERENCES memories(id) ON DELETE SET NULL' },
977
- { col: 'is_imported', sql: 'ALTER TABLE learnings ADD COLUMN is_imported INTEGER DEFAULT 0' },
978
- ];
979
- for (const migration of learningsMigrations) {
980
- if (!existingLearningsColumns.has(migration.col)) {
981
- try {
982
- sqlite.exec(migration.sql);
983
- logger.info(`Migration: Added column ${migration.col} to learnings table`);
984
- }
985
- catch (error) {
986
- const msg = error instanceof Error ? error.message : String(error);
987
- if (msg.includes('duplicate column name')) {
988
- logger.debug(`Migration skipped for ${migration.col}: column already exists`);
989
- }
990
- else {
991
- logger.warn(`Migration note for ${migration.col}: ${msg}`);
992
- }
993
- }
994
- }
995
- }
996
- // Add indexes if they don't exist
997
- const existingIndexes = sqlite.prepare("SELECT name FROM sqlite_master WHERE type='index' AND tbl_name='learnings'").all();
998
- const existingIndexNames = new Set(existingIndexes.map(idx => idx.name));
999
- const indexMigrations = [
1000
- { name: 'learnings_folder_idx', sql: 'CREATE INDEX IF NOT EXISTS learnings_folder_idx ON learnings(folder_path)' },
1001
- { name: 'learnings_relevance_idx', sql: 'CREATE INDEX IF NOT EXISTS learnings_relevance_idx ON learnings(relevance_score)' },
1002
- { name: 'learnings_private_idx', sql: 'CREATE INDEX IF NOT EXISTS learnings_private_idx ON learnings(is_private)' },
1003
- { name: 'learnings_memory_idx', sql: 'CREATE INDEX IF NOT EXISTS learnings_memory_idx ON learnings(memory_id)' },
1004
- ];
1005
- for (const idx of indexMigrations) {
1006
- if (!existingIndexNames.has(idx.name)) {
1007
- try {
1008
- sqlite.exec(idx.sql);
1009
- logger.info(`Migration: Added index ${idx.name} to learnings table`);
1010
- }
1011
- catch (error) {
1012
- const msg = error instanceof Error ? error.message : String(error);
1013
- logger.warn(`Index migration note for ${idx.name}: ${msg}`);
1014
- }
1015
- }
1016
- }
1017
- // Migrations for maintenance_jobs table (v1.0.x)
1018
- const maintenanceJobsTableCheck = sqlite.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='maintenance_jobs'").get();
1019
- if (maintenanceJobsTableCheck) {
1020
- const maintenanceJobsInfo = sqlite.prepare("PRAGMA table_info(maintenance_jobs)").all();
1021
- const existingMaintenanceJobsColumns = new Set(maintenanceJobsInfo.map(col => col.name));
1022
- // Check if table has wrong schema (camelCase columns from bug in earlier version)
1023
- const hasCamelCaseColumns = existingMaintenanceJobsColumns.has('jobName') ||
1024
- existingMaintenanceJobsColumns.has('jobType') ||
1025
- existingMaintenanceJobsColumns.has('cronExpression');
1026
- if (hasCamelCaseColumns) {
1027
- // Table has incorrect camelCase schema - need to recreate it
1028
- logger.warn('Maintenance jobs table has incorrect schema (camelCase columns). Recreating...');
1029
- try {
1030
- // Drop the malformed table
1031
- sqlite.exec('DROP TABLE IF EXISTS maintenance_jobs');
1032
- // Recreate with correct schema - it will be created by the schema SQL
1033
- logger.info('Dropped malformed maintenance_jobs table. It will be recreated with correct schema.');
1034
- }
1035
- catch (error) {
1036
- logger.error('Failed to recreate maintenance_jobs table:', error);
1037
- }
1038
- }
1039
- else {
1040
- // Normal migrations for correct schema
1041
- const maintenanceJobsMigrations = [
1042
- { col: 'schedule', sql: 'ALTER TABLE maintenance_jobs DROP COLUMN schedule' },
1043
- { col: 'cron_expression', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN cron_expression TEXT' },
1044
- { col: 'last_run_at', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN last_run_at INTEGER' },
1045
- { col: 'last_run_duration', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN last_run_duration INTEGER' },
1046
- { col: 'last_run_status', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN last_run_status TEXT' },
1047
- { col: 'last_run_error', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN last_run_error TEXT' },
1048
- { col: 'total_runs', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN total_runs INTEGER DEFAULT 0' },
1049
- { col: 'success_count', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN success_count INTEGER DEFAULT 0' },
1050
- { col: 'failure_count', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN failure_count INTEGER DEFAULT 0' },
1051
- { col: 'job_config', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN job_config TEXT' },
1052
- { col: 'next_run_at', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN next_run_at INTEGER' },
1053
- { col: 'run_count', sql: 'ALTER TABLE maintenance_jobs DROP COLUMN run_count' },
1054
- ];
1055
- for (const migration of maintenanceJobsMigrations) {
1056
- // For DROP migrations, only run if column EXISTS
1057
- // For ADD migrations, only run if column does NOT exist
1058
- const shouldRun = migration.sql.startsWith('ALTER TABLE maintenance_jobs DROP COLUMN')
1059
- ? existingMaintenanceJobsColumns.has(migration.col)
1060
- : !existingMaintenanceJobsColumns.has(migration.col);
1061
- if (shouldRun) {
1062
- try {
1063
- sqlite.exec(migration.sql);
1064
- logger.info(`Migration: ${migration.col} on maintenance_jobs table`);
1065
- }
1066
- catch (error) {
1067
- const msg = error instanceof Error ? error.message : String(error);
1068
- if (msg.includes('duplicate column name') || msg.includes('no such column')) {
1069
- logger.debug(`Migration skipped for ${migration.col}: ${msg.includes('duplicate column name') ? 'column already exists' : 'column does not exist'}`);
1070
- }
1071
- else {
1072
- throw new Error(`Migration failed for column ${migration.col}: ${msg}`);
1073
- }
1074
- }
1075
- }
1076
- }
1077
- }
1078
- }
981
+
982
+ // Schema versions for tracking
983
+ const SCHEMA_VERSIONS = [
984
+ { version: '1.2.0-base', description: 'Initial v1.2.0 schema with schema_versions table' },
985
+ { version: '1.2.0-place-sort', description: 'Add place_sort_order column to places' },
986
+ { version: '1.2.0-mem-place', description: 'Add place_sort_order to memories and memory_places' },
987
+ { version: '1.2.0-agent-prefs', description: 'Add agent_preferences table for agent evolution' },
988
+ ];
989
+
990
+ async function initializeSchemaVersionTable(sqlite: Database): Promise<void> {
991
+ // Get existing versions
992
+ const existingVersions = sqlite.prepare("SELECT version FROM _schema_versions").all() as Array<{version: string}>;
993
+ const appliedVersions = new Set(existingVersions.map(v => v.version));
994
+
995
+ // Insert any missing versions
996
+ for (const { version, description } of SCHEMA_VERSIONS) {
997
+ if (!appliedVersions.has(version)) {
998
+ try {
999
+ sqlite.prepare("INSERT INTO _schema_versions (version, description) VALUES (?, ?)").run(version, description);
1000
+ logger.info(`Schema version ${version} recorded`);
1001
+ } catch (error) {
1002
+ // Ignore duplicate errors
1003
+ const msg = error instanceof Error ? error.message : String(error);
1004
+ if (!msg.includes('UNIQUE constraint failed')) {
1005
+ logger.warn(`Could not record schema version ${version}: ${msg}`);
1006
+ }
1007
+ }
1008
+ }
1009
+ }
1010
+ }
1011
+
1012
+ export async function getSchemaVersion(sqlite: Database): Promise<string | null> {
1013
+ const result = sqlite.prepare("SELECT version FROM _schema_versions ORDER BY applied_at DESC LIMIT 1").get() as {version: string} | undefined;
1014
+ return result?.version || null;
1015
+ }
1016
+
1017
+ export async function runMigrationsForVersion(sqlite: Database, targetVersion: string): Promise<void> {
1018
+ const currentVersion = await getSchemaVersion(sqlite);
1019
+ logger.info(`Current schema version: ${currentVersion}, target: ${targetVersion}`);
1020
+
1021
+ // Run ensureSqliteSchema which handles all migrations
1022
+ await runSqliteMigrations(sqlite);
1023
+ }
1024
+
1025
+ async function runSqliteMigrations(sqlite: Database): Promise<void> {
1026
+ // All migrations are in separate files - just run them all
1027
+ await runAllMigrations(sqlite);
1079
1028
  }
1080
- export async function ensurePostgresSchema(pool) {
1081
- for (const statement of postgresStatements) {
1082
- await pool.query(statement);
1029
+
1030
+ function execSqliteSchema(
1031
+ sqlite: Database,
1032
+ options: { tolerant: boolean },
1033
+ ): void {
1034
+ try {
1035
+ sqlite.exec(sqliteSchemaSql);
1036
+ } catch (error) {
1037
+ const message = error instanceof Error ? error.message : String(error);
1038
+ const isRecoverable =
1039
+ message.includes('no such column') ||
1040
+ message.includes('has no column named');
1041
+
1042
+ if (options.tolerant && isRecoverable) {
1043
+ logger.debug(`Deferred schema statement until after migrations: ${message}`);
1044
+ return;
1083
1045
  }
1046
+
1047
+ throw error;
1048
+ }
1084
1049
  }
1085
- //# sourceMappingURL=bootstrap.js.map
1050
+
1051
+ export async function ensurePostgresSchema(pool: Pool): Promise<void> {
1052
+ for (const statement of postgresStatements) {
1053
+ await pool.query(statement);
1054
+ }
1055
+ }