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,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EmbeddingService - Embedding generation orchestrator
|
|
3
|
+
*
|
|
4
|
+
* CP-001: Complete provenance (EMBEDDING records, chain_depth=3)
|
|
5
|
+
* CP-002: original_text denormalized in every embedding
|
|
6
|
+
* CP-004: Local GPU only - NO cloud fallback
|
|
7
|
+
*
|
|
8
|
+
* ATOMIC: All operations succeed or none are stored. FAIL FAST.
|
|
9
|
+
*
|
|
10
|
+
* @module services/embedding/embedder
|
|
11
|
+
*/
|
|
12
|
+
import { NomicEmbeddingClient, EmbeddingError } from './nomic.js';
|
|
13
|
+
import { DatabaseService } from '../storage/database/index.js';
|
|
14
|
+
import { VectorService } from '../storage/vector.js';
|
|
15
|
+
import type { Chunk } from '../../models/chunk.js';
|
|
16
|
+
interface DocumentInfo {
|
|
17
|
+
documentId: string;
|
|
18
|
+
filePath: string;
|
|
19
|
+
fileName: string;
|
|
20
|
+
fileHash: string;
|
|
21
|
+
documentProvenanceId: string;
|
|
22
|
+
}
|
|
23
|
+
interface EmbedResult {
|
|
24
|
+
success: boolean;
|
|
25
|
+
embeddingIds: string[];
|
|
26
|
+
provenanceIds: string[];
|
|
27
|
+
totalChunks: number;
|
|
28
|
+
elapsedMs: number;
|
|
29
|
+
error?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Build a section-aware context prefix from chunk metadata.
|
|
33
|
+
* This prefix is prepended to the chunk text before embedding to make
|
|
34
|
+
* embeddings section-aware WITHOUT changing stored text.
|
|
35
|
+
*
|
|
36
|
+
* @param chunk - Chunk with section/heading/content_types metadata
|
|
37
|
+
* @returns Prefix string (may be empty if no relevant metadata)
|
|
38
|
+
*/
|
|
39
|
+
export declare function buildSectionPrefix(chunk: Chunk): string;
|
|
40
|
+
export declare class EmbeddingService {
|
|
41
|
+
private readonly client;
|
|
42
|
+
private readonly batchSize;
|
|
43
|
+
constructor(options?: {
|
|
44
|
+
batchSize?: number;
|
|
45
|
+
client?: NomicEmbeddingClient;
|
|
46
|
+
});
|
|
47
|
+
embedDocumentChunks(db: DatabaseService, vectorService: VectorService, chunks: Chunk[], documentInfo: DocumentInfo): Promise<EmbedResult>;
|
|
48
|
+
embedSearchQuery(query: string): Promise<Float32Array>;
|
|
49
|
+
processPendingChunks(db: DatabaseService, vectorService: VectorService, documentInfo: DocumentInfo): Promise<EmbedResult>;
|
|
50
|
+
private createProvenance;
|
|
51
|
+
}
|
|
52
|
+
export declare function getEmbeddingService(): EmbeddingService;
|
|
53
|
+
export declare function resetEmbeddingService(): void;
|
|
54
|
+
export { EmbeddingError };
|
|
55
|
+
//# sourceMappingURL=embedder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../../../src/services/embedding/embedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EACL,oBAAoB,EAEpB,cAAc,EAKf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AASnD,UAAU,YAAY;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,UAAU,WAAW;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAoBvD;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,oBAAoB,CAAA;KAAE;IAKrE,mBAAmB,CACvB,EAAE,EAAE,eAAe,EACnB,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,KAAK,EAAE,EACf,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,WAAW,CAAC;IA8FjB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAItD,oBAAoB,CACxB,EAAE,EAAE,eAAe,EACnB,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,WAAW,CAAC;IAWvB,OAAO,CAAC,gBAAgB;CAoDzB;AAID,wBAAgB,mBAAmB,IAAI,gBAAgB,CAKtD;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EmbeddingService - Embedding generation orchestrator
|
|
3
|
+
*
|
|
4
|
+
* CP-001: Complete provenance (EMBEDDING records, chain_depth=3)
|
|
5
|
+
* CP-002: original_text denormalized in every embedding
|
|
6
|
+
* CP-004: Local GPU only - NO cloud fallback
|
|
7
|
+
*
|
|
8
|
+
* ATOMIC: All operations succeed or none are stored. FAIL FAST.
|
|
9
|
+
*
|
|
10
|
+
* @module services/embedding/embedder
|
|
11
|
+
*/
|
|
12
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
13
|
+
import { getEmbeddingClient, EmbeddingError, EMBEDDING_DIM, MODEL_NAME, MODEL_VERSION, DEFAULT_BATCH_SIZE, } from './nomic.js';
|
|
14
|
+
import { computeHash } from '../../utils/hash.js';
|
|
15
|
+
import { normalizeForEmbedding } from '../chunking/text-normalizer.js';
|
|
16
|
+
const CHAIN_PATH = JSON.stringify(['DOCUMENT', 'OCR_RESULT', 'CHUNK', 'EMBEDDING']);
|
|
17
|
+
/** Section-aware embedding processor version */
|
|
18
|
+
const SECTION_AWARE_VERSION = '1.5.0-section';
|
|
19
|
+
/**
|
|
20
|
+
* Build a section-aware context prefix from chunk metadata.
|
|
21
|
+
* This prefix is prepended to the chunk text before embedding to make
|
|
22
|
+
* embeddings section-aware WITHOUT changing stored text.
|
|
23
|
+
*
|
|
24
|
+
* @param chunk - Chunk with section/heading/content_types metadata
|
|
25
|
+
* @returns Prefix string (may be empty if no relevant metadata)
|
|
26
|
+
*/
|
|
27
|
+
export function buildSectionPrefix(chunk) {
|
|
28
|
+
const parts = [];
|
|
29
|
+
if (chunk.section_path) {
|
|
30
|
+
parts.push(`[Section: ${chunk.section_path}]`);
|
|
31
|
+
}
|
|
32
|
+
else if (chunk.heading_context) {
|
|
33
|
+
parts.push(`[Heading: ${chunk.heading_context}]`);
|
|
34
|
+
}
|
|
35
|
+
if (chunk.content_types) {
|
|
36
|
+
try {
|
|
37
|
+
const types = JSON.parse(chunk.content_types);
|
|
38
|
+
if (types.includes('table'))
|
|
39
|
+
parts.push('[Table]');
|
|
40
|
+
if (types.includes('code'))
|
|
41
|
+
parts.push('[Code]');
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
console.error(`[embedder] Failed to parse content_types JSON for chunk ${chunk.id}: ${error instanceof Error ? error.message : String(error)}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return parts.length > 0 ? parts.join(' ') + ' ' : '';
|
|
48
|
+
}
|
|
49
|
+
export class EmbeddingService {
|
|
50
|
+
client;
|
|
51
|
+
batchSize;
|
|
52
|
+
constructor(options) {
|
|
53
|
+
this.client = options?.client ?? getEmbeddingClient();
|
|
54
|
+
this.batchSize = options?.batchSize ?? DEFAULT_BATCH_SIZE;
|
|
55
|
+
}
|
|
56
|
+
async embedDocumentChunks(db, vectorService, chunks, documentInfo) {
|
|
57
|
+
if (chunks.length === 0) {
|
|
58
|
+
return { success: true, embeddingIds: [], provenanceIds: [], totalChunks: 0, elapsedMs: 0 };
|
|
59
|
+
}
|
|
60
|
+
const startMs = Date.now();
|
|
61
|
+
const vectors = await this.client.embedChunks(chunks.map((c) => buildSectionPrefix(c) + normalizeForEmbedding(c.text)), this.batchSize);
|
|
62
|
+
if (vectors.length !== chunks.length) {
|
|
63
|
+
throw new EmbeddingError(`Vector count mismatch: got ${vectors.length}, expected ${chunks.length}`, 'EMBEDDING_FAILED', { vectorCount: vectors.length, chunkCount: chunks.length });
|
|
64
|
+
}
|
|
65
|
+
// Get actual device from last successful embedding operation
|
|
66
|
+
const actualDevice = this.client.getLastDevice();
|
|
67
|
+
const result = db.transaction(() => {
|
|
68
|
+
const embeddingIds = [];
|
|
69
|
+
const provenanceIds = [];
|
|
70
|
+
// H-7/M-16: Sub-batch vector storage to avoid accumulating all Float32Array vectors in memory
|
|
71
|
+
const VECTOR_SUB_BATCH = 50;
|
|
72
|
+
let vectorBatch = [];
|
|
73
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
74
|
+
const chunk = chunks[i];
|
|
75
|
+
const vector = vectors[i];
|
|
76
|
+
const embeddingId = uuidv4();
|
|
77
|
+
const now = new Date().toISOString();
|
|
78
|
+
const provenanceId = this.createProvenance(db, chunk, documentInfo, actualDevice);
|
|
79
|
+
provenanceIds.push(provenanceId);
|
|
80
|
+
const embedding = {
|
|
81
|
+
id: embeddingId,
|
|
82
|
+
chunk_id: chunk.id,
|
|
83
|
+
image_id: null, // Text embeddings don't have an image
|
|
84
|
+
extraction_id: null, // Text embeddings don't have an extraction
|
|
85
|
+
document_id: documentInfo.documentId,
|
|
86
|
+
original_text: chunk.text,
|
|
87
|
+
original_text_length: chunk.text.length,
|
|
88
|
+
source_file_path: documentInfo.filePath,
|
|
89
|
+
source_file_name: documentInfo.fileName,
|
|
90
|
+
source_file_hash: documentInfo.fileHash,
|
|
91
|
+
page_number: chunk.page_number,
|
|
92
|
+
page_range: chunk.page_range,
|
|
93
|
+
character_start: chunk.character_start,
|
|
94
|
+
character_end: chunk.character_end,
|
|
95
|
+
chunk_index: chunk.chunk_index,
|
|
96
|
+
total_chunks: chunks.length,
|
|
97
|
+
model_name: MODEL_NAME,
|
|
98
|
+
model_version: MODEL_VERSION,
|
|
99
|
+
task_type: 'search_document',
|
|
100
|
+
inference_mode: 'local',
|
|
101
|
+
gpu_device: actualDevice,
|
|
102
|
+
provenance_id: provenanceId,
|
|
103
|
+
content_hash: computeHash(chunk.text),
|
|
104
|
+
generation_duration_ms: null,
|
|
105
|
+
};
|
|
106
|
+
db.insertEmbedding(embedding);
|
|
107
|
+
embeddingIds.push(embeddingId);
|
|
108
|
+
vectorBatch.push({ embeddingId, vector });
|
|
109
|
+
// H-7/M-16: Flush vector sub-batch to avoid accumulating all vectors in memory
|
|
110
|
+
if (vectorBatch.length >= VECTOR_SUB_BATCH) {
|
|
111
|
+
vectorService.batchStoreVectors(vectorBatch);
|
|
112
|
+
vectorBatch = [];
|
|
113
|
+
}
|
|
114
|
+
db.updateChunkEmbeddingStatus(chunk.id, 'complete', now);
|
|
115
|
+
}
|
|
116
|
+
// Flush remaining vectors
|
|
117
|
+
if (vectorBatch.length > 0) {
|
|
118
|
+
vectorService.batchStoreVectors(vectorBatch);
|
|
119
|
+
}
|
|
120
|
+
return { embeddingIds, provenanceIds };
|
|
121
|
+
});
|
|
122
|
+
return {
|
|
123
|
+
success: true,
|
|
124
|
+
embeddingIds: result.embeddingIds,
|
|
125
|
+
provenanceIds: result.provenanceIds,
|
|
126
|
+
totalChunks: chunks.length,
|
|
127
|
+
elapsedMs: Date.now() - startMs,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
async embedSearchQuery(query) {
|
|
131
|
+
return this.client.embedQuery(query);
|
|
132
|
+
}
|
|
133
|
+
async processPendingChunks(db, vectorService, documentInfo) {
|
|
134
|
+
const allChunks = db.getChunksByDocumentId(documentInfo.documentId);
|
|
135
|
+
const pendingChunks = allChunks.filter((c) => c.embedding_status === 'pending');
|
|
136
|
+
if (pendingChunks.length === 0) {
|
|
137
|
+
return { success: true, embeddingIds: [], provenanceIds: [], totalChunks: 0, elapsedMs: 0 };
|
|
138
|
+
}
|
|
139
|
+
return this.embedDocumentChunks(db, vectorService, pendingChunks, documentInfo);
|
|
140
|
+
}
|
|
141
|
+
createProvenance(db, chunk, documentInfo, device) {
|
|
142
|
+
const provenanceId = uuidv4();
|
|
143
|
+
const now = new Date().toISOString();
|
|
144
|
+
const chunkProv = db.getProvenance(chunk.provenance_id);
|
|
145
|
+
const existingParents = chunkProv?.parent_ids
|
|
146
|
+
? JSON.parse(chunkProv.parent_ids)
|
|
147
|
+
: [];
|
|
148
|
+
const parentIds = [...existingParents, chunk.provenance_id];
|
|
149
|
+
const record = {
|
|
150
|
+
id: provenanceId,
|
|
151
|
+
type: 'EMBEDDING',
|
|
152
|
+
created_at: now,
|
|
153
|
+
processed_at: now,
|
|
154
|
+
source_file_created_at: null,
|
|
155
|
+
source_file_modified_at: null,
|
|
156
|
+
source_type: 'EMBEDDING',
|
|
157
|
+
source_path: null,
|
|
158
|
+
source_id: chunk.provenance_id,
|
|
159
|
+
root_document_id: documentInfo.documentProvenanceId,
|
|
160
|
+
location: {
|
|
161
|
+
chunk_index: chunk.chunk_index,
|
|
162
|
+
character_start: chunk.character_start,
|
|
163
|
+
character_end: chunk.character_end,
|
|
164
|
+
page_number: chunk.page_number ?? undefined,
|
|
165
|
+
},
|
|
166
|
+
content_hash: computeHash(chunk.text),
|
|
167
|
+
input_hash: chunk.text_hash,
|
|
168
|
+
file_hash: documentInfo.fileHash,
|
|
169
|
+
processor: MODEL_NAME,
|
|
170
|
+
processor_version: SECTION_AWARE_VERSION,
|
|
171
|
+
processing_params: {
|
|
172
|
+
dimensions: EMBEDDING_DIM,
|
|
173
|
+
task_type: 'search_document',
|
|
174
|
+
inference_mode: 'local',
|
|
175
|
+
device,
|
|
176
|
+
dtype: 'float16',
|
|
177
|
+
batch_size: this.batchSize,
|
|
178
|
+
section_aware: true,
|
|
179
|
+
},
|
|
180
|
+
processing_duration_ms: null,
|
|
181
|
+
processing_quality_score: null,
|
|
182
|
+
parent_id: chunk.provenance_id,
|
|
183
|
+
parent_ids: JSON.stringify(parentIds),
|
|
184
|
+
chain_depth: 3,
|
|
185
|
+
chain_path: CHAIN_PATH,
|
|
186
|
+
};
|
|
187
|
+
db.insertProvenance(record);
|
|
188
|
+
return provenanceId;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
let _service = null;
|
|
192
|
+
export function getEmbeddingService() {
|
|
193
|
+
if (!_service) {
|
|
194
|
+
_service = new EmbeddingService();
|
|
195
|
+
}
|
|
196
|
+
return _service;
|
|
197
|
+
}
|
|
198
|
+
export function resetEmbeddingService() {
|
|
199
|
+
_service = null;
|
|
200
|
+
}
|
|
201
|
+
export { EmbeddingError };
|
|
202
|
+
//# sourceMappingURL=embedder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedder.js","sourceRoot":"","sources":["../../../src/services/embedding/embedder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NomicEmbeddingClient - TypeScript bridge to python/embedding_worker.py
|
|
3
|
+
*
|
|
4
|
+
* CP-004: Local GPU inference ONLY - throws EmbeddingError on GPU unavailable.
|
|
5
|
+
* NO cloud fallback, NO CPU fallback. FAIL FAST with robust error logging.
|
|
6
|
+
*
|
|
7
|
+
* @module services/embedding/nomic
|
|
8
|
+
*/
|
|
9
|
+
type EmbeddingErrorCode = 'GPU_NOT_AVAILABLE' | 'EMBEDDING_FAILED' | 'PARSE_ERROR' | 'WORKER_ERROR' | 'MODEL_NOT_FOUND';
|
|
10
|
+
export declare class EmbeddingError extends Error {
|
|
11
|
+
readonly code: EmbeddingErrorCode;
|
|
12
|
+
readonly details?: Record<string, unknown> | undefined;
|
|
13
|
+
constructor(message: string, code: EmbeddingErrorCode, details?: Record<string, unknown> | undefined);
|
|
14
|
+
}
|
|
15
|
+
export declare const EMBEDDING_DIM = 768;
|
|
16
|
+
export declare const MODEL_NAME = "nomic-embed-text-v1.5";
|
|
17
|
+
export declare const MODEL_VERSION = "1.5.0";
|
|
18
|
+
export declare const DEFAULT_BATCH_SIZE = 64;
|
|
19
|
+
export declare class NomicEmbeddingClient {
|
|
20
|
+
private readonly workerPath;
|
|
21
|
+
private readonly pythonPath;
|
|
22
|
+
private _lastDevice;
|
|
23
|
+
constructor(options?: {
|
|
24
|
+
workerPath?: string;
|
|
25
|
+
pythonPath?: string;
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* Maximum chunks per Python worker call to prevent memory issues.
|
|
29
|
+
* Reduced from 500 to 100: XLSX audit trails produce 37K+ chunks,
|
|
30
|
+
* and 500 chunks at once causes CUDA driver-level OOM during tokenization
|
|
31
|
+
* (not caught by PyTorch's OOM recovery).
|
|
32
|
+
*/
|
|
33
|
+
private static readonly MAX_CHUNKS_PER_CALL;
|
|
34
|
+
/**
|
|
35
|
+
* DC-01: Read embedding_batch_size from server config if available,
|
|
36
|
+
* falling back to the caller-provided value or DEFAULT_BATCH_SIZE.
|
|
37
|
+
* DC-02: Read embedding_device from server config if available,
|
|
38
|
+
* falling back to the Python worker's auto-detection.
|
|
39
|
+
*/
|
|
40
|
+
private getEffectiveBatchSize;
|
|
41
|
+
private getEffectiveDevice;
|
|
42
|
+
embedChunks(chunks: string[], batchSize?: number): Promise<Float32Array[]>;
|
|
43
|
+
/**
|
|
44
|
+
* Process chunks in sub-batches, calling Python worker multiple times.
|
|
45
|
+
* Prevents memory exhaustion for large documents (1000+ chunks).
|
|
46
|
+
*/
|
|
47
|
+
private embedChunksInBatches;
|
|
48
|
+
/**
|
|
49
|
+
* Embed a single batch of chunks via Python worker.
|
|
50
|
+
*/
|
|
51
|
+
private embedChunksSingle;
|
|
52
|
+
/**
|
|
53
|
+
* Get the device used by the last successful embedding operation.
|
|
54
|
+
* Populated by the Python worker result (e.g., 'cuda:0', 'cpu', 'mps').
|
|
55
|
+
*/
|
|
56
|
+
getLastDevice(): string;
|
|
57
|
+
embedQuery(query: string): Promise<Float32Array>;
|
|
58
|
+
/** Embedding worker timeout: 5 minutes (CUDA hang protection) */
|
|
59
|
+
private static readonly WORKER_TIMEOUT_MS;
|
|
60
|
+
/** Max stderr accumulation: 10KB */
|
|
61
|
+
private static readonly MAX_STDERR_LENGTH;
|
|
62
|
+
private runWorker;
|
|
63
|
+
private classifyError;
|
|
64
|
+
}
|
|
65
|
+
export declare function getEmbeddingClient(): NomicEmbeddingClient;
|
|
66
|
+
export {};
|
|
67
|
+
//# sourceMappingURL=nomic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nomic.d.ts","sourceRoot":"","sources":["../../../src/services/embedding/nomic.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,KAAK,kBAAkB,GACnB,mBAAmB,GACnB,kBAAkB,GAClB,aAAa,GACb,cAAc,GACd,iBAAiB,CAAC;AAEtB,qBAAa,cAAe,SAAQ,KAAK;aAGrB,IAAI,EAAE,kBAAkB;aACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFjD,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,kBAAkB,EACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAMpD;AA2BD,eAAO,MAAM,aAAa,MAAM,CAAC;AACjC,eAAO,MAAM,UAAU,0BAA0B,CAAC;AAClD,eAAO,MAAM,aAAa,UAAU,CAAC;AACrC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,WAAW,CAAqB;gBAE5B,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAMlE;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAO;IAElD;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,kBAAkB;IAIpB,WAAW,CACf,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,YAAY,EAAE,CAAC;IAc1B;;;OAGG;YACW,oBAAoB;IAoBlC;;OAEG;YACW,iBAAiB;IA2C/B;;;OAGG;IACH,aAAa,IAAI,MAAM;IAIjB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAkCtD,iEAAiE;IACjE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAW;IAEpD,oCAAoC;IACpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAU;YAErC,SAAS;IAsJvB,OAAO,CAAC,aAAa;CAetB;AAID,wBAAgB,kBAAkB,IAAI,oBAAoB,CAKzD"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NomicEmbeddingClient - TypeScript bridge to python/embedding_worker.py
|
|
3
|
+
*
|
|
4
|
+
* CP-004: Local GPU inference ONLY - throws EmbeddingError on GPU unavailable.
|
|
5
|
+
* NO cloud fallback, NO CPU fallback. FAIL FAST with robust error logging.
|
|
6
|
+
*
|
|
7
|
+
* @module services/embedding/nomic
|
|
8
|
+
*/
|
|
9
|
+
import { PythonShell } from 'python-shell';
|
|
10
|
+
import path from 'path';
|
|
11
|
+
import { fileURLToPath } from 'url';
|
|
12
|
+
import { state } from '../../server/state.js';
|
|
13
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
14
|
+
export class EmbeddingError extends Error {
|
|
15
|
+
code;
|
|
16
|
+
details;
|
|
17
|
+
constructor(message, code, details) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.code = code;
|
|
20
|
+
this.details = details;
|
|
21
|
+
this.name = 'EmbeddingError';
|
|
22
|
+
Error.captureStackTrace?.(this, EmbeddingError);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export const EMBEDDING_DIM = 768;
|
|
26
|
+
export const MODEL_NAME = 'nomic-embed-text-v1.5';
|
|
27
|
+
export const MODEL_VERSION = '1.5.0';
|
|
28
|
+
export const DEFAULT_BATCH_SIZE = 64;
|
|
29
|
+
export class NomicEmbeddingClient {
|
|
30
|
+
workerPath;
|
|
31
|
+
pythonPath;
|
|
32
|
+
_lastDevice = 'unknown';
|
|
33
|
+
constructor(options) {
|
|
34
|
+
this.workerPath =
|
|
35
|
+
options?.workerPath ?? path.resolve(__dirname, '../../../python/embedding_worker.py');
|
|
36
|
+
this.pythonPath = options?.pythonPath;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Maximum chunks per Python worker call to prevent memory issues.
|
|
40
|
+
* Reduced from 500 to 100: XLSX audit trails produce 37K+ chunks,
|
|
41
|
+
* and 500 chunks at once causes CUDA driver-level OOM during tokenization
|
|
42
|
+
* (not caught by PyTorch's OOM recovery).
|
|
43
|
+
*/
|
|
44
|
+
static MAX_CHUNKS_PER_CALL = 100;
|
|
45
|
+
/**
|
|
46
|
+
* DC-01: Read embedding_batch_size from server config if available,
|
|
47
|
+
* falling back to the caller-provided value or DEFAULT_BATCH_SIZE.
|
|
48
|
+
* DC-02: Read embedding_device from server config if available,
|
|
49
|
+
* falling back to the Python worker's auto-detection.
|
|
50
|
+
*/
|
|
51
|
+
getEffectiveBatchSize(callerBatchSize) {
|
|
52
|
+
const configBatchSize = state.config?.embeddingBatchSize;
|
|
53
|
+
return configBatchSize && configBatchSize > 0 ? configBatchSize : callerBatchSize;
|
|
54
|
+
}
|
|
55
|
+
getEffectiveDevice() {
|
|
56
|
+
return state.config?.embeddingDevice || undefined;
|
|
57
|
+
}
|
|
58
|
+
async embedChunks(chunks, batchSize = DEFAULT_BATCH_SIZE) {
|
|
59
|
+
// Empty input returns empty output
|
|
60
|
+
if (chunks.length === 0) {
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
// For large chunk counts, process in sub-batches to prevent memory issues
|
|
64
|
+
if (chunks.length > NomicEmbeddingClient.MAX_CHUNKS_PER_CALL) {
|
|
65
|
+
return this.embedChunksInBatches(chunks, batchSize);
|
|
66
|
+
}
|
|
67
|
+
return this.embedChunksSingle(chunks, batchSize);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Process chunks in sub-batches, calling Python worker multiple times.
|
|
71
|
+
* Prevents memory exhaustion for large documents (1000+ chunks).
|
|
72
|
+
*/
|
|
73
|
+
async embedChunksInBatches(chunks, batchSize) {
|
|
74
|
+
const allEmbeddings = [];
|
|
75
|
+
const maxPerCall = NomicEmbeddingClient.MAX_CHUNKS_PER_CALL;
|
|
76
|
+
for (let i = 0; i < chunks.length; i += maxPerCall) {
|
|
77
|
+
const batch = chunks.slice(i, i + maxPerCall);
|
|
78
|
+
const batchNum = Math.floor(i / maxPerCall) + 1;
|
|
79
|
+
const totalBatches = Math.ceil(chunks.length / maxPerCall);
|
|
80
|
+
console.error(`[EMBED] Processing batch ${batchNum}/${totalBatches} (${batch.length} chunks)`);
|
|
81
|
+
const embeddings = await this.embedChunksSingle(batch, batchSize);
|
|
82
|
+
allEmbeddings.push(...embeddings);
|
|
83
|
+
}
|
|
84
|
+
return allEmbeddings;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Embed a single batch of chunks via Python worker.
|
|
88
|
+
*/
|
|
89
|
+
async embedChunksSingle(chunks, batchSize) {
|
|
90
|
+
// DC-01: Use config-aware batch size; DC-02: Use config-aware device
|
|
91
|
+
const effectiveBatchSize = this.getEffectiveBatchSize(batchSize);
|
|
92
|
+
const args = ['--stdin', '--batch-size', effectiveBatchSize.toString(), '--json'];
|
|
93
|
+
const device = this.getEffectiveDevice();
|
|
94
|
+
if (device) {
|
|
95
|
+
args.push('--device', device);
|
|
96
|
+
}
|
|
97
|
+
// Use stdin for reliability with special characters and large inputs
|
|
98
|
+
const result = await this.runWorker(args, JSON.stringify(chunks));
|
|
99
|
+
if (!result.success) {
|
|
100
|
+
throw new EmbeddingError(result.error ?? 'Embedding generation failed with no error message', this.classifyError(result.error), {
|
|
101
|
+
count: chunks.length,
|
|
102
|
+
batchSize,
|
|
103
|
+
device: result.device,
|
|
104
|
+
elapsed_ms: result.elapsed_ms,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
// Validate output dimensions
|
|
108
|
+
for (let i = 0; i < result.embeddings.length; i++) {
|
|
109
|
+
if (result.embeddings[i].length !== EMBEDDING_DIM) {
|
|
110
|
+
throw new EmbeddingError(`Embedding ${i} has wrong dimensions: ${result.embeddings[i].length}, expected ${EMBEDDING_DIM}`, 'EMBEDDING_FAILED', { index: i, actualDim: result.embeddings[i].length });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Track actual device used (from Python worker result)
|
|
114
|
+
this._lastDevice = result.device ?? 'unknown';
|
|
115
|
+
// Convert to Float32Array for efficient storage
|
|
116
|
+
return result.embeddings.map((e) => new Float32Array(e));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get the device used by the last successful embedding operation.
|
|
120
|
+
* Populated by the Python worker result (e.g., 'cuda:0', 'cpu', 'mps').
|
|
121
|
+
*/
|
|
122
|
+
getLastDevice() {
|
|
123
|
+
return this._lastDevice;
|
|
124
|
+
}
|
|
125
|
+
async embedQuery(query) {
|
|
126
|
+
if (!query || query.trim().length === 0) {
|
|
127
|
+
throw new EmbeddingError('Query cannot be empty', 'EMBEDDING_FAILED', { query });
|
|
128
|
+
}
|
|
129
|
+
// DC-02: Pass configured device to query embedding worker
|
|
130
|
+
const queryArgs = ['--query', query, '--json'];
|
|
131
|
+
const device = this.getEffectiveDevice();
|
|
132
|
+
if (device) {
|
|
133
|
+
queryArgs.push('--device', device);
|
|
134
|
+
}
|
|
135
|
+
const result = await this.runWorker(queryArgs);
|
|
136
|
+
if (!result.success) {
|
|
137
|
+
throw new EmbeddingError(result.error ?? 'Query embedding failed with no error message', this.classifyError(result.error), { query: query.substring(0, 100), device: result.device });
|
|
138
|
+
}
|
|
139
|
+
// Validate dimensions
|
|
140
|
+
if (result.embedding.length !== EMBEDDING_DIM) {
|
|
141
|
+
throw new EmbeddingError(`Query embedding has wrong dimensions: ${result.embedding.length}, expected ${EMBEDDING_DIM}`, 'EMBEDDING_FAILED', { actualDim: result.embedding.length });
|
|
142
|
+
}
|
|
143
|
+
return new Float32Array(result.embedding);
|
|
144
|
+
}
|
|
145
|
+
/** Embedding worker timeout: 5 minutes (CUDA hang protection) */
|
|
146
|
+
static WORKER_TIMEOUT_MS = 300_000;
|
|
147
|
+
/** Max stderr accumulation: 10KB */
|
|
148
|
+
static MAX_STDERR_LENGTH = 10_240;
|
|
149
|
+
async runWorker(args, stdin) {
|
|
150
|
+
return new Promise((resolve, reject) => {
|
|
151
|
+
let settled = false;
|
|
152
|
+
const options = {
|
|
153
|
+
mode: 'text',
|
|
154
|
+
pythonPath: this.pythonPath,
|
|
155
|
+
pythonOptions: ['-u'],
|
|
156
|
+
args,
|
|
157
|
+
};
|
|
158
|
+
const shell = new PythonShell(this.workerPath, options);
|
|
159
|
+
let stderr = '';
|
|
160
|
+
let sigkillTimer = null;
|
|
161
|
+
const cleanup = () => {
|
|
162
|
+
if (sigkillTimer) {
|
|
163
|
+
clearTimeout(sigkillTimer);
|
|
164
|
+
sigkillTimer = null;
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
// Timeout: kill the Python process if CUDA hangs
|
|
168
|
+
const timer = setTimeout(() => {
|
|
169
|
+
if (settled)
|
|
170
|
+
return;
|
|
171
|
+
try {
|
|
172
|
+
shell.kill();
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
console.error('[NomicEmbedding] Failed to kill shell on timeout:', error instanceof Error ? error.message : String(error));
|
|
176
|
+
/* ignore */
|
|
177
|
+
}
|
|
178
|
+
// M-6: SIGKILL escalation if SIGTERM doesn't exit within 5s
|
|
179
|
+
sigkillTimer = setTimeout(() => {
|
|
180
|
+
if (!settled) {
|
|
181
|
+
console.error(`[NomicEmbedding] Process did not exit after SIGTERM, sending SIGKILL (pid: ${shell.childProcess?.pid})`);
|
|
182
|
+
try {
|
|
183
|
+
shell.childProcess?.kill('SIGKILL');
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
console.error('[NomicEmbedding] Failed to SIGKILL process (may already be gone):', error instanceof Error ? error.message : String(error));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (!settled) {
|
|
190
|
+
settled = true;
|
|
191
|
+
reject(new EmbeddingError(`Embedding worker timeout after ${NomicEmbeddingClient.WORKER_TIMEOUT_MS}ms (SIGKILL after 5s grace)`, 'WORKER_ERROR', { stderr: stderr.substring(0, 1000) }));
|
|
192
|
+
}
|
|
193
|
+
}, 5000);
|
|
194
|
+
}, NomicEmbeddingClient.WORKER_TIMEOUT_MS);
|
|
195
|
+
const outputChunks = [];
|
|
196
|
+
shell.on('message', (msg) => {
|
|
197
|
+
outputChunks.push(msg);
|
|
198
|
+
});
|
|
199
|
+
shell.on('stderr', (err) => {
|
|
200
|
+
// Cap stderr accumulation to prevent unbounded memory growth
|
|
201
|
+
if (stderr.length < NomicEmbeddingClient.MAX_STDERR_LENGTH) {
|
|
202
|
+
stderr += err + '\n';
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
const handleEnd = (err) => {
|
|
206
|
+
clearTimeout(timer);
|
|
207
|
+
cleanup();
|
|
208
|
+
if (settled)
|
|
209
|
+
return;
|
|
210
|
+
settled = true;
|
|
211
|
+
if (err) {
|
|
212
|
+
console.error('[EmbeddingWorker] Error:', err.message);
|
|
213
|
+
if (stderr)
|
|
214
|
+
console.error('[EmbeddingWorker] Stderr:', stderr.substring(0, 1000));
|
|
215
|
+
reject(new EmbeddingError(`Worker error: ${err.message}`, this.classifyError(stderr || err.message), { stderr: stderr.substring(0, 1000), stack: err.stack }));
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const output = outputChunks.join('\n');
|
|
219
|
+
if (!output.trim()) {
|
|
220
|
+
reject(new EmbeddingError('Worker produced no output', 'WORKER_ERROR', {
|
|
221
|
+
stderr: stderr.substring(0, 1000),
|
|
222
|
+
}));
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
// Parse the last JSON line (torch/sentence_transformers may output non-JSON to stdout)
|
|
226
|
+
const lines = output.trim().split('\n');
|
|
227
|
+
let parsed;
|
|
228
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
229
|
+
try {
|
|
230
|
+
parsed = JSON.parse(lines[i].trim());
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
console.error('[NomicEmbedding] JSON parse failed for output line, trying previous:', error instanceof Error ? error.message : String(error));
|
|
235
|
+
/* not JSON, try previous line */
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (parsed !== undefined) {
|
|
239
|
+
// Basic structural validation: worker output must be an object or array
|
|
240
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
241
|
+
reject(new EmbeddingError(`Worker returned unexpected type "${typeof parsed}" instead of object/array`, 'PARSE_ERROR', { output: output.substring(0, 1000) }));
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
resolve(parsed);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
console.error('[EmbeddingWorker] Parse error: no valid JSON in output');
|
|
248
|
+
console.error('[EmbeddingWorker] Raw output:', output.substring(0, 500));
|
|
249
|
+
reject(new EmbeddingError('Failed to parse worker output as JSON', 'PARSE_ERROR', {
|
|
250
|
+
output: output.substring(0, 1000),
|
|
251
|
+
stderr: stderr.substring(0, 1000),
|
|
252
|
+
}));
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
if (stdin)
|
|
256
|
+
shell.send(stdin);
|
|
257
|
+
shell.end(handleEnd);
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
classifyError(error) {
|
|
261
|
+
if (!error)
|
|
262
|
+
return 'EMBEDDING_FAILED';
|
|
263
|
+
const lower = error.toLowerCase();
|
|
264
|
+
if (lower.includes('gpu') || lower.includes('cuda') || lower.includes('no device')) {
|
|
265
|
+
return 'GPU_NOT_AVAILABLE';
|
|
266
|
+
}
|
|
267
|
+
if (lower.includes('model not found') || lower.includes('no such file')) {
|
|
268
|
+
return 'MODEL_NOT_FOUND';
|
|
269
|
+
}
|
|
270
|
+
return 'EMBEDDING_FAILED';
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
let _client = null;
|
|
274
|
+
export function getEmbeddingClient() {
|
|
275
|
+
if (!_client) {
|
|
276
|
+
_client = new NomicEmbeddingClient();
|
|
277
|
+
}
|
|
278
|
+
return _client;
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=nomic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nomic.js","sourceRoot":"","sources":["../../../src/services/embedding/nomic.ts"],"names":[],"mappings":"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"}
|