squish-memory 1.0.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +146 -0
- package/CHANGELOG.md +202 -0
- package/README.md +192 -287
- 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 +46 -0
- package/bin/squish.mjs +33 -0
- package/config/mcp-migration-map.json +1 -6
- package/config/mcp-mode-semantics.json +10 -12
- package/config/mcp-remote-auth.json +3 -26
- package/config/mcp-universal.schema.json +5 -35
- package/config/settings.json +78 -22
- 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/core/algorithms/index.ts +39 -0
- 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/core/embeddings/local-embeddings.ts +12 -0
- 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/core/lib/db-client.ts +168 -0
- package/core/lib/parse-embedding.ts +59 -0
- package/core/lib/schemas.ts +102 -0
- 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/core/memory/index.ts +11 -0
- 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/core/places/index.ts +14 -0
- 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 +581 -0
- package/core/scheduler/heartbeat.ts +91 -0
- package/core/scheduler/index.ts +8 -0
- 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/core/search/index.ts +4 -0
- 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/core/session/index.ts +7 -0
- 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/core/snapshots/cleanup.ts +13 -0
- 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/core/summarization/cleanup.ts +13 -0
- 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/core/utils/vector-operations.ts +135 -0
- package/core/utils/version-management.ts +74 -0
- package/core/worker.ts +324 -0
- package/db/adapter.ts +215 -0
- package/db/bootstrap.ts +1055 -0
- 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/dist/config.d.ts +61 -14
- package/dist/config.js +159 -139
- package/dist/core/adapters/config/claude-code.d.ts +45 -0
- package/dist/core/adapters/config/claude-code.js +113 -0
- package/dist/core/adapters/config/cursor.d.ts +26 -0
- package/dist/core/adapters/config/cursor.js +74 -0
- package/dist/core/adapters/config/opencode.d.ts +23 -0
- package/dist/core/adapters/config/opencode.js +73 -0
- package/dist/core/adapters/config/windsurf.d.ts +26 -0
- package/dist/core/adapters/config/windsurf.js +74 -0
- package/dist/core/adapters/index.d.ts +45 -0
- package/dist/core/adapters/index.js +84 -0
- package/dist/core/adapters/scripts/install-adapter.d.ts +19 -0
- package/dist/core/adapters/scripts/install-adapter.js +149 -0
- package/dist/core/adapters/timeline.d.ts +23 -0
- package/dist/core/adapters/timeline.js +88 -0
- package/dist/core/adapters/types.d.ts +137 -0
- package/dist/core/adapters/types.js +50 -0
- package/dist/core/agent-preferences.d.ts +16 -0
- package/dist/core/agent-preferences.js +124 -0
- package/dist/{algorithms → core/algorithms}/analytics/token-estimator.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/analytics/token-estimator.js +3 -3
- package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.js +1 -1
- package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.js +7 -10
- package/dist/{algorithms → core/algorithms}/handlers/approve-merge.js +4 -4
- package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/get-stats.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/list-proposals.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/preview-merge.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/reject-merge.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.js +3 -3
- package/dist/core/algorithms/index.d.ts +21 -0
- package/dist/core/algorithms/index.js +26 -0
- package/dist/core/algorithms/operations/cache-maintenance.d.ts +12 -0
- package/dist/core/algorithms/operations/cache-maintenance.js +157 -0
- package/dist/{algorithms → core/algorithms}/safety/safety-checks.d.ts +2 -6
- package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.d.ts +19 -1
- package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.js +74 -123
- package/dist/core/algorithms/types.d.ts +125 -0
- package/dist/core/algorithms/types.js +5 -0
- package/dist/core/associations.d.ts +3 -2
- package/dist/core/associations.js +37 -2
- package/dist/core/autosave.d.ts +19 -0
- package/dist/core/autosave.js +16 -0
- package/dist/core/beliefs/decay.d.ts +27 -0
- package/dist/core/beliefs/decay.js +217 -0
- package/dist/core/beliefs/extractor.d.ts +9 -0
- package/dist/core/beliefs/extractor.js +113 -0
- package/dist/core/beliefs/store.d.ts +46 -0
- package/dist/core/beliefs/store.js +466 -0
- package/dist/core/beliefs/types.d.ts +28 -0
- package/dist/core/beliefs/types.js +2 -0
- package/dist/core/commands/mcp-server.d.ts +2 -0
- package/dist/core/commands/mcp-server.js +6 -0
- package/dist/core/commands/remember.d.ts +24 -0
- package/dist/core/commands/remember.js +144 -0
- package/dist/core/compression.d.ts +45 -0
- package/dist/core/compression.js +160 -0
- package/dist/core/context/agent-context.d.ts +106 -0
- package/dist/core/context/agent-context.js +274 -0
- package/dist/core/{context-paging.d.ts → context/context-paging.d.ts} +2 -12
- package/dist/core/{context-paging.js → context/context-paging.js} +19 -39
- package/dist/core/context/context-window.d.ts +40 -0
- package/dist/core/context/context-window.js +177 -0
- package/dist/core/context/context.js +22 -0
- package/dist/core/embeddings/embeddings.d.ts +29 -0
- package/dist/core/embeddings/embeddings.js +546 -0
- package/dist/core/embeddings/google-multimodal.js +6 -2
- package/dist/core/embeddings/local-embeddings.d.ts +11 -0
- package/dist/core/embeddings/local-embeddings.js +11 -0
- package/dist/core/embeddings/qmd-client.js +1 -1
- package/dist/core/embeddings/transformers-local.d.ts +64 -0
- package/dist/core/embeddings/transformers-local.js +213 -0
- package/dist/core/embeddings.d.ts +1 -28
- package/dist/core/embeddings.js +2 -401
- package/dist/core/error-handling.d.ts +63 -0
- package/dist/core/error-handling.js +173 -0
- package/dist/core/graph/entity-deduplicator.d.ts +24 -0
- package/dist/core/graph/entity-deduplicator.js +183 -0
- package/dist/core/graph/graph-builder.d.ts +46 -0
- package/dist/core/graph/graph-builder.js +174 -0
- package/dist/core/graph/graph-traversal.d.ts +80 -0
- package/dist/core/graph/graph-traversal.js +315 -0
- package/dist/core/graph/index.d.ts +19 -0
- package/dist/core/graph/index.js +13 -0
- package/dist/core/graph/llm-entity-extractor.d.ts +49 -0
- package/dist/core/graph/llm-entity-extractor.js +313 -0
- package/dist/core/graph/multi-hop-retrieval.d.ts +48 -0
- package/dist/core/graph/multi-hop-retrieval.js +215 -0
- package/dist/core/graph/relationship-extractor.d.ts +48 -0
- package/dist/core/graph/relationship-extractor.js +351 -0
- package/dist/core/hooks/agent-hooks.d.ts +83 -0
- package/dist/core/hooks/agent-hooks.js +521 -0
- package/dist/core/hooks/auto-tagger.d.ts +19 -0
- package/dist/core/hooks/auto-tagger.js +155 -0
- package/dist/core/hooks/capture-filter.d.ts +41 -0
- package/dist/core/hooks/capture-filter.js +128 -0
- package/dist/core/hot-cache.d.ts +86 -0
- package/dist/core/hot-cache.js +285 -0
- package/dist/core/index.d.ts +9 -9
- package/dist/core/index.js +9 -12
- package/dist/core/{agent-memory.js → ingestion/agent-memory.js} +5 -7
- package/dist/core/{core-memory.d.ts → ingestion/core-memory.d.ts} +2 -2
- package/dist/core/{core-memory.js → ingestion/core-memory.js} +7 -7
- package/dist/core/ingestion/learnings.d.ts +57 -0
- package/dist/core/ingestion/learnings.js +205 -0
- package/dist/core/ingestion/signal-engine.d.ts +41 -0
- package/dist/core/ingestion/signal-engine.js +201 -0
- package/dist/core/integrations/obsidian-vault.d.ts +31 -0
- package/dist/core/integrations/obsidian-vault.js +156 -0
- package/dist/core/lib/db-client.d.ts +114 -0
- package/dist/core/lib/db-client.js +130 -0
- package/dist/core/lib/parse-embedding.d.ts +9 -0
- package/dist/core/lib/parse-embedding.js +58 -0
- package/dist/core/lib/schemas.d.ts +132 -0
- package/dist/core/lib/schemas.js +87 -0
- package/dist/core/lib/types.d.ts +45 -0
- package/dist/core/lib/types.js +6 -0
- package/dist/core/{utils.d.ts → lib/utils.d.ts} +5 -0
- package/dist/core/lib/utils.js +145 -0
- package/dist/core/lib/validation.d.ts +38 -0
- package/dist/core/lib/validation.js +151 -0
- package/dist/core/lifecycle.d.ts +7 -1
- package/dist/core/lifecycle.js +152 -42
- package/dist/core/logger.d.ts +1 -0
- package/dist/core/logger.js +13 -1
- package/dist/core/mcp/tools.d.ts +0 -2
- package/dist/core/mcp/tools.js +35 -90
- package/dist/core/mcp/types.d.ts +25 -253
- package/dist/core/mcp/types.js +2 -2
- package/dist/core/memory/categorizer.js +2 -0
- package/dist/core/memory/conflict-detector.js +1 -1
- package/dist/core/memory/consolidation.d.ts +1 -10
- package/dist/core/memory/consolidation.js +4 -39
- package/dist/core/memory/context-collector.js +1 -1
- package/dist/core/memory/edit-workflow.js +1 -1
- package/dist/core/memory/entity-extractor.d.ts +4 -0
- package/dist/core/memory/entity-extractor.js +30 -16
- package/dist/core/memory/entity-resolver.js +7 -7
- package/dist/core/memory/explain.d.ts +18 -0
- package/dist/core/memory/explain.js +92 -0
- package/dist/core/memory/fact-deriver.d.ts +31 -0
- package/dist/core/memory/fact-deriver.js +236 -0
- package/dist/core/memory/fact-extractor.js +12 -12
- package/dist/core/memory/feedback-tracker.js +1 -1
- package/dist/core/memory/hooks.d.ts +88 -0
- package/dist/core/memory/hooks.js +174 -0
- package/dist/core/memory/hybrid-retrieval.d.ts +14 -16
- package/dist/core/memory/hybrid-retrieval.js +25 -127
- package/dist/core/memory/hybrid-scorer.js +6 -23
- package/dist/core/memory/hybrid-search.d.ts +9 -11
- package/dist/core/memory/hybrid-search.js +496 -273
- package/dist/core/memory/importance.d.ts +2 -24
- package/dist/core/memory/importance.js +7 -91
- package/dist/core/memory/index.d.ts +1 -0
- package/dist/core/memory/index.js +1 -0
- package/dist/core/memory/loader.d.ts +31 -0
- package/dist/core/memory/loader.js +141 -0
- package/dist/core/memory/markdown/markdown-storage.d.ts +72 -0
- package/dist/core/memory/markdown/markdown-storage.js +243 -0
- package/dist/core/memory/memories.d.ts +23 -19
- package/dist/core/memory/memories.js +243 -228
- package/dist/core/memory/memory-lifecycle.d.ts +8 -0
- package/dist/core/memory/memory-lifecycle.js +47 -0
- package/dist/core/memory/migrate.d.ts +21 -0
- package/dist/core/memory/migrate.js +134 -0
- package/dist/core/memory/normalization.d.ts +7 -0
- package/dist/core/memory/normalization.js +26 -0
- package/dist/core/memory/path-strengthener.d.ts +39 -0
- package/dist/core/memory/path-strengthener.js +150 -0
- package/dist/core/memory/progressive-disclosure.js +1 -1
- package/dist/core/memory/query-processor.js +37 -3
- package/dist/core/memory/query-rewriter.js +9 -9
- package/dist/core/memory/retrieval-feedback.d.ts +70 -0
- package/dist/core/memory/retrieval-feedback.js +213 -0
- package/dist/core/memory/serialization.d.ts +4 -0
- package/dist/core/memory/serialization.js +49 -0
- package/dist/core/memory/stale-cleaner.d.ts +26 -0
- package/dist/core/memory/stale-cleaner.js +97 -0
- package/dist/core/memory/stats.d.ts +15 -0
- package/dist/core/memory/stats.js +69 -13
- package/dist/core/memory/temporal-facts.js +21 -0
- package/dist/core/memory/trigger-detector.d.ts +8 -1
- package/dist/core/memory/trigger-detector.js +42 -5
- package/dist/core/memory/write-gate.js +1 -1
- package/dist/core/places/index.d.ts +14 -0
- package/dist/core/places/index.js +14 -0
- package/dist/core/places/memory-places.d.ts +68 -0
- package/dist/core/places/memory-places.js +261 -0
- package/dist/core/places/places.d.ts +88 -0
- package/dist/core/places/places.js +314 -0
- package/dist/core/places/rules.d.ts +74 -0
- package/dist/core/places/rules.js +240 -0
- package/dist/core/places/walking.d.ts +56 -0
- package/dist/core/places/walking.js +121 -0
- package/dist/core/projects.d.ts +5 -0
- package/dist/core/projects.js +47 -18
- package/dist/core/responses.d.ts +96 -0
- package/dist/core/responses.js +122 -0
- package/dist/core/runtime/trust-report.d.ts +102 -0
- package/dist/core/runtime/trust-report.js +107 -0
- package/dist/core/runtime/trust-state.d.ts +12 -0
- package/dist/core/runtime/trust-state.js +309 -0
- package/dist/core/scheduler/cron-scheduler.d.ts +1 -1
- package/dist/core/scheduler/cron-scheduler.js +193 -10
- package/dist/core/scheduler/index.d.ts +1 -1
- package/dist/core/scheduler/index.js +1 -1
- package/dist/core/scheduler/job-runner.js +2 -2
- package/dist/core/search/conversations.js +40 -42
- package/dist/core/search/entities.js +6 -9
- package/dist/core/search/graph-boost.d.ts +7 -0
- package/dist/core/search/graph-boost.js +23 -0
- package/dist/core/search/qmd-wrapper.d.ts +36 -0
- package/dist/core/search/qmd-wrapper.js +58 -0
- package/dist/core/security/encrypt.d.ts +6 -0
- package/dist/core/security/encrypt.js +47 -0
- package/dist/core/{governance.d.ts → security/governance.d.ts} +6 -1
- package/dist/core/security/governance.js +79 -0
- package/dist/core/session/auto-load.js +34 -9
- package/dist/core/session/entity-tracker.d.ts +62 -0
- package/dist/core/session/entity-tracker.js +287 -0
- package/dist/core/session/index.d.ts +1 -1
- package/dist/core/session/index.js +1 -1
- package/dist/core/session/reference-resolver.d.ts +26 -0
- package/dist/core/session/reference-resolver.js +121 -0
- package/dist/core/{session-hooks → session}/self-iteration-job.d.ts +15 -0
- package/dist/core/{session-hooks → session}/self-iteration-job.js +195 -90
- package/dist/core/session/working-set.d.ts +50 -0
- package/dist/core/session/working-set.js +212 -0
- package/dist/core/snapshots/creation.d.ts +2 -8
- package/dist/core/snapshots/creation.js +3 -12
- package/dist/core/{cache.js → storage/cache.js} +2 -2
- package/dist/core/utils/memory-operations.js +1 -1
- package/dist/core/utils/summarization-helpers.d.ts +0 -4
- package/dist/core/utils/summarization-helpers.js +1 -6
- package/dist/core/utils/vector-operations.d.ts +71 -0
- package/dist/core/utils/vector-operations.js +129 -0
- package/dist/db/adapter.d.ts +3 -3
- package/dist/db/adapter.js +99 -88
- package/dist/db/bootstrap.d.ts +2 -0
- package/dist/db/bootstrap.js +921 -674
- package/dist/{drizzle → db/drizzle}/schema-sqlite.d.ts +775 -25
- package/dist/{drizzle → db/drizzle}/schema-sqlite.js +170 -24
- package/dist/{drizzle → db/drizzle}/schema.d.ts +731 -32
- package/dist/{drizzle → db/drizzle}/schema.js +192 -32
- package/dist/db/drizzle.config.d.ts +3 -0
- package/dist/db/drizzle.config.js +12 -0
- package/dist/db/index.d.ts +1 -5
- package/dist/db/index.js +51 -8
- package/dist/db/migrations/associations.d.ts +6 -0
- package/dist/db/migrations/associations.js +29 -0
- package/dist/db/migrations/beliefs.d.ts +10 -0
- package/dist/db/migrations/beliefs.js +76 -0
- package/dist/db/migrations/core-memory.d.ts +6 -0
- package/dist/db/migrations/core-memory.js +29 -0
- package/dist/db/migrations/fts.d.ts +6 -0
- package/dist/db/migrations/fts.js +52 -0
- package/dist/db/migrations/index.d.ts +25 -0
- package/dist/db/migrations/index.js +51 -0
- package/dist/db/migrations/indexes.d.ts +6 -0
- package/dist/db/migrations/indexes.js +30 -0
- package/dist/db/migrations/learnings.d.ts +7 -0
- package/dist/db/migrations/learnings.js +26 -0
- package/dist/db/migrations/maintenance.d.ts +6 -0
- package/dist/db/migrations/maintenance.js +61 -0
- package/dist/db/migrations/memories.d.ts +7 -0
- package/dist/db/migrations/memories.js +16 -0
- package/dist/db/migrations/memory-places.d.ts +6 -0
- package/dist/db/migrations/memory-places.js +29 -0
- package/dist/db/migrations/places.d.ts +6 -0
- package/dist/db/migrations/places.js +43 -0
- package/dist/db/migrations/projects.d.ts +3 -0
- package/dist/db/migrations/projects.js +13 -0
- package/dist/db/migrations/tier-conversion.d.ts +7 -0
- package/dist/db/migrations/tier-conversion.js +20 -0
- package/dist/db/neon.d.ts +8 -0
- package/dist/db/neon.js +20 -0
- package/dist/db/schema/beliefs.d.ts +9 -0
- package/dist/db/schema/beliefs.js +46 -0
- package/dist/db/schema/generator.d.ts +38 -0
- package/dist/db/schema/generator.js +108 -0
- package/dist/db/schema/index.d.ts +39 -0
- package/dist/db/schema/index.js +51 -0
- package/dist/db/schema/learnings.d.ts +7 -0
- package/dist/db/schema/learnings.js +30 -0
- package/dist/db/schema/memories.d.ts +7 -0
- package/dist/db/schema/memories.js +81 -0
- package/dist/db/schema/projects.d.ts +4 -0
- package/dist/db/schema/projects.js +31 -0
- package/dist/db/schema/tables/context-sessions.d.ts +9 -0
- package/dist/db/schema/tables/context-sessions.js +37 -0
- package/dist/db/schema/tables/conversations.d.ts +9 -0
- package/dist/db/schema/tables/conversations.js +47 -0
- package/dist/db/schema/tables/core-memory.d.ts +9 -0
- package/dist/db/schema/tables/core-memory.js +41 -0
- package/dist/db/schema/tables/entities.d.ts +9 -0
- package/dist/db/schema/tables/entities.js +39 -0
- package/dist/db/schema/tables/entity-relations.d.ts +9 -0
- package/dist/db/schema/tables/entity-relations.js +31 -0
- package/dist/db/schema/tables/learnings.d.ts +9 -0
- package/dist/db/schema/tables/learnings.js +66 -0
- package/dist/db/schema/tables/memories.d.ts +9 -0
- package/dist/db/schema/tables/memories.js +161 -0
- package/dist/db/schema/tables/memory-associations.d.ts +9 -0
- package/dist/db/schema/tables/memory-associations.js +39 -0
- package/dist/db/schema/tables/memory-hash-cache.d.ts +9 -0
- package/dist/db/schema/tables/memory-hash-cache.js +29 -0
- package/dist/db/schema/tables/memory-merge-history.d.ts +9 -0
- package/dist/db/schema/tables/memory-merge-history.js +33 -0
- package/dist/db/schema/tables/memory-merge-proposals.d.ts +9 -0
- package/dist/db/schema/tables/memory-merge-proposals.js +39 -0
- package/dist/db/schema/tables/messages.d.ts +9 -0
- package/dist/db/schema/tables/messages.js +41 -0
- package/dist/db/schema/tables/namespaces.d.ts +9 -0
- package/dist/db/schema/tables/namespaces.js +37 -0
- package/dist/db/schema/tables/projects.d.ts +9 -0
- package/dist/db/schema/tables/projects.js +31 -0
- package/dist/db/schema/tables/users.d.ts +9 -0
- package/dist/db/schema/tables/users.js +27 -0
- package/dist/db/schema.d.ts +1 -1
- package/dist/db/schema.js +2 -2
- package/dist/db/supabase.d.ts +9 -0
- package/dist/db/supabase.js +24 -0
- package/dist/packages/mcp/src/index.d.ts +3 -0
- package/dist/packages/mcp/src/index.js +733 -0
- package/mcp.json.example +8 -0
- package/package.json +132 -173
- 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 +877 -0
- package/packages/mcp/tsconfig.json +20 -0
- package/skills/squish-memory/SKILL.md +107 -114
- package/skills/squish-memory/install.sh +3 -3
- package/skills/squish-memory/{claude-desktop.json → references/claude-desktop.json} +12 -12
- package/skills/squish-memory/{openclaw.json → references/openclaw.json} +13 -13
- package/skills/squish-memory/{opencode.json → references/opencode.json} +14 -14
- package/.claude-plugin/marketplace.json +0 -20
- package/.claude-plugin/plugin.json +0 -32
- package/.env.mcp.example +0 -60
- package/.mcp.json +0 -11
- package/QUICK-START.md +0 -71
- package/bin/squish-add.mjs +0 -32
- package/bin/squish-rm.mjs +0 -21
- package/commands/context-paging.md +0 -51
- package/commands/context-status.md +0 -22
- package/commands/context.md +0 -5
- package/commands/core-memory.md +0 -56
- package/commands/health.md +0 -5
- package/commands/init.md +0 -39
- package/commands/merge.md +0 -113
- package/commands/observe.md +0 -5
- package/commands/recall.md +0 -5
- package/commands/remember.md +0 -11
- package/commands/search.md +0 -10
- package/config/mcp-cli-fallback-policy.json +0 -22
- package/config/mcp.json +0 -38
- package/config/plugin-manifest.json +0 -152
- package/config/plugin-manifest.schema.json +0 -244
- package/config/remote-memory-policy.json +0 -32
- package/dist/api/web/index.d.ts +0 -3
- package/dist/api/web/index.js +0 -4
- package/dist/api/web/web-server.d.ts +0 -3
- package/dist/api/web/web-server.js +0 -6
- package/dist/api/web/web.d.ts +0 -4
- package/dist/api/web/web.js +0 -639
- package/dist/commands/managed-sync.d.ts +0 -10
- package/dist/commands/managed-sync.js +0 -64
- package/dist/commands/mcp-server.d.ts +0 -3
- package/dist/commands/mcp-server.js +0 -393
- package/dist/core/context.js +0 -24
- package/dist/core/governance.js +0 -64
- package/dist/core/local-embeddings.d.ts +0 -6
- package/dist/core/local-embeddings.js +0 -20
- 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/observations.d.ts +0 -26
- package/dist/core/observations.js +0 -110
- package/dist/core/requirements.d.ts +0 -20
- package/dist/core/requirements.js +0 -35
- package/dist/core/search/qmd-search.d.ts +0 -61
- package/dist/core/search/qmd-search.js +0 -178
- package/dist/core/snapshots.d.ts +0 -29
- package/dist/core/snapshots.js +0 -220
- package/dist/core/sync/qmd-sync.d.ts +0 -106
- package/dist/core/sync/qmd-sync.js +0 -213
- package/dist/core/utils.js +0 -74
- package/dist/index.d.ts +0 -19
- package/dist/index.js +0 -997
- 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/hooks/hooks.json +0 -52
- package/hooks/post-tool-use.js +0 -26
- package/hooks/session-end.js +0 -28
- package/hooks/session-start.js +0 -33
- package/hooks/user-prompt-submit.js +0 -26
- package/hooks/utils.js +0 -153
- package/npx-installer.js +0 -208
- package/packages/plugin-claude-code/README.md +0 -73
- package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +0 -35
- package/packages/plugin-claude-code/dist/plugin-wrapper.js +0 -191
- package/packages/plugin-claude-code/package.json +0 -31
- package/packages/plugin-openclaw/README.md +0 -70
- package/packages/plugin-openclaw/dist/index.d.ts +0 -49
- package/packages/plugin-openclaw/dist/index.js +0 -262
- package/packages/plugin-openclaw/openclaw.plugin.json +0 -94
- package/packages/plugin-openclaw/package.json +0 -31
- package/packages/plugin-opencode/install.mjs +0 -217
- package/packages/plugin-opencode/package.json +0 -21
- package/plugin.json +0 -32
- package/scripts/build-release.sh +0 -36
- package/scripts/check-secrets.js +0 -132
- package/scripts/db/check-db.mjs +0 -88
- package/scripts/db/fix-all-columns.mjs +0 -52
- package/scripts/db/fix-schema-all.mjs +0 -55
- package/scripts/db/fix-schema-full.mjs +0 -46
- package/scripts/db/fix-schema.mjs +0 -38
- package/scripts/db/init-db.mjs +0 -13
- package/scripts/db/recreate-db.mjs +0 -14
- package/scripts/generate-mcp.mjs +0 -264
- package/scripts/github-release.sh +0 -77
- package/scripts/init-dirs.mjs +0 -13
- package/scripts/install-interactive.mjs +0 -677
- package/scripts/install-mcp.mjs +0 -116
- package/scripts/install-plugin.mjs +0 -415
- package/scripts/install-web.sh +0 -120
- package/scripts/install.mjs +0 -340
- package/scripts/openclaw-bootstrap.mjs +0 -127
- package/scripts/package-release.sh +0 -71
- package/scripts/remote-preflight.mjs +0 -62
- package/scripts/squish-fallback.mjs +0 -132
- package/scripts/test/test-all-systems.mjs +0 -139
- package/scripts/test/test-memory-system.mjs +0 -139
- package/scripts/test/test-v0.5.0.mjs +0 -210
- package/scripts/test-interactive.mjs +0 -131
- package/scripts/verify-mcp.mjs +0 -214
- package/skills/memory-guide/SKILL.md +0 -332
- package/skills/squish-cli/SKILL.md +0 -240
- package/skills/squish-mcp/SKILL.md +0 -355
- package/skills/squish-memory/install.mjs +0 -335
- package/skills/squish-memory/skill.json +0 -32
- /package/dist/{algorithms → core/algorithms}/detection/hash-filters.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/detection/hash-filters.js +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/approve-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/get-stats.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/list-proposals.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/preview-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/reject-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/safety/safety-checks.js +0 -0
- /package/dist/{algorithms → core/algorithms}/utils/response-builder.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/utils/response-builder.js +0 -0
- /package/dist/core/{context.d.ts → context/context.d.ts} +0 -0
- /package/dist/core/{agent-memory.d.ts → ingestion/agent-memory.d.ts} +0 -0
- /package/dist/core/{privacy.d.ts → security/privacy.d.ts} +0 -0
- /package/dist/core/{privacy.js → security/privacy.js} +0 -0
- /package/dist/core/{secret-detector.d.ts → security/secret-detector.d.ts} +0 -0
- /package/dist/core/{secret-detector.js → security/secret-detector.js} +0 -0
- /package/dist/core/{session-hooks → session}/session-hooks.d.ts +0 -0
- /package/dist/core/{session-hooks → session}/session-hooks.js +0 -0
- /package/dist/core/{cache.d.ts → storage/cache.d.ts} +0 -0
- /package/dist/core/{database.d.ts → storage/database.d.ts} +0 -0
- /package/dist/core/{database.js → storage/database.js} +0 -0
package/dist/db/bootstrap.js
CHANGED
|
@@ -1,577 +1,945 @@
|
|
|
1
1
|
import { existsSync, mkdirSync } from 'fs';
|
|
2
2
|
import { logger } from '../core/logger.js';
|
|
3
3
|
import { getDataDir } from '../config.js';
|
|
4
|
+
import { runAllMigrations } from './migrations/index.js';
|
|
4
5
|
/**
|
|
5
6
|
* Note on boolean columns:
|
|
6
7
|
* SQLite uses INTEGER 0/1 for boolean values (no native boolean type)
|
|
7
8
|
* PostgreSQL uses native BOOLEAN type
|
|
8
9
|
*/
|
|
9
|
-
const sqliteSchemaSql = `
|
|
10
|
-
PRAGMA foreign_keys = ON;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
CREATE
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
10
|
+
const sqliteSchemaSql = `
|
|
11
|
+
PRAGMA foreign_keys = ON;
|
|
12
|
+
|
|
13
|
+
-- Schema version tracking table (v1.2.0+)
|
|
14
|
+
CREATE TABLE IF NOT EXISTS _schema_versions (
|
|
15
|
+
version TEXT PRIMARY KEY,
|
|
16
|
+
description TEXT NOT NULL,
|
|
17
|
+
applied_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
-- Agent preferences table (v1.2.0+) - stores accumulated agent preferences from learnings
|
|
21
|
+
CREATE TABLE IF NOT EXISTS agent_preferences (
|
|
22
|
+
id TEXT PRIMARY KEY,
|
|
23
|
+
project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
|
|
24
|
+
key TEXT NOT NULL,
|
|
25
|
+
value TEXT NOT NULL,
|
|
26
|
+
source_memory_id TEXT,
|
|
27
|
+
confidence REAL DEFAULT 0.5,
|
|
28
|
+
usage_count INTEGER DEFAULT 1,
|
|
29
|
+
last_updated INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
30
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
31
|
+
UNIQUE(project_id, key)
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
CREATE INDEX IF NOT EXISTS agent_preferences_project_idx ON agent_preferences(project_id);
|
|
35
|
+
CREATE INDEX IF NOT EXISTS agent_preferences_key_idx ON agent_preferences(key);
|
|
36
|
+
|
|
37
|
+
CREATE TABLE IF NOT EXISTS users (
|
|
38
|
+
id TEXT PRIMARY KEY,
|
|
39
|
+
external_id TEXT UNIQUE,
|
|
40
|
+
name TEXT,
|
|
41
|
+
email TEXT,
|
|
42
|
+
preferences TEXT,
|
|
43
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
44
|
+
updated_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
CREATE TABLE IF NOT EXISTS projects (
|
|
48
|
+
id TEXT PRIMARY KEY,
|
|
49
|
+
name TEXT NOT NULL,
|
|
50
|
+
path TEXT NOT NULL,
|
|
51
|
+
description TEXT,
|
|
52
|
+
metadata TEXT,
|
|
53
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
54
|
+
updated_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
CREATE INDEX IF NOT EXISTS projects_path_idx ON projects(path);
|
|
58
|
+
|
|
59
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
60
|
+
id TEXT PRIMARY KEY,
|
|
61
|
+
project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
|
|
62
|
+
user_id TEXT REFERENCES users(id) ON DELETE SET NULL,
|
|
63
|
+
type TEXT NOT NULL,
|
|
64
|
+
content TEXT NOT NULL,
|
|
65
|
+
summary TEXT,
|
|
66
|
+
embedding_json TEXT,
|
|
67
|
+
embedding BLOB,
|
|
68
|
+
source TEXT,
|
|
69
|
+
confidence INTEGER DEFAULT 50,
|
|
70
|
+
confidence_level TEXT DEFAULT 'speculative',
|
|
71
|
+
tags TEXT,
|
|
72
|
+
metadata TEXT,
|
|
73
|
+
is_private INTEGER DEFAULT 0,
|
|
74
|
+
has_secrets INTEGER DEFAULT 0,
|
|
75
|
+
relevance_score INTEGER DEFAULT 50,
|
|
76
|
+
is_active INTEGER DEFAULT 1,
|
|
77
|
+
expires_at INTEGER,
|
|
78
|
+
access_count INTEGER DEFAULT 0,
|
|
79
|
+
last_accessed_at INTEGER,
|
|
80
|
+
is_merged INTEGER DEFAULT 0,
|
|
81
|
+
merged_into_id TEXT,
|
|
82
|
+
merged_at INTEGER,
|
|
57
83
|
is_canonical INTEGER DEFAULT 0,
|
|
58
84
|
merge_source_ids TEXT,
|
|
59
85
|
is_mergeable INTEGER DEFAULT 1,
|
|
60
86
|
merge_version INTEGER DEFAULT 1,
|
|
87
|
+
namespace_id TEXT REFERENCES namespaces(id) ON DELETE SET NULL,
|
|
88
|
+
namespace_path TEXT,
|
|
89
|
+
has_l0_abstract INTEGER DEFAULT 0,
|
|
90
|
+
has_l1_overview INTEGER DEFAULT 0,
|
|
91
|
+
last_layer_update INTEGER,
|
|
61
92
|
importance_score INTEGER DEFAULT 50,
|
|
62
93
|
importance_decay_rate INTEGER DEFAULT 30,
|
|
63
94
|
last_importance_recalc INTEGER,
|
|
95
|
+
retrieval_priority INTEGER DEFAULT 50,
|
|
96
|
+
tokens_estimate INTEGER DEFAULT 0,
|
|
64
97
|
consolidated_into TEXT,
|
|
65
98
|
consolidated_at INTEGER,
|
|
66
99
|
is_consolidated INTEGER DEFAULT 0,
|
|
67
100
|
sector TEXT DEFAULT 'episodic',
|
|
68
101
|
tier TEXT DEFAULT 'hot',
|
|
102
|
+
status TEXT DEFAULT 'active',
|
|
103
|
+
encrypted_content TEXT,
|
|
104
|
+
encryption_nonce TEXT,
|
|
105
|
+
is_encrypted INTEGER DEFAULT 0,
|
|
69
106
|
context_status TEXT DEFAULT 'out-of-context',
|
|
70
107
|
decay_rate INTEGER DEFAULT 30,
|
|
71
108
|
coactivation_score INTEGER DEFAULT 0,
|
|
72
109
|
last_decay_at INTEGER DEFAULT (strftime('%s','now')),
|
|
73
|
-
agent_id TEXT,
|
|
74
|
-
agent_role TEXT,
|
|
75
|
-
visibility_scope TEXT DEFAULT 'private',
|
|
76
|
-
is_protected INTEGER DEFAULT 0,
|
|
77
|
-
is_pinned INTEGER DEFAULT 0,
|
|
78
|
-
is_immutable INTEGER DEFAULT 0,
|
|
79
|
-
write_scope TEXT,
|
|
80
|
-
read_scope TEXT,
|
|
81
|
-
triggered_by TEXT,
|
|
82
|
-
capture_reason TEXT,
|
|
83
|
-
last_used_at INTEGER,
|
|
110
|
+
agent_id TEXT,
|
|
111
|
+
agent_role TEXT,
|
|
112
|
+
visibility_scope TEXT DEFAULT 'private',
|
|
113
|
+
is_protected INTEGER DEFAULT 0,
|
|
114
|
+
is_pinned INTEGER DEFAULT 0,
|
|
115
|
+
is_immutable INTEGER DEFAULT 0,
|
|
116
|
+
write_scope TEXT,
|
|
117
|
+
read_scope TEXT,
|
|
118
|
+
triggered_by TEXT,
|
|
119
|
+
capture_reason TEXT,
|
|
120
|
+
last_used_at INTEGER,
|
|
84
121
|
usage_count INTEGER DEFAULT 0,
|
|
85
122
|
valid_from INTEGER,
|
|
86
123
|
valid_to INTEGER,
|
|
124
|
+
recorded_at INTEGER DEFAULT (strftime('%s','now')),
|
|
87
125
|
superseded_by TEXT,
|
|
88
126
|
version INTEGER DEFAULT 1,
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
)
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
CREATE INDEX IF NOT EXISTS
|
|
96
|
-
CREATE INDEX IF NOT EXISTS
|
|
97
|
-
|
|
98
|
-
CREATE
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
)
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
CREATE INDEX IF NOT EXISTS
|
|
183
|
-
|
|
184
|
-
CREATE
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
CREATE
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
);
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
274
|
-
updated_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
275
|
-
);
|
|
276
|
-
|
|
277
|
-
CREATE INDEX IF NOT EXISTS
|
|
278
|
-
CREATE INDEX IF NOT EXISTS
|
|
279
|
-
CREATE INDEX IF NOT EXISTS
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
project_id TEXT
|
|
285
|
-
user_id TEXT REFERENCES users(id) ON DELETE SET NULL,
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
);
|
|
321
|
-
|
|
322
|
-
CREATE
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
)
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
CREATE
|
|
369
|
-
|
|
370
|
-
|
|
127
|
+
place_id TEXT,
|
|
128
|
+
place_sort_order INTEGER DEFAULT 0,
|
|
129
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
130
|
+
updated_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
CREATE INDEX IF NOT EXISTS memories_project_idx ON memories(project_id);
|
|
134
|
+
CREATE INDEX IF NOT EXISTS memories_type_idx ON memories(type);
|
|
135
|
+
CREATE INDEX IF NOT EXISTS memories_created_idx ON memories(created_at);
|
|
136
|
+
CREATE INDEX IF NOT EXISTS memories_tags_idx ON memories(tags);
|
|
137
|
+
|
|
138
|
+
CREATE TABLE IF NOT EXISTS memory_associations (
|
|
139
|
+
id TEXT PRIMARY KEY,
|
|
140
|
+
from_memory_id TEXT NOT NULL,
|
|
141
|
+
to_memory_id TEXT NOT NULL,
|
|
142
|
+
association_type TEXT NOT NULL,
|
|
143
|
+
weight REAL DEFAULT 1,
|
|
144
|
+
coactivation_count INTEGER DEFAULT 1,
|
|
145
|
+
metadata TEXT,
|
|
146
|
+
last_coactivated_at INTEGER,
|
|
147
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
148
|
+
UNIQUE(from_memory_id, to_memory_id)
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
-- Composite index for graph traversal (v1.1.0)
|
|
152
|
+
CREATE INDEX IF NOT EXISTS associations_graph_traversal_idx ON memory_associations(from_memory_id, to_memory_id, weight, association_type);
|
|
153
|
+
|
|
154
|
+
CREATE TABLE IF NOT EXISTS conversations (
|
|
155
|
+
id TEXT PRIMARY KEY,
|
|
156
|
+
project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
|
|
157
|
+
user_id TEXT REFERENCES users(id) ON DELETE SET NULL,
|
|
158
|
+
session_id TEXT NOT NULL,
|
|
159
|
+
title TEXT,
|
|
160
|
+
summary TEXT,
|
|
161
|
+
message_count INTEGER DEFAULT 0,
|
|
162
|
+
token_count INTEGER DEFAULT 0,
|
|
163
|
+
started_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
164
|
+
ended_at INTEGER,
|
|
165
|
+
metadata TEXT,
|
|
166
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
167
|
+
updated_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
CREATE INDEX IF NOT EXISTS conversations_project_idx ON conversations(project_id);
|
|
171
|
+
CREATE INDEX IF NOT EXISTS conversations_session_idx ON conversations(session_id);
|
|
172
|
+
CREATE INDEX IF NOT EXISTS conversations_started_idx ON conversations(started_at);
|
|
173
|
+
|
|
174
|
+
CREATE TABLE IF NOT EXISTS messages (
|
|
175
|
+
id TEXT PRIMARY KEY,
|
|
176
|
+
conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
|
|
177
|
+
role TEXT NOT NULL,
|
|
178
|
+
content TEXT NOT NULL,
|
|
179
|
+
embedding_json TEXT,
|
|
180
|
+
token_count INTEGER,
|
|
181
|
+
tool_calls TEXT,
|
|
182
|
+
metadata TEXT,
|
|
183
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
CREATE INDEX IF NOT EXISTS messages_conversation_idx ON messages(conversation_id);
|
|
187
|
+
CREATE INDEX IF NOT EXISTS messages_role_idx ON messages(role);
|
|
188
|
+
CREATE INDEX IF NOT EXISTS messages_created_idx ON messages(created_at);
|
|
189
|
+
|
|
190
|
+
-- Learnings table (renamed from observations)
|
|
191
|
+
CREATE TABLE IF NOT EXISTS learnings (
|
|
192
|
+
id TEXT PRIMARY KEY,
|
|
193
|
+
project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
|
|
194
|
+
conversation_id TEXT REFERENCES conversations(id) ON DELETE SET NULL,
|
|
195
|
+
type TEXT NOT NULL,
|
|
196
|
+
action TEXT NOT NULL,
|
|
197
|
+
target TEXT,
|
|
198
|
+
summary TEXT NOT NULL,
|
|
199
|
+
details TEXT,
|
|
200
|
+
embedding_json TEXT,
|
|
201
|
+
embedding BLOB,
|
|
202
|
+
memory_id TEXT REFERENCES memories(id) ON DELETE SET NULL,
|
|
203
|
+
folder_path TEXT,
|
|
204
|
+
project_path TEXT,
|
|
205
|
+
is_private INTEGER DEFAULT 0,
|
|
206
|
+
has_secrets INTEGER DEFAULT 0,
|
|
207
|
+
relevance_score INTEGER DEFAULT 50,
|
|
208
|
+
category TEXT,
|
|
209
|
+
importance INTEGER DEFAULT 50,
|
|
210
|
+
confidence INTEGER DEFAULT 50,
|
|
211
|
+
metadata TEXT,
|
|
212
|
+
is_imported INTEGER DEFAULT 0,
|
|
213
|
+
-- UAM: Agent integration columns
|
|
214
|
+
agent_id TEXT,
|
|
215
|
+
tool_name TEXT,
|
|
216
|
+
session_id TEXT,
|
|
217
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
CREATE INDEX IF NOT EXISTS learnings_project_idx ON learnings(project_id);
|
|
221
|
+
CREATE INDEX IF NOT EXISTS learnings_type_idx ON learnings(type);
|
|
222
|
+
CREATE INDEX IF NOT EXISTS learnings_action_idx ON learnings(action);
|
|
223
|
+
CREATE INDEX IF NOT EXISTS learnings_created_idx ON learnings(created_at);
|
|
224
|
+
|
|
225
|
+
CREATE TABLE IF NOT EXISTS entities (
|
|
226
|
+
id TEXT PRIMARY KEY,
|
|
227
|
+
project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
|
|
228
|
+
name TEXT NOT NULL,
|
|
229
|
+
type TEXT NOT NULL,
|
|
230
|
+
description TEXT,
|
|
231
|
+
embedding_json TEXT,
|
|
232
|
+
properties TEXT,
|
|
233
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
234
|
+
updated_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
235
|
+
);
|
|
236
|
+
|
|
237
|
+
CREATE INDEX IF NOT EXISTS entities_project_idx ON entities(project_id);
|
|
238
|
+
CREATE INDEX IF NOT EXISTS entities_type_idx ON entities(type);
|
|
239
|
+
CREATE INDEX IF NOT EXISTS entities_name_idx ON entities(name);
|
|
240
|
+
|
|
241
|
+
CREATE TABLE IF NOT EXISTS entity_relations (
|
|
242
|
+
id TEXT PRIMARY KEY,
|
|
243
|
+
from_entity_id TEXT NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
|
|
244
|
+
to_entity_id TEXT NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
|
|
245
|
+
type TEXT NOT NULL,
|
|
246
|
+
weight INTEGER DEFAULT 1,
|
|
247
|
+
properties TEXT,
|
|
248
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
CREATE INDEX IF NOT EXISTS relations_from_idx ON entity_relations(from_entity_id);
|
|
252
|
+
CREATE INDEX IF NOT EXISTS relations_to_idx ON entity_relations(to_entity_id);
|
|
253
|
+
CREATE INDEX IF NOT EXISTS relations_type_idx ON entity_relations(type);
|
|
254
|
+
|
|
255
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
|
|
256
|
+
content,
|
|
257
|
+
tags,
|
|
258
|
+
content='memories',
|
|
259
|
+
content_rowid='rowid'
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN
|
|
263
|
+
INSERT INTO memories_fts(rowid, content, tags)
|
|
264
|
+
VALUES (new.rowid, new.content, COALESCE(new.tags, ''));
|
|
265
|
+
END;
|
|
266
|
+
|
|
267
|
+
CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN
|
|
268
|
+
INSERT INTO memories_fts(memories_fts, rowid, content, tags)
|
|
269
|
+
VALUES ('delete', old.rowid, old.content, COALESCE(old.tags, ''));
|
|
270
|
+
END;
|
|
271
|
+
|
|
272
|
+
CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
|
|
273
|
+
INSERT INTO memories_fts(memories_fts, rowid, content, tags)
|
|
274
|
+
VALUES ('delete', old.rowid, old.content, COALESCE(old.tags, ''));
|
|
275
|
+
INSERT INTO memories_fts(rowid, content, tags)
|
|
276
|
+
VALUES (new.rowid, new.content, COALESCE(new.tags, ''));
|
|
277
|
+
END;
|
|
278
|
+
|
|
279
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5(
|
|
280
|
+
content,
|
|
281
|
+
content='messages',
|
|
282
|
+
content_rowid='rowid'
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
CREATE TRIGGER IF NOT EXISTS messages_ai AFTER INSERT ON messages BEGIN
|
|
286
|
+
INSERT INTO messages_fts(rowid, content)
|
|
287
|
+
VALUES (new.rowid, new.content);
|
|
288
|
+
END;
|
|
289
|
+
|
|
290
|
+
CREATE TRIGGER IF NOT EXISTS messages_ad AFTER DELETE ON messages BEGIN
|
|
291
|
+
INSERT INTO messages_fts(messages_fts, rowid, content)
|
|
292
|
+
VALUES ('delete', old.rowid, old.content);
|
|
293
|
+
END;
|
|
294
|
+
|
|
295
|
+
CREATE TRIGGER IF NOT EXISTS messages_au AFTER UPDATE ON messages BEGIN
|
|
296
|
+
INSERT INTO messages_fts(messages_fts, rowid, content)
|
|
297
|
+
VALUES ('delete', old.rowid, old.content);
|
|
298
|
+
INSERT INTO messages_fts(rowid, content)
|
|
299
|
+
VALUES (new.rowid, new.content);
|
|
300
|
+
END;
|
|
301
|
+
|
|
302
|
+
CREATE TABLE IF NOT EXISTS core_memory (
|
|
303
|
+
id TEXT PRIMARY KEY,
|
|
304
|
+
project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
|
|
305
|
+
user_id TEXT REFERENCES users(id) ON DELETE SET NULL,
|
|
306
|
+
section TEXT NOT NULL,
|
|
307
|
+
content TEXT NOT NULL DEFAULT '',
|
|
308
|
+
size_bytes INTEGER DEFAULT 0 NOT NULL,
|
|
309
|
+
tokens_estimate INTEGER DEFAULT 0 NOT NULL,
|
|
310
|
+
version INTEGER DEFAULT 1 NOT NULL,
|
|
311
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
312
|
+
updated_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
313
|
+
);
|
|
314
|
+
|
|
315
|
+
CREATE INDEX IF NOT EXISTS core_memory_project_idx ON core_memory(project_id);
|
|
316
|
+
CREATE INDEX IF NOT EXISTS core_memory_user_idx ON core_memory(user_id);
|
|
317
|
+
CREATE INDEX IF NOT EXISTS core_memory_section_idx ON core_memory(section);
|
|
318
|
+
|
|
319
|
+
CREATE TABLE IF NOT EXISTS context_sessions (
|
|
320
|
+
id TEXT PRIMARY KEY,
|
|
321
|
+
session_id TEXT NOT NULL UNIQUE,
|
|
322
|
+
project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
|
|
323
|
+
user_id TEXT REFERENCES users(id) ON DELETE SET NULL,
|
|
324
|
+
loaded_memory_ids TEXT,
|
|
325
|
+
token_budget INTEGER DEFAULT 8000 NOT NULL,
|
|
326
|
+
tokens_used INTEGER DEFAULT 0 NOT NULL,
|
|
327
|
+
core_memory_tokens INTEGER DEFAULT 0 NOT NULL,
|
|
328
|
+
loaded_memories_tokens INTEGER DEFAULT 0 NOT NULL,
|
|
329
|
+
metadata TEXT,
|
|
330
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
331
|
+
updated_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
332
|
+
);
|
|
333
|
+
|
|
334
|
+
CREATE INDEX IF NOT EXISTS context_sessions_session_idx ON context_sessions(session_id);
|
|
335
|
+
CREATE INDEX IF NOT EXISTS context_sessions_project_idx ON context_sessions(project_id);
|
|
336
|
+
CREATE INDEX IF NOT EXISTS context_sessions_created_idx ON context_sessions(created_at);
|
|
337
|
+
|
|
338
|
+
-- v0.8.0: Memory Merge Tables
|
|
339
|
+
CREATE TABLE IF NOT EXISTS memory_merge_proposals (
|
|
340
|
+
id TEXT PRIMARY KEY,
|
|
341
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
342
|
+
user_id TEXT REFERENCES users(id) ON DELETE SET NULL,
|
|
343
|
+
source_memory_ids TEXT NOT NULL,
|
|
344
|
+
proposed_content TEXT NOT NULL,
|
|
345
|
+
proposed_summary TEXT,
|
|
346
|
+
proposed_tags TEXT,
|
|
347
|
+
proposed_metadata TEXT,
|
|
348
|
+
detection_method TEXT NOT NULL,
|
|
349
|
+
similarity_score TEXT NOT NULL,
|
|
350
|
+
confidence_level TEXT NOT NULL,
|
|
351
|
+
merge_reason TEXT NOT NULL,
|
|
352
|
+
conflict_warnings TEXT,
|
|
353
|
+
status TEXT DEFAULT 'pending' NOT NULL,
|
|
354
|
+
reviewed_at INTEGER,
|
|
355
|
+
review_notes TEXT,
|
|
356
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
357
|
+
expires_at INTEGER
|
|
358
|
+
);
|
|
359
|
+
|
|
360
|
+
CREATE INDEX IF NOT EXISTS memory_merge_proposals_project_status_idx ON memory_merge_proposals(project_id, status);
|
|
361
|
+
CREATE INDEX IF NOT EXISTS memory_merge_proposals_created_at_idx ON memory_merge_proposals(created_at);
|
|
362
|
+
|
|
363
|
+
CREATE TABLE IF NOT EXISTS memory_merge_history (
|
|
364
|
+
id TEXT PRIMARY KEY,
|
|
365
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
366
|
+
user_id TEXT REFERENCES users(id) ON DELETE SET NULL,
|
|
367
|
+
proposal_id TEXT REFERENCES memory_merge_proposals(id) ON DELETE SET NULL,
|
|
368
|
+
source_memory_ids TEXT NOT NULL,
|
|
369
|
+
canonical_memory_id TEXT NOT NULL REFERENCES memories(id) ON DELETE CASCADE,
|
|
370
|
+
source_memories_snapshot TEXT NOT NULL,
|
|
371
|
+
merge_strategy TEXT NOT NULL,
|
|
372
|
+
tokens_saved INTEGER,
|
|
373
|
+
is_reversed INTEGER DEFAULT 0,
|
|
374
|
+
reversed_at INTEGER,
|
|
375
|
+
reversed_by TEXT,
|
|
376
|
+
merged_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
377
|
+
);
|
|
378
|
+
|
|
379
|
+
CREATE TABLE IF NOT EXISTS memory_hash_cache (
|
|
380
|
+
memory_id TEXT PRIMARY KEY REFERENCES memories(id) ON DELETE CASCADE,
|
|
381
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
382
|
+
simhash TEXT,
|
|
383
|
+
minhash TEXT,
|
|
384
|
+
content_hash TEXT NOT NULL,
|
|
385
|
+
last_updated INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
386
|
+
);
|
|
387
|
+
|
|
388
|
+
CREATE INDEX IF NOT EXISTS memory_hash_cache_project_id_idx ON memory_hash_cache(project_id);
|
|
389
|
+
CREATE INDEX IF NOT EXISTS memory_hash_cache_simhash_idx ON memory_hash_cache(simhash);
|
|
390
|
+
|
|
391
|
+
-- Namespaces table (v1.0.x) - Hierarchical organization
|
|
392
|
+
CREATE TABLE IF NOT EXISTS namespaces (
|
|
393
|
+
id TEXT PRIMARY KEY,
|
|
394
|
+
project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
|
|
395
|
+
name TEXT NOT NULL,
|
|
396
|
+
path TEXT,
|
|
397
|
+
description TEXT,
|
|
398
|
+
parent_id TEXT REFERENCES namespaces(id) ON DELETE SET NULL,
|
|
399
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
400
|
+
updated_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
401
|
+
);
|
|
402
|
+
CREATE INDEX IF NOT EXISTS namespaces_project_idx ON namespaces(project_id);
|
|
403
|
+
CREATE INDEX IF NOT EXISTS namespaces_parent_idx ON namespaces(parent_id);
|
|
404
|
+
|
|
405
|
+
-- Maintenance jobs table (v1.0.x) - Cron scheduler
|
|
406
|
+
CREATE TABLE IF NOT EXISTS maintenance_jobs (
|
|
407
|
+
id TEXT PRIMARY KEY,
|
|
408
|
+
job_name TEXT NOT NULL UNIQUE,
|
|
409
|
+
job_type TEXT NOT NULL,
|
|
410
|
+
cron_expression TEXT,
|
|
411
|
+
enabled INTEGER DEFAULT 1 NOT NULL,
|
|
412
|
+
last_run_at INTEGER,
|
|
413
|
+
last_run_duration INTEGER,
|
|
414
|
+
last_run_status TEXT,
|
|
415
|
+
last_run_error TEXT,
|
|
416
|
+
total_runs INTEGER DEFAULT 0,
|
|
417
|
+
success_count INTEGER DEFAULT 0,
|
|
418
|
+
failure_count INTEGER DEFAULT 0,
|
|
419
|
+
job_config TEXT,
|
|
420
|
+
next_run_at INTEGER,
|
|
421
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
422
|
+
updated_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
423
|
+
);
|
|
424
|
+
CREATE INDEX IF NOT EXISTS maintenance_jobs_name_idx ON maintenance_jobs(job_name);
|
|
425
|
+
CREATE INDEX IF NOT EXISTS maintenance_jobs_next_run_idx ON maintenance_jobs(next_run_at);
|
|
426
|
+
CREATE INDEX IF NOT EXISTS maintenance_jobs_type_idx ON maintenance_jobs(job_type);
|
|
427
|
+
CREATE INDEX IF NOT EXISTS maintenance_jobs_enabled_idx ON maintenance_jobs(enabled);
|
|
428
|
+
|
|
429
|
+
-- Places table (v1.1.5) - Spatial memory organization
|
|
430
|
+
CREATE TABLE IF NOT EXISTS places (
|
|
431
|
+
id TEXT PRIMARY KEY,
|
|
432
|
+
project_id TEXT REFERENCES projects(id) ON DELETE CASCADE NOT NULL,
|
|
433
|
+
name TEXT NOT NULL,
|
|
434
|
+
place_type TEXT NOT NULL,
|
|
435
|
+
parent_id TEXT REFERENCES places(id) ON DELETE SET NULL,
|
|
436
|
+
sort_order INTEGER DEFAULT 0,
|
|
437
|
+
position_x INTEGER DEFAULT 0,
|
|
438
|
+
position_y INTEGER DEFAULT 0,
|
|
439
|
+
description TEXT,
|
|
440
|
+
purpose TEXT,
|
|
441
|
+
memory_count INTEGER DEFAULT 0,
|
|
442
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
443
|
+
updated_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
444
|
+
);
|
|
445
|
+
CREATE INDEX IF NOT EXISTS places_project_idx ON places(project_id);
|
|
446
|
+
CREATE INDEX IF NOT EXISTS places_type_idx ON places(place_type);
|
|
447
|
+
CREATE INDEX IF NOT EXISTS places_parent_idx ON places(parent_id);
|
|
448
|
+
CREATE INDEX IF NOT EXISTS places_sort_order_idx ON places(project_id, sort_order);
|
|
449
|
+
|
|
450
|
+
-- Memory-Place assignments
|
|
451
|
+
CREATE TABLE IF NOT EXISTS memory_places (
|
|
452
|
+
id TEXT PRIMARY KEY,
|
|
453
|
+
memory_id TEXT REFERENCES memories(id) ON DELETE CASCADE NOT NULL,
|
|
454
|
+
place_id TEXT REFERENCES places(id) ON DELETE CASCADE NOT NULL,
|
|
455
|
+
place_sort_order INTEGER DEFAULT 0,
|
|
456
|
+
is_manual INTEGER DEFAULT 0,
|
|
457
|
+
rule_id TEXT,
|
|
458
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
459
|
+
);
|
|
460
|
+
CREATE INDEX IF NOT EXISTS memory_places_memory_idx ON memory_places(memory_id);
|
|
461
|
+
CREATE INDEX IF NOT EXISTS memory_places_place_idx ON memory_places(place_id);
|
|
462
|
+
|
|
463
|
+
-- Place auto-assignment rules
|
|
464
|
+
CREATE TABLE IF NOT EXISTS place_rules (
|
|
465
|
+
id TEXT PRIMARY KEY,
|
|
466
|
+
project_id TEXT REFERENCES projects(id) ON DELETE CASCADE NOT NULL,
|
|
467
|
+
name TEXT NOT NULL,
|
|
468
|
+
place_type TEXT NOT NULL,
|
|
469
|
+
match_tool TEXT,
|
|
470
|
+
match_keyword TEXT,
|
|
471
|
+
match_tag TEXT,
|
|
472
|
+
match_memory_type TEXT,
|
|
473
|
+
priority INTEGER DEFAULT 0,
|
|
474
|
+
enabled INTEGER DEFAULT 1,
|
|
475
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
476
|
+
updated_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
477
|
+
);
|
|
478
|
+
CREATE INDEX IF NOT EXISTS place_rules_project_idx ON place_rules(project_id);
|
|
479
|
+
CREATE INDEX IF NOT EXISTS place_rules_type_idx ON place_rules(place_type);
|
|
480
|
+
-- session_summaries table
|
|
481
|
+
CREATE TABLE IF NOT EXISTS session_summaries (
|
|
482
|
+
id TEXT PRIMARY KEY,
|
|
483
|
+
conversation_id TEXT REFERENCES conversations(id) ON DELETE CASCADE NOT NULL,
|
|
484
|
+
project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
|
|
485
|
+
summary_type TEXT NOT NULL,
|
|
486
|
+
content TEXT NOT NULL,
|
|
487
|
+
compressed_from INTEGER,
|
|
488
|
+
tokens_saved INTEGER,
|
|
489
|
+
embedding BLOB,
|
|
490
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL
|
|
491
|
+
);
|
|
492
|
+
CREATE INDEX IF NOT EXISTS session_summaries_conversation_idx ON session_summaries(conversation_id);
|
|
493
|
+
CREATE INDEX IF NOT EXISTS session_summaries_project_idx ON session_summaries(project_id);
|
|
494
|
+
CREATE INDEX IF NOT EXISTS session_summaries_type_idx ON session_summaries(summary_type);
|
|
495
|
+
CREATE INDEX IF NOT EXISTS session_summaries_created_idx ON session_summaries(created_at);
|
|
496
|
+
|
|
497
|
+
-- Belief Systems - Derived Beliefs from Memory (v1.3.0+)
|
|
498
|
+
CREATE TABLE IF NOT EXISTS beliefs (
|
|
499
|
+
id TEXT PRIMARY KEY,
|
|
500
|
+
project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
|
|
501
|
+
belief_type TEXT NOT NULL,
|
|
502
|
+
statement TEXT NOT NULL,
|
|
503
|
+
normalized_key TEXT NOT NULL,
|
|
504
|
+
confidence REAL DEFAULT 0.5,
|
|
505
|
+
belief_decay_rate INTEGER DEFAULT 30,
|
|
506
|
+
last_confirmed_at INTEGER,
|
|
507
|
+
source_count INTEGER DEFAULT 1,
|
|
508
|
+
status TEXT DEFAULT 'active',
|
|
509
|
+
reason TEXT,
|
|
510
|
+
context TEXT,
|
|
511
|
+
evidence_summary TEXT,
|
|
512
|
+
metadata TEXT,
|
|
513
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
514
|
+
updated_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
515
|
+
UNIQUE(project_id, normalized_key)
|
|
516
|
+
);
|
|
517
|
+
CREATE INDEX IF NOT EXISTS beliefs_project_idx ON beliefs(project_id);
|
|
518
|
+
CREATE INDEX IF NOT EXISTS beliefs_type_idx ON beliefs(belief_type);
|
|
519
|
+
CREATE INDEX IF NOT EXISTS beliefs_status_idx ON beliefs(status);
|
|
520
|
+
CREATE INDEX IF NOT EXISTS beliefs_confidence_idx ON beliefs(confidence);
|
|
521
|
+
|
|
522
|
+
CREATE TABLE IF NOT EXISTS belief_memory_sources (
|
|
523
|
+
id TEXT PRIMARY KEY,
|
|
524
|
+
belief_id TEXT REFERENCES beliefs(id) ON DELETE CASCADE,
|
|
525
|
+
memory_id TEXT REFERENCES memories(id) ON DELETE CASCADE,
|
|
526
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
527
|
+
UNIQUE(belief_id, memory_id)
|
|
528
|
+
);
|
|
529
|
+
CREATE INDEX IF NOT EXISTS belief_sources_belief_idx ON belief_memory_sources(belief_id);
|
|
530
|
+
CREATE INDEX IF NOT EXISTS belief_sources_memory_idx ON belief_memory_sources(memory_id);
|
|
531
|
+
|
|
532
|
+
CREATE TABLE IF NOT EXISTS belief_edges (
|
|
533
|
+
id TEXT PRIMARY KEY,
|
|
534
|
+
from_belief_id TEXT REFERENCES beliefs(id) ON DELETE CASCADE,
|
|
535
|
+
to_belief_id TEXT REFERENCES beliefs(id) ON DELETE CASCADE,
|
|
536
|
+
edge_type TEXT NOT NULL,
|
|
537
|
+
metadata TEXT,
|
|
538
|
+
created_at INTEGER DEFAULT (strftime('%s','now')) NOT NULL,
|
|
539
|
+
UNIQUE(from_belief_id, to_belief_id, edge_type)
|
|
540
|
+
);
|
|
541
|
+
CREATE INDEX IF NOT EXISTS belief_edges_from_idx ON belief_edges(from_belief_id);
|
|
542
|
+
CREATE INDEX IF NOT EXISTS belief_edges_to_idx ON belief_edges(to_belief_id);
|
|
371
543
|
`;
|
|
372
544
|
const postgresStatements = [
|
|
373
545
|
`CREATE EXTENSION IF NOT EXISTS pgcrypto;`,
|
|
374
546
|
`CREATE EXTENSION IF NOT EXISTS vector;`,
|
|
375
547
|
`CREATE EXTENSION IF NOT EXISTS pg_trgm;`,
|
|
376
|
-
`CREATE TABLE IF NOT EXISTS users (
|
|
377
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
378
|
-
external_id TEXT UNIQUE,
|
|
379
|
-
name TEXT,
|
|
380
|
-
email TEXT,
|
|
381
|
-
preferences JSONB,
|
|
382
|
-
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
383
|
-
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
548
|
+
`CREATE TABLE IF NOT EXISTS users (
|
|
549
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
550
|
+
external_id TEXT UNIQUE,
|
|
551
|
+
name TEXT,
|
|
552
|
+
email TEXT,
|
|
553
|
+
preferences JSONB,
|
|
554
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
555
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
384
556
|
);`,
|
|
385
|
-
`CREATE TABLE IF NOT EXISTS projects (
|
|
386
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
387
|
-
name TEXT NOT NULL,
|
|
388
|
-
path TEXT NOT NULL,
|
|
389
|
-
description TEXT,
|
|
390
|
-
metadata JSONB,
|
|
391
|
-
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
392
|
-
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
557
|
+
`CREATE TABLE IF NOT EXISTS projects (
|
|
558
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
559
|
+
name TEXT NOT NULL,
|
|
560
|
+
path TEXT NOT NULL,
|
|
561
|
+
description TEXT,
|
|
562
|
+
metadata JSONB,
|
|
563
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
564
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
393
565
|
);`,
|
|
394
566
|
`CREATE INDEX IF NOT EXISTS projects_path_idx ON projects(path);`,
|
|
395
|
-
`CREATE TABLE IF NOT EXISTS memories (
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
567
|
+
`CREATE TABLE IF NOT EXISTS memories (
|
|
568
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
569
|
+
project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
|
|
570
|
+
user_id UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
571
|
+
type TEXT NOT NULL,
|
|
572
|
+
content TEXT NOT NULL,
|
|
573
|
+
summary TEXT,
|
|
574
|
+
embedding_json TEXT,
|
|
575
|
+
embedding vector(1536),
|
|
576
|
+
source TEXT,
|
|
577
|
+
confidence INTEGER DEFAULT 50,
|
|
578
|
+
confidence_level TEXT DEFAULT 'speculative',
|
|
579
|
+
tags TEXT[],
|
|
580
|
+
metadata JSONB,
|
|
581
|
+
is_private BOOLEAN DEFAULT FALSE,
|
|
582
|
+
has_secrets BOOLEAN DEFAULT FALSE,
|
|
583
|
+
relevance_score INTEGER DEFAULT 50,
|
|
584
|
+
is_active BOOLEAN DEFAULT TRUE,
|
|
585
|
+
is_merged BOOLEAN DEFAULT FALSE,
|
|
586
|
+
merged_into_id UUID,
|
|
587
|
+
merged_at TIMESTAMPTZ,
|
|
588
|
+
is_canonical BOOLEAN DEFAULT TRUE,
|
|
589
|
+
merge_source_ids TEXT[],
|
|
590
|
+
is_mergeable BOOLEAN DEFAULT TRUE,
|
|
591
|
+
merge_version INTEGER DEFAULT 1,
|
|
592
|
+
importance_score INTEGER DEFAULT 50,
|
|
593
|
+
importance_decay_rate INTEGER DEFAULT 30,
|
|
594
|
+
last_importance_recalc TIMESTAMPTZ,
|
|
595
|
+
consolidated_into UUID,
|
|
596
|
+
consolidated_at TIMESTAMPTZ,
|
|
597
|
+
is_consolidated BOOLEAN DEFAULT FALSE,
|
|
598
|
+
sector TEXT DEFAULT 'episodic',
|
|
599
|
+
tier TEXT DEFAULT 'hot',
|
|
600
|
+
status TEXT DEFAULT 'active',
|
|
601
|
+
context_status TEXT DEFAULT 'out-of-context',
|
|
602
|
+
decay_rate INTEGER DEFAULT 30,
|
|
603
|
+
coactivation_score INTEGER DEFAULT 0,
|
|
604
|
+
last_decay_at TIMESTAMPTZ,
|
|
605
|
+
agent_id TEXT,
|
|
606
|
+
agent_role TEXT,
|
|
607
|
+
visibility_scope TEXT DEFAULT 'private',
|
|
608
|
+
is_protected BOOLEAN DEFAULT FALSE,
|
|
609
|
+
is_pinned BOOLEAN DEFAULT FALSE,
|
|
610
|
+
is_immutable BOOLEAN DEFAULT FALSE,
|
|
611
|
+
write_scope TEXT[],
|
|
612
|
+
read_scope TEXT[],
|
|
613
|
+
triggered_by TEXT,
|
|
614
|
+
capture_reason TEXT,
|
|
615
|
+
last_used_at TIMESTAMPTZ,
|
|
616
|
+
usage_count INTEGER DEFAULT 0,
|
|
617
|
+
tokens_estimate INTEGER DEFAULT 0,
|
|
618
|
+
valid_from TIMESTAMPTZ,
|
|
619
|
+
valid_to TIMESTAMPTZ,
|
|
620
|
+
recorded_at TIMESTAMPTZ DEFAULT NOW(),
|
|
621
|
+
superseded_by UUID,
|
|
622
|
+
version INTEGER DEFAULT 1,
|
|
623
|
+
expires_at TIMESTAMPTZ,
|
|
624
|
+
access_count INTEGER DEFAULT 0,
|
|
625
|
+
last_accessed_at TIMESTAMPTZ,
|
|
626
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
627
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
628
|
+
);`,
|
|
414
629
|
`CREATE INDEX IF NOT EXISTS memories_project_idx ON memories(project_id);`,
|
|
415
630
|
`CREATE INDEX IF NOT EXISTS memories_type_idx ON memories(type);`,
|
|
416
631
|
`CREATE INDEX IF NOT EXISTS memories_created_idx ON memories(created_at);`,
|
|
417
632
|
`CREATE INDEX IF NOT EXISTS memories_tags_idx ON memories USING GIN(tags);`,
|
|
418
633
|
`CREATE INDEX IF NOT EXISTS memories_content_trgm_idx ON memories USING GIN (content gin_trgm_ops);`,
|
|
419
|
-
`CREATE TABLE IF NOT EXISTS conversations (
|
|
420
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
421
|
-
project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
|
|
422
|
-
user_id UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
423
|
-
session_id TEXT NOT NULL,
|
|
424
|
-
title TEXT,
|
|
425
|
-
summary TEXT,
|
|
426
|
-
message_count INTEGER DEFAULT 0,
|
|
427
|
-
token_count INTEGER DEFAULT 0,
|
|
428
|
-
started_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
429
|
-
ended_at TIMESTAMPTZ,
|
|
430
|
-
metadata JSONB,
|
|
431
|
-
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
432
|
-
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
634
|
+
`CREATE TABLE IF NOT EXISTS conversations (
|
|
635
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
636
|
+
project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
|
|
637
|
+
user_id UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
638
|
+
session_id TEXT NOT NULL,
|
|
639
|
+
title TEXT,
|
|
640
|
+
summary TEXT,
|
|
641
|
+
message_count INTEGER DEFAULT 0,
|
|
642
|
+
token_count INTEGER DEFAULT 0,
|
|
643
|
+
started_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
644
|
+
ended_at TIMESTAMPTZ,
|
|
645
|
+
metadata JSONB,
|
|
646
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
647
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
433
648
|
);`,
|
|
434
649
|
`CREATE INDEX IF NOT EXISTS conversations_project_idx ON conversations(project_id);`,
|
|
435
650
|
`CREATE INDEX IF NOT EXISTS conversations_session_idx ON conversations(session_id);`,
|
|
436
651
|
`CREATE INDEX IF NOT EXISTS conversations_started_idx ON conversations(started_at);`,
|
|
437
|
-
`CREATE TABLE IF NOT EXISTS messages (
|
|
438
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
439
|
-
conversation_id UUID NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
|
|
440
|
-
role TEXT NOT NULL,
|
|
441
|
-
content TEXT NOT NULL,
|
|
442
|
-
embedding vector(1536),
|
|
443
|
-
token_count INTEGER,
|
|
444
|
-
tool_calls JSONB,
|
|
445
|
-
metadata JSONB,
|
|
446
|
-
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
652
|
+
`CREATE TABLE IF NOT EXISTS messages (
|
|
653
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
654
|
+
conversation_id UUID NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
|
|
655
|
+
role TEXT NOT NULL,
|
|
656
|
+
content TEXT NOT NULL,
|
|
657
|
+
embedding vector(1536),
|
|
658
|
+
token_count INTEGER,
|
|
659
|
+
tool_calls JSONB,
|
|
660
|
+
metadata JSONB,
|
|
661
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
447
662
|
);`,
|
|
448
663
|
`CREATE INDEX IF NOT EXISTS messages_conversation_idx ON messages(conversation_id);`,
|
|
449
664
|
`CREATE INDEX IF NOT EXISTS messages_role_idx ON messages(role);`,
|
|
450
665
|
`CREATE INDEX IF NOT EXISTS messages_created_idx ON messages(created_at);`,
|
|
451
666
|
`CREATE INDEX IF NOT EXISTS messages_content_trgm_idx ON messages USING GIN (content gin_trgm_ops);`,
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
667
|
+
// Learnings table (renamed from observations)
|
|
668
|
+
`CREATE TABLE IF NOT EXISTS learnings (
|
|
669
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
670
|
+
project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
|
|
671
|
+
conversation_id UUID REFERENCES conversations(id) ON DELETE SET NULL,
|
|
672
|
+
type TEXT NOT NULL,
|
|
673
|
+
action TEXT NOT NULL,
|
|
674
|
+
target TEXT,
|
|
675
|
+
summary TEXT NOT NULL,
|
|
676
|
+
details JSONB,
|
|
677
|
+
embedding vector(1536),
|
|
678
|
+
memory_id UUID REFERENCES memories(id) ON DELETE SET NULL,
|
|
679
|
+
category TEXT,
|
|
680
|
+
importance INTEGER DEFAULT 50,
|
|
681
|
+
confidence INTEGER DEFAULT 50,
|
|
682
|
+
metadata JSONB,
|
|
683
|
+
is_imported BOOLEAN DEFAULT FALSE,
|
|
684
|
+
-- UAM: Agent integration columns
|
|
685
|
+
agent_id TEXT,
|
|
686
|
+
tool_name TEXT,
|
|
687
|
+
session_id TEXT,
|
|
688
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
466
689
|
);`,
|
|
467
|
-
`CREATE INDEX IF NOT EXISTS
|
|
468
|
-
`CREATE INDEX IF NOT EXISTS
|
|
469
|
-
`CREATE INDEX IF NOT EXISTS
|
|
470
|
-
`CREATE
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
690
|
+
`CREATE INDEX IF NOT EXISTS learnings_project_idx ON learnings(project_id);`,
|
|
691
|
+
`CREATE INDEX IF NOT EXISTS learnings_type_idx ON learnings(type);`,
|
|
692
|
+
`CREATE INDEX IF NOT EXISTS learnings_action_idx ON learnings(action);`,
|
|
693
|
+
`CREATE TABLE IF NOT EXISTS entities (
|
|
694
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
695
|
+
project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
|
|
696
|
+
name TEXT NOT NULL,
|
|
697
|
+
type TEXT NOT NULL,
|
|
698
|
+
description TEXT,
|
|
699
|
+
embedding vector(1536),
|
|
700
|
+
properties JSONB,
|
|
701
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
702
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
481
703
|
);`,
|
|
482
704
|
`CREATE INDEX IF NOT EXISTS entities_project_idx ON entities(project_id);`,
|
|
483
705
|
`CREATE INDEX IF NOT EXISTS entities_type_idx ON entities(type);`,
|
|
484
706
|
`CREATE INDEX IF NOT EXISTS entities_name_idx ON entities(name);`,
|
|
485
|
-
`CREATE TABLE IF NOT EXISTS entity_relations (
|
|
486
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
487
|
-
from_entity_id UUID NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
|
|
488
|
-
to_entity_id UUID NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
|
|
489
|
-
type TEXT NOT NULL,
|
|
490
|
-
weight INTEGER DEFAULT 1,
|
|
491
|
-
properties JSONB,
|
|
492
|
-
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
707
|
+
`CREATE TABLE IF NOT EXISTS entity_relations (
|
|
708
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
709
|
+
from_entity_id UUID NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
|
|
710
|
+
to_entity_id UUID NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
|
|
711
|
+
type TEXT NOT NULL,
|
|
712
|
+
weight INTEGER DEFAULT 1,
|
|
713
|
+
properties JSONB,
|
|
714
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
493
715
|
);`,
|
|
494
716
|
`CREATE INDEX IF NOT EXISTS relations_from_idx ON entity_relations(from_entity_id);`,
|
|
495
717
|
`CREATE INDEX IF NOT EXISTS relations_to_idx ON entity_relations(to_entity_id);`,
|
|
496
718
|
`CREATE INDEX IF NOT EXISTS relations_type_idx ON entity_relations(type);`,
|
|
497
|
-
`CREATE TABLE IF NOT EXISTS core_memory (
|
|
498
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
499
|
-
project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
|
|
500
|
-
user_id UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
501
|
-
section TEXT NOT NULL,
|
|
502
|
-
content TEXT NOT NULL DEFAULT '',
|
|
503
|
-
size_bytes INTEGER DEFAULT 0 NOT NULL,
|
|
504
|
-
version INTEGER DEFAULT 1 NOT NULL,
|
|
505
|
-
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
506
|
-
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
719
|
+
`CREATE TABLE IF NOT EXISTS core_memory (
|
|
720
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
721
|
+
project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
|
|
722
|
+
user_id UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
723
|
+
section TEXT NOT NULL,
|
|
724
|
+
content TEXT NOT NULL DEFAULT '',
|
|
725
|
+
size_bytes INTEGER DEFAULT 0 NOT NULL,
|
|
726
|
+
version INTEGER DEFAULT 1 NOT NULL,
|
|
727
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
728
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
507
729
|
);`,
|
|
508
730
|
`CREATE INDEX IF NOT EXISTS core_memory_project_idx ON core_memory(project_id);`,
|
|
509
731
|
`CREATE INDEX IF NOT EXISTS core_memory_user_idx ON core_memory(user_id);`,
|
|
510
732
|
`CREATE INDEX IF NOT EXISTS core_memory_section_idx ON core_memory(section);`,
|
|
511
|
-
`CREATE TABLE IF NOT EXISTS context_sessions (
|
|
512
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
513
|
-
session_id TEXT NOT NULL UNIQUE,
|
|
514
|
-
project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
|
|
515
|
-
user_id UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
516
|
-
loaded_memory_ids JSONB,
|
|
517
|
-
token_budget INTEGER DEFAULT 8000 NOT NULL,
|
|
518
|
-
tokens_used INTEGER DEFAULT 0 NOT NULL,
|
|
519
|
-
core_memory_tokens INTEGER DEFAULT 0 NOT NULL,
|
|
520
|
-
loaded_memories_tokens INTEGER DEFAULT 0 NOT NULL,
|
|
521
|
-
metadata JSONB,
|
|
522
|
-
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
523
|
-
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
733
|
+
`CREATE TABLE IF NOT EXISTS context_sessions (
|
|
734
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
735
|
+
session_id TEXT NOT NULL UNIQUE,
|
|
736
|
+
project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
|
|
737
|
+
user_id UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
738
|
+
loaded_memory_ids JSONB,
|
|
739
|
+
token_budget INTEGER DEFAULT 8000 NOT NULL,
|
|
740
|
+
tokens_used INTEGER DEFAULT 0 NOT NULL,
|
|
741
|
+
core_memory_tokens INTEGER DEFAULT 0 NOT NULL,
|
|
742
|
+
loaded_memories_tokens INTEGER DEFAULT 0 NOT NULL,
|
|
743
|
+
metadata JSONB,
|
|
744
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
745
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
524
746
|
);`,
|
|
525
747
|
`CREATE INDEX IF NOT EXISTS context_sessions_session_idx ON context_sessions(session_id);`,
|
|
526
748
|
`CREATE INDEX IF NOT EXISTS context_sessions_project_idx ON context_sessions(project_id);`,
|
|
527
749
|
`CREATE INDEX IF NOT EXISTS context_sessions_created_idx ON context_sessions(created_at);`,
|
|
528
|
-
`CREATE TABLE IF NOT EXISTS memory_merge_proposals (
|
|
529
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
530
|
-
project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
531
|
-
user_id UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
532
|
-
source_memory_ids TEXT NOT NULL,
|
|
533
|
-
proposed_content TEXT NOT NULL,
|
|
534
|
-
proposed_summary TEXT,
|
|
535
|
-
proposed_tags TEXT[],
|
|
536
|
-
proposed_metadata JSONB,
|
|
537
|
-
detection_method TEXT NOT NULL,
|
|
538
|
-
similarity_score TEXT NOT NULL,
|
|
539
|
-
confidence_level TEXT NOT NULL,
|
|
540
|
-
merge_reason TEXT NOT NULL,
|
|
541
|
-
conflict_warnings JSONB,
|
|
542
|
-
status TEXT DEFAULT 'pending' NOT NULL,
|
|
543
|
-
reviewed_at TIMESTAMPTZ,
|
|
544
|
-
review_notes TEXT,
|
|
545
|
-
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
546
|
-
expires_at TIMESTAMPTZ
|
|
750
|
+
`CREATE TABLE IF NOT EXISTS memory_merge_proposals (
|
|
751
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
752
|
+
project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
753
|
+
user_id UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
754
|
+
source_memory_ids TEXT NOT NULL,
|
|
755
|
+
proposed_content TEXT NOT NULL,
|
|
756
|
+
proposed_summary TEXT,
|
|
757
|
+
proposed_tags TEXT[],
|
|
758
|
+
proposed_metadata JSONB,
|
|
759
|
+
detection_method TEXT NOT NULL,
|
|
760
|
+
similarity_score TEXT NOT NULL,
|
|
761
|
+
confidence_level TEXT NOT NULL,
|
|
762
|
+
merge_reason TEXT NOT NULL,
|
|
763
|
+
conflict_warnings JSONB,
|
|
764
|
+
status TEXT DEFAULT 'pending' NOT NULL,
|
|
765
|
+
reviewed_at TIMESTAMPTZ,
|
|
766
|
+
review_notes TEXT,
|
|
767
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
768
|
+
expires_at TIMESTAMPTZ
|
|
547
769
|
);`,
|
|
548
770
|
`CREATE INDEX IF NOT EXISTS memory_merge_proposals_project_status_idx ON memory_merge_proposals(project_id, status);`,
|
|
549
771
|
`CREATE INDEX IF NOT EXISTS memory_merge_proposals_created_at_idx ON memory_merge_proposals(created_at);`,
|
|
550
|
-
`CREATE TABLE IF NOT EXISTS memory_merge_history (
|
|
551
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
552
|
-
project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
553
|
-
user_id UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
554
|
-
proposal_id UUID REFERENCES memory_merge_proposals(id) ON DELETE SET NULL,
|
|
555
|
-
source_memory_ids TEXT NOT NULL,
|
|
556
|
-
canonical_memory_id UUID NOT NULL REFERENCES memories(id) ON DELETE CASCADE,
|
|
557
|
-
source_memories_snapshot JSONB NOT NULL,
|
|
558
|
-
merge_strategy TEXT NOT NULL,
|
|
559
|
-
tokens_saved INTEGER,
|
|
560
|
-
is_reversed BOOLEAN DEFAULT FALSE,
|
|
561
|
-
reversed_at TIMESTAMPTZ,
|
|
562
|
-
reversed_by UUID,
|
|
563
|
-
merged_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
772
|
+
`CREATE TABLE IF NOT EXISTS memory_merge_history (
|
|
773
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
774
|
+
project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
775
|
+
user_id UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
776
|
+
proposal_id UUID REFERENCES memory_merge_proposals(id) ON DELETE SET NULL,
|
|
777
|
+
source_memory_ids TEXT NOT NULL,
|
|
778
|
+
canonical_memory_id UUID NOT NULL REFERENCES memories(id) ON DELETE CASCADE,
|
|
779
|
+
source_memories_snapshot JSONB NOT NULL,
|
|
780
|
+
merge_strategy TEXT NOT NULL,
|
|
781
|
+
tokens_saved INTEGER,
|
|
782
|
+
is_reversed BOOLEAN DEFAULT FALSE,
|
|
783
|
+
reversed_at TIMESTAMPTZ,
|
|
784
|
+
reversed_by UUID,
|
|
785
|
+
merged_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
564
786
|
);`,
|
|
565
|
-
`CREATE TABLE IF NOT EXISTS memory_hash_cache (
|
|
566
|
-
memory_id UUID PRIMARY KEY REFERENCES memories(id) ON DELETE CASCADE,
|
|
567
|
-
project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
568
|
-
simhash TEXT,
|
|
569
|
-
minhash TEXT,
|
|
570
|
-
content_hash TEXT NOT NULL,
|
|
571
|
-
last_updated TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
787
|
+
`CREATE TABLE IF NOT EXISTS memory_hash_cache (
|
|
788
|
+
memory_id UUID PRIMARY KEY REFERENCES memories(id) ON DELETE CASCADE,
|
|
789
|
+
project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
790
|
+
simhash TEXT,
|
|
791
|
+
minhash TEXT,
|
|
792
|
+
content_hash TEXT NOT NULL,
|
|
793
|
+
last_updated TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
572
794
|
);`,
|
|
573
795
|
`CREATE INDEX IF NOT EXISTS memory_hash_cache_project_id_idx ON memory_hash_cache(project_id);`,
|
|
574
|
-
`CREATE INDEX IF NOT EXISTS memory_hash_cache_simhash_idx ON memory_hash_cache(simhash)
|
|
796
|
+
`CREATE INDEX IF NOT EXISTS memory_hash_cache_simhash_idx ON memory_hash_cache(simhash);`,
|
|
797
|
+
// memory_associations table (v1.1.0+)
|
|
798
|
+
`CREATE TABLE IF NOT EXISTS memory_associations (
|
|
799
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
800
|
+
from_memory_id UUID NOT NULL REFERENCES memories(id) ON DELETE CASCADE,
|
|
801
|
+
to_memory_id UUID NOT NULL REFERENCES memories(id) ON DELETE CASCADE,
|
|
802
|
+
association_type TEXT NOT NULL,
|
|
803
|
+
weight REAL DEFAULT 1,
|
|
804
|
+
coactivation_count INTEGER DEFAULT 1,
|
|
805
|
+
metadata TEXT,
|
|
806
|
+
last_coactivated_at TIMESTAMPTZ,
|
|
807
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
808
|
+
UNIQUE(from_memory_id, to_memory_id)
|
|
809
|
+
);`,
|
|
810
|
+
`CREATE INDEX IF NOT EXISTS associations_graph_traversal_idx ON memory_associations(from_memory_id, to_memory_id, weight, association_type);`,
|
|
811
|
+
// namespaces table
|
|
812
|
+
`CREATE TABLE IF NOT EXISTS namespaces (
|
|
813
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
814
|
+
project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
|
|
815
|
+
name TEXT NOT NULL,
|
|
816
|
+
path TEXT NOT NULL,
|
|
817
|
+
description TEXT,
|
|
818
|
+
parent_id UUID REFERENCES namespaces(id) ON DELETE SET NULL,
|
|
819
|
+
metadata TEXT,
|
|
820
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
821
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
822
|
+
);`,
|
|
823
|
+
`CREATE INDEX IF NOT EXISTS namespaces_project_idx ON namespaces(project_id);`,
|
|
824
|
+
`CREATE INDEX IF NOT EXISTS namespaces_parent_idx ON namespaces(parent_id);`,
|
|
825
|
+
// maintenance_jobs table
|
|
826
|
+
`CREATE TABLE IF NOT EXISTS maintenance_jobs (
|
|
827
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
828
|
+
project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
|
|
829
|
+
job_name TEXT NOT NULL,
|
|
830
|
+
job_type TEXT NOT NULL,
|
|
831
|
+
description TEXT,
|
|
832
|
+
enabled BOOLEAN DEFAULT TRUE,
|
|
833
|
+
cron_expression TEXT,
|
|
834
|
+
interval_ms INTEGER,
|
|
835
|
+
next_run_at TIMESTAMPTZ,
|
|
836
|
+
last_run_at TIMESTAMPTZ,
|
|
837
|
+
last_run_duration INTEGER,
|
|
838
|
+
last_run_status TEXT,
|
|
839
|
+
last_run_error TEXT,
|
|
840
|
+
total_runs INTEGER DEFAULT 0,
|
|
841
|
+
success_count INTEGER DEFAULT 0,
|
|
842
|
+
failure_count INTEGER DEFAULT 0,
|
|
843
|
+
job_config TEXT,
|
|
844
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
845
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
846
|
+
);`,
|
|
847
|
+
`CREATE INDEX IF NOT EXISTS maintenance_jobs_name_idx ON maintenance_jobs(job_name);`,
|
|
848
|
+
`CREATE INDEX IF NOT EXISTS maintenance_jobs_next_run_idx ON maintenance_jobs(next_run_at);`,
|
|
849
|
+
`CREATE INDEX IF NOT EXISTS maintenance_jobs_type_idx ON maintenance_jobs(job_type);`,
|
|
850
|
+
`CREATE INDEX IF NOT EXISTS maintenance_jobs_enabled_idx ON maintenance_jobs(enabled);`,
|
|
851
|
+
// places table (v1.1.5) - Spatial memory organization
|
|
852
|
+
`CREATE TABLE IF NOT EXISTS places (
|
|
853
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
854
|
+
project_id UUID REFERENCES projects(id) ON DELETE CASCADE NOT NULL,
|
|
855
|
+
name TEXT NOT NULL,
|
|
856
|
+
place_type TEXT NOT NULL,
|
|
857
|
+
parent_id UUID REFERENCES places(id) ON DELETE SET NULL,
|
|
858
|
+
sort_order INTEGER DEFAULT 0,
|
|
859
|
+
position_x INTEGER DEFAULT 0,
|
|
860
|
+
position_y INTEGER DEFAULT 0,
|
|
861
|
+
description TEXT,
|
|
862
|
+
purpose TEXT,
|
|
863
|
+
memory_count INTEGER DEFAULT 0,
|
|
864
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
865
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
866
|
+
);`,
|
|
867
|
+
`CREATE INDEX IF NOT EXISTS places_project_idx ON places(project_id);`,
|
|
868
|
+
`CREATE INDEX IF NOT EXISTS places_type_idx ON places(place_type);`,
|
|
869
|
+
`CREATE INDEX IF NOT EXISTS places_parent_idx ON places(parent_id);`,
|
|
870
|
+
`CREATE INDEX IF NOT EXISTS places_sort_order_idx ON places(project_id, sort_order);`,
|
|
871
|
+
// memory_places table
|
|
872
|
+
`CREATE TABLE IF NOT EXISTS memory_places (
|
|
873
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
874
|
+
memory_id UUID REFERENCES memories(id) ON DELETE CASCADE NOT NULL,
|
|
875
|
+
place_id UUID REFERENCES places(id) ON DELETE CASCADE NOT NULL,
|
|
876
|
+
is_manual BOOLEAN DEFAULT FALSE,
|
|
877
|
+
rule_id UUID,
|
|
878
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
879
|
+
);`,
|
|
880
|
+
`CREATE INDEX IF NOT EXISTS memory_places_memory_idx ON memory_places(memory_id);`,
|
|
881
|
+
`CREATE INDEX IF NOT EXISTS memory_places_place_idx ON memory_places(place_id);`,
|
|
882
|
+
// place_rules table
|
|
883
|
+
`CREATE TABLE IF NOT EXISTS place_rules (
|
|
884
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
885
|
+
project_id UUID REFERENCES projects(id) ON DELETE CASCADE NOT NULL,
|
|
886
|
+
name TEXT NOT NULL,
|
|
887
|
+
place_type TEXT NOT NULL,
|
|
888
|
+
match_tool TEXT,
|
|
889
|
+
match_keyword TEXT,
|
|
890
|
+
match_tag TEXT,
|
|
891
|
+
match_memory_type TEXT,
|
|
892
|
+
priority INTEGER DEFAULT 0,
|
|
893
|
+
enabled BOOLEAN DEFAULT TRUE,
|
|
894
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
895
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
896
|
+
);`,
|
|
897
|
+
`CREATE INDEX IF NOT EXISTS place_rules_project_idx ON place_rules(project_id);`,
|
|
898
|
+
`CREATE INDEX IF NOT EXISTS place_rules_type_idx ON place_rules(place_type);`,
|
|
899
|
+
// Belief Systems - Derived Beliefs from Memory (v1.3.0+)
|
|
900
|
+
`CREATE TABLE IF NOT EXISTS beliefs (
|
|
901
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
902
|
+
project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
|
|
903
|
+
belief_type TEXT NOT NULL,
|
|
904
|
+
statement TEXT NOT NULL,
|
|
905
|
+
normalized_key TEXT NOT NULL,
|
|
906
|
+
confidence REAL DEFAULT 0.5,
|
|
907
|
+
belief_decay_rate INTEGER DEFAULT 30,
|
|
908
|
+
last_confirmed_at TIMESTAMPTZ,
|
|
909
|
+
source_count INTEGER DEFAULT 1,
|
|
910
|
+
status TEXT DEFAULT 'active',
|
|
911
|
+
reason TEXT,
|
|
912
|
+
context TEXT,
|
|
913
|
+
evidence_summary TEXT,
|
|
914
|
+
metadata JSONB,
|
|
915
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
916
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
917
|
+
UNIQUE(project_id, normalized_key)
|
|
918
|
+
);`,
|
|
919
|
+
`CREATE INDEX IF NOT EXISTS beliefs_project_idx ON beliefs(project_id);`,
|
|
920
|
+
`CREATE INDEX IF NOT EXISTS beliefs_type_idx ON beliefs(belief_type);`,
|
|
921
|
+
`CREATE INDEX IF NOT EXISTS beliefs_status_idx ON beliefs(status);`,
|
|
922
|
+
`CREATE INDEX IF NOT EXISTS beliefs_confidence_idx ON beliefs(confidence);`,
|
|
923
|
+
`CREATE TABLE IF NOT EXISTS belief_memory_sources (
|
|
924
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
925
|
+
belief_id UUID REFERENCES beliefs(id) ON DELETE CASCADE,
|
|
926
|
+
memory_id UUID REFERENCES memories(id) ON DELETE CASCADE,
|
|
927
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
928
|
+
UNIQUE(belief_id, memory_id)
|
|
929
|
+
);`,
|
|
930
|
+
`CREATE INDEX IF NOT EXISTS belief_sources_belief_idx ON belief_memory_sources(belief_id);`,
|
|
931
|
+
`CREATE INDEX IF NOT EXISTS belief_sources_memory_idx ON belief_memory_sources(memory_id);`,
|
|
932
|
+
`CREATE TABLE IF NOT EXISTS belief_edges (
|
|
933
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
934
|
+
from_belief_id UUID REFERENCES beliefs(id) ON DELETE CASCADE,
|
|
935
|
+
to_belief_id UUID REFERENCES beliefs(id) ON DELETE CASCADE,
|
|
936
|
+
edge_type TEXT NOT NULL,
|
|
937
|
+
metadata JSONB,
|
|
938
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
939
|
+
UNIQUE(from_belief_id, to_belief_id, edge_type)
|
|
940
|
+
);`,
|
|
941
|
+
`CREATE INDEX IF NOT EXISTS belief_edges_from_idx ON belief_edges(from_belief_id);`,
|
|
942
|
+
`CREATE INDEX IF NOT EXISTS belief_edges_to_idx ON belief_edges(to_belief_id);`
|
|
575
943
|
];
|
|
576
944
|
/**
|
|
577
945
|
* Ensure the data directory exists (.squish folder in project root)
|
|
@@ -590,193 +958,72 @@ export async function ensureDataDirectory() {
|
|
|
590
958
|
}
|
|
591
959
|
}
|
|
592
960
|
export async function ensureSqliteSchema(sqlite) {
|
|
593
|
-
// Run schema creation FIRST (creates tables with latest schema)
|
|
594
|
-
|
|
961
|
+
// Run schema creation FIRST (creates tables with latest schema).
|
|
962
|
+
// Older installs may fail partway through when later indexes/triggers refer
|
|
963
|
+
// to columns that migrations have not added yet, so tolerate that first pass.
|
|
964
|
+
execSqliteSchema(sqlite, { tolerant: true });
|
|
965
|
+
// Initialize schema version tracking
|
|
966
|
+
await initializeSchemaVersionTable(sqlite);
|
|
595
967
|
// Run migrations AFTER (for existing databases that need column additions)
|
|
596
968
|
await runSqliteMigrations(sqlite);
|
|
969
|
+
// Replay the full schema after migrations so deferred indexes/triggers land.
|
|
970
|
+
execSqliteSchema(sqlite, { tolerant: false });
|
|
597
971
|
}
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
//
|
|
607
|
-
const
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
{ col: 'is_merged', sql: 'ALTER TABLE memories ADD COLUMN is_merged INTEGER DEFAULT 0' },
|
|
613
|
-
{ col: 'merged_into_id', sql: 'ALTER TABLE memories ADD COLUMN merged_into_id TEXT' },
|
|
614
|
-
{ col: 'is_mergeable', sql: 'ALTER TABLE memories ADD COLUMN is_mergeable INTEGER DEFAULT 1' },
|
|
615
|
-
{ col: 'is_canonical', sql: 'ALTER TABLE memories ADD COLUMN is_canonical INTEGER DEFAULT 0' },
|
|
616
|
-
{ col: 'merged_at', sql: 'ALTER TABLE memories ADD COLUMN merged_at INTEGER' },
|
|
617
|
-
{ col: 'merge_source_ids', sql: 'ALTER TABLE memories ADD COLUMN merge_source_ids TEXT' },
|
|
618
|
-
{ col: 'merge_version', sql: 'ALTER TABLE memories ADD COLUMN merge_version INTEGER DEFAULT 1' },
|
|
619
|
-
// Importance scoring (v0.8.0)
|
|
620
|
-
{ col: 'importance_score', sql: 'ALTER TABLE memories ADD COLUMN importance_score INTEGER DEFAULT 50' },
|
|
621
|
-
{ col: 'importance_decay_rate', sql: 'ALTER TABLE memories ADD COLUMN importance_decay_rate INTEGER DEFAULT 30' },
|
|
622
|
-
{ col: 'last_importance_recalc', sql: 'ALTER TABLE memories ADD COLUMN last_importance_recalc INTEGER' },
|
|
623
|
-
// Consolidation (v0.8.0)
|
|
624
|
-
{ col: 'consolidated_into', sql: 'ALTER TABLE memories ADD COLUMN consolidated_into TEXT' },
|
|
625
|
-
{ col: 'consolidated_at', sql: 'ALTER TABLE memories ADD COLUMN consolidated_at INTEGER' },
|
|
626
|
-
{ col: 'is_consolidated', sql: 'ALTER TABLE memories ADD COLUMN is_consolidated INTEGER DEFAULT 0' },
|
|
627
|
-
// Memory lifecycle (v0.8.0)
|
|
628
|
-
{ col: 'sector', sql: 'ALTER TABLE memories ADD COLUMN sector TEXT DEFAULT "episodic"' },
|
|
629
|
-
{ col: 'tier', sql: 'ALTER TABLE memories ADD COLUMN tier TEXT DEFAULT "hot"' },
|
|
630
|
-
{ col: 'context_status', sql: 'ALTER TABLE memories ADD COLUMN context_status TEXT DEFAULT "out-of-context"' },
|
|
631
|
-
{ col: 'decay_rate', sql: 'ALTER TABLE memories ADD COLUMN decay_rate INTEGER DEFAULT 30' },
|
|
632
|
-
{ col: 'coactivation_score', sql: 'ALTER TABLE memories ADD COLUMN coactivation_score INTEGER DEFAULT 0' },
|
|
633
|
-
{ col: 'last_decay_at', sql: 'ALTER TABLE memories ADD COLUMN last_decay_at INTEGER DEFAULT (strftime(\'%s\',\'now\'))' },
|
|
634
|
-
// Agent tracking (v0.8.0)
|
|
635
|
-
{ col: 'agent_id', sql: 'ALTER TABLE memories ADD COLUMN agent_id TEXT' },
|
|
636
|
-
{ col: 'agent_role', sql: 'ALTER TABLE memories ADD COLUMN agent_role TEXT' },
|
|
637
|
-
{ col: 'retrieval_priority', sql: 'ALTER TABLE memories ADD COLUMN retrieval_priority INTEGER DEFAULT 50' },
|
|
638
|
-
// Data governance (v0.9.0)
|
|
639
|
-
{ col: 'recorded_at', sql: 'ALTER TABLE memories ADD COLUMN recorded_at INTEGER DEFAULT (strftime(\'%s\',\'now\'))' },
|
|
640
|
-
{ col: 'confidence', sql: 'ALTER TABLE memories ADD COLUMN confidence INTEGER DEFAULT 100' },
|
|
641
|
-
{ col: 'valid_from', sql: 'ALTER TABLE memories ADD COLUMN valid_from INTEGER' },
|
|
642
|
-
{ col: 'valid_to', sql: 'ALTER TABLE memories ADD COLUMN valid_to INTEGER' },
|
|
643
|
-
{ col: 'superseded_by', sql: 'ALTER TABLE memories ADD COLUMN superseded_by TEXT' },
|
|
644
|
-
{ col: 'version', sql: 'ALTER TABLE memories ADD COLUMN version INTEGER DEFAULT 1' },
|
|
645
|
-
{ col: 'is_active', sql: 'ALTER TABLE memories ADD COLUMN is_active INTEGER DEFAULT 1' },
|
|
646
|
-
{ col: 'expires_at', sql: 'ALTER TABLE memories ADD COLUMN expires_at INTEGER' },
|
|
647
|
-
// Privacy & access (v0.9.0)
|
|
648
|
-
{ col: 'is_private', sql: 'ALTER TABLE memories ADD COLUMN is_private INTEGER DEFAULT 0' },
|
|
649
|
-
{ col: 'has_secrets', sql: 'ALTER TABLE memories ADD COLUMN has_secrets INTEGER DEFAULT 0' },
|
|
650
|
-
{ col: 'visibility_scope', sql: 'ALTER TABLE memories ADD COLUMN visibility_scope TEXT DEFAULT "private"' },
|
|
651
|
-
{ col: 'is_protected', sql: 'ALTER TABLE memories ADD COLUMN is_protected INTEGER DEFAULT 0' },
|
|
652
|
-
{ col: 'is_pinned', sql: 'ALTER TABLE memories ADD COLUMN is_pinned INTEGER DEFAULT 0' },
|
|
653
|
-
{ col: 'is_immutable', sql: 'ALTER TABLE memories ADD COLUMN is_immutable INTEGER DEFAULT 0' },
|
|
654
|
-
{ col: 'write_scope', sql: 'ALTER TABLE memories ADD COLUMN write_scope TEXT' },
|
|
655
|
-
{ col: 'read_scope', sql: 'ALTER TABLE memories ADD COLUMN read_scope TEXT' },
|
|
656
|
-
// Usage tracking (v0.9.0)
|
|
657
|
-
{ col: 'triggered_by', sql: 'ALTER TABLE memories ADD COLUMN triggered_by TEXT' },
|
|
658
|
-
{ col: 'capture_reason', sql: 'ALTER TABLE memories ADD COLUMN capture_reason TEXT' },
|
|
659
|
-
{ col: 'last_used_at', sql: 'ALTER TABLE memories ADD COLUMN last_used_at INTEGER' },
|
|
660
|
-
{ col: 'usage_count', sql: 'ALTER TABLE memories ADD COLUMN usage_count INTEGER DEFAULT 0' },
|
|
661
|
-
{ col: 'user_id', sql: 'ALTER TABLE memories ADD COLUMN user_id TEXT' },
|
|
662
|
-
// Layer tracking (v0.9.x)
|
|
663
|
-
{ col: 'has_l0_abstract', sql: 'ALTER TABLE memories ADD COLUMN has_l0_abstract INTEGER DEFAULT 0' },
|
|
664
|
-
{ col: 'has_l1_overview', sql: 'ALTER TABLE memories ADD COLUMN has_l1_overview INTEGER DEFAULT 0' },
|
|
665
|
-
{ col: 'last_layer_update', sql: 'ALTER TABLE memories ADD COLUMN last_layer_update INTEGER' },
|
|
666
|
-
// Namespace support (v1.0.x)
|
|
667
|
-
{ col: 'namespace_id', sql: 'ALTER TABLE memories ADD COLUMN namespace_id TEXT REFERENCES namespaces(id) ON DELETE SET NULL' },
|
|
668
|
-
{ col: 'namespace_path', sql: 'ALTER TABLE memories ADD COLUMN namespace_path TEXT' },
|
|
669
|
-
// Token tracking (v1.0.x)
|
|
670
|
-
{ col: 'tokens_estimate', sql: 'ALTER TABLE memories ADD COLUMN tokens_estimate INTEGER DEFAULT 0' },
|
|
671
|
-
];
|
|
672
|
-
// Get existing columns for memories table
|
|
673
|
-
const tableInfo = sqlite.prepare("PRAGMA table_info(memories)").all();
|
|
674
|
-
const existingColumns = new Set(tableInfo.map(col => col.name));
|
|
675
|
-
for (const migration of memoriesMigrations) {
|
|
676
|
-
if (!existingColumns.has(migration.col)) {
|
|
972
|
+
// Schema versions for tracking
|
|
973
|
+
const SCHEMA_VERSIONS = [
|
|
974
|
+
{ version: '1.2.0-base', description: 'Initial v1.2.0 schema with schema_versions table' },
|
|
975
|
+
{ version: '1.2.0-place-sort', description: 'Add place_sort_order column to places' },
|
|
976
|
+
{ version: '1.2.0-mem-place', description: 'Add place_sort_order to memories and memory_places' },
|
|
977
|
+
{ version: '1.2.0-agent-prefs', description: 'Add agent_preferences table for agent evolution' },
|
|
978
|
+
];
|
|
979
|
+
async function initializeSchemaVersionTable(sqlite) {
|
|
980
|
+
// Get existing versions
|
|
981
|
+
const existingVersions = sqlite.prepare("SELECT version FROM _schema_versions").all();
|
|
982
|
+
const appliedVersions = new Set(existingVersions.map(v => v.version));
|
|
983
|
+
// Insert any missing versions
|
|
984
|
+
for (const { version, description } of SCHEMA_VERSIONS) {
|
|
985
|
+
if (!appliedVersions.has(version)) {
|
|
677
986
|
try {
|
|
678
|
-
sqlite.
|
|
679
|
-
logger.info(`
|
|
987
|
+
sqlite.prepare("INSERT INTO _schema_versions (version, description) VALUES (?, ?)").run(version, description);
|
|
988
|
+
logger.info(`Schema version ${version} recorded`);
|
|
680
989
|
}
|
|
681
990
|
catch (error) {
|
|
682
|
-
//
|
|
991
|
+
// Ignore duplicate errors
|
|
683
992
|
const msg = error instanceof Error ? error.message : String(error);
|
|
684
|
-
if (msg.includes('
|
|
685
|
-
logger.
|
|
686
|
-
}
|
|
687
|
-
else {
|
|
688
|
-
throw new Error(`Migration failed for column ${migration.col}: ${msg}`);
|
|
993
|
+
if (!msg.includes('UNIQUE constraint failed')) {
|
|
994
|
+
logger.warn(`Could not record schema version ${version}: ${msg}`);
|
|
689
995
|
}
|
|
690
996
|
}
|
|
691
997
|
}
|
|
692
998
|
}
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
}
|
|
712
|
-
else {
|
|
713
|
-
throw new Error(`Migration failed for column ${migration.col}: ${msg}`);
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
}
|
|
717
|
-
}
|
|
999
|
+
}
|
|
1000
|
+
export async function getSchemaVersion(sqlite) {
|
|
1001
|
+
const result = sqlite.prepare("SELECT version FROM _schema_versions ORDER BY applied_at DESC LIMIT 1").get();
|
|
1002
|
+
return result?.version || null;
|
|
1003
|
+
}
|
|
1004
|
+
export async function runMigrationsForVersion(sqlite, targetVersion) {
|
|
1005
|
+
const currentVersion = await getSchemaVersion(sqlite);
|
|
1006
|
+
logger.info(`Current schema version: ${currentVersion}, target: ${targetVersion}`);
|
|
1007
|
+
// Run ensureSqliteSchema which handles all migrations
|
|
1008
|
+
await runSqliteMigrations(sqlite);
|
|
1009
|
+
}
|
|
1010
|
+
async function runSqliteMigrations(sqlite) {
|
|
1011
|
+
// All migrations are in separate files - just run them all
|
|
1012
|
+
await runAllMigrations(sqlite);
|
|
1013
|
+
}
|
|
1014
|
+
function execSqliteSchema(sqlite, options) {
|
|
1015
|
+
try {
|
|
1016
|
+
sqlite.exec(sqliteSchemaSql);
|
|
718
1017
|
}
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
existingMaintenanceJobsColumns.has('jobType') ||
|
|
727
|
-
existingMaintenanceJobsColumns.has('cronExpression');
|
|
728
|
-
if (hasCamelCaseColumns) {
|
|
729
|
-
// Table has incorrect camelCase schema - need to recreate it
|
|
730
|
-
logger.warn('Maintenance jobs table has incorrect schema (camelCase columns). Recreating...');
|
|
731
|
-
try {
|
|
732
|
-
// Drop the malformed table
|
|
733
|
-
sqlite.exec('DROP TABLE IF EXISTS maintenance_jobs');
|
|
734
|
-
// Recreate with correct schema - it will be created by the schema SQL
|
|
735
|
-
logger.info('Dropped malformed maintenance_jobs table. It will be recreated with correct schema.');
|
|
736
|
-
}
|
|
737
|
-
catch (error) {
|
|
738
|
-
logger.error('Failed to recreate maintenance_jobs table:', error);
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
else {
|
|
742
|
-
// Normal migrations for correct schema
|
|
743
|
-
const maintenanceJobsMigrations = [
|
|
744
|
-
{ col: 'schedule', sql: 'ALTER TABLE maintenance_jobs DROP COLUMN schedule' },
|
|
745
|
-
{ col: 'cron_expression', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN cron_expression TEXT' },
|
|
746
|
-
{ col: 'last_run_at', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN last_run_at INTEGER' },
|
|
747
|
-
{ col: 'last_run_duration', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN last_run_duration INTEGER' },
|
|
748
|
-
{ col: 'last_run_status', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN last_run_status TEXT' },
|
|
749
|
-
{ col: 'last_run_error', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN last_run_error TEXT' },
|
|
750
|
-
{ col: 'total_runs', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN total_runs INTEGER DEFAULT 0' },
|
|
751
|
-
{ col: 'success_count', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN success_count INTEGER DEFAULT 0' },
|
|
752
|
-
{ col: 'failure_count', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN failure_count INTEGER DEFAULT 0' },
|
|
753
|
-
{ col: 'job_config', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN job_config TEXT' },
|
|
754
|
-
{ col: 'next_run_at', sql: 'ALTER TABLE maintenance_jobs ADD COLUMN next_run_at INTEGER' },
|
|
755
|
-
{ col: 'run_count', sql: 'ALTER TABLE maintenance_jobs DROP COLUMN run_count' },
|
|
756
|
-
];
|
|
757
|
-
for (const migration of maintenanceJobsMigrations) {
|
|
758
|
-
// For DROP migrations, only run if column EXISTS
|
|
759
|
-
// For ADD migrations, only run if column does NOT exist
|
|
760
|
-
const shouldRun = migration.sql.startsWith('ALTER TABLE maintenance_jobs DROP COLUMN')
|
|
761
|
-
? existingMaintenanceJobsColumns.has(migration.col)
|
|
762
|
-
: !existingMaintenanceJobsColumns.has(migration.col);
|
|
763
|
-
if (shouldRun) {
|
|
764
|
-
try {
|
|
765
|
-
sqlite.exec(migration.sql);
|
|
766
|
-
logger.info(`Migration: ${migration.col} on maintenance_jobs table`);
|
|
767
|
-
}
|
|
768
|
-
catch (error) {
|
|
769
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
770
|
-
if (msg.includes('duplicate column name') || msg.includes('no such column')) {
|
|
771
|
-
logger.debug(`Migration skipped for ${migration.col}: ${msg.includes('duplicate column name') ? 'column already exists' : 'column does not exist'}`);
|
|
772
|
-
}
|
|
773
|
-
else {
|
|
774
|
-
throw new Error(`Migration failed for column ${migration.col}: ${msg}`);
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
}
|
|
778
|
-
}
|
|
1018
|
+
catch (error) {
|
|
1019
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
1020
|
+
const isRecoverable = message.includes('no such column') ||
|
|
1021
|
+
message.includes('has no column named');
|
|
1022
|
+
if (options.tolerant && isRecoverable) {
|
|
1023
|
+
logger.debug(`Deferred schema statement until after migrations: ${message}`);
|
|
1024
|
+
return;
|
|
779
1025
|
}
|
|
1026
|
+
throw error;
|
|
780
1027
|
}
|
|
781
1028
|
}
|
|
782
1029
|
export async function ensurePostgresSchema(pool) {
|