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,536 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProvenanceVerifier - Hash integrity and chain verification
|
|
3
|
+
*
|
|
4
|
+
* Constitution Compliance:
|
|
5
|
+
* - CP-003: Immutable Hash Verification
|
|
6
|
+
* - CP-001: Complete Provenance Chain
|
|
7
|
+
*
|
|
8
|
+
* FAIL FAST: All errors throw immediately
|
|
9
|
+
* NO MOCKS: Tests use real DatabaseService
|
|
10
|
+
*/
|
|
11
|
+
import fs from 'fs';
|
|
12
|
+
import { ProvenanceErrorCode } from './tracker.js';
|
|
13
|
+
import { ProvenanceType } from '../../models/provenance.js';
|
|
14
|
+
import { computeHash, hashFile, isValidHashFormat } from '../../utils/hash.js';
|
|
15
|
+
import { rowToDocument, rowToOCRResult, rowToChunk, rowToEmbedding, rowToProvenance, rowToImage, } from '../storage/database/converters.js';
|
|
16
|
+
/** Error codes for verifier operations */
|
|
17
|
+
export const VerifierErrorCode = {
|
|
18
|
+
...ProvenanceErrorCode,
|
|
19
|
+
INTEGRITY_FAILED: 'INTEGRITY_VERIFICATION_FAILED',
|
|
20
|
+
CONTENT_NOT_FOUND: 'CONTENT_NOT_FOUND',
|
|
21
|
+
FILE_NOT_FOUND: 'SOURCE_FILE_NOT_FOUND',
|
|
22
|
+
HASH_FORMAT_INVALID: 'HASH_FORMAT_INVALID',
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* VerifierError - Typed error for verification operations
|
|
26
|
+
* FAIL FAST: Always throw with detailed error information
|
|
27
|
+
*/
|
|
28
|
+
export class VerifierError extends Error {
|
|
29
|
+
code;
|
|
30
|
+
details;
|
|
31
|
+
constructor(message, code, details) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.code = code;
|
|
34
|
+
this.details = details;
|
|
35
|
+
this.name = 'VerifierError';
|
|
36
|
+
Object.setPrototypeOf(this, VerifierError.prototype);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* ProvenanceVerifier - Hash integrity and chain verification
|
|
41
|
+
*
|
|
42
|
+
* Provides verification for:
|
|
43
|
+
* 1. Single provenance record content hash
|
|
44
|
+
* 2. Complete provenance chain integrity
|
|
45
|
+
* 3. Database-wide verification
|
|
46
|
+
* 4. Source file integrity
|
|
47
|
+
*/
|
|
48
|
+
export class ProvenanceVerifier {
|
|
49
|
+
db;
|
|
50
|
+
tracker;
|
|
51
|
+
rawDb;
|
|
52
|
+
constructor(db, tracker) {
|
|
53
|
+
this.db = db;
|
|
54
|
+
this.tracker = tracker;
|
|
55
|
+
this.rawDb = db.getConnection();
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Verify content hash for a single provenance record
|
|
59
|
+
*
|
|
60
|
+
* @param provenanceId - Provenance record ID to verify
|
|
61
|
+
* @returns Verification result with computed and expected hashes
|
|
62
|
+
* @throws VerifierError if provenance not found, content not found, or file not accessible
|
|
63
|
+
*/
|
|
64
|
+
async verifyContentHash(provenanceId) {
|
|
65
|
+
// Get provenance record - throws if not found
|
|
66
|
+
const record = this.tracker.getProvenanceById(provenanceId);
|
|
67
|
+
// Get content and expected hash based on type
|
|
68
|
+
const { content, expectedHash, isFile } = this.getContentForVerification(record);
|
|
69
|
+
// Validate expected hash format
|
|
70
|
+
const formatValid = isValidHashFormat(expectedHash);
|
|
71
|
+
// Compute hash of content
|
|
72
|
+
let computedHash;
|
|
73
|
+
if (isFile && typeof content === 'string') {
|
|
74
|
+
// For files, content is the file path - hash the file
|
|
75
|
+
computedHash = await hashFile(content);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// For text content, compute hash directly
|
|
79
|
+
computedHash = computeHash(content);
|
|
80
|
+
}
|
|
81
|
+
const valid = formatValid && computedHash === expectedHash;
|
|
82
|
+
return {
|
|
83
|
+
valid,
|
|
84
|
+
item_id: provenanceId,
|
|
85
|
+
item_type: record.type,
|
|
86
|
+
expected_hash: expectedHash,
|
|
87
|
+
computed_hash: computedHash,
|
|
88
|
+
format_valid: formatValid,
|
|
89
|
+
verified_at: new Date().toISOString(),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Verify complete provenance chain from item to root
|
|
94
|
+
*
|
|
95
|
+
* @param provenanceId - Starting provenance record ID
|
|
96
|
+
* @returns Chain verification result with all failing items
|
|
97
|
+
* @throws VerifierError if chain broken or item not found
|
|
98
|
+
*/
|
|
99
|
+
async verifyChain(provenanceId) {
|
|
100
|
+
// Get chain using tracker - throws if not found
|
|
101
|
+
const chain = this.tracker.getProvenanceChain(provenanceId);
|
|
102
|
+
const failedItems = [];
|
|
103
|
+
let hashesVerified = 0;
|
|
104
|
+
let hashesFailed = 0;
|
|
105
|
+
// Verify each record in the chain: current + ancestors
|
|
106
|
+
const allRecords = [chain.current, ...chain.ancestors];
|
|
107
|
+
for (const record of allRecords) {
|
|
108
|
+
try {
|
|
109
|
+
const result = await this.verifyContentHash(record.id);
|
|
110
|
+
if (result.valid) {
|
|
111
|
+
hashesVerified++;
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
hashesFailed++;
|
|
115
|
+
failedItems.push({
|
|
116
|
+
id: record.id,
|
|
117
|
+
expected_hash: result.expected_hash,
|
|
118
|
+
computed_hash: result.computed_hash,
|
|
119
|
+
type: record.type,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
// Content not found or file not accessible - count as failure
|
|
125
|
+
hashesFailed++;
|
|
126
|
+
failedItems.push({
|
|
127
|
+
id: record.id,
|
|
128
|
+
expected_hash: record.content_hash,
|
|
129
|
+
computed_hash: 'ERROR: ' + (error instanceof Error ? error.message : 'Unknown error'),
|
|
130
|
+
type: record.type,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const valid = hashesFailed === 0 && chain.isComplete;
|
|
135
|
+
return {
|
|
136
|
+
valid,
|
|
137
|
+
chain_intact: chain.isComplete,
|
|
138
|
+
hashes_verified: hashesVerified,
|
|
139
|
+
hashes_failed: hashesFailed,
|
|
140
|
+
failed_items: failedItems,
|
|
141
|
+
verified_at: new Date().toISOString(),
|
|
142
|
+
start_id: provenanceId,
|
|
143
|
+
chain_depth: chain.depth,
|
|
144
|
+
root_document_id: chain.root.root_document_id,
|
|
145
|
+
chain_length: allRecords.length,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Verify all provenance records in database
|
|
150
|
+
*
|
|
151
|
+
* @returns Database verification result with counts by type
|
|
152
|
+
*/
|
|
153
|
+
async verifyDatabase() {
|
|
154
|
+
const startTime = Date.now();
|
|
155
|
+
const allProvenance = this.getAllProvenance();
|
|
156
|
+
// H-6: Cap failedItems to prevent unbounded memory growth
|
|
157
|
+
const MAX_FAILED_ITEMS = 1000;
|
|
158
|
+
const failedItems = [];
|
|
159
|
+
let failedOverflow = 0;
|
|
160
|
+
let hashesVerified = 0;
|
|
161
|
+
let hashesFailed = 0;
|
|
162
|
+
let documentsVerified = 0;
|
|
163
|
+
let ocrResultsVerified = 0;
|
|
164
|
+
let chunksVerified = 0;
|
|
165
|
+
let embeddingsVerified = 0;
|
|
166
|
+
let imagesVerified = 0;
|
|
167
|
+
let vlmDescriptionsVerified = 0;
|
|
168
|
+
for (const record of allProvenance) {
|
|
169
|
+
try {
|
|
170
|
+
const result = await this.verifyContentHash(record.id);
|
|
171
|
+
// Count by type
|
|
172
|
+
switch (record.type) {
|
|
173
|
+
case ProvenanceType.DOCUMENT:
|
|
174
|
+
documentsVerified++;
|
|
175
|
+
break;
|
|
176
|
+
case ProvenanceType.OCR_RESULT:
|
|
177
|
+
ocrResultsVerified++;
|
|
178
|
+
break;
|
|
179
|
+
case ProvenanceType.CHUNK:
|
|
180
|
+
chunksVerified++;
|
|
181
|
+
break;
|
|
182
|
+
case ProvenanceType.EMBEDDING:
|
|
183
|
+
embeddingsVerified++;
|
|
184
|
+
break;
|
|
185
|
+
case ProvenanceType.IMAGE:
|
|
186
|
+
imagesVerified++;
|
|
187
|
+
break;
|
|
188
|
+
case ProvenanceType.VLM_DESCRIPTION:
|
|
189
|
+
vlmDescriptionsVerified++;
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
if (result.valid) {
|
|
193
|
+
hashesVerified++;
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
hashesFailed++;
|
|
197
|
+
if (failedItems.length < MAX_FAILED_ITEMS) {
|
|
198
|
+
failedItems.push({
|
|
199
|
+
id: record.id,
|
|
200
|
+
expected_hash: result.expected_hash,
|
|
201
|
+
computed_hash: result.computed_hash,
|
|
202
|
+
type: record.type,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
failedOverflow++;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
hashesFailed++;
|
|
212
|
+
if (failedItems.length < MAX_FAILED_ITEMS) {
|
|
213
|
+
failedItems.push({
|
|
214
|
+
id: record.id,
|
|
215
|
+
expected_hash: record.content_hash,
|
|
216
|
+
computed_hash: 'ERROR: ' + (error instanceof Error ? error.message : 'Unknown error'),
|
|
217
|
+
type: record.type,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
failedOverflow++;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
const durationMs = Date.now() - startTime;
|
|
226
|
+
// Chain integrity check: verify all parent_id references exist and depths are correct
|
|
227
|
+
let chainIntact = true;
|
|
228
|
+
const chainErrors = [];
|
|
229
|
+
const parentedRecords = this.rawDb
|
|
230
|
+
.prepare(`SELECT id, parent_id, type, chain_depth FROM provenance WHERE parent_id IS NOT NULL`)
|
|
231
|
+
.all();
|
|
232
|
+
for (const record of parentedRecords) {
|
|
233
|
+
const parent = this.rawDb
|
|
234
|
+
.prepare('SELECT id, chain_depth FROM provenance WHERE id = ?')
|
|
235
|
+
.get(record.parent_id);
|
|
236
|
+
if (!parent) {
|
|
237
|
+
chainIntact = false;
|
|
238
|
+
if (chainErrors.length < 10) {
|
|
239
|
+
chainErrors.push(`${record.id} (${record.type}): parent ${record.parent_id} not found`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
else if (parent.chain_depth !== record.chain_depth - 1) {
|
|
243
|
+
chainIntact = false;
|
|
244
|
+
if (chainErrors.length < 10) {
|
|
245
|
+
chainErrors.push(`${record.id} (${record.type}): depth ${record.chain_depth} but parent depth ${parent.chain_depth} (expected ${record.chain_depth - 1})`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return {
|
|
250
|
+
valid: hashesFailed === 0 && chainIntact,
|
|
251
|
+
chain_intact: chainIntact,
|
|
252
|
+
chain_errors: chainErrors.length > 0 ? chainErrors : undefined,
|
|
253
|
+
hashes_verified: hashesVerified,
|
|
254
|
+
hashes_failed: hashesFailed,
|
|
255
|
+
failed_items: failedItems,
|
|
256
|
+
verified_at: new Date().toISOString(),
|
|
257
|
+
database_name: this.getDatabaseName(),
|
|
258
|
+
documents_verified: documentsVerified,
|
|
259
|
+
ocr_results_verified: ocrResultsVerified,
|
|
260
|
+
chunks_verified: chunksVerified,
|
|
261
|
+
embeddings_verified: embeddingsVerified,
|
|
262
|
+
images_verified: imagesVerified,
|
|
263
|
+
vlm_descriptions_verified: vlmDescriptionsVerified,
|
|
264
|
+
duration_ms: durationMs,
|
|
265
|
+
failed_overflow: failedOverflow,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Verify source file still matches stored hash
|
|
270
|
+
*
|
|
271
|
+
* @param documentId - Document ID to verify
|
|
272
|
+
* @returns Verification result for the file
|
|
273
|
+
* @throws VerifierError if document not found or file not accessible
|
|
274
|
+
*/
|
|
275
|
+
async verifyFileIntegrity(documentId) {
|
|
276
|
+
// Get document
|
|
277
|
+
const doc = this.db.getDocument(documentId);
|
|
278
|
+
if (!doc) {
|
|
279
|
+
throw new VerifierError(`Document not found: ${documentId}`, VerifierErrorCode.NOT_FOUND, {
|
|
280
|
+
documentId,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
// Check file exists
|
|
284
|
+
if (!fs.existsSync(doc.file_path)) {
|
|
285
|
+
throw new VerifierError(`Source file not found: ${doc.file_path}`, VerifierErrorCode.FILE_NOT_FOUND, { documentId, filePath: doc.file_path });
|
|
286
|
+
}
|
|
287
|
+
// Hash the file
|
|
288
|
+
const computedHash = await hashFile(doc.file_path);
|
|
289
|
+
const expectedHash = doc.file_hash;
|
|
290
|
+
const formatValid = isValidHashFormat(expectedHash);
|
|
291
|
+
const valid = formatValid && computedHash === expectedHash;
|
|
292
|
+
return {
|
|
293
|
+
valid,
|
|
294
|
+
item_id: documentId,
|
|
295
|
+
item_type: ProvenanceType.DOCUMENT,
|
|
296
|
+
expected_hash: expectedHash,
|
|
297
|
+
computed_hash: computedHash,
|
|
298
|
+
format_valid: formatValid,
|
|
299
|
+
verified_at: new Date().toISOString(),
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
// ════════════════════════════════════════════════════════════════
|
|
303
|
+
// PRIVATE HELPER METHODS
|
|
304
|
+
// ════════════════════════════════════════════════════════════════
|
|
305
|
+
/**
|
|
306
|
+
* Get content and expected hash for a provenance record
|
|
307
|
+
* Returns { content, expectedHash, isFile } or throws if content not found
|
|
308
|
+
*
|
|
309
|
+
* CRITICAL MAPPING:
|
|
310
|
+
* - DOCUMENT: file_path → file_hash (via hashFile)
|
|
311
|
+
* - OCR_RESULT: extracted_text → content_hash
|
|
312
|
+
* - CHUNK: text → text_hash
|
|
313
|
+
* - EMBEDDING: original_text → content_hash
|
|
314
|
+
*/
|
|
315
|
+
getContentForVerification(record) {
|
|
316
|
+
switch (record.type) {
|
|
317
|
+
case ProvenanceType.DOCUMENT: {
|
|
318
|
+
// For DOCUMENT, we verify the file on disk using file_hash
|
|
319
|
+
// Query document by provenance_id since record.id IS the document's provenance_id
|
|
320
|
+
const doc = this.getDocumentByProvenanceId(record.id);
|
|
321
|
+
if (!doc) {
|
|
322
|
+
throw new VerifierError(`Document not found for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, type: record.type });
|
|
323
|
+
}
|
|
324
|
+
// Check file exists
|
|
325
|
+
if (!fs.existsSync(doc.file_path)) {
|
|
326
|
+
throw new VerifierError(`Source file not found: ${doc.file_path}`, VerifierErrorCode.FILE_NOT_FOUND, { provenanceId: record.id, filePath: doc.file_path });
|
|
327
|
+
}
|
|
328
|
+
// Return file path - caller will hash the file
|
|
329
|
+
return { content: doc.file_path, expectedHash: doc.file_hash, isFile: true };
|
|
330
|
+
}
|
|
331
|
+
case ProvenanceType.OCR_RESULT: {
|
|
332
|
+
const ocr = this.getOCRResultByProvenanceId(record.id);
|
|
333
|
+
if (!ocr) {
|
|
334
|
+
throw new VerifierError(`OCR result not found for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, type: record.type });
|
|
335
|
+
}
|
|
336
|
+
return { content: ocr.extracted_text, expectedHash: ocr.content_hash, isFile: false };
|
|
337
|
+
}
|
|
338
|
+
case ProvenanceType.CHUNK: {
|
|
339
|
+
const chunk = this.getChunkByProvenanceId(record.id);
|
|
340
|
+
if (!chunk) {
|
|
341
|
+
throw new VerifierError(`Chunk not found for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, type: record.type });
|
|
342
|
+
}
|
|
343
|
+
// CRITICAL: CHUNK uses text_hash, not content_hash
|
|
344
|
+
return { content: chunk.text, expectedHash: chunk.text_hash, isFile: false };
|
|
345
|
+
}
|
|
346
|
+
case ProvenanceType.EMBEDDING: {
|
|
347
|
+
const emb = this.getEmbeddingByProvenanceId(record.id);
|
|
348
|
+
if (!emb) {
|
|
349
|
+
throw new VerifierError(`Embedding not found for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, type: record.type });
|
|
350
|
+
}
|
|
351
|
+
return { content: emb.original_text, expectedHash: emb.content_hash, isFile: false };
|
|
352
|
+
}
|
|
353
|
+
case ProvenanceType.IMAGE: {
|
|
354
|
+
// IMAGE verification: hash the extracted image file
|
|
355
|
+
const image = this.getImageByProvenanceId(record.id);
|
|
356
|
+
if (!image) {
|
|
357
|
+
throw new VerifierError(`Image not found for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, type: record.type });
|
|
358
|
+
}
|
|
359
|
+
// Check extracted file exists
|
|
360
|
+
if (!image.extracted_path || !fs.existsSync(image.extracted_path)) {
|
|
361
|
+
throw new VerifierError(`Extracted image file not found: ${image.extracted_path}`, VerifierErrorCode.FILE_NOT_FOUND, { provenanceId: record.id, imagePath: image.extracted_path });
|
|
362
|
+
}
|
|
363
|
+
// Return file path - caller will hash the file
|
|
364
|
+
return { content: image.extracted_path, expectedHash: record.content_hash, isFile: true };
|
|
365
|
+
}
|
|
366
|
+
case ProvenanceType.VLM_DESCRIPTION: {
|
|
367
|
+
// VLM_DESCRIPTION verification: hash the VLM description text
|
|
368
|
+
// The description is stored in images.vlm_description, but we need to find it
|
|
369
|
+
// via the provenance chain - the parent should be an IMAGE
|
|
370
|
+
// Get the parent IMAGE to find the VLM description
|
|
371
|
+
if (!record.parent_id) {
|
|
372
|
+
throw new VerifierError(`VLM_DESCRIPTION has no parent_id: ${record.id}`, VerifierErrorCode.CHAIN_BROKEN, { provenanceId: record.id });
|
|
373
|
+
}
|
|
374
|
+
const image = this.getImageByProvenanceId(record.parent_id);
|
|
375
|
+
if (!image) {
|
|
376
|
+
throw new VerifierError(`Parent image not found for VLM_DESCRIPTION ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, parentId: record.parent_id });
|
|
377
|
+
}
|
|
378
|
+
if (!image.vlm_description) {
|
|
379
|
+
throw new VerifierError(`VLM description is empty for image ${image.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, imageId: image.id });
|
|
380
|
+
}
|
|
381
|
+
return { content: image.vlm_description, expectedHash: record.content_hash, isFile: false };
|
|
382
|
+
}
|
|
383
|
+
case ProvenanceType.COMPARISON: {
|
|
384
|
+
const comparison = this.rawDb
|
|
385
|
+
.prepare('SELECT text_diff_json, structural_diff_json FROM comparisons WHERE provenance_id = ?')
|
|
386
|
+
.get(record.id);
|
|
387
|
+
if (!comparison) {
|
|
388
|
+
throw new VerifierError(`Comparison not found for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id });
|
|
389
|
+
}
|
|
390
|
+
const parseDiffField = (json, field) => {
|
|
391
|
+
try {
|
|
392
|
+
return JSON.parse(json);
|
|
393
|
+
}
|
|
394
|
+
catch (error) {
|
|
395
|
+
console.error(`[ProvenanceVerifier] Failed to parse ${field} JSON for provenance ${record.id}:`, error instanceof Error ? error.message : String(error));
|
|
396
|
+
throw new VerifierError(`Corrupt ${field} in comparison for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, field });
|
|
397
|
+
}
|
|
398
|
+
};
|
|
399
|
+
const diffContent = JSON.stringify({
|
|
400
|
+
text_diff: parseDiffField(comparison.text_diff_json, 'text_diff_json'),
|
|
401
|
+
structural_diff: parseDiffField(comparison.structural_diff_json, 'structural_diff_json'),
|
|
402
|
+
});
|
|
403
|
+
return { content: diffContent, expectedHash: record.content_hash, isFile: false };
|
|
404
|
+
}
|
|
405
|
+
case ProvenanceType.EXTRACTION: {
|
|
406
|
+
// EXTRACTION: content_hash = computeHash(JSON.stringify(extractionJson))
|
|
407
|
+
// Re-derive: Load extraction record and hash its extraction_json field
|
|
408
|
+
const extraction = this.rawDb
|
|
409
|
+
.prepare('SELECT extraction_json FROM extractions WHERE provenance_id = ?')
|
|
410
|
+
.get(record.id);
|
|
411
|
+
if (!extraction) {
|
|
412
|
+
throw new VerifierError(`Extraction not found for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, type: record.type });
|
|
413
|
+
}
|
|
414
|
+
// The hash was computed over JSON.stringify(response.extractionJson) which was
|
|
415
|
+
// stored as extraction_json. Re-hash the stored string directly.
|
|
416
|
+
return {
|
|
417
|
+
content: extraction.extraction_json,
|
|
418
|
+
expectedHash: record.content_hash,
|
|
419
|
+
isFile: false,
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
case ProvenanceType.FORM_FILL: {
|
|
423
|
+
// FORM_FILL: content_hash = computeHash(JSON.stringify({ fields_filled, fields_not_found }))
|
|
424
|
+
// Re-derive: Load from form_fills table, reconstruct the same object
|
|
425
|
+
const formFill = this.rawDb
|
|
426
|
+
.prepare('SELECT fields_filled, fields_not_found FROM form_fills WHERE provenance_id = ?')
|
|
427
|
+
.get(record.id);
|
|
428
|
+
if (!formFill) {
|
|
429
|
+
throw new VerifierError(`Form fill not found for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, type: record.type });
|
|
430
|
+
}
|
|
431
|
+
// Reconstruct the exact object that was hashed: { fields_filled, fields_not_found }
|
|
432
|
+
// The original code hashes: computeHash(JSON.stringify({ fields_filled: result.fieldsFilled, fields_not_found: result.fieldsNotFound }))
|
|
433
|
+
// form_fills stores these as JSON strings, so parse them back to arrays
|
|
434
|
+
const formFillContent = JSON.stringify({
|
|
435
|
+
fields_filled: JSON.parse(formFill.fields_filled),
|
|
436
|
+
fields_not_found: JSON.parse(formFill.fields_not_found),
|
|
437
|
+
});
|
|
438
|
+
return { content: formFillContent, expectedHash: record.content_hash, isFile: false };
|
|
439
|
+
}
|
|
440
|
+
case ProvenanceType.CLUSTERING: {
|
|
441
|
+
// CLUSTERING: content_hash = computeHash(JSON.stringify(centroid) + ':' + runId)
|
|
442
|
+
// Re-derive: Load cluster record and reconstruct the same input
|
|
443
|
+
const cluster = this.rawDb
|
|
444
|
+
.prepare('SELECT centroid_json, run_id FROM clusters WHERE provenance_id = ?')
|
|
445
|
+
.get(record.id);
|
|
446
|
+
if (!cluster) {
|
|
447
|
+
throw new VerifierError(`Cluster not found for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, type: record.type });
|
|
448
|
+
}
|
|
449
|
+
// The original hash: computeHash(JSON.stringify(centroid) + ':' + runId)
|
|
450
|
+
// centroid_json is already JSON.stringify(centroid), so use it directly
|
|
451
|
+
const clusterContent = cluster.centroid_json + ':' + cluster.run_id;
|
|
452
|
+
return { content: clusterContent, expectedHash: record.content_hash, isFile: false };
|
|
453
|
+
}
|
|
454
|
+
default: {
|
|
455
|
+
const unknownType = record.type;
|
|
456
|
+
throw new VerifierError(`Unknown provenance type: ${unknownType}`, VerifierErrorCode.INVALID_TYPE, { type: unknownType });
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
// ════════════════════════════════════════════════════════════════
|
|
461
|
+
// RAW SQL HELPERS (methods not in DatabaseService)
|
|
462
|
+
// ════════════════════════════════════════════════════════════════
|
|
463
|
+
/**
|
|
464
|
+
* Get document by its provenance_id
|
|
465
|
+
*/
|
|
466
|
+
getDocumentByProvenanceId(provenanceId) {
|
|
467
|
+
const row = this.rawDb
|
|
468
|
+
.prepare('SELECT * FROM documents WHERE provenance_id = ?')
|
|
469
|
+
.get(provenanceId);
|
|
470
|
+
return row ? rowToDocument(row) : null;
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Get OCR result by its provenance_id
|
|
474
|
+
*/
|
|
475
|
+
getOCRResultByProvenanceId(provenanceId) {
|
|
476
|
+
const row = this.rawDb
|
|
477
|
+
.prepare('SELECT * FROM ocr_results WHERE provenance_id = ?')
|
|
478
|
+
.get(provenanceId);
|
|
479
|
+
return row ? rowToOCRResult(row) : null;
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Get chunk by its provenance_id
|
|
483
|
+
*/
|
|
484
|
+
getChunkByProvenanceId(provenanceId) {
|
|
485
|
+
const row = this.rawDb
|
|
486
|
+
.prepare('SELECT * FROM chunks WHERE provenance_id = ?')
|
|
487
|
+
.get(provenanceId);
|
|
488
|
+
return row ? rowToChunk(row) : null;
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* Get embedding by its provenance_id (without vector)
|
|
492
|
+
*/
|
|
493
|
+
getEmbeddingByProvenanceId(provenanceId) {
|
|
494
|
+
const row = this.rawDb
|
|
495
|
+
.prepare('SELECT * FROM embeddings WHERE provenance_id = ?')
|
|
496
|
+
.get(provenanceId);
|
|
497
|
+
return row ? rowToEmbedding(row) : null;
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Get image by its provenance_id
|
|
501
|
+
*/
|
|
502
|
+
getImageByProvenanceId(provenanceId) {
|
|
503
|
+
const row = this.rawDb
|
|
504
|
+
.prepare('SELECT * FROM images WHERE provenance_id = ?')
|
|
505
|
+
.get(provenanceId);
|
|
506
|
+
return row ? rowToImage(row) : null;
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Get all provenance records ordered by chain_depth
|
|
510
|
+
*/
|
|
511
|
+
getAllProvenance() {
|
|
512
|
+
// H-6: Use iterate() to avoid double-allocation (.all() + .map())
|
|
513
|
+
const records = [];
|
|
514
|
+
const stmt = this.rawDb.prepare('SELECT * FROM provenance ORDER BY chain_depth ASC');
|
|
515
|
+
for (const row of stmt.iterate()) {
|
|
516
|
+
records.push(rowToProvenance(row));
|
|
517
|
+
}
|
|
518
|
+
return records;
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Get database name from metadata
|
|
522
|
+
*/
|
|
523
|
+
getDatabaseName() {
|
|
524
|
+
try {
|
|
525
|
+
const row = this.rawDb
|
|
526
|
+
.prepare('SELECT database_name FROM database_metadata LIMIT 1')
|
|
527
|
+
.get();
|
|
528
|
+
return row?.database_name ?? 'unknown';
|
|
529
|
+
}
|
|
530
|
+
catch (error) {
|
|
531
|
+
console.error(`[Verifier] Failed to get database name from metadata: ${String(error)}`);
|
|
532
|
+
return 'unknown';
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
//# sourceMappingURL=verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../../src/services/provenance/verifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python Worker Process Pool
|
|
3
|
+
*
|
|
4
|
+
* Maintains warm Python processes to amortize import costs (torch, transformers).
|
|
5
|
+
* Workers accept JSON commands on stdin, return JSON on stdout.
|
|
6
|
+
* Auto-restart on crash, health checks via heartbeat.
|
|
7
|
+
*
|
|
8
|
+
* CRITICAL: NEVER use console.log() - stdout is JSON-RPC protocol.
|
|
9
|
+
*
|
|
10
|
+
* @module services/python-pool
|
|
11
|
+
*/
|
|
12
|
+
import { EventEmitter } from 'events';
|
|
13
|
+
export interface PoolConfig {
|
|
14
|
+
/** Number of worker processes to maintain (default: 3) */
|
|
15
|
+
poolSize: number;
|
|
16
|
+
/** Restart worker after this many tasks (default: 100) */
|
|
17
|
+
maxTasksPerWorker: number;
|
|
18
|
+
/** Health check interval in ms (default: 30000) */
|
|
19
|
+
healthCheckIntervalMs: number;
|
|
20
|
+
/** Task timeout in ms (default: 120000) */
|
|
21
|
+
taskTimeoutMs: number;
|
|
22
|
+
}
|
|
23
|
+
export interface PoolStatus {
|
|
24
|
+
total: number;
|
|
25
|
+
busy: number;
|
|
26
|
+
idle: number;
|
|
27
|
+
queued: number;
|
|
28
|
+
}
|
|
29
|
+
export declare class PythonPool extends EventEmitter {
|
|
30
|
+
private workers;
|
|
31
|
+
private taskQueue;
|
|
32
|
+
private readonly config;
|
|
33
|
+
private healthCheckTimer;
|
|
34
|
+
private nextWorkerId;
|
|
35
|
+
private shuttingDown;
|
|
36
|
+
private readonly pythonCommand;
|
|
37
|
+
constructor(config?: Partial<PoolConfig>);
|
|
38
|
+
/**
|
|
39
|
+
* Start the pool with the given Python script.
|
|
40
|
+
*
|
|
41
|
+
* @param scriptPath - Path to the Python worker script
|
|
42
|
+
* @throws Error if pool is shutting down
|
|
43
|
+
*/
|
|
44
|
+
start(scriptPath: string): void;
|
|
45
|
+
/**
|
|
46
|
+
* Execute a command on the next available worker.
|
|
47
|
+
*
|
|
48
|
+
* If all workers are busy, the task is queued and dispatched when
|
|
49
|
+
* a worker becomes available.
|
|
50
|
+
*
|
|
51
|
+
* @param command - JSON-serializable command object
|
|
52
|
+
* @returns Promise resolving with the worker's JSON response
|
|
53
|
+
* @throws Error if pool is shutting down or task times out
|
|
54
|
+
*/
|
|
55
|
+
execute(command: Record<string, unknown>): Promise<unknown>;
|
|
56
|
+
/**
|
|
57
|
+
* Shut down all workers and reject queued tasks.
|
|
58
|
+
*/
|
|
59
|
+
shutdown(): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Get pool status for diagnostics.
|
|
62
|
+
*/
|
|
63
|
+
getStatus(): PoolStatus;
|
|
64
|
+
private spawnWorker;
|
|
65
|
+
private getAvailableWorker;
|
|
66
|
+
private dispatchTask;
|
|
67
|
+
private processQueue;
|
|
68
|
+
private healthCheck;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=python-pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-pool.d.ts","sourceRoot":"","sources":["../../src/services/python-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAMtC,MAAM,WAAW,UAAU;IACzB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mDAAmD;IACnD,qBAAqB,EAAE,MAAM,CAAC;IAC9B,2CAA2C;IAC3C,aAAa,EAAE,MAAM,CAAC;CACvB;AAiBD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;IAWxC;;;;;OAKG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAe/B;;;;;;;;;OASG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBjE;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAmC/B;;OAEG;IACH,SAAS,IAAI,UAAU;IAmBvB,OAAO,CAAC,WAAW;IA2CnB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,YAAY;IA+EpB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,WAAW;CAcpB"}
|