squish-memory 0.7.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/.claude-plugin/marketplace.json +20 -0
- package/.claude-plugin/plugin.json +32 -0
- package/.mcp.json +14 -0
- package/LICENSE +21 -0
- package/README.md +556 -0
- package/commands/context-paging.md +51 -0
- package/commands/context-status.md +22 -0
- package/commands/context.md +5 -0
- package/commands/core-memory.md +56 -0
- package/commands/health.md +5 -0
- package/commands/init.md +39 -0
- package/commands/merge.md +113 -0
- package/commands/observe.md +5 -0
- package/commands/recall.md +5 -0
- package/commands/remember.md +11 -0
- package/commands/search.md +10 -0
- package/dist/adapters/claude-code/capture.d.ts +11 -0
- package/dist/adapters/claude-code/capture.d.ts.map +1 -0
- package/dist/adapters/claude-code/capture.js +100 -0
- package/dist/adapters/claude-code/capture.js.map +1 -0
- package/dist/adapters/claude-code/index.d.ts +5 -0
- package/dist/adapters/claude-code/index.d.ts.map +1 -0
- package/dist/adapters/claude-code/index.js +6 -0
- package/dist/adapters/claude-code/index.js.map +1 -0
- package/dist/adapters/claude-code/injection.d.ts +34 -0
- package/dist/adapters/claude-code/injection.d.ts.map +1 -0
- package/dist/adapters/claude-code/injection.js +127 -0
- package/dist/adapters/claude-code/injection.js.map +1 -0
- package/dist/adapters/claude-code/plugin-wrapper.d.ts +21 -0
- package/dist/adapters/claude-code/plugin-wrapper.d.ts.map +1 -0
- package/dist/adapters/claude-code/plugin-wrapper.js +239 -0
- package/dist/adapters/claude-code/plugin-wrapper.js.map +1 -0
- package/dist/adapters/claude-code/types.d.ts +46 -0
- package/dist/adapters/claude-code/types.d.ts.map +1 -0
- package/dist/adapters/claude-code/types.js +6 -0
- package/dist/adapters/claude-code/types.js.map +1 -0
- package/dist/algorithms/merge/analytics/token-estimator.d.ts +50 -0
- package/dist/algorithms/merge/analytics/token-estimator.d.ts.map +1 -0
- package/dist/algorithms/merge/analytics/token-estimator.js +154 -0
- package/dist/algorithms/merge/analytics/token-estimator.js.map +1 -0
- package/dist/algorithms/merge/detection/hash-filters.d.ts +47 -0
- package/dist/algorithms/merge/detection/hash-filters.d.ts.map +1 -0
- package/dist/algorithms/merge/detection/hash-filters.js +190 -0
- package/dist/algorithms/merge/detection/hash-filters.js.map +1 -0
- package/dist/algorithms/merge/detection/semantic-ranker.d.ts +32 -0
- package/dist/algorithms/merge/detection/semantic-ranker.d.ts.map +1 -0
- package/dist/algorithms/merge/detection/semantic-ranker.js +118 -0
- package/dist/algorithms/merge/detection/semantic-ranker.js.map +1 -0
- package/dist/algorithms/merge/detection/two-stage-detector.d.ts +49 -0
- package/dist/algorithms/merge/detection/two-stage-detector.d.ts.map +1 -0
- package/dist/algorithms/merge/detection/two-stage-detector.js +185 -0
- package/dist/algorithms/merge/detection/two-stage-detector.js.map +1 -0
- package/dist/algorithms/merge/handlers/approve-merge.d.ts +22 -0
- package/dist/algorithms/merge/handlers/approve-merge.d.ts.map +1 -0
- package/dist/algorithms/merge/handlers/approve-merge.js +179 -0
- package/dist/algorithms/merge/handlers/approve-merge.js.map +1 -0
- package/dist/algorithms/merge/handlers/detect-duplicates.d.ts +47 -0
- package/dist/algorithms/merge/handlers/detect-duplicates.d.ts.map +1 -0
- package/dist/algorithms/merge/handlers/detect-duplicates.js +165 -0
- package/dist/algorithms/merge/handlers/detect-duplicates.js.map +1 -0
- package/dist/algorithms/merge/handlers/get-stats.d.ts +39 -0
- package/dist/algorithms/merge/handlers/get-stats.d.ts.map +1 -0
- package/dist/algorithms/merge/handlers/get-stats.js +88 -0
- package/dist/algorithms/merge/handlers/get-stats.js.map +1 -0
- package/dist/algorithms/merge/handlers/list-proposals.d.ts +45 -0
- package/dist/algorithms/merge/handlers/list-proposals.d.ts.map +1 -0
- package/dist/algorithms/merge/handlers/list-proposals.js +83 -0
- package/dist/algorithms/merge/handlers/list-proposals.js.map +1 -0
- package/dist/algorithms/merge/handlers/preview-merge.d.ts +39 -0
- package/dist/algorithms/merge/handlers/preview-merge.d.ts.map +1 -0
- package/dist/algorithms/merge/handlers/preview-merge.js +93 -0
- package/dist/algorithms/merge/handlers/preview-merge.js.map +1 -0
- package/dist/algorithms/merge/handlers/reject-merge.d.ts +28 -0
- package/dist/algorithms/merge/handlers/reject-merge.d.ts.map +1 -0
- package/dist/algorithms/merge/handlers/reject-merge.js +69 -0
- package/dist/algorithms/merge/handlers/reject-merge.js.map +1 -0
- package/dist/algorithms/merge/handlers/reverse-merge.d.ts +21 -0
- package/dist/algorithms/merge/handlers/reverse-merge.d.ts.map +1 -0
- package/dist/algorithms/merge/handlers/reverse-merge.js +121 -0
- package/dist/algorithms/merge/handlers/reverse-merge.js.map +1 -0
- package/dist/algorithms/merge/safety/safety-checks.d.ts +22 -0
- package/dist/algorithms/merge/safety/safety-checks.d.ts.map +1 -0
- package/dist/algorithms/merge/safety/safety-checks.js +215 -0
- package/dist/algorithms/merge/safety/safety-checks.js.map +1 -0
- package/dist/algorithms/merge/strategies/merge-strategies.d.ts +32 -0
- package/dist/algorithms/merge/strategies/merge-strategies.d.ts.map +1 -0
- package/dist/algorithms/merge/strategies/merge-strategies.js +337 -0
- package/dist/algorithms/merge/strategies/merge-strategies.js.map +1 -0
- package/dist/api/web/web.d.ts +4 -0
- package/dist/api/web/web.d.ts.map +1 -0
- package/dist/api/web/web.js +484 -0
- package/dist/api/web/web.js.map +1 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +83 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-memory.d.ts +22 -0
- package/dist/core/agent-memory.d.ts.map +1 -0
- package/dist/core/agent-memory.js +111 -0
- package/dist/core/agent-memory.js.map +1 -0
- package/dist/core/associations.d.ts +32 -0
- package/dist/core/associations.d.ts.map +1 -0
- package/dist/core/associations.js +249 -0
- package/dist/core/associations.js.map +1 -0
- package/dist/core/cache.d.ts +13 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +202 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/consolidation.d.ts +6 -0
- package/dist/core/consolidation.d.ts.map +1 -0
- package/dist/core/consolidation.js +40 -0
- package/dist/core/consolidation.js.map +1 -0
- package/dist/core/context-paging.d.ts +90 -0
- package/dist/core/context-paging.d.ts.map +1 -0
- package/dist/core/context-paging.js +348 -0
- package/dist/core/context-paging.js.map +1 -0
- package/dist/core/context.d.ts +7 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +24 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/core-memory.d.ts +73 -0
- package/dist/core/core-memory.d.ts.map +1 -0
- package/dist/core/core-memory.js +214 -0
- package/dist/core/core-memory.js.map +1 -0
- package/dist/core/database.d.ts +12 -0
- package/dist/core/database.d.ts.map +1 -0
- package/dist/core/database.js +12 -0
- package/dist/core/database.js.map +1 -0
- package/dist/core/embeddings/qmd-client.d.ts +136 -0
- package/dist/core/embeddings/qmd-client.d.ts.map +1 -0
- package/dist/core/embeddings/qmd-client.js +403 -0
- package/dist/core/embeddings/qmd-client.js.map +1 -0
- package/dist/core/embeddings/qmd-provider.d.ts +65 -0
- package/dist/core/embeddings/qmd-provider.d.ts.map +1 -0
- package/dist/core/embeddings/qmd-provider.js +133 -0
- package/dist/core/embeddings/qmd-provider.js.map +1 -0
- package/dist/core/embeddings.d.ts +19 -0
- package/dist/core/embeddings.d.ts.map +1 -0
- package/dist/core/embeddings.js +297 -0
- package/dist/core/embeddings.js.map +1 -0
- package/dist/core/governance.d.ts +21 -0
- package/dist/core/governance.d.ts.map +1 -0
- package/dist/core/governance.js +64 -0
- package/dist/core/governance.js.map +1 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +14 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/lifecycle.d.ts +19 -0
- package/dist/core/lifecycle.d.ts.map +1 -0
- package/dist/core/lifecycle.js +182 -0
- package/dist/core/lifecycle.js.map +1 -0
- package/dist/core/local-embeddings.d.ts +14 -0
- package/dist/core/local-embeddings.d.ts.map +1 -0
- package/dist/core/local-embeddings.js +94 -0
- package/dist/core/local-embeddings.js.map +1 -0
- package/dist/core/logger.d.ts +16 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +34 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/memory/bridge-discovery.d.ts +50 -0
- package/dist/core/memory/bridge-discovery.d.ts.map +1 -0
- package/dist/core/memory/bridge-discovery.js +291 -0
- package/dist/core/memory/bridge-discovery.js.map +1 -0
- package/dist/core/memory/entity-extractor.d.ts +33 -0
- package/dist/core/memory/entity-extractor.d.ts.map +1 -0
- package/dist/core/memory/entity-extractor.js +336 -0
- package/dist/core/memory/entity-extractor.js.map +1 -0
- package/dist/core/memory/entity-resolver.d.ts +23 -0
- package/dist/core/memory/entity-resolver.d.ts.map +1 -0
- package/dist/core/memory/entity-resolver.js +64 -0
- package/dist/core/memory/entity-resolver.js.map +1 -0
- package/dist/core/memory/fact-extractor.d.ts +24 -0
- package/dist/core/memory/fact-extractor.d.ts.map +1 -0
- package/dist/core/memory/fact-extractor.js +89 -0
- package/dist/core/memory/fact-extractor.js.map +1 -0
- package/dist/core/memory/hybrid-retrieval.d.ts +30 -0
- package/dist/core/memory/hybrid-retrieval.d.ts.map +1 -0
- package/dist/core/memory/hybrid-retrieval.js +63 -0
- package/dist/core/memory/hybrid-retrieval.js.map +1 -0
- package/dist/core/memory/hybrid-scorer.d.ts +51 -0
- package/dist/core/memory/hybrid-scorer.d.ts.map +1 -0
- package/dist/core/memory/hybrid-scorer.js +248 -0
- package/dist/core/memory/hybrid-scorer.js.map +1 -0
- package/dist/core/memory/index.d.ts +8 -0
- package/dist/core/memory/index.d.ts.map +1 -0
- package/dist/core/memory/index.js +10 -0
- package/dist/core/memory/index.js.map +1 -0
- package/dist/core/memory/memories.d.ts +35 -0
- package/dist/core/memory/memories.d.ts.map +1 -0
- package/dist/core/memory/memories.js +338 -0
- package/dist/core/memory/memories.js.map +1 -0
- package/dist/core/memory/memory-manager.d.ts +15 -0
- package/dist/core/memory/memory-manager.d.ts.map +1 -0
- package/dist/core/memory/memory-manager.js +46 -0
- package/dist/core/memory/memory-manager.js.map +1 -0
- package/dist/core/memory/query-processor.d.ts +21 -0
- package/dist/core/memory/query-processor.d.ts.map +1 -0
- package/dist/core/memory/query-processor.js +72 -0
- package/dist/core/memory/query-processor.js.map +1 -0
- package/dist/core/memory/serialization.d.ts +6 -0
- package/dist/core/memory/serialization.d.ts.map +1 -0
- package/dist/core/memory/serialization.js +35 -0
- package/dist/core/memory/serialization.js.map +1 -0
- package/dist/core/memory/temporal-parser.d.ts +32 -0
- package/dist/core/memory/temporal-parser.d.ts.map +1 -0
- package/dist/core/memory/temporal-parser.js +385 -0
- package/dist/core/memory/temporal-parser.js.map +1 -0
- package/dist/core/observations.d.ts +26 -0
- package/dist/core/observations.d.ts.map +1 -0
- package/dist/core/observations.js +118 -0
- package/dist/core/observations.js.map +1 -0
- package/dist/core/privacy.d.ts +23 -0
- package/dist/core/privacy.d.ts.map +1 -0
- package/dist/core/privacy.js +82 -0
- package/dist/core/privacy.js.map +1 -0
- package/dist/core/projects.d.ts +10 -0
- package/dist/core/projects.d.ts.map +1 -0
- package/dist/core/projects.js +66 -0
- package/dist/core/projects.js.map +1 -0
- package/dist/core/redis.d.ts +11 -0
- package/dist/core/redis.d.ts.map +1 -0
- package/dist/core/redis.js +69 -0
- package/dist/core/redis.js.map +1 -0
- package/dist/core/requirements.d.ts +20 -0
- package/dist/core/requirements.d.ts.map +1 -0
- package/dist/core/requirements.js +35 -0
- package/dist/core/requirements.js.map +1 -0
- package/dist/core/search/conversations.d.ts +25 -0
- package/dist/core/search/conversations.d.ts.map +1 -0
- package/dist/core/search/conversations.js +112 -0
- package/dist/core/search/conversations.js.map +1 -0
- package/dist/core/search/entities.d.ts +12 -0
- package/dist/core/search/entities.d.ts.map +1 -0
- package/dist/core/search/entities.js +34 -0
- package/dist/core/search/entities.js.map +1 -0
- package/dist/core/search/folder-context.d.ts +25 -0
- package/dist/core/search/folder-context.d.ts.map +1 -0
- package/dist/core/search/folder-context.js +119 -0
- package/dist/core/search/folder-context.js.map +1 -0
- package/dist/core/search/index.d.ts +4 -0
- package/dist/core/search/index.d.ts.map +1 -0
- package/dist/core/search/index.js +5 -0
- package/dist/core/search/index.js.map +1 -0
- package/dist/core/search/qmd-search.d.ts +61 -0
- package/dist/core/search/qmd-search.d.ts.map +1 -0
- package/dist/core/search/qmd-search.js +178 -0
- package/dist/core/search/qmd-search.js.map +1 -0
- package/dist/core/secret-detector.d.ts +32 -0
- package/dist/core/secret-detector.d.ts.map +1 -0
- package/dist/core/secret-detector.js +88 -0
- package/dist/core/secret-detector.js.map +1 -0
- package/dist/core/snapshots/cleanup.d.ts +9 -0
- package/dist/core/snapshots/cleanup.d.ts.map +1 -0
- package/dist/core/snapshots/cleanup.js +12 -0
- package/dist/core/snapshots/cleanup.js.map +1 -0
- package/dist/core/snapshots/comparison.d.ts +19 -0
- package/dist/core/snapshots/comparison.d.ts.map +1 -0
- package/dist/core/snapshots/comparison.js +37 -0
- package/dist/core/snapshots/comparison.js.map +1 -0
- package/dist/core/snapshots/creation.d.ts +19 -0
- package/dist/core/snapshots/creation.d.ts.map +1 -0
- package/dist/core/snapshots/creation.js +126 -0
- package/dist/core/snapshots/creation.js.map +1 -0
- package/dist/core/snapshots/retrieval.d.ts +7 -0
- package/dist/core/snapshots/retrieval.d.ts.map +1 -0
- package/dist/core/snapshots/retrieval.js +41 -0
- package/dist/core/snapshots/retrieval.js.map +1 -0
- package/dist/core/snapshots/stats.d.ts +11 -0
- package/dist/core/snapshots/stats.d.ts.map +1 -0
- package/dist/core/snapshots/stats.js +52 -0
- package/dist/core/snapshots/stats.js.map +1 -0
- package/dist/core/snapshots.d.ts +29 -0
- package/dist/core/snapshots.d.ts.map +1 -0
- package/dist/core/snapshots.js +220 -0
- package/dist/core/snapshots.js.map +1 -0
- package/dist/core/summarization/cleanup.d.ts +9 -0
- package/dist/core/summarization/cleanup.d.ts.map +1 -0
- package/dist/core/summarization/cleanup.js +12 -0
- package/dist/core/summarization/cleanup.js.map +1 -0
- package/dist/core/summarization/queries.d.ts +9 -0
- package/dist/core/summarization/queries.d.ts.map +1 -0
- package/dist/core/summarization/queries.js +28 -0
- package/dist/core/summarization/queries.js.map +1 -0
- package/dist/core/summarization/stats.d.ts +14 -0
- package/dist/core/summarization/stats.d.ts.map +1 -0
- package/dist/core/summarization/stats.js +52 -0
- package/dist/core/summarization/stats.js.map +1 -0
- package/dist/core/summarization/strategies.d.ts +24 -0
- package/dist/core/summarization/strategies.d.ts.map +1 -0
- package/dist/core/summarization/strategies.js +28 -0
- package/dist/core/summarization/strategies.js.map +1 -0
- package/dist/core/summarization.d.ts +37 -0
- package/dist/core/summarization.d.ts.map +1 -0
- package/dist/core/summarization.js +188 -0
- package/dist/core/summarization.js.map +1 -0
- package/dist/core/sync/qmd-sync.d.ts +106 -0
- package/dist/core/sync/qmd-sync.d.ts.map +1 -0
- package/dist/core/sync/qmd-sync.js +213 -0
- package/dist/core/sync/qmd-sync.js.map +1 -0
- package/dist/core/temporal-facts.d.ts +54 -0
- package/dist/core/temporal-facts.d.ts.map +1 -0
- package/dist/core/temporal-facts.js +193 -0
- package/dist/core/temporal-facts.js.map +1 -0
- package/dist/core/utils/cleanup-operations.d.ts +13 -0
- package/dist/core/utils/cleanup-operations.d.ts.map +1 -0
- package/dist/core/utils/cleanup-operations.js +44 -0
- package/dist/core/utils/cleanup-operations.js.map +1 -0
- package/dist/core/utils/content-extraction.d.ts +19 -0
- package/dist/core/utils/content-extraction.d.ts.map +1 -0
- package/dist/core/utils/content-extraction.js +65 -0
- package/dist/core/utils/content-extraction.js.map +1 -0
- package/dist/core/utils/filter-builder.d.ts +13 -0
- package/dist/core/utils/filter-builder.d.ts.map +1 -0
- package/dist/core/utils/filter-builder.js +44 -0
- package/dist/core/utils/filter-builder.js.map +1 -0
- package/dist/core/utils/history-traversal.d.ts +13 -0
- package/dist/core/utils/history-traversal.d.ts.map +1 -0
- package/dist/core/utils/history-traversal.js +50 -0
- package/dist/core/utils/history-traversal.js.map +1 -0
- package/dist/core/utils/memory-operations.d.ts +17 -0
- package/dist/core/utils/memory-operations.d.ts.map +1 -0
- package/dist/core/utils/memory-operations.js +41 -0
- package/dist/core/utils/memory-operations.js.map +1 -0
- package/dist/core/utils/query-operations.d.ts +18 -0
- package/dist/core/utils/query-operations.d.ts.map +1 -0
- package/dist/core/utils/query-operations.js +65 -0
- package/dist/core/utils/query-operations.js.map +1 -0
- package/dist/core/utils/summarization-helpers.d.ts +21 -0
- package/dist/core/utils/summarization-helpers.d.ts.map +1 -0
- package/dist/core/utils/summarization-helpers.js +35 -0
- package/dist/core/utils/summarization-helpers.js.map +1 -0
- package/dist/core/utils/temporal-queries.d.ts +13 -0
- package/dist/core/utils/temporal-queries.d.ts.map +1 -0
- package/dist/core/utils/temporal-queries.js +27 -0
- package/dist/core/utils/temporal-queries.js.map +1 -0
- package/dist/core/utils/version-management.d.ts +9 -0
- package/dist/core/utils/version-management.d.ts.map +1 -0
- package/dist/core/utils/version-management.js +61 -0
- package/dist/core/utils/version-management.js.map +1 -0
- package/dist/core/utils.d.ts +13 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/core/utils.js +51 -0
- package/dist/core/utils.js.map +1 -0
- package/dist/core/worker.d.ts +62 -0
- package/dist/core/worker.d.ts.map +1 -0
- package/dist/core/worker.js +186 -0
- package/dist/core/worker.js.map +1 -0
- package/dist/db/adapter.d.ts +6 -0
- package/dist/db/adapter.d.ts.map +1 -0
- package/dist/db/adapter.js +43 -0
- package/dist/db/adapter.js.map +1 -0
- package/dist/db/bootstrap.d.ts +9 -0
- package/dist/db/bootstrap.d.ts.map +1 -0
- package/dist/db/bootstrap.js +444 -0
- package/dist/db/bootstrap.js.map +1 -0
- package/dist/db/index.d.ts +11 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +43 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +3 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +11 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/drizzle/schema-sqlite.d.ts +3046 -0
- package/dist/drizzle/schema-sqlite.d.ts.map +1 -0
- package/dist/drizzle/schema-sqlite.js +405 -0
- package/dist/drizzle/schema-sqlite.js.map +1 -0
- package/dist/drizzle/schema.d.ts +2969 -0
- package/dist/drizzle/schema.d.ts.map +1 -0
- package/dist/drizzle/schema.js +555 -0
- package/dist/drizzle/schema.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +784 -0
- package/dist/index.js.map +1 -0
- package/hooks/hooks.json +52 -0
- package/hooks/post-tool-use.js +26 -0
- package/hooks/session-end.js +28 -0
- package/hooks/session-start.js +33 -0
- package/hooks/user-prompt-submit.js +26 -0
- package/hooks/utils.js +153 -0
- package/npx-installer.js +208 -0
- package/package.json +101 -0
- package/plugin.json +32 -0
- package/skills/memory-guide/SKILL.md +198 -0
- package/skills/squish-memory/SKILL.md +87 -0
- package/skills/squish-memory/install.sh +91 -0
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QMD MCP Client
|
|
3
|
+
*
|
|
4
|
+
* Connects to QMD (Quick Markdown Search) MCP server for hybrid search capabilities.
|
|
5
|
+
* QMD provides BM25 full-text search, vector semantic search, and LLM re-ranking.
|
|
6
|
+
*
|
|
7
|
+
* Installation: bun install -g qmd
|
|
8
|
+
* GitHub: https://github.com/tobi/qmd
|
|
9
|
+
*
|
|
10
|
+
* QMD MCP Tools:
|
|
11
|
+
* - qmd_search: Fast BM25 keyword search
|
|
12
|
+
* - qmd_vsearch: Semantic vector search
|
|
13
|
+
* - qmd_query: Hybrid search with re-ranking (best quality)
|
|
14
|
+
* - qmd_get: Retrieve document by path or docid
|
|
15
|
+
* - qmd_multi_get: Retrieve multiple documents
|
|
16
|
+
* - qmd_status: Index health and collection info
|
|
17
|
+
*/
|
|
18
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
19
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
20
|
+
import { spawn } from 'child_process';
|
|
21
|
+
import { logger } from '../logger.js';
|
|
22
|
+
/**
|
|
23
|
+
* QMD MCP Client class
|
|
24
|
+
*
|
|
25
|
+
* Manages connection to QMD MCP server and provides methods for
|
|
26
|
+
* search, document retrieval, and status checking.
|
|
27
|
+
*/
|
|
28
|
+
export class QMDClient {
|
|
29
|
+
client = null;
|
|
30
|
+
transport = null;
|
|
31
|
+
connected = false;
|
|
32
|
+
connecting = false;
|
|
33
|
+
/**
|
|
34
|
+
* Check if QMD is installed on the system
|
|
35
|
+
*/
|
|
36
|
+
async checkQMDInstalled() {
|
|
37
|
+
return new Promise((resolve) => {
|
|
38
|
+
const process = spawn('qmd', ['--version'], {
|
|
39
|
+
stdio: 'ignore',
|
|
40
|
+
shell: true
|
|
41
|
+
});
|
|
42
|
+
process.on('close', (code) => {
|
|
43
|
+
resolve(code === 0);
|
|
44
|
+
});
|
|
45
|
+
process.on('error', () => {
|
|
46
|
+
resolve(false);
|
|
47
|
+
});
|
|
48
|
+
// Timeout after 5 seconds
|
|
49
|
+
setTimeout(() => {
|
|
50
|
+
process.kill();
|
|
51
|
+
resolve(false);
|
|
52
|
+
}, 5000);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Connect to QMD MCP server
|
|
57
|
+
* QMD must be installed: bun install -g qmd
|
|
58
|
+
*/
|
|
59
|
+
async connect() {
|
|
60
|
+
if (this.connected || this.connecting) {
|
|
61
|
+
return this.connected;
|
|
62
|
+
}
|
|
63
|
+
this.connecting = true;
|
|
64
|
+
try {
|
|
65
|
+
// Check if QMD is installed
|
|
66
|
+
const installed = await this.checkQMDInstalled();
|
|
67
|
+
if (!installed) {
|
|
68
|
+
logger.warn('QMD is not installed. Install with: bun install -g qmd');
|
|
69
|
+
this.connecting = false;
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
this.transport = new StdioClientTransport({
|
|
73
|
+
command: 'qmd',
|
|
74
|
+
args: ['mcp'],
|
|
75
|
+
stderr: 'inherit'
|
|
76
|
+
});
|
|
77
|
+
this.client = new Client({ name: 'squish-qmd-client', version: '1.0.0' }, { capabilities: {} });
|
|
78
|
+
await this.client.connect(this.transport);
|
|
79
|
+
this.connected = true;
|
|
80
|
+
this.connecting = false;
|
|
81
|
+
logger.info('Connected to QMD MCP server');
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
logger.warn(`QMD MCP connection failed: ${error}`);
|
|
86
|
+
this.connected = false;
|
|
87
|
+
this.connecting = false;
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Check if QMD is available
|
|
93
|
+
*/
|
|
94
|
+
async isAvailable() {
|
|
95
|
+
if (this.connected && this.client) {
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
return await this.connect();
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Fast BM25 keyword search
|
|
102
|
+
* Uses SQLite FTS5 for fast full-text search
|
|
103
|
+
*/
|
|
104
|
+
async search(options) {
|
|
105
|
+
if (!this.connected || !this.client) {
|
|
106
|
+
throw new Error('QMD client not connected');
|
|
107
|
+
}
|
|
108
|
+
const result = await this.client.callTool({
|
|
109
|
+
name: 'qmd_search',
|
|
110
|
+
arguments: {
|
|
111
|
+
query: options.query,
|
|
112
|
+
collection: options.collection,
|
|
113
|
+
n: options.limit || 10,
|
|
114
|
+
minScore: options.minScore || 0
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
return this.parseSearchResults(result);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Semantic vector search
|
|
121
|
+
* Uses embedding-based similarity search
|
|
122
|
+
*/
|
|
123
|
+
async vsearch(options) {
|
|
124
|
+
if (!this.connected || !this.client) {
|
|
125
|
+
throw new Error('QMD client not connected');
|
|
126
|
+
}
|
|
127
|
+
const result = await this.client.callTool({
|
|
128
|
+
name: 'qmd_vsearch',
|
|
129
|
+
arguments: {
|
|
130
|
+
query: options.query,
|
|
131
|
+
collection: options.collection,
|
|
132
|
+
n: options.limit || 10,
|
|
133
|
+
minScore: options.minScore || 0
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
return this.parseSearchResults(result);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Hybrid search with re-ranking (best quality)
|
|
140
|
+
* Combines BM25 + vector search + LLM re-ranking
|
|
141
|
+
*/
|
|
142
|
+
async query(options) {
|
|
143
|
+
if (!this.connected || !this.client) {
|
|
144
|
+
throw new Error('QMD client not connected');
|
|
145
|
+
}
|
|
146
|
+
const result = await this.client.callTool({
|
|
147
|
+
name: 'qmd_query',
|
|
148
|
+
arguments: {
|
|
149
|
+
query: options.query,
|
|
150
|
+
collection: options.collection,
|
|
151
|
+
n: options.limit || 10,
|
|
152
|
+
minScore: options.minScore || 0
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
return this.parseSearchResults(result);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Get QMD index status and collection info
|
|
159
|
+
*/
|
|
160
|
+
async status() {
|
|
161
|
+
if (!this.connected || !this.client) {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
const result = await this.client.callTool({
|
|
166
|
+
name: 'qmd_status',
|
|
167
|
+
arguments: {}
|
|
168
|
+
});
|
|
169
|
+
return this.parseStatusResult(result);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
logger.debug(`QMD status check failed: ${error}`);
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get document by path or docid
|
|
178
|
+
*/
|
|
179
|
+
async get(options) {
|
|
180
|
+
if (!this.connected || !this.client) {
|
|
181
|
+
throw new Error('QMD client not connected');
|
|
182
|
+
}
|
|
183
|
+
const args = {
|
|
184
|
+
path: options.pathOrDocid
|
|
185
|
+
};
|
|
186
|
+
if (options.full !== undefined) {
|
|
187
|
+
args.full = options.full;
|
|
188
|
+
}
|
|
189
|
+
if (options.maxBytes !== undefined) {
|
|
190
|
+
args['max-bytes'] = options.maxBytes;
|
|
191
|
+
}
|
|
192
|
+
const result = await this.client.callTool({
|
|
193
|
+
name: 'qmd_get',
|
|
194
|
+
arguments: args
|
|
195
|
+
});
|
|
196
|
+
return this.parseGetResult(result);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get multiple documents by glob pattern or list
|
|
200
|
+
*/
|
|
201
|
+
async multiGet(patternOrList, options) {
|
|
202
|
+
if (!this.connected || !this.client) {
|
|
203
|
+
throw new Error('QMD client not connected');
|
|
204
|
+
}
|
|
205
|
+
const args = {
|
|
206
|
+
pattern: Array.isArray(patternOrList) ? patternOrList.join(',') : patternOrList
|
|
207
|
+
};
|
|
208
|
+
if (options?.maxBytes !== undefined) {
|
|
209
|
+
args['max-bytes'] = options.maxBytes;
|
|
210
|
+
}
|
|
211
|
+
if (options?.limit !== undefined) {
|
|
212
|
+
args.l = options.limit;
|
|
213
|
+
}
|
|
214
|
+
const result = await this.client.callTool({
|
|
215
|
+
name: 'qmd_multi_get',
|
|
216
|
+
arguments: args
|
|
217
|
+
});
|
|
218
|
+
return this.parseMultiGetResult(result);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Disconnect from QMD MCP server
|
|
222
|
+
*/
|
|
223
|
+
async disconnect() {
|
|
224
|
+
if (this.client) {
|
|
225
|
+
try {
|
|
226
|
+
await this.client.close();
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
logger.debug(`Error closing QMD client: ${error}`);
|
|
230
|
+
}
|
|
231
|
+
this.connected = false;
|
|
232
|
+
this.client = null;
|
|
233
|
+
this.transport = null;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Parse search results from QMD response
|
|
238
|
+
*/
|
|
239
|
+
parseSearchResults(result) {
|
|
240
|
+
if (!result || !result.content) {
|
|
241
|
+
return [];
|
|
242
|
+
}
|
|
243
|
+
const content = result.content;
|
|
244
|
+
// Handle text output format
|
|
245
|
+
if (typeof content === 'string') {
|
|
246
|
+
return this.parseTextSearchResults(content);
|
|
247
|
+
}
|
|
248
|
+
// Handle array content format
|
|
249
|
+
if (Array.isArray(content)) {
|
|
250
|
+
const textContent = content
|
|
251
|
+
.filter((item) => item.type === 'text')
|
|
252
|
+
.map((item) => item.text)
|
|
253
|
+
.join('\n');
|
|
254
|
+
return this.parseTextSearchResults(textContent);
|
|
255
|
+
}
|
|
256
|
+
return [];
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Parse QMD's text output format into structured results
|
|
260
|
+
*/
|
|
261
|
+
parseTextSearchResults(text) {
|
|
262
|
+
const results = [];
|
|
263
|
+
const lines = text.split('\n');
|
|
264
|
+
let currentResult = null;
|
|
265
|
+
for (const line of lines) {
|
|
266
|
+
// Match path line: "docs/guide.md:42 #a1b2c3"
|
|
267
|
+
const pathMatch = line.match(/^([^\s:]+):(\d+)\s+([#a-zA-Z0-9]+)?/);
|
|
268
|
+
if (pathMatch) {
|
|
269
|
+
if (currentResult && currentResult.path) {
|
|
270
|
+
results.push(this.finalizeResult(currentResult));
|
|
271
|
+
}
|
|
272
|
+
currentResult = {
|
|
273
|
+
path: pathMatch[1],
|
|
274
|
+
docid: pathMatch[3] || '',
|
|
275
|
+
score: 0,
|
|
276
|
+
snippet: ''
|
|
277
|
+
};
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
// Match score line: "Score: 93%"
|
|
281
|
+
const scoreMatch = line.match(/^Score:\s+(\d+)%/);
|
|
282
|
+
if (scoreMatch && currentResult) {
|
|
283
|
+
currentResult.score = parseInt(scoreMatch[1]) / 100;
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
// Match title line: "Title: Some Title"
|
|
287
|
+
const titleMatch = line.match(/^Title:\s+(.+)/);
|
|
288
|
+
if (titleMatch && currentResult) {
|
|
289
|
+
currentResult.title = titleMatch[1];
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
// Match context line: "Context: Some context"
|
|
293
|
+
const contextMatch = line.match(/^Context:\s+(.+)/);
|
|
294
|
+
if (contextMatch && currentResult) {
|
|
295
|
+
currentResult.context = contextMatch[1];
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
// Collect snippet content
|
|
299
|
+
if (currentResult && line.trim() && !line.startsWith('---')) {
|
|
300
|
+
currentResult.snippet += line + '\n';
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Don't forget the last result
|
|
304
|
+
if (currentResult && currentResult.path) {
|
|
305
|
+
results.push(this.finalizeResult(currentResult));
|
|
306
|
+
}
|
|
307
|
+
return results;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Finalize a parsed result with defaults
|
|
311
|
+
*/
|
|
312
|
+
finalizeResult(result) {
|
|
313
|
+
return {
|
|
314
|
+
path: result.path || '',
|
|
315
|
+
docid: result.docid || '',
|
|
316
|
+
title: result.title || result.path?.split('/').pop() || '',
|
|
317
|
+
context: result.context || '',
|
|
318
|
+
score: result.score || 0,
|
|
319
|
+
snippet: (result.snippet || '').trim()
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Parse status result
|
|
324
|
+
*/
|
|
325
|
+
parseStatusResult(result) {
|
|
326
|
+
if (!result || !result.content) {
|
|
327
|
+
return null;
|
|
328
|
+
}
|
|
329
|
+
const content = result.content;
|
|
330
|
+
if (typeof content === 'string') {
|
|
331
|
+
try {
|
|
332
|
+
return JSON.parse(content);
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
return null;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
if (Array.isArray(content)) {
|
|
339
|
+
const textContent = content
|
|
340
|
+
.filter((item) => item.type === 'text')
|
|
341
|
+
.map((item) => item.text)
|
|
342
|
+
.join('');
|
|
343
|
+
try {
|
|
344
|
+
return JSON.parse(textContent);
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
return null;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Parse get result
|
|
354
|
+
*/
|
|
355
|
+
parseGetResult(result) {
|
|
356
|
+
if (!result || !result.content) {
|
|
357
|
+
return '';
|
|
358
|
+
}
|
|
359
|
+
const content = result.content;
|
|
360
|
+
if (typeof content === 'string') {
|
|
361
|
+
return content;
|
|
362
|
+
}
|
|
363
|
+
if (Array.isArray(content)) {
|
|
364
|
+
return content
|
|
365
|
+
.filter((item) => item.type === 'text')
|
|
366
|
+
.map((item) => item.text)
|
|
367
|
+
.join('\n');
|
|
368
|
+
}
|
|
369
|
+
return '';
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Parse multi-get result
|
|
373
|
+
*/
|
|
374
|
+
parseMultiGetResult(result) {
|
|
375
|
+
const text = this.parseGetResult(result);
|
|
376
|
+
if (!text) {
|
|
377
|
+
return [];
|
|
378
|
+
}
|
|
379
|
+
// Split by document separators and return individual documents
|
|
380
|
+
return text.split(/\n---+\n/).filter(doc => doc.trim());
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
// Singleton instance
|
|
384
|
+
let qmdClientInstance = null;
|
|
385
|
+
/**
|
|
386
|
+
* Get the singleton QMD client instance
|
|
387
|
+
*/
|
|
388
|
+
export async function getQMDClient() {
|
|
389
|
+
if (!qmdClientInstance) {
|
|
390
|
+
qmdClientInstance = new QMDClient();
|
|
391
|
+
}
|
|
392
|
+
return qmdClientInstance;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Reset the singleton QMD client (useful for testing)
|
|
396
|
+
*/
|
|
397
|
+
export function resetQMDClient() {
|
|
398
|
+
if (qmdClientInstance) {
|
|
399
|
+
qmdClientInstance.disconnect().catch(() => { });
|
|
400
|
+
qmdClientInstance = null;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
//# sourceMappingURL=qmd-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qmd-client.js","sourceRoot":"","sources":["../../../core/embeddings/qmd-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAiCtC;;;;;GAKG;AACH,MAAM,OAAO,SAAS;IACZ,MAAM,GAAkB,IAAI,CAAC;IAC7B,SAAS,GAAgC,IAAI,CAAC;IAC9C,SAAS,GAAG,KAAK,CAAC;IAClB,UAAU,GAAG,KAAK,CAAC;IAE3B;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACrB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE;gBAC1C,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC3B,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACvB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;YAEH,0BAA0B;YAC1B,UAAU,CAAC,GAAG,EAAE;gBACd,OAAO,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,CAAC;YACH,4BAA4B;YAC5B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACjD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;gBACtE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;gBACxB,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,CAAC,SAAS,GAAG,IAAI,oBAAoB,CAAC;gBACxC,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,KAAK,CAAC;gBACb,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CACtB,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC/C,EAAE,YAAY,EAAE,EAAE,EAAE,CACrB,CAAC;YAEF,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,OAAyB;QACpC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACxC,IAAI,EAAE,YAAY;YAClB,SAAS,EAAE;gBACT,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,CAAC,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;gBACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC;aAChC;SACF,CAAQ,CAAC;QAEV,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,OAAyB;QACrC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACxC,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE;gBACT,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,CAAC,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;gBACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC;aAChC;SACF,CAAQ,CAAC;QAEV,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,CAAC,OAAyB;QACnC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACxC,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE;gBACT,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,CAAC,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;gBACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC;aAChC;SACF,CAAQ,CAAC;QAEV,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACxC,IAAI,EAAE,YAAY;gBAClB,SAAS,EAAE,EAAE;aACd,CAAQ,CAAC;YAEV,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,OAAsB;QAC9B,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,IAAI,GAAwB;YAChC,IAAI,EAAE,OAAO,CAAC,WAAW;SAC1B,CAAC;QAEF,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC3B,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;QACvC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACxC,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,IAAI;SAChB,CAAQ,CAAC;QAEV,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,aAAgC,EAAE,OAA+C;QAC9F,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,IAAI,GAAwB;YAChC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa;SAChF,CAAC;QAEF,IAAI,OAAO,EAAE,QAAQ,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;QACvC,CAAC;QACD,IAAI,OAAO,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QACzB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACxC,IAAI,EAAE,eAAe;YACrB,SAAS,EAAE,IAAI;SAChB,CAAQ,CAAC;QAEV,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;YACrD,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,MAAW;QACpC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAE/B,4BAA4B;QAC5B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC;QAED,8BAA8B;QAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,WAAW,GAAG,OAAO;iBACxB,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;iBAC3C,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;iBAC7B,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,OAAO,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;QAClD,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACK,sBAAsB,CAAC,IAAY;QACzC,MAAM,OAAO,GAAsB,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE/B,IAAI,aAAa,GAAoC,IAAI,CAAC;QAE1D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,8CAA8C;YAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACpE,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,aAAa,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC;oBACxC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;gBACnD,CAAC;gBACD,aAAa,GAAG;oBACd,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;oBAClB,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE;oBACzB,KAAK,EAAE,CAAC;oBACR,OAAO,EAAE,EAAE;iBACZ,CAAC;gBACF,SAAS;YACX,CAAC;YAED,iCAAiC;YACjC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAClD,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC;gBAChC,aAAa,CAAC,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;gBACpD,SAAS;YACX,CAAC;YAED,wCAAwC;YACxC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAChD,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC;gBAChC,aAAa,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBACpC,SAAS;YACX,CAAC;YAED,8CAA8C;YAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACpD,IAAI,YAAY,IAAI,aAAa,EAAE,CAAC;gBAClC,aAAa,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBACxC,SAAS;YACX,CAAC;YAED,0BAA0B;YAC1B,IAAI,aAAa,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5D,aAAa,CAAC,OAAO,IAAI,IAAI,GAAG,IAAI,CAAC;YACvC,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,IAAI,aAAa,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,MAAgC;QACrD,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE;YAC1D,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;YAC7B,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;YACxB,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;SACvC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,MAAW;QACnC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,WAAW,GAAG,OAAO;iBACxB,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;iBAC3C,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;iBAC7B,IAAI,CAAC,EAAE,CAAC,CAAC;YACZ,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,MAAW;QAChC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO;iBACX,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;iBAC3C,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;iBAC7B,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,MAAW;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,+DAA+D;QAC/D,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;CACF;AAED,qBAAqB;AACrB,IAAI,iBAAiB,GAAqB,IAAI,CAAC;AAE/C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,iBAAiB,GAAG,IAAI,SAAS,EAAE,CAAC;IACtC,CAAC;IACD,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,iBAAiB,EAAE,CAAC;QACtB,iBAAiB,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC/C,iBAAiB,GAAG,IAAI,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QMD Embedding Provider
|
|
3
|
+
*
|
|
4
|
+
* Uses QMD's local embedding model (EmbeddingGemma-300M) for generating
|
|
5
|
+
* vector embeddings. This provides a local-only option for semantic search.
|
|
6
|
+
*
|
|
7
|
+
* Note: QMD doesn't directly expose an embedding generation endpoint via MCP.
|
|
8
|
+
* This provider is a placeholder for future direct embedding integration.
|
|
9
|
+
*
|
|
10
|
+
* For now, the main value of QMD integration is through the hybrid search
|
|
11
|
+
* capabilities (qmd_search, qmd_vsearch, qmd_query) rather than direct
|
|
12
|
+
* embedding generation.
|
|
13
|
+
*
|
|
14
|
+
* Current approach:
|
|
15
|
+
* - Use QMD's search tools for hybrid retrieval
|
|
16
|
+
* - Use Squish's existing embedding providers for storage
|
|
17
|
+
* - Future: Direct embedding generation via node-llama-cpp
|
|
18
|
+
*/
|
|
19
|
+
export interface QMDEmbeddingConfig {
|
|
20
|
+
enabled: boolean;
|
|
21
|
+
fallbackToCloud: boolean;
|
|
22
|
+
minConfidence: number;
|
|
23
|
+
}
|
|
24
|
+
export declare class QMDEmbeddingProvider {
|
|
25
|
+
private config;
|
|
26
|
+
private initialized;
|
|
27
|
+
private available;
|
|
28
|
+
constructor(config: QMDEmbeddingConfig);
|
|
29
|
+
initialize(): Promise<boolean>;
|
|
30
|
+
/**
|
|
31
|
+
* Generate embedding for text
|
|
32
|
+
*
|
|
33
|
+
* Note: QMD's MCP server doesn't expose a direct embedding endpoint.
|
|
34
|
+
* The search tools (qmd_search, qmd_vsearch, qmd_query) use embeddings internally
|
|
35
|
+
* but don't return them.
|
|
36
|
+
*
|
|
37
|
+
* For direct embedding generation, we would need to:
|
|
38
|
+
* 1. Use node-llama-cpp directly with EmbeddingGemma-300M model
|
|
39
|
+
* 2. Or use QMD's internal API (not exposed via MCP)
|
|
40
|
+
*
|
|
41
|
+
* For now, this returns null to trigger fallback to other providers.
|
|
42
|
+
*
|
|
43
|
+
* @param text - Text to embed
|
|
44
|
+
* @returns Embedding vector or null (triggers fallback)
|
|
45
|
+
*/
|
|
46
|
+
embed(text: string): Promise<number[] | null>;
|
|
47
|
+
/**
|
|
48
|
+
* Check if QMD is available
|
|
49
|
+
*/
|
|
50
|
+
isAvailable(): Promise<boolean>;
|
|
51
|
+
/**
|
|
52
|
+
* Get embedding dimensions
|
|
53
|
+
* QMD uses 768-dim embeddings (EmbeddingGemma-300M)
|
|
54
|
+
*/
|
|
55
|
+
getDimensions(): number;
|
|
56
|
+
/**
|
|
57
|
+
* Reset the provider state
|
|
58
|
+
*/
|
|
59
|
+
reset(): void;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Create a QMD embedding provider with default config
|
|
63
|
+
*/
|
|
64
|
+
export declare function createQMDEmbeddingProvider(config?: Partial<QMDEmbeddingConfig>): QMDEmbeddingProvider;
|
|
65
|
+
//# sourceMappingURL=qmd-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qmd-provider.d.ts","sourceRoot":"","sources":["../../../core/embeddings/qmd-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,kBAAkB;IAIhC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IA8BpC;;;;;;;;;;;;;;;OAeG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IA2BnD;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAOrC;;;OAGG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,KAAK,IAAI,IAAI;CAId;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,oBAAoB,CAOrG"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QMD Embedding Provider
|
|
3
|
+
*
|
|
4
|
+
* Uses QMD's local embedding model (EmbeddingGemma-300M) for generating
|
|
5
|
+
* vector embeddings. This provides a local-only option for semantic search.
|
|
6
|
+
*
|
|
7
|
+
* Note: QMD doesn't directly expose an embedding generation endpoint via MCP.
|
|
8
|
+
* This provider is a placeholder for future direct embedding integration.
|
|
9
|
+
*
|
|
10
|
+
* For now, the main value of QMD integration is through the hybrid search
|
|
11
|
+
* capabilities (qmd_search, qmd_vsearch, qmd_query) rather than direct
|
|
12
|
+
* embedding generation.
|
|
13
|
+
*
|
|
14
|
+
* Current approach:
|
|
15
|
+
* - Use QMD's search tools for hybrid retrieval
|
|
16
|
+
* - Use Squish's existing embedding providers for storage
|
|
17
|
+
* - Future: Direct embedding generation via node-llama-cpp
|
|
18
|
+
*/
|
|
19
|
+
import { getQMDClient } from './qmd-client.js';
|
|
20
|
+
import { logger } from '../logger.js';
|
|
21
|
+
export class QMDEmbeddingProvider {
|
|
22
|
+
config;
|
|
23
|
+
initialized = false;
|
|
24
|
+
available = false;
|
|
25
|
+
constructor(config) {
|
|
26
|
+
this.config = config;
|
|
27
|
+
}
|
|
28
|
+
async initialize() {
|
|
29
|
+
if (this.initialized) {
|
|
30
|
+
return this.available;
|
|
31
|
+
}
|
|
32
|
+
this.initialized = true;
|
|
33
|
+
try {
|
|
34
|
+
const client = await getQMDClient();
|
|
35
|
+
this.available = await client.isAvailable();
|
|
36
|
+
if (this.available) {
|
|
37
|
+
logger.info('QMD embedding provider initialized');
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
else if (this.config.fallbackToCloud) {
|
|
41
|
+
logger.warn('QMD unavailable, will fallback to cloud providers');
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
logger.error('QMD unavailable and fallback disabled');
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
logger.error(`QMD initialization failed: ${error}`);
|
|
51
|
+
if (!this.config.fallbackToCloud) {
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Generate embedding for text
|
|
59
|
+
*
|
|
60
|
+
* Note: QMD's MCP server doesn't expose a direct embedding endpoint.
|
|
61
|
+
* The search tools (qmd_search, qmd_vsearch, qmd_query) use embeddings internally
|
|
62
|
+
* but don't return them.
|
|
63
|
+
*
|
|
64
|
+
* For direct embedding generation, we would need to:
|
|
65
|
+
* 1. Use node-llama-cpp directly with EmbeddingGemma-300M model
|
|
66
|
+
* 2. Or use QMD's internal API (not exposed via MCP)
|
|
67
|
+
*
|
|
68
|
+
* For now, this returns null to trigger fallback to other providers.
|
|
69
|
+
*
|
|
70
|
+
* @param text - Text to embed
|
|
71
|
+
* @returns Embedding vector or null (triggers fallback)
|
|
72
|
+
*/
|
|
73
|
+
async embed(text) {
|
|
74
|
+
if (!this.available) {
|
|
75
|
+
await this.initialize();
|
|
76
|
+
}
|
|
77
|
+
if (!this.available) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
// QMD doesn't expose direct embedding generation via MCP
|
|
82
|
+
// The search tools use embeddings but don't return them
|
|
83
|
+
//
|
|
84
|
+
// Future implementation options:
|
|
85
|
+
// 1. Add node-llama-cpp as dependency and call EmbeddingGemma directly
|
|
86
|
+
// 2. Use QMD's HTTP API if available
|
|
87
|
+
// 3. Store embeddings returned from search results
|
|
88
|
+
//
|
|
89
|
+
// For now, return null to use fallback providers
|
|
90
|
+
logger.debug('QMD direct embedding not available, using fallback');
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
logger.warn(`QMD embedding failed: ${error}`);
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Check if QMD is available
|
|
100
|
+
*/
|
|
101
|
+
async isAvailable() {
|
|
102
|
+
if (!this.initialized) {
|
|
103
|
+
await this.initialize();
|
|
104
|
+
}
|
|
105
|
+
return this.available;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get embedding dimensions
|
|
109
|
+
* QMD uses 768-dim embeddings (EmbeddingGemma-300M)
|
|
110
|
+
*/
|
|
111
|
+
getDimensions() {
|
|
112
|
+
return 768;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Reset the provider state
|
|
116
|
+
*/
|
|
117
|
+
reset() {
|
|
118
|
+
this.initialized = false;
|
|
119
|
+
this.available = false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Create a QMD embedding provider with default config
|
|
124
|
+
*/
|
|
125
|
+
export function createQMDEmbeddingProvider(config) {
|
|
126
|
+
return new QMDEmbeddingProvider({
|
|
127
|
+
enabled: true,
|
|
128
|
+
fallbackToCloud: true,
|
|
129
|
+
minConfidence: 0.5,
|
|
130
|
+
...config
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=qmd-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qmd-provider.js","sourceRoot":"","sources":["../../../core/embeddings/qmd-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type EmbeddingProvider = 'openai' | 'ollama' | 'local' | 'none' | 'auto' | 'qmd' | 'hybrid';
|
|
2
|
+
export declare function getEmbedding(input: string): Promise<number[] | null>;
|
|
3
|
+
/**
|
|
4
|
+
* Get embeddings for multiple inputs in parallel batches
|
|
5
|
+
* Processes inputs in batches to respect rate limits while parallelizing
|
|
6
|
+
*/
|
|
7
|
+
export declare function getBatchEmbeddings(inputs: string[], batchSize?: number): Promise<Array<number[] | null>>;
|
|
8
|
+
/**
|
|
9
|
+
* Clear the embedding cache
|
|
10
|
+
*/
|
|
11
|
+
export declare function clearEmbeddingCache(): void;
|
|
12
|
+
/**
|
|
13
|
+
* Get embedding cache statistics
|
|
14
|
+
*/
|
|
15
|
+
export declare function getEmbeddingCacheStats(): {
|
|
16
|
+
size: number;
|
|
17
|
+
maxSize: number;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=embeddings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../core/embeddings.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;AAiCnG,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CA6D1E;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,GAAE,MAAW,GACrB,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAuCjC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAK1E"}
|