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,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Hop Retrieval
|
|
3
|
+
*
|
|
4
|
+
* Combines vector search with graph traversal to answer queries that
|
|
5
|
+
* require following relationships across entities.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { eq } from 'drizzle-orm';
|
|
9
|
+
import { getDb } from '../../db/index.js';
|
|
10
|
+
import { getSchema } from '../../db/schema.js';
|
|
11
|
+
import { hybridSearch, type SearchResult } from '../memory/hybrid-search.js';
|
|
12
|
+
import { extractEntitiesAndRelations } from './llm-entity-extractor.js';
|
|
13
|
+
import { extractEntityNames } from '../memory/entity-extractor.js';
|
|
14
|
+
import { findEntitiesByName, findPaths, traverse, type GraphNode, type TraversalPath } from './graph-traversal.js';
|
|
15
|
+
import { logger } from '../logger.js';
|
|
16
|
+
import { config } from '../../config.js';
|
|
17
|
+
import { extractEntityNames } from '../memory/entity-extractor.js';
|
|
18
|
+
|
|
19
|
+
// ─── Types ──────────────────────────────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
export interface MultiHopResult extends SearchResult {
|
|
22
|
+
/** How this result was found: 'vector' (direct search) or 'graph' (via traversal) */
|
|
23
|
+
retrievalPath: 'vector' | 'graph' | 'both';
|
|
24
|
+
/** The graph path that led to this result (if found via graph) */
|
|
25
|
+
graphPath?: TraversalPath;
|
|
26
|
+
/** Entities that connected this result to the query */
|
|
27
|
+
connectingEntities?: string[];
|
|
28
|
+
/** Hybrid score for backward compatibility */
|
|
29
|
+
hybridScore?: number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface MultiHopSearchOptions {
|
|
33
|
+
/** Search query */
|
|
34
|
+
query: string;
|
|
35
|
+
/** Project path for scoping */
|
|
36
|
+
project?: string;
|
|
37
|
+
/** Maximum number of results */
|
|
38
|
+
limit?: number;
|
|
39
|
+
/** Maximum graph traversal depth */
|
|
40
|
+
maxHops?: number;
|
|
41
|
+
/** Whether to include vector-only results */
|
|
42
|
+
includeVectorResults?: boolean;
|
|
43
|
+
/** Whether to include graph-expanded results */
|
|
44
|
+
includeGraphResults?: boolean;
|
|
45
|
+
/** Minimum graph path weight to include */
|
|
46
|
+
minPathWeight?: number;
|
|
47
|
+
/** Session ID for context */
|
|
48
|
+
sessionId?: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// ─── Main Multi-Hop Search ──────────────────────────────────────────────────
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Perform multi-hop search combining vector search with graph traversal.
|
|
55
|
+
*/
|
|
56
|
+
export async function multiHopSearch(
|
|
57
|
+
options: MultiHopSearchOptions
|
|
58
|
+
): Promise<MultiHopResult[]> {
|
|
59
|
+
const {
|
|
60
|
+
query,
|
|
61
|
+
project,
|
|
62
|
+
limit = 10,
|
|
63
|
+
maxHops = 3,
|
|
64
|
+
includeVectorResults = true,
|
|
65
|
+
includeGraphResults = true,
|
|
66
|
+
minPathWeight = 1,
|
|
67
|
+
sessionId,
|
|
68
|
+
} = options;
|
|
69
|
+
|
|
70
|
+
const results: MultiHopResult[] = [];
|
|
71
|
+
const seenMemoryIds = new Set<string>();
|
|
72
|
+
|
|
73
|
+
// Step 1: Extract query entities (respect global LLM config)
|
|
74
|
+
let queryEntityNames: string[];
|
|
75
|
+
try {
|
|
76
|
+
const extraction = await extractEntitiesAndRelations(query, { preferLLM: config.llmEnabled });
|
|
77
|
+
queryEntityNames = extraction.entities.map(e => e.name);
|
|
78
|
+
logger.debug('Multi-hop search: entity extraction succeeded', {
|
|
79
|
+
query: query.substring(0, 100),
|
|
80
|
+
entities: queryEntityNames,
|
|
81
|
+
source: extraction.source,
|
|
82
|
+
});
|
|
83
|
+
} catch (error) {
|
|
84
|
+
// LLM failed or disabled - fall back to simple keyword extraction
|
|
85
|
+
logger.debug('Multi-hop search: entity extraction failed, falling back to keywords', { error });
|
|
86
|
+
const simpleEntities = extractEntityNames(query);
|
|
87
|
+
queryEntityNames = simpleEntities;
|
|
88
|
+
logger.debug('Multi-hop search: keyword extraction', {
|
|
89
|
+
entities: queryEntityNames,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Step 2: Vector search (baseline results)
|
|
94
|
+
if (includeVectorResults) {
|
|
95
|
+
const vectorResults = await hybridSearch({
|
|
96
|
+
query,
|
|
97
|
+
project,
|
|
98
|
+
limit: limit * 2, // Get more candidates for reranking
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
for (const result of vectorResults) {
|
|
102
|
+
if (!seenMemoryIds.has(result.id)) {
|
|
103
|
+
seenMemoryIds.add(result.id);
|
|
104
|
+
results.push({
|
|
105
|
+
...result,
|
|
106
|
+
retrievalPath: 'vector',
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Step 3: Graph expansion (if we have entities)
|
|
113
|
+
if (includeGraphResults && queryEntityNames.length > 0 && project) {
|
|
114
|
+
const graphResults = await expandViaGraph(
|
|
115
|
+
queryEntityNames,
|
|
116
|
+
project,
|
|
117
|
+
maxHops,
|
|
118
|
+
minPathWeight,
|
|
119
|
+
limit
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
// Find memories connected to graph-expanded entities
|
|
123
|
+
for (const graphResult of graphResults) {
|
|
124
|
+
// Search for memories mentioning the expanded entities
|
|
125
|
+
const expandedMemories = await hybridSearch({
|
|
126
|
+
query: graphResult.entityName,
|
|
127
|
+
project,
|
|
128
|
+
limit: 5,
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
for (const memory of expandedMemories) {
|
|
132
|
+
if (!seenMemoryIds.has(memory.id)) {
|
|
133
|
+
seenMemoryIds.add(memory.id);
|
|
134
|
+
results.push({
|
|
135
|
+
...memory,
|
|
136
|
+
retrievalPath: 'graph',
|
|
137
|
+
graphPath: graphResult.path,
|
|
138
|
+
connectingEntities: [graphResult.entityName],
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Step 4: Rank combined results
|
|
146
|
+
// Vector results keep their hybrid score, graph results get a boost
|
|
147
|
+
// for being connected to query entities via the knowledge graph
|
|
148
|
+
const ranked = rankMultiHopResults(results, queryEntityNames);
|
|
149
|
+
|
|
150
|
+
return ranked.slice(0, limit);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// ─── Graph Expansion ─────────────────────────────────────────────────────────
|
|
154
|
+
|
|
155
|
+
interface GraphExpansionResult {
|
|
156
|
+
entityName: string;
|
|
157
|
+
entityId: string;
|
|
158
|
+
path: TraversalPath;
|
|
159
|
+
relevanceScore: number;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Expand query entities via the knowledge graph to find related entities.
|
|
164
|
+
*/
|
|
165
|
+
async function expandViaGraph(
|
|
166
|
+
queryEntityNames: string[],
|
|
167
|
+
project: string,
|
|
168
|
+
maxHops: number,
|
|
169
|
+
minPathWeight: number,
|
|
170
|
+
limit: number
|
|
171
|
+
): Promise<GraphExpansionResult[]> {
|
|
172
|
+
const db = await getDb();
|
|
173
|
+
const schema = await getSchema();
|
|
174
|
+
const results: GraphExpansionResult[] = [];
|
|
175
|
+
const seenEntities = new Set<string>();
|
|
176
|
+
|
|
177
|
+
// Get project ID
|
|
178
|
+
const projectRows = await (db as any)
|
|
179
|
+
.select({ id: schema.projects.id })
|
|
180
|
+
.from(schema.projects)
|
|
181
|
+
.where(eq(schema.projects.path, project))
|
|
182
|
+
.limit(1);
|
|
183
|
+
|
|
184
|
+
if (projectRows.length === 0) return [];
|
|
185
|
+
|
|
186
|
+
const projectId = projectRows[0].id;
|
|
187
|
+
|
|
188
|
+
// For each query entity, find it in the graph and expand
|
|
189
|
+
for (const entityName of queryEntityNames) {
|
|
190
|
+
const entities = await findEntitiesByName(entityName, projectId, { limit: 3 });
|
|
191
|
+
|
|
192
|
+
for (const entity of entities) {
|
|
193
|
+
if (seenEntities.has(entity.id)) continue;
|
|
194
|
+
seenEntities.add(entity.id);
|
|
195
|
+
|
|
196
|
+
// Traverse the graph from this entity
|
|
197
|
+
const neighbors = await traverse(entity.id, {
|
|
198
|
+
maxDepth: maxHops,
|
|
199
|
+
minWeight: minPathWeight,
|
|
200
|
+
limit: 20,
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
for (const neighbor of neighbors) {
|
|
204
|
+
if (seenEntities.has(neighbor.id)) continue;
|
|
205
|
+
seenEntities.add(neighbor.id);
|
|
206
|
+
|
|
207
|
+
// Find the path from query entity to this neighbor
|
|
208
|
+
const paths = await findPaths(entity.id, neighbor.id, {
|
|
209
|
+
maxHops,
|
|
210
|
+
minWeight: minPathWeight,
|
|
211
|
+
maxPaths: 1,
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
if (paths.length > 0) {
|
|
215
|
+
const path = paths[0];
|
|
216
|
+
// Score based on path length and weight
|
|
217
|
+
const relevanceScore = 1 / (1 + path.hopCount) * (1 / (1 + path.totalWeight * 0.1));
|
|
218
|
+
|
|
219
|
+
results.push({
|
|
220
|
+
entityName: neighbor.name,
|
|
221
|
+
entityId: neighbor.id,
|
|
222
|
+
path,
|
|
223
|
+
relevanceScore,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Sort by relevance score
|
|
231
|
+
results.sort((a, b) => b.relevanceScore - a.relevanceScore);
|
|
232
|
+
|
|
233
|
+
return results.slice(0, limit);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// ─── Result Ranking ──────────────────────────────────────────────────────────
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Rank multi-hop results combining vector score with graph connectivity.
|
|
240
|
+
*/
|
|
241
|
+
function rankMultiHopResults(
|
|
242
|
+
results: MultiHopResult[],
|
|
243
|
+
queryEntityNames: string[]
|
|
244
|
+
): MultiHopResult[] {
|
|
245
|
+
return results
|
|
246
|
+
.map(result => {
|
|
247
|
+
let score = result.similarity || 0;
|
|
248
|
+
|
|
249
|
+
// Boost for graph-connected results
|
|
250
|
+
if (result.retrievalPath === 'graph' || result.retrievalPath === 'both') {
|
|
251
|
+
score *= 1.2; // 20% boost for graph connectivity
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// Boost for matching query entities in content
|
|
255
|
+
const contentLower = (result.content || '').toLowerCase();
|
|
256
|
+
for (const entity of queryEntityNames) {
|
|
257
|
+
if (contentLower.includes(entity.toLowerCase())) {
|
|
258
|
+
score *= 1.1; // 10% boost per entity match
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Boost for shorter graph paths (more direct connections)
|
|
263
|
+
if (result.graphPath) {
|
|
264
|
+
const pathBonus = 1 / (1 + result.graphPath.hopCount * 0.2);
|
|
265
|
+
score *= (1 + pathBonus * 0.15); // Up to 15% bonus for short paths
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
return {
|
|
269
|
+
...result,
|
|
270
|
+
similarity: Math.round(score * 1000) / 1000,
|
|
271
|
+
hybridScore: Math.round(score * 100) / 100, // Backward compat
|
|
272
|
+
};
|
|
273
|
+
})
|
|
274
|
+
.sort((a, b) => (b.similarity || 0) - (a.similarity || 0));
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// ─── Utility ────────────────────────────────────────────────────────────────
|
|
278
|
+
|
|
279
|
+
/** Check if query needs multi-hop graph traversal. */
|
|
280
|
+
export function needsMultiHop(query: string): boolean {
|
|
281
|
+
// Queries with relationship indicators benefit from multi-hop
|
|
282
|
+
const relationshipPatterns = [
|
|
283
|
+
/\b(affected by|caused by|related to|connected to|depends? on|works? on|uses?|manages?)\b/i,
|
|
284
|
+
/\b(who|what|which|how)\b.*\b(project|team|system|service|database)\b/i,
|
|
285
|
+
/\b(impact|affect|influence|caus\w+|result|lead to)\b/i,
|
|
286
|
+
];
|
|
287
|
+
|
|
288
|
+
return relationshipPatterns.some(pattern => pattern.test(query));
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Get a human-readable explanation of how a multi-hop result was found.
|
|
293
|
+
*/
|
|
294
|
+
export function explainRetrievalPath(result: MultiHopResult): string {
|
|
295
|
+
if (result.retrievalPath === 'vector') {
|
|
296
|
+
return `Found via semantic search (score: ${result.similarity?.toFixed(2)})`;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
if (result.retrievalPath === 'graph' && result.graphPath) {
|
|
300
|
+
const pathSteps = result.graphPath.nodes
|
|
301
|
+
.map(n => n.name)
|
|
302
|
+
.join(' → ');
|
|
303
|
+
return `Found via knowledge graph: ${pathSteps} (hops: ${result.graphPath.hopCount})`;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (result.retrievalPath === 'both' && result.graphPath) {
|
|
307
|
+
const pathSteps = result.graphPath.nodes
|
|
308
|
+
.map(n => n.name)
|
|
309
|
+
.join(' → ');
|
|
310
|
+
return `Found via both search and graph: ${pathSteps} (score: ${result.similarity?.toFixed(2)})`;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
return `Found via ${result.retrievalPath} search`;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Backward compatibility alias
|
|
317
|
+
export const wouldBenefitFromMultiHop = needsMultiHop;
|