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.
- package/.env.example +32 -16
- package/CHANGELOG.md +147 -0
- package/README.md +120 -78
- package/{scripts → bin}/dependency-manager.mjs +217 -217
- package/{scripts → bin}/detect-clients.mjs +78 -78
- package/bin/install-interactive.mjs +321 -0
- package/bin/squish-mcp.mjs +44 -0
- package/bin/squish.mjs +33 -0
- package/config/mcp-migration-map.json +1 -6
- package/config/mcp-mode-semantics.json +19 -23
- package/config/mcp-remote-auth.json +3 -26
- package/config/mcp-universal.schema.json +5 -35
- package/config/settings.json +107 -52
- package/config.js +5 -0
- package/config.ts +218 -0
- package/core/adapters/config/claude-code.ts +133 -0
- package/core/adapters/config/cursor.ts +90 -0
- package/core/adapters/config/opencode.ts +89 -0
- package/core/adapters/config/windsurf.ts +90 -0
- package/core/adapters/index.ts +102 -0
- package/core/adapters/timeline.ts +116 -0
- package/core/adapters/types.ts +166 -0
- package/core/agent-preferences.ts +140 -0
- package/core/algorithms/analytics/token-estimator.ts +216 -0
- package/core/algorithms/detection/hash-filters.ts +260 -0
- package/core/algorithms/detection/semantic-ranker.ts +194 -0
- package/core/algorithms/detection/two-stage-detector.ts +421 -0
- package/core/algorithms/handlers/approve-merge.ts +215 -0
- package/core/algorithms/handlers/detect-duplicates.ts +192 -0
- package/core/algorithms/handlers/get-stats.ts +132 -0
- package/core/algorithms/handlers/list-proposals.ts +130 -0
- package/core/algorithms/handlers/preview-merge.ts +139 -0
- package/core/algorithms/handlers/reject-merge.ts +93 -0
- package/core/algorithms/handlers/reverse-merge.ts +155 -0
- package/{dist/core/algorithms/index.js → core/algorithms/index.ts} +39 -26
- package/core/algorithms/operations/cache-maintenance.ts +182 -0
- package/core/algorithms/safety/safety-checks.ts +256 -0
- package/core/algorithms/strategies/merge-strategies.ts +381 -0
- package/core/algorithms/types.ts +140 -0
- package/core/algorithms/utils/response-builder.ts +61 -0
- package/core/associations.ts +363 -0
- package/core/beliefs/decay.ts +289 -0
- package/core/beliefs/extractor.ts +131 -0
- package/core/beliefs/store.ts +557 -0
- package/core/beliefs/types.ts +38 -0
- package/core/commands/mcp-server.ts +5 -0
- package/core/compression.ts +177 -0
- package/core/config.js +2 -0
- package/core/consolidation.ts +330 -0
- package/core/context/agent-context.ts +388 -0
- package/core/context/context-paging.ts +449 -0
- package/core/context/context-window.ts +234 -0
- package/core/context/context.ts +35 -0
- package/core/embeddings/embeddings.ts +616 -0
- package/core/embeddings/google-multimodal.ts +200 -0
- package/{dist/core/local-embeddings.js → core/embeddings/local-embeddings.ts} +12 -11
- package/core/embeddings/qmd-client.ts +495 -0
- package/core/embeddings/transformers-local.ts +261 -0
- package/core/embeddings.js +4 -0
- package/core/error-handling.ts +206 -0
- package/core/external +219 -0
- package/core/graph/entity-deduplicator.ts +232 -0
- package/core/graph/graph-builder.ts +257 -0
- package/core/graph/graph-traversal.ts +490 -0
- package/core/graph/index.ts +24 -0
- package/core/graph/llm-entity-extractor.ts +402 -0
- package/core/graph/multi-hop-retrieval.ts +317 -0
- package/core/graph/relationship-extractor.ts +465 -0
- package/core/hooks/agent-hooks.ts +653 -0
- package/core/hooks/auto-tagger.ts +149 -0
- package/core/hooks/capture-filter.ts +169 -0
- package/core/hot-cache.ts +388 -0
- package/core/index.ts +10 -0
- package/core/ingestion/agent-memory.ts +167 -0
- package/core/ingestion/core-memory.ts +326 -0
- package/core/ingestion/learnings.ts +260 -0
- package/core/ingestion/signal-engine.ts +266 -0
- package/core/integrations/obsidian-vault.ts +197 -0
- package/core/layers/generator.ts +115 -0
- package/{dist/core/lib/db-client.d.ts → core/lib/db-client.ts} +168 -114
- package/core/lib/parse-embedding.ts +59 -0
- package/{dist/core/lib/schemas.js → core/lib/schemas.ts} +102 -87
- package/core/lib/types.ts +49 -0
- package/core/lib/utils.ts +151 -0
- package/core/lib/validation.ts +180 -0
- package/core/lifecycle.ts +353 -0
- package/core/logger.ts +59 -0
- package/core/memory/bridge-discovery.ts +395 -0
- package/core/memory/categorizer.ts +390 -0
- package/core/memory/conflict-detector.ts +62 -0
- package/core/memory/consolidation.ts +372 -0
- package/core/memory/context-collector.ts +75 -0
- package/core/memory/contradiction-resolver.ts +494 -0
- package/core/memory/edit-workflow.ts +174 -0
- package/core/memory/entity-extractor.ts +426 -0
- package/core/memory/entity-resolver.ts +89 -0
- package/core/memory/explain.ts +112 -0
- package/core/memory/fact-deriver.ts +300 -0
- package/core/memory/fact-extractor.ts +120 -0
- package/core/memory/feedback-tracker.ts +200 -0
- package/core/memory/hooks.ts +230 -0
- package/core/memory/hybrid-retrieval.ts +65 -0
- package/core/memory/hybrid-scorer.ts +325 -0
- package/core/memory/hybrid-search.ts +748 -0
- package/core/memory/importance.ts +319 -0
- package/{dist/core/memory/index.js → core/memory/index.ts} +11 -10
- package/core/memory/loader.ts +178 -0
- package/core/memory/markdown/markdown-storage.ts +318 -0
- package/core/memory/memories.ts +565 -0
- package/core/memory/memory-lifecycle.ts +51 -0
- package/core/memory/memory-manager.ts +53 -0
- package/core/memory/migrate.ts +173 -0
- package/core/memory/normalization.ts +30 -0
- package/core/memory/path-strengthener.ts +211 -0
- package/core/memory/progressive-disclosure.ts +392 -0
- package/core/memory/query-processor.ts +130 -0
- package/core/memory/query-rewriter.ts +153 -0
- package/core/memory/response-analyzer.ts +81 -0
- package/core/memory/retrieval-feedback.ts +276 -0
- package/core/memory/serialization.ts +83 -0
- package/core/memory/stale-cleaner.ts +147 -0
- package/core/memory/stats.ts +181 -0
- package/core/memory/telemetry.ts +392 -0
- package/core/memory/temporal-facts.ts +356 -0
- package/core/memory/temporal-parser.ts +477 -0
- package/core/memory/trigger-detector.ts +104 -0
- package/core/memory/write-gate.ts +288 -0
- package/{dist/core/places/index.js → core/places/index.ts} +12 -12
- package/core/places/memory-places.ts +339 -0
- package/core/places/places.ts +406 -0
- package/core/places/rules.ts +308 -0
- package/core/places/walking.ts +192 -0
- package/core/projects +89 -0
- package/core/projects.ts +131 -0
- package/core/redis.ts +82 -0
- package/core/responses.ts +187 -0
- package/core/runtime/trust-report.ts +195 -0
- package/core/runtime/trust-state.ts +360 -0
- package/core/scheduler/cron-scheduler.ts +590 -0
- package/core/scheduler/heartbeat.ts +91 -0
- package/{dist/core/scheduler/index.js → core/scheduler/index.ts} +8 -8
- package/core/scheduler/job-runner.ts +197 -0
- package/core/search/conversations.ts +166 -0
- package/core/search/entities.ts +46 -0
- package/core/search/folder-context.ts +154 -0
- package/core/search/graph-boost.ts +22 -0
- package/{dist/core/search/index.js → core/search/index.ts} +4 -5
- package/core/search/qmd-wrapper.ts +84 -0
- package/core/security/encrypt.ts +51 -0
- package/core/security/governance.ts +102 -0
- package/core/security/privacy.ts +108 -0
- package/core/security/secret-detector.ts +122 -0
- package/core/session/auto-load.ts +160 -0
- package/core/session/entity-tracker.ts +363 -0
- package/{dist/core/session/index.js → core/session/index.ts} +7 -7
- package/core/session/reference-resolver.ts +158 -0
- package/core/session/self-iteration-job.ts +478 -0
- package/core/session/session-hooks.ts +69 -0
- package/core/session/types.ts +36 -0
- package/core/session/working-set.ts +275 -0
- package/{dist/core/snapshots/cleanup.js → core/snapshots/cleanup.ts} +13 -12
- package/core/snapshots/comparison.ts +59 -0
- package/core/snapshots/creation.ts +139 -0
- package/core/snapshots/retrieval.ts +44 -0
- package/core/snapshots/stats.ts +63 -0
- package/core/storage/cache.ts +241 -0
- package/core/storage/database.ts +23 -0
- package/{dist/core/summarization/cleanup.js → core/summarization/cleanup.ts} +13 -12
- package/core/summarization/queries.ts +32 -0
- package/core/summarization/stats.ts +64 -0
- package/core/summarization/strategies.ts +52 -0
- package/core/summarization.ts +248 -0
- package/core/temporal-facts.ts +244 -0
- package/core/tracing/collector.ts +470 -0
- package/core/tracing/visualizer.ts +195 -0
- package/core/utils/cleanup-operations.ts +50 -0
- package/core/utils/content-extraction.ts +95 -0
- package/core/utils/filter-builder.ts +56 -0
- package/core/utils/history-traversal.ts +63 -0
- package/core/utils/memory-operations.ts +56 -0
- package/core/utils/query-operations.ts +83 -0
- package/core/utils/summarization-helpers.ts +45 -0
- package/core/utils/temporal-queries.ts +39 -0
- package/{dist/core/utils/vector-operations.js → core/utils/vector-operations.ts} +135 -129
- package/core/utils/version-management.ts +74 -0
- package/core/worker.ts +333 -0
- package/db/adapter.ts +215 -0
- package/{dist/db/bootstrap.js → db/bootstrap.ts} +388 -418
- package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
- package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
- package/db/drizzle/migrations/meta/_journal.json +13 -0
- package/db/drizzle/schema-sqlite.ts +1032 -0
- package/db/drizzle/schema.ts +1128 -0
- package/db/drizzle.config.ts +12 -0
- package/db/index.ts +83 -0
- package/db/init.sql +5 -0
- package/db/migrations/associations.ts +35 -0
- package/db/migrations/beliefs.ts +89 -0
- package/db/migrations/core-memory.ts +35 -0
- package/db/migrations/fts.ts +59 -0
- package/db/migrations/index.ts +54 -0
- package/db/migrations/indexes.ts +36 -0
- package/db/migrations/learnings.ts +34 -0
- package/db/migrations/maintenance.ts +68 -0
- package/db/migrations/memories.ts +22 -0
- package/db/migrations/memory-places.ts +35 -0
- package/db/migrations/places.ts +49 -0
- package/db/migrations/projects.ts +21 -0
- package/db/migrations/tier-conversion.ts +24 -0
- package/db/neon.ts +22 -0
- package/db/schema/beliefs.ts +50 -0
- package/db/schema/generator.ts +159 -0
- package/db/schema/index.ts +58 -0
- package/db/schema/learnings.ts +32 -0
- package/db/schema/memories.ts +83 -0
- package/db/schema/projects.ts +33 -0
- package/db/schema.ts +13 -0
- package/db/supabase.ts +27 -0
- package/mcp.json.example +8 -11
- package/package.json +140 -159
- package/packages/cli/package.json +22 -0
- package/packages/cli/src/commands/clean.ts +68 -0
- package/packages/cli/src/commands/context.ts +79 -0
- package/packages/cli/src/commands/doctor.ts +357 -0
- package/packages/cli/src/commands/forget.ts +72 -0
- package/packages/cli/src/commands/health.ts +36 -0
- package/packages/cli/src/commands/inspect.ts +41 -0
- package/packages/cli/src/commands/link.ts +50 -0
- package/packages/cli/src/commands/migrate.ts +93 -0
- package/packages/cli/src/commands/recall.ts +99 -0
- package/packages/cli/src/commands/recent.ts +57 -0
- package/packages/cli/src/commands/remember.ts +139 -0
- package/packages/cli/src/commands/run.ts +58 -0
- package/packages/cli/src/commands/stale.ts +43 -0
- package/packages/cli/src/commands/stats.ts +42 -0
- package/packages/cli/src/index.ts +57 -0
- package/packages/cli/tsconfig.json +24 -0
- package/packages/mcp/package.json +26 -0
- package/packages/mcp/src/index.ts +940 -0
- package/packages/mcp/tsconfig.json +20 -0
- package/skills/squish-memory/SKILL.md +38 -35
- package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
- package/skills/squish-memory/references/claude-desktop.json +12 -0
- package/skills/squish-memory/references/openclaw.json +13 -0
- package/skills/squish-memory/references/opencode.json +14 -0
- package/config/hooks/claude-code-hooks.json +0 -39
- package/config/hooks/cursor-hooks.json +0 -30
- package/config/hooks/opencode-hooks.json +0 -30
- package/config/hooks/windsurf-hooks.json +0 -30
- package/config/mcp-cli-fallback-policy.json +0 -22
- package/config/mcp.json +0 -38
- package/config/plugin-manifest.json +0 -101
- package/config/plugin-manifest.schema.json +0 -244
- package/config/plugin.json +0 -32
- package/config/remote-memory-policy.json +0 -32
- package/core/commands/context-paging.md +0 -51
- package/core/commands/context-status.md +0 -22
- package/core/commands/context.md +0 -5
- package/core/commands/core-memory.md +0 -56
- package/core/commands/health.md +0 -5
- package/core/commands/init.md +0 -39
- package/core/commands/merge.md +0 -113
- package/core/commands/recall.md +0 -5
- package/core/commands/remember.md +0 -11
- package/core/commands/search.md +0 -10
- package/dist/config.d.ts +0 -83
- package/dist/config.js +0 -242
- package/dist/core/adapters/config/claude-code.d.ts +0 -45
- package/dist/core/adapters/config/claude-code.js +0 -113
- package/dist/core/adapters/config/cursor.d.ts +0 -26
- package/dist/core/adapters/config/cursor.js +0 -74
- package/dist/core/adapters/config/opencode.d.ts +0 -23
- package/dist/core/adapters/config/opencode.js +0 -73
- package/dist/core/adapters/config/windsurf.d.ts +0 -26
- package/dist/core/adapters/config/windsurf.js +0 -74
- package/dist/core/adapters/index.d.ts +0 -45
- package/dist/core/adapters/index.js +0 -84
- package/dist/core/adapters/scripts/install-adapter.d.ts +0 -19
- package/dist/core/adapters/scripts/install-adapter.js +0 -149
- package/dist/core/adapters/timeline.d.ts +0 -23
- package/dist/core/adapters/timeline.js +0 -88
- package/dist/core/adapters/types.d.ts +0 -157
- package/dist/core/adapters/types.js +0 -50
- package/dist/core/algorithms/analytics/token-estimator.d.ts +0 -50
- package/dist/core/algorithms/analytics/token-estimator.js +0 -154
- package/dist/core/algorithms/detection/hash-filters.d.ts +0 -47
- package/dist/core/algorithms/detection/hash-filters.js +0 -190
- package/dist/core/algorithms/detection/semantic-ranker.d.ts +0 -32
- package/dist/core/algorithms/detection/semantic-ranker.js +0 -118
- package/dist/core/algorithms/detection/two-stage-detector.d.ts +0 -52
- package/dist/core/algorithms/detection/two-stage-detector.js +0 -299
- package/dist/core/algorithms/handlers/approve-merge.d.ts +0 -22
- package/dist/core/algorithms/handlers/approve-merge.js +0 -179
- package/dist/core/algorithms/handlers/detect-duplicates.d.ts +0 -47
- package/dist/core/algorithms/handlers/detect-duplicates.js +0 -145
- package/dist/core/algorithms/handlers/get-stats.d.ts +0 -39
- package/dist/core/algorithms/handlers/get-stats.js +0 -88
- package/dist/core/algorithms/handlers/list-proposals.d.ts +0 -45
- package/dist/core/algorithms/handlers/list-proposals.js +0 -83
- package/dist/core/algorithms/handlers/preview-merge.d.ts +0 -39
- package/dist/core/algorithms/handlers/preview-merge.js +0 -93
- package/dist/core/algorithms/handlers/reject-merge.d.ts +0 -28
- package/dist/core/algorithms/handlers/reject-merge.js +0 -69
- package/dist/core/algorithms/handlers/reverse-merge.d.ts +0 -21
- package/dist/core/algorithms/handlers/reverse-merge.js +0 -121
- package/dist/core/algorithms/index.d.ts +0 -21
- package/dist/core/algorithms/operations/cache-maintenance.d.ts +0 -12
- package/dist/core/algorithms/operations/cache-maintenance.js +0 -157
- package/dist/core/algorithms/safety/safety-checks.d.ts +0 -22
- package/dist/core/algorithms/safety/safety-checks.js +0 -179
- package/dist/core/algorithms/strategies/merge-strategies.d.ts +0 -50
- package/dist/core/algorithms/strategies/merge-strategies.js +0 -288
- package/dist/core/algorithms/types.d.ts +0 -133
- package/dist/core/algorithms/types.js +0 -5
- package/dist/core/algorithms/utils/response-builder.d.ts +0 -28
- package/dist/core/algorithms/utils/response-builder.js +0 -37
- package/dist/core/associations.d.ts +0 -31
- package/dist/core/associations.js +0 -248
- package/dist/core/autosave.d.ts +0 -19
- package/dist/core/autosave.js +0 -16
- package/dist/core/commands/managed-sync.d.ts +0 -10
- package/dist/core/commands/managed-sync.js +0 -64
- package/dist/core/commands/mcp-server.d.ts +0 -3
- package/dist/core/commands/mcp-server.js +0 -739
- package/dist/core/consolidation.d.ts +0 -37
- package/dist/core/consolidation.js +0 -248
- package/dist/core/context/agent-context.d.ts +0 -106
- package/dist/core/context/agent-context.js +0 -274
- package/dist/core/context/context-paging.d.ts +0 -80
- package/dist/core/context/context-paging.js +0 -328
- package/dist/core/context/context-window.d.ts +0 -40
- package/dist/core/context/context-window.js +0 -177
- package/dist/core/context/context.d.ts +0 -7
- package/dist/core/context/context.js +0 -22
- package/dist/core/embeddings/google-multimodal.d.ts +0 -14
- package/dist/core/embeddings/google-multimodal.js +0 -142
- package/dist/core/embeddings/qmd-client.d.ts +0 -136
- package/dist/core/embeddings/qmd-client.js +0 -403
- package/dist/core/embeddings.d.ts +0 -29
- package/dist/core/embeddings.js +0 -454
- package/dist/core/error-handling.d.ts +0 -63
- package/dist/core/error-handling.js +0 -173
- package/dist/core/external-folder/index.d.ts +0 -102
- package/dist/core/external-folder/index.js +0 -294
- package/dist/core/hooks/agent-hooks.d.ts +0 -74
- package/dist/core/hooks/agent-hooks.js +0 -244
- package/dist/core/hooks/auto-tagger.d.ts +0 -19
- package/dist/core/hooks/auto-tagger.js +0 -155
- package/dist/core/hooks/capture-filter.d.ts +0 -41
- package/dist/core/hooks/capture-filter.js +0 -128
- package/dist/core/index.d.ts +0 -10
- package/dist/core/index.js +0 -14
- package/dist/core/ingestion/agent-memory.d.ts +0 -22
- package/dist/core/ingestion/agent-memory.js +0 -109
- package/dist/core/ingestion/core-memory.d.ts +0 -78
- package/dist/core/ingestion/core-memory.js +0 -226
- package/dist/core/ingestion/learnings.d.ts +0 -57
- package/dist/core/ingestion/learnings.js +0 -202
- package/dist/core/layers/generator.d.ts +0 -25
- package/dist/core/layers/generator.js +0 -76
- package/dist/core/lib/db-client.js +0 -130
- package/dist/core/lib/schemas.d.ts +0 -129
- package/dist/core/lib/utils.d.ts +0 -14
- package/dist/core/lib/utils.js +0 -90
- package/dist/core/lib/validation.d.ts +0 -38
- package/dist/core/lib/validation.js +0 -151
- package/dist/core/lifecycle.d.ts +0 -26
- package/dist/core/lifecycle.js +0 -302
- package/dist/core/local-embeddings.d.ts +0 -11
- package/dist/core/logger.d.ts +0 -16
- package/dist/core/logger.js +0 -40
- package/dist/core/mcp/client.d.ts +0 -17
- package/dist/core/mcp/client.js +0 -101
- package/dist/core/mcp/index.d.ts +0 -6
- package/dist/core/mcp/index.js +0 -6
- package/dist/core/mcp/server.d.ts +0 -18
- package/dist/core/mcp/server.js +0 -157
- package/dist/core/mcp/standalone-server.d.ts +0 -13
- package/dist/core/mcp/standalone-server.js +0 -46
- package/dist/core/mcp/tools.d.ts +0 -9
- package/dist/core/mcp/tools.js +0 -365
- package/dist/core/mcp/types.d.ts +0 -315
- package/dist/core/mcp/types.js +0 -48
- package/dist/core/memory/bridge-discovery.d.ts +0 -50
- package/dist/core/memory/bridge-discovery.js +0 -291
- package/dist/core/memory/categorizer.d.ts +0 -27
- package/dist/core/memory/categorizer.js +0 -305
- package/dist/core/memory/conflict-detector.d.ts +0 -7
- package/dist/core/memory/conflict-detector.js +0 -43
- package/dist/core/memory/consolidation.d.ts +0 -42
- package/dist/core/memory/consolidation.js +0 -303
- package/dist/core/memory/context-collector.d.ts +0 -10
- package/dist/core/memory/context-collector.js +0 -56
- package/dist/core/memory/contradiction-resolver.d.ts +0 -40
- package/dist/core/memory/contradiction-resolver.js +0 -368
- package/dist/core/memory/edit-workflow.d.ts +0 -19
- package/dist/core/memory/edit-workflow.js +0 -120
- package/dist/core/memory/entity-extractor.d.ts +0 -33
- package/dist/core/memory/entity-extractor.js +0 -336
- package/dist/core/memory/entity-resolver.d.ts +0 -23
- package/dist/core/memory/entity-resolver.js +0 -64
- package/dist/core/memory/fact-extractor.d.ts +0 -24
- package/dist/core/memory/fact-extractor.js +0 -89
- package/dist/core/memory/feedback-tracker.d.ts +0 -12
- package/dist/core/memory/feedback-tracker.js +0 -155
- package/dist/core/memory/hooks.d.ts +0 -88
- package/dist/core/memory/hooks.js +0 -174
- package/dist/core/memory/hybrid-retrieval.d.ts +0 -29
- package/dist/core/memory/hybrid-retrieval.js +0 -139
- package/dist/core/memory/hybrid-scorer.d.ts +0 -40
- package/dist/core/memory/hybrid-scorer.js +0 -284
- package/dist/core/memory/hybrid-search.d.ts +0 -20
- package/dist/core/memory/hybrid-search.js +0 -359
- package/dist/core/memory/importance.d.ts +0 -63
- package/dist/core/memory/importance.js +0 -298
- package/dist/core/memory/index.d.ts +0 -8
- package/dist/core/memory/loader.d.ts +0 -31
- package/dist/core/memory/loader.js +0 -141
- package/dist/core/memory/markdown/markdown-storage.d.ts +0 -72
- package/dist/core/memory/markdown/markdown-storage.js +0 -243
- package/dist/core/memory/memories.d.ts +0 -47
- package/dist/core/memory/memories.js +0 -449
- package/dist/core/memory/memory-lifecycle.d.ts +0 -8
- package/dist/core/memory/memory-lifecycle.js +0 -55
- package/dist/core/memory/memory-manager.d.ts +0 -15
- package/dist/core/memory/memory-manager.js +0 -46
- package/dist/core/memory/migrate.d.ts +0 -21
- package/dist/core/memory/migrate.js +0 -134
- package/dist/core/memory/normalization.d.ts +0 -22
- package/dist/core/memory/normalization.js +0 -26
- package/dist/core/memory/progressive-disclosure.d.ts +0 -43
- package/dist/core/memory/progressive-disclosure.js +0 -280
- package/dist/core/memory/query-processor.d.ts +0 -21
- package/dist/core/memory/query-processor.js +0 -72
- package/dist/core/memory/query-rewriter.d.ts +0 -13
- package/dist/core/memory/query-rewriter.js +0 -118
- package/dist/core/memory/response-analyzer.d.ts +0 -9
- package/dist/core/memory/response-analyzer.js +0 -61
- package/dist/core/memory/serialization.d.ts +0 -10
- package/dist/core/memory/serialization.js +0 -84
- package/dist/core/memory/stats.d.ts +0 -22
- package/dist/core/memory/stats.js +0 -138
- package/dist/core/memory/telemetry.d.ts +0 -69
- package/dist/core/memory/telemetry.js +0 -313
- package/dist/core/memory/temporal-facts.d.ts +0 -41
- package/dist/core/memory/temporal-facts.js +0 -283
- package/dist/core/memory/temporal-parser.d.ts +0 -32
- package/dist/core/memory/temporal-parser.js +0 -385
- package/dist/core/memory/trigger-detector.d.ts +0 -14
- package/dist/core/memory/trigger-detector.js +0 -42
- package/dist/core/memory/write-gate.d.ts +0 -54
- package/dist/core/memory/write-gate.js +0 -210
- package/dist/core/namespaces/index.d.ts +0 -71
- package/dist/core/namespaces/index.js +0 -305
- package/dist/core/namespaces/uri-parser.d.ts +0 -31
- package/dist/core/namespaces/uri-parser.js +0 -74
- package/dist/core/obsidian-vault.d.ts +0 -30
- package/dist/core/obsidian-vault.js +0 -94
- package/dist/core/places/index.d.ts +0 -14
- package/dist/core/places/memory-places.d.ts +0 -68
- package/dist/core/places/memory-places.js +0 -261
- package/dist/core/places/places.d.ts +0 -88
- package/dist/core/places/places.js +0 -314
- package/dist/core/places/rules.d.ts +0 -74
- package/dist/core/places/rules.js +0 -240
- package/dist/core/places/walking.d.ts +0 -56
- package/dist/core/places/walking.js +0 -121
- package/dist/core/projects.d.ts +0 -17
- package/dist/core/projects.js +0 -108
- package/dist/core/redis.d.ts +0 -11
- package/dist/core/redis.js +0 -69
- package/dist/core/responses.d.ts +0 -96
- package/dist/core/responses.js +0 -122
- package/dist/core/scheduler/cron-scheduler.d.ts +0 -32
- package/dist/core/scheduler/cron-scheduler.js +0 -332
- package/dist/core/scheduler/heartbeat.d.ts +0 -11
- package/dist/core/scheduler/heartbeat.js +0 -73
- package/dist/core/scheduler/index.d.ts +0 -8
- package/dist/core/scheduler/job-runner.d.ts +0 -11
- package/dist/core/scheduler/job-runner.js +0 -164
- package/dist/core/search/conversations.d.ts +0 -25
- package/dist/core/search/conversations.js +0 -110
- package/dist/core/search/entities.d.ts +0 -12
- package/dist/core/search/entities.js +0 -31
- package/dist/core/search/folder-context.d.ts +0 -25
- package/dist/core/search/folder-context.js +0 -119
- package/dist/core/search/graph-boost.d.ts +0 -7
- package/dist/core/search/graph-boost.js +0 -23
- package/dist/core/search/index.d.ts +0 -4
- package/dist/core/search/qmd-search.d.ts +0 -61
- package/dist/core/search/qmd-search.js +0 -178
- package/dist/core/security/encrypt.d.ts +0 -6
- package/dist/core/security/encrypt.js +0 -47
- package/dist/core/security/governance.d.ts +0 -26
- package/dist/core/security/governance.js +0 -79
- package/dist/core/security/privacy.d.ts +0 -23
- package/dist/core/security/privacy.js +0 -82
- package/dist/core/security/secret-detector.d.ts +0 -32
- package/dist/core/security/secret-detector.js +0 -88
- package/dist/core/session/auto-load.d.ts +0 -6
- package/dist/core/session/auto-load.js +0 -119
- package/dist/core/session/index.d.ts +0 -7
- package/dist/core/session/self-iteration-job.d.ts +0 -20
- package/dist/core/session/self-iteration-job.js +0 -282
- package/dist/core/session/session-hooks.d.ts +0 -18
- package/dist/core/session/session-hooks.js +0 -58
- package/dist/core/session/types.d.ts +0 -26
- package/dist/core/session/types.js +0 -10
- package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
- package/dist/core/session-hooks/self-iteration-job.js +0 -282
- package/dist/core/session-hooks/session-hooks.d.ts +0 -18
- package/dist/core/session-hooks/session-hooks.js +0 -58
- package/dist/core/snapshots/cleanup.d.ts +0 -9
- package/dist/core/snapshots/comparison.d.ts +0 -19
- package/dist/core/snapshots/comparison.js +0 -43
- package/dist/core/snapshots/creation.d.ts +0 -19
- package/dist/core/snapshots/creation.js +0 -126
- package/dist/core/snapshots/retrieval.d.ts +0 -7
- package/dist/core/snapshots/retrieval.js +0 -41
- package/dist/core/snapshots/stats.d.ts +0 -11
- package/dist/core/snapshots/stats.js +0 -52
- package/dist/core/snapshots.d.ts +0 -29
- package/dist/core/snapshots.js +0 -220
- package/dist/core/storage/cache.d.ts +0 -13
- package/dist/core/storage/cache.js +0 -202
- package/dist/core/storage/database.d.ts +0 -12
- package/dist/core/storage/database.js +0 -12
- package/dist/core/summarization/cleanup.d.ts +0 -9
- package/dist/core/summarization/queries.d.ts +0 -9
- package/dist/core/summarization/queries.js +0 -28
- package/dist/core/summarization/stats.d.ts +0 -14
- package/dist/core/summarization/stats.js +0 -52
- package/dist/core/summarization/strategies.d.ts +0 -24
- package/dist/core/summarization/strategies.js +0 -28
- package/dist/core/summarization.d.ts +0 -37
- package/dist/core/summarization.js +0 -188
- package/dist/core/sync/qmd-sync.d.ts +0 -94
- package/dist/core/sync/qmd-sync.js +0 -201
- package/dist/core/temporal-facts.d.ts +0 -54
- package/dist/core/temporal-facts.js +0 -193
- package/dist/core/toon.d.ts +0 -43
- package/dist/core/toon.js +0 -160
- package/dist/core/tracing/collector.d.ts +0 -111
- package/dist/core/tracing/collector.js +0 -350
- package/dist/core/tracing/visualizer.d.ts +0 -32
- package/dist/core/tracing/visualizer.js +0 -165
- package/dist/core/utils/cleanup-operations.d.ts +0 -13
- package/dist/core/utils/cleanup-operations.js +0 -44
- package/dist/core/utils/content-extraction.d.ts +0 -19
- package/dist/core/utils/content-extraction.js +0 -75
- package/dist/core/utils/filter-builder.d.ts +0 -13
- package/dist/core/utils/filter-builder.js +0 -44
- package/dist/core/utils/history-traversal.d.ts +0 -13
- package/dist/core/utils/history-traversal.js +0 -50
- package/dist/core/utils/memory-operations.d.ts +0 -17
- package/dist/core/utils/memory-operations.js +0 -43
- package/dist/core/utils/query-operations.d.ts +0 -18
- package/dist/core/utils/query-operations.js +0 -65
- package/dist/core/utils/summarization-helpers.d.ts +0 -21
- package/dist/core/utils/summarization-helpers.js +0 -38
- package/dist/core/utils/temporal-queries.d.ts +0 -13
- package/dist/core/utils/temporal-queries.js +0 -27
- package/dist/core/utils/vector-operations.d.ts +0 -71
- package/dist/core/utils/version-management.d.ts +0 -9
- package/dist/core/utils/version-management.js +0 -61
- package/dist/core/worker.d.ts +0 -82
- package/dist/core/worker.js +0 -272
- package/dist/db/adapter.d.ts +0 -7
- package/dist/db/adapter.js +0 -175
- package/dist/db/bootstrap.d.ts +0 -9
- package/dist/db/drizzle/schema-sqlite.d.ts +0 -4837
- package/dist/db/drizzle/schema-sqlite.js +0 -684
- package/dist/db/drizzle/schema.d.ts +0 -4082
- package/dist/db/drizzle/schema.js +0 -770
- package/dist/db/drizzle.config.d.ts +0 -3
- package/dist/db/drizzle.config.js +0 -12
- package/dist/db/index.d.ts +0 -7
- package/dist/db/index.js +0 -89
- package/dist/db/neon.d.ts +0 -8
- package/dist/db/neon.js +0 -20
- package/dist/db/schema/index.d.ts +0 -40
- package/dist/db/schema/index.js +0 -105
- package/dist/db/schema/tables/context-sessions.d.ts +0 -9
- package/dist/db/schema/tables/context-sessions.js +0 -37
- package/dist/db/schema/tables/conversations.d.ts +0 -9
- package/dist/db/schema/tables/conversations.js +0 -47
- package/dist/db/schema/tables/core-memory.d.ts +0 -9
- package/dist/db/schema/tables/core-memory.js +0 -41
- package/dist/db/schema/tables/entities.d.ts +0 -9
- package/dist/db/schema/tables/entities.js +0 -39
- package/dist/db/schema/tables/entity-relations.d.ts +0 -9
- package/dist/db/schema/tables/entity-relations.js +0 -31
- package/dist/db/schema/tables/learnings.d.ts +0 -9
- package/dist/db/schema/tables/learnings.js +0 -66
- package/dist/db/schema/tables/memories.d.ts +0 -9
- package/dist/db/schema/tables/memories.js +0 -161
- package/dist/db/schema/tables/memory-associations.d.ts +0 -9
- package/dist/db/schema/tables/memory-associations.js +0 -39
- package/dist/db/schema/tables/memory-hash-cache.d.ts +0 -9
- package/dist/db/schema/tables/memory-hash-cache.js +0 -29
- package/dist/db/schema/tables/memory-merge-history.d.ts +0 -9
- package/dist/db/schema/tables/memory-merge-history.js +0 -33
- package/dist/db/schema/tables/memory-merge-proposals.d.ts +0 -9
- package/dist/db/schema/tables/memory-merge-proposals.js +0 -39
- package/dist/db/schema/tables/messages.d.ts +0 -9
- package/dist/db/schema/tables/messages.js +0 -41
- package/dist/db/schema/tables/namespaces.d.ts +0 -9
- package/dist/db/schema/tables/namespaces.js +0 -37
- package/dist/db/schema/tables/projects.d.ts +0 -9
- package/dist/db/schema/tables/projects.js +0 -31
- package/dist/db/schema/tables/users.d.ts +0 -9
- package/dist/db/schema/tables/users.js +0 -27
- package/dist/db/schema.d.ts +0 -3
- package/dist/db/schema.js +0 -11
- package/dist/db/supabase.d.ts +0 -9
- package/dist/db/supabase.js +0 -24
- package/dist/index.d.ts +0 -7
- package/dist/index.js +0 -1677
- package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
- package/dist/webui/server.d.ts +0 -5
- package/dist/webui/server.js +0 -642
- package/generated/mcp/manifest.json +0 -23
- package/generated/mcp/mcp-servers.json +0 -25
- package/generated/mcp/mcporter.json +0 -34
- package/generated/mcp/openclaw-memory-qmd.json +0 -17
- package/generated/mcp/runtime.json +0 -12
- package/scripts/README.md +0 -60
- package/scripts/build-release.sh +0 -36
- package/scripts/check-secrets.js +0 -132
- package/scripts/copy-runtime-assets.mjs +0 -26
- package/scripts/generate-mcp.mjs +0 -264
- package/scripts/github-release.sh +0 -77
- package/scripts/init-dirs.mjs +0 -13
- package/scripts/install-claude-code.sh +0 -85
- package/scripts/install-cursor.sh +0 -56
- package/scripts/install-hooks.sh +0 -73
- package/scripts/install-interactive.mjs +0 -357
- package/scripts/install-opencode.sh +0 -75
- package/scripts/install-plugin.mjs +0 -415
- package/scripts/install-windsurf.sh +0 -67
- package/scripts/remote-preflight.mjs +0 -62
- package/scripts/squish-fallback.mjs +0 -132
- package/scripts/test-interactive.mjs +0 -131
- package/scripts/verify-mcp.mjs +0 -214
- package/skills/squish-memory/scripts/install.mjs +0 -335
- package/skills/squish-memory/write_skill.js +0 -2
|
@@ -1,14 +1,43 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
89
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
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
|
-
|
|
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
|
-
|
|
463
|
-
|
|
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
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
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
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
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
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
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
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
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
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
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
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
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
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
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
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
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
|
-
|
|
666
|
-
|
|
667
|
-
|
|
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
|
-
|
|
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
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
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
|
-
|
|
706
|
-
|
|
707
|
-
|
|
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
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
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
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
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
|
-
|
|
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
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
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
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
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
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
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
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
//
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
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
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
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
|
-
|
|
1050
|
+
|
|
1051
|
+
export async function ensurePostgresSchema(pool: Pool): Promise<void> {
|
|
1052
|
+
for (const statement of postgresStatements) {
|
|
1053
|
+
await pool.query(statement);
|
|
1054
|
+
}
|
|
1055
|
+
}
|