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