@try-works/dsh-tool-mode 0.0.0-stage → 0.5.45
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.
- package/LICENSE +205 -0
- package/README.md +303 -2
- package/bin/dsh-tool-mode-credentials.mjs +20 -0
- package/bin/dsh-tool-mode-mcp-stdio.mjs +80 -0
- package/bin/dsh-tool-mode.mjs +211 -0
- package/builtins.lock.json +26 -0
- package/catalog/desert-ant-models.json +693 -0
- package/catalog/playbooks.json +531 -0
- package/client/client.model-tools.js +1910 -0
- package/client/index.js +4158 -0
- package/cordis.patch.yml +39 -0
- package/lib/adapters/index.d.ts +61 -0
- package/lib/adapters/index.d.ts.map +1 -0
- package/lib/adapters/index.js +82 -0
- package/lib/adapters/types.d.ts +106 -0
- package/lib/adapters/types.d.ts.map +1 -0
- package/lib/adapters/types.js +85 -0
- package/lib/approval.d.ts +189 -0
- package/lib/approval.d.ts.map +1 -0
- package/lib/approval.js +510 -0
- package/lib/asset-acquisition.d.ts +149 -0
- package/lib/asset-acquisition.d.ts.map +1 -0
- package/lib/asset-acquisition.js +175 -0
- package/lib/authority.d.ts +185 -0
- package/lib/authority.d.ts.map +1 -0
- package/lib/authority.js +223 -0
- package/lib/bindings.d.ts +144 -0
- package/lib/bindings.d.ts.map +1 -0
- package/lib/bindings.js +314 -0
- package/lib/builtins.d.ts +27 -0
- package/lib/builtins.d.ts.map +1 -0
- package/lib/builtins.js +37 -0
- package/lib/capability.d.ts +58 -0
- package/lib/capability.d.ts.map +1 -0
- package/lib/capability.js +192 -0
- package/lib/capture-path.d.ts +97 -0
- package/lib/capture-path.d.ts.map +1 -0
- package/lib/capture-path.js +152 -0
- package/lib/catalog.d.ts +37 -0
- package/lib/catalog.d.ts.map +1 -0
- package/lib/catalog.js +274 -0
- package/lib/contract-payload.d.ts +39 -0
- package/lib/contract-payload.d.ts.map +1 -0
- package/lib/contract-payload.js +56 -0
- package/lib/custom-tools/compile.d.ts +25 -0
- package/lib/custom-tools/compile.d.ts.map +1 -0
- package/lib/custom-tools/compile.js +61 -0
- package/lib/custom-tools/composite-executor.d.ts +42 -0
- package/lib/custom-tools/composite-executor.d.ts.map +1 -0
- package/lib/custom-tools/composite-executor.js +113 -0
- package/lib/custom-tools/dispatch.d.ts +28 -0
- package/lib/custom-tools/dispatch.d.ts.map +1 -0
- package/lib/custom-tools/dispatch.js +34 -0
- package/lib/custom-tools/http-executor.d.ts +48 -0
- package/lib/custom-tools/http-executor.d.ts.map +1 -0
- package/lib/custom-tools/http-executor.js +241 -0
- package/lib/custom-tools/index.d.ts +12 -0
- package/lib/custom-tools/index.d.ts.map +1 -0
- package/lib/custom-tools/index.js +12 -0
- package/lib/custom-tools/mcp-surface.d.ts +14 -0
- package/lib/custom-tools/mcp-surface.d.ts.map +1 -0
- package/lib/custom-tools/mcp-surface.js +41 -0
- package/lib/custom-tools/prompt-executor.d.ts +39 -0
- package/lib/custom-tools/prompt-executor.d.ts.map +1 -0
- package/lib/custom-tools/prompt-executor.js +59 -0
- package/lib/custom-tools/registry.d.ts +69 -0
- package/lib/custom-tools/registry.d.ts.map +1 -0
- package/lib/custom-tools/registry.js +130 -0
- package/lib/custom-tools/schema.d.ts +26 -0
- package/lib/custom-tools/schema.d.ts.map +1 -0
- package/lib/custom-tools/schema.js +375 -0
- package/lib/custom-tools/service.d.ts +90 -0
- package/lib/custom-tools/service.d.ts.map +1 -0
- package/lib/custom-tools/service.js +203 -0
- package/lib/custom-tools/store.d.ts +61 -0
- package/lib/custom-tools/store.d.ts.map +1 -0
- package/lib/custom-tools/store.js +240 -0
- package/lib/custom-tools/types.d.ts +131 -0
- package/lib/custom-tools/types.d.ts.map +1 -0
- package/lib/custom-tools/types.js +11 -0
- package/lib/decision-combine.d.ts +113 -0
- package/lib/decision-combine.d.ts.map +1 -0
- package/lib/decision-combine.js +156 -0
- package/lib/decision-evaluate.d.ts +185 -0
- package/lib/decision-evaluate.d.ts.map +1 -0
- package/lib/decision-evaluate.js +227 -0
- package/lib/deployment-coordinator.d.ts +213 -0
- package/lib/deployment-coordinator.d.ts.map +1 -0
- package/lib/deployment-coordinator.js +274 -0
- package/lib/diagnostics.d.ts +169 -0
- package/lib/diagnostics.d.ts.map +1 -0
- package/lib/diagnostics.js +136 -0
- package/lib/discovery-contracts.d.ts +14 -0
- package/lib/discovery-contracts.d.ts.map +1 -0
- package/lib/discovery-contracts.js +90 -0
- package/lib/discovery-describe.d.ts +35 -0
- package/lib/discovery-describe.d.ts.map +1 -0
- package/lib/discovery-describe.js +99 -0
- package/lib/embedding-index.d.ts +55 -0
- package/lib/embedding-index.d.ts.map +1 -0
- package/lib/embedding-index.js +126 -0
- package/lib/extension-dependencies.d.ts +355 -0
- package/lib/extension-dependencies.d.ts.map +1 -0
- package/lib/extension-dependencies.js +987 -0
- package/lib/extension-dispatch.d.ts +150 -0
- package/lib/extension-dispatch.d.ts.map +1 -0
- package/lib/extension-dispatch.js +178 -0
- package/lib/extension-page-state.d.ts +69 -0
- package/lib/extension-page-state.d.ts.map +1 -0
- package/lib/extension-page-state.js +82 -0
- package/lib/extension-registrar.d.ts +116 -0
- package/lib/extension-registrar.d.ts.map +1 -0
- package/lib/extension-registrar.js +144 -0
- package/lib/extensions-api.d.ts +346 -0
- package/lib/extensions-api.d.ts.map +1 -0
- package/lib/extensions-api.js +17 -0
- package/lib/extensions-remote.d.ts +57 -0
- package/lib/extensions-remote.d.ts.map +1 -0
- package/lib/extensions-remote.js +69 -0
- package/lib/extensions-service.d.ts +568 -0
- package/lib/extensions-service.d.ts.map +1 -0
- package/lib/extensions-service.js +2552 -0
- package/lib/harness-budgets.d.ts +158 -0
- package/lib/harness-budgets.d.ts.map +1 -0
- package/lib/harness-budgets.js +152 -0
- package/lib/harness-llm.d.ts +138 -0
- package/lib/harness-llm.d.ts.map +1 -0
- package/lib/harness-llm.js +218 -0
- package/lib/harness-serving.d.ts +115 -0
- package/lib/harness-serving.d.ts.map +1 -0
- package/lib/harness-serving.js +176 -0
- package/lib/headless.d.ts +97 -0
- package/lib/headless.d.ts.map +1 -0
- package/lib/headless.js +407 -0
- package/lib/http-acquisition.d.ts +27 -0
- package/lib/http-acquisition.d.ts.map +1 -0
- package/lib/http-acquisition.js +140 -0
- package/lib/index.d.ts +546 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +5273 -0
- package/lib/invocation-accounting.d.ts +169 -0
- package/lib/invocation-accounting.d.ts.map +1 -0
- package/lib/invocation-accounting.js +148 -0
- package/lib/jev.d.ts +218 -0
- package/lib/jev.d.ts.map +1 -0
- package/lib/jev.js +366 -0
- package/lib/legacy-migration.d.ts +95 -0
- package/lib/legacy-migration.d.ts.map +1 -0
- package/lib/legacy-migration.js +429 -0
- package/lib/license-basis.d.ts +29 -0
- package/lib/license-basis.d.ts.map +1 -0
- package/lib/license-basis.js +58 -0
- package/lib/managed-workers.d.ts +158 -0
- package/lib/managed-workers.d.ts.map +1 -0
- package/lib/managed-workers.js +269 -0
- package/lib/mcp/auth-selection.d.ts +35 -0
- package/lib/mcp/auth-selection.d.ts.map +1 -0
- package/lib/mcp/auth-selection.js +64 -0
- package/lib/mcp/client-grant.d.ts +89 -0
- package/lib/mcp/client-grant.d.ts.map +1 -0
- package/lib/mcp/client-grant.js +63 -0
- package/lib/mcp/credential-cli.d.ts +38 -0
- package/lib/mcp/credential-cli.d.ts.map +1 -0
- package/lib/mcp/credential-cli.js +148 -0
- package/lib/mcp/credential-store.d.ts +143 -0
- package/lib/mcp/credential-store.d.ts.map +1 -0
- package/lib/mcp/credential-store.js +461 -0
- package/lib/mcp/export-policy.d.ts +25 -0
- package/lib/mcp/export-policy.d.ts.map +1 -0
- package/lib/mcp/export-policy.js +31 -0
- package/lib/mcp/host-binding.d.ts +144 -0
- package/lib/mcp/host-binding.d.ts.map +1 -0
- package/lib/mcp/host-binding.js +280 -0
- package/lib/mcp/http.d.ts +180 -0
- package/lib/mcp/http.d.ts.map +1 -0
- package/lib/mcp/http.js +602 -0
- package/lib/mcp/oauth.d.ts +149 -0
- package/lib/mcp/oauth.d.ts.map +1 -0
- package/lib/mcp/oauth.js +396 -0
- package/lib/mcp/protocol.d.ts +329 -0
- package/lib/mcp/protocol.d.ts.map +1 -0
- package/lib/mcp/protocol.js +459 -0
- package/lib/mcp/rate-limit.d.ts +68 -0
- package/lib/mcp/rate-limit.d.ts.map +1 -0
- package/lib/mcp/rate-limit.js +114 -0
- package/lib/mcp/sdk-v2.d.ts +17 -0
- package/lib/mcp/sdk-v2.d.ts.map +1 -0
- package/lib/mcp/sdk-v2.js +204 -0
- package/lib/mcp/server.d.ts +149 -0
- package/lib/mcp/server.d.ts.map +1 -0
- package/lib/mcp/server.js +302 -0
- package/lib/mcp/stdio.d.ts +80 -0
- package/lib/mcp/stdio.d.ts.map +1 -0
- package/lib/mcp/stdio.js +184 -0
- package/lib/mcp/subscriptions.d.ts +177 -0
- package/lib/mcp/subscriptions.d.ts.map +1 -0
- package/lib/mcp/subscriptions.js +288 -0
- package/lib/mcp-status.d.ts +96 -0
- package/lib/mcp-status.d.ts.map +1 -0
- package/lib/mcp-status.js +70 -0
- package/lib/mcp-usage.d.ts +110 -0
- package/lib/mcp-usage.d.ts.map +1 -0
- package/lib/mcp-usage.js +189 -0
- package/lib/model-qualification.d.ts +192 -0
- package/lib/model-qualification.d.ts.map +1 -0
- package/lib/model-qualification.js +178 -0
- package/lib/model-runtime-lane.d.ts +69 -0
- package/lib/model-runtime-lane.d.ts.map +1 -0
- package/lib/model-runtime-lane.js +122 -0
- package/lib/model-runtime-recipe.d.ts +132 -0
- package/lib/model-runtime-recipe.d.ts.map +1 -0
- package/lib/model-runtime-recipe.js +291 -0
- package/lib/planning.d.ts +256 -0
- package/lib/planning.d.ts.map +1 -0
- package/lib/planning.js +471 -0
- package/lib/playbook.d.ts +42 -0
- package/lib/playbook.d.ts.map +1 -0
- package/lib/playbook.js +65 -0
- package/lib/prepared-assets.d.ts +269 -0
- package/lib/prepared-assets.d.ts.map +1 -0
- package/lib/prepared-assets.js +471 -0
- package/lib/provider-bridge.d.ts +107 -0
- package/lib/provider-bridge.d.ts.map +1 -0
- package/lib/provider-bridge.js +423 -0
- package/lib/ptc-authority.d.ts +154 -0
- package/lib/ptc-authority.d.ts.map +1 -0
- package/lib/ptc-authority.js +242 -0
- package/lib/ptc-confinement.d.ts +60 -0
- package/lib/ptc-confinement.d.ts.map +1 -0
- package/lib/ptc-confinement.js +212 -0
- package/lib/ptc-runtime.d.ts +166 -0
- package/lib/ptc-runtime.d.ts.map +1 -0
- package/lib/ptc-runtime.js +231 -0
- package/lib/publication.d.ts +161 -0
- package/lib/publication.d.ts.map +1 -0
- package/lib/publication.js +181 -0
- package/lib/receipt-store.d.ts +57 -0
- package/lib/receipt-store.d.ts.map +1 -0
- package/lib/receipt-store.js +143 -0
- package/lib/receipt.d.ts +231 -0
- package/lib/receipt.d.ts.map +1 -0
- package/lib/receipt.js +165 -0
- package/lib/registrar.d.ts +75 -0
- package/lib/registrar.d.ts.map +1 -0
- package/lib/registrar.js +152 -0
- package/lib/resource-governance.d.ts +204 -0
- package/lib/resource-governance.d.ts.map +1 -0
- package/lib/resource-governance.js +213 -0
- package/lib/server-lifecycle.d.ts +175 -0
- package/lib/server-lifecycle.d.ts.map +1 -0
- package/lib/server-lifecycle.js +269 -0
- package/lib/skills.d.ts +31 -0
- package/lib/skills.d.ts.map +1 -0
- package/lib/skills.js +170 -0
- package/lib/speech-bridge.d.ts +74 -0
- package/lib/speech-bridge.d.ts.map +1 -0
- package/lib/speech-bridge.js +115 -0
- package/lib/state.d.ts +100 -0
- package/lib/state.d.ts.map +1 -0
- package/lib/state.js +160 -0
- package/lib/title-proposal.d.ts +194 -0
- package/lib/title-proposal.d.ts.map +1 -0
- package/lib/title-proposal.js +244 -0
- package/lib/tool-inventory.d.ts +90 -0
- package/lib/tool-inventory.d.ts.map +1 -0
- package/lib/tool-inventory.js +102 -0
- package/lib/tool-mode-run.d.ts +310 -0
- package/lib/tool-mode-run.d.ts.map +1 -0
- package/lib/tool-mode-run.js +411 -0
- package/lib/tool-sources.d.ts +80 -0
- package/lib/tool-sources.d.ts.map +1 -0
- package/lib/tool-sources.js +123 -0
- package/lib/tool-usage-projection.d.ts +390 -0
- package/lib/tool-usage-projection.d.ts.map +1 -0
- package/lib/tool-usage-projection.js +1038 -0
- package/lib/tool-usage-report.d.ts +153 -0
- package/lib/tool-usage-report.d.ts.map +1 -0
- package/lib/tool-usage-report.js +274 -0
- package/lib/transport.d.ts +158 -0
- package/lib/transport.d.ts.map +1 -0
- package/lib/transport.js +332 -0
- package/lib/types.d.ts +134 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +8 -0
- package/lib/update-surface.d.ts +79 -0
- package/lib/update-surface.d.ts.map +1 -0
- package/lib/update-surface.js +224 -0
- package/lib/version.d.ts +3 -0
- package/lib/version.d.ts.map +1 -0
- package/lib/version.js +27 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/contract-metadata.d.ts +13 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/contract-metadata.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/contract-metadata.js +85 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/contracts/lang-detect.d.ts +16 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/contracts/lang-detect.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/contracts/lang-detect.js +87 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/contracts/standard.d.ts +38 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/contracts/standard.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/contracts/standard.js +445 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/contracts/stt-transcribe.d.ts +20 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/contracts/stt-transcribe.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/contracts/stt-transcribe.js +112 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/contracts/text-embed.d.ts +14 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/contracts/text-embed.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/contracts/text-embed.js +63 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/contracts/text-rerank.d.ts +14 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/contracts/text-rerank.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/contracts/text-rerank.js +76 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/dsh.d.ts +82 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/dsh.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/dsh.js +274 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/index.d.ts +26 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/index.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/index.js +53 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/meta.d.ts +133 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/meta.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/meta.js +64 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/registry.d.ts +121 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/registry.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-contracts/lib/registry.js +246 -0
- package/node_modules/@try-works/tool-mode-contracts/package.json +35 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/bin/dsh-tool-mode.mjs +20 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/cli.d.ts +80 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/cli.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/cli.js +533 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/declarative-recipes.d.ts +86 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/declarative-recipes.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/declarative-recipes.js +145 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/discovery.d.ts +70 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/discovery.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/discovery.js +201 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/errors.d.ts +57 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/errors.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/errors.js +83 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/index.d.ts +33 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/index.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/index.js +33 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/archive.d.ts +86 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/archive.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/archive.js +191 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/dependencies.d.ts +137 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/dependencies.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/dependencies.js +349 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/lifecycle.d.ts +274 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/lifecycle.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/lifecycle.js +932 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/migration.d.ts +210 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/migration.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/migration.js +368 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/runtime-link.d.ts +63 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/runtime-link.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/runtime-link.js +149 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/source-directory.d.ts +35 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/source-directory.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/source-directory.js +179 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/staged.d.ts +179 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/staged.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/staged.js +299 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/store.d.ts +395 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/store.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/store.js +839 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/tar-gzip-source.d.ts +44 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/tar-gzip-source.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/tar-gzip-source.js +255 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/update-flow.d.ts +185 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/update-flow.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/update-flow.js +504 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/zip-source.d.ts +17 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/zip-source.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/install/zip-source.js +80 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/licensing.d.ts +221 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/licensing.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/licensing.js +188 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/load.d.ts +52 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/load.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/load.js +102 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/manifest.d.ts +171 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/manifest.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/manifest.js +271 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/runtime.d.ts +242 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/runtime.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/runtime.js +58 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/state.d.ts +128 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/state.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/state.js +113 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/test-host.d.ts +41 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/test-host.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/test-host.js +52 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/worker/worker-child.d.ts +2 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/worker/worker-child.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/worker/worker-child.js +351 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/worker.d.ts +157 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/worker.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/lib/worker.js +688 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/package.json +54 -0
- package/node_modules/@try-works/tool-mode-extension-sdk/schema/extension-manifest-1.1.0.schema.json +253 -0
- package/node_modules/@try-works/tool-mode-recipes/bin/tool-mode-recipe.mjs +15 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/broker.d.ts +460 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/broker.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/broker.js +647 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/cli.d.ts +61 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/cli.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/cli.js +1106 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/dsh-adapter.d.ts +237 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/dsh-adapter.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/dsh-adapter.js +205 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/fixture-provider.d.ts +85 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/fixture-provider.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/fixture-provider.js +176 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/images.d.ts +119 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/images.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/images.js +201 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/index.d.ts +25 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/index.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/index.js +25 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/recipe-format.d.ts +345 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/recipe-format.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/recipe-format.js +1465 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/templates.d.ts +51 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/templates.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/templates.js +310 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/titles.d.ts +231 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/titles.d.ts.map +1 -0
- package/node_modules/@try-works/tool-mode-recipes/lib/titles.js +435 -0
- package/node_modules/@try-works/tool-mode-recipes/package.json +56 -0
- package/node_modules/@try-works/tool-mode-recipes/recipes/describe-image.json +38 -0
- package/node_modules/@try-works/tool-mode-recipes/recipes/text-title.json +45 -0
- package/node_modules/@try-works/tool-mode-recipes/schema/harness-model-recipe.schema.json +273 -0
- package/package.json +127 -4
- package/remote/spec.mjs +993 -0
- package/remote/typert.host.mjs +14 -0
- package/remote/typert.remote-client.mjs +16 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kind dispatch for custom tools.
|
|
3
|
+
*
|
|
4
|
+
* @module @try-works/dsh-tool-mode/custom-tools/dispatch
|
|
5
|
+
*/
|
|
6
|
+
import { executeCompositeCustomTool } from "./composite-executor.js";
|
|
7
|
+
import { executeHttpCustomTool } from "./http-executor.js";
|
|
8
|
+
import { executePromptCustomTool } from "./prompt-executor.js";
|
|
9
|
+
/**
|
|
10
|
+
* Execute a record according to its validated kind.
|
|
11
|
+
* @param record - validated record.
|
|
12
|
+
* @param args - model-supplied arguments.
|
|
13
|
+
* @param context - cancellation.
|
|
14
|
+
* @param deps - kind-specific seams.
|
|
15
|
+
* @returns the canonical result value.
|
|
16
|
+
*/
|
|
17
|
+
export async function executeCustomTool(record, args, context, deps = {}) {
|
|
18
|
+
switch (record.execution.kind) {
|
|
19
|
+
case 'http':
|
|
20
|
+
return executeHttpCustomTool(record, args, context, deps.http ?? {});
|
|
21
|
+
case 'prompt':
|
|
22
|
+
return executePromptCustomTool(record, args, context, deps.prompt ?? {});
|
|
23
|
+
case 'composite':
|
|
24
|
+
return executeCompositeCustomTool(record, args, context, {
|
|
25
|
+
...deps.composite,
|
|
26
|
+
selfName: record.name,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Adapt dispatch deps into the registrar's executor signature. */
|
|
31
|
+
export function customToolExecutor(deps) {
|
|
32
|
+
return (record, args, context) => executeCustomTool(record, args, context, deps);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=dispatch.js.map
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP executor for user-authored custom tools.
|
|
3
|
+
*
|
|
4
|
+
* Security properties, all enforced here rather than in the form:
|
|
5
|
+
* - HTTPS only, exact origin allowlist;
|
|
6
|
+
* - DNS is resolved for every call and every resolved address must be public;
|
|
7
|
+
* - redirects are refused;
|
|
8
|
+
* - response bytes and wall-clock time are bounded;
|
|
9
|
+
* - credential references resolve per call and values never enter errors.
|
|
10
|
+
*
|
|
11
|
+
* @module @try-works/dsh-tool-mode/custom-tools/http-executor
|
|
12
|
+
*/
|
|
13
|
+
import type { CustomToolExecContext } from './compile.ts';
|
|
14
|
+
import type { CustomToolRecord } from './types.ts';
|
|
15
|
+
/** A named refusal from the HTTP executor. */
|
|
16
|
+
export declare class CustomToolHttpError extends Error {
|
|
17
|
+
readonly name = "CustomToolHttpError";
|
|
18
|
+
readonly code: 'custom-tool-http-url-invalid' | 'custom-tool-http-origin-denied' | 'custom-tool-http-private-address' | 'custom-tool-http-credential-unavailable' | 'custom-tool-http-fetch-failed' | 'custom-tool-http-response-too-large' | 'custom-tool-http-timeout';
|
|
19
|
+
constructor(code: CustomToolHttpError['code'], message: string, options?: ErrorOptions);
|
|
20
|
+
}
|
|
21
|
+
/** Dependency seams; production uses real DNS/fetch and `ctx.credentials`. */
|
|
22
|
+
export interface HttpExecutorDeps {
|
|
23
|
+
readonly fetchImpl?: typeof fetch;
|
|
24
|
+
readonly lookup?: (hostname: string) => Promise<readonly {
|
|
25
|
+
readonly address: string;
|
|
26
|
+
readonly family: number;
|
|
27
|
+
}[]>;
|
|
28
|
+
/** Resolve a credential reference; undefined means unconfigured. */
|
|
29
|
+
readonly resolveCredential?: (name: string) => Promise<string | undefined>;
|
|
30
|
+
/** Response byte cap; default 1 MiB. */
|
|
31
|
+
readonly maxResponseBytes?: number;
|
|
32
|
+
}
|
|
33
|
+
/** Whether an IPv4/IPv6 literal is loopback, private, link-local or metadata. */
|
|
34
|
+
export declare function isPrivateAddress(address: string): boolean;
|
|
35
|
+
/** Extract a dot path from a JSON value; empty path returns the value itself. */
|
|
36
|
+
export declare function extractPath(value: unknown, path: string): unknown;
|
|
37
|
+
/**
|
|
38
|
+
* Execute one HTTP custom tool.
|
|
39
|
+
* @param record - validated record whose execution kind is `http`.
|
|
40
|
+
* @param args - tool arguments.
|
|
41
|
+
* @param context - cancellation signal.
|
|
42
|
+
* @param deps - injectable fetch/DNS/credential seams.
|
|
43
|
+
* @returns the parsed/extracted response value.
|
|
44
|
+
*/
|
|
45
|
+
export declare function executeHttpCustomTool(record: CustomToolRecord, args: Readonly<Record<string, unknown>>, context: CustomToolExecContext, deps?: HttpExecutorDeps): Promise<unknown>;
|
|
46
|
+
/** Render a safe error message without credential values. */
|
|
47
|
+
export declare function describeHttpError(error: unknown): string;
|
|
48
|
+
//# sourceMappingURL=http-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-executor.d.ts","sourceRoot":"","sources":["../../src/custom-tools/http-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAkC,MAAM,YAAY,CAAA;AAElF,8CAA8C;AAC9C,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,SAAkB,IAAI,yBAAwB;IAC9C,QAAQ,CAAC,IAAI,EACT,8BAA8B,GAC9B,gCAAgC,GAChC,kCAAkC,GAClC,yCAAyC,GACzC,+BAA+B,GAC/B,qCAAqC,GACrC,0BAA0B,CAAA;gBAElB,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIvF;AAED,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAA;IACjH,oEAAoE;IACpE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAC1E,wCAAwC;IACxC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC;AAKD,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAuBzD;AAqBD,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQjE;AAkFD;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACvC,OAAO,EAAE,qBAAqB,EAC9B,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,OAAO,CAAC,CAqElB;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIxD"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP executor for user-authored custom tools.
|
|
3
|
+
*
|
|
4
|
+
* Security properties, all enforced here rather than in the form:
|
|
5
|
+
* - HTTPS only, exact origin allowlist;
|
|
6
|
+
* - DNS is resolved for every call and every resolved address must be public;
|
|
7
|
+
* - redirects are refused;
|
|
8
|
+
* - response bytes and wall-clock time are bounded;
|
|
9
|
+
* - credential references resolve per call and values never enter errors.
|
|
10
|
+
*
|
|
11
|
+
* @module @try-works/dsh-tool-mode/custom-tools/http-executor
|
|
12
|
+
*/
|
|
13
|
+
import { lookup as dnsLookup } from 'node:dns/promises';
|
|
14
|
+
import { isIP } from 'node:net';
|
|
15
|
+
import { CustomToolSchemaError } from "./schema.js";
|
|
16
|
+
/** A named refusal from the HTTP executor. */
|
|
17
|
+
export class CustomToolHttpError extends Error {
|
|
18
|
+
name = 'CustomToolHttpError';
|
|
19
|
+
code;
|
|
20
|
+
constructor(code, message, options) {
|
|
21
|
+
super(message, options);
|
|
22
|
+
this.code = code;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const DEFAULT_MAX_RESPONSE_BYTES = 1024 * 1024;
|
|
26
|
+
const TEMPLATE = /\{\{([A-Za-z_][A-Za-z0-9_]*)\}\}/g;
|
|
27
|
+
/** Whether an IPv4/IPv6 literal is loopback, private, link-local or metadata. */
|
|
28
|
+
export function isPrivateAddress(address) {
|
|
29
|
+
const version = isIP(address);
|
|
30
|
+
if (version === 4) {
|
|
31
|
+
const parts = address.split('.').map(Number);
|
|
32
|
+
if (parts.length !== 4 || parts.some(part => !Number.isInteger(part) || part < 0 || part > 255))
|
|
33
|
+
return true;
|
|
34
|
+
const [a = 0, b = 0] = parts;
|
|
35
|
+
return a === 0 || a === 10 || a === 127
|
|
36
|
+
|| (a === 100 && b >= 64 && b <= 127)
|
|
37
|
+
|| (a === 169 && b === 254)
|
|
38
|
+
|| (a === 172 && b >= 16 && b <= 31)
|
|
39
|
+
|| (a === 192 && b === 0)
|
|
40
|
+
|| (a === 192 && b === 168)
|
|
41
|
+
|| (a === 198 && (b === 18 || b === 19))
|
|
42
|
+
|| a >= 224;
|
|
43
|
+
}
|
|
44
|
+
if (version === 6) {
|
|
45
|
+
const lower = address.toLowerCase();
|
|
46
|
+
if (lower === '::' || lower === '::1')
|
|
47
|
+
return true;
|
|
48
|
+
if (lower.startsWith('::ffff:'))
|
|
49
|
+
return isPrivateAddress(lower.slice('::ffff:'.length));
|
|
50
|
+
return lower.startsWith('fc') || lower.startsWith('fd') || lower.startsWith('fe8') || lower.startsWith('fe9')
|
|
51
|
+
|| lower.startsWith('fea') || lower.startsWith('feb') || lower.startsWith('ff');
|
|
52
|
+
}
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
/** One resolved template argument, with a named failure for a missing key. */
|
|
56
|
+
function argument(args, name) {
|
|
57
|
+
const value = args[name];
|
|
58
|
+
if (value === undefined) {
|
|
59
|
+
throw new CustomToolHttpError('custom-tool-http-url-invalid', `argument ${JSON.stringify(name)} is required by the template`);
|
|
60
|
+
}
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
/** Percent-encode scalar template values for a URL/query component. */
|
|
64
|
+
function interpolateUrl(template, args) {
|
|
65
|
+
return template.replace(TEMPLATE, (_whole, name) => encodeURIComponent(String(argument(args, name))));
|
|
66
|
+
}
|
|
67
|
+
/** Substitute JSON-safe values into a JSON body template. */
|
|
68
|
+
function interpolateBody(template, args) {
|
|
69
|
+
return template.replace(TEMPLATE, (_whole, name) => JSON.stringify(argument(args, name)));
|
|
70
|
+
}
|
|
71
|
+
/** Extract a dot path from a JSON value; empty path returns the value itself. */
|
|
72
|
+
export function extractPath(value, path) {
|
|
73
|
+
if (path.length === 0)
|
|
74
|
+
return value;
|
|
75
|
+
let current = value;
|
|
76
|
+
for (const segment of path.split('.')) {
|
|
77
|
+
if (!Array.isArray(current) && (typeof current !== 'object' || current === null))
|
|
78
|
+
return undefined;
|
|
79
|
+
current = Array.isArray(current) ? current[Number(segment)] : current[segment];
|
|
80
|
+
}
|
|
81
|
+
return current;
|
|
82
|
+
}
|
|
83
|
+
function originOf(url) {
|
|
84
|
+
return url.origin;
|
|
85
|
+
}
|
|
86
|
+
async function assertPublicHost(hostname, deps) {
|
|
87
|
+
if (isIP(hostname) !== 0) {
|
|
88
|
+
if (isPrivateAddress(hostname)) {
|
|
89
|
+
throw new CustomToolHttpError('custom-tool-http-private-address', `the target ${hostname} is a private or loopback address`);
|
|
90
|
+
}
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const lookup = deps.lookup ?? (async (host) => dnsLookup(host, { all: true, verbatim: true }));
|
|
94
|
+
let addresses;
|
|
95
|
+
try {
|
|
96
|
+
addresses = await lookup(hostname);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
throw new CustomToolHttpError('custom-tool-http-fetch-failed', `the host ${hostname} could not be resolved`, { cause: error });
|
|
100
|
+
}
|
|
101
|
+
if (addresses.length === 0) {
|
|
102
|
+
throw new CustomToolHttpError('custom-tool-http-fetch-failed', `the host ${hostname} resolved to no address`);
|
|
103
|
+
}
|
|
104
|
+
for (const entry of addresses) {
|
|
105
|
+
if (isPrivateAddress(entry.address)) {
|
|
106
|
+
throw new CustomToolHttpError('custom-tool-http-private-address', `the host ${hostname} resolves to the private address ${entry.address}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async function resolveHeaders(headers, deps) {
|
|
111
|
+
const out = {};
|
|
112
|
+
for (const [name, value] of Object.entries(headers)) {
|
|
113
|
+
if (typeof value === 'string') {
|
|
114
|
+
out[name] = value;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const secret = await deps.resolveCredential?.(value.secret);
|
|
118
|
+
if (secret === undefined) {
|
|
119
|
+
throw new CustomToolHttpError('custom-tool-http-credential-unavailable', `the credential ${JSON.stringify(value.secret)} is not configured`);
|
|
120
|
+
}
|
|
121
|
+
out[name] = secret;
|
|
122
|
+
}
|
|
123
|
+
return out;
|
|
124
|
+
}
|
|
125
|
+
async function readBounded(response, maxBytes) {
|
|
126
|
+
const declared = Number(response.headers.get('content-length') ?? Number.NaN);
|
|
127
|
+
if (Number.isFinite(declared) && declared > maxBytes) {
|
|
128
|
+
await response.body?.cancel();
|
|
129
|
+
throw new CustomToolHttpError('custom-tool-http-response-too-large', `the response is over the ${maxBytes}-byte cap`);
|
|
130
|
+
}
|
|
131
|
+
if (response.body === null)
|
|
132
|
+
return new Uint8Array(await response.arrayBuffer());
|
|
133
|
+
const reader = response.body.getReader();
|
|
134
|
+
const chunks = [];
|
|
135
|
+
let total = 0;
|
|
136
|
+
for (;;) {
|
|
137
|
+
const { done, value } = await reader.read();
|
|
138
|
+
if (done)
|
|
139
|
+
break;
|
|
140
|
+
if (value === undefined)
|
|
141
|
+
continue;
|
|
142
|
+
total += value.byteLength;
|
|
143
|
+
if (total > maxBytes) {
|
|
144
|
+
await reader.cancel();
|
|
145
|
+
throw new CustomToolHttpError('custom-tool-http-response-too-large', `the response is over the ${maxBytes}-byte cap`);
|
|
146
|
+
}
|
|
147
|
+
chunks.push(value);
|
|
148
|
+
}
|
|
149
|
+
const joined = new Uint8Array(total);
|
|
150
|
+
let offset = 0;
|
|
151
|
+
for (const chunk of chunks) {
|
|
152
|
+
joined.set(chunk, offset);
|
|
153
|
+
offset += chunk.byteLength;
|
|
154
|
+
}
|
|
155
|
+
return joined;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Execute one HTTP custom tool.
|
|
159
|
+
* @param record - validated record whose execution kind is `http`.
|
|
160
|
+
* @param args - tool arguments.
|
|
161
|
+
* @param context - cancellation signal.
|
|
162
|
+
* @param deps - injectable fetch/DNS/credential seams.
|
|
163
|
+
* @returns the parsed/extracted response value.
|
|
164
|
+
*/
|
|
165
|
+
export async function executeHttpCustomTool(record, args, context, deps = {}) {
|
|
166
|
+
if (record.execution.kind !== 'http') {
|
|
167
|
+
throw new CustomToolHttpError('custom-tool-http-url-invalid', `${record.id} is not an HTTP tool`);
|
|
168
|
+
}
|
|
169
|
+
const http = record.execution.http;
|
|
170
|
+
const target = interpolateUrl(http.url, args);
|
|
171
|
+
let url;
|
|
172
|
+
try {
|
|
173
|
+
url = new URL(target);
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
throw new CustomToolHttpError('custom-tool-http-url-invalid', `the URL template did not produce an absolute URL`, { cause: error });
|
|
177
|
+
}
|
|
178
|
+
if (url.protocol !== 'https:')
|
|
179
|
+
throw new CustomToolHttpError('custom-tool-http-url-invalid', 'HTTP tools must use https');
|
|
180
|
+
if (url.username !== '' || url.password !== '')
|
|
181
|
+
throw new CustomToolHttpError('custom-tool-http-url-invalid', 'the URL must not embed credentials');
|
|
182
|
+
if (!record.policy.networkOrigins.includes(originOf(url))) {
|
|
183
|
+
throw new CustomToolHttpError('custom-tool-http-origin-denied', `${url.origin} is not in the tool's network allowlist`);
|
|
184
|
+
}
|
|
185
|
+
await assertPublicHost(url.hostname, deps);
|
|
186
|
+
const headers = await resolveHeaders(http.headers, deps);
|
|
187
|
+
const method = http.method;
|
|
188
|
+
const body = http.bodyTemplate === undefined || method === 'GET' ? undefined : interpolateBody(http.bodyTemplate, args);
|
|
189
|
+
if (body !== undefined && !Object.keys(headers).some(name => name.toLowerCase() === 'content-type')) {
|
|
190
|
+
headers['content-type'] = 'application/json';
|
|
191
|
+
}
|
|
192
|
+
const controller = new AbortController();
|
|
193
|
+
const timer = setTimeout(() => controller.abort(new Error('custom-tool-http-timeout')), record.policy.timeoutMs);
|
|
194
|
+
const signal = AbortSignal.any([context.signal, controller.signal]);
|
|
195
|
+
let response;
|
|
196
|
+
try {
|
|
197
|
+
response = await (deps.fetchImpl ?? fetch)(url, {
|
|
198
|
+
method,
|
|
199
|
+
headers,
|
|
200
|
+
...body === undefined ? {} : { body },
|
|
201
|
+
redirect: 'error',
|
|
202
|
+
signal,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
if (signal.aborted) {
|
|
207
|
+
const timeout = controller.signal.aborted;
|
|
208
|
+
throw new CustomToolHttpError(timeout ? 'custom-tool-http-timeout' : 'custom-tool-http-fetch-failed', timeout ? `the request exceeded ${record.policy.timeoutMs} ms` : 'the request was cancelled', { cause: error });
|
|
209
|
+
}
|
|
210
|
+
throw new CustomToolHttpError('custom-tool-http-fetch-failed', `the request to ${url.host} failed`, { cause: error });
|
|
211
|
+
}
|
|
212
|
+
finally {
|
|
213
|
+
clearTimeout(timer);
|
|
214
|
+
}
|
|
215
|
+
if (!response.ok) {
|
|
216
|
+
await response.body?.cancel();
|
|
217
|
+
throw new CustomToolHttpError('custom-tool-http-fetch-failed', `the request to ${url.host} answered HTTP ${response.status}`);
|
|
218
|
+
}
|
|
219
|
+
const bytes = await readBounded(response, deps.maxResponseBytes ?? DEFAULT_MAX_RESPONSE_BYTES);
|
|
220
|
+
const text = new TextDecoder().decode(bytes);
|
|
221
|
+
const contentType = response.headers.get('content-type') ?? '';
|
|
222
|
+
let value = text;
|
|
223
|
+
if (contentType.includes('json')) {
|
|
224
|
+
try {
|
|
225
|
+
value = JSON.parse(text);
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
throw new CustomToolHttpError('custom-tool-http-fetch-failed', `the response from ${url.host} declared JSON but did not parse`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return extractPath(value, http.extract ?? '');
|
|
232
|
+
}
|
|
233
|
+
/** Render a safe error message without credential values. */
|
|
234
|
+
export function describeHttpError(error) {
|
|
235
|
+
if (error instanceof CustomToolSchemaError)
|
|
236
|
+
return error.message;
|
|
237
|
+
if (error instanceof CustomToolHttpError)
|
|
238
|
+
return error.message;
|
|
239
|
+
return error instanceof Error ? error.message : String(error);
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=http-executor.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from './types.ts';
|
|
2
|
+
export * from './schema.ts';
|
|
3
|
+
export * from './store.ts';
|
|
4
|
+
export * from './compile.ts';
|
|
5
|
+
export * from './registry.ts';
|
|
6
|
+
export * from './http-executor.ts';
|
|
7
|
+
export * from './prompt-executor.ts';
|
|
8
|
+
export * from './composite-executor.ts';
|
|
9
|
+
export * from './dispatch.ts';
|
|
10
|
+
export * from './service.ts';
|
|
11
|
+
export * from './mcp-surface.ts';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/custom-tools/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,yBAAyB,CAAA;AACvC,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./schema.js";
|
|
3
|
+
export * from "./store.js";
|
|
4
|
+
export * from "./compile.js";
|
|
5
|
+
export * from "./registry.js";
|
|
6
|
+
export * from "./http-executor.js";
|
|
7
|
+
export * from "./prompt-executor.js";
|
|
8
|
+
export * from "./composite-executor.js";
|
|
9
|
+
export * from "./dispatch.js";
|
|
10
|
+
export * from "./service.js";
|
|
11
|
+
export * from "./mcp-surface.js";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP publication rows for custom tools.
|
|
3
|
+
*
|
|
4
|
+
* Custom tools are agent-visible by default, but MCP is a separate opt-in. A
|
|
5
|
+
* tool that is not opted in is still returned as a WITHHELD row so the status
|
|
6
|
+
* surface can explain the absence instead of silently omitting it.
|
|
7
|
+
*
|
|
8
|
+
* @module @try-works/dsh-tool-mode/custom-tools/mcp-surface
|
|
9
|
+
*/
|
|
10
|
+
import type { PublishedTool } from '../mcp/host-binding.ts';
|
|
11
|
+
import type { CustomToolRecord } from './types.ts';
|
|
12
|
+
/** Build the MCP surface rows for the active custom-tool records. */
|
|
13
|
+
export declare function customToolPublishedTools(records: readonly CustomToolRecord[]): readonly PublishedTool[];
|
|
14
|
+
//# sourceMappingURL=mcp-surface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-surface.d.ts","sourceRoot":"","sources":["../../src/custom-tools/mcp-surface.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,qEAAqE;AACrE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,GAAG,SAAS,aAAa,EAAE,CA6BvG"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP publication rows for custom tools.
|
|
3
|
+
*
|
|
4
|
+
* Custom tools are agent-visible by default, but MCP is a separate opt-in. A
|
|
5
|
+
* tool that is not opted in is still returned as a WITHHELD row so the status
|
|
6
|
+
* surface can explain the absence instead of silently omitting it.
|
|
7
|
+
*
|
|
8
|
+
* @module @try-works/dsh-tool-mode/custom-tools/mcp-surface
|
|
9
|
+
*/
|
|
10
|
+
/** Build the MCP surface rows for the active custom-tool records. */
|
|
11
|
+
export function customToolPublishedTools(records) {
|
|
12
|
+
return records.map(record => {
|
|
13
|
+
const contract = {
|
|
14
|
+
contract: record.id,
|
|
15
|
+
version: String(record.version),
|
|
16
|
+
toolName: record.name,
|
|
17
|
+
description: record.description,
|
|
18
|
+
inputSchema: record.parameters,
|
|
19
|
+
outputSchema: (record.outputSchema ?? {}),
|
|
20
|
+
semantics: {},
|
|
21
|
+
limits: { timeoutMs: record.policy.timeoutMs },
|
|
22
|
+
unsupported: [],
|
|
23
|
+
};
|
|
24
|
+
if (!record.policy.mcpExpose) {
|
|
25
|
+
return {
|
|
26
|
+
toolName: record.name,
|
|
27
|
+
contract,
|
|
28
|
+
notExportableReason: 'MCP exposure is off for this custom tool',
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
if (record.outputSchema === undefined) {
|
|
32
|
+
return {
|
|
33
|
+
toolName: record.name,
|
|
34
|
+
contract,
|
|
35
|
+
notExportableReason: 'the custom tool declares no output schema, so MCP cannot advertise a result shape',
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return { toolName: record.name, contract };
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=mcp-surface.js.map
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt custom-tool executor.
|
|
3
|
+
*
|
|
4
|
+
* A prompt tool is deliberately not a workflow or an agent: it performs exactly
|
|
5
|
+
* one model call with a template and returns text. The model provider is an
|
|
6
|
+
* injected seam; this module never resolves credentials, tools or files.
|
|
7
|
+
*
|
|
8
|
+
* @module @try-works/dsh-tool-mode/custom-tools/prompt-executor
|
|
9
|
+
*/
|
|
10
|
+
import type { CustomToolExecContext } from './compile.ts';
|
|
11
|
+
import type { CustomToolRecord } from './types.ts';
|
|
12
|
+
/** A named prompt-execution refusal. */
|
|
13
|
+
export declare class CustomToolPromptError extends Error {
|
|
14
|
+
readonly name = "CustomToolPromptError";
|
|
15
|
+
readonly code: 'custom-tool-prompt-unavailable' | 'custom-tool-prompt-template-invalid' | 'custom-tool-prompt-failed';
|
|
16
|
+
constructor(code: CustomToolPromptError['code'], message: string, options?: ErrorOptions);
|
|
17
|
+
}
|
|
18
|
+
/** The one model call a prompt tool may make. */
|
|
19
|
+
export interface PromptRunInput {
|
|
20
|
+
readonly prompt: string;
|
|
21
|
+
readonly model?: string;
|
|
22
|
+
readonly maxOutputTokens?: number;
|
|
23
|
+
readonly signal: AbortSignal;
|
|
24
|
+
}
|
|
25
|
+
/** Prompt executor seams. */
|
|
26
|
+
export interface PromptExecutorDeps {
|
|
27
|
+
/** Absent means the deployment composes no model provider. */
|
|
28
|
+
readonly runPrompt?: (input: PromptRunInput) => Promise<string>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Execute one prompt tool.
|
|
32
|
+
* @param record - validated prompt record.
|
|
33
|
+
* @param args - arguments.
|
|
34
|
+
* @param context - cancellation.
|
|
35
|
+
* @param deps - model seam.
|
|
36
|
+
* @returns the model text.
|
|
37
|
+
*/
|
|
38
|
+
export declare function executePromptCustomTool(record: CustomToolRecord, args: Readonly<Record<string, unknown>>, context: CustomToolExecContext, deps?: PromptExecutorDeps): Promise<string>;
|
|
39
|
+
//# sourceMappingURL=prompt-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-executor.d.ts","sourceRoot":"","sources":["../../src/custom-tools/prompt-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,wCAAwC;AACxC,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,SAAkB,IAAI,2BAA0B;IAChD,QAAQ,CAAC,IAAI,EACT,gCAAgC,GAChC,qCAAqC,GACrC,2BAA2B,CAAA;gBAEnB,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIzF;AAED,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAC7B;AAED,6BAA6B;AAC7B,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAChE;AAcD;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACvC,OAAO,EAAE,qBAAqB,EAC9B,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt custom-tool executor.
|
|
3
|
+
*
|
|
4
|
+
* A prompt tool is deliberately not a workflow or an agent: it performs exactly
|
|
5
|
+
* one model call with a template and returns text. The model provider is an
|
|
6
|
+
* injected seam; this module never resolves credentials, tools or files.
|
|
7
|
+
*
|
|
8
|
+
* @module @try-works/dsh-tool-mode/custom-tools/prompt-executor
|
|
9
|
+
*/
|
|
10
|
+
/** A named prompt-execution refusal. */
|
|
11
|
+
export class CustomToolPromptError extends Error {
|
|
12
|
+
name = 'CustomToolPromptError';
|
|
13
|
+
code;
|
|
14
|
+
constructor(code, message, options) {
|
|
15
|
+
super(message, options);
|
|
16
|
+
this.code = code;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const TEMPLATE = /\{\{([A-Za-z_][A-Za-z0-9_]*)\}\}/g;
|
|
20
|
+
function interpolate(template, args) {
|
|
21
|
+
return template.replace(TEMPLATE, (_whole, name) => {
|
|
22
|
+
const value = args[name];
|
|
23
|
+
if (value === undefined) {
|
|
24
|
+
throw new CustomToolPromptError('custom-tool-prompt-template-invalid', `argument ${JSON.stringify(name)} is missing`);
|
|
25
|
+
}
|
|
26
|
+
return String(value);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Execute one prompt tool.
|
|
31
|
+
* @param record - validated prompt record.
|
|
32
|
+
* @param args - arguments.
|
|
33
|
+
* @param context - cancellation.
|
|
34
|
+
* @param deps - model seam.
|
|
35
|
+
* @returns the model text.
|
|
36
|
+
*/
|
|
37
|
+
export async function executePromptCustomTool(record, args, context, deps = {}) {
|
|
38
|
+
if (record.execution.kind !== 'prompt') {
|
|
39
|
+
throw new CustomToolPromptError('custom-tool-prompt-template-invalid', `${record.id} is not a prompt tool`);
|
|
40
|
+
}
|
|
41
|
+
if (deps.runPrompt === undefined) {
|
|
42
|
+
throw new CustomToolPromptError('custom-tool-prompt-unavailable', 'no model provider is composed for prompt tools');
|
|
43
|
+
}
|
|
44
|
+
const prompt = interpolate(record.execution.prompt.template, args);
|
|
45
|
+
try {
|
|
46
|
+
return await deps.runPrompt({
|
|
47
|
+
prompt,
|
|
48
|
+
...record.execution.prompt.model === undefined ? {} : { model: record.execution.prompt.model },
|
|
49
|
+
...record.execution.prompt.maxOutputTokens === undefined ? {} : { maxOutputTokens: record.execution.prompt.maxOutputTokens },
|
|
50
|
+
signal: context.signal,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (error instanceof CustomToolPromptError)
|
|
55
|
+
throw error;
|
|
56
|
+
throw new CustomToolPromptError('custom-tool-prompt-failed', `the prompt tool failed`, { cause: error });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=prompt-executor.js.map
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime registration for custom tools.
|
|
3
|
+
*
|
|
4
|
+
* One active registration per custom id. Saving a new version disposes the old
|
|
5
|
+
* definition before registering the new one; disabling/deleting disposes without
|
|
6
|
+
* touching the immutable record. `sync()` is the restart path.
|
|
7
|
+
*
|
|
8
|
+
* @module @try-works/dsh-tool-mode/custom-tools/registry
|
|
9
|
+
*/
|
|
10
|
+
import { type CustomToolExecutor } from './compile.ts';
|
|
11
|
+
import { CustomToolStore } from './store.ts';
|
|
12
|
+
import type { CustomToolRecord } from './types.ts';
|
|
13
|
+
/** The registry surface needed; structurally compatible with `ctx.tools`. */
|
|
14
|
+
export interface CustomToolRegistryTools {
|
|
15
|
+
get(name: string): unknown;
|
|
16
|
+
register(definition: unknown): () => void;
|
|
17
|
+
}
|
|
18
|
+
/** One live registration. */
|
|
19
|
+
export interface CustomToolRegistration {
|
|
20
|
+
readonly id: string;
|
|
21
|
+
readonly name: string;
|
|
22
|
+
readonly version: number;
|
|
23
|
+
readonly dispose: () => void;
|
|
24
|
+
}
|
|
25
|
+
/** One per-tool sync outcome. */
|
|
26
|
+
export interface CustomToolSyncEntry {
|
|
27
|
+
readonly id: string;
|
|
28
|
+
readonly version: number | null;
|
|
29
|
+
readonly reason: string;
|
|
30
|
+
}
|
|
31
|
+
/** Full sync result, safe to report from a host service. */
|
|
32
|
+
export interface CustomToolSyncResult {
|
|
33
|
+
readonly registered: readonly CustomToolSyncEntry[];
|
|
34
|
+
readonly skipped: readonly CustomToolSyncEntry[];
|
|
35
|
+
readonly errors: readonly CustomToolSyncEntry[];
|
|
36
|
+
}
|
|
37
|
+
/** Options for the registrar. */
|
|
38
|
+
export interface CustomToolRegistrarOptions {
|
|
39
|
+
readonly store: CustomToolStore;
|
|
40
|
+
readonly tools: CustomToolRegistryTools;
|
|
41
|
+
readonly execute: CustomToolExecutor;
|
|
42
|
+
}
|
|
43
|
+
/** Owns the live definitions for one profile. */
|
|
44
|
+
export declare class CustomToolRegistrar {
|
|
45
|
+
readonly store: CustomToolStore;
|
|
46
|
+
private readonly tools;
|
|
47
|
+
private readonly execute;
|
|
48
|
+
private readonly active;
|
|
49
|
+
constructor(options: CustomToolRegistrarOptions);
|
|
50
|
+
/** The live registration for one id, if any. */
|
|
51
|
+
get(id: string): CustomToolRegistration | undefined;
|
|
52
|
+
/** Live registrations, sorted by id. */
|
|
53
|
+
list(): readonly CustomToolRegistration[];
|
|
54
|
+
/**
|
|
55
|
+
* Register or refresh one record. The old definition for the same id is
|
|
56
|
+
* disposed first, so a new version is visible without a host restart.
|
|
57
|
+
*/
|
|
58
|
+
register(record: CustomToolRecord): CustomToolRegistration;
|
|
59
|
+
/** Dispose one id; false when it was not live. */
|
|
60
|
+
dispose(id: string): boolean;
|
|
61
|
+
/** Dispose everything (plugin teardown). */
|
|
62
|
+
disposeAll(): void;
|
|
63
|
+
/**
|
|
64
|
+
* Reconcile the live set with the store. A bad record is reported and does not
|
|
65
|
+
* stop the others; a disabled or agent-hidden record is disposed.
|
|
66
|
+
*/
|
|
67
|
+
sync(): CustomToolSyncResult;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/custom-tools/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAqB,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACzE,OAAO,EAAE,eAAe,EAAwB,MAAM,YAAY,CAAA;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,6EAA6E;AAC7E,MAAM,WAAW,uBAAuB;IACtC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,IAAI,CAAA;CAC1C;AAED,6BAA6B;AAC7B,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAC7B;AAED,iCAAiC;AACjC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,4DAA4D;AAC5D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,mBAAmB,EAAE,CAAA;IACnD,QAAQ,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,CAAA;IAChD,QAAQ,CAAC,MAAM,EAAE,SAAS,mBAAmB,EAAE,CAAA;CAChD;AAED,iCAAiC;AACjC,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAA;IACvC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAA;CACrC;AAED,iDAAiD;AACjD,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAA;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4C;gBAEvD,OAAO,EAAE,0BAA0B;IAM/C,gDAAgD;IAChD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS;IAInD,wCAAwC;IACxC,IAAI,IAAI,SAAS,sBAAsB,EAAE;IAIzC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,sBAAsB;IAwB1D,kDAAkD;IAClD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAQ5B,4CAA4C;IAC5C,UAAU,IAAI,IAAI;IAKlB;;;OAGG;IACH,IAAI,IAAI,oBAAoB;CA8C7B"}
|