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,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Entity Tracker
|
|
3
|
+
*
|
|
4
|
+
* Tracks "active" entities in conversation sessions to enable
|
|
5
|
+
* reference resolution (e.g., resolving "she" to "Alice").
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { eq, and, desc, sql } from 'drizzle-orm';
|
|
9
|
+
import { getDb } from '../../db/index.js';
|
|
10
|
+
import { getSchema } from '../../db/schema.js';
|
|
11
|
+
import { logger } from '../logger.js';
|
|
12
|
+
|
|
13
|
+
// ─── Types ──────────────────────────────────────────────────────────────────
|
|
14
|
+
|
|
15
|
+
export interface SessionEntity {
|
|
16
|
+
entityId: string;
|
|
17
|
+
entityName: string;
|
|
18
|
+
entityType: string;
|
|
19
|
+
mentionCount: number;
|
|
20
|
+
lastMentionedAt: Date;
|
|
21
|
+
salience: number; // 0-1, higher = more relevant
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface SessionEntityMap {
|
|
25
|
+
sessionId: string;
|
|
26
|
+
entities: Map<string, SessionEntity>;
|
|
27
|
+
updatedAt: Date;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// ─── In-Memory Session Cache ─────────────────────────────────────────────────
|
|
31
|
+
|
|
32
|
+
const sessionCache = new Map<string, SessionEntityMap>();
|
|
33
|
+
const MAX_SESSIONS = 100;
|
|
34
|
+
const ENTITY_SALIENCE_DECAY = 0.85; // Per mention, older mentions decay
|
|
35
|
+
const MAX_SESSION_ENTITIES = 50;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Track an entity mention in a session.
|
|
39
|
+
* Updates salience based on recency and frequency.
|
|
40
|
+
*/
|
|
41
|
+
export function trackEntityInSession(
|
|
42
|
+
sessionId: string,
|
|
43
|
+
entityId: string,
|
|
44
|
+
entityName: string,
|
|
45
|
+
entityType: string
|
|
46
|
+
): void {
|
|
47
|
+
let session = sessionCache.get(sessionId);
|
|
48
|
+
|
|
49
|
+
if (!session) {
|
|
50
|
+
session = {
|
|
51
|
+
sessionId,
|
|
52
|
+
entities: new Map(),
|
|
53
|
+
updatedAt: new Date(),
|
|
54
|
+
};
|
|
55
|
+
sessionCache.set(sessionId, session);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Evict old sessions if cache is full
|
|
59
|
+
if (sessionCache.size > MAX_SESSIONS) {
|
|
60
|
+
const oldestKey = [...sessionCache.entries()]
|
|
61
|
+
.sort(([, a], [, b]) => a.updatedAt.getTime() - b.updatedAt.getTime())[0][0];
|
|
62
|
+
sessionCache.delete(oldestKey);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const existing = session.entities.get(entityId);
|
|
66
|
+
const now = new Date();
|
|
67
|
+
|
|
68
|
+
if (existing) {
|
|
69
|
+
// Update existing entity: increase salience, update mention count
|
|
70
|
+
existing.mentionCount += 1;
|
|
71
|
+
existing.lastMentionedAt = now;
|
|
72
|
+
// Salience increases with each mention, but decays for older mentions
|
|
73
|
+
existing.salience = Math.min(1.0, existing.salience + 0.2);
|
|
74
|
+
} else {
|
|
75
|
+
// New entity for this session
|
|
76
|
+
session.entities.set(entityId, {
|
|
77
|
+
entityId,
|
|
78
|
+
entityName,
|
|
79
|
+
entityType,
|
|
80
|
+
mentionCount: 1,
|
|
81
|
+
lastMentionedAt: now,
|
|
82
|
+
salience: 0.5, // Start at medium salience
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Evict least salient entities if session has too many
|
|
87
|
+
if (session.entities.size > MAX_SESSION_ENTITIES) {
|
|
88
|
+
const leastSalient = [...session.entities.entries()]
|
|
89
|
+
.sort(([, a], [, b]) => a.salience - b.salience)[0];
|
|
90
|
+
if (leastSalient) {
|
|
91
|
+
session.entities.delete(leastSalient[0]);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
session.updatedAt = now;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Get active entities for a session, sorted by salience.
|
|
100
|
+
* Applies time-based decay to salience scores.
|
|
101
|
+
*/
|
|
102
|
+
export function getActiveSessionEntities(
|
|
103
|
+
sessionId: string,
|
|
104
|
+
options?: {
|
|
105
|
+
limit?: number;
|
|
106
|
+
minSalience?: number;
|
|
107
|
+
entityTypes?: string[];
|
|
108
|
+
}
|
|
109
|
+
): SessionEntity[] {
|
|
110
|
+
const { limit = 10, minSalience = 0.1, entityTypes } = options || {};
|
|
111
|
+
|
|
112
|
+
const session = sessionCache.get(sessionId);
|
|
113
|
+
if (!session) return [];
|
|
114
|
+
|
|
115
|
+
const now = Date.now();
|
|
116
|
+
const entities: SessionEntity[] = [];
|
|
117
|
+
|
|
118
|
+
for (const [id, entity] of session.entities) {
|
|
119
|
+
// Apply time-based decay
|
|
120
|
+
const timeSinceMention = now - entity.lastMentionedAt.getTime();
|
|
121
|
+
const minutesSinceMention = timeSinceMention / (1000 * 60);
|
|
122
|
+
const timeDecay = Math.pow(ENTITY_SALIENCE_DECAY, minutesSinceMention / 5); // Decay every 5 minutes
|
|
123
|
+
const adjustedSalience = entity.salience * timeDecay;
|
|
124
|
+
|
|
125
|
+
// Filter by minimum salience
|
|
126
|
+
if (adjustedSalience < minSalience) continue;
|
|
127
|
+
|
|
128
|
+
// Filter by entity type
|
|
129
|
+
if (entityTypes && entityTypes.length > 0 && !entityTypes.includes(entity.entityType)) continue;
|
|
130
|
+
|
|
131
|
+
entities.push({
|
|
132
|
+
...entity,
|
|
133
|
+
salience: adjustedSalience,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Sort by salience (most salient first)
|
|
138
|
+
entities.sort((a, b) => b.salience - a.salience);
|
|
139
|
+
|
|
140
|
+
return entities.slice(0, limit);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Resolve a reference (pronoun, definite reference) to an entity in the session.
|
|
145
|
+
* Returns the most salient entity matching the reference type.
|
|
146
|
+
*/
|
|
147
|
+
export function resolveReference(
|
|
148
|
+
sessionId: string,
|
|
149
|
+
reference: string
|
|
150
|
+
): SessionEntity | null {
|
|
151
|
+
const session = sessionCache.get(sessionId);
|
|
152
|
+
if (!session) return null;
|
|
153
|
+
|
|
154
|
+
const lowerRef = reference.toLowerCase();
|
|
155
|
+
|
|
156
|
+
// Pronoun mapping
|
|
157
|
+
const pronounMap: Record<string, string[]> = {
|
|
158
|
+
'he': ['person'],
|
|
159
|
+
'him': ['person'],
|
|
160
|
+
'his': ['person'],
|
|
161
|
+
'she': ['person'],
|
|
162
|
+
'her': ['person'],
|
|
163
|
+
'hers': ['person'],
|
|
164
|
+
'it': ['tool', 'concept', 'file', 'function', 'class'],
|
|
165
|
+
'they': ['person', 'concept', 'tool'],
|
|
166
|
+
'them': ['person', 'concept', 'tool'],
|
|
167
|
+
'their': ['person', 'concept', 'tool'],
|
|
168
|
+
'this': [], // Any type
|
|
169
|
+
'that': [], // Any type
|
|
170
|
+
'these': [],
|
|
171
|
+
'those': [],
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
// Definite reference patterns
|
|
175
|
+
const definitePatterns: Array<{ pattern: RegExp; types: string[] }> = [
|
|
176
|
+
{ pattern: /\bthe (?:project|app|application)\b/i, types: ['concept'] },
|
|
177
|
+
{ pattern: /\bthe (?:team|group)\b/i, types: ['concept'] },
|
|
178
|
+
{ pattern: /\bthe (?:database|db)\b/i, types: ['tool'] },
|
|
179
|
+
{ pattern: /\bthe (?:server|service|api)\b/i, types: ['tool'] },
|
|
180
|
+
{ pattern: /\bthe (?:issue|bug|problem|outage)\b/i, types: ['concept'] },
|
|
181
|
+
{ pattern: /\bthe (?:file|module|component)\b/i, types: ['file'] },
|
|
182
|
+
];
|
|
183
|
+
|
|
184
|
+
// Check pronouns first
|
|
185
|
+
const allowedTypes = pronounMap[lowerRef];
|
|
186
|
+
if (allowedTypes !== undefined) {
|
|
187
|
+
const candidates = getActiveSessionEntities(sessionId, {
|
|
188
|
+
limit: 3,
|
|
189
|
+
minSalience: 0.2,
|
|
190
|
+
entityTypes: allowedTypes.length > 0 ? allowedTypes : undefined,
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
// For pronouns, return the most salient entity of the right type
|
|
194
|
+
return candidates.length > 0 ? candidates[0] : null;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Check definite references
|
|
198
|
+
for (const { pattern, types } of definitePatterns) {
|
|
199
|
+
if (pattern.test(reference)) {
|
|
200
|
+
const candidates = getActiveSessionEntities(sessionId, {
|
|
201
|
+
limit: 3,
|
|
202
|
+
minSalience: 0.2,
|
|
203
|
+
entityTypes: types,
|
|
204
|
+
});
|
|
205
|
+
return candidates.length > 0 ? candidates[0] : null;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Try to match by name (partial match)
|
|
210
|
+
const nameMatch = [...session.entities.values()]
|
|
211
|
+
.filter(e => e.entityName.toLowerCase().includes(lowerRef))
|
|
212
|
+
.sort((a, b) => b.salience - a.salience)[0];
|
|
213
|
+
|
|
214
|
+
return nameMatch || null;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Clear session entities (e.g., when a session ends).
|
|
219
|
+
*/
|
|
220
|
+
export function clearSessionEntities(sessionId: string): void {
|
|
221
|
+
sessionCache.delete(sessionId);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Get all active sessions.
|
|
226
|
+
*/
|
|
227
|
+
export function getActiveSessions(): string[] {
|
|
228
|
+
return [...sessionCache.keys()];
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Decay all session entities (call periodically).
|
|
233
|
+
* Reduces salience of all entities across all sessions.
|
|
234
|
+
*/
|
|
235
|
+
export function decayAllSessionEntities(): void {
|
|
236
|
+
const now = Date.now();
|
|
237
|
+
|
|
238
|
+
for (const [sessionId, session] of sessionCache) {
|
|
239
|
+
for (const [entityId, entity] of session.entities) {
|
|
240
|
+
const timeSinceMention = now - entity.lastMentionedAt.getTime();
|
|
241
|
+
const minutesSinceMention = timeSinceMention / (1000 * 60);
|
|
242
|
+
entity.salience *= Math.pow(ENTITY_SALIENCE_DECAY, minutesSinceMention / 5);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Remove entities with very low salience
|
|
246
|
+
for (const [entityId, entity] of session.entities) {
|
|
247
|
+
if (entity.salience < 0.01) {
|
|
248
|
+
session.entities.delete(entityId);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Remove empty sessions
|
|
253
|
+
if (session.entities.size === 0) {
|
|
254
|
+
sessionCache.delete(sessionId);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Persist session entities to the database for durability.
|
|
261
|
+
* Called periodically or on session end.
|
|
262
|
+
*/
|
|
263
|
+
export async function persistSessionEntities(sessionId: string): Promise<void> {
|
|
264
|
+
const session = sessionCache.get(sessionId);
|
|
265
|
+
if (!session || session.entities.size === 0) return;
|
|
266
|
+
|
|
267
|
+
try {
|
|
268
|
+
const db = await getDb();
|
|
269
|
+
const schema = await getSchema();
|
|
270
|
+
|
|
271
|
+
// Store session context in the context_sessions table
|
|
272
|
+
const entities = [...session.entities.values()];
|
|
273
|
+
const entityData = entities.map(e => ({
|
|
274
|
+
id: e.entityId,
|
|
275
|
+
name: e.entityName,
|
|
276
|
+
type: e.entityType,
|
|
277
|
+
salience: e.salience,
|
|
278
|
+
mentionCount: e.mentionCount,
|
|
279
|
+
}));
|
|
280
|
+
|
|
281
|
+
// Check if session exists
|
|
282
|
+
const existing = await (db as any)
|
|
283
|
+
.select()
|
|
284
|
+
.from(schema.contextSessions)
|
|
285
|
+
.where(eq(schema.contextSessions.id, sessionId))
|
|
286
|
+
.limit(1);
|
|
287
|
+
|
|
288
|
+
if (existing.length > 0) {
|
|
289
|
+
await (db as any)
|
|
290
|
+
.update(schema.contextSessions)
|
|
291
|
+
.set({
|
|
292
|
+
metadata: { entities: entityData } as any,
|
|
293
|
+
updatedAt: new Date(),
|
|
294
|
+
})
|
|
295
|
+
.where(eq(schema.contextSessions.id, sessionId));
|
|
296
|
+
}
|
|
297
|
+
// If session doesn't exist, we don't create it here
|
|
298
|
+
// (it will be created by the normal session flow)
|
|
299
|
+
|
|
300
|
+
logger.debug('Persisted session entities', {
|
|
301
|
+
sessionId,
|
|
302
|
+
entityCount: entities.length,
|
|
303
|
+
});
|
|
304
|
+
} catch (error) {
|
|
305
|
+
logger.warn('Failed to persist session entities', { error: error as Error });
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Load session entities from the database.
|
|
311
|
+
* Called when a session starts.
|
|
312
|
+
*/
|
|
313
|
+
export async function loadSessionEntities(sessionId: string): Promise<void> {
|
|
314
|
+
try {
|
|
315
|
+
const db = await getDb();
|
|
316
|
+
const schema = await getSchema();
|
|
317
|
+
|
|
318
|
+
const session = await (db as any)
|
|
319
|
+
.select()
|
|
320
|
+
.from(schema.contextSessions)
|
|
321
|
+
.where(eq(schema.contextSessions.id, sessionId))
|
|
322
|
+
.limit(1);
|
|
323
|
+
|
|
324
|
+
if (session.length === 0 || !session[0].metadata) return;
|
|
325
|
+
|
|
326
|
+
const metadata = session[0].metadata as Record<string, unknown>;
|
|
327
|
+
const entityData = metadata.entities as Array<{
|
|
328
|
+
id: string;
|
|
329
|
+
name: string;
|
|
330
|
+
type: string;
|
|
331
|
+
salience: number;
|
|
332
|
+
mentionCount: number;
|
|
333
|
+
}>;
|
|
334
|
+
|
|
335
|
+
if (!Array.isArray(entityData)) return;
|
|
336
|
+
|
|
337
|
+
const sessionMap: SessionEntityMap = {
|
|
338
|
+
sessionId,
|
|
339
|
+
entities: new Map(),
|
|
340
|
+
updatedAt: new Date(),
|
|
341
|
+
};
|
|
342
|
+
|
|
343
|
+
for (const e of entityData) {
|
|
344
|
+
sessionMap.entities.set(e.id, {
|
|
345
|
+
entityId: e.id,
|
|
346
|
+
entityName: e.name,
|
|
347
|
+
entityType: e.type,
|
|
348
|
+
mentionCount: e.mentionCount,
|
|
349
|
+
lastMentionedAt: new Date(), // Reset since we just loaded
|
|
350
|
+
salience: e.salience * 0.8, // Decay on load
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
sessionCache.set(sessionId, sessionMap);
|
|
355
|
+
|
|
356
|
+
logger.debug('Loaded session entities', {
|
|
357
|
+
sessionId,
|
|
358
|
+
entityCount: entityData.length,
|
|
359
|
+
});
|
|
360
|
+
} catch (error) {
|
|
361
|
+
logger.warn('Failed to load session entities', { error: error as Error });
|
|
362
|
+
}
|
|
363
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reference Resolver
|
|
3
|
+
*
|
|
4
|
+
* Resolves pronouns and references in queries to specific entities
|
|
5
|
+
* using session context. Enables queries like:
|
|
6
|
+
* "Was her project affected?" -> "Was Alice's project affected?"
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { trackEntityInSession, resolveReference, getActiveSessionEntities } from './entity-tracker.js';
|
|
10
|
+
import { extractEntitiesAndRelations } from '../graph/llm-entity-extractor.js';
|
|
11
|
+
import { logger } from '../logger.js';
|
|
12
|
+
|
|
13
|
+
// ─── Types ──────────────────────────────────────────────────────────────────
|
|
14
|
+
|
|
15
|
+
export interface ReferenceResolution {
|
|
16
|
+
original: string;
|
|
17
|
+
resolved: string;
|
|
18
|
+
resolvedEntity: string | null;
|
|
19
|
+
entityType: string | null;
|
|
20
|
+
confidence: number;
|
|
21
|
+
method: 'pronoun' | 'definite_reference' | 'name_match' | 'none';
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// ─── Pronoun Patterns ─────────────────────────────────────────────────────────
|
|
25
|
+
|
|
26
|
+
const PRONOUNS = new Set([
|
|
27
|
+
'he', 'him', 'his', 'she', 'her', 'hers',
|
|
28
|
+
'it', 'its', 'they', 'them', 'their', 'theirs',
|
|
29
|
+
'this', 'that', 'these', 'those',
|
|
30
|
+
]);
|
|
31
|
+
|
|
32
|
+
const POSSESSIVE_PRONOUNS = new Set([
|
|
33
|
+
'his', 'her', 'hers', 'its', 'their', 'theirs', 'my', 'your', 'our',
|
|
34
|
+
]);
|
|
35
|
+
|
|
36
|
+
// ─── Main Resolution Function ────────────────────────────────────────────────
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Resolve pronouns and references in a query using session context.
|
|
40
|
+
* Returns the original query with pronouns replaced by entity names.
|
|
41
|
+
*/
|
|
42
|
+
export async function resolvePronouns(
|
|
43
|
+
query: string,
|
|
44
|
+
sessionId: string
|
|
45
|
+
): Promise<ReferenceResolution> {
|
|
46
|
+
const words = query.split(/\s+/);
|
|
47
|
+
let resolved = query;
|
|
48
|
+
let bestResolution: ReferenceResolution = {
|
|
49
|
+
original: query,
|
|
50
|
+
resolved: query,
|
|
51
|
+
resolvedEntity: null,
|
|
52
|
+
entityType: null,
|
|
53
|
+
confidence: 0,
|
|
54
|
+
method: 'none',
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
// Step 1: Extract entities from the query itself
|
|
58
|
+
const extraction = await extractEntitiesAndRelations(query, { preferLLM: false });
|
|
59
|
+
for (const entity of extraction.entities) {
|
|
60
|
+
trackEntityInSession(sessionId, entity.name, entity.name, entity.type);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Step 2: Check each word for pronouns
|
|
64
|
+
for (let i = 0; i < words.length; i++) {
|
|
65
|
+
const word = words[i].toLowerCase().replace(/[.,!?;:]/g, '');
|
|
66
|
+
|
|
67
|
+
if (PRONOUNS.has(word)) {
|
|
68
|
+
const entity = resolveReference(sessionId, words[i]);
|
|
69
|
+
if (entity) {
|
|
70
|
+
// Replace the pronoun with the entity name
|
|
71
|
+
const originalWord = words[i];
|
|
72
|
+
words[i] = entity.entityName;
|
|
73
|
+
resolved = words.join(' ');
|
|
74
|
+
|
|
75
|
+
bestResolution = {
|
|
76
|
+
original: query,
|
|
77
|
+
resolved,
|
|
78
|
+
resolvedEntity: entity.entityName,
|
|
79
|
+
entityType: entity.entityType,
|
|
80
|
+
confidence: entity.salience,
|
|
81
|
+
method: 'pronoun',
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
logger.debug('Resolved pronoun', {
|
|
85
|
+
pronoun: originalWord,
|
|
86
|
+
entity: entity.entityName,
|
|
87
|
+
type: entity.entityType,
|
|
88
|
+
salience: entity.salience,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Step 3: Check for definite references ("the project", "the database")
|
|
95
|
+
if (bestResolution.method === 'none') {
|
|
96
|
+
const definiteRefPatterns = [
|
|
97
|
+
{ pattern: /\bthe (project|app|application)\b/i, types: ['concept'] },
|
|
98
|
+
{ pattern: /\bthe (team|group)\b/i, types: ['concept'] },
|
|
99
|
+
{ pattern: /\bthe (database|db)\b/i, types: ['tool'] },
|
|
100
|
+
{ pattern: /\bthe (server|service|api)\b/i, types: ['tool'] },
|
|
101
|
+
{ pattern: /\bthe (issue|bug|problem|outage)\b/i, types: ['concept'] },
|
|
102
|
+
{ pattern: /\bthe (file|module|component)\b/i, types: ['file'] },
|
|
103
|
+
];
|
|
104
|
+
|
|
105
|
+
for (const { pattern, types } of definiteRefPatterns) {
|
|
106
|
+
if (pattern.test(query)) {
|
|
107
|
+
const entity = resolveReference(sessionId, query.match(pattern)![0]);
|
|
108
|
+
if (entity) {
|
|
109
|
+
// Replace "the X" with "the X (EntityName)"
|
|
110
|
+
resolved = query.replace(pattern, `$1 (${entity.entityName})`);
|
|
111
|
+
|
|
112
|
+
bestResolution = {
|
|
113
|
+
original: query,
|
|
114
|
+
resolved,
|
|
115
|
+
resolvedEntity: entity.entityName,
|
|
116
|
+
entityType: entity.entityType,
|
|
117
|
+
confidence: entity.salience * 0.9, // Slightly lower confidence than direct pronoun
|
|
118
|
+
method: 'definite_reference',
|
|
119
|
+
};
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Step 4: If we resolved something, also track the resolved entity
|
|
127
|
+
if (bestResolution.resolvedEntity) {
|
|
128
|
+
trackEntityInSession(
|
|
129
|
+
sessionId,
|
|
130
|
+
bestResolution.resolvedEntity,
|
|
131
|
+
bestResolution.resolvedEntity,
|
|
132
|
+
bestResolution.entityType || 'unknown'
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return bestResolution;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Check if a query should trigger reference resolution.
|
|
141
|
+
*/
|
|
142
|
+
export function shouldResolveReferences(query: string): boolean {
|
|
143
|
+
const words = query.split(/\s+/);
|
|
144
|
+
for (const word of words) {
|
|
145
|
+
const clean = word.toLowerCase().replace(/[.,!?;:]/g, '');
|
|
146
|
+
if (PRONOUNS.has(clean)) return true;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Check for definite references
|
|
150
|
+
const definitePatterns = [
|
|
151
|
+
/\bthe (project|app|application|team|group|database|db|server|service|api|issue|bug|problem|outage|file|module|component)\b/i,
|
|
152
|
+
];
|
|
153
|
+
|
|
154
|
+
return definitePatterns.some(p => p.test(query));
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Backward compatibility
|
|
158
|
+
export const wouldBenefitFromReferenceResolution = shouldResolveReferences;
|