@nimrobo/mcporter-remote 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +7 -0
- package/.gitattributes +2 -0
- package/.github/workflows/ci.yml +26 -0
- package/AGENTS.md +109 -0
- package/CHANGELOG.md +361 -0
- package/LICENSE +21 -0
- package/README.md +449 -0
- package/bin/git +180 -0
- package/biome.json +43 -0
- package/config/mcporter.json +134 -0
- package/dist/cli/adhoc-server.d.ts +21 -0
- package/dist/cli/adhoc-server.d.ts.map +1 -0
- package/dist/cli/adhoc-server.js +228 -0
- package/dist/cli/adhoc-server.js.map +1 -0
- package/dist/cli/auth-command.d.ts +6 -0
- package/dist/cli/auth-command.d.ts.map +1 -0
- package/dist/cli/auth-command.js +257 -0
- package/dist/cli/auth-command.js.map +1 -0
- package/dist/cli/call-argument-expression.d.ts +5 -0
- package/dist/cli/call-argument-expression.d.ts.map +1 -0
- package/dist/cli/call-argument-expression.js +57 -0
- package/dist/cli/call-argument-expression.js.map +1 -0
- package/dist/cli/call-argument-values.d.ts +10 -0
- package/dist/cli/call-argument-values.d.ts.map +1 -0
- package/dist/cli/call-argument-values.js +83 -0
- package/dist/cli/call-argument-values.js.map +1 -0
- package/dist/cli/call-arguments.d.ts +17 -0
- package/dist/cli/call-arguments.d.ts.map +1 -0
- package/dist/cli/call-arguments.js +183 -0
- package/dist/cli/call-arguments.js.map +1 -0
- package/dist/cli/call-command.d.ts +5 -0
- package/dist/cli/call-command.d.ts.map +1 -0
- package/dist/cli/call-command.js +371 -0
- package/dist/cli/call-command.js.map +1 -0
- package/dist/cli/call-expression-parser.d.ts +9 -0
- package/dist/cli/call-expression-parser.d.ts.map +1 -0
- package/dist/cli/call-expression-parser.js +177 -0
- package/dist/cli/call-expression-parser.js.map +1 -0
- package/dist/cli/cli-factory.d.ts +16 -0
- package/dist/cli/cli-factory.d.ts.map +1 -0
- package/dist/cli/cli-factory.js +37 -0
- package/dist/cli/cli-factory.js.map +1 -0
- package/dist/cli/command-inference.d.ts +12 -0
- package/dist/cli/command-inference.d.ts.map +1 -0
- package/dist/cli/command-inference.js +75 -0
- package/dist/cli/command-inference.js.map +1 -0
- package/dist/cli/config/add.d.ts +23 -0
- package/dist/cli/config/add.d.ts.map +1 -0
- package/dist/cli/config/add.js +267 -0
- package/dist/cli/config/add.js.map +1 -0
- package/dist/cli/config/auth.d.ts +4 -0
- package/dist/cli/config/auth.d.ts.map +1 -0
- package/dist/cli/config/auth.js +21 -0
- package/dist/cli/config/auth.js.map +1 -0
- package/dist/cli/config/doctor.d.ts +3 -0
- package/dist/cli/config/doctor.d.ts.map +1 -0
- package/dist/cli/config/doctor.js +26 -0
- package/dist/cli/config/doctor.js.map +1 -0
- package/dist/cli/config/get.d.ts +3 -0
- package/dist/cli/config/get.d.ts.map +1 -0
- package/dist/cli/config/get.js +45 -0
- package/dist/cli/config/get.js.map +1 -0
- package/dist/cli/config/help.d.ts +18 -0
- package/dist/cli/config/help.d.ts.map +1 -0
- package/dist/cli/config/help.js +193 -0
- package/dist/cli/config/help.js.map +1 -0
- package/dist/cli/config/import.d.ts +9 -0
- package/dist/cli/config/import.d.ts.map +1 -0
- package/dist/cli/config/import.js +88 -0
- package/dist/cli/config/import.js.map +1 -0
- package/dist/cli/config/index.d.ts +2 -0
- package/dist/cli/config/index.d.ts.map +1 -0
- package/dist/cli/config/index.js +2 -0
- package/dist/cli/config/index.js.map +1 -0
- package/dist/cli/config/list.d.ts +7 -0
- package/dist/cli/config/list.d.ts.map +1 -0
- package/dist/cli/config/list.js +71 -0
- package/dist/cli/config/list.js.map +1 -0
- package/dist/cli/config/remove.d.ts +3 -0
- package/dist/cli/config/remove.d.ts.map +1 -0
- package/dist/cli/config/remove.js +19 -0
- package/dist/cli/config/remove.js.map +1 -0
- package/dist/cli/config/render.d.ts +26 -0
- package/dist/cli/config/render.d.ts.map +1 -0
- package/dist/cli/config/render.js +99 -0
- package/dist/cli/config/render.js.map +1 -0
- package/dist/cli/config/shared.d.ts +21 -0
- package/dist/cli/config/shared.d.ts.map +1 -0
- package/dist/cli/config/shared.js +130 -0
- package/dist/cli/config/shared.js.map +1 -0
- package/dist/cli/config/types.d.ts +7 -0
- package/dist/cli/config/types.d.ts.map +1 -0
- package/dist/cli/config/types.js +2 -0
- package/dist/cli/config/types.js.map +1 -0
- package/dist/cli/config-command.d.ts +7 -0
- package/dist/cli/config-command.d.ts.map +1 -0
- package/dist/cli/config-command.js +67 -0
- package/dist/cli/config-command.js.map +1 -0
- package/dist/cli/daemon-command.d.ts +8 -0
- package/dist/cli/daemon-command.d.ts.map +1 -0
- package/dist/cli/daemon-command.js +219 -0
- package/dist/cli/daemon-command.js.map +1 -0
- package/dist/cli/emit-ts-command.d.ts +31 -0
- package/dist/cli/emit-ts-command.d.ts.map +1 -0
- package/dist/cli/emit-ts-command.js +217 -0
- package/dist/cli/emit-ts-command.js.map +1 -0
- package/dist/cli/emit-ts-templates.d.ts +23 -0
- package/dist/cli/emit-ts-templates.d.ts.map +1 -0
- package/dist/cli/emit-ts-templates.js +130 -0
- package/dist/cli/emit-ts-templates.js.map +1 -0
- package/dist/cli/ephemeral-flags.d.ts +7 -0
- package/dist/cli/ephemeral-flags.d.ts.map +1 -0
- package/dist/cli/ephemeral-flags.js +108 -0
- package/dist/cli/ephemeral-flags.js.map +1 -0
- package/dist/cli/ephemeral-target.d.ts +16 -0
- package/dist/cli/ephemeral-target.d.ts.map +1 -0
- package/dist/cli/ephemeral-target.js +105 -0
- package/dist/cli/ephemeral-target.js.map +1 -0
- package/dist/cli/errors.d.ts +4 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/errors.js +7 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/flag-utils.d.ts +4 -0
- package/dist/cli/flag-utils.d.ts.map +1 -0
- package/dist/cli/flag-utils.js +27 -0
- package/dist/cli/flag-utils.js.map +1 -0
- package/dist/cli/generate/artifacts.d.ts +15 -0
- package/dist/cli/generate/artifacts.d.ts.map +1 -0
- package/dist/cli/generate/artifacts.js +247 -0
- package/dist/cli/generate/artifacts.js.map +1 -0
- package/dist/cli/generate/definition.d.ts +22 -0
- package/dist/cli/generate/definition.d.ts.map +1 -0
- package/dist/cli/generate/definition.js +265 -0
- package/dist/cli/generate/definition.js.map +1 -0
- package/dist/cli/generate/flag-parser.d.ts +11 -0
- package/dist/cli/generate/flag-parser.d.ts.map +1 -0
- package/dist/cli/generate/flag-parser.js +41 -0
- package/dist/cli/generate/flag-parser.js.map +1 -0
- package/dist/cli/generate/flags.d.ts +20 -0
- package/dist/cli/generate/flags.d.ts.map +1 -0
- package/dist/cli/generate/flags.js +220 -0
- package/dist/cli/generate/flags.js.map +1 -0
- package/dist/cli/generate/fs-helpers.d.ts +3 -0
- package/dist/cli/generate/fs-helpers.d.ts.map +1 -0
- package/dist/cli/generate/fs-helpers.js +34 -0
- package/dist/cli/generate/fs-helpers.js.map +1 -0
- package/dist/cli/generate/name-utils.d.ts +5 -0
- package/dist/cli/generate/name-utils.d.ts.map +1 -0
- package/dist/cli/generate/name-utils.js +170 -0
- package/dist/cli/generate/name-utils.js.map +1 -0
- package/dist/cli/generate/output.d.ts +5 -0
- package/dist/cli/generate/output.d.ts.map +1 -0
- package/dist/cli/generate/output.js +24 -0
- package/dist/cli/generate/output.js.map +1 -0
- package/dist/cli/generate/runtime.d.ts +3 -0
- package/dist/cli/generate/runtime.d.ts.map +1 -0
- package/dist/cli/generate/runtime.js +34 -0
- package/dist/cli/generate/runtime.js.map +1 -0
- package/dist/cli/generate/server-utils.d.ts +3 -0
- package/dist/cli/generate/server-utils.d.ts.map +1 -0
- package/dist/cli/generate/server-utils.js +33 -0
- package/dist/cli/generate/server-utils.js.map +1 -0
- package/dist/cli/generate/template-data.d.ts +25 -0
- package/dist/cli/generate/template-data.d.ts.map +1 -0
- package/dist/cli/generate/template-data.js +90 -0
- package/dist/cli/generate/template-data.js.map +1 -0
- package/dist/cli/generate/template-help.d.ts +2 -0
- package/dist/cli/generate/template-help.d.ts.map +1 -0
- package/dist/cli/generate/template-help.js +113 -0
- package/dist/cli/generate/template-help.js.map +1 -0
- package/dist/cli/generate/template.d.ts +30 -0
- package/dist/cli/generate/template.d.ts.map +1 -0
- package/dist/cli/generate/template.js +366 -0
- package/dist/cli/generate/template.js.map +1 -0
- package/dist/cli/generate/tools.d.ts +46 -0
- package/dist/cli/generate/tools.d.ts.map +1 -0
- package/dist/cli/generate/tools.js +304 -0
- package/dist/cli/generate/tools.js.map +1 -0
- package/dist/cli/generate/types.d.ts +5 -0
- package/dist/cli/generate/types.d.ts.map +1 -0
- package/dist/cli/generate/types.js +2 -0
- package/dist/cli/generate/types.js.map +1 -0
- package/dist/cli/generate-cli-runner.d.ts +3 -0
- package/dist/cli/generate-cli-runner.d.ts.map +1 -0
- package/dist/cli/generate-cli-runner.js +72 -0
- package/dist/cli/generate-cli-runner.js.map +1 -0
- package/dist/cli/help-output.d.ts +6 -0
- package/dist/cli/help-output.d.ts.map +1 -0
- package/dist/cli/help-output.js +186 -0
- package/dist/cli/help-output.js.map +1 -0
- package/dist/cli/http-utils.d.ts +9 -0
- package/dist/cli/http-utils.d.ts.map +1 -0
- package/dist/cli/http-utils.js +88 -0
- package/dist/cli/http-utils.js.map +1 -0
- package/dist/cli/identifier-helpers.d.ts +20 -0
- package/dist/cli/identifier-helpers.d.ts.map +1 -0
- package/dist/cli/identifier-helpers.js +84 -0
- package/dist/cli/identifier-helpers.js.map +1 -0
- package/dist/cli/image-output.d.ts +3 -0
- package/dist/cli/image-output.d.ts.map +1 -0
- package/dist/cli/image-output.js +57 -0
- package/dist/cli/image-output.js.map +1 -0
- package/dist/cli/inspect-cli-command.d.ts +11 -0
- package/dist/cli/inspect-cli-command.d.ts.map +1 -0
- package/dist/cli/inspect-cli-command.js +78 -0
- package/dist/cli/inspect-cli-command.js.map +1 -0
- package/dist/cli/json-output.d.ts +23 -0
- package/dist/cli/json-output.d.ts.map +1 -0
- package/dist/cli/json-output.js +38 -0
- package/dist/cli/json-output.js.map +1 -0
- package/dist/cli/list-command.d.ts +15 -0
- package/dist/cli/list-command.d.ts.map +1 -0
- package/dist/cli/list-command.js +372 -0
- package/dist/cli/list-command.js.map +1 -0
- package/dist/cli/list-detail-helpers.d.ts +41 -0
- package/dist/cli/list-detail-helpers.d.ts.map +1 -0
- package/dist/cli/list-detail-helpers.js +99 -0
- package/dist/cli/list-detail-helpers.js.map +1 -0
- package/dist/cli/list-doc-comments.d.ts +6 -0
- package/dist/cli/list-doc-comments.d.ts.map +1 -0
- package/dist/cli/list-doc-comments.js +114 -0
- package/dist/cli/list-doc-comments.js.map +1 -0
- package/dist/cli/list-format.d.ts +38 -0
- package/dist/cli/list-format.d.ts.map +1 -0
- package/dist/cli/list-format.js +98 -0
- package/dist/cli/list-format.js.map +1 -0
- package/dist/cli/list-output.d.ts +39 -0
- package/dist/cli/list-output.d.ts.map +1 -0
- package/dist/cli/list-output.js +159 -0
- package/dist/cli/list-output.js.map +1 -0
- package/dist/cli/list-signature.d.ts +26 -0
- package/dist/cli/list-signature.d.ts.map +1 -0
- package/dist/cli/list-signature.js +176 -0
- package/dist/cli/list-signature.js.map +1 -0
- package/dist/cli/logger-context.d.ts +9 -0
- package/dist/cli/logger-context.d.ts.map +1 -0
- package/dist/cli/logger-context.js +29 -0
- package/dist/cli/logger-context.js.map +1 -0
- package/dist/cli/output-format.d.ts +11 -0
- package/dist/cli/output-format.d.ts.map +1 -0
- package/dist/cli/output-format.js +51 -0
- package/dist/cli/output-format.js.map +1 -0
- package/dist/cli/output-utils.d.ts +5 -0
- package/dist/cli/output-utils.d.ts.map +1 -0
- package/dist/cli/output-utils.js +143 -0
- package/dist/cli/output-utils.js.map +1 -0
- package/dist/cli/path-utils.d.ts +2 -0
- package/dist/cli/path-utils.d.ts.map +1 -0
- package/dist/cli/path-utils.js +12 -0
- package/dist/cli/path-utils.js.map +1 -0
- package/dist/cli/runtime-debug.d.ts +4 -0
- package/dist/cli/runtime-debug.d.ts.map +1 -0
- package/dist/cli/runtime-debug.js +134 -0
- package/dist/cli/runtime-debug.js.map +1 -0
- package/dist/cli/server-lookup.d.ts +3 -0
- package/dist/cli/server-lookup.d.ts.map +1 -0
- package/dist/cli/server-lookup.js +21 -0
- package/dist/cli/server-lookup.js.map +1 -0
- package/dist/cli/terminal.d.ts +10 -0
- package/dist/cli/terminal.d.ts.map +1 -0
- package/dist/cli/terminal.js +33 -0
- package/dist/cli/terminal.js.map +1 -0
- package/dist/cli/timeouts.d.ts +9 -0
- package/dist/cli/timeouts.d.ts.map +1 -0
- package/dist/cli/timeouts.js +55 -0
- package/dist/cli/timeouts.js.map +1 -0
- package/dist/cli/tool-cache.d.ts +9 -0
- package/dist/cli/tool-cache.d.ts.map +1 -0
- package/dist/cli/tool-cache.js +31 -0
- package/dist/cli/tool-cache.js.map +1 -0
- package/dist/cli/transport-utils.d.ts +3 -0
- package/dist/cli/transport-utils.d.ts.map +1 -0
- package/dist/cli/transport-utils.js +9 -0
- package/dist/cli/transport-utils.js.map +1 -0
- package/dist/cli-metadata.d.ts +57 -0
- package/dist/cli-metadata.d.ts.map +1 -0
- package/dist/cli-metadata.js +92 -0
- package/dist/cli-metadata.js.map +1 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +217 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/imports/external.d.ts +8 -0
- package/dist/config/imports/external.d.ts.map +1 -0
- package/dist/config/imports/external.js +231 -0
- package/dist/config/imports/external.js.map +1 -0
- package/dist/config/imports/paths-utils.d.ts +3 -0
- package/dist/config/imports/paths-utils.d.ts.map +1 -0
- package/dist/config/imports/paths-utils.js +27 -0
- package/dist/config/imports/paths-utils.js.map +1 -0
- package/dist/config/imports/paths.d.ts +3 -0
- package/dist/config/imports/paths.d.ts.map +1 -0
- package/dist/config/imports/paths.js +135 -0
- package/dist/config/imports/paths.js.map +1 -0
- package/dist/config/imports/shared.d.ts +4 -0
- package/dist/config/imports/shared.d.ts.map +1 -0
- package/dist/config/imports/shared.js +25 -0
- package/dist/config/imports/shared.js.map +1 -0
- package/dist/config/path-discovery.d.ts +11 -0
- package/dist/config/path-discovery.d.ts.map +1 -0
- package/dist/config/path-discovery.js +65 -0
- package/dist/config/path-discovery.js.map +1 -0
- package/dist/config/read-config.d.ts +9 -0
- package/dist/config/read-config.d.ts.map +1 -0
- package/dist/config/read-config.js +74 -0
- package/dist/config/read-config.js.map +1 -0
- package/dist/config-imports.d.ts +7 -0
- package/dist/config-imports.d.ts.map +1 -0
- package/dist/config-imports.js +8 -0
- package/dist/config-imports.js.map +1 -0
- package/dist/config-normalize.d.ts +8 -0
- package/dist/config-normalize.d.ts.map +1 -0
- package/dist/config-normalize.js +184 -0
- package/dist/config-normalize.js.map +1 -0
- package/dist/config-schema.d.ts +164 -0
- package/dist/config-schema.d.ts.map +1 -0
- package/dist/config-schema.js +103 -0
- package/dist/config-schema.js.map +1 -0
- package/dist/config.d.ts +17 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +91 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon/client.d.ts +34 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +291 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/config-layers.d.ts +7 -0
- package/dist/daemon/config-layers.d.ts.map +1 -0
- package/dist/daemon/config-layers.js +20 -0
- package/dist/daemon/config-layers.js.map +1 -0
- package/dist/daemon/host.d.ts +32 -0
- package/dist/daemon/host.d.ts.map +1 -0
- package/dist/daemon/host.js +345 -0
- package/dist/daemon/host.js.map +1 -0
- package/dist/daemon/launch.d.ts +10 -0
- package/dist/daemon/launch.d.ts.map +1 -0
- package/dist/daemon/launch.js +35 -0
- package/dist/daemon/launch.js.map +1 -0
- package/dist/daemon/log-context.d.ts +18 -0
- package/dist/daemon/log-context.d.ts.map +1 -0
- package/dist/daemon/log-context.js +64 -0
- package/dist/daemon/log-context.js.map +1 -0
- package/dist/daemon/paths.d.ts +5 -0
- package/dist/daemon/paths.d.ts.map +1 -0
- package/dist/daemon/paths.js +30 -0
- package/dist/daemon/paths.js.map +1 -0
- package/dist/daemon/protocol.d.ts +51 -0
- package/dist/daemon/protocol.d.ts.map +1 -0
- package/dist/daemon/protocol.js +2 -0
- package/dist/daemon/protocol.js.map +1 -0
- package/dist/daemon/request-utils.d.ts +12 -0
- package/dist/daemon/request-utils.d.ts.map +1 -0
- package/dist/daemon/request-utils.js +52 -0
- package/dist/daemon/request-utils.js.map +1 -0
- package/dist/daemon/runtime-wrapper.d.ts +9 -0
- package/dist/daemon/runtime-wrapper.d.ts.map +1 -0
- package/dist/daemon/runtime-wrapper.js +110 -0
- package/dist/daemon/runtime-wrapper.js.map +1 -0
- package/dist/env.d.ts +5 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +93 -0
- package/dist/env.js.map +1 -0
- package/dist/error-classifier.d.ts +11 -0
- package/dist/error-classifier.d.ts.map +1 -0
- package/dist/error-classifier.js +141 -0
- package/dist/error-classifier.js.map +1 -0
- package/dist/fs-json.d.ts +3 -0
- package/dist/fs-json.d.ts.map +1 -0
- package/dist/fs-json.js +21 -0
- package/dist/fs-json.js.map +1 -0
- package/dist/generate-cli.d.ts +32 -0
- package/dist/generate-cli.d.ts.map +1 -0
- package/dist/generate-cli.js +155 -0
- package/dist/generate-cli.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle.d.ts +8 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +106 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/logging.d.ts +19 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +76 -0
- package/dist/logging.js.map +1 -0
- package/dist/oauth-manual.d.ts +9 -0
- package/dist/oauth-manual.d.ts.map +1 -0
- package/dist/oauth-manual.js +84 -0
- package/dist/oauth-manual.js.map +1 -0
- package/dist/oauth-persistence.d.ts +20 -0
- package/dist/oauth-persistence.d.ts.map +1 -0
- package/dist/oauth-persistence.js +254 -0
- package/dist/oauth-persistence.js.map +1 -0
- package/dist/oauth-vault.d.ts +19 -0
- package/dist/oauth-vault.d.ts.map +1 -0
- package/dist/oauth-vault.js +100 -0
- package/dist/oauth-vault.js.map +1 -0
- package/dist/oauth.d.ts +31 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +414 -0
- package/dist/oauth.js.map +1 -0
- package/dist/result-utils.d.ts +22 -0
- package/dist/result-utils.d.ts.map +1 -0
- package/dist/result-utils.js +229 -0
- package/dist/result-utils.js.map +1 -0
- package/dist/runtime/errors.d.ts +2 -0
- package/dist/runtime/errors.d.ts.map +1 -0
- package/dist/runtime/errors.js +16 -0
- package/dist/runtime/errors.js.map +1 -0
- package/dist/runtime/http-transport.d.ts +15 -0
- package/dist/runtime/http-transport.d.ts.map +1 -0
- package/dist/runtime/http-transport.js +91 -0
- package/dist/runtime/http-transport.js.map +1 -0
- package/dist/runtime/manual-oauth.d.ts +8 -0
- package/dist/runtime/manual-oauth.d.ts.map +1 -0
- package/dist/runtime/manual-oauth.js +81 -0
- package/dist/runtime/manual-oauth.js.map +1 -0
- package/dist/runtime/oauth.d.ts +22 -0
- package/dist/runtime/oauth.d.ts.map +1 -0
- package/dist/runtime/oauth.js +83 -0
- package/dist/runtime/oauth.js.map +1 -0
- package/dist/runtime/transport.d.ts +24 -0
- package/dist/runtime/transport.d.ts.map +1 -0
- package/dist/runtime/transport.js +165 -0
- package/dist/runtime/transport.js.map +1 -0
- package/dist/runtime/utils.d.ts +5 -0
- package/dist/runtime/utils.d.ts.map +1 -0
- package/dist/runtime/utils.js +47 -0
- package/dist/runtime/utils.js.map +1 -0
- package/dist/runtime-header-utils.d.ts +2 -0
- package/dist/runtime-header-utils.d.ts.map +1 -0
- package/dist/runtime-header-utils.js +19 -0
- package/dist/runtime-header-utils.js.map +1 -0
- package/dist/runtime-oauth-support.d.ts +5 -0
- package/dist/runtime-oauth-support.d.ts.map +1 -0
- package/dist/runtime-oauth-support.js +21 -0
- package/dist/runtime-oauth-support.js.map +1 -0
- package/dist/runtime-process-utils.d.ts +11 -0
- package/dist/runtime-process-utils.d.ts.map +1 -0
- package/dist/runtime-process-utils.js +299 -0
- package/dist/runtime-process-utils.js.map +1 -0
- package/dist/runtime.d.ts +55 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +245 -0
- package/dist/runtime.js.map +1 -0
- package/dist/schema-cache.d.ts +10 -0
- package/dist/schema-cache.d.ts.map +1 -0
- package/dist/schema-cache.js +40 -0
- package/dist/schema-cache.js.map +1 -0
- package/dist/sdk-patches.d.ts +5 -0
- package/dist/sdk-patches.d.ts.map +1 -0
- package/dist/sdk-patches.js +399 -0
- package/dist/sdk-patches.js.map +1 -0
- package/dist/server-proxy.d.ts +17 -0
- package/dist/server-proxy.d.ts.map +1 -0
- package/dist/server-proxy.js +342 -0
- package/dist/server-proxy.js.map +1 -0
- package/docs/RELEASE.md +96 -0
- package/docs/adhoc.md +76 -0
- package/docs/call-heuristic.md +31 -0
- package/docs/call-syntax.md +75 -0
- package/docs/cli-generator.md +116 -0
- package/docs/cli-reference.md +76 -0
- package/docs/config.md +208 -0
- package/docs/daemon.md +95 -0
- package/docs/emit-ts.md +98 -0
- package/docs/hang-debug.md +88 -0
- package/docs/import.md +59 -0
- package/docs/known-issues.md +33 -0
- package/docs/livetests.md +31 -0
- package/docs/local.md +73 -0
- package/docs/logging.md +67 -0
- package/docs/manual-testing.md +78 -0
- package/docs/mcp.md +44 -0
- package/docs/migration.md +77 -0
- package/docs/pnpm-mcp-migration.md +15 -0
- package/docs/refactor.md +76 -0
- package/docs/shortcuts.md +31 -0
- package/docs/spec.md +86 -0
- package/docs/subagent.md +39 -0
- package/docs/supabase-auth-issue.md +53 -0
- package/docs/tmux.md +30 -0
- package/docs/tool-calling.md +73 -0
- package/docs/windows.md +25 -0
- package/examples/context7-headlines.ts +72 -0
- package/git +3 -0
- package/mcporter.png +0 -0
- package/mcporter.schema.json +263 -0
- package/package.json +105 -0
- package/pnpm-workspace.yaml +2 -0
- package/runner +13 -0
- package/scripts/agent-send.ts +179 -0
- package/scripts/build-bun.ts +125 -0
- package/scripts/committer +53 -0
- package/scripts/docs-list.ts +132 -0
- package/scripts/generate-json-schema.ts +50 -0
- package/scripts/git-policy.ts +165 -0
- package/scripts/mcp_signoz_retry_patch.cjs +9 -0
- package/scripts/release.sh +86 -0
- package/scripts/runner.ts +1556 -0
- package/scripts/test-runner.js +39 -0
- package/src/cli/adhoc-server.ts +263 -0
- package/src/cli/auth-command.ts +290 -0
- package/src/cli/call-argument-expression.ts +61 -0
- package/src/cli/call-argument-values.ts +95 -0
- package/src/cli/call-arguments.ts +246 -0
- package/src/cli/call-command.ts +478 -0
- package/src/cli/call-expression-parser.ts +210 -0
- package/src/cli/cli-factory.ts +51 -0
- package/src/cli/command-inference.ts +99 -0
- package/src/cli/config/add.ts +308 -0
- package/src/cli/config/auth.ts +23 -0
- package/src/cli/config/doctor.ts +27 -0
- package/src/cli/config/get.ts +47 -0
- package/src/cli/config/help.ts +213 -0
- package/src/cli/config/import.ts +97 -0
- package/src/cli/config/index.ts +1 -0
- package/src/cli/config/list.ts +81 -0
- package/src/cli/config/remove.ts +20 -0
- package/src/cli/config/render.ts +119 -0
- package/src/cli/config/shared.ts +159 -0
- package/src/cli/config/types.ts +8 -0
- package/src/cli/config-command.ts +72 -0
- package/src/cli/daemon-command.ts +260 -0
- package/src/cli/emit-ts-command.ts +260 -0
- package/src/cli/emit-ts-templates.ts +161 -0
- package/src/cli/ephemeral-flags.ts +128 -0
- package/src/cli/ephemeral-target.ts +134 -0
- package/src/cli/errors.ts +6 -0
- package/src/cli/flag-utils.ts +29 -0
- package/src/cli/generate/artifacts.ts +308 -0
- package/src/cli/generate/definition.ts +325 -0
- package/src/cli/generate/flag-parser.ts +50 -0
- package/src/cli/generate/flags.ts +248 -0
- package/src/cli/generate/fs-helpers.ts +34 -0
- package/src/cli/generate/name-utils.ts +176 -0
- package/src/cli/generate/output.ts +27 -0
- package/src/cli/generate/runtime.ts +38 -0
- package/src/cli/generate/server-utils.ts +38 -0
- package/src/cli/generate/template-data.ts +126 -0
- package/src/cli/generate/template-help.ts +112 -0
- package/src/cli/generate/template.ts +407 -0
- package/src/cli/generate/tools.ts +354 -0
- package/src/cli/generate/types.ts +1 -0
- package/src/cli/generate-cli-runner.ts +82 -0
- package/src/cli/help-output.ts +207 -0
- package/src/cli/http-utils.ts +89 -0
- package/src/cli/identifier-helpers.ts +107 -0
- package/src/cli/image-output.ts +62 -0
- package/src/cli/inspect-cli-command.ts +89 -0
- package/src/cli/json-output.ts +60 -0
- package/src/cli/list-command.ts +432 -0
- package/src/cli/list-detail-helpers.ts +179 -0
- package/src/cli/list-doc-comments.ts +129 -0
- package/src/cli/list-format.ts +150 -0
- package/src/cli/list-output.ts +224 -0
- package/src/cli/list-signature.ts +217 -0
- package/src/cli/logger-context.ts +36 -0
- package/src/cli/output-format.ts +63 -0
- package/src/cli/output-utils.ts +161 -0
- package/src/cli/path-utils.ts +13 -0
- package/src/cli/runtime-debug.ts +141 -0
- package/src/cli/server-lookup.ts +22 -0
- package/src/cli/terminal.ts +41 -0
- package/src/cli/timeouts.ts +67 -0
- package/src/cli/tool-cache.ts +43 -0
- package/src/cli/transport-utils.ts +10 -0
- package/src/cli-metadata.ts +164 -0
- package/src/cli.ts +234 -0
- package/src/config/imports/external.ts +284 -0
- package/src/config/imports/paths-utils.ts +29 -0
- package/src/config/imports/paths.ts +145 -0
- package/src/config/imports/shared.ts +27 -0
- package/src/config/path-discovery.ts +79 -0
- package/src/config/read-config.ts +91 -0
- package/src/config-imports.ts +12 -0
- package/src/config-normalize.ts +220 -0
- package/src/config-schema.ts +175 -0
- package/src/config.ts +136 -0
- package/src/daemon/client.ts +350 -0
- package/src/daemon/config-layers.ts +23 -0
- package/src/daemon/host.ts +455 -0
- package/src/daemon/launch.ts +45 -0
- package/src/daemon/log-context.ts +78 -0
- package/src/daemon/paths.ts +35 -0
- package/src/daemon/protocol.ts +57 -0
- package/src/daemon/request-utils.ts +67 -0
- package/src/daemon/runtime-wrapper.ts +135 -0
- package/src/env.ts +107 -0
- package/src/error-classifier.ts +158 -0
- package/src/fs-json.ts +21 -0
- package/src/generate-cli.ts +211 -0
- package/src/index.ts +14 -0
- package/src/lifecycle.ts +138 -0
- package/src/logging.ts +93 -0
- package/src/oauth-manual.ts +103 -0
- package/src/oauth-persistence.ts +316 -0
- package/src/oauth-vault.ts +128 -0
- package/src/oauth.ts +494 -0
- package/src/result-utils.ts +278 -0
- package/src/runtime/errors.ts +17 -0
- package/src/runtime/oauth.ts +112 -0
- package/src/runtime/transport.ts +198 -0
- package/src/runtime/utils.ts +54 -0
- package/src/runtime-header-utils.ts +23 -0
- package/src/runtime-oauth-support.ts +24 -0
- package/src/runtime-process-utils.ts +324 -0
- package/src/runtime.ts +321 -0
- package/src/schema-cache.ts +49 -0
- package/src/sdk-patches.ts +498 -0
- package/src/server-proxy.ts +407 -0
- package/tests/adhoc-server.test.ts +49 -0
- package/tests/call-arguments.test.ts +111 -0
- package/tests/cli-auth-help.test.ts +43 -0
- package/tests/cli-auth-retry.test.ts +41 -0
- package/tests/cli-auth.test.ts +96 -0
- package/tests/cli-call-args.test.ts +69 -0
- package/tests/cli-call-errors.test.ts +27 -0
- package/tests/cli-call-execution.test.ts +279 -0
- package/tests/cli-call-help.test.ts +43 -0
- package/tests/cli-command-inference.test.ts +73 -0
- package/tests/cli-config-command.test.ts +371 -0
- package/tests/cli-config-fallback.test.ts +259 -0
- package/tests/cli-config-routing.test.ts +20 -0
- package/tests/cli-ephemeral-flags.test.ts +54 -0
- package/tests/cli-flag-utils.test.ts +17 -0
- package/tests/cli-generate-artifacts.test.ts +52 -0
- package/tests/cli-generate-cli.integration.test.ts +675 -0
- package/tests/cli-generate-runner.test.ts +156 -0
- package/tests/cli-global-flags.test.ts +61 -0
- package/tests/cli-help-shortcuts.test.ts +42 -0
- package/tests/cli-image-output.test.ts +65 -0
- package/tests/cli-inspect-command.test.ts +15 -0
- package/tests/cli-list-classification.test.ts +291 -0
- package/tests/cli-list-flags.test.ts +83 -0
- package/tests/cli-list-formatting.test.ts +358 -0
- package/tests/cli-list-help.test.ts +43 -0
- package/tests/cli-list-json.test.ts +55 -0
- package/tests/cli-list-stdio-logs.test.ts +108 -0
- package/tests/cli-list-verbose-e2e.test.ts +83 -0
- package/tests/cli-oauth-timeout-flag.test.ts +94 -0
- package/tests/cli-output-utils.test.ts +129 -0
- package/tests/cli-regenerate.test.ts +261 -0
- package/tests/cli-version.test.ts +24 -0
- package/tests/config-add-dry-run.test.ts +45 -0
- package/tests/config-add-flags.test.ts +61 -0
- package/tests/config-add-imports.test.ts +28 -0
- package/tests/config-add-persist.test.ts +27 -0
- package/tests/config-add-scope-behavior.test.ts +46 -0
- package/tests/config-add-scope.test.ts +101 -0
- package/tests/config-add-sse.test.ts +23 -0
- package/tests/config-command-string.test.ts +96 -0
- package/tests/config-doctor.test.ts +45 -0
- package/tests/config-get-json.test.ts +24 -0
- package/tests/config-import-dedupe.test.ts +27 -0
- package/tests/config-import-paths.test.ts +49 -0
- package/tests/config-import.test.ts +64 -0
- package/tests/config-imports-unit.test.ts +337 -0
- package/tests/config-imports.test.ts +417 -0
- package/tests/config-layered.test.ts +178 -0
- package/tests/config-list-text-footer.test.ts +33 -0
- package/tests/config-list.test.ts +62 -0
- package/tests/config-missing.test.ts +140 -0
- package/tests/config-normalize.test.ts +71 -0
- package/tests/config-remove.test.ts +44 -0
- package/tests/config-render.test.ts +61 -0
- package/tests/config-resolution.test.ts +94 -0
- package/tests/config-schema-file.test.ts +29 -0
- package/tests/config-shared.test.ts +41 -0
- package/tests/config-sources.test.ts +58 -0
- package/tests/daemon-cli-command.test.ts +112 -0
- package/tests/daemon-client-config-stale.test.ts +222 -0
- package/tests/daemon-client-timeout.test.ts +114 -0
- package/tests/daemon-client.test.ts +61 -0
- package/tests/daemon-host.test.ts +33 -0
- package/tests/daemon.integration.test.ts +175 -0
- package/tests/emit-ts.test.ts +125 -0
- package/tests/ephemeral-target.test.ts +26 -0
- package/tests/error-classifier.test.ts +46 -0
- package/tests/fixtures/ansi.ts +18 -0
- package/tests/fixtures/cli-list-fixtures.ts +43 -0
- package/tests/fixtures/config-fixture.ts +29 -0
- package/tests/fixtures/imports/.claude/mcp.json +8 -0
- package/tests/fixtures/imports/.claude/settings.json +10 -0
- package/tests/fixtures/imports/.claude/settings.local.json +10 -0
- package/tests/fixtures/imports/.codeium/windsurf/mcp_config.json +14 -0
- package/tests/fixtures/imports/.codex/config.toml +7 -0
- package/tests/fixtures/imports/.config/opencode/opencode.jsonc +10 -0
- package/tests/fixtures/imports/.cursor/mcp.json +14 -0
- package/tests/fixtures/imports/Library/Application Support/Code/User/mcp.json +11 -0
- package/tests/fixtures/imports/config/mcporter.json +11 -0
- package/tests/fixtures/imports/home/.claude/settings.json +7 -0
- package/tests/fixtures/imports/home/.codeium/windsurf/mcp_config.json +14 -0
- package/tests/fixtures/imports/home/.codex/config.toml +7 -0
- package/tests/fixtures/imports/home/Library/Application Support/Code/User/mcp.json +11 -0
- package/tests/fixtures/imports/opencode.jsonc +11 -0
- package/tests/fixtures/mcporter.json +64 -0
- package/tests/fixtures/stdio-filesystem-server.mjs +63 -0
- package/tests/fixtures/stdio-memory-server.mjs +58 -0
- package/tests/fixtures/test-helpers.ts +24 -0
- package/tests/fixtures/tool-fixtures.ts +35 -0
- package/tests/fs-json.test.ts +35 -0
- package/tests/generate-cli-helpers.test.ts +162 -0
- package/tests/generate-cli.test.ts +595 -0
- package/tests/generate-definition.test.ts +25 -0
- package/tests/generator-flag-parser.test.ts +19 -0
- package/tests/index-api.test.ts +136 -0
- package/tests/keep-alive-runtime.test.ts +152 -0
- package/tests/lifecycle.test.ts +29 -0
- package/tests/list-detail-helpers.test.ts +204 -0
- package/tests/list-format.test.ts +40 -0
- package/tests/list-inline-stdio.test.ts +71 -0
- package/tests/list-output.test.ts +138 -0
- package/tests/live/deepwiki-live.test.ts +53 -0
- package/tests/oauth-callback.test.ts +108 -0
- package/tests/oauth-open-external.test.ts +29 -0
- package/tests/oauth-persistence.test.ts +146 -0
- package/tests/oauth-session.test.ts +216 -0
- package/tests/result-utils.test.ts +254 -0
- package/tests/runtime-call-timeout.test.ts +75 -0
- package/tests/runtime-compose.test.ts +298 -0
- package/tests/runtime-error-reset.test.ts +65 -0
- package/tests/runtime-header-utils.test.ts +36 -0
- package/tests/runtime-integration.test.ts +113 -0
- package/tests/runtime-oauth-connect.test.ts +72 -0
- package/tests/runtime-oauth-detection.test.ts +72 -0
- package/tests/runtime-oauth-timeout.test.ts +60 -0
- package/tests/runtime-oauth-utils.test.ts +14 -0
- package/tests/runtime-process-utils.test.ts +53 -0
- package/tests/runtime-transport.test.ts +69 -0
- package/tests/runtime-utils.test.ts +31 -0
- package/tests/runtime.test.ts +94 -0
- package/tests/sdk-patches.test.ts +24 -0
- package/tests/server-proxy.test.ts +336 -0
- package/tests/stdio-servers.integration.test.ts +139 -0
- package/tests/tool-cache.test.ts +42 -0
- package/tests/version-consistency.test.ts +11 -0
- package/tsconfig.build.json +11 -0
- package/tsconfig.json +17 -0
- package/vitest.config.ts +18 -0
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
import { analyzeConnectionError, type ConnectionIssue } from '../error-classifier.js';
|
|
2
|
+
import { wrapCallResult } from '../result-utils.js';
|
|
3
|
+
import { type CallArgsParseResult, parseCallArguments } from './call-arguments.js';
|
|
4
|
+
import { prepareEphemeralServerTarget } from './ephemeral-target.js';
|
|
5
|
+
import { looksLikeHttpUrl, normalizeHttpUrlCandidate } from './http-utils.js';
|
|
6
|
+
import type { IdentifierResolution } from './identifier-helpers.js';
|
|
7
|
+
import {
|
|
8
|
+
chooseClosestIdentifier,
|
|
9
|
+
normalizeIdentifier,
|
|
10
|
+
renderIdentifierResolutionMessages,
|
|
11
|
+
} from './identifier-helpers.js';
|
|
12
|
+
import { saveCallImagesIfRequested } from './image-output.js';
|
|
13
|
+
import { buildConnectionIssueEnvelope } from './json-output.js';
|
|
14
|
+
import { handleList } from './list-command.js';
|
|
15
|
+
import type { OutputFormat } from './output-utils.js';
|
|
16
|
+
import { printCallOutput, tailLogIfRequested } from './output-utils.js';
|
|
17
|
+
import { dumpActiveHandles } from './runtime-debug.js';
|
|
18
|
+
import { dimText, redText, yellowText } from './terminal.js';
|
|
19
|
+
import { resolveCallTimeout, withTimeout } from './timeouts.js';
|
|
20
|
+
import { loadToolMetadata } from './tool-cache.js';
|
|
21
|
+
|
|
22
|
+
type Runtime = Awaited<ReturnType<typeof import('../runtime.js')['createRuntime']>>;
|
|
23
|
+
|
|
24
|
+
interface ResolvedCallTarget {
|
|
25
|
+
server: string;
|
|
26
|
+
tool: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface PreparedCallRequest extends ResolvedCallTarget {
|
|
30
|
+
parsed: CallArgsParseResult;
|
|
31
|
+
hydratedArgs: Record<string, unknown>;
|
|
32
|
+
timeoutMs: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export async function handleCall(runtime: Runtime, args: string[]): Promise<void> {
|
|
36
|
+
const prepared = await prepareCallRequest(runtime, args);
|
|
37
|
+
if (!prepared) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const invocation = await invokePreparedCall(runtime, prepared);
|
|
42
|
+
if (!invocation) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
renderCallResult(invocation.result, prepared.parsed);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function prepareCallRequest(runtime: Runtime, args: string[]): Promise<PreparedCallRequest | undefined> {
|
|
50
|
+
const parsed = parseCallArguments(args);
|
|
51
|
+
await normalizeParsedCallArguments(runtime, parsed);
|
|
52
|
+
const { server, tool } = await resolveServerAndTool(runtime, parsed);
|
|
53
|
+
|
|
54
|
+
if (await maybeDescribeServer(runtime, server, tool, parsed.output)) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const timeoutMs = resolveCallTimeout(parsed.timeoutMs);
|
|
59
|
+
const hydratedArgs = await hydratePositionalArguments(runtime, server, tool, parsed.args, parsed.positionalArgs);
|
|
60
|
+
return { parsed, server, tool, hydratedArgs, timeoutMs };
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function normalizeParsedCallArguments(runtime: Runtime, parsed: CallArgsParseResult): Promise<void> {
|
|
64
|
+
let ephemeralSpec = parsed.ephemeral ? { ...parsed.ephemeral } : undefined;
|
|
65
|
+
const nameHints: string[] = [];
|
|
66
|
+
const absorbUrlCandidate = (value: string | undefined): string | undefined => {
|
|
67
|
+
if (!value) {
|
|
68
|
+
return value;
|
|
69
|
+
}
|
|
70
|
+
const normalized = normalizeHttpUrlCandidate(value);
|
|
71
|
+
if (!normalized) {
|
|
72
|
+
return value;
|
|
73
|
+
}
|
|
74
|
+
if (!ephemeralSpec) {
|
|
75
|
+
ephemeralSpec = { httpUrl: normalized };
|
|
76
|
+
} else if (!ephemeralSpec.httpUrl) {
|
|
77
|
+
ephemeralSpec = { ...ephemeralSpec, httpUrl: normalized };
|
|
78
|
+
}
|
|
79
|
+
return undefined;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
parsed.server = absorbUrlCandidate(parsed.server);
|
|
83
|
+
parsed.selector = absorbUrlCandidate(parsed.selector);
|
|
84
|
+
|
|
85
|
+
if (ephemeralSpec && parsed.server && !looksLikeHttpUrl(parsed.server)) {
|
|
86
|
+
nameHints.push(parsed.server);
|
|
87
|
+
parsed.server = undefined;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (ephemeralSpec?.httpUrl && !ephemeralSpec.name && parsed.tool) {
|
|
91
|
+
const candidate = parsed.selector && !looksLikeHttpUrl(parsed.selector) ? parsed.selector : undefined;
|
|
92
|
+
if (candidate) {
|
|
93
|
+
nameHints.push(candidate);
|
|
94
|
+
parsed.selector = undefined;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const prepared = await prepareEphemeralServerTarget({
|
|
99
|
+
runtime,
|
|
100
|
+
target: parsed.server,
|
|
101
|
+
ephemeral: ephemeralSpec,
|
|
102
|
+
nameHints,
|
|
103
|
+
reuseFromSpec: true,
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
parsed.server = prepared.target;
|
|
107
|
+
if (!parsed.selector) {
|
|
108
|
+
parsed.selector = prepared.target;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function resolveServerAndTool(runtime: Runtime, parsed: CallArgsParseResult): Promise<ResolvedCallTarget> {
|
|
113
|
+
const target = resolveCallTarget(parsed, { allowMissingTool: true });
|
|
114
|
+
const server = target.server;
|
|
115
|
+
let tool = target.tool;
|
|
116
|
+
if (!server) {
|
|
117
|
+
throw new Error('Missing server name. Provide it via <server>.<tool> or --server.');
|
|
118
|
+
}
|
|
119
|
+
if (!tool) {
|
|
120
|
+
tool = await inferSingleToolName(runtime, server);
|
|
121
|
+
if (!tool) {
|
|
122
|
+
throw new Error('Missing tool name. Provide it via <server>.<tool> or --tool.');
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return { server, tool };
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
async function invokePreparedCall(
|
|
129
|
+
runtime: Runtime,
|
|
130
|
+
prepared: PreparedCallRequest
|
|
131
|
+
): Promise<{ result: unknown; resolvedTool: string } | undefined> {
|
|
132
|
+
let invocation: { result: unknown; resolvedTool: string };
|
|
133
|
+
try {
|
|
134
|
+
invocation = await invokeWithAutoCorrection(
|
|
135
|
+
runtime,
|
|
136
|
+
prepared.server,
|
|
137
|
+
prepared.tool,
|
|
138
|
+
prepared.hydratedArgs,
|
|
139
|
+
prepared.timeoutMs
|
|
140
|
+
);
|
|
141
|
+
} catch (error) {
|
|
142
|
+
const issue = maybeReportConnectionIssue(prepared.server, prepared.tool, error);
|
|
143
|
+
if (prepared.parsed.output === 'json' || prepared.parsed.output === 'raw') {
|
|
144
|
+
const payload = buildConnectionIssueEnvelope({ server: prepared.server, tool: prepared.tool, error, issue });
|
|
145
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
146
|
+
process.exitCode = 1;
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
return invocation;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function renderCallResult(result: unknown, parsed: CallArgsParseResult): void {
|
|
155
|
+
const { callResult: wrapped } = wrapCallResult(result);
|
|
156
|
+
printCallOutput(wrapped, result, parsed.output);
|
|
157
|
+
saveCallImagesIfRequested(wrapped, parsed.saveImagesDir);
|
|
158
|
+
tailLogIfRequested(result, parsed.tailLog);
|
|
159
|
+
dumpActiveHandles('after call (formatted result)');
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export function printCallHelp(): void {
|
|
163
|
+
const lines = [
|
|
164
|
+
'Usage: mcporter call <server.tool | url> [arguments] [flags]',
|
|
165
|
+
'',
|
|
166
|
+
'Selectors:',
|
|
167
|
+
' server.tool Use a configured server and tool (e.g., linear.list_issues).',
|
|
168
|
+
' https://host/mcp.tool Call a tool by full HTTP URL (auto-registers ad-hoc).',
|
|
169
|
+
' --server <name> Override the server name.',
|
|
170
|
+
' --tool <name> Override the tool name.',
|
|
171
|
+
'',
|
|
172
|
+
'Arguments:',
|
|
173
|
+
' key=value / key:value Flag-style named arguments.',
|
|
174
|
+
' function-call syntax \'server.tool(arg: "value", other: 1)\'.',
|
|
175
|
+
' --args <json> Provide a JSON object payload.',
|
|
176
|
+
' positional values Accepted when schema order is known.',
|
|
177
|
+
'',
|
|
178
|
+
'Runtime flags:',
|
|
179
|
+
' --timeout <ms> Override the call timeout.',
|
|
180
|
+
' --output text|markdown|json|raw Control formatting.',
|
|
181
|
+
' --save-images <dir> Save image content blocks to a directory.',
|
|
182
|
+
' --raw-strings Keep numeric-looking argument values as strings.',
|
|
183
|
+
' --no-coerce Keep all key/value and positional arguments as raw strings.',
|
|
184
|
+
' --tail-log Stream returned log handles.',
|
|
185
|
+
'',
|
|
186
|
+
'Ad-hoc servers:',
|
|
187
|
+
' --http-url <url> Register an HTTP server for this run.',
|
|
188
|
+
' --allow-http Permit plain http:// URLs with --http-url.',
|
|
189
|
+
' --stdio <command> Run a stdio MCP server (repeat --stdio-arg for args).',
|
|
190
|
+
' --stdio-arg <value> Append args to the stdio command (repeatable).',
|
|
191
|
+
' --env KEY=value Inject env vars for stdio servers (repeatable).',
|
|
192
|
+
' --cwd <path> Working directory for stdio servers.',
|
|
193
|
+
' --name <value> Override the display name for ad-hoc servers.',
|
|
194
|
+
' --description <text> Override the description for ad-hoc servers.',
|
|
195
|
+
' --persist <path> Write the ad-hoc definition to config/mcporter.json.',
|
|
196
|
+
' --yes Skip confirmation prompts when persisting.',
|
|
197
|
+
'',
|
|
198
|
+
'Examples:',
|
|
199
|
+
' mcporter call linear.list_issues team=ENG limit:5',
|
|
200
|
+
' mcporter call "linear.create_issue(title: \\"Bug\\", team: \\"ENG\\")"',
|
|
201
|
+
' mcporter call https://api.example.com/mcp.fetch url:https://example.com',
|
|
202
|
+
' mcporter call --stdio "bun run ./server.ts" scrape url=https://example.com',
|
|
203
|
+
];
|
|
204
|
+
console.error(lines.join('\n'));
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
async function maybeDescribeServer(
|
|
208
|
+
runtime: Awaited<ReturnType<typeof import('../runtime.js')['createRuntime']>>,
|
|
209
|
+
server: string,
|
|
210
|
+
tool: string,
|
|
211
|
+
outputFormat: OutputFormat
|
|
212
|
+
): Promise<boolean> {
|
|
213
|
+
if (tool === 'list_tools') {
|
|
214
|
+
console.log(dimText(`[mcporter] ${server}.list_tools is a shortcut for 'mcporter list ${server}'.`));
|
|
215
|
+
const listArgs = [server];
|
|
216
|
+
if (outputFormat === 'json') {
|
|
217
|
+
listArgs.push('--json');
|
|
218
|
+
}
|
|
219
|
+
await handleList(runtime, listArgs);
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
if (tool !== 'help') {
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
const tools = await runtime.listTools(server, { includeSchema: false, autoAuthorize: false }).catch(() => undefined);
|
|
226
|
+
if (!tools) {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
const hasHelpTool = tools.some((entry) => entry.name === 'help');
|
|
230
|
+
if (hasHelpTool) {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
console.log(dimText(`[mcporter] ${server} does not expose a 'help' tool; showing mcporter list output instead.`));
|
|
234
|
+
const listArgs = [server];
|
|
235
|
+
if (outputFormat === 'json') {
|
|
236
|
+
listArgs.push('--json');
|
|
237
|
+
}
|
|
238
|
+
await handleList(runtime, listArgs);
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
interface ResolveCallTargetOptions {
|
|
243
|
+
allowMissingTool?: boolean;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function resolveCallTarget(
|
|
247
|
+
parsed: CallArgsParseResult,
|
|
248
|
+
options: ResolveCallTargetOptions = {}
|
|
249
|
+
): { server?: string; tool?: string } {
|
|
250
|
+
const selector = parsed.selector;
|
|
251
|
+
let server = parsed.server;
|
|
252
|
+
let tool = parsed.tool;
|
|
253
|
+
|
|
254
|
+
if (selector && !server && selector.includes('.')) {
|
|
255
|
+
const [left, right] = selector.split('.', 2);
|
|
256
|
+
server = left;
|
|
257
|
+
tool = right;
|
|
258
|
+
} else if (selector && !server) {
|
|
259
|
+
server = selector;
|
|
260
|
+
} else if (selector && !tool && selector !== server) {
|
|
261
|
+
tool = selector;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
if (!server) {
|
|
265
|
+
throw new Error('Missing server name. Provide it via <server>.<tool> or --server.');
|
|
266
|
+
}
|
|
267
|
+
if (!tool && !options.allowMissingTool) {
|
|
268
|
+
throw new Error('Missing tool name. Provide it via <server>.<tool> or --tool.');
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
return { server, tool };
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
async function hydratePositionalArguments(
|
|
275
|
+
runtime: Awaited<ReturnType<typeof import('../runtime.js')['createRuntime']>>,
|
|
276
|
+
server: string,
|
|
277
|
+
tool: string,
|
|
278
|
+
namedArgs: Record<string, unknown>,
|
|
279
|
+
positionalArgs: unknown[] | undefined
|
|
280
|
+
): Promise<Record<string, unknown>> {
|
|
281
|
+
if (!positionalArgs || positionalArgs.length === 0) {
|
|
282
|
+
return namedArgs;
|
|
283
|
+
}
|
|
284
|
+
// We need the schema order to know which field each positional argument maps to; pull the
|
|
285
|
+
// tool list with schemas instead of guessing locally so optional/required order stays correct.
|
|
286
|
+
const tools = await loadToolMetadata(runtime, server, { includeSchema: true }).catch(() => undefined);
|
|
287
|
+
if (!tools) {
|
|
288
|
+
throw new Error('Unable to load tool metadata; name positional arguments explicitly.');
|
|
289
|
+
}
|
|
290
|
+
const toolInfo = tools.find((entry) => entry.tool.name === tool);
|
|
291
|
+
if (!toolInfo) {
|
|
292
|
+
throw new Error(
|
|
293
|
+
`Unknown tool '${tool}' on server '${server}'. Double-check the name or run mcporter list ${server}.`
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
if (!toolInfo.tool.inputSchema) {
|
|
297
|
+
throw new Error(`Tool '${tool}' does not expose an input schema; name positional arguments explicitly.`);
|
|
298
|
+
}
|
|
299
|
+
const options = toolInfo.options;
|
|
300
|
+
if (options.length === 0) {
|
|
301
|
+
throw new Error(`Tool '${tool}' has no declared parameters; remove positional arguments.`);
|
|
302
|
+
}
|
|
303
|
+
// Respect whichever parameters the user already supplied by name so positional values only
|
|
304
|
+
// populate the fields that are still unset.
|
|
305
|
+
const remaining = options.filter((option) => !(option.property in namedArgs));
|
|
306
|
+
if (positionalArgs.length > remaining.length) {
|
|
307
|
+
throw new Error(
|
|
308
|
+
`Too many positional arguments (${positionalArgs.length}) supplied; only ${remaining.length} parameter${remaining.length === 1 ? '' : 's'} remain on ${tool}.`
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
const hydrated: Record<string, unknown> = { ...namedArgs };
|
|
312
|
+
positionalArgs.forEach((value, index) => {
|
|
313
|
+
const target = remaining[index];
|
|
314
|
+
if (!target) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
hydrated[target.property] = value;
|
|
318
|
+
});
|
|
319
|
+
return hydrated;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
type ToolResolution = IdentifierResolution;
|
|
323
|
+
|
|
324
|
+
async function inferSingleToolName(
|
|
325
|
+
runtime: Awaited<ReturnType<typeof import('../runtime.js')['createRuntime']>>,
|
|
326
|
+
server: string
|
|
327
|
+
): Promise<string | undefined> {
|
|
328
|
+
const tools = await loadToolMetadata(runtime, server, { includeSchema: false });
|
|
329
|
+
if (tools.length !== 1) {
|
|
330
|
+
return undefined;
|
|
331
|
+
}
|
|
332
|
+
const name = tools[0]?.tool.name;
|
|
333
|
+
if (!name) {
|
|
334
|
+
return undefined;
|
|
335
|
+
}
|
|
336
|
+
console.log(dimText(`[auto] ${server} exposes a single tool (${name}); using it.`));
|
|
337
|
+
return name;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
async function invokeWithAutoCorrection(
|
|
341
|
+
runtime: Awaited<ReturnType<typeof import('../runtime.js')['createRuntime']>>,
|
|
342
|
+
server: string,
|
|
343
|
+
tool: string,
|
|
344
|
+
args: Record<string, unknown>,
|
|
345
|
+
timeoutMs: number
|
|
346
|
+
): Promise<{ result: unknown; resolvedTool: string }> {
|
|
347
|
+
// Attempt the original request first; if it fails with a "tool not found" we opportunistically retry once with a better match.
|
|
348
|
+
return attemptCall(runtime, server, tool, args, timeoutMs, true);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
async function attemptCall(
|
|
352
|
+
runtime: Awaited<ReturnType<typeof import('../runtime.js')['createRuntime']>>,
|
|
353
|
+
server: string,
|
|
354
|
+
tool: string,
|
|
355
|
+
args: Record<string, unknown>,
|
|
356
|
+
timeoutMs: number,
|
|
357
|
+
allowCorrection: boolean
|
|
358
|
+
): Promise<{ result: unknown; resolvedTool: string }> {
|
|
359
|
+
try {
|
|
360
|
+
const result = await withTimeout(runtime.callTool(server, tool, { args, timeoutMs }), timeoutMs);
|
|
361
|
+
return { result, resolvedTool: tool };
|
|
362
|
+
} catch (error) {
|
|
363
|
+
if (error instanceof Error && error.message === 'Timeout') {
|
|
364
|
+
const timeoutDisplay = `${timeoutMs}ms`;
|
|
365
|
+
await runtime.close(server).catch(() => {});
|
|
366
|
+
throw new Error(
|
|
367
|
+
`Call to ${server}.${tool} timed out after ${timeoutDisplay}. Override MCPORTER_CALL_TIMEOUT or pass --timeout to adjust.`
|
|
368
|
+
);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
if (!allowCorrection) {
|
|
372
|
+
throw error;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
const resolution = await maybeResolveToolName(runtime, server, tool, error);
|
|
376
|
+
if (!resolution) {
|
|
377
|
+
maybeReportConnectionIssue(server, tool, error);
|
|
378
|
+
throw error;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
const messages = renderIdentifierResolutionMessages({
|
|
382
|
+
entity: 'tool',
|
|
383
|
+
attempted: tool,
|
|
384
|
+
resolution,
|
|
385
|
+
scope: server,
|
|
386
|
+
});
|
|
387
|
+
if (resolution.kind === 'suggest') {
|
|
388
|
+
if (messages.suggest) {
|
|
389
|
+
console.error(dimText(messages.suggest));
|
|
390
|
+
}
|
|
391
|
+
throw error;
|
|
392
|
+
}
|
|
393
|
+
if (messages.auto) {
|
|
394
|
+
console.log(dimText(messages.auto));
|
|
395
|
+
}
|
|
396
|
+
return attemptCall(runtime, server, resolution.value, args, timeoutMs, false);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
async function maybeResolveToolName(
|
|
401
|
+
runtime: Awaited<ReturnType<typeof import('../runtime.js')['createRuntime']>>,
|
|
402
|
+
server: string,
|
|
403
|
+
attemptedTool: string,
|
|
404
|
+
error: unknown
|
|
405
|
+
): Promise<ToolResolution | undefined> {
|
|
406
|
+
const missingName = extractMissingToolFromError(error);
|
|
407
|
+
if (!missingName) {
|
|
408
|
+
return undefined;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// Only attempt a suggestion if the server explicitly rejected the tool we tried.
|
|
412
|
+
if (normalizeIdentifier(missingName) !== normalizeIdentifier(attemptedTool)) {
|
|
413
|
+
return undefined;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
const tools = await loadToolMetadata(runtime, server, { includeSchema: false }).catch(() => undefined);
|
|
417
|
+
if (!tools) {
|
|
418
|
+
return undefined;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
const resolution = chooseClosestIdentifier(
|
|
422
|
+
attemptedTool,
|
|
423
|
+
tools.map((entry) => entry.tool.name)
|
|
424
|
+
);
|
|
425
|
+
if (!resolution) {
|
|
426
|
+
return undefined;
|
|
427
|
+
}
|
|
428
|
+
return resolution;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
function extractMissingToolFromError(error: unknown): string | undefined {
|
|
432
|
+
const message = error instanceof Error ? error.message : typeof error === 'string' ? error : undefined;
|
|
433
|
+
if (!message) {
|
|
434
|
+
return undefined;
|
|
435
|
+
}
|
|
436
|
+
const match = message.match(/Tool\s+([A-Za-z0-9._-]+)\s+not found/i);
|
|
437
|
+
return match?.[1];
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
function maybeReportConnectionIssue(server: string, tool: string, error: unknown): ConnectionIssue | undefined {
|
|
441
|
+
const issue = analyzeConnectionError(error);
|
|
442
|
+
const detail = summarizeIssueMessage(issue.rawMessage);
|
|
443
|
+
if (issue.kind === 'auth') {
|
|
444
|
+
const authCommand = `mcporter auth ${server}`;
|
|
445
|
+
const hint = `[mcporter] Authorization required for ${server}. Run '${authCommand}'.${detail ? ` (${detail})` : ''}`;
|
|
446
|
+
console.error(yellowText(hint));
|
|
447
|
+
return issue;
|
|
448
|
+
}
|
|
449
|
+
if (issue.kind === 'offline') {
|
|
450
|
+
const hint = `[mcporter] ${server} appears offline${detail ? ` (${detail})` : ''}.`;
|
|
451
|
+
console.error(redText(hint));
|
|
452
|
+
return issue;
|
|
453
|
+
}
|
|
454
|
+
if (issue.kind === 'http') {
|
|
455
|
+
const status = issue.statusCode ? `HTTP ${issue.statusCode}` : 'an HTTP error';
|
|
456
|
+
const hint = `[mcporter] ${server}.${tool} responded with ${status}${detail ? ` (${detail})` : ''}.`;
|
|
457
|
+
console.error(dimText(hint));
|
|
458
|
+
return issue;
|
|
459
|
+
}
|
|
460
|
+
if (issue.kind === 'stdio-exit') {
|
|
461
|
+
const exit = typeof issue.stdioExitCode === 'number' ? `code ${issue.stdioExitCode}` : 'an unknown status';
|
|
462
|
+
const signal = issue.stdioSignal ? ` (signal ${issue.stdioSignal})` : '';
|
|
463
|
+
const hint = `[mcporter] STDIO server for ${server} exited with ${exit}${signal}.`;
|
|
464
|
+
console.error(redText(hint));
|
|
465
|
+
}
|
|
466
|
+
return issue;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
function summarizeIssueMessage(message: string): string {
|
|
470
|
+
if (!message) {
|
|
471
|
+
return '';
|
|
472
|
+
}
|
|
473
|
+
const trimmed = message.trim();
|
|
474
|
+
if (trimmed.length <= 120) {
|
|
475
|
+
return trimmed;
|
|
476
|
+
}
|
|
477
|
+
return `${trimmed.slice(0, 117)}…`;
|
|
478
|
+
}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { parseExpressionAt } from 'acorn';
|
|
2
|
+
import type {
|
|
3
|
+
ArrayExpression,
|
|
4
|
+
CallExpression,
|
|
5
|
+
Expression,
|
|
6
|
+
Literal,
|
|
7
|
+
ObjectExpression,
|
|
8
|
+
Property,
|
|
9
|
+
UnaryExpression,
|
|
10
|
+
} from 'estree';
|
|
11
|
+
|
|
12
|
+
interface ParsedCallExpression {
|
|
13
|
+
server?: string;
|
|
14
|
+
tool: string;
|
|
15
|
+
args: Record<string, unknown>;
|
|
16
|
+
positionalArgs?: unknown[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const ACORN_OPTIONS = {
|
|
20
|
+
ecmaVersion: 'latest' as const,
|
|
21
|
+
sourceType: 'module' as const,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export function parseCallExpressionFragment(raw: string): ParsedCallExpression | null {
|
|
25
|
+
const trimmed = raw.trim();
|
|
26
|
+
const openParen = trimmed.indexOf('(');
|
|
27
|
+
if (openParen === -1 || !trimmed.endsWith(')')) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const prefix = trimmed.slice(0, openParen).trim();
|
|
32
|
+
if (!prefix) {
|
|
33
|
+
throw new Error('Expected a tool name before the argument list.');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const argsPortion = trimmed.slice(openParen + 1, -1);
|
|
37
|
+
const trimmedArgs = argsPortion.trim();
|
|
38
|
+
const attempts = buildParseAttempts(trimmedArgs);
|
|
39
|
+
let callExpression: CallExpression | undefined;
|
|
40
|
+
let parseError: Error | undefined;
|
|
41
|
+
|
|
42
|
+
for (const candidate of attempts) {
|
|
43
|
+
try {
|
|
44
|
+
const expression = parseExpressionAt(`__call${candidate}`, 0, ACORN_OPTIONS);
|
|
45
|
+
if (expression.type === 'CallExpression') {
|
|
46
|
+
callExpression = expression as CallExpression;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
} catch (error) {
|
|
50
|
+
parseError = error instanceof Error ? error : new Error(String(error));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (!callExpression) {
|
|
55
|
+
const message = parseError?.message ?? 'Unexpected token';
|
|
56
|
+
throw new Error(`Unable to parse call expression: ${message}`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (callExpression.arguments.length === 0) {
|
|
60
|
+
return {
|
|
61
|
+
...splitPrefix(prefix),
|
|
62
|
+
args: {},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (callExpression.arguments.length === 1 && callExpression.arguments[0]?.type === 'ObjectExpression') {
|
|
67
|
+
const argument = callExpression.arguments[0];
|
|
68
|
+
if (!argument || argument.type !== 'ObjectExpression') {
|
|
69
|
+
throw new Error('Function-call syntax requires named arguments (e.g. issueId: 123).');
|
|
70
|
+
}
|
|
71
|
+
const args = extractObject(argument);
|
|
72
|
+
return { ...splitPrefix(prefix), args };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// At this point we know the call expression isn't a plain object literal, so we interpret
|
|
76
|
+
// whatever arguments remain positionally. We still reuse the literal extractor so nested
|
|
77
|
+
// arrays/objects stay supported.
|
|
78
|
+
const positionalArgs = callExpression.arguments.map((argument) => {
|
|
79
|
+
if (!argument) {
|
|
80
|
+
throw new Error('Unsupported empty argument in call expression.');
|
|
81
|
+
}
|
|
82
|
+
if (argument.type === 'SpreadElement') {
|
|
83
|
+
throw new Error('Spread elements are not supported in call expressions.');
|
|
84
|
+
}
|
|
85
|
+
if (!isSupportedValue(argument as Expression)) {
|
|
86
|
+
throw new Error(`Unsupported argument expression: ${argument.type}.`);
|
|
87
|
+
}
|
|
88
|
+
return extractValue(argument as Expression);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
return { ...splitPrefix(prefix), args: {}, positionalArgs };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function splitPrefix(prefix: string): { server?: string; tool: string } {
|
|
95
|
+
const [first, ...rest] = prefix.split('.');
|
|
96
|
+
if (!first) {
|
|
97
|
+
throw new Error('Expected a tool name before the argument list.');
|
|
98
|
+
}
|
|
99
|
+
if (rest.length === 0) {
|
|
100
|
+
return { tool: first };
|
|
101
|
+
}
|
|
102
|
+
return { server: first, tool: rest.join('.') };
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function extractObject(expression: ObjectExpression): Record<string, unknown> {
|
|
106
|
+
const result: Record<string, unknown> = {};
|
|
107
|
+
for (const property of expression.properties) {
|
|
108
|
+
if (property.type !== 'Property') {
|
|
109
|
+
throw new Error('Unsupported property type in call expression.');
|
|
110
|
+
}
|
|
111
|
+
if (property.kind !== 'init') {
|
|
112
|
+
throw new Error('Only simple assignments are supported in call expressions.');
|
|
113
|
+
}
|
|
114
|
+
if (property.computed) {
|
|
115
|
+
throw new Error('Computed property names are not supported in call expressions.');
|
|
116
|
+
}
|
|
117
|
+
const key = extractKey(property);
|
|
118
|
+
const rawValue = property.value;
|
|
119
|
+
if (!rawValue || !isSupportedValue(rawValue)) {
|
|
120
|
+
throw new Error(`Unsupported argument expression: ${rawValue ? rawValue.type : 'null'}.`);
|
|
121
|
+
}
|
|
122
|
+
const value = extractValue(rawValue);
|
|
123
|
+
result[key] = value;
|
|
124
|
+
}
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function extractKey(property: Property): string {
|
|
129
|
+
if (property.key.type === 'Identifier') {
|
|
130
|
+
return property.key.name;
|
|
131
|
+
}
|
|
132
|
+
if (property.key.type === 'Literal' && typeof property.key.value === 'string') {
|
|
133
|
+
return property.key.value;
|
|
134
|
+
}
|
|
135
|
+
throw new Error('Invalid argument name in call expression.');
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function extractValue(value: Expression): unknown {
|
|
139
|
+
switch (value.type) {
|
|
140
|
+
case 'Literal':
|
|
141
|
+
return (value as Literal).value ?? null;
|
|
142
|
+
case 'ArrayExpression':
|
|
143
|
+
return extractArray(value as ArrayExpression);
|
|
144
|
+
case 'ObjectExpression':
|
|
145
|
+
return extractObject(value as ObjectExpression);
|
|
146
|
+
case 'UnaryExpression':
|
|
147
|
+
return extractUnary(value as UnaryExpression);
|
|
148
|
+
default:
|
|
149
|
+
throw new Error(`Unsupported argument expression: ${value.type}.`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function extractArray(arrayExpression: ArrayExpression): unknown[] {
|
|
154
|
+
return arrayExpression.elements.map((element, index) => {
|
|
155
|
+
if (!element) {
|
|
156
|
+
throw new Error(`Sparse array entries are not supported (index ${index}).`);
|
|
157
|
+
}
|
|
158
|
+
if (element.type === 'SpreadElement') {
|
|
159
|
+
throw new Error('Spread elements are not supported in call expressions.');
|
|
160
|
+
}
|
|
161
|
+
const elementType = (element as { type?: string }).type ?? 'unknown';
|
|
162
|
+
if (!isSupportedValue(element)) {
|
|
163
|
+
throw new Error(`Unsupported argument expression: ${elementType}.`);
|
|
164
|
+
}
|
|
165
|
+
return extractValue(element as Expression);
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function extractUnary(expression: UnaryExpression): unknown {
|
|
170
|
+
if (expression.operator === '-' || expression.operator === '+') {
|
|
171
|
+
const inner = expression.argument;
|
|
172
|
+
if (inner.type !== 'Literal' || typeof (inner as Literal).value !== 'number') {
|
|
173
|
+
throw new Error('Unary operators are only supported for numeric literals.');
|
|
174
|
+
}
|
|
175
|
+
const numericValue = Number((inner as Literal).value);
|
|
176
|
+
return expression.operator === '-' ? -numericValue : numericValue;
|
|
177
|
+
}
|
|
178
|
+
if (expression.operator === '!') {
|
|
179
|
+
const inner = expression.argument;
|
|
180
|
+
if (inner.type !== 'Literal' || typeof (inner as Literal).value !== 'boolean') {
|
|
181
|
+
throw new Error('Logical negation is only supported for boolean literals.');
|
|
182
|
+
}
|
|
183
|
+
return !(inner as Literal).value;
|
|
184
|
+
}
|
|
185
|
+
throw new Error(`Unsupported unary operator: ${expression.operator}`);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function buildParseAttempts(trimmedArgs: string): string[] {
|
|
189
|
+
if (trimmedArgs === '') {
|
|
190
|
+
return ['()'];
|
|
191
|
+
}
|
|
192
|
+
const attempts: string[] = [`(${trimmedArgs})`];
|
|
193
|
+
const needsObjectWrap =
|
|
194
|
+
!trimmedArgs.startsWith('{') &&
|
|
195
|
+
!trimmedArgs.startsWith('({') &&
|
|
196
|
+
!trimmedArgs.startsWith('[') &&
|
|
197
|
+
/[A-Za-z0-9_]\s*:/.test(trimmedArgs);
|
|
198
|
+
if (needsObjectWrap) {
|
|
199
|
+
attempts.push(`({${trimmedArgs}})`);
|
|
200
|
+
}
|
|
201
|
+
return attempts;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function isSupportedValue(node: unknown): node is Expression {
|
|
205
|
+
if (!node || typeof node !== 'object' || !('type' in node)) {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
const type = (node as { type: string }).type;
|
|
209
|
+
return type === 'Literal' || type === 'ArrayExpression' || type === 'ObjectExpression' || type === 'UnaryExpression';
|
|
210
|
+
}
|