ocr-provenance-mcp 1.0.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.
Potentially problematic release.
This version of ocr-provenance-mcp might be problematic. Click here for more details.
- package/.env.example +55 -0
- package/LICENSE +78 -0
- package/README.md +1154 -0
- package/dist/bin-http.d.ts +24 -0
- package/dist/bin-http.d.ts.map +1 -0
- package/dist/bin-http.js +275 -0
- package/dist/bin-http.js.map +1 -0
- package/dist/bin-setup.d.ts +11 -0
- package/dist/bin-setup.d.ts.map +1 -0
- package/dist/bin-setup.js +610 -0
- package/dist/bin-setup.js.map +1 -0
- package/dist/bin.d.ts +16 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +16 -0
- package/dist/bin.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +90 -0
- package/dist/index.js.map +1 -0
- package/dist/models/chunk.d.ts +136 -0
- package/dist/models/chunk.d.ts.map +1 -0
- package/dist/models/chunk.js +27 -0
- package/dist/models/chunk.js.map +1 -0
- package/dist/models/cluster.d.ts +79 -0
- package/dist/models/cluster.d.ts.map +1 -0
- package/dist/models/cluster.js +10 -0
- package/dist/models/cluster.js.map +1 -0
- package/dist/models/comparison.d.ts +62 -0
- package/dist/models/comparison.d.ts.map +1 -0
- package/dist/models/comparison.js +8 -0
- package/dist/models/comparison.js.map +1 -0
- package/dist/models/document.d.ts +104 -0
- package/dist/models/document.d.ts.map +1 -0
- package/dist/models/document.js +15 -0
- package/dist/models/document.js.map +1 -0
- package/dist/models/embedding.d.ts +87 -0
- package/dist/models/embedding.d.ts.map +1 -0
- package/dist/models/embedding.js +23 -0
- package/dist/models/embedding.js.map +1 -0
- package/dist/models/extraction.d.ts +15 -0
- package/dist/models/extraction.d.ts.map +1 -0
- package/dist/models/extraction.js +2 -0
- package/dist/models/extraction.js.map +1 -0
- package/dist/models/form-fill.d.ts +23 -0
- package/dist/models/form-fill.d.ts.map +1 -0
- package/dist/models/form-fill.js +2 -0
- package/dist/models/form-fill.js.map +1 -0
- package/dist/models/image.d.ts +177 -0
- package/dist/models/image.d.ts.map +1 -0
- package/dist/models/image.js +8 -0
- package/dist/models/image.js.map +1 -0
- package/dist/models/index.d.ts +14 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +22 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/provenance.d.ts +174 -0
- package/dist/models/provenance.d.ts.map +1 -0
- package/dist/models/provenance.js +53 -0
- package/dist/models/provenance.js.map +1 -0
- package/dist/models/uploaded-file.d.ts +20 -0
- package/dist/models/uploaded-file.d.ts.map +1 -0
- package/dist/models/uploaded-file.js +2 -0
- package/dist/models/uploaded-file.js.map +1 -0
- package/dist/server/errors.d.ts +93 -0
- package/dist/server/errors.d.ts.map +1 -0
- package/dist/server/errors.js +256 -0
- package/dist/server/errors.js.map +1 -0
- package/dist/server/events.d.ts +36 -0
- package/dist/server/events.d.ts.map +1 -0
- package/dist/server/events.js +48 -0
- package/dist/server/events.js.map +1 -0
- package/dist/server/permissions.d.ts +26 -0
- package/dist/server/permissions.d.ts.map +1 -0
- package/dist/server/permissions.js +194 -0
- package/dist/server/permissions.js.map +1 -0
- package/dist/server/register-tools.d.ts +25 -0
- package/dist/server/register-tools.d.ts.map +1 -0
- package/dist/server/register-tools.js +102 -0
- package/dist/server/register-tools.js.map +1 -0
- package/dist/server/startup.d.ts +16 -0
- package/dist/server/startup.d.ts.map +1 -0
- package/dist/server/startup.js +37 -0
- package/dist/server/startup.js.map +1 -0
- package/dist/server/state.d.ts +166 -0
- package/dist/server/state.d.ts.map +1 -0
- package/dist/server/state.js +424 -0
- package/dist/server/state.js.map +1 -0
- package/dist/server/transports/http-transport.d.ts +37 -0
- package/dist/server/transports/http-transport.d.ts.map +1 -0
- package/dist/server/transports/http-transport.js +204 -0
- package/dist/server/transports/http-transport.js.map +1 -0
- package/dist/server/transports/index.d.ts +9 -0
- package/dist/server/transports/index.d.ts.map +1 -0
- package/dist/server/transports/index.js +9 -0
- package/dist/server/transports/index.js.map +1 -0
- package/dist/server/transports/session-manager.d.ts +40 -0
- package/dist/server/transports/session-manager.d.ts.map +1 -0
- package/dist/server/transports/session-manager.js +74 -0
- package/dist/server/transports/session-manager.js.map +1 -0
- package/dist/server/types.d.ts +82 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +14 -0
- package/dist/server/types.js.map +1 -0
- package/dist/services/audit.d.ts +26 -0
- package/dist/services/audit.d.ts.map +1 -0
- package/dist/services/audit.js +43 -0
- package/dist/services/audit.js.map +1 -0
- package/dist/services/chunking/chunk-deduplicator.d.ts +33 -0
- package/dist/services/chunking/chunk-deduplicator.d.ts.map +1 -0
- package/dist/services/chunking/chunk-deduplicator.js +46 -0
- package/dist/services/chunking/chunk-deduplicator.js.map +1 -0
- package/dist/services/chunking/chunk-merger.d.ts +26 -0
- package/dist/services/chunking/chunk-merger.d.ts.map +1 -0
- package/dist/services/chunking/chunk-merger.js +94 -0
- package/dist/services/chunking/chunk-merger.js.map +1 -0
- package/dist/services/chunking/chunker.d.ts +62 -0
- package/dist/services/chunking/chunker.d.ts.map +1 -0
- package/dist/services/chunking/chunker.js +566 -0
- package/dist/services/chunking/chunker.js.map +1 -0
- package/dist/services/chunking/heading-normalizer.d.ts +33 -0
- package/dist/services/chunking/heading-normalizer.d.ts.map +1 -0
- package/dist/services/chunking/heading-normalizer.js +101 -0
- package/dist/services/chunking/heading-normalizer.js.map +1 -0
- package/dist/services/chunking/json-block-analyzer.d.ts +163 -0
- package/dist/services/chunking/json-block-analyzer.d.ts.map +1 -0
- package/dist/services/chunking/json-block-analyzer.js +1033 -0
- package/dist/services/chunking/json-block-analyzer.js.map +1 -0
- package/dist/services/chunking/markdown-parser.d.ts +75 -0
- package/dist/services/chunking/markdown-parser.d.ts.map +1 -0
- package/dist/services/chunking/markdown-parser.js +428 -0
- package/dist/services/chunking/markdown-parser.js.map +1 -0
- package/dist/services/chunking/text-normalizer.d.ts +20 -0
- package/dist/services/chunking/text-normalizer.d.ts.map +1 -0
- package/dist/services/chunking/text-normalizer.js +36 -0
- package/dist/services/chunking/text-normalizer.js.map +1 -0
- package/dist/services/clm/contract-schemas.d.ts +36 -0
- package/dist/services/clm/contract-schemas.d.ts.map +1 -0
- package/dist/services/clm/contract-schemas.js +92 -0
- package/dist/services/clm/contract-schemas.js.map +1 -0
- package/dist/services/clm/summarization.d.ts +46 -0
- package/dist/services/clm/summarization.d.ts.map +1 -0
- package/dist/services/clm/summarization.js +61 -0
- package/dist/services/clm/summarization.js.map +1 -0
- package/dist/services/clustering/clustering-service.d.ts +58 -0
- package/dist/services/clustering/clustering-service.d.ts.map +1 -0
- package/dist/services/clustering/clustering-service.js +467 -0
- package/dist/services/clustering/clustering-service.js.map +1 -0
- package/dist/services/comparison/diff-service.d.ts +41 -0
- package/dist/services/comparison/diff-service.d.ts.map +1 -0
- package/dist/services/comparison/diff-service.js +120 -0
- package/dist/services/comparison/diff-service.js.map +1 -0
- package/dist/services/embedding/embedder.d.ts +55 -0
- package/dist/services/embedding/embedder.d.ts.map +1 -0
- package/dist/services/embedding/embedder.js +202 -0
- package/dist/services/embedding/embedder.js.map +1 -0
- package/dist/services/embedding/nomic.d.ts +67 -0
- package/dist/services/embedding/nomic.d.ts.map +1 -0
- package/dist/services/embedding/nomic.js +280 -0
- package/dist/services/embedding/nomic.js.map +1 -0
- package/dist/services/gemini/circuit-breaker.d.ts +106 -0
- package/dist/services/gemini/circuit-breaker.d.ts.map +1 -0
- package/dist/services/gemini/circuit-breaker.js +237 -0
- package/dist/services/gemini/circuit-breaker.js.map +1 -0
- package/dist/services/gemini/client.d.ts +173 -0
- package/dist/services/gemini/client.d.ts.map +1 -0
- package/dist/services/gemini/client.js +483 -0
- package/dist/services/gemini/client.js.map +1 -0
- package/dist/services/gemini/config.d.ts +116 -0
- package/dist/services/gemini/config.d.ts.map +1 -0
- package/dist/services/gemini/config.js +118 -0
- package/dist/services/gemini/config.js.map +1 -0
- package/dist/services/gemini/index.d.ts +9 -0
- package/dist/services/gemini/index.d.ts.map +1 -0
- package/dist/services/gemini/index.js +13 -0
- package/dist/services/gemini/index.js.map +1 -0
- package/dist/services/gemini/rate-limiter.d.ts +62 -0
- package/dist/services/gemini/rate-limiter.d.ts.map +1 -0
- package/dist/services/gemini/rate-limiter.js +120 -0
- package/dist/services/gemini/rate-limiter.js.map +1 -0
- package/dist/services/images/extractor.d.ts +88 -0
- package/dist/services/images/extractor.d.ts.map +1 -0
- package/dist/services/images/extractor.js +340 -0
- package/dist/services/images/extractor.js.map +1 -0
- package/dist/services/images/optimizer.d.ts +130 -0
- package/dist/services/images/optimizer.d.ts.map +1 -0
- package/dist/services/images/optimizer.js +228 -0
- package/dist/services/images/optimizer.js.map +1 -0
- package/dist/services/ocr/datalab.d.ts +64 -0
- package/dist/services/ocr/datalab.d.ts.map +1 -0
- package/dist/services/ocr/datalab.js +425 -0
- package/dist/services/ocr/datalab.js.map +1 -0
- package/dist/services/ocr/errors.d.ts +38 -0
- package/dist/services/ocr/errors.d.ts.map +1 -0
- package/dist/services/ocr/errors.js +83 -0
- package/dist/services/ocr/errors.js.map +1 -0
- package/dist/services/ocr/file-manager.d.ts +76 -0
- package/dist/services/ocr/file-manager.d.ts.map +1 -0
- package/dist/services/ocr/file-manager.js +238 -0
- package/dist/services/ocr/file-manager.js.map +1 -0
- package/dist/services/ocr/form-fill.d.ts +48 -0
- package/dist/services/ocr/form-fill.d.ts.map +1 -0
- package/dist/services/ocr/form-fill.js +213 -0
- package/dist/services/ocr/form-fill.js.map +1 -0
- package/dist/services/ocr/processor.d.ts +95 -0
- package/dist/services/ocr/processor.d.ts.map +1 -0
- package/dist/services/ocr/processor.js +259 -0
- package/dist/services/ocr/processor.js.map +1 -0
- package/dist/services/provenance/agent-metadata.d.ts +82 -0
- package/dist/services/provenance/agent-metadata.d.ts.map +1 -0
- package/dist/services/provenance/agent-metadata.js +106 -0
- package/dist/services/provenance/agent-metadata.js.map +1 -0
- package/dist/services/provenance/chain-hash.d.ts +57 -0
- package/dist/services/provenance/chain-hash.d.ts.map +1 -0
- package/dist/services/provenance/chain-hash.js +131 -0
- package/dist/services/provenance/chain-hash.js.map +1 -0
- package/dist/services/provenance/exporter.d.ts +202 -0
- package/dist/services/provenance/exporter.d.ts.map +1 -0
- package/dist/services/provenance/exporter.js +457 -0
- package/dist/services/provenance/exporter.js.map +1 -0
- package/dist/services/provenance/index.d.ts +15 -0
- package/dist/services/provenance/index.d.ts.map +1 -0
- package/dist/services/provenance/index.js +17 -0
- package/dist/services/provenance/index.js.map +1 -0
- package/dist/services/provenance/tracker.d.ts +138 -0
- package/dist/services/provenance/tracker.d.ts.map +1 -0
- package/dist/services/provenance/tracker.js +293 -0
- package/dist/services/provenance/tracker.js.map +1 -0
- package/dist/services/provenance/verifier.d.ts +153 -0
- package/dist/services/provenance/verifier.d.ts.map +1 -0
- package/dist/services/provenance/verifier.js +536 -0
- package/dist/services/provenance/verifier.js.map +1 -0
- package/dist/services/python-pool.d.ts +70 -0
- package/dist/services/python-pool.d.ts.map +1 -0
- package/dist/services/python-pool.js +265 -0
- package/dist/services/python-pool.js.map +1 -0
- package/dist/services/search/bm25.d.ts +180 -0
- package/dist/services/search/bm25.d.ts.map +1 -0
- package/dist/services/search/bm25.js +656 -0
- package/dist/services/search/bm25.js.map +1 -0
- package/dist/services/search/fusion.d.ts +103 -0
- package/dist/services/search/fusion.d.ts.map +1 -0
- package/dist/services/search/fusion.js +122 -0
- package/dist/services/search/fusion.js.map +1 -0
- package/dist/services/search/local-reranker.d.ts +30 -0
- package/dist/services/search/local-reranker.d.ts.map +1 -0
- package/dist/services/search/local-reranker.js +123 -0
- package/dist/services/search/local-reranker.js.map +1 -0
- package/dist/services/search/quality.d.ts +11 -0
- package/dist/services/search/quality.d.ts.map +1 -0
- package/dist/services/search/quality.js +17 -0
- package/dist/services/search/quality.js.map +1 -0
- package/dist/services/search/query-classifier.d.ts +34 -0
- package/dist/services/search/query-classifier.d.ts.map +1 -0
- package/dist/services/search/query-classifier.js +114 -0
- package/dist/services/search/query-classifier.js.map +1 -0
- package/dist/services/search/query-expander.d.ts +73 -0
- package/dist/services/search/query-expander.d.ts.map +1 -0
- package/dist/services/search/query-expander.js +281 -0
- package/dist/services/search/query-expander.js.map +1 -0
- package/dist/services/search/reranker.d.ts +44 -0
- package/dist/services/search/reranker.d.ts.map +1 -0
- package/dist/services/search/reranker.js +101 -0
- package/dist/services/search/reranker.js.map +1 -0
- package/dist/services/storage/database/annotation-operations.d.ts +113 -0
- package/dist/services/storage/database/annotation-operations.d.ts.map +1 -0
- package/dist/services/storage/database/annotation-operations.js +177 -0
- package/dist/services/storage/database/annotation-operations.js.map +1 -0
- package/dist/services/storage/database/approval-operations.d.ts +132 -0
- package/dist/services/storage/database/approval-operations.d.ts.map +1 -0
- package/dist/services/storage/database/approval-operations.js +206 -0
- package/dist/services/storage/database/approval-operations.js.map +1 -0
- package/dist/services/storage/database/chunk-operations.d.ts +132 -0
- package/dist/services/storage/database/chunk-operations.d.ts.map +1 -0
- package/dist/services/storage/database/chunk-operations.js +306 -0
- package/dist/services/storage/database/chunk-operations.js.map +1 -0
- package/dist/services/storage/database/cluster-operations.d.ts +97 -0
- package/dist/services/storage/database/cluster-operations.d.ts.map +1 -0
- package/dist/services/storage/database/cluster-operations.js +258 -0
- package/dist/services/storage/database/cluster-operations.js.map +1 -0
- package/dist/services/storage/database/comparison-operations.d.ts +41 -0
- package/dist/services/storage/database/comparison-operations.d.ts.map +1 -0
- package/dist/services/storage/database/comparison-operations.js +65 -0
- package/dist/services/storage/database/comparison-operations.js.map +1 -0
- package/dist/services/storage/database/converters.d.ts +36 -0
- package/dist/services/storage/database/converters.d.ts.map +1 -0
- package/dist/services/storage/database/converters.js +244 -0
- package/dist/services/storage/database/converters.js.map +1 -0
- package/dist/services/storage/database/document-operations.d.ts +145 -0
- package/dist/services/storage/database/document-operations.d.ts.map +1 -0
- package/dist/services/storage/database/document-operations.js +498 -0
- package/dist/services/storage/database/document-operations.js.map +1 -0
- package/dist/services/storage/database/embedding-operations.d.ts +130 -0
- package/dist/services/storage/database/embedding-operations.d.ts.map +1 -0
- package/dist/services/storage/database/embedding-operations.js +315 -0
- package/dist/services/storage/database/embedding-operations.js.map +1 -0
- package/dist/services/storage/database/extraction-operations.d.ts +47 -0
- package/dist/services/storage/database/extraction-operations.d.ts.map +1 -0
- package/dist/services/storage/database/extraction-operations.js +85 -0
- package/dist/services/storage/database/extraction-operations.js.map +1 -0
- package/dist/services/storage/database/form-fill-operations.d.ts +58 -0
- package/dist/services/storage/database/form-fill-operations.d.ts.map +1 -0
- package/dist/services/storage/database/form-fill-operations.js +116 -0
- package/dist/services/storage/database/form-fill-operations.js.map +1 -0
- package/dist/services/storage/database/helpers.d.ts +29 -0
- package/dist/services/storage/database/helpers.d.ts.map +1 -0
- package/dist/services/storage/database/helpers.js +55 -0
- package/dist/services/storage/database/helpers.js.map +1 -0
- package/dist/services/storage/database/image-operations.d.ts +202 -0
- package/dist/services/storage/database/image-operations.d.ts.map +1 -0
- package/dist/services/storage/database/image-operations.js +484 -0
- package/dist/services/storage/database/image-operations.js.map +1 -0
- package/dist/services/storage/database/index.d.ts +13 -0
- package/dist/services/storage/database/index.d.ts.map +1 -0
- package/dist/services/storage/database/index.js +16 -0
- package/dist/services/storage/database/index.js.map +1 -0
- package/dist/services/storage/database/lock-operations.d.ts +59 -0
- package/dist/services/storage/database/lock-operations.d.ts.map +1 -0
- package/dist/services/storage/database/lock-operations.js +89 -0
- package/dist/services/storage/database/lock-operations.js.map +1 -0
- package/dist/services/storage/database/obligation-operations.d.ts +88 -0
- package/dist/services/storage/database/obligation-operations.d.ts.map +1 -0
- package/dist/services/storage/database/obligation-operations.js +206 -0
- package/dist/services/storage/database/obligation-operations.js.map +1 -0
- package/dist/services/storage/database/ocr-operations.d.ts +33 -0
- package/dist/services/storage/database/ocr-operations.d.ts.map +1 -0
- package/dist/services/storage/database/ocr-operations.js +70 -0
- package/dist/services/storage/database/ocr-operations.js.map +1 -0
- package/dist/services/storage/database/playbook-operations.d.ts +72 -0
- package/dist/services/storage/database/playbook-operations.d.ts.map +1 -0
- package/dist/services/storage/database/playbook-operations.js +247 -0
- package/dist/services/storage/database/playbook-operations.js.map +1 -0
- package/dist/services/storage/database/provenance-operations.d.ts +112 -0
- package/dist/services/storage/database/provenance-operations.d.ts.map +1 -0
- package/dist/services/storage/database/provenance-operations.js +251 -0
- package/dist/services/storage/database/provenance-operations.js.map +1 -0
- package/dist/services/storage/database/service.d.ts +142 -0
- package/dist/services/storage/database/service.d.ts.map +1 -0
- package/dist/services/storage/database/service.js +310 -0
- package/dist/services/storage/database/service.js.map +1 -0
- package/dist/services/storage/database/static-operations.d.ts +30 -0
- package/dist/services/storage/database/static-operations.d.ts.map +1 -0
- package/dist/services/storage/database/static-operations.js +218 -0
- package/dist/services/storage/database/static-operations.js.map +1 -0
- package/dist/services/storage/database/stats-operations.d.ts +101 -0
- package/dist/services/storage/database/stats-operations.d.ts.map +1 -0
- package/dist/services/storage/database/stats-operations.js +394 -0
- package/dist/services/storage/database/stats-operations.js.map +1 -0
- package/dist/services/storage/database/tag-operations.d.ts +76 -0
- package/dist/services/storage/database/tag-operations.d.ts.map +1 -0
- package/dist/services/storage/database/tag-operations.js +178 -0
- package/dist/services/storage/database/tag-operations.js.map +1 -0
- package/dist/services/storage/database/types.d.ts +286 -0
- package/dist/services/storage/database/types.d.ts.map +1 -0
- package/dist/services/storage/database/types.js +39 -0
- package/dist/services/storage/database/types.js.map +1 -0
- package/dist/services/storage/database/upload-operations.d.ts +71 -0
- package/dist/services/storage/database/upload-operations.d.ts.map +1 -0
- package/dist/services/storage/database/upload-operations.js +124 -0
- package/dist/services/storage/database/upload-operations.js.map +1 -0
- package/dist/services/storage/database/user-operations.d.ts +102 -0
- package/dist/services/storage/database/user-operations.d.ts.map +1 -0
- package/dist/services/storage/database/user-operations.js +151 -0
- package/dist/services/storage/database/user-operations.js.map +1 -0
- package/dist/services/storage/database/workflow-operations.d.ts +98 -0
- package/dist/services/storage/database/workflow-operations.d.ts.map +1 -0
- package/dist/services/storage/database/workflow-operations.js +157 -0
- package/dist/services/storage/database/workflow-operations.js.map +1 -0
- package/dist/services/storage/database.d.ts +16 -0
- package/dist/services/storage/database.d.ts.map +1 -0
- package/dist/services/storage/database.js +15 -0
- package/dist/services/storage/database.js.map +1 -0
- package/dist/services/storage/index.d.ts +10 -0
- package/dist/services/storage/index.d.ts.map +1 -0
- package/dist/services/storage/index.js +10 -0
- package/dist/services/storage/index.js.map +1 -0
- package/dist/services/storage/migrations/index.d.ts +16 -0
- package/dist/services/storage/migrations/index.d.ts.map +1 -0
- package/dist/services/storage/migrations/index.js +20 -0
- package/dist/services/storage/migrations/index.js.map +1 -0
- package/dist/services/storage/migrations/operations.d.ts +40 -0
- package/dist/services/storage/migrations/operations.d.ts.map +1 -0
- package/dist/services/storage/migrations/operations.js +2910 -0
- package/dist/services/storage/migrations/operations.js.map +1 -0
- package/dist/services/storage/migrations/schema-definitions.d.ts +306 -0
- package/dist/services/storage/migrations/schema-definitions.d.ts.map +1 -0
- package/dist/services/storage/migrations/schema-definitions.js +1006 -0
- package/dist/services/storage/migrations/schema-definitions.js.map +1 -0
- package/dist/services/storage/migrations/schema-helpers.d.ts +50 -0
- package/dist/services/storage/migrations/schema-helpers.d.ts.map +1 -0
- package/dist/services/storage/migrations/schema-helpers.js +176 -0
- package/dist/services/storage/migrations/schema-helpers.js.map +1 -0
- package/dist/services/storage/migrations/types.d.ts +15 -0
- package/dist/services/storage/migrations/types.d.ts.map +1 -0
- package/dist/services/storage/migrations/types.js +21 -0
- package/dist/services/storage/migrations/types.js.map +1 -0
- package/dist/services/storage/migrations/verification.d.ts +20 -0
- package/dist/services/storage/migrations/verification.d.ts.map +1 -0
- package/dist/services/storage/migrations/verification.js +78 -0
- package/dist/services/storage/migrations/verification.js.map +1 -0
- package/dist/services/storage/migrations.d.ts +16 -0
- package/dist/services/storage/migrations.d.ts.map +1 -0
- package/dist/services/storage/migrations.js +17 -0
- package/dist/services/storage/migrations.js.map +1 -0
- package/dist/services/storage/types.d.ts +12 -0
- package/dist/services/storage/types.d.ts.map +1 -0
- package/dist/services/storage/types.js +5 -0
- package/dist/services/storage/types.js.map +1 -0
- package/dist/services/storage/vector.d.ts +208 -0
- package/dist/services/storage/vector.d.ts.map +1 -0
- package/dist/services/storage/vector.js +526 -0
- package/dist/services/storage/vector.js.map +1 -0
- package/dist/services/vlm/pipeline.d.ts +194 -0
- package/dist/services/vlm/pipeline.d.ts.map +1 -0
- package/dist/services/vlm/pipeline.js +800 -0
- package/dist/services/vlm/pipeline.js.map +1 -0
- package/dist/services/vlm/prompts.d.ts +171 -0
- package/dist/services/vlm/prompts.d.ts.map +1 -0
- package/dist/services/vlm/prompts.js +229 -0
- package/dist/services/vlm/prompts.js.map +1 -0
- package/dist/services/vlm/service.d.ts +174 -0
- package/dist/services/vlm/service.d.ts.map +1 -0
- package/dist/services/vlm/service.js +256 -0
- package/dist/services/vlm/service.js.map +1 -0
- package/dist/services/webhook-delivery.d.ts +4 -0
- package/dist/services/webhook-delivery.d.ts.map +1 -0
- package/dist/services/webhook-delivery.js +140 -0
- package/dist/services/webhook-delivery.js.map +1 -0
- package/dist/tools/chunks.d.ts +19 -0
- package/dist/tools/chunks.d.ts.map +1 -0
- package/dist/tools/chunks.js +392 -0
- package/dist/tools/chunks.js.map +1 -0
- package/dist/tools/clm.d.ts +16 -0
- package/dist/tools/clm.d.ts.map +1 -0
- package/dist/tools/clm.js +668 -0
- package/dist/tools/clm.js.map +1 -0
- package/dist/tools/clustering.d.ts +13 -0
- package/dist/tools/clustering.d.ts.map +1 -0
- package/dist/tools/clustering.js +498 -0
- package/dist/tools/clustering.js.map +1 -0
- package/dist/tools/collaboration.d.ts +15 -0
- package/dist/tools/collaboration.d.ts.map +1 -0
- package/dist/tools/collaboration.js +516 -0
- package/dist/tools/collaboration.js.map +1 -0
- package/dist/tools/comparison.d.ts +13 -0
- package/dist/tools/comparison.d.ts.map +1 -0
- package/dist/tools/comparison.js +735 -0
- package/dist/tools/comparison.js.map +1 -0
- package/dist/tools/compliance.d.ts +15 -0
- package/dist/tools/compliance.d.ts.map +1 -0
- package/dist/tools/compliance.js +640 -0
- package/dist/tools/compliance.js.map +1 -0
- package/dist/tools/config.d.ts +19 -0
- package/dist/tools/config.d.ts.map +1 -0
- package/dist/tools/config.js +213 -0
- package/dist/tools/config.js.map +1 -0
- package/dist/tools/database.d.ts +62 -0
- package/dist/tools/database.d.ts.map +1 -0
- package/dist/tools/database.js +288 -0
- package/dist/tools/database.js.map +1 -0
- package/dist/tools/documents.d.ts +61 -0
- package/dist/tools/documents.d.ts.map +1 -0
- package/dist/tools/documents.js +1624 -0
- package/dist/tools/documents.js.map +1 -0
- package/dist/tools/embeddings.d.ts +14 -0
- package/dist/tools/embeddings.d.ts.map +1 -0
- package/dist/tools/embeddings.js +626 -0
- package/dist/tools/embeddings.js.map +1 -0
- package/dist/tools/evaluation.d.ts +25 -0
- package/dist/tools/evaluation.d.ts.map +1 -0
- package/dist/tools/evaluation.js +523 -0
- package/dist/tools/evaluation.js.map +1 -0
- package/dist/tools/events.d.ts +16 -0
- package/dist/tools/events.d.ts.map +1 -0
- package/dist/tools/events.js +493 -0
- package/dist/tools/events.js.map +1 -0
- package/dist/tools/extraction-structured.d.ts +13 -0
- package/dist/tools/extraction-structured.d.ts.map +1 -0
- package/dist/tools/extraction-structured.js +390 -0
- package/dist/tools/extraction-structured.js.map +1 -0
- package/dist/tools/extraction.d.ts +24 -0
- package/dist/tools/extraction.d.ts.map +1 -0
- package/dist/tools/extraction.js +424 -0
- package/dist/tools/extraction.js.map +1 -0
- package/dist/tools/file-management.d.ts +14 -0
- package/dist/tools/file-management.d.ts.map +1 -0
- package/dist/tools/file-management.js +523 -0
- package/dist/tools/file-management.js.map +1 -0
- package/dist/tools/form-fill.d.ts +13 -0
- package/dist/tools/form-fill.d.ts.map +1 -0
- package/dist/tools/form-fill.js +250 -0
- package/dist/tools/form-fill.js.map +1 -0
- package/dist/tools/health.d.ts +19 -0
- package/dist/tools/health.d.ts.map +1 -0
- package/dist/tools/health.js +229 -0
- package/dist/tools/health.js.map +1 -0
- package/dist/tools/images.d.ts +54 -0
- package/dist/tools/images.d.ts.map +1 -0
- package/dist/tools/images.js +787 -0
- package/dist/tools/images.js.map +1 -0
- package/dist/tools/ingestion.d.ts +94 -0
- package/dist/tools/ingestion.d.ts.map +1 -0
- package/dist/tools/ingestion.js +1659 -0
- package/dist/tools/ingestion.js.map +1 -0
- package/dist/tools/intelligence.d.ts +18 -0
- package/dist/tools/intelligence.d.ts.map +1 -0
- package/dist/tools/intelligence.js +1039 -0
- package/dist/tools/intelligence.js.map +1 -0
- package/dist/tools/provenance.d.ts +51 -0
- package/dist/tools/provenance.d.ts.map +1 -0
- package/dist/tools/provenance.js +691 -0
- package/dist/tools/provenance.js.map +1 -0
- package/dist/tools/reports.d.ts +41 -0
- package/dist/tools/reports.d.ts.map +1 -0
- package/dist/tools/reports.js +1394 -0
- package/dist/tools/reports.js.map +1 -0
- package/dist/tools/search.d.ts +35 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +2528 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/shared.d.ts +52 -0
- package/dist/tools/shared.d.ts.map +1 -0
- package/dist/tools/shared.js +54 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/tools/tags.d.ts +15 -0
- package/dist/tools/tags.d.ts.map +1 -0
- package/dist/tools/tags.js +287 -0
- package/dist/tools/tags.js.map +1 -0
- package/dist/tools/timeline.d.ts +15 -0
- package/dist/tools/timeline.d.ts.map +1 -0
- package/dist/tools/timeline.js +14 -0
- package/dist/tools/timeline.js.map +1 -0
- package/dist/tools/users.d.ts +14 -0
- package/dist/tools/users.d.ts.map +1 -0
- package/dist/tools/users.js +257 -0
- package/dist/tools/users.js.map +1 -0
- package/dist/tools/vlm.d.ts +40 -0
- package/dist/tools/vlm.d.ts.map +1 -0
- package/dist/tools/vlm.js +475 -0
- package/dist/tools/vlm.js.map +1 -0
- package/dist/tools/workflow.d.ts +16 -0
- package/dist/tools/workflow.d.ts.map +1 -0
- package/dist/tools/workflow.js +495 -0
- package/dist/tools/workflow.js.map +1 -0
- package/dist/utils/backoff.d.ts +53 -0
- package/dist/utils/backoff.d.ts.map +1 -0
- package/dist/utils/backoff.js +78 -0
- package/dist/utils/backoff.js.map +1 -0
- package/dist/utils/config-persistence.d.ts +33 -0
- package/dist/utils/config-persistence.d.ts.map +1 -0
- package/dist/utils/config-persistence.js +61 -0
- package/dist/utils/config-persistence.js.map +1 -0
- package/dist/utils/hash.d.ts +65 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +146 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/math.d.ts +21 -0
- package/dist/utils/math.d.ts.map +1 -0
- package/dist/utils/math.js +39 -0
- package/dist/utils/math.js.map +1 -0
- package/dist/utils/validation.d.ts +697 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +529 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +96 -0
- package/python/.gitkeep +0 -0
- package/python/__init__.py +104 -0
- package/python/clustering_worker.py +440 -0
- package/python/docx_image_extractor.py +524 -0
- package/python/embedding_worker.py +552 -0
- package/python/file_manager_worker.py +564 -0
- package/python/form_fill_worker.py +399 -0
- package/python/gpu_utils.py +582 -0
- package/python/image_extractor.py +317 -0
- package/python/image_optimizer.py +444 -0
- package/python/ocr_worker.py +712 -0
- package/python/pyproject.toml +76 -0
- package/python/requirements.txt +51 -0
- package/python/reranker_worker.py +87 -0
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server State Management
|
|
3
|
+
*
|
|
4
|
+
* Manages global server state including current database connection and configuration.
|
|
5
|
+
* FAIL FAST: All state access throws immediately if preconditions not met.
|
|
6
|
+
*
|
|
7
|
+
* @module server/state
|
|
8
|
+
*/
|
|
9
|
+
import { DatabaseService } from '../services/storage/database/index.js';
|
|
10
|
+
import { VectorService } from '../services/storage/vector.js';
|
|
11
|
+
import { DEFAULT_STORAGE_PATH } from '../services/storage/database/helpers.js';
|
|
12
|
+
import { databaseNotSelectedError, databaseNotFoundError, databaseAlreadyExistsError, } from './errors.js';
|
|
13
|
+
import { loadPersistedConfig } from '../utils/config-persistence.js';
|
|
14
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
15
|
+
// DEFAULT CONFIGURATION
|
|
16
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
17
|
+
/**
|
|
18
|
+
* Default server configuration
|
|
19
|
+
*/
|
|
20
|
+
const defaultConfig = {
|
|
21
|
+
defaultStoragePath: DEFAULT_STORAGE_PATH,
|
|
22
|
+
defaultOCRMode: 'balanced',
|
|
23
|
+
maxConcurrent: 3,
|
|
24
|
+
embeddingBatchSize: 32,
|
|
25
|
+
embeddingDevice: 'auto',
|
|
26
|
+
chunkSize: 2000,
|
|
27
|
+
chunkOverlapPercent: 10,
|
|
28
|
+
maxChunkSize: 8000,
|
|
29
|
+
autoClusterEnabled: false,
|
|
30
|
+
autoClusterThreshold: 10,
|
|
31
|
+
autoClusterAlgorithm: 'hdbscan',
|
|
32
|
+
imageOptimization: {
|
|
33
|
+
enabled: true,
|
|
34
|
+
ocrMaxWidth: 4800,
|
|
35
|
+
vlmMaxDimension: 2048,
|
|
36
|
+
vlmSkipBelowSize: 50,
|
|
37
|
+
vlmMinRelevance: 0.3,
|
|
38
|
+
vlmSkipLogosIcons: true,
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
42
|
+
// GLOBAL STATE
|
|
43
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
44
|
+
/**
|
|
45
|
+
* Global server state
|
|
46
|
+
* Mutable state for current database and configuration
|
|
47
|
+
*/
|
|
48
|
+
export const state = {
|
|
49
|
+
currentDatabase: null,
|
|
50
|
+
currentDatabaseName: null,
|
|
51
|
+
config: { ...defaultConfig },
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Cached VectorService instance - cleared on database change
|
|
55
|
+
*/
|
|
56
|
+
let _cachedVectorService = null;
|
|
57
|
+
/**
|
|
58
|
+
* Generation counter - incremented on every database switch/clear.
|
|
59
|
+
*/
|
|
60
|
+
let _dbGeneration = 0;
|
|
61
|
+
/**
|
|
62
|
+
* Active operation counter - tracks in-flight async database operations.
|
|
63
|
+
* selectDatabase() and clearDatabase() refuse to proceed when > 0.
|
|
64
|
+
*/
|
|
65
|
+
let _activeOperations = 0;
|
|
66
|
+
/**
|
|
67
|
+
* Require database to be selected - FAIL FAST if not
|
|
68
|
+
*
|
|
69
|
+
* @returns Database service, vector service, and generation counter
|
|
70
|
+
* @throws MCPError with DATABASE_NOT_SELECTED if no database is selected
|
|
71
|
+
*/
|
|
72
|
+
export function requireDatabase() {
|
|
73
|
+
if (!state.currentDatabase) {
|
|
74
|
+
throw databaseNotSelectedError();
|
|
75
|
+
}
|
|
76
|
+
if (!_cachedVectorService) {
|
|
77
|
+
_cachedVectorService = new VectorService(state.currentDatabase.getConnection());
|
|
78
|
+
}
|
|
79
|
+
return { db: state.currentDatabase, vector: _cachedVectorService, generation: _dbGeneration };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Validate that the database generation matches the expected value.
|
|
83
|
+
*
|
|
84
|
+
* The generation counter increments on every database switch/clear. A mismatch
|
|
85
|
+
* means the database was switched between the time a caller obtained the
|
|
86
|
+
* generation and the time it validates -- indicating a race condition where
|
|
87
|
+
* the caller's database reference is stale.
|
|
88
|
+
*
|
|
89
|
+
* Callers can optionally use this at critical points (e.g., before writing
|
|
90
|
+
* results back to the database) to detect and fail fast on stale references.
|
|
91
|
+
*
|
|
92
|
+
* @param expectedGeneration - The generation value obtained from requireDatabase()
|
|
93
|
+
* @throws Error if the current generation does not match
|
|
94
|
+
*/
|
|
95
|
+
export function validateGeneration(expectedGeneration) {
|
|
96
|
+
if (_dbGeneration !== expectedGeneration) {
|
|
97
|
+
throw new Error(`Database generation mismatch: expected ${expectedGeneration}, current ${_dbGeneration}. ` +
|
|
98
|
+
`The database was switched during this operation. Retry with the current database.`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
102
|
+
// OPERATION TRACKING (H-1, H-2, M-9)
|
|
103
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
104
|
+
/**
|
|
105
|
+
* Begin tracking an in-flight database operation.
|
|
106
|
+
*
|
|
107
|
+
* Increments the active operation counter and returns the current generation.
|
|
108
|
+
* While any operations are active, selectDatabase() and clearDatabase() will
|
|
109
|
+
* throw to prevent database switches during async work.
|
|
110
|
+
*
|
|
111
|
+
* @returns Current database generation for later validation
|
|
112
|
+
* @throws MCPError if no database is selected
|
|
113
|
+
*/
|
|
114
|
+
export function beginDatabaseOperation() {
|
|
115
|
+
if (!state.currentDatabase) {
|
|
116
|
+
throw databaseNotSelectedError();
|
|
117
|
+
}
|
|
118
|
+
_activeOperations++;
|
|
119
|
+
return _dbGeneration;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* End tracking an in-flight database operation.
|
|
123
|
+
*
|
|
124
|
+
* Decrements the active operation counter. Counter never goes below 0.
|
|
125
|
+
*/
|
|
126
|
+
export function endDatabaseOperation() {
|
|
127
|
+
if (_activeOperations > 0) {
|
|
128
|
+
_activeOperations--;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get the number of active database operations (for diagnostics/testing).
|
|
133
|
+
*/
|
|
134
|
+
export function getActiveOperationCount() {
|
|
135
|
+
return _activeOperations;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Execute an async function within a tracked database operation scope.
|
|
139
|
+
*
|
|
140
|
+
* Calls beginDatabaseOperation() before the function and endDatabaseOperation()
|
|
141
|
+
* in a finally block, guaranteeing the counter is decremented even on error.
|
|
142
|
+
* Also validates the generation after the function completes to detect any
|
|
143
|
+
* mid-operation database switch.
|
|
144
|
+
*
|
|
145
|
+
* Use this for async tool handlers that do database writes across multiple
|
|
146
|
+
* await points. Read-only synchronous handlers do not need this wrapper
|
|
147
|
+
* because the event loop does not yield.
|
|
148
|
+
*
|
|
149
|
+
* @param fn - Async function receiving DatabaseServices
|
|
150
|
+
* @returns The result of fn
|
|
151
|
+
* @throws MCPError if no database is selected
|
|
152
|
+
* @throws Error if the database was switched during the operation
|
|
153
|
+
*/
|
|
154
|
+
export async function withDatabaseOperation(fn) {
|
|
155
|
+
const generation = beginDatabaseOperation();
|
|
156
|
+
try {
|
|
157
|
+
const services = requireDatabase();
|
|
158
|
+
const result = await fn(services);
|
|
159
|
+
validateGeneration(generation);
|
|
160
|
+
return result;
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
endDatabaseOperation();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Check if a database is currently selected
|
|
168
|
+
*/
|
|
169
|
+
export function hasDatabase() {
|
|
170
|
+
return state.currentDatabase !== null;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get current database name or null
|
|
174
|
+
*/
|
|
175
|
+
export function getCurrentDatabaseName() {
|
|
176
|
+
return state.currentDatabaseName;
|
|
177
|
+
}
|
|
178
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
179
|
+
// DATABASE MANAGEMENT
|
|
180
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
181
|
+
/**
|
|
182
|
+
* Apply persisted config from a database's config_json column.
|
|
183
|
+
*
|
|
184
|
+
* Called after database selection to restore config values that were
|
|
185
|
+
* saved by handleConfigSet in a previous session.
|
|
186
|
+
*
|
|
187
|
+
* @param db - The newly opened DatabaseService
|
|
188
|
+
*/
|
|
189
|
+
function applyPersistedConfig(db) {
|
|
190
|
+
try {
|
|
191
|
+
const persisted = loadPersistedConfig(db.getConnection());
|
|
192
|
+
if (Object.keys(persisted).length > 0) {
|
|
193
|
+
// Apply each persisted config key using updateConfig
|
|
194
|
+
const CONFIG_KEY_TO_STATE = {
|
|
195
|
+
datalab_default_mode: 'defaultOCRMode',
|
|
196
|
+
datalab_max_concurrent: 'maxConcurrent',
|
|
197
|
+
embedding_batch_size: 'embeddingBatchSize',
|
|
198
|
+
embedding_device: 'embeddingDevice',
|
|
199
|
+
chunk_size: 'chunkSize',
|
|
200
|
+
chunk_overlap_percent: 'chunkOverlapPercent',
|
|
201
|
+
max_chunk_size: 'maxChunkSize',
|
|
202
|
+
auto_cluster_enabled: 'autoClusterEnabled',
|
|
203
|
+
auto_cluster_threshold: 'autoClusterThreshold',
|
|
204
|
+
auto_cluster_algorithm: 'autoClusterAlgorithm',
|
|
205
|
+
};
|
|
206
|
+
const updates = {};
|
|
207
|
+
for (const [key, value] of Object.entries(persisted)) {
|
|
208
|
+
const stateKey = CONFIG_KEY_TO_STATE[key];
|
|
209
|
+
if (stateKey) {
|
|
210
|
+
updates[stateKey] = value;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (Object.keys(updates).length > 0) {
|
|
214
|
+
updateConfig(updates);
|
|
215
|
+
console.error(`[state] Loaded ${Object.keys(updates).length} persisted config value(s) from database`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
console.error(`[state] Failed to apply persisted config: ${error instanceof Error ? error.message : String(error)}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Select a database by name - opens connection and sets as current
|
|
225
|
+
*
|
|
226
|
+
* FAIL FAST: Throws immediately if database doesn't exist or if operations
|
|
227
|
+
* are in-flight (H-2 guard). Uses atomic swap (M-9 fix): opens new DB first,
|
|
228
|
+
* then swaps state, then closes old DB -- no null window.
|
|
229
|
+
*
|
|
230
|
+
* @param name - Database name to select
|
|
231
|
+
* @param storagePath - Optional storage path override
|
|
232
|
+
* @throws MCPError with DATABASE_NOT_FOUND if database doesn't exist
|
|
233
|
+
* @throws Error if database operations are in-flight
|
|
234
|
+
*/
|
|
235
|
+
export function selectDatabase(name, storagePath) {
|
|
236
|
+
const path = storagePath ?? state.config.defaultStoragePath;
|
|
237
|
+
// H-2: Refuse to switch while async operations are in-flight
|
|
238
|
+
if (_activeOperations > 0) {
|
|
239
|
+
throw new Error(`Cannot switch databases while ${_activeOperations} operation(s) are in-flight. ` +
|
|
240
|
+
`Wait for active operations to complete before switching databases.`);
|
|
241
|
+
}
|
|
242
|
+
// Verify database exists BEFORE any state changes - FAIL FAST
|
|
243
|
+
// If the new DB doesn't exist, the old connection stays open and usable.
|
|
244
|
+
if (!DatabaseService.exists(name, path)) {
|
|
245
|
+
throw databaseNotFoundError(name, path);
|
|
246
|
+
}
|
|
247
|
+
// M-9: Atomic swap - open new FIRST, then swap state, then close old.
|
|
248
|
+
// This eliminates the null window where state.currentDatabase is null
|
|
249
|
+
// between closing old and opening new.
|
|
250
|
+
const newDb = DatabaseService.open(name, path);
|
|
251
|
+
const oldDb = state.currentDatabase;
|
|
252
|
+
// Swap state atomically (single tick - no await between these assignments)
|
|
253
|
+
state.currentDatabase = newDb;
|
|
254
|
+
state.currentDatabaseName = name;
|
|
255
|
+
_cachedVectorService = null;
|
|
256
|
+
_dbGeneration++;
|
|
257
|
+
// Close old connection AFTER state points to new DB
|
|
258
|
+
if (oldDb) {
|
|
259
|
+
oldDb.close();
|
|
260
|
+
}
|
|
261
|
+
// Load persisted config from the database (if any)
|
|
262
|
+
applyPersistedConfig(newDb);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Create a new database and optionally select it
|
|
266
|
+
*
|
|
267
|
+
* FAIL FAST: Throws immediately if database already exists
|
|
268
|
+
*
|
|
269
|
+
* @param name - Database name to create
|
|
270
|
+
* @param description - Optional description
|
|
271
|
+
* @param storagePath - Optional storage path override
|
|
272
|
+
* @param autoSelect - Whether to select the database after creation (default: true)
|
|
273
|
+
* @returns The created database service
|
|
274
|
+
* @throws MCPError with DATABASE_ALREADY_EXISTS if database exists
|
|
275
|
+
*/
|
|
276
|
+
export function createDatabase(name, description, storagePath, autoSelect = true) {
|
|
277
|
+
const path = storagePath ?? state.config.defaultStoragePath;
|
|
278
|
+
// Check if database already exists - FAIL FAST
|
|
279
|
+
if (DatabaseService.exists(name, path)) {
|
|
280
|
+
throw databaseAlreadyExistsError(name);
|
|
281
|
+
}
|
|
282
|
+
// Create the database
|
|
283
|
+
const db = DatabaseService.create(name, description, path);
|
|
284
|
+
if (autoSelect) {
|
|
285
|
+
// H-3: Refuse to switch while async operations are in-flight
|
|
286
|
+
if (_activeOperations > 0) {
|
|
287
|
+
// Close the newly created DB since we can't switch to it
|
|
288
|
+
db.close();
|
|
289
|
+
throw new Error(`Cannot auto-select newly created database "${name}" while ${_activeOperations} operation(s) are in-flight. ` +
|
|
290
|
+
`Wait for active operations to complete, then select the database manually.`);
|
|
291
|
+
}
|
|
292
|
+
// Close any existing connection first
|
|
293
|
+
if (state.currentDatabase) {
|
|
294
|
+
state.currentDatabase.close();
|
|
295
|
+
}
|
|
296
|
+
_cachedVectorService = null;
|
|
297
|
+
_dbGeneration++;
|
|
298
|
+
state.currentDatabase = db;
|
|
299
|
+
state.currentDatabaseName = name;
|
|
300
|
+
}
|
|
301
|
+
// When autoSelect=false, return the open DB -- caller manages lifecycle.
|
|
302
|
+
// Previously the DB was closed here making the returned service dead.
|
|
303
|
+
return db;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Delete a database
|
|
307
|
+
*
|
|
308
|
+
* FAIL FAST: Throws if database doesn't exist
|
|
309
|
+
*
|
|
310
|
+
* @param name - Database name to delete
|
|
311
|
+
* @param storagePath - Optional storage path override
|
|
312
|
+
* @throws MCPError with DATABASE_NOT_FOUND if database doesn't exist
|
|
313
|
+
*/
|
|
314
|
+
export function deleteDatabase(name, storagePath) {
|
|
315
|
+
const path = storagePath ?? state.config.defaultStoragePath;
|
|
316
|
+
// Verify database exists - FAIL FAST
|
|
317
|
+
if (!DatabaseService.exists(name, path)) {
|
|
318
|
+
throw databaseNotFoundError(name, path);
|
|
319
|
+
}
|
|
320
|
+
// If this is the current database, clear state first
|
|
321
|
+
if (state.currentDatabaseName === name) {
|
|
322
|
+
clearDatabase();
|
|
323
|
+
}
|
|
324
|
+
// Delete the database
|
|
325
|
+
DatabaseService.delete(name, path);
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Clear current database selection - closes connection.
|
|
329
|
+
*
|
|
330
|
+
* FAIL FAST: Throws if async operations are in-flight (H-2 guard).
|
|
331
|
+
* The forceClose parameter bypasses the guard for internal use only
|
|
332
|
+
* (resetState in tests, process exit cleanup).
|
|
333
|
+
*
|
|
334
|
+
* @param forceClose - Skip operation guard (internal use only)
|
|
335
|
+
* @throws Error if database operations are in-flight and forceClose is false
|
|
336
|
+
*/
|
|
337
|
+
export function clearDatabase(forceClose = false) {
|
|
338
|
+
// H-2: Refuse to clear while async operations are in-flight
|
|
339
|
+
if (!forceClose && _activeOperations > 0) {
|
|
340
|
+
throw new Error(`Cannot clear database while ${_activeOperations} operation(s) are in-flight. ` +
|
|
341
|
+
`Wait for active operations to complete before clearing the database.`);
|
|
342
|
+
}
|
|
343
|
+
if (state.currentDatabase) {
|
|
344
|
+
state.currentDatabase.close();
|
|
345
|
+
state.currentDatabase = null;
|
|
346
|
+
state.currentDatabaseName = null;
|
|
347
|
+
_cachedVectorService = null;
|
|
348
|
+
_dbGeneration++;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
352
|
+
// CONFIGURATION
|
|
353
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
354
|
+
/**
|
|
355
|
+
* Get current server configuration
|
|
356
|
+
*/
|
|
357
|
+
export function getConfig() {
|
|
358
|
+
return { ...state.config };
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Update server configuration (deep merges nested objects like imageOptimization)
|
|
362
|
+
*/
|
|
363
|
+
export function updateConfig(updates) {
|
|
364
|
+
// Deep merge imageOptimization if both existing and update have it
|
|
365
|
+
if (updates.imageOptimization && state.config.imageOptimization) {
|
|
366
|
+
updates = {
|
|
367
|
+
...updates,
|
|
368
|
+
imageOptimization: {
|
|
369
|
+
...state.config.imageOptimization,
|
|
370
|
+
...updates.imageOptimization,
|
|
371
|
+
},
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
state.config = { ...state.config, ...updates };
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Reset configuration to defaults
|
|
378
|
+
*/
|
|
379
|
+
export function resetConfig() {
|
|
380
|
+
state.config = { ...defaultConfig };
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Get default storage path
|
|
384
|
+
*/
|
|
385
|
+
export function getDefaultStoragePath() {
|
|
386
|
+
return state.config.defaultStoragePath;
|
|
387
|
+
}
|
|
388
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
389
|
+
// STATE RESET (FOR TESTING)
|
|
390
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
391
|
+
/**
|
|
392
|
+
* Reset all server state - ONLY USE IN TESTS
|
|
393
|
+
*
|
|
394
|
+
* Uses forceClose=true to bypass the operation guard since tests
|
|
395
|
+
* need to reset state unconditionally between test cases.
|
|
396
|
+
*/
|
|
397
|
+
export function resetState() {
|
|
398
|
+
clearDatabase(/* forceClose */ true);
|
|
399
|
+
_cachedVectorService = null;
|
|
400
|
+
_dbGeneration = 0;
|
|
401
|
+
_activeOperations = 0;
|
|
402
|
+
state.config = { ...defaultConfig };
|
|
403
|
+
}
|
|
404
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
405
|
+
// PROCESS EXIT CLEANUP
|
|
406
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
407
|
+
/**
|
|
408
|
+
* L-5: Clean up database connections on process exit.
|
|
409
|
+
* Ensures WAL/SHM files are properly checkpointed.
|
|
410
|
+
*/
|
|
411
|
+
process.on('exit', () => {
|
|
412
|
+
if (state.currentDatabase) {
|
|
413
|
+
try {
|
|
414
|
+
state.currentDatabase.close();
|
|
415
|
+
}
|
|
416
|
+
catch (error) {
|
|
417
|
+
console.error('[state] database close on exit failed:', error instanceof Error ? error.message : String(error));
|
|
418
|
+
// Continue exit cleanup despite error
|
|
419
|
+
}
|
|
420
|
+
state.currentDatabase = null;
|
|
421
|
+
state.currentDatabaseName = null;
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/server/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streamable HTTP Transport for MCP
|
|
3
|
+
*
|
|
4
|
+
* Implements MCP Streamable HTTP transport (2025-03-26):
|
|
5
|
+
* - HTTP POST for client->server messages
|
|
6
|
+
* - SSE for server->client streaming
|
|
7
|
+
* - Mcp-Session-Id header for session management
|
|
8
|
+
*
|
|
9
|
+
* CRITICAL: NEVER use console.log() - stdout is reserved for JSON-RPC protocol.
|
|
10
|
+
*
|
|
11
|
+
* @module server/transports/http-transport
|
|
12
|
+
*/
|
|
13
|
+
export interface HttpTransportConfig {
|
|
14
|
+
port: number;
|
|
15
|
+
sessionTtlMs: number;
|
|
16
|
+
}
|
|
17
|
+
export declare class HttpTransport {
|
|
18
|
+
private sessions;
|
|
19
|
+
private server;
|
|
20
|
+
private config;
|
|
21
|
+
private cleanupTimer;
|
|
22
|
+
private messageHandler;
|
|
23
|
+
constructor(config?: Partial<HttpTransportConfig>);
|
|
24
|
+
/** Set the handler for incoming messages */
|
|
25
|
+
onMessage(handler: (sessionId: string, message: unknown) => Promise<unknown>): void;
|
|
26
|
+
/** Start the HTTP server */
|
|
27
|
+
start(): Promise<void>;
|
|
28
|
+
/** Stop the HTTP server */
|
|
29
|
+
stop(): Promise<void>;
|
|
30
|
+
private handlePost;
|
|
31
|
+
private handleSSE;
|
|
32
|
+
/** Send SSE event to a session */
|
|
33
|
+
sendEvent(sessionId: string, event: string, data: unknown): void;
|
|
34
|
+
private cleanupExpiredSessions;
|
|
35
|
+
getSessionCount(): number;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=http-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-transport.d.ts","sourceRoot":"","sources":["../../../src/server/transports/http-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAaD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,cAAc,CAA4E;gBAEtF,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAOjD,4CAA4C;IAC5C,SAAS,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAInF,4BAA4B;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmD5B,2BAA2B;IACrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAeb,UAAU;YAiDV,SAAS;IAoCvB,kCAAkC;IAClC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAchE,OAAO,CAAC,sBAAsB;IAiB9B,eAAe,IAAI,MAAM;CAG1B"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streamable HTTP Transport for MCP
|
|
3
|
+
*
|
|
4
|
+
* Implements MCP Streamable HTTP transport (2025-03-26):
|
|
5
|
+
* - HTTP POST for client->server messages
|
|
6
|
+
* - SSE for server->client streaming
|
|
7
|
+
* - Mcp-Session-Id header for session management
|
|
8
|
+
*
|
|
9
|
+
* CRITICAL: NEVER use console.log() - stdout is reserved for JSON-RPC protocol.
|
|
10
|
+
*
|
|
11
|
+
* @module server/transports/http-transport
|
|
12
|
+
*/
|
|
13
|
+
import http from 'http';
|
|
14
|
+
import { randomUUID } from 'crypto';
|
|
15
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
16
|
+
// HTTP TRANSPORT
|
|
17
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
18
|
+
export class HttpTransport {
|
|
19
|
+
sessions = new Map();
|
|
20
|
+
server = null;
|
|
21
|
+
config;
|
|
22
|
+
cleanupTimer = null;
|
|
23
|
+
messageHandler = null;
|
|
24
|
+
constructor(config) {
|
|
25
|
+
this.config = {
|
|
26
|
+
port: config?.port ?? (Number(process.env.MCP_HTTP_PORT) || 3100),
|
|
27
|
+
sessionTtlMs: config?.sessionTtlMs ?? (Number(process.env.MCP_SESSION_TTL) || 3600) * 1000,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** Set the handler for incoming messages */
|
|
31
|
+
onMessage(handler) {
|
|
32
|
+
this.messageHandler = handler;
|
|
33
|
+
}
|
|
34
|
+
/** Start the HTTP server */
|
|
35
|
+
async start() {
|
|
36
|
+
this.server = http.createServer(async (req, res) => {
|
|
37
|
+
// CORS headers
|
|
38
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
39
|
+
res.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');
|
|
40
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Mcp-Session-Id');
|
|
41
|
+
res.setHeader('Access-Control-Expose-Headers', 'Mcp-Session-Id');
|
|
42
|
+
if (req.method === 'OPTIONS') {
|
|
43
|
+
res.writeHead(204);
|
|
44
|
+
res.end();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
if (req.method === 'POST' && req.url === '/mcp') {
|
|
49
|
+
await this.handlePost(req, res);
|
|
50
|
+
}
|
|
51
|
+
else if (req.method === 'GET' && req.url === '/mcp/sse') {
|
|
52
|
+
await this.handleSSE(req, res);
|
|
53
|
+
}
|
|
54
|
+
else if (req.method === 'GET' && req.url === '/health') {
|
|
55
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
56
|
+
res.end(JSON.stringify({ status: 'ok', sessions: this.sessions.size }));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
res.writeHead(404);
|
|
60
|
+
res.end('Not found');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.error('[HttpTransport] Request error:', error instanceof Error ? error.message : String(error));
|
|
65
|
+
if (!res.headersSent) {
|
|
66
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
67
|
+
res.end(JSON.stringify({ error: 'Internal server error' }));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
await new Promise((resolve, reject) => {
|
|
72
|
+
this.server.listen(this.config.port, () => {
|
|
73
|
+
console.error(`[HttpTransport] Listening on port ${this.config.port}`);
|
|
74
|
+
resolve();
|
|
75
|
+
});
|
|
76
|
+
this.server.on('error', reject);
|
|
77
|
+
});
|
|
78
|
+
// Session cleanup every 60s
|
|
79
|
+
this.cleanupTimer = setInterval(() => this.cleanupExpiredSessions(), 60000);
|
|
80
|
+
this.cleanupTimer.unref();
|
|
81
|
+
}
|
|
82
|
+
/** Stop the HTTP server */
|
|
83
|
+
async stop() {
|
|
84
|
+
if (this.cleanupTimer) {
|
|
85
|
+
clearInterval(this.cleanupTimer);
|
|
86
|
+
this.cleanupTimer = null;
|
|
87
|
+
}
|
|
88
|
+
if (this.server) {
|
|
89
|
+
await new Promise((resolve) => {
|
|
90
|
+
this.server.close(() => resolve());
|
|
91
|
+
});
|
|
92
|
+
this.server = null;
|
|
93
|
+
}
|
|
94
|
+
this.sessions.clear();
|
|
95
|
+
console.error('[HttpTransport] Stopped');
|
|
96
|
+
}
|
|
97
|
+
async handlePost(req, res) {
|
|
98
|
+
// Get or create session
|
|
99
|
+
let sessionId = req.headers['mcp-session-id'];
|
|
100
|
+
if (sessionId && !this.sessions.has(sessionId)) {
|
|
101
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
102
|
+
res.end(JSON.stringify({ error: 'Invalid session ID' }));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (!sessionId) {
|
|
106
|
+
sessionId = randomUUID();
|
|
107
|
+
this.sessions.set(sessionId, {
|
|
108
|
+
id: sessionId,
|
|
109
|
+
createdAt: Date.now(),
|
|
110
|
+
lastActivity: Date.now(),
|
|
111
|
+
sseResponse: null,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
const session = this.sessions.get(sessionId);
|
|
115
|
+
session.lastActivity = Date.now();
|
|
116
|
+
// Read body
|
|
117
|
+
const body = await new Promise((resolve, reject) => {
|
|
118
|
+
let data = '';
|
|
119
|
+
req.on('data', (chunk) => {
|
|
120
|
+
data += chunk;
|
|
121
|
+
});
|
|
122
|
+
req.on('end', () => resolve(data));
|
|
123
|
+
req.on('error', reject);
|
|
124
|
+
});
|
|
125
|
+
if (!this.messageHandler) {
|
|
126
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
127
|
+
res.end(JSON.stringify({ error: 'No message handler registered' }));
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const message = JSON.parse(body);
|
|
131
|
+
const response = await this.messageHandler(sessionId, message);
|
|
132
|
+
res.writeHead(200, {
|
|
133
|
+
'Content-Type': 'application/json',
|
|
134
|
+
'Mcp-Session-Id': sessionId,
|
|
135
|
+
});
|
|
136
|
+
res.end(JSON.stringify(response));
|
|
137
|
+
}
|
|
138
|
+
async handleSSE(req, res) {
|
|
139
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
140
|
+
if (!sessionId || !this.sessions.has(sessionId)) {
|
|
141
|
+
res.writeHead(400);
|
|
142
|
+
res.end('Invalid session');
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const session = this.sessions.get(sessionId);
|
|
146
|
+
session.lastActivity = Date.now();
|
|
147
|
+
session.sseResponse = res;
|
|
148
|
+
res.writeHead(200, {
|
|
149
|
+
'Content-Type': 'text/event-stream',
|
|
150
|
+
'Cache-Control': 'no-cache',
|
|
151
|
+
'Connection': 'keep-alive',
|
|
152
|
+
'Mcp-Session-Id': sessionId,
|
|
153
|
+
});
|
|
154
|
+
// Keep-alive ping every 30s
|
|
155
|
+
const keepAlive = setInterval(() => {
|
|
156
|
+
try {
|
|
157
|
+
res.write(': ping\n\n');
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
clearInterval(keepAlive);
|
|
161
|
+
}
|
|
162
|
+
}, 30000);
|
|
163
|
+
req.on('close', () => {
|
|
164
|
+
clearInterval(keepAlive);
|
|
165
|
+
if (session.sseResponse === res) {
|
|
166
|
+
session.sseResponse = null;
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
/** Send SSE event to a session */
|
|
171
|
+
sendEvent(sessionId, event, data) {
|
|
172
|
+
const session = this.sessions.get(sessionId);
|
|
173
|
+
if (session?.sseResponse) {
|
|
174
|
+
try {
|
|
175
|
+
session.sseResponse.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`);
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
console.error(`[HttpTransport] SSE send failed for ${sessionId}: ${error instanceof Error ? error.message : String(error)}`);
|
|
179
|
+
session.sseResponse = null;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
cleanupExpiredSessions() {
|
|
184
|
+
const now = Date.now();
|
|
185
|
+
for (const [id, session] of this.sessions) {
|
|
186
|
+
if (now - session.lastActivity > this.config.sessionTtlMs) {
|
|
187
|
+
console.error(`[HttpTransport] Expiring session ${id}`);
|
|
188
|
+
if (session.sseResponse) {
|
|
189
|
+
try {
|
|
190
|
+
session.sseResponse.end();
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
/* ignore close errors */
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
this.sessions.delete(id);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
getSessionCount() {
|
|
201
|
+
return this.sessions.size;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=http-transport.js.map
|