@try-works/dsh-tool-mode 0.0.0-stage → 0.5.44
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/README.md +299 -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 +4039 -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 +2507 -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 +5197 -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/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,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catalog subscriptions (P26-09, P26-10).
|
|
3
|
+
*
|
|
4
|
+
* The rules that make this more than an event emitter, each of which a naive
|
|
5
|
+
* implementation gets wrong:
|
|
6
|
+
*
|
|
7
|
+
* - **Acknowledge first, and acknowledge only what is SUPPORTED.** The ack carries
|
|
8
|
+
* the filter the server will actually honour, not the one the client asked for. A
|
|
9
|
+
* client that requested four notification types and is sent back one is being told
|
|
10
|
+
* the truth; echoing all four and then sending one is a silent lie the client
|
|
11
|
+
* cannot detect until it waits forever.
|
|
12
|
+
* - **No event before the acknowledgement.** So the ack is emitted synchronously as
|
|
13
|
+
* part of establishing the subscription, and the subscription only becomes
|
|
14
|
+
* eligible for real events afterwards.
|
|
15
|
+
* - **Every event carries the subscription id** in the revision's notification
|
|
16
|
+
* metadata, because a client with several subscriptions cannot otherwise tell
|
|
17
|
+
* which one an event belongs to.
|
|
18
|
+
* - **Filter per caller.** Each subscription belongs to one client and sees only its
|
|
19
|
+
* own catalog. One client's private package changes are never delivered to
|
|
20
|
+
* another, which is the leakage the requirement names.
|
|
21
|
+
* - **Teardown is announced.** Revoking a grant sends `notifications/cancelled`
|
|
22
|
+
* referencing the subscription request BEFORE the stream closes, so a client can
|
|
23
|
+
* distinguish "your access ended" from "the connection dropped".
|
|
24
|
+
* - **Progress does not travel here** (P26-10). Progress belongs on the response
|
|
25
|
+
* stream of the call that produced it; routing it onto the catalog stream would
|
|
26
|
+
* deliver one call's progress to every subscriber.
|
|
27
|
+
*
|
|
28
|
+
* @module @try-works/dsh-tool-mode/mcp/subscriptions
|
|
29
|
+
*/
|
|
30
|
+
import { ERROR_CODES, WireError } from "./protocol.js";
|
|
31
|
+
/**
|
|
32
|
+
* The notification types this server actually emits.
|
|
33
|
+
*
|
|
34
|
+
* Only tool-catalog changes exist, because only tools are published. Declaring the
|
|
35
|
+
* others unsupported is what makes the acknowledgement honest.
|
|
36
|
+
*/
|
|
37
|
+
export const SUPPORTED_FILTERS = ['toolsListChanged'];
|
|
38
|
+
/** The official metadata key carrying the subscription's request id. */
|
|
39
|
+
export const SUBSCRIPTION_ID_KEY = 'io.modelcontextprotocol/subscriptionId';
|
|
40
|
+
/**
|
|
41
|
+
* Narrow a requested filter to what this server supports.
|
|
42
|
+
*
|
|
43
|
+
* P26-09 says to acknowledge only supported requested filters. A requested type
|
|
44
|
+
* that is not supported is DROPPED rather than acknowledged-and-ignored: an
|
|
45
|
+
* acknowledged type that never fires is indistinguishable from a broken server.
|
|
46
|
+
* @param requested - the filter the client asked for.
|
|
47
|
+
* @returns the acknowledged filter.
|
|
48
|
+
*/
|
|
49
|
+
export function acknowledgeFilter(requested) {
|
|
50
|
+
const acknowledged = {};
|
|
51
|
+
for (const key of SUPPORTED_FILTERS) {
|
|
52
|
+
// Only a type the client actually REQUESTED can be acknowledged: granting a
|
|
53
|
+
// type nobody asked for would start sending an unrequested notification.
|
|
54
|
+
if (requested[key] === true)
|
|
55
|
+
acknowledged[key] = true;
|
|
56
|
+
}
|
|
57
|
+
return acknowledged;
|
|
58
|
+
}
|
|
59
|
+
/** Manages the active catalog subscriptions. */
|
|
60
|
+
export class SubscriptionRegistry {
|
|
61
|
+
#subscriptions = new Map();
|
|
62
|
+
/** Counter for ids this server issues, so an id is never caller-chosen. */
|
|
63
|
+
/** Active subscriptions, for diagnostics. */
|
|
64
|
+
get active() {
|
|
65
|
+
return [...this.#subscriptions.values()];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Establish a subscription.
|
|
69
|
+
*
|
|
70
|
+
* The acknowledgement notification is returned as part of the result and is
|
|
71
|
+
* marked sent before anything can be published, so no event can precede it.
|
|
72
|
+
* @param request - the `subscriptions/listen` request.
|
|
73
|
+
* @param clientId - the authenticated client, which the subscription is bound to.
|
|
74
|
+
* @returns the result envelope, the acknowledgement, and the subscription id.
|
|
75
|
+
*/
|
|
76
|
+
listen(request, clientId) {
|
|
77
|
+
/**
|
|
78
|
+
* `notifications` IS REQUIRED, and this used to default it.
|
|
79
|
+
*
|
|
80
|
+
* The pinned schema's `SubscriptionsListenRequestParams` declares
|
|
81
|
+
* `required: ["_meta","notifications"]`. Defaulting an absent filter to `{}` and
|
|
82
|
+
* returning SUCCESS contradicted that AND contradicted this module's own rule that a
|
|
83
|
+
* missing required field is `invalidParams` rather than a defaulted value — a client
|
|
84
|
+
* would receive an acknowledgement for a subscription it never described, and the
|
|
85
|
+
* filter it believed it had sent would be silently empty.
|
|
86
|
+
*/
|
|
87
|
+
const requested = request.params?.notifications;
|
|
88
|
+
if (requested === undefined || requested === null || typeof requested !== 'object' || Array.isArray(requested)) {
|
|
89
|
+
throw new WireError(ERROR_CODES.invalidParams, 'subscriptions/listen requires params.notifications; a missing filter is invalid rather than defaulted');
|
|
90
|
+
}
|
|
91
|
+
const filter = requested;
|
|
92
|
+
const acknowledged = acknowledgeFilter(filter);
|
|
93
|
+
/**
|
|
94
|
+
* THE SUBSCRIPTION IS IDENTIFIED BY THE LISTEN REQUEST'S OWN ID.
|
|
95
|
+
*
|
|
96
|
+
* This used to invent `sub_<time>_<n>`, which was WRONG, and the pinned schema says so
|
|
97
|
+
* in as many words. `CancelledNotification` states that the server's stream-terminating
|
|
98
|
+
* cancellation "references the ID of the `subscriptions/listen` request that opened the
|
|
99
|
+
* stream", and `SubscriptionsListenResultMetaObject` types its required
|
|
100
|
+
* `io.modelcontextprotocol/subscriptionId` as a **`RequestId`** — the same type as a
|
|
101
|
+
* request id — "so the client can correlate it with the originating subscription".
|
|
102
|
+
*
|
|
103
|
+
* A server-invented id that the client never saw cannot be correlated with anything, so
|
|
104
|
+
* a client could neither match the acknowledgement to its request nor recognise the
|
|
105
|
+
* cancellation that ends the stream.
|
|
106
|
+
*
|
|
107
|
+
* The original comment claimed a caller-chosen id would let one client address
|
|
108
|
+
* another's subscription. That concern is real but it is NOT addressed by inventing an
|
|
109
|
+
* id: subscriptions are keyed by this id and BOUND to `clientId`, and the binding is
|
|
110
|
+
* what prevents cross-client addressing.
|
|
111
|
+
*/
|
|
112
|
+
const subscriptionId = request.id;
|
|
113
|
+
if (typeof subscriptionId !== 'string' && typeof subscriptionId !== 'number') {
|
|
114
|
+
throw new WireError(ERROR_CODES.invalidParams, 'subscriptions/listen requires a string or integer request id, which IS the subscription id');
|
|
115
|
+
}
|
|
116
|
+
const subscription = { subscriptionId: String(subscriptionId), clientId, acknowledged, announced: true };
|
|
117
|
+
this.#subscriptions.set(String(subscriptionId), subscription);
|
|
118
|
+
return {
|
|
119
|
+
result: {
|
|
120
|
+
resultType: 'complete',
|
|
121
|
+
// The revision REQUIRES the subscription id in this result's metadata.
|
|
122
|
+
_meta: { [SUBSCRIPTION_ID_KEY]: subscriptionId },
|
|
123
|
+
},
|
|
124
|
+
acknowledgement: {
|
|
125
|
+
jsonrpc: '2.0',
|
|
126
|
+
method: 'notifications/subscriptions/acknowledged',
|
|
127
|
+
params: {
|
|
128
|
+
// The filter the server will HONOUR, not the one requested.
|
|
129
|
+
notifications: acknowledged,
|
|
130
|
+
// The subscription id is what lets a client with several subscriptions
|
|
131
|
+
// tell which one an event belongs to.
|
|
132
|
+
_meta: { [SUBSCRIPTION_ID_KEY]: subscriptionId },
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
subscriptionId: String(subscriptionId),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Publish a tool-catalog change.
|
|
140
|
+
*
|
|
141
|
+
* @param generation - the catalog generation that changed, carried so a client
|
|
142
|
+
* can tell a real change from a duplicate delivery.
|
|
143
|
+
* @returns one message per eligible subscriber, and nothing for anyone else.
|
|
144
|
+
*/
|
|
145
|
+
publishToolListChanged(generation) {
|
|
146
|
+
const messages = [];
|
|
147
|
+
for (const subscription of this.#subscriptions.values()) {
|
|
148
|
+
// Two independent conditions: the client asked for this type, and it is
|
|
149
|
+
// still active. A revoked subscription is removed outright, so there is no
|
|
150
|
+
// window in which it receives one last event.
|
|
151
|
+
if (subscription.acknowledged.toolsListChanged !== true)
|
|
152
|
+
continue;
|
|
153
|
+
if (!subscription.announced)
|
|
154
|
+
continue;
|
|
155
|
+
messages.push({
|
|
156
|
+
clientId: subscription.clientId,
|
|
157
|
+
notification: {
|
|
158
|
+
jsonrpc: '2.0',
|
|
159
|
+
method: 'notifications/tools/list_changed',
|
|
160
|
+
params: {
|
|
161
|
+
_meta: { [SUBSCRIPTION_ID_KEY]: subscription.subscriptionId },
|
|
162
|
+
generation,
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
// Deliberately one message per subscriber rather than one broadcast: the
|
|
168
|
+
// transport must address each client, so a shared object would make cross-client
|
|
169
|
+
// leakage a matter of how the transport happened to iterate.
|
|
170
|
+
return messages;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Revoke every subscription belonging to a client, announcing each first.
|
|
174
|
+
*
|
|
175
|
+
* P26-09 requires the teardown notification BEFORE the stream closes, so the
|
|
176
|
+
* client learns its access ended rather than inferring it from a dropped socket.
|
|
177
|
+
* @param clientId - the client whose grant was revoked.
|
|
178
|
+
* @returns the teardown messages, already ordered cancellation-first.
|
|
179
|
+
*/
|
|
180
|
+
revoke(clientId) {
|
|
181
|
+
const messages = [];
|
|
182
|
+
for (const [id, subscription] of [...this.#subscriptions]) {
|
|
183
|
+
if (subscription.clientId !== clientId)
|
|
184
|
+
continue;
|
|
185
|
+
messages.push({
|
|
186
|
+
clientId,
|
|
187
|
+
notification: {
|
|
188
|
+
jsonrpc: '2.0',
|
|
189
|
+
method: 'notifications/cancelled',
|
|
190
|
+
params: {
|
|
191
|
+
// References the SUBSCRIPTION request, so the client can match it to
|
|
192
|
+
// the listen call it made.
|
|
193
|
+
requestId: subscription.subscriptionId,
|
|
194
|
+
reason: 'the grant for this subscription was revoked',
|
|
195
|
+
_meta: { [SUBSCRIPTION_ID_KEY]: id },
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
// Removed AFTER its teardown is queued, and before returning, so a publish
|
|
200
|
+
// racing this call cannot deliver one more event to a revoked client.
|
|
201
|
+
this.#subscriptions.delete(id);
|
|
202
|
+
}
|
|
203
|
+
return messages;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Close one subscription at the client's request.
|
|
207
|
+
* @param subscriptionId - the subscription to close.
|
|
208
|
+
* @param clientId - the caller, which must own it.
|
|
209
|
+
* @returns whether it was closed.
|
|
210
|
+
*/
|
|
211
|
+
close(subscriptionId, clientId) {
|
|
212
|
+
const subscription = this.#subscriptions.get(subscriptionId);
|
|
213
|
+
// Ownership is checked, not assumed: without it one client could close
|
|
214
|
+
// another's subscription by guessing an id.
|
|
215
|
+
if (subscription === undefined || subscription.clientId !== clientId)
|
|
216
|
+
return false;
|
|
217
|
+
this.#subscriptions.delete(subscriptionId);
|
|
218
|
+
return true;
|
|
219
|
+
}
|
|
220
|
+
/** Every subscription belonging to one client. */
|
|
221
|
+
forClient(clientId) {
|
|
222
|
+
return [...this.#subscriptions.values()].filter(subscription => subscription.clientId === clientId);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Build the `notifications/cancelled` a client sends to stop a subscription.
|
|
227
|
+
*
|
|
228
|
+
* `CancelledNotificationParams` requires only `requestId`, so the notification
|
|
229
|
+
* carries exactly that: adding a `_meta` with an undefined version would put a
|
|
230
|
+
* meaningless member on the wire.
|
|
231
|
+
* @param subscriptionId - the subscription to cancel.
|
|
232
|
+
* @returns the notification.
|
|
233
|
+
*/
|
|
234
|
+
export function cancelSubscription(subscriptionId) {
|
|
235
|
+
return {
|
|
236
|
+
jsonrpc: '2.0',
|
|
237
|
+
method: 'notifications/cancelled',
|
|
238
|
+
params: { requestId: subscriptionId },
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Run one catalog-change publication through the delivery consumer: the
|
|
243
|
+
* registry's per-caller filtering decides WHO gets the event, and the sink
|
|
244
|
+
* carries it to each client's stream. Acknowledgement ordering is the
|
|
245
|
+
* registry's own guarantee — an acknowledgement is marked sent before any
|
|
246
|
+
* publish can run, so no event can precede it.
|
|
247
|
+
* @param registry - the subscription state.
|
|
248
|
+
* @param generation - the catalog generation that changed.
|
|
249
|
+
* @param sink - the delivery transport.
|
|
250
|
+
* @returns how many subscribers received the change.
|
|
251
|
+
*/
|
|
252
|
+
export function deliverCatalogChange(registry, generation, sink) {
|
|
253
|
+
const messages = registry.publishToolListChanged(generation);
|
|
254
|
+
for (const message of messages)
|
|
255
|
+
sink.deliver(message);
|
|
256
|
+
return messages.length;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* The memory sink: one per-client queue, used by the tests to exercise the
|
|
260
|
+
* consumer and by the host as the transport seam until a streaming endpoint
|
|
261
|
+
* injects its writer. It honours the same contract a real transport must:
|
|
262
|
+
* delivery only to the addressed client, and closeClient stops that client's
|
|
263
|
+
* queue entirely.
|
|
264
|
+
*/
|
|
265
|
+
export class MemoryDeliverySink {
|
|
266
|
+
#queues = new Map();
|
|
267
|
+
#closed = new Map();
|
|
268
|
+
/** The delivered messages for one client, in delivery order. */
|
|
269
|
+
forClient(clientId) {
|
|
270
|
+
return [...(this.#queues.get(clientId) ?? [])];
|
|
271
|
+
}
|
|
272
|
+
/** Whether the sink closed a client, and why. */
|
|
273
|
+
closeReason(clientId) {
|
|
274
|
+
return this.#closed.get(clientId);
|
|
275
|
+
}
|
|
276
|
+
deliver(message) {
|
|
277
|
+
if (this.#closed.has(message.clientId))
|
|
278
|
+
return;
|
|
279
|
+
const queue = this.#queues.get(message.clientId) ?? [];
|
|
280
|
+
queue.push(message);
|
|
281
|
+
this.#queues.set(message.clientId, queue);
|
|
282
|
+
}
|
|
283
|
+
closeClient(clientId, reason) {
|
|
284
|
+
this.#closed.set(clientId, reason);
|
|
285
|
+
this.#queues.delete(clientId);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=subscriptions.js.map
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The MCP surface status (plan §3.4, MCP tab).
|
|
3
|
+
*
|
|
4
|
+
* Everything here is a fact the host already holds: the BOUND endpoint (or that none
|
|
5
|
+
* was bound), the configured `mcpV3` values, the credential store's client identities,
|
|
6
|
+
* the external ledger's observed clients and the export surface. The page must not
|
|
7
|
+
* invent a listening state, a port, or a client name — so this module has no defaults
|
|
8
|
+
* that guess: a missing endpoint is `null`, an unobserved client has zero calls, and
|
|
9
|
+
* the token VALUE has no field to travel in (only the file path).
|
|
10
|
+
*
|
|
11
|
+
* @module @try-works/dsh-tool-mode/mcp-status
|
|
12
|
+
*/
|
|
13
|
+
import type { McpUsageSummary } from './mcp-usage.ts';
|
|
14
|
+
/** The supported authentication modes, named as the transport names them. */
|
|
15
|
+
export type McpAuthMode = 'static-token' | 'oauth-resource-server' | 'none';
|
|
16
|
+
/** A bound endpoint, as the transport reported it. */
|
|
17
|
+
export interface McpBoundEndpoint {
|
|
18
|
+
readonly host: string;
|
|
19
|
+
readonly port: number;
|
|
20
|
+
readonly url: string;
|
|
21
|
+
}
|
|
22
|
+
/** The configured endpoint values (a config fact, not a listening claim). */
|
|
23
|
+
export interface McpConfiguredEndpoint {
|
|
24
|
+
readonly host: string;
|
|
25
|
+
readonly port: number;
|
|
26
|
+
readonly path: string;
|
|
27
|
+
}
|
|
28
|
+
/** Everything the status view may read. */
|
|
29
|
+
export interface McpStatusInput {
|
|
30
|
+
readonly enabled: boolean;
|
|
31
|
+
readonly configured: McpConfiguredEndpoint | null;
|
|
32
|
+
/** The BOUND endpoint, or null when nothing is listening. */
|
|
33
|
+
readonly endpoint: McpBoundEndpoint | null;
|
|
34
|
+
readonly authMode: McpAuthMode;
|
|
35
|
+
/** The operator token file path, never the token. */
|
|
36
|
+
readonly tokenFile: string | null;
|
|
37
|
+
/** Tool names the export surface actually publishes. */
|
|
38
|
+
readonly published: readonly string[];
|
|
39
|
+
/** Tool names withheld by the export policy, with reasons owned by the host. */
|
|
40
|
+
readonly withheld: readonly string[];
|
|
41
|
+
/** Client identities the credential store holds. */
|
|
42
|
+
readonly credentialClients: readonly string[];
|
|
43
|
+
/** The static-token client identity, present only when that mode is enabled. */
|
|
44
|
+
readonly staticClientId: string | null;
|
|
45
|
+
/** When the endpoint started listening, or null when it never bound. */
|
|
46
|
+
readonly startedAt: number | null;
|
|
47
|
+
/** The clock used for `uptimeMs` (injectable so a test is deterministic). */
|
|
48
|
+
readonly now?: number;
|
|
49
|
+
readonly ledger: McpUsageSummary;
|
|
50
|
+
}
|
|
51
|
+
/** One client identity on the MCP tab. */
|
|
52
|
+
export interface McpStatusClient {
|
|
53
|
+
readonly clientId: string;
|
|
54
|
+
/** Alias of {@link McpStatusClient.clientId} for the client's flat contract. */
|
|
55
|
+
readonly id: string;
|
|
56
|
+
/** A display label; only the ledger/credential identity is known, so it equals the id. */
|
|
57
|
+
readonly label: string;
|
|
58
|
+
/** The client's own grant identity observed in the ledger, or null. */
|
|
59
|
+
readonly grantId: string | null;
|
|
60
|
+
readonly calls: number;
|
|
61
|
+
readonly errors: number;
|
|
62
|
+
readonly lastSeen: number | null;
|
|
63
|
+
}
|
|
64
|
+
/** The status view (flat client contract). */
|
|
65
|
+
export interface McpStatusView {
|
|
66
|
+
readonly enabled: boolean;
|
|
67
|
+
readonly listening: boolean;
|
|
68
|
+
/** The bound endpoint, null whenever MCP is not serving. */
|
|
69
|
+
readonly endpoint: {
|
|
70
|
+
readonly host: string;
|
|
71
|
+
readonly port: number;
|
|
72
|
+
readonly path: string;
|
|
73
|
+
readonly url: string;
|
|
74
|
+
} | null;
|
|
75
|
+
readonly configured: McpConfiguredEndpoint | null;
|
|
76
|
+
readonly transport: 'http';
|
|
77
|
+
readonly auth: {
|
|
78
|
+
readonly scheme: McpAuthMode;
|
|
79
|
+
readonly mode: McpAuthMode;
|
|
80
|
+
readonly tokenFile: string | null;
|
|
81
|
+
};
|
|
82
|
+
/** Wall time since the endpoint bound; 0 while nothing is listening. */
|
|
83
|
+
readonly uptimeMs: number;
|
|
84
|
+
readonly clients: readonly McpStatusClient[];
|
|
85
|
+
readonly exposed: readonly string[];
|
|
86
|
+
readonly withheld: readonly string[];
|
|
87
|
+
readonly exposedCount: number;
|
|
88
|
+
readonly withheldCount: number;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Build the MCP status view.
|
|
92
|
+
* @param input - the bound/configured facts, identities, surface and ledger summary.
|
|
93
|
+
* @returns the status; every absent fact stays explicit.
|
|
94
|
+
*/
|
|
95
|
+
export declare function buildMcpStatus(input: McpStatusInput): McpStatusView;
|
|
96
|
+
//# sourceMappingURL=mcp-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-status.d.ts","sourceRoot":"","sources":["../src/mcp-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The MCP surface status (plan §3.4, MCP tab).
|
|
3
|
+
*
|
|
4
|
+
* Everything here is a fact the host already holds: the BOUND endpoint (or that none
|
|
5
|
+
* was bound), the configured `mcpV3` values, the credential store's client identities,
|
|
6
|
+
* the external ledger's observed clients and the export surface. The page must not
|
|
7
|
+
* invent a listening state, a port, or a client name — so this module has no defaults
|
|
8
|
+
* that guess: a missing endpoint is `null`, an unobserved client has zero calls, and
|
|
9
|
+
* the token VALUE has no field to travel in (only the file path).
|
|
10
|
+
*
|
|
11
|
+
* @module @try-works/dsh-tool-mode/mcp-status
|
|
12
|
+
*/
|
|
13
|
+
/** `model_tools` is host-local and can never be exported over MCP. */
|
|
14
|
+
const ALWAYS_WITHHELD = 'model_tools';
|
|
15
|
+
/**
|
|
16
|
+
* Build the MCP status view.
|
|
17
|
+
* @param input - the bound/configured facts, identities, surface and ledger summary.
|
|
18
|
+
* @returns the status; every absent fact stays explicit.
|
|
19
|
+
*/
|
|
20
|
+
export function buildMcpStatus(input) {
|
|
21
|
+
const listening = input.enabled && input.endpoint !== null;
|
|
22
|
+
const withheldSet = new Set(input.withheld);
|
|
23
|
+
withheldSet.add(ALWAYS_WITHHELD);
|
|
24
|
+
const exposed = listening
|
|
25
|
+
? input.published.filter(name => name !== ALWAYS_WITHHELD && !withheldSet.has(name)).sort((left, right) => left.localeCompare(right))
|
|
26
|
+
: [];
|
|
27
|
+
const withheld = listening
|
|
28
|
+
? [...withheldSet].sort((left, right) => left.localeCompare(right))
|
|
29
|
+
// Nothing is served while disabled: every published tool is withheld, and the
|
|
30
|
+
// host-local tool stays withheld regardless.
|
|
31
|
+
: [...new Set([...input.published, ...input.withheld, ALWAYS_WITHHELD])].sort((left, right) => left.localeCompare(right));
|
|
32
|
+
const clients = new Map();
|
|
33
|
+
const ledgerClient = (clientId) => input.ledger.clients.find(client => client.clientId === clientId);
|
|
34
|
+
const identities = [input.authMode === 'static-token' ? input.staticClientId : null, ...input.credentialClients, ...input.ledger.clients.map(client => client.clientId)]
|
|
35
|
+
.filter((clientId) => clientId !== null && clientId.length > 0);
|
|
36
|
+
for (const clientId of identities) {
|
|
37
|
+
if (clients.has(clientId))
|
|
38
|
+
continue;
|
|
39
|
+
const observed = ledgerClient(clientId);
|
|
40
|
+
clients.set(clientId, {
|
|
41
|
+
clientId,
|
|
42
|
+
id: clientId,
|
|
43
|
+
// No name store exists: the authenticated identity IS the only truthful label.
|
|
44
|
+
label: clientId,
|
|
45
|
+
grantId: observed?.grantId ?? null,
|
|
46
|
+
calls: observed?.calls ?? 0,
|
|
47
|
+
errors: observed?.errors ?? 0,
|
|
48
|
+
lastSeen: observed === undefined ? null : observed.lastSeen,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
const start = input.startedAt;
|
|
52
|
+
const now = input.now ?? Date.now();
|
|
53
|
+
return {
|
|
54
|
+
enabled: input.enabled,
|
|
55
|
+
listening,
|
|
56
|
+
endpoint: listening && input.endpoint !== null
|
|
57
|
+
? { host: input.endpoint.host, port: input.endpoint.port, path: input.configured?.path ?? '/mcp', url: input.endpoint.url }
|
|
58
|
+
: null,
|
|
59
|
+
configured: input.configured,
|
|
60
|
+
transport: 'http',
|
|
61
|
+
auth: { scheme: input.authMode, mode: input.authMode, tokenFile: input.tokenFile },
|
|
62
|
+
uptimeMs: listening && start !== null ? Math.max(0, now - start) : 0,
|
|
63
|
+
clients: [...clients.values()].sort((left, right) => left.clientId.localeCompare(right.clientId)),
|
|
64
|
+
exposed,
|
|
65
|
+
withheld,
|
|
66
|
+
exposedCount: exposed.length,
|
|
67
|
+
withheldCount: withheld.length,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=mcp-status.js.map
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The bounded external-MCP call ledger (plan §3.4).
|
|
3
|
+
*
|
|
4
|
+
* External MCP `tools/call`s are not session events, so the only honest way to answer
|
|
5
|
+
* "MCP was used, by whom, how often" is to persist them. One JSONL row per call, trimmed
|
|
6
|
+
* at a bound, written beside the host state.
|
|
7
|
+
*
|
|
8
|
+
* The record TYPE is the privacy boundary: it has identity, timings, failure class,
|
|
9
|
+
* sizes and the receipt id, and deliberately nowhere to put arguments, results,
|
|
10
|
+
* credentials or the bearer token. A future change cannot start logging payloads by
|
|
11
|
+
* accident without changing this type.
|
|
12
|
+
*
|
|
13
|
+
* @module @try-works/dsh-tool-mode/mcp-usage
|
|
14
|
+
*/
|
|
15
|
+
import type { InvocationAccounting } from './invocation-accounting.ts';
|
|
16
|
+
/** How many rows the ledger retains. */
|
|
17
|
+
export declare const MCP_USAGE_MAX_ROWS = 5000;
|
|
18
|
+
/** The default page size for a call-log request. */
|
|
19
|
+
export declare const MCP_USAGE_DEFAULT_PAGE_SIZE = 50;
|
|
20
|
+
/** One external call, as persisted. */
|
|
21
|
+
export interface McpCallRecord {
|
|
22
|
+
/** Epoch milliseconds when the call settled. */
|
|
23
|
+
readonly time: number;
|
|
24
|
+
/** The tool that was invoked (the accounting hook now carries it). */
|
|
25
|
+
readonly tool: string;
|
|
26
|
+
/** The authenticated client identity. */
|
|
27
|
+
readonly clientId: string;
|
|
28
|
+
/** The client's own grant identity, when one was derived. */
|
|
29
|
+
readonly grantId: string | null;
|
|
30
|
+
readonly totalMs: number;
|
|
31
|
+
readonly queuedMs: number;
|
|
32
|
+
readonly loadMs: number;
|
|
33
|
+
readonly inferenceMs: number;
|
|
34
|
+
/** The closed failure-class vocabulary (`invocation-accounting.ts`). */
|
|
35
|
+
readonly failureClass: string;
|
|
36
|
+
/** A class-level reason; never a payload. */
|
|
37
|
+
readonly reason: string | null;
|
|
38
|
+
readonly inputBytes: number;
|
|
39
|
+
readonly outputBytes: number;
|
|
40
|
+
/** The native receipt id the call is correlatable by. */
|
|
41
|
+
readonly receiptId: string;
|
|
42
|
+
}
|
|
43
|
+
/** A page of the external call log, newest first. */
|
|
44
|
+
export interface McpCallsPage {
|
|
45
|
+
readonly calls: readonly McpCallRecord[];
|
|
46
|
+
/** Matching rows before pagination. */
|
|
47
|
+
readonly total: number;
|
|
48
|
+
readonly page: number;
|
|
49
|
+
readonly pageSize: number;
|
|
50
|
+
/** Distinct client identities present in the ledger (all rows, not just the page). */
|
|
51
|
+
readonly clients: readonly string[];
|
|
52
|
+
}
|
|
53
|
+
/** One client's external activity. */
|
|
54
|
+
export interface McpUsageClient {
|
|
55
|
+
readonly clientId: string;
|
|
56
|
+
/** The client's own grant identity, when a ledger row carried one. */
|
|
57
|
+
readonly grantId: string | null;
|
|
58
|
+
readonly calls: number;
|
|
59
|
+
readonly errors: number;
|
|
60
|
+
readonly lastSeen: number;
|
|
61
|
+
}
|
|
62
|
+
/** One tool's external activity. */
|
|
63
|
+
export interface McpUsageTool {
|
|
64
|
+
readonly tool: string;
|
|
65
|
+
readonly calls: number;
|
|
66
|
+
}
|
|
67
|
+
/** The ledger's aggregate view. */
|
|
68
|
+
export interface McpUsageSummary {
|
|
69
|
+
readonly total: number;
|
|
70
|
+
readonly clients: readonly McpUsageClient[];
|
|
71
|
+
readonly tools: readonly McpUsageTool[];
|
|
72
|
+
}
|
|
73
|
+
/** What the accounting hook supplies, plus the tool name it now carries. */
|
|
74
|
+
export declare function recordFromAccounting(toolName: string, accounting: InvocationAccounting, time?: number): McpCallRecord;
|
|
75
|
+
/**
|
|
76
|
+
* A bounded JSONL ledger over one file.
|
|
77
|
+
*
|
|
78
|
+
* Operations are synchronous and defensive: an unreadable or corrupt line contributes
|
|
79
|
+
* nothing, and a rotated file keeps the newest rows rather than failing the append.
|
|
80
|
+
*/
|
|
81
|
+
export declare class McpUsageLedger {
|
|
82
|
+
#private;
|
|
83
|
+
/**
|
|
84
|
+
* @param file - the JSONL path.
|
|
85
|
+
* @param options - `maxRows` defaults to {@link MCP_USAGE_MAX_ROWS}.
|
|
86
|
+
*/
|
|
87
|
+
constructor(file: string, options?: {
|
|
88
|
+
readonly maxRows?: number;
|
|
89
|
+
});
|
|
90
|
+
/** The ledger path (the MCP status surface names it, never its contents). */
|
|
91
|
+
get file(): string;
|
|
92
|
+
/**
|
|
93
|
+
* Append one call, trimming at the bound.
|
|
94
|
+
* @param call - the record to persist.
|
|
95
|
+
*/
|
|
96
|
+
record(call: McpCallRecord): void;
|
|
97
|
+
/**
|
|
98
|
+
* Read one page, newest first.
|
|
99
|
+
* @param query - optional client filter and 1-based page.
|
|
100
|
+
* @returns the page plus the matching total and the ledger's client identities.
|
|
101
|
+
*/
|
|
102
|
+
read(query?: {
|
|
103
|
+
readonly clientId?: string;
|
|
104
|
+
readonly page?: number;
|
|
105
|
+
readonly pageSize?: number;
|
|
106
|
+
}): McpCallsPage;
|
|
107
|
+
/** Aggregate the ledger by client and tool. */
|
|
108
|
+
summarize(): McpUsageSummary;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=mcp-usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-usage.d.ts","sourceRoot":"","sources":["../src/mcp-usage.ts"],"names":[],"mappings":"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"}
|