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,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document Lock Operations
|
|
3
|
+
*
|
|
4
|
+
* Provides database operations for document-level locking to prevent
|
|
5
|
+
* concurrent edits. Supports exclusive and shared lock types with
|
|
6
|
+
* automatic expiry via TTL.
|
|
7
|
+
*
|
|
8
|
+
* CRITICAL: NEVER use console.log() - stdout is reserved for JSON-RPC protocol.
|
|
9
|
+
*
|
|
10
|
+
* @module database/lock-operations
|
|
11
|
+
*/
|
|
12
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
13
|
+
// LOCK OPERATIONS
|
|
14
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
15
|
+
/**
|
|
16
|
+
* Acquire a lock on a document.
|
|
17
|
+
*
|
|
18
|
+
* Exclusive locks prevent any other lock. Shared locks allow other shared
|
|
19
|
+
* locks but block exclusive locks. Expired locks are cleaned up first.
|
|
20
|
+
*
|
|
21
|
+
* @param conn - Database connection
|
|
22
|
+
* @param params - Lock parameters
|
|
23
|
+
* @returns The acquired lock row
|
|
24
|
+
* @throws Error if document not found or lock conflict
|
|
25
|
+
*/
|
|
26
|
+
export function acquireLock(conn, params) {
|
|
27
|
+
// Validate document exists
|
|
28
|
+
const doc = conn.prepare('SELECT id FROM documents WHERE id = ?').get(params.document_id);
|
|
29
|
+
if (!doc) {
|
|
30
|
+
throw new Error(`Document not found: ${params.document_id}`);
|
|
31
|
+
}
|
|
32
|
+
// Clean expired locks first
|
|
33
|
+
conn.prepare(`DELETE FROM document_locks WHERE expires_at < datetime('now')`).run();
|
|
34
|
+
// Check for existing lock
|
|
35
|
+
const existing = conn.prepare('SELECT * FROM document_locks WHERE document_id = ?').get(params.document_id);
|
|
36
|
+
if (existing) {
|
|
37
|
+
// Same user can re-acquire their own lock
|
|
38
|
+
if (existing.user_id === params.user_id) {
|
|
39
|
+
// Update existing lock
|
|
40
|
+
const ttlMinutes = params.ttl_minutes ?? 30;
|
|
41
|
+
conn.prepare(`
|
|
42
|
+
UPDATE document_locks
|
|
43
|
+
SET session_id = ?, lock_type = ?, reason = ?, acquired_at = datetime('now'), expires_at = datetime('now', '+' || ? || ' minutes')
|
|
44
|
+
WHERE document_id = ?
|
|
45
|
+
`).run(params.session_id, params.lock_type, params.reason ?? null, ttlMinutes, params.document_id);
|
|
46
|
+
return conn.prepare('SELECT * FROM document_locks WHERE document_id = ?').get(params.document_id);
|
|
47
|
+
}
|
|
48
|
+
if (existing.lock_type === 'exclusive') {
|
|
49
|
+
throw new Error(`Document ${params.document_id} is exclusively locked by user ${existing.user_id} until ${existing.expires_at}`);
|
|
50
|
+
}
|
|
51
|
+
if (params.lock_type === 'exclusive') {
|
|
52
|
+
throw new Error(`Cannot acquire exclusive lock: document ${params.document_id} has a shared lock by user ${existing.user_id}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const ttlMinutes = params.ttl_minutes ?? 30;
|
|
56
|
+
conn.prepare(`
|
|
57
|
+
INSERT OR REPLACE INTO document_locks (document_id, user_id, session_id, lock_type, reason, acquired_at, expires_at)
|
|
58
|
+
VALUES (?, ?, ?, ?, ?, datetime('now'), datetime('now', '+' || ? || ' minutes'))
|
|
59
|
+
`).run(params.document_id, params.user_id, params.session_id, params.lock_type, params.reason ?? null, ttlMinutes);
|
|
60
|
+
return conn.prepare('SELECT * FROM document_locks WHERE document_id = ?').get(params.document_id);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Release a lock on a document.
|
|
64
|
+
*
|
|
65
|
+
* @param conn - Database connection
|
|
66
|
+
* @param documentId - Document ID
|
|
67
|
+
* @throws Error if no lock found
|
|
68
|
+
*/
|
|
69
|
+
export function releaseLock(conn, documentId) {
|
|
70
|
+
const existing = conn.prepare('SELECT * FROM document_locks WHERE document_id = ?').get(documentId);
|
|
71
|
+
if (!existing) {
|
|
72
|
+
throw new Error(`No lock found for document: ${documentId}`);
|
|
73
|
+
}
|
|
74
|
+
conn.prepare('DELETE FROM document_locks WHERE document_id = ?').run(documentId);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get the current lock status for a document.
|
|
78
|
+
* Cleans up expired locks before checking.
|
|
79
|
+
*
|
|
80
|
+
* @param conn - Database connection
|
|
81
|
+
* @param documentId - Document ID
|
|
82
|
+
* @returns Lock row or null if no active lock
|
|
83
|
+
*/
|
|
84
|
+
export function getLockStatus(conn, documentId) {
|
|
85
|
+
// Clean expired locks first
|
|
86
|
+
conn.prepare(`DELETE FROM document_locks WHERE expires_at < datetime('now')`).run();
|
|
87
|
+
return conn.prepare('SELECT * FROM document_locks WHERE document_id = ?').get(documentId) ?? null;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=lock-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock-operations.js","sourceRoot":"","sources":["../../../../src/services/storage/database/lock-operations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Obligation Operations for DatabaseService
|
|
3
|
+
*
|
|
4
|
+
* Provides CRUD and query operations for the obligations table.
|
|
5
|
+
* Obligations track contract deadlines, deliverables, and compliance items.
|
|
6
|
+
*
|
|
7
|
+
* @module database/obligation-operations
|
|
8
|
+
*/
|
|
9
|
+
import type Database from 'better-sqlite3';
|
|
10
|
+
export interface Obligation {
|
|
11
|
+
id: string;
|
|
12
|
+
document_id: string;
|
|
13
|
+
extraction_id: string | null;
|
|
14
|
+
obligation_type: string;
|
|
15
|
+
description: string;
|
|
16
|
+
responsible_party: string | null;
|
|
17
|
+
due_date: string | null;
|
|
18
|
+
recurring: string | null;
|
|
19
|
+
status: string;
|
|
20
|
+
source_chunk_id: string | null;
|
|
21
|
+
source_page: number | null;
|
|
22
|
+
confidence: number;
|
|
23
|
+
created_at: string;
|
|
24
|
+
metadata_json: string;
|
|
25
|
+
}
|
|
26
|
+
export declare const OBLIGATION_TYPES: readonly ["payment", "delivery", "notification", "renewal", "termination", "compliance", "reporting", "approval", "other"];
|
|
27
|
+
export declare const OBLIGATION_STATUSES: readonly ["active", "fulfilled", "overdue", "waived", "expired"];
|
|
28
|
+
export type ObligationType = (typeof OBLIGATION_TYPES)[number];
|
|
29
|
+
export type ObligationStatus = (typeof OBLIGATION_STATUSES)[number];
|
|
30
|
+
export interface CreateObligationParams {
|
|
31
|
+
document_id: string;
|
|
32
|
+
extraction_id?: string | null;
|
|
33
|
+
obligation_type: ObligationType;
|
|
34
|
+
description: string;
|
|
35
|
+
responsible_party?: string | null;
|
|
36
|
+
due_date?: string | null;
|
|
37
|
+
recurring?: string | null;
|
|
38
|
+
status?: ObligationStatus;
|
|
39
|
+
source_chunk_id?: string | null;
|
|
40
|
+
source_page?: number | null;
|
|
41
|
+
confidence?: number;
|
|
42
|
+
metadata_json?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface ListObligationsFilters {
|
|
45
|
+
document_id?: string;
|
|
46
|
+
obligation_type?: ObligationType;
|
|
47
|
+
status?: ObligationStatus;
|
|
48
|
+
due_before?: string;
|
|
49
|
+
due_after?: string;
|
|
50
|
+
responsible_party?: string;
|
|
51
|
+
limit?: number;
|
|
52
|
+
offset?: number;
|
|
53
|
+
}
|
|
54
|
+
export interface CalendarOptions {
|
|
55
|
+
months_ahead?: number;
|
|
56
|
+
status?: ObligationStatus;
|
|
57
|
+
document_id?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface CalendarMonth {
|
|
60
|
+
month: string;
|
|
61
|
+
obligations: Obligation[];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Create a new obligation
|
|
65
|
+
*/
|
|
66
|
+
export declare function createObligation(db: Database.Database, params: CreateObligationParams): Obligation;
|
|
67
|
+
/**
|
|
68
|
+
* List obligations with optional filters
|
|
69
|
+
*/
|
|
70
|
+
export declare function listObligations(db: Database.Database, filters: ListObligationsFilters): {
|
|
71
|
+
obligations: Obligation[];
|
|
72
|
+
total: number;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Update obligation status
|
|
76
|
+
* @throws Error if obligation not found
|
|
77
|
+
*/
|
|
78
|
+
export declare function updateObligationStatus(db: Database.Database, id: string, status: ObligationStatus, reason?: string): Obligation;
|
|
79
|
+
/**
|
|
80
|
+
* Get obligations grouped by month for calendar view
|
|
81
|
+
*/
|
|
82
|
+
export declare function getObligationCalendar(db: Database.Database, options: CalendarOptions): CalendarMonth[];
|
|
83
|
+
/**
|
|
84
|
+
* Mark active obligations with past due dates as overdue
|
|
85
|
+
* @returns Number of obligations marked overdue
|
|
86
|
+
*/
|
|
87
|
+
export declare function markOverdueObligations(db: Database.Database): number;
|
|
88
|
+
//# sourceMappingURL=obligation-operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obligation-operations.d.ts","sourceRoot":"","sources":["../../../../src/services/storage/database/obligation-operations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Obligation Operations for DatabaseService
|
|
3
|
+
*
|
|
4
|
+
* Provides CRUD and query operations for the obligations table.
|
|
5
|
+
* Obligations track contract deadlines, deliverables, and compliance items.
|
|
6
|
+
*
|
|
7
|
+
* @module database/obligation-operations
|
|
8
|
+
*/
|
|
9
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
10
|
+
export const OBLIGATION_TYPES = [
|
|
11
|
+
'payment', 'delivery', 'notification', 'renewal',
|
|
12
|
+
'termination', 'compliance', 'reporting', 'approval', 'other',
|
|
13
|
+
];
|
|
14
|
+
export const OBLIGATION_STATUSES = [
|
|
15
|
+
'active', 'fulfilled', 'overdue', 'waived', 'expired',
|
|
16
|
+
];
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// CREATE
|
|
19
|
+
// =============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Create a new obligation
|
|
22
|
+
*/
|
|
23
|
+
export function createObligation(db, params) {
|
|
24
|
+
const id = uuidv4();
|
|
25
|
+
const now = new Date().toISOString();
|
|
26
|
+
db.prepare(`
|
|
27
|
+
INSERT INTO obligations (id, document_id, extraction_id, obligation_type, description,
|
|
28
|
+
responsible_party, due_date, recurring, status, source_chunk_id, source_page,
|
|
29
|
+
confidence, created_at, metadata_json)
|
|
30
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
31
|
+
`).run(id, params.document_id, params.extraction_id ?? null, params.obligation_type, params.description, params.responsible_party ?? null, params.due_date ?? null, params.recurring ?? null, params.status ?? 'active', params.source_chunk_id ?? null, params.source_page ?? null, params.confidence ?? 1.0, now, params.metadata_json ?? '{}');
|
|
32
|
+
return {
|
|
33
|
+
id,
|
|
34
|
+
document_id: params.document_id,
|
|
35
|
+
extraction_id: params.extraction_id ?? null,
|
|
36
|
+
obligation_type: params.obligation_type,
|
|
37
|
+
description: params.description,
|
|
38
|
+
responsible_party: params.responsible_party ?? null,
|
|
39
|
+
due_date: params.due_date ?? null,
|
|
40
|
+
recurring: params.recurring ?? null,
|
|
41
|
+
status: params.status ?? 'active',
|
|
42
|
+
source_chunk_id: params.source_chunk_id ?? null,
|
|
43
|
+
source_page: params.source_page ?? null,
|
|
44
|
+
confidence: params.confidence ?? 1.0,
|
|
45
|
+
created_at: now,
|
|
46
|
+
metadata_json: params.metadata_json ?? '{}',
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// =============================================================================
|
|
50
|
+
// LIST WITH FILTERS
|
|
51
|
+
// =============================================================================
|
|
52
|
+
/**
|
|
53
|
+
* List obligations with optional filters
|
|
54
|
+
*/
|
|
55
|
+
export function listObligations(db, filters) {
|
|
56
|
+
const conditions = [];
|
|
57
|
+
const queryParams = [];
|
|
58
|
+
if (filters.document_id) {
|
|
59
|
+
conditions.push('o.document_id = ?');
|
|
60
|
+
queryParams.push(filters.document_id);
|
|
61
|
+
}
|
|
62
|
+
if (filters.obligation_type) {
|
|
63
|
+
conditions.push('o.obligation_type = ?');
|
|
64
|
+
queryParams.push(filters.obligation_type);
|
|
65
|
+
}
|
|
66
|
+
if (filters.status) {
|
|
67
|
+
conditions.push('o.status = ?');
|
|
68
|
+
queryParams.push(filters.status);
|
|
69
|
+
}
|
|
70
|
+
if (filters.due_before) {
|
|
71
|
+
conditions.push('o.due_date IS NOT NULL AND o.due_date <= ?');
|
|
72
|
+
queryParams.push(filters.due_before);
|
|
73
|
+
}
|
|
74
|
+
if (filters.due_after) {
|
|
75
|
+
conditions.push('o.due_date IS NOT NULL AND o.due_date >= ?');
|
|
76
|
+
queryParams.push(filters.due_after);
|
|
77
|
+
}
|
|
78
|
+
if (filters.responsible_party) {
|
|
79
|
+
conditions.push('o.responsible_party = ?');
|
|
80
|
+
queryParams.push(filters.responsible_party);
|
|
81
|
+
}
|
|
82
|
+
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
83
|
+
const countRow = db.prepare(`SELECT COUNT(*) as cnt FROM obligations o ${whereClause}`).get(...queryParams);
|
|
84
|
+
const limit = filters.limit ?? 50;
|
|
85
|
+
const offset = filters.offset ?? 0;
|
|
86
|
+
const obligations = db.prepare(`
|
|
87
|
+
SELECT o.* FROM obligations o
|
|
88
|
+
${whereClause}
|
|
89
|
+
ORDER BY o.due_date ASC NULLS LAST, o.created_at DESC
|
|
90
|
+
LIMIT ? OFFSET ?
|
|
91
|
+
`).all(...queryParams, limit, offset);
|
|
92
|
+
return { obligations, total: countRow.cnt };
|
|
93
|
+
}
|
|
94
|
+
// =============================================================================
|
|
95
|
+
// UPDATE STATUS
|
|
96
|
+
// =============================================================================
|
|
97
|
+
/**
|
|
98
|
+
* Update obligation status
|
|
99
|
+
* @throws Error if obligation not found
|
|
100
|
+
*/
|
|
101
|
+
export function updateObligationStatus(db, id, status, reason) {
|
|
102
|
+
const existing = db.prepare('SELECT * FROM obligations WHERE id = ?').get(id);
|
|
103
|
+
if (!existing) {
|
|
104
|
+
throw new Error(`Obligation not found: ${id}`);
|
|
105
|
+
}
|
|
106
|
+
// Update metadata with status change reason if provided
|
|
107
|
+
let metadata = {};
|
|
108
|
+
try {
|
|
109
|
+
metadata = JSON.parse(existing.metadata_json || '{}');
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
metadata = {};
|
|
113
|
+
}
|
|
114
|
+
if (reason) {
|
|
115
|
+
const statusHistory = metadata.status_history ?? [];
|
|
116
|
+
statusHistory.push({
|
|
117
|
+
from: existing.status,
|
|
118
|
+
to: status,
|
|
119
|
+
reason,
|
|
120
|
+
changed_at: new Date().toISOString(),
|
|
121
|
+
});
|
|
122
|
+
metadata.status_history = statusHistory;
|
|
123
|
+
}
|
|
124
|
+
db.prepare(`
|
|
125
|
+
UPDATE obligations SET status = ?, metadata_json = ? WHERE id = ?
|
|
126
|
+
`).run(status, JSON.stringify(metadata), id);
|
|
127
|
+
return {
|
|
128
|
+
...existing,
|
|
129
|
+
status,
|
|
130
|
+
metadata_json: JSON.stringify(metadata),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// =============================================================================
|
|
134
|
+
// CALENDAR VIEW
|
|
135
|
+
// =============================================================================
|
|
136
|
+
/**
|
|
137
|
+
* Get obligations grouped by month for calendar view
|
|
138
|
+
*/
|
|
139
|
+
export function getObligationCalendar(db, options) {
|
|
140
|
+
const monthsAhead = options.months_ahead ?? 3;
|
|
141
|
+
const now = new Date();
|
|
142
|
+
const endDate = new Date(now);
|
|
143
|
+
endDate.setMonth(endDate.getMonth() + monthsAhead);
|
|
144
|
+
const conditions = [
|
|
145
|
+
'o.due_date IS NOT NULL',
|
|
146
|
+
'o.due_date >= ?',
|
|
147
|
+
'o.due_date <= ?',
|
|
148
|
+
];
|
|
149
|
+
const queryParams = [
|
|
150
|
+
now.toISOString(),
|
|
151
|
+
endDate.toISOString(),
|
|
152
|
+
];
|
|
153
|
+
if (options.status) {
|
|
154
|
+
conditions.push('o.status = ?');
|
|
155
|
+
queryParams.push(options.status);
|
|
156
|
+
}
|
|
157
|
+
if (options.document_id) {
|
|
158
|
+
conditions.push('o.document_id = ?');
|
|
159
|
+
queryParams.push(options.document_id);
|
|
160
|
+
}
|
|
161
|
+
const whereClause = `WHERE ${conditions.join(' AND ')}`;
|
|
162
|
+
const obligations = db.prepare(`
|
|
163
|
+
SELECT o.* FROM obligations o
|
|
164
|
+
${whereClause}
|
|
165
|
+
ORDER BY o.due_date ASC
|
|
166
|
+
`).all(...queryParams);
|
|
167
|
+
// Group by month
|
|
168
|
+
const monthMap = new Map();
|
|
169
|
+
for (const ob of obligations) {
|
|
170
|
+
if (!ob.due_date)
|
|
171
|
+
continue;
|
|
172
|
+
const month = ob.due_date.substring(0, 7); // YYYY-MM
|
|
173
|
+
const existing = monthMap.get(month);
|
|
174
|
+
if (existing) {
|
|
175
|
+
existing.push(ob);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
monthMap.set(month, [ob]);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Convert to sorted array
|
|
182
|
+
const result = [];
|
|
183
|
+
for (const [month, obs] of monthMap.entries()) {
|
|
184
|
+
result.push({ month, obligations: obs });
|
|
185
|
+
}
|
|
186
|
+
result.sort((a, b) => a.month.localeCompare(b.month));
|
|
187
|
+
return result;
|
|
188
|
+
}
|
|
189
|
+
// =============================================================================
|
|
190
|
+
// MARK OVERDUE
|
|
191
|
+
// =============================================================================
|
|
192
|
+
/**
|
|
193
|
+
* Mark active obligations with past due dates as overdue
|
|
194
|
+
* @returns Number of obligations marked overdue
|
|
195
|
+
*/
|
|
196
|
+
export function markOverdueObligations(db) {
|
|
197
|
+
const result = db.prepare(`
|
|
198
|
+
UPDATE obligations
|
|
199
|
+
SET status = 'overdue'
|
|
200
|
+
WHERE due_date < datetime('now')
|
|
201
|
+
AND status = 'active'
|
|
202
|
+
AND due_date IS NOT NULL
|
|
203
|
+
`).run();
|
|
204
|
+
return result.changes;
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=obligation-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obligation-operations.js","sourceRoot":"","sources":["../../../../src/services/storage/database/obligation-operations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OCR Result operations for DatabaseService
|
|
3
|
+
*
|
|
4
|
+
* Handles all CRUD operations for OCR results.
|
|
5
|
+
*/
|
|
6
|
+
import Database from 'better-sqlite3';
|
|
7
|
+
import { OCRResult } from '../../../models/document.js';
|
|
8
|
+
/**
|
|
9
|
+
* Insert an OCR result
|
|
10
|
+
*
|
|
11
|
+
* @param db - Database connection
|
|
12
|
+
* @param result - OCR result data
|
|
13
|
+
* @param updateMetadataCounts - Callback to update metadata counts
|
|
14
|
+
* @returns string - The OCR result ID
|
|
15
|
+
*/
|
|
16
|
+
export declare function insertOCRResult(db: Database.Database, result: OCRResult, updateMetadataCounts: () => void): string;
|
|
17
|
+
/**
|
|
18
|
+
* Get an OCR result by ID
|
|
19
|
+
*
|
|
20
|
+
* @param db - Database connection
|
|
21
|
+
* @param id - OCR result ID
|
|
22
|
+
* @returns OCRResult | null - The OCR result or null if not found
|
|
23
|
+
*/
|
|
24
|
+
export declare function getOCRResult(db: Database.Database, id: string): OCRResult | null;
|
|
25
|
+
/**
|
|
26
|
+
* Get OCR result by document ID
|
|
27
|
+
*
|
|
28
|
+
* @param db - Database connection
|
|
29
|
+
* @param documentId - Document ID
|
|
30
|
+
* @returns OCRResult | null - The OCR result or null if not found
|
|
31
|
+
*/
|
|
32
|
+
export declare function getOCRResultByDocumentId(db: Database.Database, documentId: string): OCRResult | null;
|
|
33
|
+
//# sourceMappingURL=ocr-operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ocr-operations.d.ts","sourceRoot":"","sources":["../../../../src/services/storage/database/ocr-operations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAKxD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,SAAS,EACjB,oBAAoB,EAAE,MAAM,IAAI,GAC/B,MAAM,CAmCR;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAIhF;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,UAAU,EAAE,MAAM,GACjB,SAAS,GAAG,IAAI,CAIlB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OCR Result operations for DatabaseService
|
|
3
|
+
*
|
|
4
|
+
* Handles all CRUD operations for OCR results.
|
|
5
|
+
*/
|
|
6
|
+
import { runWithForeignKeyCheck } from './helpers.js';
|
|
7
|
+
import { rowToOCRResult } from './converters.js';
|
|
8
|
+
/**
|
|
9
|
+
* Insert an OCR result
|
|
10
|
+
*
|
|
11
|
+
* @param db - Database connection
|
|
12
|
+
* @param result - OCR result data
|
|
13
|
+
* @param updateMetadataCounts - Callback to update metadata counts
|
|
14
|
+
* @returns string - The OCR result ID
|
|
15
|
+
*/
|
|
16
|
+
export function insertOCRResult(db, result, updateMetadataCounts) {
|
|
17
|
+
const stmt = db.prepare(`
|
|
18
|
+
INSERT INTO ocr_results (
|
|
19
|
+
id, provenance_id, document_id, extracted_text, text_length,
|
|
20
|
+
datalab_request_id, datalab_mode, parse_quality_score, page_count,
|
|
21
|
+
cost_cents, content_hash, processing_started_at, processing_completed_at,
|
|
22
|
+
processing_duration_ms, json_blocks, extras_json
|
|
23
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
24
|
+
`);
|
|
25
|
+
runWithForeignKeyCheck(stmt, [
|
|
26
|
+
result.id,
|
|
27
|
+
result.provenance_id,
|
|
28
|
+
result.document_id,
|
|
29
|
+
result.extracted_text,
|
|
30
|
+
result.text_length,
|
|
31
|
+
result.datalab_request_id,
|
|
32
|
+
result.datalab_mode,
|
|
33
|
+
result.parse_quality_score,
|
|
34
|
+
result.page_count,
|
|
35
|
+
result.cost_cents,
|
|
36
|
+
result.content_hash,
|
|
37
|
+
result.processing_started_at,
|
|
38
|
+
result.processing_completed_at,
|
|
39
|
+
result.processing_duration_ms,
|
|
40
|
+
result.json_blocks ?? null,
|
|
41
|
+
result.extras_json ?? null,
|
|
42
|
+
], `inserting OCR result: document_id "${result.document_id}" or provenance_id "${result.provenance_id}" does not exist`);
|
|
43
|
+
updateMetadataCounts();
|
|
44
|
+
return result.id;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get an OCR result by ID
|
|
48
|
+
*
|
|
49
|
+
* @param db - Database connection
|
|
50
|
+
* @param id - OCR result ID
|
|
51
|
+
* @returns OCRResult | null - The OCR result or null if not found
|
|
52
|
+
*/
|
|
53
|
+
export function getOCRResult(db, id) {
|
|
54
|
+
const stmt = db.prepare('SELECT * FROM ocr_results WHERE id = ?');
|
|
55
|
+
const row = stmt.get(id);
|
|
56
|
+
return row ? rowToOCRResult(row) : null;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get OCR result by document ID
|
|
60
|
+
*
|
|
61
|
+
* @param db - Database connection
|
|
62
|
+
* @param documentId - Document ID
|
|
63
|
+
* @returns OCRResult | null - The OCR result or null if not found
|
|
64
|
+
*/
|
|
65
|
+
export function getOCRResultByDocumentId(db, documentId) {
|
|
66
|
+
const stmt = db.prepare('SELECT * FROM ocr_results WHERE document_id = ?');
|
|
67
|
+
const row = stmt.get(documentId);
|
|
68
|
+
return row ? rowToOCRResult(row) : null;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=ocr-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ocr-operations.js","sourceRoot":"","sources":["../../../../src/services/storage/database/ocr-operations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,EAAqB,EACrB,MAAiB,EACjB,oBAAgC;IAEhC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;GAOvB,CAAC,CAAC;IAEH,sBAAsB,CACpB,IAAI,EACJ;QACE,MAAM,CAAC,EAAE;QACT,MAAM,CAAC,aAAa;QACpB,MAAM,CAAC,WAAW;QAClB,MAAM,CAAC,cAAc;QACrB,MAAM,CAAC,WAAW;QAClB,MAAM,CAAC,kBAAkB;QACzB,MAAM,CAAC,YAAY;QACnB,MAAM,CAAC,mBAAmB;QAC1B,MAAM,CAAC,UAAU;QACjB,MAAM,CAAC,UAAU;QACjB,MAAM,CAAC,YAAY;QACnB,MAAM,CAAC,qBAAqB;QAC5B,MAAM,CAAC,uBAAuB;QAC9B,MAAM,CAAC,sBAAsB;QAC7B,MAAM,CAAC,WAAW,IAAI,IAAI;QAC1B,MAAM,CAAC,WAAW,IAAI,IAAI;KAC3B,EACD,sCAAsC,MAAM,CAAC,WAAW,uBAAuB,MAAM,CAAC,aAAa,kBAAkB,CACtH,CAAC;IAEF,oBAAoB,EAAE,CAAC;IACvB,OAAO,MAAM,CAAC,EAAE,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,EAAqB,EAAE,EAAU;IAC5D,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAA6B,CAAC;IACrD,OAAO,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,EAAqB,EACrB,UAAkB;IAElB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC;IAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAA6B,CAAC;IAC7D,OAAO,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playbook Operations for DatabaseService
|
|
3
|
+
*
|
|
4
|
+
* Provides CRUD operations for the playbooks table and clause comparison.
|
|
5
|
+
* Playbooks define preferred contract terms for deviation detection.
|
|
6
|
+
*
|
|
7
|
+
* @module database/playbook-operations
|
|
8
|
+
*/
|
|
9
|
+
import type Database from 'better-sqlite3';
|
|
10
|
+
import type { ContractClause } from '../../clm/contract-schemas.js';
|
|
11
|
+
export type { ContractClause };
|
|
12
|
+
export interface Playbook {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
description: string | null;
|
|
16
|
+
clauses_json: string;
|
|
17
|
+
created_at: string;
|
|
18
|
+
updated_at: string;
|
|
19
|
+
created_by: string | null;
|
|
20
|
+
}
|
|
21
|
+
export interface PlaybookWithClauses extends Omit<Playbook, 'clauses_json'> {
|
|
22
|
+
clauses: ContractClause[];
|
|
23
|
+
}
|
|
24
|
+
export interface ClauseComparisonResult {
|
|
25
|
+
clause_name: string;
|
|
26
|
+
severity: 'critical' | 'major' | 'minor';
|
|
27
|
+
status: 'match' | 'alternative_match' | 'deviation' | 'missing';
|
|
28
|
+
preferred_text: string;
|
|
29
|
+
matched_text: string | null;
|
|
30
|
+
matched_chunk_id: string | null;
|
|
31
|
+
matched_page: number | null;
|
|
32
|
+
details: string;
|
|
33
|
+
}
|
|
34
|
+
export interface PlaybookComparisonResult {
|
|
35
|
+
playbook_id: string;
|
|
36
|
+
playbook_name: string;
|
|
37
|
+
document_id: string;
|
|
38
|
+
total_clauses: number;
|
|
39
|
+
matches: number;
|
|
40
|
+
alternative_matches: number;
|
|
41
|
+
deviations: number;
|
|
42
|
+
missing: number;
|
|
43
|
+
compliance_score: number;
|
|
44
|
+
clause_results: ClauseComparisonResult[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Create a new playbook with clauses
|
|
48
|
+
*/
|
|
49
|
+
export declare function createPlaybook(db: Database.Database, params: {
|
|
50
|
+
name: string;
|
|
51
|
+
description?: string | null;
|
|
52
|
+
clauses: ContractClause[];
|
|
53
|
+
created_by?: string | null;
|
|
54
|
+
}): PlaybookWithClauses;
|
|
55
|
+
/**
|
|
56
|
+
* Get a playbook by ID
|
|
57
|
+
* @throws Error if not found
|
|
58
|
+
*/
|
|
59
|
+
export declare function getPlaybook(db: Database.Database, id: string): PlaybookWithClauses;
|
|
60
|
+
/**
|
|
61
|
+
* List all playbooks
|
|
62
|
+
*/
|
|
63
|
+
export declare function listPlaybooks(db: Database.Database): PlaybookWithClauses[];
|
|
64
|
+
/**
|
|
65
|
+
* Compare document text against a playbook's clauses.
|
|
66
|
+
*
|
|
67
|
+
* For each clause in the playbook, searches the document's chunks for matching
|
|
68
|
+
* content using simple text matching (case-insensitive indexOf). Returns
|
|
69
|
+
* deviations where neither preferred text nor alternatives are found.
|
|
70
|
+
*/
|
|
71
|
+
export declare function compareWithPlaybook(db: Database.Database, documentId: string, playbookId: string): PlaybookComparisonResult;
|
|
72
|
+
//# sourceMappingURL=playbook-operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playbook-operations.d.ts","sourceRoot":"","sources":["../../../../src/services/storage/database/playbook-operations.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC;IACzE,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;IACzC,MAAM,EAAE,OAAO,GAAG,mBAAmB,GAAG,WAAW,GAAG,SAAS,CAAC;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,sBAAsB,EAAE,CAAC;CAC1C;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE;IACN,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,GACA,mBAAmB,CA2BrB;AAMD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,mBAAmB,CAsBlF;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,mBAAmB,EAAE,CAsB1E;AAMD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,wBAAwB,CA8D1B"}
|