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,394 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Statistics operations for DatabaseService
|
|
3
|
+
*
|
|
4
|
+
* Handles database statistics retrieval.
|
|
5
|
+
*/
|
|
6
|
+
import { statSync } from 'fs';
|
|
7
|
+
/**
|
|
8
|
+
* Get database statistics
|
|
9
|
+
*
|
|
10
|
+
* @param db - Database connection
|
|
11
|
+
* @param name - Database name
|
|
12
|
+
* @param path - Database file path
|
|
13
|
+
* @returns DatabaseStats - Live statistics from database
|
|
14
|
+
*/
|
|
15
|
+
export function getStats(db, name, path) {
|
|
16
|
+
const docStats = db
|
|
17
|
+
.prepare(`
|
|
18
|
+
SELECT
|
|
19
|
+
COUNT(*) FILTER (WHERE status = 'pending') as pending,
|
|
20
|
+
COUNT(*) FILTER (WHERE status = 'processing') as processing,
|
|
21
|
+
COUNT(*) FILTER (WHERE status = 'complete') as complete,
|
|
22
|
+
COUNT(*) FILTER (WHERE status = 'failed') as failed,
|
|
23
|
+
COUNT(*) as total
|
|
24
|
+
FROM documents
|
|
25
|
+
`)
|
|
26
|
+
.get();
|
|
27
|
+
const chunkStats = db
|
|
28
|
+
.prepare(`
|
|
29
|
+
SELECT
|
|
30
|
+
COUNT(*) FILTER (WHERE embedding_status = 'pending') as pending,
|
|
31
|
+
COUNT(*) FILTER (WHERE embedding_status = 'complete') as complete,
|
|
32
|
+
COUNT(*) FILTER (WHERE embedding_status = 'failed') as failed,
|
|
33
|
+
COUNT(*) as total
|
|
34
|
+
FROM chunks
|
|
35
|
+
`)
|
|
36
|
+
.get();
|
|
37
|
+
const otherCounts = db
|
|
38
|
+
.prepare(`
|
|
39
|
+
SELECT
|
|
40
|
+
(SELECT COUNT(*) FROM ocr_results) as ocr_count,
|
|
41
|
+
(SELECT COUNT(*) FROM embeddings) as embedding_count,
|
|
42
|
+
(SELECT COUNT(*) FROM provenance) as provenance_count,
|
|
43
|
+
(SELECT COUNT(*) FROM images) as image_count,
|
|
44
|
+
(SELECT COUNT(*) FROM extractions) as extraction_count,
|
|
45
|
+
(SELECT COUNT(*) FROM form_fills) as form_fill_count,
|
|
46
|
+
(SELECT COUNT(*) FROM comparisons) as comparison_count,
|
|
47
|
+
(SELECT COUNT(*) FROM clusters) as cluster_count
|
|
48
|
+
`)
|
|
49
|
+
.get();
|
|
50
|
+
const embeddingCount = otherCounts.embedding_count;
|
|
51
|
+
const qualityCosts = db
|
|
52
|
+
.prepare(`
|
|
53
|
+
SELECT
|
|
54
|
+
(SELECT AVG(parse_quality_score) FROM ocr_results WHERE parse_quality_score IS NOT NULL) as avg_quality,
|
|
55
|
+
(SELECT MIN(parse_quality_score) FROM ocr_results WHERE parse_quality_score IS NOT NULL) as min_quality,
|
|
56
|
+
(SELECT MAX(parse_quality_score) FROM ocr_results WHERE parse_quality_score IS NOT NULL) as max_quality,
|
|
57
|
+
(SELECT COUNT(parse_quality_score) FROM ocr_results WHERE parse_quality_score IS NOT NULL) as quality_count,
|
|
58
|
+
(SELECT COALESCE(SUM(cost_cents), 0) FROM ocr_results) as total_ocr_cost,
|
|
59
|
+
(SELECT COALESCE(SUM(cost_cents), 0) FROM form_fills) as total_form_fill_cost
|
|
60
|
+
`)
|
|
61
|
+
.get();
|
|
62
|
+
const stats = statSync(path);
|
|
63
|
+
const avgChunksPerDocument = docStats.total > 0 ? chunkStats.total / docStats.total : 0;
|
|
64
|
+
const avgEmbeddingsPerChunk = chunkStats.total > 0 ? embeddingCount / chunkStats.total : 0;
|
|
65
|
+
return {
|
|
66
|
+
name,
|
|
67
|
+
total_documents: docStats.total,
|
|
68
|
+
documents_by_status: {
|
|
69
|
+
pending: docStats.pending,
|
|
70
|
+
processing: docStats.processing,
|
|
71
|
+
complete: docStats.complete,
|
|
72
|
+
failed: docStats.failed,
|
|
73
|
+
},
|
|
74
|
+
total_ocr_results: otherCounts.ocr_count,
|
|
75
|
+
total_chunks: chunkStats.total,
|
|
76
|
+
chunks_by_embedding_status: {
|
|
77
|
+
pending: chunkStats.pending,
|
|
78
|
+
complete: chunkStats.complete,
|
|
79
|
+
failed: chunkStats.failed,
|
|
80
|
+
},
|
|
81
|
+
total_embeddings: embeddingCount,
|
|
82
|
+
total_images: otherCounts.image_count,
|
|
83
|
+
total_extractions: otherCounts.extraction_count,
|
|
84
|
+
total_form_fills: otherCounts.form_fill_count,
|
|
85
|
+
total_comparisons: otherCounts.comparison_count,
|
|
86
|
+
total_clusters: otherCounts.cluster_count,
|
|
87
|
+
total_provenance: otherCounts.provenance_count,
|
|
88
|
+
storage_size_bytes: stats.size,
|
|
89
|
+
avg_chunks_per_document: avgChunksPerDocument,
|
|
90
|
+
avg_embeddings_per_chunk: avgEmbeddingsPerChunk,
|
|
91
|
+
ocr_quality: {
|
|
92
|
+
avg: qualityCosts.avg_quality,
|
|
93
|
+
min: qualityCosts.min_quality,
|
|
94
|
+
max: qualityCosts.max_quality,
|
|
95
|
+
scored_count: qualityCosts.quality_count,
|
|
96
|
+
},
|
|
97
|
+
costs: {
|
|
98
|
+
total_ocr_cost_cents: qualityCosts.total_ocr_cost,
|
|
99
|
+
total_form_fill_cost_cents: qualityCosts.total_form_fill_cost,
|
|
100
|
+
total_cost_cents: qualityCosts.total_ocr_cost + qualityCosts.total_form_fill_cost,
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Update metadata counts from actual table counts
|
|
106
|
+
*
|
|
107
|
+
* @param db - Database connection
|
|
108
|
+
*/
|
|
109
|
+
export function updateMetadataCounts(db) {
|
|
110
|
+
const now = new Date().toISOString();
|
|
111
|
+
// M-2: Single query for all counts instead of 4 separate COUNT(*) scans
|
|
112
|
+
const counts = db
|
|
113
|
+
.prepare(`
|
|
114
|
+
SELECT
|
|
115
|
+
(SELECT COUNT(*) FROM documents) as doc_count,
|
|
116
|
+
(SELECT COUNT(*) FROM ocr_results) as ocr_count,
|
|
117
|
+
(SELECT COUNT(*) FROM chunks) as chunk_count,
|
|
118
|
+
(SELECT COUNT(*) FROM embeddings) as emb_count
|
|
119
|
+
`)
|
|
120
|
+
.get();
|
|
121
|
+
db.prepare(`
|
|
122
|
+
UPDATE database_metadata
|
|
123
|
+
SET total_documents = ?, total_ocr_results = ?, total_chunks = ?,
|
|
124
|
+
total_embeddings = ?, last_modified_at = ?
|
|
125
|
+
WHERE id = 1
|
|
126
|
+
`).run(counts.doc_count, counts.ocr_count, counts.chunk_count, counts.emb_count, now);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Update metadata last_modified_at timestamp
|
|
130
|
+
*
|
|
131
|
+
* @param db - Database connection
|
|
132
|
+
*/
|
|
133
|
+
export function updateMetadataModified(db) {
|
|
134
|
+
const now = new Date().toISOString();
|
|
135
|
+
const stmt = db.prepare(`
|
|
136
|
+
UPDATE database_metadata SET last_modified_at = ? WHERE id = 1
|
|
137
|
+
`);
|
|
138
|
+
stmt.run(now);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get strftime format string for the given bucket type
|
|
142
|
+
*/
|
|
143
|
+
function getBucketFormat(bucket) {
|
|
144
|
+
switch (bucket) {
|
|
145
|
+
case 'hourly':
|
|
146
|
+
return '%Y-%m-%d %H:00';
|
|
147
|
+
case 'daily':
|
|
148
|
+
return '%Y-%m-%d';
|
|
149
|
+
case 'weekly':
|
|
150
|
+
return '%Y-W%W';
|
|
151
|
+
case 'monthly':
|
|
152
|
+
return '%Y-%m';
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** Whitelist of valid table names for timeline stats queries */
|
|
156
|
+
const VALID_TIMELINE_TABLES = new Set(['documents', 'chunks', 'embeddings', 'images', 'ocr_results']);
|
|
157
|
+
/** Whitelist of valid date column names for timeline stats queries */
|
|
158
|
+
const VALID_DATE_COLUMNS = new Set(['created_at', 'processing_completed_at']);
|
|
159
|
+
/**
|
|
160
|
+
* Get processing volume over time buckets for various metrics.
|
|
161
|
+
*
|
|
162
|
+
* @param db - Database connection
|
|
163
|
+
* @param options - Bucket type, metric, optional date range
|
|
164
|
+
* @returns Array of { period, count, total? } data points
|
|
165
|
+
*/
|
|
166
|
+
export function getTimelineStats(db, options) {
|
|
167
|
+
const format = getBucketFormat(options.bucket);
|
|
168
|
+
const conditions = [];
|
|
169
|
+
const params = [];
|
|
170
|
+
// Build metric-specific query
|
|
171
|
+
let table;
|
|
172
|
+
let dateColumn;
|
|
173
|
+
let selectExpr;
|
|
174
|
+
switch (options.metric) {
|
|
175
|
+
case 'documents':
|
|
176
|
+
table = 'documents';
|
|
177
|
+
dateColumn = 'created_at';
|
|
178
|
+
selectExpr = 'COUNT(*) as count';
|
|
179
|
+
break;
|
|
180
|
+
case 'pages':
|
|
181
|
+
table = 'documents';
|
|
182
|
+
dateColumn = 'created_at';
|
|
183
|
+
selectExpr = 'COALESCE(SUM(page_count), 0) as count';
|
|
184
|
+
break;
|
|
185
|
+
case 'chunks':
|
|
186
|
+
table = 'chunks';
|
|
187
|
+
dateColumn = 'created_at';
|
|
188
|
+
selectExpr = 'COUNT(*) as count';
|
|
189
|
+
break;
|
|
190
|
+
case 'embeddings':
|
|
191
|
+
table = 'embeddings';
|
|
192
|
+
dateColumn = 'created_at';
|
|
193
|
+
selectExpr = 'COUNT(*) as count';
|
|
194
|
+
break;
|
|
195
|
+
case 'images':
|
|
196
|
+
table = 'images';
|
|
197
|
+
dateColumn = 'created_at';
|
|
198
|
+
selectExpr = 'COUNT(*) as count';
|
|
199
|
+
break;
|
|
200
|
+
case 'cost':
|
|
201
|
+
table = 'ocr_results';
|
|
202
|
+
dateColumn = 'processing_completed_at';
|
|
203
|
+
selectExpr = 'COALESCE(SUM(cost_cents), 0) as count';
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
// Whitelist validation for SQL-interpolated identifiers
|
|
207
|
+
if (!VALID_TIMELINE_TABLES.has(table)) {
|
|
208
|
+
throw new Error(`Invalid timeline table: ${table}`);
|
|
209
|
+
}
|
|
210
|
+
if (!VALID_DATE_COLUMNS.has(dateColumn)) {
|
|
211
|
+
throw new Error(`Invalid date column: ${dateColumn}`);
|
|
212
|
+
}
|
|
213
|
+
if (options.created_after) {
|
|
214
|
+
conditions.push(`${dateColumn} >= ?`);
|
|
215
|
+
params.push(options.created_after);
|
|
216
|
+
}
|
|
217
|
+
if (options.created_before) {
|
|
218
|
+
conditions.push(`${dateColumn} <= ?`);
|
|
219
|
+
params.push(options.created_before);
|
|
220
|
+
}
|
|
221
|
+
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
222
|
+
const sql = `
|
|
223
|
+
SELECT
|
|
224
|
+
strftime('${format}', ${dateColumn}) as period,
|
|
225
|
+
${selectExpr}
|
|
226
|
+
FROM ${table}
|
|
227
|
+
${whereClause}
|
|
228
|
+
GROUP BY period
|
|
229
|
+
ORDER BY period ASC
|
|
230
|
+
`;
|
|
231
|
+
const rows = db.prepare(sql).all(...params);
|
|
232
|
+
// Filter out null periods (rows with null dateColumn values)
|
|
233
|
+
return rows
|
|
234
|
+
.filter((r) => r.period !== null)
|
|
235
|
+
.map((r) => ({
|
|
236
|
+
period: r.period,
|
|
237
|
+
count: r.count,
|
|
238
|
+
}));
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Get quality score trends over time, optionally grouped by OCR mode or processor.
|
|
242
|
+
*
|
|
243
|
+
* Uses ocr_results.parse_quality_score for ocr_mode grouping,
|
|
244
|
+
* and provenance.processing_quality_score for processor grouping.
|
|
245
|
+
*
|
|
246
|
+
* @param db - Database connection
|
|
247
|
+
* @param options - Bucket type, group_by, optional date range
|
|
248
|
+
* @returns Array of quality trend data points
|
|
249
|
+
*/
|
|
250
|
+
export function getQualityTrends(db, options) {
|
|
251
|
+
const format = getBucketFormat(options.bucket);
|
|
252
|
+
const groupBy = options.group_by || 'none';
|
|
253
|
+
// Whitelist validation for group_by parameter (used in SQL branching)
|
|
254
|
+
const VALID_GROUP_BY = new Set(['none', 'ocr_mode', 'processor']);
|
|
255
|
+
if (!VALID_GROUP_BY.has(groupBy)) {
|
|
256
|
+
throw new Error(`Invalid group_by value: ${groupBy}`);
|
|
257
|
+
}
|
|
258
|
+
const conditions = [];
|
|
259
|
+
const params = [];
|
|
260
|
+
if (groupBy === 'processor') {
|
|
261
|
+
// Use provenance table for processor grouping
|
|
262
|
+
conditions.push('processing_quality_score IS NOT NULL');
|
|
263
|
+
if (options.created_after) {
|
|
264
|
+
conditions.push('created_at >= ?');
|
|
265
|
+
params.push(options.created_after);
|
|
266
|
+
}
|
|
267
|
+
if (options.created_before) {
|
|
268
|
+
conditions.push('created_at <= ?');
|
|
269
|
+
params.push(options.created_before);
|
|
270
|
+
}
|
|
271
|
+
const whereClause = `WHERE ${conditions.join(' AND ')}`;
|
|
272
|
+
const sql = `
|
|
273
|
+
SELECT
|
|
274
|
+
strftime('${format}', created_at) as period,
|
|
275
|
+
processor as grp,
|
|
276
|
+
AVG(processing_quality_score) as avg_quality,
|
|
277
|
+
MIN(processing_quality_score) as min_quality,
|
|
278
|
+
MAX(processing_quality_score) as max_quality,
|
|
279
|
+
COUNT(*) as sample_count
|
|
280
|
+
FROM provenance
|
|
281
|
+
${whereClause}
|
|
282
|
+
GROUP BY period, grp
|
|
283
|
+
ORDER BY period ASC, grp ASC
|
|
284
|
+
`;
|
|
285
|
+
const rows = db.prepare(sql).all(...params);
|
|
286
|
+
return rows
|
|
287
|
+
.filter((r) => r.period !== null)
|
|
288
|
+
.map((r) => ({
|
|
289
|
+
period: r.period,
|
|
290
|
+
avg_quality: Math.round(r.avg_quality * 100) / 100,
|
|
291
|
+
min_quality: Math.round(r.min_quality * 100) / 100,
|
|
292
|
+
max_quality: Math.round(r.max_quality * 100) / 100,
|
|
293
|
+
sample_count: r.sample_count,
|
|
294
|
+
group: r.grp,
|
|
295
|
+
}));
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
// Use ocr_results table for no grouping or ocr_mode grouping
|
|
299
|
+
conditions.push('parse_quality_score IS NOT NULL');
|
|
300
|
+
if (options.created_after) {
|
|
301
|
+
conditions.push('processing_completed_at >= ?');
|
|
302
|
+
params.push(options.created_after);
|
|
303
|
+
}
|
|
304
|
+
if (options.created_before) {
|
|
305
|
+
conditions.push('processing_completed_at <= ?');
|
|
306
|
+
params.push(options.created_before);
|
|
307
|
+
}
|
|
308
|
+
const whereClause = `WHERE ${conditions.join(' AND ')}`;
|
|
309
|
+
const groupByColumn = groupBy === 'ocr_mode' ? ', datalab_mode' : '';
|
|
310
|
+
const selectGroup = groupBy === 'ocr_mode' ? ', datalab_mode as grp' : '';
|
|
311
|
+
const sql = `
|
|
312
|
+
SELECT
|
|
313
|
+
strftime('${format}', processing_completed_at) as period
|
|
314
|
+
${selectGroup},
|
|
315
|
+
AVG(parse_quality_score) as avg_quality,
|
|
316
|
+
MIN(parse_quality_score) as min_quality,
|
|
317
|
+
MAX(parse_quality_score) as max_quality,
|
|
318
|
+
COUNT(*) as sample_count
|
|
319
|
+
FROM ocr_results
|
|
320
|
+
${whereClause}
|
|
321
|
+
GROUP BY period${groupByColumn}
|
|
322
|
+
ORDER BY period ASC${groupBy === 'ocr_mode' ? ', grp ASC' : ''}
|
|
323
|
+
`;
|
|
324
|
+
const rows = db.prepare(sql).all(...params);
|
|
325
|
+
return rows
|
|
326
|
+
.filter((r) => r.period !== null)
|
|
327
|
+
.map((r) => ({
|
|
328
|
+
period: r.period,
|
|
329
|
+
avg_quality: Math.round(r.avg_quality * 100) / 100,
|
|
330
|
+
min_quality: Math.round(r.min_quality * 100) / 100,
|
|
331
|
+
max_quality: Math.round(r.max_quality * 100) / 100,
|
|
332
|
+
sample_count: r.sample_count,
|
|
333
|
+
...(groupBy === 'ocr_mode' && r.grp !== undefined ? { group: r.grp } : {}),
|
|
334
|
+
}));
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Get processing throughput metrics per time bucket.
|
|
339
|
+
*
|
|
340
|
+
* Queries provenance table for OCR_RESULT, EMBEDDING, and IMAGE types
|
|
341
|
+
* to compute per-bucket throughput rates.
|
|
342
|
+
*
|
|
343
|
+
* @param db - Database connection
|
|
344
|
+
* @param options - Bucket type, optional date range
|
|
345
|
+
* @returns Array of throughput data points per bucket
|
|
346
|
+
*/
|
|
347
|
+
export function getThroughputAnalytics(db, options) {
|
|
348
|
+
const format = getBucketFormat(options.bucket);
|
|
349
|
+
const conditions = [];
|
|
350
|
+
const params = [];
|
|
351
|
+
if (options.created_after) {
|
|
352
|
+
conditions.push('p.created_at >= ?');
|
|
353
|
+
params.push(options.created_after);
|
|
354
|
+
}
|
|
355
|
+
if (options.created_before) {
|
|
356
|
+
conditions.push('p.created_at <= ?');
|
|
357
|
+
params.push(options.created_before);
|
|
358
|
+
}
|
|
359
|
+
const extraWhere = conditions.length > 0 ? `AND ${conditions.join(' AND ')}` : '';
|
|
360
|
+
// Use a single query with conditional aggregation across types
|
|
361
|
+
const sql = `
|
|
362
|
+
SELECT
|
|
363
|
+
strftime('${format}', p.created_at) as period,
|
|
364
|
+
COALESCE(SUM(CASE WHEN p.type = 'OCR_RESULT' THEN 1 ELSE 0 END), 0) as pages_processed,
|
|
365
|
+
COALESCE(SUM(CASE WHEN p.type = 'EMBEDDING' THEN 1 ELSE 0 END), 0) as embeddings_generated,
|
|
366
|
+
COALESCE(SUM(CASE WHEN p.type = 'IMAGE' THEN 1 ELSE 0 END), 0) as images_processed,
|
|
367
|
+
COALESCE(SUM(CASE WHEN p.type = 'OCR_RESULT' THEN p.processing_duration_ms ELSE 0 END), 0) as total_ocr_duration_ms,
|
|
368
|
+
COALESCE(SUM(CASE WHEN p.type = 'EMBEDDING' THEN p.processing_duration_ms ELSE 0 END), 0) as total_embedding_duration_ms
|
|
369
|
+
FROM provenance p
|
|
370
|
+
WHERE p.type IN ('OCR_RESULT', 'EMBEDDING', 'IMAGE')
|
|
371
|
+
${extraWhere}
|
|
372
|
+
GROUP BY period
|
|
373
|
+
ORDER BY period ASC
|
|
374
|
+
`;
|
|
375
|
+
// Duplicate params for each condition usage (they apply once)
|
|
376
|
+
const rows = db.prepare(sql).all(...params);
|
|
377
|
+
return rows
|
|
378
|
+
.filter((r) => r.period !== null)
|
|
379
|
+
.map((r) => ({
|
|
380
|
+
period: r.period,
|
|
381
|
+
pages_processed: r.pages_processed,
|
|
382
|
+
embeddings_generated: r.embeddings_generated,
|
|
383
|
+
images_processed: r.images_processed,
|
|
384
|
+
total_ocr_duration_ms: r.total_ocr_duration_ms,
|
|
385
|
+
total_embedding_duration_ms: r.total_embedding_duration_ms,
|
|
386
|
+
avg_ms_per_page: r.pages_processed > 0
|
|
387
|
+
? Math.round((r.total_ocr_duration_ms / r.pages_processed) * 100) / 100
|
|
388
|
+
: 0,
|
|
389
|
+
avg_ms_per_embedding: r.embeddings_generated > 0
|
|
390
|
+
? Math.round((r.total_embedding_duration_ms / r.embeddings_generated) * 100) / 100
|
|
391
|
+
: 0,
|
|
392
|
+
}));
|
|
393
|
+
}
|
|
394
|
+
//# sourceMappingURL=stats-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats-operations.js","sourceRoot":"","sources":["../../../../src/services/storage/database/stats-operations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAG9B;;;;;;;GAOG;AACH,MAAM,UAAU,QAAQ,CAAC,EAAqB,EAAE,IAAY,EAAE,IAAY;IACxE,MAAM,QAAQ,GAAG,EAAE;SAChB,OAAO,CACN;;;;;;;;GAQH,CACE;SACA,GAAG,EAML,CAAC;IAEF,MAAM,UAAU,GAAG,EAAE;SAClB,OAAO,CACN;;;;;;;GAOH,CACE;SACA,GAAG,EAKL,CAAC;IAEF,MAAM,WAAW,GAAG,EAAE;SACnB,OAAO,CACN;;;;;;;;;;GAUH,CACE;SACA,GAAG,EASL,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAAC,eAAe,CAAC;IAEnD,MAAM,YAAY,GAAG,EAAE;SACpB,OAAO,CACN;;;;;;;;GAQH,CACE;SACA,GAAG,EAOL,CAAC;IAEF,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE7B,MAAM,oBAAoB,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,qBAAqB,GAAG,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3F,OAAO;QACL,IAAI;QACJ,eAAe,EAAE,QAAQ,CAAC,KAAK;QAC/B,mBAAmB,EAAE;YACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;SACxB;QACD,iBAAiB,EAAE,WAAW,CAAC,SAAS;QACxC,YAAY,EAAE,UAAU,CAAC,KAAK;QAC9B,0BAA0B,EAAE;YAC1B,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B;QACD,gBAAgB,EAAE,cAAc;QAChC,YAAY,EAAE,WAAW,CAAC,WAAW;QACrC,iBAAiB,EAAE,WAAW,CAAC,gBAAgB;QAC/C,gBAAgB,EAAE,WAAW,CAAC,eAAe;QAC7C,iBAAiB,EAAE,WAAW,CAAC,gBAAgB;QAC/C,cAAc,EAAE,WAAW,CAAC,aAAa;QACzC,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;QAC9C,kBAAkB,EAAE,KAAK,CAAC,IAAI;QAC9B,uBAAuB,EAAE,oBAAoB;QAC7C,wBAAwB,EAAE,qBAAqB;QAC/C,WAAW,EAAE;YACX,GAAG,EAAE,YAAY,CAAC,WAAW;YAC7B,GAAG,EAAE,YAAY,CAAC,WAAW;YAC7B,GAAG,EAAE,YAAY,CAAC,WAAW;YAC7B,YAAY,EAAE,YAAY,CAAC,aAAa;SACzC;QACD,KAAK,EAAE;YACL,oBAAoB,EAAE,YAAY,CAAC,cAAc;YACjD,0BAA0B,EAAE,YAAY,CAAC,oBAAoB;YAC7D,gBAAgB,EAAE,YAAY,CAAC,cAAc,GAAG,YAAY,CAAC,oBAAoB;SAClF;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAqB;IACxD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,wEAAwE;IACxE,MAAM,MAAM,GAAG,EAAE;SACd,OAAO,CACN;;;;;;GAMH,CACE;SACA,GAAG,EAAsF,CAAC;IAE7F,EAAE,CAAC,OAAO,CACR;;;;;GAKD,CACA,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AACvF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,EAAqB;IAC1D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;GAEvB,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAChB,CAAC;AAsBD;;GAEG;AACH,SAAS,eAAe,CAAC,MAAsB;IAC7C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,gBAAgB,CAAC;QAC1B,KAAK,OAAO;YACV,OAAO,UAAU,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC;AAED,gEAAgE;AAChE,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AAEtG,sEAAsE;AACtE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC,CAAC;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,EAAqB,EACrB,OAA6B;IAE7B,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,8BAA8B;IAC9B,IAAI,KAAa,CAAC;IAClB,IAAI,UAAkB,CAAC;IACvB,IAAI,UAAkB,CAAC;IAEvB,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,WAAW;YACd,KAAK,GAAG,WAAW,CAAC;YACpB,UAAU,GAAG,YAAY,CAAC;YAC1B,UAAU,GAAG,mBAAmB,CAAC;YACjC,MAAM;QACR,KAAK,OAAO;YACV,KAAK,GAAG,WAAW,CAAC;YACpB,UAAU,GAAG,YAAY,CAAC;YAC1B,UAAU,GAAG,uCAAuC,CAAC;YACrD,MAAM;QACR,KAAK,QAAQ;YACX,KAAK,GAAG,QAAQ,CAAC;YACjB,UAAU,GAAG,YAAY,CAAC;YAC1B,UAAU,GAAG,mBAAmB,CAAC;YACjC,MAAM;QACR,KAAK,YAAY;YACf,KAAK,GAAG,YAAY,CAAC;YACrB,UAAU,GAAG,YAAY,CAAC;YAC1B,UAAU,GAAG,mBAAmB,CAAC;YACjC,MAAM;QACR,KAAK,QAAQ;YACX,KAAK,GAAG,QAAQ,CAAC;YACjB,UAAU,GAAG,YAAY,CAAC;YAC1B,UAAU,GAAG,mBAAmB,CAAC;YACjC,MAAM;QACR,KAAK,MAAM;YACT,KAAK,GAAG,aAAa,CAAC;YACtB,UAAU,GAAG,yBAAyB,CAAC;YACvC,UAAU,GAAG,uCAAuC,CAAC;YACrD,MAAM;IACV,CAAC;IAED,wDAAwD;IACxD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,wBAAwB,UAAU,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,OAAO,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,OAAO,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAErF,MAAM,GAAG,GAAG;;kBAEI,MAAM,MAAM,UAAU;QAChC,UAAU;WACP,KAAK;MACV,WAAW;;;GAGd,CAAC;IAEF,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAoD,CAAC;IAE/F,6DAA6D;IAC7D,OAAO,IAAI;SACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,MAAM,EAAE,CAAC,CAAC,MAAgB;QAC1B,KAAK,EAAE,CAAC,CAAC,KAAK;KACf,CAAC,CAAC,CAAC;AACR,CAAC;AAsBD;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC9B,EAAqB,EACrB,OAA4B;IAE5B,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC;IAE3C,sEAAsE;IACtE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IAClE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;QAC5B,8CAA8C;QAC9C,UAAU,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QAExD,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,WAAW,GAAG,SAAS,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAExD,MAAM,GAAG,GAAG;;oBAEI,MAAM;;;;;;;QAOlB,WAAW;;;KAGd,CAAC;QAEF,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAOxC,CAAC;QAEH,OAAO,IAAI;aACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,MAAM,EAAE,CAAC,CAAC,MAAgB;YAC1B,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,GAAG,GAAG;YAClD,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,GAAG,GAAG;YAClD,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,GAAG,GAAG;YAClD,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,KAAK,EAAE,CAAC,CAAC,GAAG;SACb,CAAC,CAAC,CAAC;IACR,CAAC;SAAM,CAAC;QACN,6DAA6D;QAC7D,UAAU,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAEnD,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,UAAU,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,UAAU,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,WAAW,GAAG,SAAS,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACxD,MAAM,aAAa,GAAG,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,MAAM,WAAW,GAAG,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;QAE1E,MAAM,GAAG,GAAG;;oBAEI,MAAM;UAChB,WAAW;;;;;;QAMb,WAAW;uBACI,aAAa;2BACT,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;KAC/D,CAAC;QAEF,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAOxC,CAAC;QAEH,OAAO,IAAI;aACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,MAAM,EAAE,CAAC,CAAC,MAAgB;YAC1B,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,GAAG,GAAG;YAClD,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,GAAG,GAAG;YAClD,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,GAAG,GAAG;YAClD,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,GAAG,CAAC,OAAO,KAAK,UAAU,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3E,CAAC,CAAC,CAAC;IACR,CAAC;AACH,CAAC;AAuBD;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CACpC,EAAqB,EACrB,OAA0B;IAE1B,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAElF,+DAA+D;IAC/D,MAAM,GAAG,GAAG;;kBAEI,MAAM;;;;;;;;QAQhB,UAAU;;;GAGf,CAAC;IAEF,8DAA8D;IAC9D,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAOxC,CAAC;IAEH,OAAO,IAAI;SACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,MAAM,EAAE,CAAC,CAAC,MAAgB;QAC1B,eAAe,EAAE,CAAC,CAAC,eAAe;QAClC,oBAAoB,EAAE,CAAC,CAAC,oBAAoB;QAC5C,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;QACpC,qBAAqB,EAAE,CAAC,CAAC,qBAAqB;QAC9C,2BAA2B,EAAE,CAAC,CAAC,2BAA2B;QAC1D,eAAe,EACb,CAAC,CAAC,eAAe,GAAG,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,qBAAqB,GAAG,CAAC,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YACvE,CAAC,CAAC,CAAC;QACP,oBAAoB,EAClB,CAAC,CAAC,oBAAoB,GAAG,CAAC;YACxB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,2BAA2B,GAAG,CAAC,CAAC,oBAAoB,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YAClF,CAAC,CAAC,CAAC;KACR,CAAC,CAAC,CAAC;AACR,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tag Operations for DatabaseService
|
|
3
|
+
*
|
|
4
|
+
* Provides CRUD operations for tags and entity_tags tables.
|
|
5
|
+
* Tags are user-defined annotations for cross-entity tagging.
|
|
6
|
+
*
|
|
7
|
+
* @module database/tag-operations
|
|
8
|
+
*/
|
|
9
|
+
import type Database from 'better-sqlite3';
|
|
10
|
+
export interface Tag {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
description: string | null;
|
|
14
|
+
color: string | null;
|
|
15
|
+
created_at: string;
|
|
16
|
+
}
|
|
17
|
+
export interface TagWithCount extends Tag {
|
|
18
|
+
usage_count: number;
|
|
19
|
+
}
|
|
20
|
+
export interface EntityTagResult {
|
|
21
|
+
entity_id: string;
|
|
22
|
+
entity_type: string;
|
|
23
|
+
tags: string[];
|
|
24
|
+
}
|
|
25
|
+
export declare const VALID_ENTITY_TYPES: readonly ["document", "chunk", "image", "extraction", "cluster"];
|
|
26
|
+
export type EntityType = (typeof VALID_ENTITY_TYPES)[number];
|
|
27
|
+
/**
|
|
28
|
+
* Create a new tag
|
|
29
|
+
* @throws Error if tag name already exists
|
|
30
|
+
*/
|
|
31
|
+
export declare function createTag(db: Database.Database, tag: {
|
|
32
|
+
name: string;
|
|
33
|
+
description?: string;
|
|
34
|
+
color?: string;
|
|
35
|
+
}): Tag;
|
|
36
|
+
/**
|
|
37
|
+
* Get a tag by its name
|
|
38
|
+
*/
|
|
39
|
+
export declare function getTagByName(db: Database.Database, name: string): Tag | null;
|
|
40
|
+
/**
|
|
41
|
+
* Get all tags
|
|
42
|
+
*/
|
|
43
|
+
export declare function getAllTags(db: Database.Database): Tag[];
|
|
44
|
+
/**
|
|
45
|
+
* Get all tags with usage counts
|
|
46
|
+
*/
|
|
47
|
+
export declare function getTagsWithCounts(db: Database.Database): TagWithCount[];
|
|
48
|
+
/**
|
|
49
|
+
* Apply a tag to an entity
|
|
50
|
+
* @returns The entity_tags record ID
|
|
51
|
+
* @throws Error if tag/entity_tag combination already exists
|
|
52
|
+
*/
|
|
53
|
+
export declare function applyTag(db: Database.Database, tagId: string, entityId: string, entityType: string): string;
|
|
54
|
+
/**
|
|
55
|
+
* Remove a tag from an entity
|
|
56
|
+
* @returns true if a row was deleted, false if nothing to remove
|
|
57
|
+
*/
|
|
58
|
+
export declare function removeTag(db: Database.Database, tagId: string, entityId: string, entityType: string): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Get all tags for an entity
|
|
61
|
+
*/
|
|
62
|
+
export declare function getTagsForEntity(db: Database.Database, entityId: string, entityType: string): Tag[];
|
|
63
|
+
/**
|
|
64
|
+
* Search for entities that have specified tags
|
|
65
|
+
*
|
|
66
|
+
* @param tagNames - Array of tag names to search for
|
|
67
|
+
* @param entityType - Optional filter by entity type
|
|
68
|
+
* @param matchAll - If true, entity must have ALL tags. If false, ANY tag matches.
|
|
69
|
+
*/
|
|
70
|
+
export declare function searchByTags(db: Database.Database, tagNames: string[], entityType?: string, matchAll?: boolean): EntityTagResult[];
|
|
71
|
+
/**
|
|
72
|
+
* Delete a tag and all its entity associations (CASCADE)
|
|
73
|
+
* @returns The number of entity_tag associations that were removed
|
|
74
|
+
*/
|
|
75
|
+
export declare function deleteTag(db: Database.Database, tagId: string): number;
|
|
76
|
+
//# sourceMappingURL=tag-operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag-operations.d.ts","sourceRoot":"","sources":["../../../../src/services/storage/database/tag-operations.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAO3C,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAa,SAAQ,GAAG;IACvC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAGD,eAAO,MAAM,kBAAkB,kEAAmE,CAAC;AACnG,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAM7D;;;GAGG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,GAAG,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,GAAG,CAuBL;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAG5E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,GAAG,EAAE,CAEvD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,YAAY,EAAE,CAWvE;AAMD;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,MAAM,CAmBR;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAOT;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,GAAG,EAAE,CAUP;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAAE,EAClB,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,OAAO,GACjB,eAAe,EAAE,CAsDnB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAatE"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tag Operations for DatabaseService
|
|
3
|
+
*
|
|
4
|
+
* Provides CRUD operations for tags and entity_tags tables.
|
|
5
|
+
* Tags are user-defined annotations for cross-entity tagging.
|
|
6
|
+
*
|
|
7
|
+
* @module database/tag-operations
|
|
8
|
+
*/
|
|
9
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
10
|
+
// Valid entity types for tagging
|
|
11
|
+
export const VALID_ENTITY_TYPES = ['document', 'chunk', 'image', 'extraction', 'cluster'];
|
|
12
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
13
|
+
// TAG CRUD
|
|
14
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
15
|
+
/**
|
|
16
|
+
* Create a new tag
|
|
17
|
+
* @throws Error if tag name already exists
|
|
18
|
+
*/
|
|
19
|
+
export function createTag(db, tag) {
|
|
20
|
+
const id = uuidv4();
|
|
21
|
+
const now = new Date().toISOString();
|
|
22
|
+
try {
|
|
23
|
+
db.prepare(`INSERT INTO tags (id, name, description, color, created_at)
|
|
24
|
+
VALUES (?, ?, ?, ?, ?)`).run(id, tag.name, tag.description ?? null, tag.color ?? null, now);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (error instanceof Error && error.message.includes('UNIQUE constraint failed')) {
|
|
28
|
+
throw new Error(`Tag with name "${tag.name}" already exists`);
|
|
29
|
+
}
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
id,
|
|
34
|
+
name: tag.name,
|
|
35
|
+
description: tag.description ?? null,
|
|
36
|
+
color: tag.color ?? null,
|
|
37
|
+
created_at: now,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get a tag by its name
|
|
42
|
+
*/
|
|
43
|
+
export function getTagByName(db, name) {
|
|
44
|
+
const row = db.prepare('SELECT * FROM tags WHERE name = ?').get(name);
|
|
45
|
+
return row ?? null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get all tags
|
|
49
|
+
*/
|
|
50
|
+
export function getAllTags(db) {
|
|
51
|
+
return db.prepare('SELECT * FROM tags ORDER BY name LIMIT 10000').all();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get all tags with usage counts
|
|
55
|
+
*/
|
|
56
|
+
export function getTagsWithCounts(db) {
|
|
57
|
+
return db
|
|
58
|
+
.prepare(`SELECT t.*, COUNT(et.id) as usage_count
|
|
59
|
+
FROM tags t
|
|
60
|
+
LEFT JOIN entity_tags et ON et.tag_id = t.id
|
|
61
|
+
GROUP BY t.id
|
|
62
|
+
ORDER BY t.name
|
|
63
|
+
LIMIT 10000`)
|
|
64
|
+
.all();
|
|
65
|
+
}
|
|
66
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
67
|
+
// ENTITY TAG OPERATIONS
|
|
68
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
69
|
+
/**
|
|
70
|
+
* Apply a tag to an entity
|
|
71
|
+
* @returns The entity_tags record ID
|
|
72
|
+
* @throws Error if tag/entity_tag combination already exists
|
|
73
|
+
*/
|
|
74
|
+
export function applyTag(db, tagId, entityId, entityType) {
|
|
75
|
+
const id = uuidv4();
|
|
76
|
+
const now = new Date().toISOString();
|
|
77
|
+
try {
|
|
78
|
+
db.prepare(`INSERT INTO entity_tags (id, tag_id, entity_id, entity_type, created_at)
|
|
79
|
+
VALUES (?, ?, ?, ?, ?)`).run(id, tagId, entityId, entityType, now);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
if (error instanceof Error && error.message.includes('UNIQUE constraint failed')) {
|
|
83
|
+
throw new Error(`Tag is already applied to this ${entityType} (entity_id: ${entityId})`);
|
|
84
|
+
}
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
return id;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Remove a tag from an entity
|
|
91
|
+
* @returns true if a row was deleted, false if nothing to remove
|
|
92
|
+
*/
|
|
93
|
+
export function removeTag(db, tagId, entityId, entityType) {
|
|
94
|
+
const result = db
|
|
95
|
+
.prepare(`DELETE FROM entity_tags WHERE tag_id = ? AND entity_id = ? AND entity_type = ?`)
|
|
96
|
+
.run(tagId, entityId, entityType);
|
|
97
|
+
return result.changes > 0;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get all tags for an entity
|
|
101
|
+
*/
|
|
102
|
+
export function getTagsForEntity(db, entityId, entityType) {
|
|
103
|
+
return db
|
|
104
|
+
.prepare(`SELECT t.*
|
|
105
|
+
FROM tags t
|
|
106
|
+
INNER JOIN entity_tags et ON et.tag_id = t.id
|
|
107
|
+
WHERE et.entity_id = ? AND et.entity_type = ?
|
|
108
|
+
ORDER BY t.name`)
|
|
109
|
+
.all(entityId, entityType);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Search for entities that have specified tags
|
|
113
|
+
*
|
|
114
|
+
* @param tagNames - Array of tag names to search for
|
|
115
|
+
* @param entityType - Optional filter by entity type
|
|
116
|
+
* @param matchAll - If true, entity must have ALL tags. If false, ANY tag matches.
|
|
117
|
+
*/
|
|
118
|
+
export function searchByTags(db, tagNames, entityType, matchAll) {
|
|
119
|
+
if (tagNames.length === 0) {
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
const placeholders = tagNames.map(() => '?').join(',');
|
|
123
|
+
const params = [...tagNames];
|
|
124
|
+
let entityTypeClause = '';
|
|
125
|
+
if (entityType) {
|
|
126
|
+
entityTypeClause = 'AND et.entity_type = ?';
|
|
127
|
+
params.push(entityType);
|
|
128
|
+
}
|
|
129
|
+
const havingClause = matchAll
|
|
130
|
+
? `HAVING COUNT(DISTINCT t.name) = ?`
|
|
131
|
+
: '';
|
|
132
|
+
if (matchAll) {
|
|
133
|
+
params.push(tagNames.length);
|
|
134
|
+
}
|
|
135
|
+
const sql = `
|
|
136
|
+
SELECT et.entity_id, et.entity_type,
|
|
137
|
+
(SELECT JSON_GROUP_ARRAY(sub.name) FROM (
|
|
138
|
+
SELECT DISTINCT t2.name
|
|
139
|
+
FROM tags t2
|
|
140
|
+
INNER JOIN entity_tags et2 ON et2.tag_id = t2.id
|
|
141
|
+
WHERE et2.entity_id = et.entity_id AND et2.entity_type = et.entity_type
|
|
142
|
+
AND t2.name IN (${placeholders})
|
|
143
|
+
) sub) as tag_names
|
|
144
|
+
FROM entity_tags et
|
|
145
|
+
INNER JOIN tags t ON t.id = et.tag_id
|
|
146
|
+
WHERE t.name IN (${placeholders})
|
|
147
|
+
${entityTypeClause}
|
|
148
|
+
GROUP BY et.entity_id, et.entity_type
|
|
149
|
+
${havingClause}
|
|
150
|
+
ORDER BY et.entity_id
|
|
151
|
+
LIMIT 10000
|
|
152
|
+
`;
|
|
153
|
+
// Parameters: tagNames for subquery IN, then tagNames + entityType? + matchCount? for outer query
|
|
154
|
+
const allParams = [...tagNames, ...params];
|
|
155
|
+
const rows = db.prepare(sql).all(...allParams);
|
|
156
|
+
return rows.map((row) => ({
|
|
157
|
+
entity_id: row.entity_id,
|
|
158
|
+
entity_type: row.entity_type,
|
|
159
|
+
tags: JSON.parse(row.tag_names),
|
|
160
|
+
}));
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Delete a tag and all its entity associations (CASCADE)
|
|
164
|
+
* @returns The number of entity_tag associations that were removed
|
|
165
|
+
*/
|
|
166
|
+
export function deleteTag(db, tagId) {
|
|
167
|
+
// Count associations before delete (CASCADE will remove them)
|
|
168
|
+
const countRow = db
|
|
169
|
+
.prepare('SELECT COUNT(*) as cnt FROM entity_tags WHERE tag_id = ?')
|
|
170
|
+
.get(tagId);
|
|
171
|
+
const associationCount = countRow.cnt;
|
|
172
|
+
const result = db.prepare('DELETE FROM tags WHERE id = ?').run(tagId);
|
|
173
|
+
if (result.changes === 0) {
|
|
174
|
+
throw new Error(`Tag not found: ${tagId}`);
|
|
175
|
+
}
|
|
176
|
+
return associationCount;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=tag-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag-operations.js","sourceRoot":"","sources":["../../../../src/services/storage/database/tag-operations.ts"],"names":[],"mappings":"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"}
|