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,495 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow and Approval Chain Tools
|
|
3
|
+
*
|
|
4
|
+
* Provides 8 MCP tools for document workflow state management and
|
|
5
|
+
* multi-step approval chains:
|
|
6
|
+
* - ocr_workflow_submit/review/assign/status/queue (5 workflow tools)
|
|
7
|
+
* - ocr_approval_chain_create/apply (2 approval chain tools)
|
|
8
|
+
* - ocr_approval_step_decide (1 approval step tool)
|
|
9
|
+
*
|
|
10
|
+
* CRITICAL: NEVER use console.log() - stdout is reserved for JSON-RPC protocol.
|
|
11
|
+
*
|
|
12
|
+
* @module tools/workflow
|
|
13
|
+
*/
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
import { formatResponse, handleError } from './shared.js';
|
|
16
|
+
import { successResult } from '../server/types.js';
|
|
17
|
+
import { requireDatabase } from '../server/state.js';
|
|
18
|
+
import { validateInput } from '../utils/validation.js';
|
|
19
|
+
import { getLatestWorkflowState, createWorkflowState, listWorkflowQueue, getWorkflowHistory, } from '../services/storage/database/workflow-operations.js';
|
|
20
|
+
import { createApprovalChain, applyApprovalChain, getCurrentApprovalStep, decideApprovalStep, getApprovalProgress, } from '../services/storage/database/approval-operations.js';
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// SCHEMAS
|
|
23
|
+
// =============================================================================
|
|
24
|
+
const WorkflowDecisionSchema = z.enum(['approved', 'rejected', 'changes_requested']);
|
|
25
|
+
const ApprovalDecisionSchema = z.enum(['approved', 'rejected']);
|
|
26
|
+
// =============================================================================
|
|
27
|
+
// TOOL 3.1: ocr_workflow_submit
|
|
28
|
+
// =============================================================================
|
|
29
|
+
async function handleWorkflowSubmit(params) {
|
|
30
|
+
try {
|
|
31
|
+
const input = validateInput(z.object({
|
|
32
|
+
document_id: z.string().min(1),
|
|
33
|
+
assigned_to: z.string().min(1).optional(),
|
|
34
|
+
due_date: z.string().min(1).optional(),
|
|
35
|
+
metadata: z.record(z.unknown()).optional(),
|
|
36
|
+
}), params);
|
|
37
|
+
const { db } = requireDatabase();
|
|
38
|
+
const conn = db.getConnection();
|
|
39
|
+
// Check current state - create draft first if no workflow history exists
|
|
40
|
+
const current = getLatestWorkflowState(conn, input.document_id);
|
|
41
|
+
if (!current) {
|
|
42
|
+
// No workflow history - create draft first, then submit
|
|
43
|
+
createWorkflowState(conn, {
|
|
44
|
+
document_id: input.document_id,
|
|
45
|
+
state: 'draft',
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// Now transition to submitted
|
|
49
|
+
const submitted = createWorkflowState(conn, {
|
|
50
|
+
document_id: input.document_id,
|
|
51
|
+
state: 'submitted',
|
|
52
|
+
assigned_to: input.assigned_to,
|
|
53
|
+
due_date: input.due_date,
|
|
54
|
+
metadata: input.metadata,
|
|
55
|
+
});
|
|
56
|
+
return formatResponse(successResult({
|
|
57
|
+
workflow_state: submitted,
|
|
58
|
+
next_steps: [
|
|
59
|
+
{ tool: 'ocr_workflow_status', description: 'Check workflow status for this document' },
|
|
60
|
+
{ tool: 'ocr_workflow_assign', description: 'Assign a reviewer to this document' },
|
|
61
|
+
{ tool: 'ocr_workflow_queue', description: 'View all pending review documents' },
|
|
62
|
+
],
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
return handleError(error);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// =============================================================================
|
|
70
|
+
// TOOL 3.2: ocr_workflow_review
|
|
71
|
+
// =============================================================================
|
|
72
|
+
async function handleWorkflowReview(params) {
|
|
73
|
+
try {
|
|
74
|
+
const input = validateInput(z.object({
|
|
75
|
+
document_id: z.string().min(1),
|
|
76
|
+
decision: WorkflowDecisionSchema,
|
|
77
|
+
reason: z.string().max(2000).optional(),
|
|
78
|
+
}), params);
|
|
79
|
+
// Reason required for reject/changes_requested
|
|
80
|
+
if ((input.decision === 'rejected' || input.decision === 'changes_requested') && !input.reason) {
|
|
81
|
+
throw new Error(`Reason is required when decision is "${input.decision}"`);
|
|
82
|
+
}
|
|
83
|
+
const { db } = requireDatabase();
|
|
84
|
+
const conn = db.getConnection();
|
|
85
|
+
// Verify current state is in_review
|
|
86
|
+
const current = getLatestWorkflowState(conn, input.document_id);
|
|
87
|
+
if (!current) {
|
|
88
|
+
throw new Error(`No workflow history found for document ${input.document_id}`);
|
|
89
|
+
}
|
|
90
|
+
if (current.state !== 'in_review') {
|
|
91
|
+
throw new Error(`Cannot review document ${input.document_id}: current state is "${current.state}", ` +
|
|
92
|
+
`must be "in_review". Use ocr_workflow_status to check the current state.`);
|
|
93
|
+
}
|
|
94
|
+
const reviewed = createWorkflowState(conn, {
|
|
95
|
+
document_id: input.document_id,
|
|
96
|
+
state: input.decision,
|
|
97
|
+
reason: input.reason,
|
|
98
|
+
assigned_to: current.assigned_to,
|
|
99
|
+
});
|
|
100
|
+
const nextSteps = [];
|
|
101
|
+
if (input.decision === 'approved') {
|
|
102
|
+
nextSteps.push({ tool: 'ocr_workflow_status', description: 'View updated workflow status' }, { tool: 'ocr_approval_chain_apply', description: 'Apply an approval chain for formal sign-off' });
|
|
103
|
+
}
|
|
104
|
+
else if (input.decision === 'changes_requested') {
|
|
105
|
+
nextSteps.push({ tool: 'ocr_workflow_status', description: 'View updated workflow status' }, { tool: 'ocr_annotation_create', description: 'Add annotations detailing requested changes' });
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
nextSteps.push({ tool: 'ocr_workflow_status', description: 'View updated workflow status' });
|
|
109
|
+
}
|
|
110
|
+
return formatResponse(successResult({
|
|
111
|
+
workflow_state: reviewed,
|
|
112
|
+
decision: input.decision,
|
|
113
|
+
next_steps: nextSteps,
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
return handleError(error);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// =============================================================================
|
|
121
|
+
// TOOL 3.3: ocr_workflow_assign
|
|
122
|
+
// =============================================================================
|
|
123
|
+
async function handleWorkflowAssign(params) {
|
|
124
|
+
try {
|
|
125
|
+
const input = validateInput(z.object({
|
|
126
|
+
document_id: z.string().min(1),
|
|
127
|
+
user_id: z.string().min(1),
|
|
128
|
+
assigned_by: z.string().min(1).optional(),
|
|
129
|
+
}), params);
|
|
130
|
+
const { db } = requireDatabase();
|
|
131
|
+
const conn = db.getConnection();
|
|
132
|
+
// Get current workflow state
|
|
133
|
+
const current = getLatestWorkflowState(conn, input.document_id);
|
|
134
|
+
if (!current) {
|
|
135
|
+
throw new Error(`No workflow history found for document ${input.document_id}`);
|
|
136
|
+
}
|
|
137
|
+
// Only allow assignment when in submitted or in_review state
|
|
138
|
+
if (current.state !== 'submitted' && current.state !== 'in_review') {
|
|
139
|
+
throw new Error(`Cannot assign reviewer: document ${input.document_id} is in state "${current.state}". ` +
|
|
140
|
+
`Document must be in "submitted" or "in_review" state.`);
|
|
141
|
+
}
|
|
142
|
+
// If submitted, transition to in_review with the assigned reviewer
|
|
143
|
+
if (current.state === 'submitted') {
|
|
144
|
+
const inReview = createWorkflowState(conn, {
|
|
145
|
+
document_id: input.document_id,
|
|
146
|
+
state: 'in_review',
|
|
147
|
+
assigned_to: input.user_id,
|
|
148
|
+
assigned_by: input.assigned_by,
|
|
149
|
+
due_date: current.due_date,
|
|
150
|
+
});
|
|
151
|
+
return formatResponse(successResult({
|
|
152
|
+
workflow_state: inReview,
|
|
153
|
+
assigned_to: input.user_id,
|
|
154
|
+
transitioned_to: 'in_review',
|
|
155
|
+
next_steps: [
|
|
156
|
+
{ tool: 'ocr_workflow_review', description: 'Review this document (approve/reject/request changes)' },
|
|
157
|
+
{ tool: 'ocr_workflow_status', description: 'Check workflow status' },
|
|
158
|
+
],
|
|
159
|
+
}));
|
|
160
|
+
}
|
|
161
|
+
// Already in_review - update assignment via metadata
|
|
162
|
+
// We create a new in_review state with the updated assignment
|
|
163
|
+
// (This is valid because in_review -> in_review is not in transitions,
|
|
164
|
+
// so we update the current row directly instead)
|
|
165
|
+
conn.prepare(`
|
|
166
|
+
UPDATE workflow_states SET assigned_to = ?, assigned_by = ?
|
|
167
|
+
WHERE id = ?
|
|
168
|
+
`).run(input.user_id, input.assigned_by ?? null, current.id);
|
|
169
|
+
const updated = conn.prepare('SELECT * FROM workflow_states WHERE id = ?').get(current.id);
|
|
170
|
+
return formatResponse(successResult({
|
|
171
|
+
workflow_state: updated,
|
|
172
|
+
assigned_to: input.user_id,
|
|
173
|
+
reassigned: true,
|
|
174
|
+
next_steps: [
|
|
175
|
+
{ tool: 'ocr_workflow_review', description: 'Review this document' },
|
|
176
|
+
{ tool: 'ocr_workflow_status', description: 'Check workflow status' },
|
|
177
|
+
],
|
|
178
|
+
}));
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
return handleError(error);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// =============================================================================
|
|
185
|
+
// TOOL 3.4: ocr_workflow_status
|
|
186
|
+
// =============================================================================
|
|
187
|
+
async function handleWorkflowStatus(params) {
|
|
188
|
+
try {
|
|
189
|
+
const input = validateInput(z.object({
|
|
190
|
+
document_id: z.string().min(1),
|
|
191
|
+
}), params);
|
|
192
|
+
const { db } = requireDatabase();
|
|
193
|
+
const conn = db.getConnection();
|
|
194
|
+
const current = getLatestWorkflowState(conn, input.document_id);
|
|
195
|
+
const history = getWorkflowHistory(conn, input.document_id);
|
|
196
|
+
if (!current) {
|
|
197
|
+
return formatResponse(successResult({
|
|
198
|
+
document_id: input.document_id,
|
|
199
|
+
current_state: null,
|
|
200
|
+
history: [],
|
|
201
|
+
message: 'No workflow history for this document',
|
|
202
|
+
next_steps: [
|
|
203
|
+
{ tool: 'ocr_workflow_submit', description: 'Submit this document for review' },
|
|
204
|
+
],
|
|
205
|
+
}));
|
|
206
|
+
}
|
|
207
|
+
// Check for approval chains applied to this document
|
|
208
|
+
const approvalSteps = conn.prepare('SELECT DISTINCT chain_id FROM approval_steps WHERE document_id = ?').all(input.document_id);
|
|
209
|
+
const nextSteps = [];
|
|
210
|
+
switch (current.state) {
|
|
211
|
+
case 'draft':
|
|
212
|
+
nextSteps.push({ tool: 'ocr_workflow_submit', description: 'Submit for review' });
|
|
213
|
+
break;
|
|
214
|
+
case 'submitted':
|
|
215
|
+
nextSteps.push({ tool: 'ocr_workflow_assign', description: 'Assign a reviewer' }, { tool: 'ocr_workflow_queue', description: 'View review queue' });
|
|
216
|
+
break;
|
|
217
|
+
case 'in_review':
|
|
218
|
+
nextSteps.push({ tool: 'ocr_workflow_review', description: 'Make a review decision' });
|
|
219
|
+
break;
|
|
220
|
+
case 'changes_requested':
|
|
221
|
+
nextSteps.push({ tool: 'ocr_workflow_submit', description: 'Re-submit after changes' });
|
|
222
|
+
break;
|
|
223
|
+
case 'approved':
|
|
224
|
+
nextSteps.push({ tool: 'ocr_approval_chain_apply', description: 'Apply an approval chain' }, { tool: 'ocr_workflow_queue', description: 'View review queue' });
|
|
225
|
+
break;
|
|
226
|
+
default:
|
|
227
|
+
nextSteps.push({ tool: 'ocr_workflow_queue', description: 'View review queue' });
|
|
228
|
+
}
|
|
229
|
+
return formatResponse(successResult({
|
|
230
|
+
document_id: input.document_id,
|
|
231
|
+
current_state: current,
|
|
232
|
+
history,
|
|
233
|
+
approval_chains_applied: approvalSteps.map((s) => s.chain_id),
|
|
234
|
+
next_steps: nextSteps,
|
|
235
|
+
}));
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
return handleError(error);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// =============================================================================
|
|
242
|
+
// TOOL 3.5: ocr_workflow_queue
|
|
243
|
+
// =============================================================================
|
|
244
|
+
async function handleWorkflowQueue(params) {
|
|
245
|
+
try {
|
|
246
|
+
const input = validateInput(z.object({
|
|
247
|
+
assigned_to: z.string().min(1).optional(),
|
|
248
|
+
state: z.string().min(1).optional(),
|
|
249
|
+
due_before: z.string().min(1).optional(),
|
|
250
|
+
limit: z.number().int().min(1).max(200).default(50),
|
|
251
|
+
offset: z.number().int().min(0).default(0),
|
|
252
|
+
}), params);
|
|
253
|
+
const { db } = requireDatabase();
|
|
254
|
+
const conn = db.getConnection();
|
|
255
|
+
const limit = input.limit ?? 50;
|
|
256
|
+
const offset = input.offset ?? 0;
|
|
257
|
+
const result = listWorkflowQueue(conn, {
|
|
258
|
+
assigned_to: input.assigned_to,
|
|
259
|
+
state: input.state,
|
|
260
|
+
due_before: input.due_before,
|
|
261
|
+
limit,
|
|
262
|
+
offset,
|
|
263
|
+
});
|
|
264
|
+
const hasMore = offset + result.items.length < result.total;
|
|
265
|
+
return formatResponse(successResult({
|
|
266
|
+
items: result.items,
|
|
267
|
+
total: result.total,
|
|
268
|
+
limit,
|
|
269
|
+
offset,
|
|
270
|
+
has_more: hasMore,
|
|
271
|
+
next_steps: hasMore
|
|
272
|
+
? [{ tool: 'ocr_workflow_queue', description: `Get next page with offset=${offset + limit}` }]
|
|
273
|
+
: [
|
|
274
|
+
{ tool: 'ocr_workflow_status', description: 'Get details for a specific document' },
|
|
275
|
+
{ tool: 'ocr_workflow_review', description: 'Review a document from the queue' },
|
|
276
|
+
{ tool: 'ocr_workflow_assign', description: 'Assign a reviewer to a document' },
|
|
277
|
+
],
|
|
278
|
+
}));
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
return handleError(error);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// =============================================================================
|
|
285
|
+
// TOOL 3.6: ocr_approval_chain_create
|
|
286
|
+
// =============================================================================
|
|
287
|
+
async function handleApprovalChainCreate(params) {
|
|
288
|
+
try {
|
|
289
|
+
const input = validateInput(z.object({
|
|
290
|
+
name: z.string().min(1).max(200),
|
|
291
|
+
description: z.string().max(1000).optional(),
|
|
292
|
+
steps: z.array(z.object({
|
|
293
|
+
role: z.string().min(1),
|
|
294
|
+
required_approvals: z.number().int().min(1).optional(),
|
|
295
|
+
auto_advance: z.boolean().optional(),
|
|
296
|
+
})).min(1),
|
|
297
|
+
created_by: z.string().min(1).optional(),
|
|
298
|
+
}), params);
|
|
299
|
+
const { db } = requireDatabase();
|
|
300
|
+
const conn = db.getConnection();
|
|
301
|
+
const chain = createApprovalChain(conn, {
|
|
302
|
+
name: input.name,
|
|
303
|
+
description: input.description,
|
|
304
|
+
steps: input.steps,
|
|
305
|
+
created_by: input.created_by,
|
|
306
|
+
});
|
|
307
|
+
return formatResponse(successResult({
|
|
308
|
+
chain,
|
|
309
|
+
steps_count: input.steps.length,
|
|
310
|
+
next_steps: [
|
|
311
|
+
{ tool: 'ocr_approval_chain_apply', description: 'Apply this chain to a document' },
|
|
312
|
+
{ tool: 'ocr_approval_chain_create', description: 'Create another approval chain' },
|
|
313
|
+
],
|
|
314
|
+
}));
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
return handleError(error);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// =============================================================================
|
|
321
|
+
// TOOL 3.7: ocr_approval_chain_apply
|
|
322
|
+
// =============================================================================
|
|
323
|
+
async function handleApprovalChainApply(params) {
|
|
324
|
+
try {
|
|
325
|
+
const input = validateInput(z.object({
|
|
326
|
+
document_id: z.string().min(1),
|
|
327
|
+
chain_id: z.string().min(1),
|
|
328
|
+
}), params);
|
|
329
|
+
const { db } = requireDatabase();
|
|
330
|
+
const conn = db.getConnection();
|
|
331
|
+
const steps = applyApprovalChain(conn, input.document_id, input.chain_id);
|
|
332
|
+
const currentStep = steps.length > 0 ? steps[0] : null;
|
|
333
|
+
return formatResponse(successResult({
|
|
334
|
+
document_id: input.document_id,
|
|
335
|
+
chain_id: input.chain_id,
|
|
336
|
+
steps_created: steps.length,
|
|
337
|
+
steps,
|
|
338
|
+
current_step: currentStep,
|
|
339
|
+
next_steps: [
|
|
340
|
+
{ tool: 'ocr_approval_step_decide', description: 'Decide on the current approval step' },
|
|
341
|
+
{ tool: 'ocr_workflow_status', description: 'View full workflow status including approvals' },
|
|
342
|
+
],
|
|
343
|
+
}));
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
return handleError(error);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
// =============================================================================
|
|
350
|
+
// TOOL 3.8: ocr_approval_step_decide
|
|
351
|
+
// =============================================================================
|
|
352
|
+
async function handleApprovalStepDecide(params) {
|
|
353
|
+
try {
|
|
354
|
+
const input = validateInput(z.object({
|
|
355
|
+
document_id: z.string().min(1),
|
|
356
|
+
chain_id: z.string().min(1),
|
|
357
|
+
decision: ApprovalDecisionSchema,
|
|
358
|
+
user_id: z.string().min(1),
|
|
359
|
+
reason: z.string().max(2000).optional(),
|
|
360
|
+
}), params);
|
|
361
|
+
if (input.decision === 'rejected' && !input.reason) {
|
|
362
|
+
throw new Error('Reason is required when rejecting an approval step');
|
|
363
|
+
}
|
|
364
|
+
const { db } = requireDatabase();
|
|
365
|
+
const conn = db.getConnection();
|
|
366
|
+
// Get the current step for this document+chain
|
|
367
|
+
const currentStep = getCurrentApprovalStep(conn, input.document_id, input.chain_id);
|
|
368
|
+
if (!currentStep) {
|
|
369
|
+
// Check if chain is applied
|
|
370
|
+
const anySteps = conn.prepare('SELECT id FROM approval_steps WHERE document_id = ? AND chain_id = ? LIMIT 1').get(input.document_id, input.chain_id);
|
|
371
|
+
if (!anySteps) {
|
|
372
|
+
throw new Error(`No approval chain applied. Use ocr_approval_chain_apply first to apply chain ${input.chain_id} to document ${input.document_id}`);
|
|
373
|
+
}
|
|
374
|
+
throw new Error(`All approval steps for this chain have already been decided. No pending steps remain.`);
|
|
375
|
+
}
|
|
376
|
+
const decided = decideApprovalStep(conn, currentStep.id, input.decision, input.user_id, input.reason);
|
|
377
|
+
// Get updated progress
|
|
378
|
+
const progress = getApprovalProgress(conn, input.document_id, input.chain_id);
|
|
379
|
+
const nextSteps = [];
|
|
380
|
+
if (progress.current_step) {
|
|
381
|
+
nextSteps.push({
|
|
382
|
+
tool: 'ocr_approval_step_decide',
|
|
383
|
+
description: `Decide on next step (${progress.current_step.required_role}, order ${progress.current_step.step_order})`,
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
if (progress.is_complete && !progress.is_rejected) {
|
|
387
|
+
nextSteps.push({ tool: 'ocr_workflow_status', description: 'View final workflow status' });
|
|
388
|
+
}
|
|
389
|
+
if (progress.is_rejected) {
|
|
390
|
+
nextSteps.push({ tool: 'ocr_workflow_status', description: 'View workflow status after rejection' });
|
|
391
|
+
}
|
|
392
|
+
if (nextSteps.length === 0) {
|
|
393
|
+
nextSteps.push({ tool: 'ocr_workflow_status', description: 'View workflow status' });
|
|
394
|
+
}
|
|
395
|
+
return formatResponse(successResult({
|
|
396
|
+
step: decided,
|
|
397
|
+
progress: {
|
|
398
|
+
total_steps: progress.total_steps,
|
|
399
|
+
completed_steps: progress.completed_steps,
|
|
400
|
+
is_complete: progress.is_complete,
|
|
401
|
+
is_rejected: progress.is_rejected,
|
|
402
|
+
current_step: progress.current_step,
|
|
403
|
+
},
|
|
404
|
+
next_steps: nextSteps,
|
|
405
|
+
}));
|
|
406
|
+
}
|
|
407
|
+
catch (error) {
|
|
408
|
+
return handleError(error);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
// =============================================================================
|
|
412
|
+
// TOOL DEFINITIONS EXPORT
|
|
413
|
+
// =============================================================================
|
|
414
|
+
export const workflowTools = {
|
|
415
|
+
ocr_workflow_submit: {
|
|
416
|
+
description: '[MANAGE] Submit a document for review. Creates a draft state first if no workflow history exists, then transitions to submitted. Optionally assign a reviewer and set a due date.',
|
|
417
|
+
inputSchema: {
|
|
418
|
+
document_id: z.string().min(1).describe('Document ID to submit for review'),
|
|
419
|
+
assigned_to: z.string().min(1).optional().describe('User ID of the reviewer to assign'),
|
|
420
|
+
due_date: z.string().min(1).optional().describe('Due date for review (ISO 8601 datetime)'),
|
|
421
|
+
metadata: z.record(z.unknown()).optional().describe('Optional metadata object to attach to the workflow state'),
|
|
422
|
+
},
|
|
423
|
+
handler: handleWorkflowSubmit,
|
|
424
|
+
},
|
|
425
|
+
ocr_workflow_review: {
|
|
426
|
+
description: '[MANAGE] Review a document: approve, reject, or request changes. Document must be in "in_review" state. Reason is required for reject or changes_requested decisions.',
|
|
427
|
+
inputSchema: {
|
|
428
|
+
document_id: z.string().min(1).describe('Document ID to review'),
|
|
429
|
+
decision: WorkflowDecisionSchema.describe('Review decision: approved, rejected, or changes_requested'),
|
|
430
|
+
reason: z.string().max(2000).optional().describe('Reason for the decision (required for reject/changes_requested)'),
|
|
431
|
+
},
|
|
432
|
+
handler: handleWorkflowReview,
|
|
433
|
+
},
|
|
434
|
+
ocr_workflow_assign: {
|
|
435
|
+
description: '[MANAGE] Assign or reassign a reviewer to a document. If the document is in "submitted" state, it transitions to "in_review". If already "in_review", updates the assignment.',
|
|
436
|
+
inputSchema: {
|
|
437
|
+
document_id: z.string().min(1).describe('Document ID to assign reviewer to'),
|
|
438
|
+
user_id: z.string().min(1).describe('User ID of the reviewer to assign'),
|
|
439
|
+
assigned_by: z.string().min(1).optional().describe('User ID of the person making the assignment'),
|
|
440
|
+
},
|
|
441
|
+
handler: handleWorkflowAssign,
|
|
442
|
+
},
|
|
443
|
+
ocr_workflow_status: {
|
|
444
|
+
description: '[STATUS] Get the current workflow state and full history for a document. Shows current state, all transitions, and any applied approval chains.',
|
|
445
|
+
inputSchema: {
|
|
446
|
+
document_id: z.string().min(1).describe('Document ID to check workflow status for'),
|
|
447
|
+
},
|
|
448
|
+
handler: handleWorkflowStatus,
|
|
449
|
+
},
|
|
450
|
+
ocr_workflow_queue: {
|
|
451
|
+
description: '[STATUS] List documents in the workflow queue. Filter by assigned reviewer, state, or due date. Returns paginated results sorted by due date then creation time.',
|
|
452
|
+
inputSchema: {
|
|
453
|
+
assigned_to: z.string().min(1).optional().describe('Filter by assigned reviewer user ID'),
|
|
454
|
+
state: z.string().min(1).optional().describe('Filter by workflow state (e.g., "submitted", "in_review")'),
|
|
455
|
+
due_before: z.string().min(1).optional().describe('Filter documents due before this ISO 8601 datetime'),
|
|
456
|
+
limit: z.number().int().min(1).max(200).default(50).describe('Max results (1-200, default 50)'),
|
|
457
|
+
offset: z.number().int().min(0).default(0).describe('Pagination offset'),
|
|
458
|
+
},
|
|
459
|
+
handler: handleWorkflowQueue,
|
|
460
|
+
},
|
|
461
|
+
ocr_approval_chain_create: {
|
|
462
|
+
description: '[MANAGE] Create a reusable approval chain with ordered steps. Each step specifies a required role. Chains can be applied to multiple documents for formal multi-step approval.',
|
|
463
|
+
inputSchema: {
|
|
464
|
+
name: z.string().min(1).max(200).describe('Name for the approval chain'),
|
|
465
|
+
description: z.string().max(1000).optional().describe('Description of the approval chain'),
|
|
466
|
+
steps: z.array(z.object({
|
|
467
|
+
role: z.string().min(1).describe('Required role for this step (e.g., "reviewer", "legal", "manager")'),
|
|
468
|
+
required_approvals: z.number().int().min(1).optional().describe('Number of approvals needed (default 1)'),
|
|
469
|
+
auto_advance: z.boolean().optional().describe('Auto-advance to next step on approval (default true)'),
|
|
470
|
+
})).min(1).describe('Ordered list of approval steps'),
|
|
471
|
+
created_by: z.string().min(1).optional().describe('User ID of the chain creator'),
|
|
472
|
+
},
|
|
473
|
+
handler: handleApprovalChainCreate,
|
|
474
|
+
},
|
|
475
|
+
ocr_approval_chain_apply: {
|
|
476
|
+
description: '[MANAGE] Apply an existing approval chain to a document. Creates pending approval steps for each step in the chain. Steps must be decided in order.',
|
|
477
|
+
inputSchema: {
|
|
478
|
+
document_id: z.string().min(1).describe('Document ID to apply the approval chain to'),
|
|
479
|
+
chain_id: z.string().min(1).describe('Approval chain ID to apply'),
|
|
480
|
+
},
|
|
481
|
+
handler: handleApprovalChainApply,
|
|
482
|
+
},
|
|
483
|
+
ocr_approval_step_decide: {
|
|
484
|
+
description: '[MANAGE] Decide on the current approval step for a document. Approve to advance to the next step, or reject to stop the chain (remaining steps are skipped). Reason is required for rejection.',
|
|
485
|
+
inputSchema: {
|
|
486
|
+
document_id: z.string().min(1).describe('Document ID'),
|
|
487
|
+
chain_id: z.string().min(1).describe('Approval chain ID'),
|
|
488
|
+
decision: ApprovalDecisionSchema.describe('Decision: approved or rejected'),
|
|
489
|
+
user_id: z.string().min(1).describe('User ID making the decision'),
|
|
490
|
+
reason: z.string().max(2000).optional().describe('Reason for the decision (required for rejection)'),
|
|
491
|
+
},
|
|
492
|
+
handler: handleApprovalStepDecide,
|
|
493
|
+
},
|
|
494
|
+
};
|
|
495
|
+
//# sourceMappingURL=workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/tools/workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,WAAW,EAA0C,MAAM,aAAa,CAAC;AAClG,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,qDAAqD,CAAC;AAC7D,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,qDAAqD,CAAC;AAE7D,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF,MAAM,sBAAsB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC,CAAC;AACrF,MAAM,sBAAsB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AAEhE,gFAAgF;AAChF,gCAAgC;AAChC,gFAAgF;AAEhF,KAAK,UAAU,oBAAoB,CAAC,MAA+B;IACjE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,aAAa,CACzB,CAAC,CAAC,MAAM,CAAC;YACP,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YACzC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;SAC3C,CAAC,EACF,MAAM,CACP,CAAC;QAEF,MAAM,EAAE,EAAE,EAAE,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QAEhC,yEAAyE;QACzE,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,wDAAwD;YACxD,mBAAmB,CAAC,IAAI,EAAE;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,KAAK,EAAE,OAAO;aACf,CAAC,CAAC;QACL,CAAC;QAED,8BAA8B;QAC9B,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,EAAE;YAC1C,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,KAAK,EAAE,WAAW;YAClB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC,CAAC;QAEH,OAAO,cAAc,CACnB,aAAa,CAAC;YACZ,cAAc,EAAE,SAAS;YACzB,UAAU,EAAE;gBACV,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,yCAAyC,EAAE;gBACvF,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,oCAAoC,EAAE;gBAClF,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,mCAAmC,EAAE;aACjF;SACF,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,gCAAgC;AAChC,gFAAgF;AAEhF,KAAK,UAAU,oBAAoB,CAAC,MAA+B;IACjE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,aAAa,CACzB,CAAC,CAAC,MAAM,CAAC;YACP,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,QAAQ,EAAE,sBAAsB;YAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;SACxC,CAAC,EACF,MAAM,CACP,CAAC;QAEF,+CAA+C;QAC/C,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,UAAU,IAAI,KAAK,CAAC,QAAQ,KAAK,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC/F,MAAM,IAAI,KAAK,CAAC,wCAAwC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,EAAE,EAAE,EAAE,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QAEhC,oCAAoC;QACpC,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,0CAA0C,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CACb,0BAA0B,KAAK,CAAC,WAAW,uBAAuB,OAAO,CAAC,KAAK,KAAK;gBACpF,0EAA0E,CAC3E,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,EAAE;YACzC,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,KAAK,EAAE,KAAK,CAAC,QAAQ;YACrB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,EAAE,CAAC;QACrB,IAAI,KAAK,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YAClC,SAAS,CAAC,IAAI,CACZ,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,8BAA8B,EAAE,EAC5E,EAAE,IAAI,EAAE,0BAA0B,EAAE,WAAW,EAAE,6CAA6C,EAAE,CACjG,CAAC;QACJ,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,mBAAmB,EAAE,CAAC;YAClD,SAAS,CAAC,IAAI,CACZ,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,8BAA8B,EAAE,EAC5E,EAAE,IAAI,EAAE,uBAAuB,EAAE,WAAW,EAAE,6CAA6C,EAAE,CAC9F,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,IAAI,CACZ,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAC7E,CAAC;QACJ,CAAC;QAED,OAAO,cAAc,CACnB,aAAa,CAAC;YACZ,cAAc,EAAE,QAAQ;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,UAAU,EAAE,SAAS;SACtB,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,gCAAgC;AAChC,gFAAgF;AAEhF,KAAK,UAAU,oBAAoB,CAAC,MAA+B;IACjE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,aAAa,CACzB,CAAC,CAAC,MAAM,CAAC;YACP,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;SAC1C,CAAC,EACF,MAAM,CACP,CAAC;QAEF,MAAM,EAAE,EAAE,EAAE,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QAEhC,6BAA6B;QAC7B,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,0CAA0C,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,6DAA6D;QAC7D,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CACb,oCAAoC,KAAK,CAAC,WAAW,iBAAiB,OAAO,CAAC,KAAK,KAAK;gBACxF,uDAAuD,CACxD,CAAC;QACJ,CAAC;QAED,mEAAmE;QACnE,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,EAAE;gBACzC,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,KAAK,EAAE,WAAW;gBAClB,WAAW,EAAE,KAAK,CAAC,OAAO;gBAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC,CAAC;YAEH,OAAO,cAAc,CACnB,aAAa,CAAC;gBACZ,cAAc,EAAE,QAAQ;gBACxB,WAAW,EAAE,KAAK,CAAC,OAAO;gBAC1B,eAAe,EAAE,WAAW;gBAC5B,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,uDAAuD,EAAE;oBACrG,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,uBAAuB,EAAE;iBACtE;aACF,CAAC,CACH,CAAC;QACJ,CAAC;QAED,qDAAqD;QACrD,8DAA8D;QAC9D,uEAAuE;QACvE,kDAAkD;QAClD,IAAI,CAAC,OAAO,CAAC;;;KAGZ,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAE7D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAC1B,4CAA4C,CAC7C,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAA4B,CAAC;QAE7C,OAAO,cAAc,CACnB,aAAa,CAAC;YACZ,cAAc,EAAE,OAAO;YACvB,WAAW,EAAE,KAAK,CAAC,OAAO;YAC1B,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE;gBACV,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,sBAAsB,EAAE;gBACpE,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,uBAAuB,EAAE;aACtE;SACF,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,gCAAgC;AAChC,gFAAgF;AAEhF,KAAK,UAAU,oBAAoB,CAAC,MAA+B;IACjE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,aAAa,CACzB,CAAC,CAAC,MAAM,CAAC;YACP,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;SAC/B,CAAC,EACF,MAAM,CACP,CAAC;QAEF,MAAM,EAAE,EAAE,EAAE,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QAEhC,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAE5D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,cAAc,CACnB,aAAa,CAAC;gBACZ,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,aAAa,EAAE,IAAI;gBACnB,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,uCAAuC;gBAChD,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,iCAAiC,EAAE;iBAChF;aACF,CAAC,CACH,CAAC;QACJ,CAAC;QAED,qDAAqD;QACrD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAChC,oEAAoE,CACrE,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAA2B,CAAC;QAEnD,MAAM,SAAS,GAAG,EAAE,CAAC;QACrB,QAAQ,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,KAAK,OAAO;gBACV,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC,CAAC;gBAClF,MAAM;YACR,KAAK,WAAW;gBACd,SAAS,CAAC,IAAI,CACZ,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,mBAAmB,EAAE,EACjE,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,mBAAmB,EAAE,CACjE,CAAC;gBACF,MAAM;YACR,KAAK,WAAW;gBACd,SAAS,CAAC,IAAI,CACZ,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,wBAAwB,EAAE,CACvE,CAAC;gBACF,MAAM;YACR,KAAK,mBAAmB;gBACtB,SAAS,CAAC,IAAI,CACZ,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,yBAAyB,EAAE,CACxE,CAAC;gBACF,MAAM;YACR,KAAK,UAAU;gBACb,SAAS,CAAC,IAAI,CACZ,EAAE,IAAI,EAAE,0BAA0B,EAAE,WAAW,EAAE,yBAAyB,EAAE,EAC5E,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,mBAAmB,EAAE,CACjE,CAAC;gBACF,MAAM;YACR;gBACE,SAAS,CAAC,IAAI,CACZ,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,mBAAmB,EAAE,CACjE,CAAC;QACN,CAAC;QAED,OAAO,cAAc,CACnB,aAAa,CAAC;YACZ,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,aAAa,EAAE,OAAO;YACtB,OAAO;YACP,uBAAuB,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC7D,UAAU,EAAE,SAAS;SACtB,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,+BAA+B;AAC/B,gFAAgF;AAEhF,KAAK,UAAU,mBAAmB,CAAC,MAA+B;IAChE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,aAAa,CACzB,CAAC,CAAC,MAAM,CAAC;YACP,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YACzC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YACnC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;SAC3C,CAAC,EACF,MAAM,CACP,CAAC;QAEF,MAAM,EAAE,EAAE,EAAE,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QAEhC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;QAEjC,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE;YACrC,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,KAAK;YACL,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC;QAE5D,OAAO,cAAc,CACnB,aAAa,CAAC;YACZ,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK;YACL,MAAM;YACN,QAAQ,EAAE,OAAO;YACjB,UAAU,EAAE,OAAO;gBACjB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,6BAA6B,MAAM,GAAG,KAAK,EAAE,EAAE,CAAC;gBAC9F,CAAC,CAAC;oBACE,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,qCAAqC,EAAE;oBACnF,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,kCAAkC,EAAE;oBAChF,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,iCAAiC,EAAE;iBAChF;SACN,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,sCAAsC;AACtC,gFAAgF;AAEhF,KAAK,UAAU,yBAAyB,CAAC,MAA+B;IACtE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,aAAa,CACzB,CAAC,CAAC,MAAM,CAAC;YACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;YAC5C,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;gBACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvB,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACtD,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;aACrC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACV,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;SACzC,CAAC,EACF,MAAM,CACP,CAAC;QAEF,MAAM,EAAE,EAAE,EAAE,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QAEhC,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,EAAE;YACtC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC,CAAC;QAEH,OAAO,cAAc,CACnB,aAAa,CAAC;YACZ,KAAK;YACL,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;YAC/B,UAAU,EAAE;gBACV,EAAE,IAAI,EAAE,0BAA0B,EAAE,WAAW,EAAE,gCAAgC,EAAE;gBACnF,EAAE,IAAI,EAAE,2BAA2B,EAAE,WAAW,EAAE,+BAA+B,EAAE;aACpF;SACF,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,qCAAqC;AACrC,gFAAgF;AAEhF,KAAK,UAAU,wBAAwB,CAAC,MAA+B;IACrE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,aAAa,CACzB,CAAC,CAAC,MAAM,CAAC;YACP,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;SAC5B,CAAC,EACF,MAAM,CACP,CAAC;QAEF,MAAM,EAAE,EAAE,EAAE,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QAEhC,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC1E,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEvD,OAAO,cAAc,CACnB,aAAa,CAAC;YACZ,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,aAAa,EAAE,KAAK,CAAC,MAAM;YAC3B,KAAK;YACL,YAAY,EAAE,WAAW;YACzB,UAAU,EAAE;gBACV,EAAE,IAAI,EAAE,0BAA0B,EAAE,WAAW,EAAE,qCAAqC,EAAE;gBACxF,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,+CAA+C,EAAE;aAC9F;SACF,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,qCAAqC;AACrC,gFAAgF;AAEhF,KAAK,UAAU,wBAAwB,CAAC,MAA+B;IACrE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,aAAa,CACzB,CAAC,CAAC,MAAM,CAAC;YACP,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,QAAQ,EAAE,sBAAsB;YAChC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;SACxC,CAAC,EACF,MAAM,CACP,CAAC;QAEF,IAAI,KAAK,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,EAAE,EAAE,EAAE,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QAEhC,+CAA+C;QAC/C,MAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,4BAA4B;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAC3B,8EAA8E,CAC/E,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YAEzC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CACb,gFAAgF,KAAK,CAAC,QAAQ,gBAAgB,KAAK,CAAC,WAAW,EAAE,CAClI,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,kBAAkB,CAChC,IAAI,EACJ,WAAW,CAAC,EAAE,EACd,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,MAAM,CACb,CAAC;QAEF,uBAAuB;QACvB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE9E,MAAM,SAAS,GAAG,EAAE,CAAC;QACrB,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC1B,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,0BAA0B;gBAChC,WAAW,EAAE,wBAAwB,QAAQ,CAAC,YAAY,CAAC,aAAa,WAAW,QAAQ,CAAC,YAAY,CAAC,UAAU,GAAG;aACvH,CAAC,CAAC;QACL,CAAC;QACD,IAAI,QAAQ,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAClD,SAAS,CAAC,IAAI,CACZ,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAC3E,CAAC;QACJ,CAAC;QACD,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YACzB,SAAS,CAAC,IAAI,CACZ,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,sCAAsC,EAAE,CACrF,CAAC;QACJ,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,SAAS,CAAC,IAAI,CACZ,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,sBAAsB,EAAE,CACrE,CAAC;QACJ,CAAC;QAED,OAAO,cAAc,CACnB,aAAa,CAAC;YACZ,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE;gBACR,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,eAAe,EAAE,QAAQ,CAAC,eAAe;gBACzC,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,YAAY,EAAE,QAAQ,CAAC,YAAY;aACpC;YACD,UAAU,EAAE,SAAS;SACtB,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,0BAA0B;AAC1B,gFAAgF;AAEhF,MAAM,CAAC,MAAM,aAAa,GAAmC;IAC3D,mBAAmB,EAAE;QACnB,WAAW,EACT,mLAAmL;QACrL,WAAW,EAAE;YACX,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YAC3E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YACvF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;YAC1F,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;SAChH;QACD,OAAO,EAAE,oBAAoB;KAC9B;IAED,mBAAmB,EAAE;QACnB,WAAW,EACT,uKAAuK;QACzK,WAAW,EAAE;YACX,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAChE,QAAQ,EAAE,sBAAsB,CAAC,QAAQ,CAAC,2DAA2D,CAAC;YACtG,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iEAAiE,CAAC;SACpH;QACD,OAAO,EAAE,oBAAoB;KAC9B;IAED,mBAAmB,EAAE;QACnB,WAAW,EACT,+KAA+K;QACjL,WAAW,EAAE;YACX,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAC5E,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YACxE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;SAClG;QACD,OAAO,EAAE,oBAAoB;KAC9B;IAED,mBAAmB,EAAE;QACnB,WAAW,EACT,iJAAiJ;QACnJ,WAAW,EAAE;YACX,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0CAA0C,CAAC;SACpF;QACD,OAAO,EAAE,oBAAoB;KAC9B;IAED,kBAAkB,EAAE;QAClB,WAAW,EACT,kKAAkK;QACpK,WAAW,EAAE;YACX,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;YACzF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;YACzG,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;YACvG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YAC/F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;SACzE;QACD,OAAO,EAAE,mBAAmB;KAC7B;IAED,yBAAyB,EAAE;QACzB,WAAW,EACT,gLAAgL;QAClL,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YACxE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAC1F,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;gBACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oEAAoE,CAAC;gBACtG,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;gBACzG,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;aACtG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YACrD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;SAClF;QACD,OAAO,EAAE,yBAAyB;KACnC;IAED,wBAAwB,EAAE;QACxB,WAAW,EACT,qJAAqJ;QACvJ,WAAW,EAAE;YACX,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC;YACrF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;SACnE;QACD,OAAO,EAAE,wBAAwB;KAClC;IAED,wBAAwB,EAAE;QACxB,WAAW,EACT,gMAAgM;QAClM,WAAW,EAAE;YACX,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;YACtD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YACzD,QAAQ,EAAE,sBAAsB,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YAC3E,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YAClE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;SACrG;QACD,OAAO,EAAE,wBAAwB;KAClC;CACF,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exponential Backoff with Jitter
|
|
3
|
+
*
|
|
4
|
+
* Replaces fixed waits for rate limits with exponential backoff.
|
|
5
|
+
* Base delay doubles each attempt: 1s, 2s, 4s, 8s, 16s (capped at 30s).
|
|
6
|
+
* Jitter adds +/-25% randomness to prevent thundering herd.
|
|
7
|
+
*
|
|
8
|
+
* CRITICAL: NEVER use console.log() - stdout is JSON-RPC protocol.
|
|
9
|
+
*
|
|
10
|
+
* @module utils/backoff
|
|
11
|
+
*/
|
|
12
|
+
export interface BackoffConfig {
|
|
13
|
+
/** Base delay in milliseconds (default: 1000) */
|
|
14
|
+
baseDelayMs: number;
|
|
15
|
+
/** Maximum delay in milliseconds (default: 30000) */
|
|
16
|
+
maxDelayMs: number;
|
|
17
|
+
/** Maximum number of retry attempts (default: 3) */
|
|
18
|
+
maxAttempts: number;
|
|
19
|
+
/** Jitter fraction +/- (default: 0.25 = +/-25%) */
|
|
20
|
+
jitterFraction: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Calculate delay for a given attempt (0-indexed) with jitter.
|
|
24
|
+
*
|
|
25
|
+
* Formula: min(baseDelay * 2^attempt, maxDelay) +/- jitter
|
|
26
|
+
*
|
|
27
|
+
* @param attempt - Zero-indexed attempt number
|
|
28
|
+
* @param config - Optional partial backoff configuration
|
|
29
|
+
* @returns Delay in milliseconds (always >= 0)
|
|
30
|
+
*/
|
|
31
|
+
export declare function calculateBackoffDelay(attempt: number, config?: Partial<BackoffConfig>): number;
|
|
32
|
+
/**
|
|
33
|
+
* Sleep for the backoff duration.
|
|
34
|
+
*
|
|
35
|
+
* @param attempt - Zero-indexed attempt number
|
|
36
|
+
* @param config - Optional partial backoff configuration
|
|
37
|
+
* @returns Promise that resolves after the delay
|
|
38
|
+
*/
|
|
39
|
+
export declare function backoffSleep(attempt: number, config?: Partial<BackoffConfig>): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Execute a function with automatic retry and exponential backoff.
|
|
42
|
+
*
|
|
43
|
+
* Retries on errors that pass the shouldRetry predicate, up to maxAttempts.
|
|
44
|
+
* Non-retryable errors are re-thrown immediately.
|
|
45
|
+
*
|
|
46
|
+
* @param fn - Async function to execute
|
|
47
|
+
* @param shouldRetry - Predicate to determine if an error is retryable
|
|
48
|
+
* @param config - Optional partial backoff configuration
|
|
49
|
+
* @returns The result of fn on success
|
|
50
|
+
* @throws The last error if all attempts fail
|
|
51
|
+
*/
|
|
52
|
+
export declare function withRetry<T>(fn: () => Promise<T>, shouldRetry: (error: unknown) => boolean, config?: Partial<BackoffConfig>): Promise<T>;
|
|
53
|
+
//# sourceMappingURL=backoff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backoff.d.ts","sourceRoot":"","sources":["../../src/utils/backoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,cAAc,EAAE,MAAM,CAAC;CACxB;AASD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,MAAM,CAU9F;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5F;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,EACxC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAC9B,OAAO,CAAC,CAAC,CAAC,CAiBZ"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exponential Backoff with Jitter
|
|
3
|
+
*
|
|
4
|
+
* Replaces fixed waits for rate limits with exponential backoff.
|
|
5
|
+
* Base delay doubles each attempt: 1s, 2s, 4s, 8s, 16s (capped at 30s).
|
|
6
|
+
* Jitter adds +/-25% randomness to prevent thundering herd.
|
|
7
|
+
*
|
|
8
|
+
* CRITICAL: NEVER use console.log() - stdout is JSON-RPC protocol.
|
|
9
|
+
*
|
|
10
|
+
* @module utils/backoff
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_BACKOFF = {
|
|
13
|
+
baseDelayMs: 1000,
|
|
14
|
+
maxDelayMs: 30000,
|
|
15
|
+
maxAttempts: 3,
|
|
16
|
+
jitterFraction: 0.25,
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Calculate delay for a given attempt (0-indexed) with jitter.
|
|
20
|
+
*
|
|
21
|
+
* Formula: min(baseDelay * 2^attempt, maxDelay) +/- jitter
|
|
22
|
+
*
|
|
23
|
+
* @param attempt - Zero-indexed attempt number
|
|
24
|
+
* @param config - Optional partial backoff configuration
|
|
25
|
+
* @returns Delay in milliseconds (always >= 0)
|
|
26
|
+
*/
|
|
27
|
+
export function calculateBackoffDelay(attempt, config) {
|
|
28
|
+
const cfg = { ...DEFAULT_BACKOFF, ...config };
|
|
29
|
+
const exponentialDelay = cfg.baseDelayMs * Math.pow(2, attempt);
|
|
30
|
+
const cappedDelay = Math.min(exponentialDelay, cfg.maxDelayMs);
|
|
31
|
+
// Add jitter: +/-jitterFraction
|
|
32
|
+
const jitterRange = cappedDelay * cfg.jitterFraction;
|
|
33
|
+
const jitter = (Math.random() * 2 - 1) * jitterRange;
|
|
34
|
+
return Math.max(0, Math.round(cappedDelay + jitter));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Sleep for the backoff duration.
|
|
38
|
+
*
|
|
39
|
+
* @param attempt - Zero-indexed attempt number
|
|
40
|
+
* @param config - Optional partial backoff configuration
|
|
41
|
+
* @returns Promise that resolves after the delay
|
|
42
|
+
*/
|
|
43
|
+
export function backoffSleep(attempt, config) {
|
|
44
|
+
const delay = calculateBackoffDelay(attempt, config);
|
|
45
|
+
console.error(`[Backoff] Attempt ${attempt + 1}: waiting ${delay}ms`);
|
|
46
|
+
return new Promise((resolve) => setTimeout(resolve, delay));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Execute a function with automatic retry and exponential backoff.
|
|
50
|
+
*
|
|
51
|
+
* Retries on errors that pass the shouldRetry predicate, up to maxAttempts.
|
|
52
|
+
* Non-retryable errors are re-thrown immediately.
|
|
53
|
+
*
|
|
54
|
+
* @param fn - Async function to execute
|
|
55
|
+
* @param shouldRetry - Predicate to determine if an error is retryable
|
|
56
|
+
* @param config - Optional partial backoff configuration
|
|
57
|
+
* @returns The result of fn on success
|
|
58
|
+
* @throws The last error if all attempts fail
|
|
59
|
+
*/
|
|
60
|
+
export async function withRetry(fn, shouldRetry, config) {
|
|
61
|
+
const cfg = { ...DEFAULT_BACKOFF, ...config };
|
|
62
|
+
let lastError;
|
|
63
|
+
for (let attempt = 0; attempt < cfg.maxAttempts; attempt++) {
|
|
64
|
+
try {
|
|
65
|
+
return await fn();
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
lastError = error;
|
|
69
|
+
if (!shouldRetry(error))
|
|
70
|
+
throw error;
|
|
71
|
+
if (attempt < cfg.maxAttempts - 1) {
|
|
72
|
+
await backoffSleep(attempt, cfg);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
throw lastError;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=backoff.js.map
|