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,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fact Deriver
|
|
3
|
+
*
|
|
4
|
+
* Derives implicit facts from existing relationships in the knowledge graph.
|
|
5
|
+
* Example: works_on(A, X) + uses(X, Y) -> depends_on(A, Y)
|
|
6
|
+
*/
|
|
7
|
+
import type { RelationType } from '../graph/llm-entity-extractor.js';
|
|
8
|
+
export interface DerivedFact {
|
|
9
|
+
fromEntityId: string;
|
|
10
|
+
fromEntityName: string;
|
|
11
|
+
toEntityId: string;
|
|
12
|
+
toEntityName: string;
|
|
13
|
+
relationType: RelationType;
|
|
14
|
+
rule: string;
|
|
15
|
+
confidence: number;
|
|
16
|
+
isDerived: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Derive implicit facts from existing relationships in the knowledge graph.
|
|
20
|
+
* Applies transitivity and causal rules to find new relationships.
|
|
21
|
+
*/
|
|
22
|
+
export declare function deriveFacts(projectId: string, options?: {
|
|
23
|
+
maxDerivations?: number;
|
|
24
|
+
minConfidence?: number;
|
|
25
|
+
storeResults?: boolean;
|
|
26
|
+
}): Promise<DerivedFact[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Get all derived facts for a project.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getDerivedFacts(projectId: string): Promise<DerivedFact[]>;
|
|
31
|
+
//# sourceMappingURL=fact-deriver.d.ts.map
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fact Deriver
|
|
3
|
+
*
|
|
4
|
+
* Derives implicit facts from existing relationships in the knowledge graph.
|
|
5
|
+
* Example: works_on(A, X) + uses(X, Y) -> depends_on(A, Y)
|
|
6
|
+
*/
|
|
7
|
+
import { eq, and, or } from 'drizzle-orm';
|
|
8
|
+
import { getDb } from '../../db/index.js';
|
|
9
|
+
import { getSchema } from '../../db/schema.js';
|
|
10
|
+
import { logger } from '../logger.js';
|
|
11
|
+
const DERIVATION_RULES = [
|
|
12
|
+
// Transitivity rules
|
|
13
|
+
{
|
|
14
|
+
name: 'works_on_uses_depends_on',
|
|
15
|
+
fromType: 'works_on',
|
|
16
|
+
toType: 'uses',
|
|
17
|
+
derivedType: 'depends_on',
|
|
18
|
+
description: 'If A works on X and X uses Y, then A depends on Y',
|
|
19
|
+
confidence: 0.8,
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'manages_works_oversees',
|
|
23
|
+
fromType: 'manages',
|
|
24
|
+
toType: 'works_on',
|
|
25
|
+
derivedType: 'oversees',
|
|
26
|
+
description: 'If A manages B and B works on X, then A oversees X',
|
|
27
|
+
confidence: 0.75,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'caused_affects_may_affect',
|
|
31
|
+
fromType: 'caused',
|
|
32
|
+
toType: 'affects',
|
|
33
|
+
derivedType: 'may_affect',
|
|
34
|
+
description: 'If X caused Y and Y affects Z, then X may affect Z',
|
|
35
|
+
confidence: 0.7,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'part_of_contains',
|
|
39
|
+
fromType: 'part_of',
|
|
40
|
+
toType: 'contains',
|
|
41
|
+
derivedType: 'related_to',
|
|
42
|
+
description: 'If A is part of X and X contains B, then A is related to B',
|
|
43
|
+
confidence: 0.6,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: 'uses_depends_on',
|
|
47
|
+
fromType: 'uses',
|
|
48
|
+
toType: 'depends_on',
|
|
49
|
+
derivedType: 'depends_on',
|
|
50
|
+
description: 'If A uses X and X depends on Y, then A depends on Y',
|
|
51
|
+
confidence: 0.85,
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: 'created_resolved',
|
|
55
|
+
fromType: 'created',
|
|
56
|
+
toType: 'resolved',
|
|
57
|
+
derivedType: 'related_to',
|
|
58
|
+
description: 'If A created X and X was resolved by B, then A is related to B',
|
|
59
|
+
confidence: 0.5,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'blocks_depends_on',
|
|
63
|
+
fromType: 'blocks',
|
|
64
|
+
toType: 'depends_on',
|
|
65
|
+
derivedType: 'blocks',
|
|
66
|
+
description: 'If X blocks A and A depends on Y, then X may block Y',
|
|
67
|
+
confidence: 0.65,
|
|
68
|
+
},
|
|
69
|
+
];
|
|
70
|
+
// ─── Main Derivation Function ─────────────────────────────────────────────────
|
|
71
|
+
/**
|
|
72
|
+
* Derive implicit facts from existing relationships in the knowledge graph.
|
|
73
|
+
* Applies transitivity and causal rules to find new relationships.
|
|
74
|
+
*/
|
|
75
|
+
export async function deriveFacts(projectId, options) {
|
|
76
|
+
const { maxDerivations = 50, minConfidence = 0.6, storeResults = true } = options || {};
|
|
77
|
+
const db = await getDb();
|
|
78
|
+
const schema = await getSchema();
|
|
79
|
+
// Get all entities for this project
|
|
80
|
+
const entities = await db
|
|
81
|
+
.select()
|
|
82
|
+
.from(schema.entities)
|
|
83
|
+
.where(eq(schema.entities.projectId, projectId));
|
|
84
|
+
if (entities.length < 2)
|
|
85
|
+
return [];
|
|
86
|
+
const entityMap = new Map(entities.map((e) => [e.id, e]));
|
|
87
|
+
const derivedFacts = [];
|
|
88
|
+
// Get all relations for this project's entities
|
|
89
|
+
const entityIds = entities.map((e) => e.id);
|
|
90
|
+
const allRelations = [];
|
|
91
|
+
// Fetch in batches to avoid query size limits
|
|
92
|
+
const batchSize = 100;
|
|
93
|
+
for (let i = 0; i < entityIds.length; i += batchSize) {
|
|
94
|
+
const batch = entityIds.slice(i, i + batchSize);
|
|
95
|
+
const relations = await db
|
|
96
|
+
.select()
|
|
97
|
+
.from(schema.entityRelations)
|
|
98
|
+
.where(or(...batch.map((id) => eq(schema.entityRelations.fromEntityId, id))));
|
|
99
|
+
allRelations.push(...relations);
|
|
100
|
+
}
|
|
101
|
+
// Build adjacency list for fast lookup
|
|
102
|
+
const outgoing = new Map();
|
|
103
|
+
for (const rel of allRelations) {
|
|
104
|
+
if (!outgoing.has(rel.fromEntityId)) {
|
|
105
|
+
outgoing.set(rel.fromEntityId, new Map());
|
|
106
|
+
}
|
|
107
|
+
outgoing.get(rel.fromEntityId).set(rel.toEntityId, {
|
|
108
|
+
relationType: rel.type,
|
|
109
|
+
weight: rel.weight || 1,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// Apply derivation rules
|
|
113
|
+
for (const rule of DERIVATION_RULES) {
|
|
114
|
+
if (derivedFacts.length >= maxDerivations)
|
|
115
|
+
break;
|
|
116
|
+
if (rule.confidence < minConfidence)
|
|
117
|
+
continue;
|
|
118
|
+
// Find all pairs where fromType matches
|
|
119
|
+
for (const [fromId, targets] of outgoing) {
|
|
120
|
+
if (derivedFacts.length >= maxDerivations)
|
|
121
|
+
break;
|
|
122
|
+
for (const [midId, fromRel] of targets) {
|
|
123
|
+
if (fromRel.relationType !== rule.fromType)
|
|
124
|
+
continue;
|
|
125
|
+
// Check if midId has outgoing toType relations
|
|
126
|
+
const midTargets = outgoing.get(midId);
|
|
127
|
+
if (!midTargets)
|
|
128
|
+
continue;
|
|
129
|
+
for (const [toId, toRel] of midTargets) {
|
|
130
|
+
if (toRel.relationType !== rule.toType)
|
|
131
|
+
continue;
|
|
132
|
+
// Found a derivation: fromId --fromType--> midId --toType--> toId
|
|
133
|
+
// Derive: fromId --derivedType--> toId
|
|
134
|
+
const fromEntity = entityMap.get(fromId);
|
|
135
|
+
const toEntity = entityMap.get(toId);
|
|
136
|
+
if (!fromEntity || !toEntity)
|
|
137
|
+
continue;
|
|
138
|
+
// Check if this derived relation already exists
|
|
139
|
+
const existing = await db
|
|
140
|
+
.select()
|
|
141
|
+
.from(schema.entityRelations)
|
|
142
|
+
.where(and(eq(schema.entityRelations.fromEntityId, fromId), eq(schema.entityRelations.toEntityId, toId), eq(schema.entityRelations.type, rule.derivedType)))
|
|
143
|
+
.limit(1);
|
|
144
|
+
if (existing.length > 0)
|
|
145
|
+
continue; // Already exists
|
|
146
|
+
const derivedFact = {
|
|
147
|
+
fromEntityId: fromId,
|
|
148
|
+
fromEntityName: fromEntity.name,
|
|
149
|
+
toEntityId: toId,
|
|
150
|
+
toEntityName: toEntity.name,
|
|
151
|
+
relationType: rule.derivedType,
|
|
152
|
+
rule: rule.name,
|
|
153
|
+
confidence: rule.confidence,
|
|
154
|
+
isDerived: true,
|
|
155
|
+
};
|
|
156
|
+
derivedFacts.push(derivedFact);
|
|
157
|
+
// Store the derived fact if requested
|
|
158
|
+
if (storeResults) {
|
|
159
|
+
try {
|
|
160
|
+
await db.insert(schema.entityRelations).values({
|
|
161
|
+
fromEntityId: fromId,
|
|
162
|
+
toEntityId: toId,
|
|
163
|
+
type: rule.derivedType,
|
|
164
|
+
weight: Math.round(rule.confidence * 10),
|
|
165
|
+
properties: {
|
|
166
|
+
derived: true,
|
|
167
|
+
rule: rule.name,
|
|
168
|
+
confidence: rule.confidence,
|
|
169
|
+
description: rule.description,
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
logger.debug('Error storing derived fact', {
|
|
175
|
+
rule: rule.name,
|
|
176
|
+
from: fromEntity.name,
|
|
177
|
+
to: toEntity.name,
|
|
178
|
+
error: error,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
logger.info('Fact derivation completed', {
|
|
187
|
+
projectId,
|
|
188
|
+
derivedCount: derivedFacts.length,
|
|
189
|
+
rulesApplied: DERIVATION_RULES.length,
|
|
190
|
+
});
|
|
191
|
+
return derivedFacts;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Get all derived facts for a project.
|
|
195
|
+
*/
|
|
196
|
+
export async function getDerivedFacts(projectId) {
|
|
197
|
+
const db = await getDb();
|
|
198
|
+
const schema = await getSchema();
|
|
199
|
+
// Get all entities for this project
|
|
200
|
+
const entities = await db
|
|
201
|
+
.select()
|
|
202
|
+
.from(schema.entities)
|
|
203
|
+
.where(eq(schema.entities.projectId, projectId));
|
|
204
|
+
const entityIds = entities.map((e) => e.id);
|
|
205
|
+
if (entityIds.length === 0)
|
|
206
|
+
return [];
|
|
207
|
+
// Get all derived relations
|
|
208
|
+
const derivedRelations = [];
|
|
209
|
+
const batchSize = 100;
|
|
210
|
+
for (let i = 0; i < entityIds.length; i += batchSize) {
|
|
211
|
+
const batch = entityIds.slice(i, i + batchSize);
|
|
212
|
+
const relations = await db
|
|
213
|
+
.select()
|
|
214
|
+
.from(schema.entityRelations)
|
|
215
|
+
.where(or(...batch.map((id) => eq(schema.entityRelations.fromEntityId, id))));
|
|
216
|
+
for (const rel of relations) {
|
|
217
|
+
const props = rel.properties;
|
|
218
|
+
if (props && props.derived === true) {
|
|
219
|
+
const fromEntity = entities.find((e) => e.id === rel.fromEntityId);
|
|
220
|
+
const toEntity = entities.find((e) => e.id === rel.toEntityId);
|
|
221
|
+
derivedRelations.push({
|
|
222
|
+
fromEntityId: rel.fromEntityId,
|
|
223
|
+
fromEntityName: fromEntity?.name || 'Unknown',
|
|
224
|
+
toEntityId: rel.toEntityId,
|
|
225
|
+
toEntityName: toEntity?.name || 'Unknown',
|
|
226
|
+
relationType: rel.type,
|
|
227
|
+
rule: props.rule || 'unknown',
|
|
228
|
+
confidence: props.confidence || 0.5,
|
|
229
|
+
isDerived: true,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return derivedRelations;
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=fact-deriver.js.map
|
|
@@ -1,29 +1,27 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { SearchInput
|
|
1
|
+
import type { MemoryRecord } from '../lib/types.js';
|
|
2
|
+
import type { SearchInput } from './memories.js';
|
|
3
3
|
export interface HybridSearchOptions extends SearchInput {
|
|
4
4
|
candidateLimit?: number;
|
|
5
5
|
resultLimit?: number;
|
|
6
|
-
hybridOptions?: HybridScorerOptions;
|
|
7
|
-
queryEntities?: string[];
|
|
8
|
-
sessionId?: string;
|
|
9
|
-
skipRewrite?: boolean;
|
|
10
6
|
}
|
|
11
7
|
export interface HybridSearchResult extends MemoryRecord {
|
|
12
8
|
hybridScore: number;
|
|
13
9
|
semanticScore: number;
|
|
14
10
|
recencyScore: number;
|
|
15
|
-
coactivationScore: number;
|
|
16
11
|
importanceScore: number;
|
|
17
|
-
|
|
18
|
-
feedbackScore: number;
|
|
19
|
-
entityBoost: number;
|
|
12
|
+
coactivationScore: number;
|
|
20
13
|
rank: number;
|
|
21
|
-
|
|
22
|
-
original: string;
|
|
23
|
-
rewritten: string;
|
|
24
|
-
method: string;
|
|
25
|
-
};
|
|
14
|
+
explanation: string;
|
|
26
15
|
}
|
|
27
|
-
|
|
16
|
+
type ScoredItem = {
|
|
17
|
+
memoryId: string;
|
|
18
|
+
memory: Record<string, unknown>;
|
|
19
|
+
totalScore: number;
|
|
20
|
+
components: Record<string, number>;
|
|
21
|
+
rank: number;
|
|
22
|
+
explanation: string;
|
|
23
|
+
};
|
|
24
|
+
export declare function applyEntityBoostAndRerank<T extends ScoredItem>(scored: T[]): T[];
|
|
28
25
|
export declare function hybridSearch(options: HybridSearchOptions): Promise<HybridSearchResult[]>;
|
|
26
|
+
export {};
|
|
29
27
|
//# sourceMappingURL=hybrid-retrieval.d.ts.map
|
|
@@ -1,139 +1,37 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getEmbedding } from '../embeddings.js';
|
|
3
|
-
import { search } from './memories.js';
|
|
4
|
-
import { filterByEntities } from './entity-resolver.js';
|
|
5
|
-
import { rewriteQuery, wouldBenefitFromRewrite } from './query-rewriter.js';
|
|
6
|
-
import { collectRecentContext } from './context-collector.js';
|
|
7
|
-
import { config } from '../../config.js';
|
|
8
|
-
import { logger } from '../logger.js';
|
|
9
|
-
import { startTrace, addQueryRewriteStage, addCandidateRetrievalStage, addEntityFilteringStage, addHybridScoringStage, addRerankingStage, completeTrace, } from '../tracing/collector.js';
|
|
1
|
+
import { hybridSearch as currentHybridSearch } from './hybrid-search.js';
|
|
10
2
|
export function applyEntityBoostAndRerank(scored) {
|
|
11
|
-
|
|
3
|
+
return scored
|
|
4
|
+
.map((item) => {
|
|
12
5
|
const rawBoost = item.memory._entityBoost;
|
|
13
|
-
const entityBoost = typeof rawBoost === 'number' ? rawBoost : 0
|
|
14
|
-
const multiplier = 0.8 + entityBoost * 0.4;
|
|
6
|
+
const entityBoost = typeof rawBoost === 'number' ? rawBoost : 0;
|
|
15
7
|
return {
|
|
16
8
|
...item,
|
|
17
|
-
totalScore:
|
|
9
|
+
totalScore: item.totalScore + entityBoost * 20,
|
|
18
10
|
};
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
11
|
+
})
|
|
12
|
+
.sort((a, b) => b.totalScore - a.totalScore)
|
|
13
|
+
.map((item, index) => ({
|
|
14
|
+
...item,
|
|
15
|
+
rank: index + 1,
|
|
16
|
+
}));
|
|
25
17
|
}
|
|
26
18
|
export async function hybridSearch(options) {
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
let rewriteInfo = null;
|
|
34
|
-
// Query rewriting stage
|
|
35
|
-
if (config.queryRewritingEnabled && !options.skipRewrite && options.sessionId) {
|
|
36
|
-
const rewriteStart = Date.now();
|
|
37
|
-
try {
|
|
38
|
-
const context = await collectRecentContext(options.sessionId, config.queryRewritingContextMessages);
|
|
39
|
-
if (wouldBenefitFromRewrite(query) || context.length > 0) {
|
|
40
|
-
const result = await rewriteQuery(query, context);
|
|
41
|
-
if (result.rewritten !== result.original) {
|
|
42
|
-
rewriteInfo = {
|
|
43
|
-
original: result.original,
|
|
44
|
-
rewritten: result.rewritten,
|
|
45
|
-
method: result.method,
|
|
46
|
-
};
|
|
47
|
-
query = result.rewritten;
|
|
48
|
-
logger.info(`[HybridSearch] Query rewritten: "${result.original}" -> "${result.rewritten}" (${result.method})`);
|
|
49
|
-
}
|
|
50
|
-
// Record query rewrite stage
|
|
51
|
-
await addQueryRewriteStage(traceId, {
|
|
52
|
-
original: result.original,
|
|
53
|
-
rewritten: result.rewritten,
|
|
54
|
-
method: result.method,
|
|
55
|
-
timeMs: Date.now() - rewriteStart,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
catch (error) {
|
|
60
|
-
logger.warn(`[HybridSearch] Query rewriting failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
// Get embedding
|
|
64
|
-
const queryEmbedding = await getEmbedding(query);
|
|
65
|
-
// Candidate retrieval stage
|
|
66
|
-
const retrievalStart = Date.now();
|
|
67
|
-
const candidates = await search({
|
|
68
|
-
...options,
|
|
69
|
-
limit: candidateLimit,
|
|
70
|
-
});
|
|
71
|
-
await addCandidateRetrievalStage(traceId, {
|
|
72
|
-
candidates: candidates.length,
|
|
73
|
-
timeMs: Date.now() - retrievalStart,
|
|
74
|
-
});
|
|
75
|
-
if (candidates.length === 0) {
|
|
76
|
-
await completeTrace(traceId, []);
|
|
77
|
-
return [];
|
|
78
|
-
}
|
|
79
|
-
// Entity filtering stage
|
|
80
|
-
const filteringStart = Date.now();
|
|
81
|
-
const entityScored = filterByEntities(candidates, options.queryEntities || []);
|
|
82
|
-
await addEntityFilteringStage(traceId, {
|
|
83
|
-
entities: options.queryEntities || [],
|
|
84
|
-
results: entityScored.length,
|
|
85
|
-
timeMs: Date.now() - filteringStart,
|
|
19
|
+
const limit = options.resultLimit ?? options.limit ?? 5;
|
|
20
|
+
const results = await currentHybridSearch(options, {
|
|
21
|
+
limit,
|
|
22
|
+
project: options.project,
|
|
23
|
+
type: options.type,
|
|
24
|
+
tags: options.tags,
|
|
86
25
|
});
|
|
87
|
-
|
|
88
|
-
...
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
...options.hybridOptions,
|
|
95
|
-
weights: {
|
|
96
|
-
semantic: 0.30,
|
|
97
|
-
recency: 0.20,
|
|
98
|
-
coactivation: 0.10,
|
|
99
|
-
importance: 0.15,
|
|
100
|
-
confidence: 0.15,
|
|
101
|
-
feedback: 0.10,
|
|
102
|
-
...options.hybridOptions?.weights,
|
|
103
|
-
},
|
|
104
|
-
decayDays: 7,
|
|
105
|
-
});
|
|
106
|
-
await addHybridScoringStage(traceId, {
|
|
107
|
-
results: scored.length,
|
|
108
|
-
timeMs: Date.now() - scoringStart,
|
|
109
|
-
});
|
|
110
|
-
// Reranking stage
|
|
111
|
-
const rerankStart = Date.now();
|
|
112
|
-
const reranked = applyEntityBoostAndRerank(scored);
|
|
113
|
-
await addRerankingStage(traceId, {
|
|
114
|
-
results: reranked.length,
|
|
115
|
-
timeMs: Date.now() - rerankStart,
|
|
116
|
-
});
|
|
117
|
-
const topResults = reranked.slice(0, resultLimit);
|
|
118
|
-
// Complete trace with results
|
|
119
|
-
const traceResults = topResults.map((r) => ({
|
|
120
|
-
type: r.memory?.type,
|
|
121
|
-
content: r.memory?.content,
|
|
122
|
-
hybridScore: r.totalScore,
|
|
123
|
-
}));
|
|
124
|
-
await completeTrace(traceId, traceResults);
|
|
125
|
-
return topResults.map((scoredItem, index) => ({
|
|
126
|
-
...scoredItem.memory,
|
|
127
|
-
hybridScore: scoredItem.totalScore,
|
|
128
|
-
semanticScore: scoredItem.components.semantic,
|
|
129
|
-
recencyScore: scoredItem.components.recency,
|
|
130
|
-
coactivationScore: scoredItem.components.coactivation,
|
|
131
|
-
importanceScore: scoredItem.components.importance,
|
|
132
|
-
confidenceScore: scoredItem.components.confidence,
|
|
133
|
-
feedbackScore: scoredItem.components.feedback,
|
|
134
|
-
entityBoost: scoredItem.memory._entityBoost || 0.5,
|
|
26
|
+
return results.map((result, index) => ({
|
|
27
|
+
...result,
|
|
28
|
+
hybridScore: result.similarity ?? 0,
|
|
29
|
+
semanticScore: result.similarity ?? 0,
|
|
30
|
+
recencyScore: 0,
|
|
31
|
+
importanceScore: typeof result.importance === 'number' ? result.importance : 0,
|
|
32
|
+
coactivationScore: 0,
|
|
135
33
|
rank: index + 1,
|
|
136
|
-
|
|
34
|
+
explanation: 'Compatibility result from current hybrid search',
|
|
137
35
|
}));
|
|
138
36
|
}
|
|
139
37
|
//# sourceMappingURL=hybrid-retrieval.js.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/** Hybrid Scorer - Multi-factor relevance scoring for memory ranking */
|
|
2
2
|
import { logger } from '../../core/logger.js';
|
|
3
|
+
import { cosineSimilarity } from '../utils/vector-operations.js';
|
|
3
4
|
export async function hybridScore(queryEmbedding, memories, options = {}) {
|
|
4
5
|
const weights = {
|
|
5
6
|
semantic: options.weights?.semantic ?? 0.30,
|
|
@@ -70,8 +71,8 @@ function calculateSemanticScore(queryEmbedding, memory) {
|
|
|
70
71
|
}
|
|
71
72
|
if (!memoryEmbedding || memoryEmbedding.length === 0)
|
|
72
73
|
return 50;
|
|
73
|
-
const
|
|
74
|
-
return Math.max(0, Math.min(100, (
|
|
74
|
+
const semanticScore = cosineSimilarity(queryEmbedding, memoryEmbedding);
|
|
75
|
+
return Math.max(0, Math.min(100, (semanticScore + 1) * 50));
|
|
75
76
|
}
|
|
76
77
|
catch (error) {
|
|
77
78
|
logger.error('Error calculating semantic score', error);
|
|
@@ -144,10 +145,10 @@ function calculateCoactivationScore(memory) {
|
|
|
144
145
|
}
|
|
145
146
|
function calculateImportanceScore(memory) {
|
|
146
147
|
let score = 50;
|
|
148
|
+
// Simplified: hot or cold only (warm removed)
|
|
147
149
|
if (memory.tier === 'hot')
|
|
148
150
|
score += 30;
|
|
149
|
-
|
|
150
|
-
score += 15;
|
|
151
|
+
// No bonus for cold - it's the fallback
|
|
151
152
|
if (memory.relevanceScore)
|
|
152
153
|
score += memory.relevanceScore * 0.2;
|
|
153
154
|
if (memory.isPinned)
|
|
@@ -207,23 +208,6 @@ function calculateFeedbackScore(memory) {
|
|
|
207
208
|
const retrievalPriority = memory.retrievalPriority ?? 50;
|
|
208
209
|
return Math.max(0, Math.min(100, retrievalPriority));
|
|
209
210
|
}
|
|
210
|
-
function calculateCosineSimilarity(vecA, vecB) {
|
|
211
|
-
if (vecA.length !== vecB.length)
|
|
212
|
-
return 0;
|
|
213
|
-
let dotProduct = 0;
|
|
214
|
-
let magnitudeA = 0;
|
|
215
|
-
let magnitudeB = 0;
|
|
216
|
-
for (let i = 0; i < vecA.length; i++) {
|
|
217
|
-
dotProduct += vecA[i] * vecB[i];
|
|
218
|
-
magnitudeA += vecA[i] * vecA[i];
|
|
219
|
-
magnitudeB += vecB[i] * vecB[i];
|
|
220
|
-
}
|
|
221
|
-
magnitudeA = Math.sqrt(magnitudeA);
|
|
222
|
-
magnitudeB = Math.sqrt(magnitudeB);
|
|
223
|
-
if (magnitudeA === 0 || magnitudeB === 0)
|
|
224
|
-
return 0;
|
|
225
|
-
return dotProduct / (magnitudeA * magnitudeB);
|
|
226
|
-
}
|
|
227
211
|
function generateScoreExplanation(components, weights, memory) {
|
|
228
212
|
const parts = [];
|
|
229
213
|
if (components.semantic > 70)
|
|
@@ -238,10 +222,9 @@ function generateScoreExplanation(components, weights, memory) {
|
|
|
238
222
|
parts.push('moderately recent');
|
|
239
223
|
else
|
|
240
224
|
parts.push('older');
|
|
225
|
+
// Simplified: hot or cold only (warm removed)
|
|
241
226
|
if (memory.tier === 'hot')
|
|
242
227
|
parts.push('active memory');
|
|
243
|
-
else if (memory.tier === 'warm')
|
|
244
|
-
parts.push('accessible memory');
|
|
245
228
|
else
|
|
246
229
|
parts.push('archived memory');
|
|
247
230
|
if (components.coactivation > 60)
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Vector Search - Pure semantic search with optional graph boosting + multi-session support
|
|
3
|
+
*
|
|
4
|
+
* Uses cosine similarity on embeddings + optional graph boost
|
|
5
|
+
* BM25 removed - use qmd-client for hot tier (BM25 + vectors + reranking)
|
|
4
6
|
*/
|
|
5
7
|
import type { SearchResult, SearchInput } from './memories.js';
|
|
6
8
|
export interface HybridSearchOptions {
|
|
@@ -8,13 +10,14 @@ export interface HybridSearchOptions {
|
|
|
8
10
|
project?: string;
|
|
9
11
|
type?: string;
|
|
10
12
|
tags?: string[];
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
enableMultiSession?: boolean;
|
|
14
|
+
enableGraphTraversal?: boolean;
|
|
15
|
+
enableHeuristics?: boolean;
|
|
16
|
+
includeAssociations?: boolean;
|
|
15
17
|
}
|
|
16
18
|
/**
|
|
17
|
-
* Main
|
|
19
|
+
* Main search function - vectors + graph boost + heuristics + places + sessions
|
|
20
|
+
* Unified search integrating Places, Graph, and Memory
|
|
18
21
|
*/
|
|
19
22
|
export declare function hybridSearch(input: SearchInput, options?: HybridSearchOptions): Promise<SearchResult[]>;
|
|
20
23
|
//# sourceMappingURL=hybrid-search.d.ts.map
|