@akon-labs/nexus-cli 0.1.9 → 0.1.11-rc.2
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/CHANGELOG.md +21 -0
- package/LICENSE +1 -0
- package/README.md +3 -2
- package/dist/app-bridge.bundle.js +67 -0
- package/dist/cli/require-login.d.ts.map +1 -1
- package/dist/cli/require-login.js +2 -2
- package/dist/cli/require-login.js.map +1 -1
- package/dist/cli.js +20866 -1882
- package/dist/core/agent-session.d.ts +3 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +5 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auto-model.d.ts +1 -1
- package/dist/core/auto-model.d.ts.map +1 -1
- package/dist/core/auto-model.js +1 -1
- package/dist/core/auto-model.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +6 -0
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +7 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +14 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +18 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/model-resolver.d.ts +2 -2
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +3 -3
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/package-manager.d.ts +15 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +50 -0
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +1 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +3 -3
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +5 -5
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/websearch.d.ts.map +1 -1
- package/dist/core/tools/websearch.js +3 -3
- package/dist/core/tools/websearch.js.map +1 -1
- package/dist/extensions/gitnexus/config.d.ts +15 -1
- package/dist/extensions/gitnexus/config.d.ts.map +1 -1
- package/dist/extensions/gitnexus/config.js +86 -2
- package/dist/extensions/gitnexus/config.js.map +1 -1
- package/dist/extensions/gitnexus/gateway.d.ts +6 -6
- package/dist/extensions/gitnexus/gateway.d.ts.map +1 -1
- package/dist/extensions/gitnexus/gateway.js +4 -4
- package/dist/extensions/gitnexus/gateway.js.map +1 -1
- package/dist/extensions/gitnexus/index.d.ts.map +1 -1
- package/dist/extensions/gitnexus/index.js +6 -4
- package/dist/extensions/gitnexus/index.js.map +1 -1
- package/dist/extensions/gitnexus/observatory.d.ts.map +1 -1
- package/dist/extensions/gitnexus/observatory.js +2 -2
- package/dist/extensions/gitnexus/observatory.js.map +1 -1
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +3 -0
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/mcp/abort.d.ts +3 -0
- package/dist/extensions/mcp/abort.d.ts.map +1 -0
- package/dist/extensions/mcp/abort.js +41 -0
- package/dist/extensions/mcp/abort.js.map +1 -0
- package/dist/extensions/mcp/agent-dir.d.ts +6 -0
- package/dist/extensions/mcp/agent-dir.d.ts.map +1 -0
- package/dist/extensions/mcp/agent-dir.js +18 -0
- package/dist/extensions/mcp/agent-dir.js.map +1 -0
- package/dist/extensions/mcp/agent-plugin-loader.d.ts +9 -0
- package/dist/extensions/mcp/agent-plugin-loader.d.ts.map +1 -0
- package/dist/extensions/mcp/agent-plugin-loader.js +384 -0
- package/dist/extensions/mcp/agent-plugin-loader.js.map +1 -0
- package/dist/extensions/mcp/app-bridge.bundle.js +67 -0
- package/dist/extensions/mcp/commands.d.ts +47 -0
- package/dist/extensions/mcp/commands.d.ts.map +1 -0
- package/dist/extensions/mcp/commands.js +821 -0
- package/dist/extensions/mcp/commands.js.map +1 -0
- package/dist/extensions/mcp/config.d.ts +123 -38
- package/dist/extensions/mcp/config.d.ts.map +1 -1
- package/dist/extensions/mcp/config.js +1035 -70
- package/dist/extensions/mcp/config.js.map +1 -1
- package/dist/extensions/mcp/consent-manager.d.ts +14 -0
- package/dist/extensions/mcp/consent-manager.d.ts.map +1 -0
- package/dist/extensions/mcp/consent-manager.js +60 -0
- package/dist/extensions/mcp/consent-manager.js.map +1 -0
- package/dist/extensions/mcp/direct-tools.d.ts +11 -0
- package/dist/extensions/mcp/direct-tools.d.ts.map +1 -0
- package/dist/extensions/mcp/direct-tools.js +562 -0
- package/dist/extensions/mcp/direct-tools.js.map +1 -0
- package/dist/extensions/mcp/elicitation-handler.d.ts +18 -0
- package/dist/extensions/mcp/elicitation-handler.d.ts.map +1 -0
- package/dist/extensions/mcp/elicitation-handler.js +320 -0
- package/dist/extensions/mcp/elicitation-handler.js.map +1 -0
- package/dist/extensions/mcp/error-signal.d.ts +16 -0
- package/dist/extensions/mcp/error-signal.d.ts.map +1 -0
- package/dist/extensions/mcp/error-signal.js +22 -0
- package/dist/extensions/mcp/error-signal.js.map +1 -0
- package/dist/extensions/mcp/errors.d.ts +104 -0
- package/dist/extensions/mcp/errors.d.ts.map +1 -0
- package/dist/extensions/mcp/errors.js +171 -0
- package/dist/extensions/mcp/errors.js.map +1 -0
- package/dist/extensions/mcp/glimpse-ui.d.ts +10 -0
- package/dist/extensions/mcp/glimpse-ui.d.ts.map +1 -0
- package/dist/extensions/mcp/glimpse-ui.js +67 -0
- package/dist/extensions/mcp/glimpse-ui.js.map +1 -0
- package/dist/extensions/mcp/host-html-template.d.ts +17 -0
- package/dist/extensions/mcp/host-html-template.d.ts.map +1 -0
- package/dist/extensions/mcp/host-html-template.js +442 -0
- package/dist/extensions/mcp/host-html-template.js.map +1 -0
- package/dist/extensions/mcp/index.d.ts +20 -15
- package/dist/extensions/mcp/index.d.ts.map +1 -1
- package/dist/extensions/mcp/index.js +1113 -82
- package/dist/extensions/mcp/index.js.map +1 -1
- package/dist/extensions/mcp/init.d.ts +28 -0
- package/dist/extensions/mcp/init.d.ts.map +1 -0
- package/dist/extensions/mcp/init.js +631 -0
- package/dist/extensions/mcp/init.js.map +1 -0
- package/dist/extensions/mcp/json-schema-validator.d.ts +3 -0
- package/dist/extensions/mcp/json-schema-validator.d.ts.map +1 -0
- package/dist/extensions/mcp/json-schema-validator.js +53 -0
- package/dist/extensions/mcp/json-schema-validator.js.map +1 -0
- package/dist/extensions/mcp/lifecycle.d.ts +56 -0
- package/dist/extensions/mcp/lifecycle.d.ts.map +1 -0
- package/dist/extensions/mcp/lifecycle.js +395 -0
- package/dist/extensions/mcp/lifecycle.js.map +1 -0
- package/dist/extensions/mcp/logger.d.ts +52 -0
- package/dist/extensions/mcp/logger.d.ts.map +1 -0
- package/dist/extensions/mcp/logger.js +134 -0
- package/dist/extensions/mcp/logger.js.map +1 -0
- package/dist/extensions/mcp/mcp-auth-flow.d.ts +117 -0
- package/dist/extensions/mcp/mcp-auth-flow.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-auth-flow.js +869 -0
- package/dist/extensions/mcp/mcp-auth-flow.js.map +1 -0
- package/dist/extensions/mcp/mcp-auth.d.ts +162 -0
- package/dist/extensions/mcp/mcp-auth.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-auth.js +897 -0
- package/dist/extensions/mcp/mcp-auth.js.map +1 -0
- package/dist/extensions/mcp/mcp-bearer-store.d.ts +25 -0
- package/dist/extensions/mcp/mcp-bearer-store.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-bearer-store.js +350 -0
- package/dist/extensions/mcp/mcp-bearer-store.js.map +1 -0
- package/dist/extensions/mcp/mcp-callback-server.d.ts +54 -0
- package/dist/extensions/mcp/mcp-callback-server.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-callback-server.js +454 -0
- package/dist/extensions/mcp/mcp-callback-server.js.map +1 -0
- package/dist/extensions/mcp/mcp-code.d.ts +48 -0
- package/dist/extensions/mcp/mcp-code.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-code.js +358 -0
- package/dist/extensions/mcp/mcp-code.js.map +1 -0
- package/dist/extensions/mcp/mcp-keyring-helper.cjs +89 -0
- package/dist/extensions/mcp/mcp-oauth-provider.d.ts +135 -0
- package/dist/extensions/mcp/mcp-oauth-provider.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-oauth-provider.js +491 -0
- package/dist/extensions/mcp/mcp-oauth-provider.js.map +1 -0
- package/dist/extensions/mcp/mcp-output-guard.d.ts +59 -0
- package/dist/extensions/mcp/mcp-output-guard.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-output-guard.js +343 -0
- package/dist/extensions/mcp/mcp-output-guard.js.map +1 -0
- package/dist/extensions/mcp/mcp-panel.d.ts +71 -0
- package/dist/extensions/mcp/mcp-panel.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-panel.js +973 -0
- package/dist/extensions/mcp/mcp-panel.js.map +1 -0
- package/dist/extensions/mcp/mcp-probe.d.ts +7 -0
- package/dist/extensions/mcp/mcp-probe.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-probe.js +155 -0
- package/dist/extensions/mcp/mcp-probe.js.map +1 -0
- package/dist/extensions/mcp/mcp-script-worker.mjs +130 -0
- package/dist/extensions/mcp/mcp-setup-panel.d.ts +146 -0
- package/dist/extensions/mcp/mcp-setup-panel.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-setup-panel.js +1104 -0
- package/dist/extensions/mcp/mcp-setup-panel.js.map +1 -0
- package/dist/extensions/mcp/mcp-status.d.ts +12 -0
- package/dist/extensions/mcp/mcp-status.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-status.js +98 -0
- package/dist/extensions/mcp/mcp-status.js.map +1 -0
- package/dist/extensions/mcp/mcp-trace.d.ts +95 -0
- package/dist/extensions/mcp/mcp-trace.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-trace.js +252 -0
- package/dist/extensions/mcp/mcp-trace.js.map +1 -0
- package/dist/extensions/mcp/metadata-cache.d.ts +20 -0
- package/dist/extensions/mcp/metadata-cache.d.ts.map +1 -0
- package/dist/extensions/mcp/metadata-cache.js +318 -0
- package/dist/extensions/mcp/metadata-cache.js.map +1 -0
- package/dist/extensions/mcp/npx-resolver.d.ts +7 -0
- package/dist/extensions/mcp/npx-resolver.d.ts.map +1 -0
- package/dist/extensions/mcp/npx-resolver.js +505 -0
- package/dist/extensions/mcp/npx-resolver.js.map +1 -0
- package/dist/extensions/mcp/oauth.d.ts +21 -0
- package/dist/extensions/mcp/oauth.d.ts.map +1 -0
- package/dist/extensions/mcp/oauth.js +15 -0
- package/dist/extensions/mcp/oauth.js.map +1 -0
- package/dist/extensions/mcp/onboarding-state.d.ts +13 -0
- package/dist/extensions/mcp/onboarding-state.d.ts.map +1 -0
- package/dist/extensions/mcp/onboarding-state.js +65 -0
- package/dist/extensions/mcp/onboarding-state.js.map +1 -0
- package/dist/extensions/mcp/package-mcp-loader.d.ts +3 -0
- package/dist/extensions/mcp/package-mcp-loader.d.ts.map +1 -0
- package/dist/extensions/mcp/package-mcp-loader.js +170 -0
- package/dist/extensions/mcp/package-mcp-loader.js.map +1 -0
- package/dist/extensions/mcp/panel-keys.d.ts +21 -0
- package/dist/extensions/mcp/panel-keys.d.ts.map +1 -0
- package/dist/extensions/mcp/panel-keys.js +29 -0
- package/dist/extensions/mcp/panel-keys.js.map +1 -0
- package/dist/extensions/mcp/prompts.d.ts +63 -0
- package/dist/extensions/mcp/prompts.d.ts.map +1 -0
- package/dist/extensions/mcp/prompts.js +297 -0
- package/dist/extensions/mcp/prompts.js.map +1 -0
- package/dist/extensions/mcp/proxy-modes.d.ts +15 -0
- package/dist/extensions/mcp/proxy-modes.d.ts.map +1 -0
- package/dist/extensions/mcp/proxy-modes.js +1421 -0
- package/dist/extensions/mcp/proxy-modes.js.map +1 -0
- package/dist/extensions/mcp/request-headers-command.d.ts +11 -0
- package/dist/extensions/mcp/request-headers-command.d.ts.map +1 -0
- package/dist/extensions/mcp/request-headers-command.js +334 -0
- package/dist/extensions/mcp/request-headers-command.js.map +1 -0
- package/dist/extensions/mcp/resource-tools.d.ts +2 -0
- package/dist/extensions/mcp/resource-tools.d.ts.map +1 -0
- package/dist/extensions/mcp/resource-tools.js +15 -0
- package/dist/extensions/mcp/resource-tools.js.map +1 -0
- package/dist/extensions/mcp/runtime-owner.d.ts +14 -0
- package/dist/extensions/mcp/runtime-owner.d.ts.map +1 -0
- package/dist/extensions/mcp/runtime-owner.js +84 -0
- package/dist/extensions/mcp/runtime-owner.js.map +1 -0
- package/dist/extensions/mcp/sampling-handler.d.ts +18 -0
- package/dist/extensions/mcp/sampling-handler.d.ts.map +1 -0
- package/dist/extensions/mcp/sampling-handler.js +229 -0
- package/dist/extensions/mcp/sampling-handler.js.map +1 -0
- package/dist/extensions/mcp/search-ranking.d.ts +25 -0
- package/dist/extensions/mcp/search-ranking.d.ts.map +1 -0
- package/dist/extensions/mcp/search-ranking.js +234 -0
- package/dist/extensions/mcp/search-ranking.js.map +1 -0
- package/dist/extensions/mcp/server-manager.d.ts +116 -0
- package/dist/extensions/mcp/server-manager.d.ts.map +1 -0
- package/dist/extensions/mcp/server-manager.js +1052 -0
- package/dist/extensions/mcp/server-manager.js.map +1 -0
- package/dist/extensions/mcp/session-recovery.d.ts +27 -0
- package/dist/extensions/mcp/session-recovery.d.ts.map +1 -0
- package/dist/extensions/mcp/session-recovery.js +140 -0
- package/dist/extensions/mcp/session-recovery.js.map +1 -0
- package/dist/extensions/mcp/skills/mcp-scripting/SKILL.md +38 -0
- package/dist/extensions/mcp/state.d.ts +62 -0
- package/dist/extensions/mcp/state.d.ts.map +1 -0
- package/dist/extensions/mcp/state.js +2 -0
- package/dist/extensions/mcp/state.js.map +1 -0
- package/dist/extensions/mcp/tool-approval.d.ts +11 -0
- package/dist/extensions/mcp/tool-approval.d.ts.map +1 -0
- package/dist/extensions/mcp/tool-approval.js +156 -0
- package/dist/extensions/mcp/tool-approval.js.map +1 -0
- package/dist/extensions/mcp/tool-metadata.d.ts +11 -0
- package/dist/extensions/mcp/tool-metadata.d.ts.map +1 -0
- package/dist/extensions/mcp/tool-metadata.js +264 -0
- package/dist/extensions/mcp/tool-metadata.js.map +1 -0
- package/dist/extensions/mcp/tool-registrar.d.ts +21 -0
- package/dist/extensions/mcp/tool-registrar.d.ts.map +1 -0
- package/dist/extensions/mcp/tool-registrar.js +229 -0
- package/dist/extensions/mcp/tool-registrar.js.map +1 -0
- package/dist/extensions/mcp/tool-result-renderer.d.ts +83 -0
- package/dist/extensions/mcp/tool-result-renderer.d.ts.map +1 -0
- package/dist/extensions/mcp/tool-result-renderer.js +345 -0
- package/dist/extensions/mcp/tool-result-renderer.js.map +1 -0
- package/dist/extensions/mcp/ts-shape.d.ts +3 -0
- package/dist/extensions/mcp/ts-shape.d.ts.map +1 -0
- package/dist/extensions/mcp/ts-shape.js +160 -0
- package/dist/extensions/mcp/ts-shape.js.map +1 -0
- package/dist/extensions/mcp/types.d.ts +521 -0
- package/dist/extensions/mcp/types.d.ts.map +1 -0
- package/dist/extensions/mcp/types.js +294 -0
- package/dist/extensions/mcp/types.js.map +1 -0
- package/dist/extensions/mcp/ui-app-bridge-helpers.d.ts +7 -0
- package/dist/extensions/mcp/ui-app-bridge-helpers.d.ts.map +1 -0
- package/dist/extensions/mcp/ui-app-bridge-helpers.js +37 -0
- package/dist/extensions/mcp/ui-app-bridge-helpers.js.map +1 -0
- package/dist/extensions/mcp/ui-resource-handler.d.ts +18 -0
- package/dist/extensions/mcp/ui-resource-handler.d.ts.map +1 -0
- package/dist/extensions/mcp/ui-resource-handler.js +210 -0
- package/dist/extensions/mcp/ui-resource-handler.js.map +1 -0
- package/dist/extensions/mcp/ui-server.d.ts +52 -0
- package/dist/extensions/mcp/ui-server.d.ts.map +1 -0
- package/dist/extensions/mcp/ui-server.js +740 -0
- package/dist/extensions/mcp/ui-server.js.map +1 -0
- package/dist/extensions/mcp/ui-session.d.ts +40 -0
- package/dist/extensions/mcp/ui-session.d.ts.map +1 -0
- package/dist/extensions/mcp/ui-session.js +477 -0
- package/dist/extensions/mcp/ui-session.js.map +1 -0
- package/dist/extensions/mcp/ui-stream-types.d.ts +105 -0
- package/dist/extensions/mcp/ui-stream-types.d.ts.map +1 -0
- package/dist/extensions/mcp/ui-stream-types.js +61 -0
- package/dist/extensions/mcp/ui-stream-types.js.map +1 -0
- package/dist/extensions/mcp/ui-tool-visibility.d.ts +5 -0
- package/dist/extensions/mcp/ui-tool-visibility.d.ts.map +1 -0
- package/dist/extensions/mcp/ui-tool-visibility.js +27 -0
- package/dist/extensions/mcp/ui-tool-visibility.js.map +1 -0
- package/dist/extensions/mcp/unix-socket-transport.d.ts +15 -0
- package/dist/extensions/mcp/unix-socket-transport.d.ts.map +1 -0
- package/dist/extensions/mcp/unix-socket-transport.js +85 -0
- package/dist/extensions/mcp/unix-socket-transport.js.map +1 -0
- package/dist/extensions/mcp/utils.d.ts +32 -0
- package/dist/extensions/mcp/utils.d.ts.map +1 -0
- package/dist/extensions/mcp/utils.js +336 -0
- package/dist/extensions/mcp/utils.js.map +1 -0
- package/dist/extensions/subagent/index.d.ts +62 -1
- package/dist/extensions/subagent/index.d.ts.map +1 -1
- package/dist/extensions/subagent/index.js +195 -9
- package/dist/extensions/subagent/index.js.map +1 -1
- package/dist/extensions/subagent-render.d.ts +3 -0
- package/dist/extensions/subagent-render.d.ts.map +1 -0
- package/dist/extensions/subagent-render.js +39 -0
- package/dist/extensions/subagent-render.js.map +1 -0
- package/dist/extensions/web-access.d.ts.map +1 -1
- package/dist/extensions/web-access.js +1 -1
- package/dist/extensions/web-access.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20992 -2003
- package/dist/index.js.map +1 -1
- package/dist/mcp-keyring-helper.cjs +89 -0
- package/dist/mcp-script-worker.mjs +130 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +1 -1
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/response-separator.d.ts +1 -1
- package/dist/modes/interactive/components/response-separator.d.ts.map +1 -1
- package/dist/modes/interactive/components/response-separator.js +1 -1
- package/dist/modes/interactive/components/response-separator.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +3 -2
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +12 -2
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +14 -8
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/rpc-entry.js +20866 -1882
- package/dist/skills/mcp-scripting/SKILL.md +38 -0
- package/dist/utils/hidden-spawn.d.ts +29 -0
- package/dist/utils/hidden-spawn.d.ts.map +1 -0
- package/dist/utils/hidden-spawn.js +101 -0
- package/dist/utils/hidden-spawn.js.map +1 -0
- package/dist/vendor/ai.js +110 -35
- package/docs/mcp.md +178 -0
- package/docs/pi-subagents.md +75 -0
- package/docs/quickstart.md +1 -1
- package/docs/usage.md +2 -1
- package/examples/extensions/pi-subagents-worker-policy.ts +86 -0
- package/native/win32/build.mjs +95 -0
- package/native/win32/prebuilds/win32-x64/hidden-spawn.exe +0 -0
- package/native/win32/src/hidden-spawn.c +157 -0
- package/npm-shrinkwrap.json +728 -6
- package/package.json +21 -6
- package/dist/extensions/mcp/client.d.ts +0 -86
- package/dist/extensions/mcp/client.d.ts.map +0 -1
- package/dist/extensions/mcp/client.js +0 -275
- package/dist/extensions/mcp/client.js.map +0 -1
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
// npx-resolver.ts - Resolve npx/npm exec binaries to avoid npm parent processes
|
|
2
|
+
import { closeSync, existsSync, mkdirSync, openSync, readdirSync, readFileSync, readSync, realpathSync, renameSync, statSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
3
|
+
import { dirname, extname, join, resolve, sep } from "node:path";
|
|
4
|
+
import crossSpawn from "cross-spawn";
|
|
5
|
+
import { throwIfAborted } from "./abort.js";
|
|
6
|
+
import { getAgentPath } from "./agent-dir.js";
|
|
7
|
+
const CACHE_VERSION = 2;
|
|
8
|
+
const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
9
|
+
const EXACT_PACKAGE_VERSION_RE = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z][0-9A-Za-z.-]*)?(?:\+[0-9A-Za-z][0-9A-Za-z.-]*)?$/;
|
|
10
|
+
export async function resolveNpxBinary(command, args, signal) {
|
|
11
|
+
throwIfAborted(signal);
|
|
12
|
+
const parsed = command === "npx" ? parseNpxArgs(args) : command === "npm" ? parseNpmExecArgs(args) : null;
|
|
13
|
+
if (!parsed)
|
|
14
|
+
return null;
|
|
15
|
+
const packageSpec = parsePackageSpec(parsed.packageSpec);
|
|
16
|
+
const cacheKey = JSON.stringify([command, parsed.packageSpec, parsed.binName ?? ""]);
|
|
17
|
+
const cache = loadCache();
|
|
18
|
+
const cached = cache?.entries?.[cacheKey];
|
|
19
|
+
if (cached &&
|
|
20
|
+
Date.now() - cached.resolvedAt < CACHE_TTL_MS &&
|
|
21
|
+
existsSync(cached.resolvedBin) &&
|
|
22
|
+
(!packageSpec?.exactVersion || cached.packageVersion === packageSpec.exactVersion)) {
|
|
23
|
+
return { binPath: cached.resolvedBin, extraArgs: parsed.extraArgs, isJs: cached.isJs };
|
|
24
|
+
}
|
|
25
|
+
const resolved = resolveFromNpmCache(parsed.packageSpec, parsed.binName);
|
|
26
|
+
if (resolved) {
|
|
27
|
+
saveCacheEntry(cacheKey, resolved);
|
|
28
|
+
return { binPath: resolved.resolvedBin, extraArgs: parsed.extraArgs, isJs: resolved.isJs };
|
|
29
|
+
}
|
|
30
|
+
// Slow path: force npx cache population
|
|
31
|
+
await forceNpxCache(parsed.packageSpec, signal);
|
|
32
|
+
const resolvedAfterInstall = resolveFromNpmCache(parsed.packageSpec, parsed.binName);
|
|
33
|
+
if (resolvedAfterInstall) {
|
|
34
|
+
saveCacheEntry(cacheKey, resolvedAfterInstall);
|
|
35
|
+
return {
|
|
36
|
+
binPath: resolvedAfterInstall.resolvedBin,
|
|
37
|
+
extraArgs: parsed.extraArgs,
|
|
38
|
+
isJs: resolvedAfterInstall.isJs,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
function parseNpxArgs(args) {
|
|
44
|
+
const separatorIndex = args.indexOf("--");
|
|
45
|
+
const before = separatorIndex >= 0 ? args.slice(0, separatorIndex) : args;
|
|
46
|
+
const after = separatorIndex >= 0 ? args.slice(separatorIndex + 1) : [];
|
|
47
|
+
const positionals = [];
|
|
48
|
+
let packageSpec;
|
|
49
|
+
let sawPackageFlag = false;
|
|
50
|
+
let foundFirstPositional = false;
|
|
51
|
+
for (let i = 0; i < before.length; i++) {
|
|
52
|
+
const arg = before[i];
|
|
53
|
+
if (arg === undefined)
|
|
54
|
+
return null;
|
|
55
|
+
if (foundFirstPositional) {
|
|
56
|
+
positionals.push(arg);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (arg === "-y" || arg === "--yes")
|
|
60
|
+
continue;
|
|
61
|
+
if (arg === "-p" || arg === "--package") {
|
|
62
|
+
const value = before[i + 1];
|
|
63
|
+
if (!value || value.startsWith("-"))
|
|
64
|
+
return null;
|
|
65
|
+
if (!packageSpec)
|
|
66
|
+
packageSpec = value;
|
|
67
|
+
sawPackageFlag = true;
|
|
68
|
+
i++;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (arg.startsWith("--package=")) {
|
|
72
|
+
const value = arg.slice("--package=".length);
|
|
73
|
+
if (!value)
|
|
74
|
+
return null;
|
|
75
|
+
if (!packageSpec)
|
|
76
|
+
packageSpec = value;
|
|
77
|
+
sawPackageFlag = true;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (arg.startsWith("-")) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
positionals.push(arg);
|
|
84
|
+
foundFirstPositional = true;
|
|
85
|
+
}
|
|
86
|
+
const separatedAfter = separatorIndex >= 0 && after.length > 0 ? ["--", ...after] : after;
|
|
87
|
+
if (sawPackageFlag) {
|
|
88
|
+
const binName = positionals[0];
|
|
89
|
+
if (!packageSpec || !binName)
|
|
90
|
+
return null;
|
|
91
|
+
const extraArgs = positionals.slice(1).concat(separatedAfter);
|
|
92
|
+
return { packageSpec, binName, extraArgs };
|
|
93
|
+
}
|
|
94
|
+
const packagePositional = positionals[0];
|
|
95
|
+
if (!packagePositional)
|
|
96
|
+
return null;
|
|
97
|
+
const extraArgs = positionals.slice(1).concat(separatedAfter);
|
|
98
|
+
return { packageSpec: packagePositional, extraArgs };
|
|
99
|
+
}
|
|
100
|
+
function parseNpmExecArgs(args) {
|
|
101
|
+
if (args[0] !== "exec")
|
|
102
|
+
return null;
|
|
103
|
+
const execArgs = args.slice(1);
|
|
104
|
+
const separatorIndex = execArgs.indexOf("--");
|
|
105
|
+
if (separatorIndex < 0)
|
|
106
|
+
return null;
|
|
107
|
+
const before = execArgs.slice(0, separatorIndex);
|
|
108
|
+
const after = execArgs.slice(separatorIndex + 1);
|
|
109
|
+
let packageSpec;
|
|
110
|
+
for (let i = 0; i < before.length; i++) {
|
|
111
|
+
const arg = before[i];
|
|
112
|
+
if (arg === undefined)
|
|
113
|
+
return null;
|
|
114
|
+
if (arg === "-y" || arg === "--yes")
|
|
115
|
+
continue;
|
|
116
|
+
if (arg === "--package") {
|
|
117
|
+
const value = before[i + 1];
|
|
118
|
+
if (!value || value.startsWith("-"))
|
|
119
|
+
return null;
|
|
120
|
+
if (!packageSpec)
|
|
121
|
+
packageSpec = value;
|
|
122
|
+
i++;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (arg.startsWith("--package=")) {
|
|
126
|
+
const value = arg.slice("--package=".length);
|
|
127
|
+
if (!value)
|
|
128
|
+
return null;
|
|
129
|
+
if (!packageSpec)
|
|
130
|
+
packageSpec = value;
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (arg.startsWith("-")) {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const binName = after[0];
|
|
138
|
+
if (!packageSpec || !binName)
|
|
139
|
+
return null;
|
|
140
|
+
const extraArgs = after.slice(1);
|
|
141
|
+
return { packageSpec, binName, extraArgs };
|
|
142
|
+
}
|
|
143
|
+
function resolveFromNpmCache(packageSpec, binName) {
|
|
144
|
+
const cacheDir = getNpmCacheDir();
|
|
145
|
+
if (!cacheDir)
|
|
146
|
+
return null;
|
|
147
|
+
const parsedSpec = parsePackageSpec(packageSpec);
|
|
148
|
+
if (!parsedSpec)
|
|
149
|
+
return null;
|
|
150
|
+
const { packageName, exactVersion } = parsedSpec;
|
|
151
|
+
const packageDir = findCachedPackageDir(cacheDir, packageName, exactVersion);
|
|
152
|
+
if (!packageDir)
|
|
153
|
+
return null;
|
|
154
|
+
const packageJsonPath = join(packageDir, "package.json");
|
|
155
|
+
if (!existsSync(packageJsonPath))
|
|
156
|
+
return null;
|
|
157
|
+
let pkg = null;
|
|
158
|
+
try {
|
|
159
|
+
pkg = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
const binField = pkg?.bin;
|
|
165
|
+
if (!binField)
|
|
166
|
+
return null;
|
|
167
|
+
const candidates = buildBinCandidates(packageName, binName);
|
|
168
|
+
let chosenBinName;
|
|
169
|
+
let binRel;
|
|
170
|
+
if (typeof binField === "string") {
|
|
171
|
+
chosenBinName = defaultBinName(packageName);
|
|
172
|
+
binRel = binField;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
for (const candidate of candidates) {
|
|
176
|
+
if (binField[candidate]) {
|
|
177
|
+
chosenBinName = candidate;
|
|
178
|
+
binRel = binField[candidate];
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (!binRel) {
|
|
183
|
+
const firstEntry = Object.entries(binField)[0];
|
|
184
|
+
if (firstEntry) {
|
|
185
|
+
chosenBinName = firstEntry[0];
|
|
186
|
+
binRel = firstEntry[1];
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (!binRel)
|
|
191
|
+
return null;
|
|
192
|
+
const nodeModulesDir = findNodeModulesDir(packageDir);
|
|
193
|
+
const binLink = chosenBinName ? join(nodeModulesDir, ".bin", chosenBinName) : null;
|
|
194
|
+
let resolvedBin = binLink && existsSync(binLink) ? safeRealpath(binLink) : "";
|
|
195
|
+
if (!resolvedBin) {
|
|
196
|
+
resolvedBin = resolve(packageDir, binRel);
|
|
197
|
+
if (!existsSync(resolvedBin))
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
const isJs = detectJsBinary(resolvedBin);
|
|
201
|
+
return {
|
|
202
|
+
resolvedBin,
|
|
203
|
+
resolvedAt: Date.now(),
|
|
204
|
+
...(pkg?.version !== undefined ? { packageVersion: pkg.version } : {}),
|
|
205
|
+
isJs,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
const FORCE_CACHE_TIMEOUT_MS = 30_000;
|
|
209
|
+
async function forceNpxCache(packageSpec, signal) {
|
|
210
|
+
throwIfAborted(signal);
|
|
211
|
+
try {
|
|
212
|
+
await new Promise((resolve, reject) => {
|
|
213
|
+
const proc = crossSpawn("npm", ["exec", "--yes", "--package", packageSpec, "--", "node", "-e", "1"], {
|
|
214
|
+
stdio: "ignore",
|
|
215
|
+
});
|
|
216
|
+
const timer = setTimeout(() => {
|
|
217
|
+
proc.kill();
|
|
218
|
+
reject(new Error("timeout"));
|
|
219
|
+
}, FORCE_CACHE_TIMEOUT_MS);
|
|
220
|
+
const abort = () => {
|
|
221
|
+
proc.kill();
|
|
222
|
+
reject(signal?.reason instanceof Error ? signal.reason : new Error("MCP request aborted"));
|
|
223
|
+
};
|
|
224
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
225
|
+
timer.unref();
|
|
226
|
+
proc.on("close", () => {
|
|
227
|
+
clearTimeout(timer);
|
|
228
|
+
signal?.removeEventListener("abort", abort);
|
|
229
|
+
resolve();
|
|
230
|
+
});
|
|
231
|
+
proc.on("error", (err) => {
|
|
232
|
+
clearTimeout(timer);
|
|
233
|
+
signal?.removeEventListener("abort", abort);
|
|
234
|
+
reject(err);
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
catch (_error) {
|
|
239
|
+
if (signal?.aborted)
|
|
240
|
+
throwIfAborted(signal);
|
|
241
|
+
// Ignore failures, resolution will fall back to original command
|
|
242
|
+
}
|
|
243
|
+
throwIfAborted(signal);
|
|
244
|
+
}
|
|
245
|
+
function buildBinCandidates(packageName, explicitBin) {
|
|
246
|
+
const candidates = [];
|
|
247
|
+
if (explicitBin)
|
|
248
|
+
candidates.push(explicitBin);
|
|
249
|
+
if (packageName.startsWith("@")) {
|
|
250
|
+
const namePart = packageName.split("/")[1] ?? "";
|
|
251
|
+
const scopePart = packageName.split("/")[0]?.replace("@", "") ?? "";
|
|
252
|
+
if (namePart)
|
|
253
|
+
candidates.push(namePart);
|
|
254
|
+
if (scopePart && namePart)
|
|
255
|
+
candidates.push(`${scopePart}-${namePart}`);
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
candidates.push(packageName);
|
|
259
|
+
}
|
|
260
|
+
return [...new Set(candidates.filter(Boolean))];
|
|
261
|
+
}
|
|
262
|
+
function parsePackageSpec(spec) {
|
|
263
|
+
const trimmed = spec.trim();
|
|
264
|
+
if (!trimmed)
|
|
265
|
+
return null;
|
|
266
|
+
let packageName;
|
|
267
|
+
let requestedVersion;
|
|
268
|
+
if (trimmed.startsWith("@")) {
|
|
269
|
+
const slashIndex = trimmed.indexOf("/");
|
|
270
|
+
if (slashIndex < 0)
|
|
271
|
+
return null;
|
|
272
|
+
const atIndex = trimmed.lastIndexOf("@");
|
|
273
|
+
if (atIndex > slashIndex) {
|
|
274
|
+
packageName = trimmed.slice(0, atIndex);
|
|
275
|
+
requestedVersion = trimmed.slice(atIndex + 1);
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
packageName = trimmed;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
const atIndex = trimmed.indexOf("@");
|
|
283
|
+
if (atIndex >= 0) {
|
|
284
|
+
packageName = trimmed.slice(0, atIndex);
|
|
285
|
+
requestedVersion = trimmed.slice(atIndex + 1);
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
packageName = trimmed;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if (!packageName)
|
|
292
|
+
return null;
|
|
293
|
+
const normalizedVersion = requestedVersion?.replace(/^=/, "").replace(/^v/i, "");
|
|
294
|
+
return {
|
|
295
|
+
packageName,
|
|
296
|
+
...(normalizedVersion && EXACT_PACKAGE_VERSION_RE.test(normalizedVersion)
|
|
297
|
+
? { exactVersion: normalizedVersion }
|
|
298
|
+
: {}),
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
function defaultBinName(packageName) {
|
|
302
|
+
if (packageName.startsWith("@")) {
|
|
303
|
+
const parts = packageName.split("/");
|
|
304
|
+
return parts[1] ?? packageName.replace("@", "").replace("/", "-");
|
|
305
|
+
}
|
|
306
|
+
return packageName;
|
|
307
|
+
}
|
|
308
|
+
function findCachedPackageDir(cacheDir, packageName, exactVersion) {
|
|
309
|
+
const npxDir = join(cacheDir, "_npx");
|
|
310
|
+
if (!existsSync(npxDir))
|
|
311
|
+
return null;
|
|
312
|
+
const packagePathParts = packageName.startsWith("@") ? packageName.split("/") : [packageName];
|
|
313
|
+
const candidates = readdirSync(npxDir, { withFileTypes: true })
|
|
314
|
+
.filter((entry) => entry.isDirectory())
|
|
315
|
+
.map((entry) => {
|
|
316
|
+
const full = join(npxDir, entry.name);
|
|
317
|
+
const mtime = safeStatMtime(full);
|
|
318
|
+
return { name: entry.name, mtime };
|
|
319
|
+
})
|
|
320
|
+
.sort((a, b) => b.mtime - a.mtime);
|
|
321
|
+
for (const entry of candidates) {
|
|
322
|
+
const pkgDir = join(npxDir, entry.name, "node_modules", ...packagePathParts);
|
|
323
|
+
const packageJsonPath = join(pkgDir, "package.json");
|
|
324
|
+
if (!existsSync(packageJsonPath))
|
|
325
|
+
continue;
|
|
326
|
+
if (exactVersion) {
|
|
327
|
+
try {
|
|
328
|
+
const pkg = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
329
|
+
if (pkg.version !== exactVersion)
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
return pkgDir;
|
|
337
|
+
}
|
|
338
|
+
return null;
|
|
339
|
+
}
|
|
340
|
+
function findNodeModulesDir(packageDir) {
|
|
341
|
+
const parts = packageDir.split(sep);
|
|
342
|
+
const idx = parts.lastIndexOf("node_modules");
|
|
343
|
+
if (idx >= 0) {
|
|
344
|
+
return parts.slice(0, idx + 1).join(sep);
|
|
345
|
+
}
|
|
346
|
+
return join(packageDir, "..");
|
|
347
|
+
}
|
|
348
|
+
function detectJsBinary(binPath) {
|
|
349
|
+
const ext = extname(binPath).toLowerCase();
|
|
350
|
+
if (ext === ".js" || ext === ".mjs" || ext === ".cjs")
|
|
351
|
+
return true;
|
|
352
|
+
try {
|
|
353
|
+
const fd = openSync(binPath, "r");
|
|
354
|
+
try {
|
|
355
|
+
const buf = Buffer.alloc(256);
|
|
356
|
+
readSync(fd, buf, 0, 256, 0);
|
|
357
|
+
const firstLine = buf.toString("utf-8").split("\n")[0] ?? "";
|
|
358
|
+
return firstLine.startsWith("#!") && firstLine.includes("node");
|
|
359
|
+
}
|
|
360
|
+
finally {
|
|
361
|
+
closeSync(fd);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
return false;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
let npmCacheDirCached;
|
|
369
|
+
function getNpmCacheDir() {
|
|
370
|
+
if (npmCacheDirCached !== undefined)
|
|
371
|
+
return npmCacheDirCached;
|
|
372
|
+
if (process.env.NPM_CONFIG_CACHE) {
|
|
373
|
+
npmCacheDirCached = process.env.NPM_CONFIG_CACHE;
|
|
374
|
+
return npmCacheDirCached;
|
|
375
|
+
}
|
|
376
|
+
try {
|
|
377
|
+
const result = crossSpawn.sync("npm", ["config", "get", "cache"], { encoding: "utf-8" });
|
|
378
|
+
if (result.status === 0) {
|
|
379
|
+
const path = String(result.stdout).trim();
|
|
380
|
+
npmCacheDirCached = path || null;
|
|
381
|
+
return npmCacheDirCached;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
catch {
|
|
385
|
+
npmCacheDirCached = null;
|
|
386
|
+
return null;
|
|
387
|
+
}
|
|
388
|
+
npmCacheDirCached = null;
|
|
389
|
+
return null;
|
|
390
|
+
}
|
|
391
|
+
function getNpxCachePath() {
|
|
392
|
+
return getAgentPath("mcp-npx-cache.json");
|
|
393
|
+
}
|
|
394
|
+
function readNpxCachePayload(cachePath) {
|
|
395
|
+
if (!existsSync(cachePath))
|
|
396
|
+
return null;
|
|
397
|
+
try {
|
|
398
|
+
return JSON.parse(readFileSync(cachePath, "utf-8"));
|
|
399
|
+
}
|
|
400
|
+
catch {
|
|
401
|
+
return null;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
function asRecord(value) {
|
|
405
|
+
return typeof value === "object" && value !== null && !Array.isArray(value)
|
|
406
|
+
? value
|
|
407
|
+
: null;
|
|
408
|
+
}
|
|
409
|
+
function createCacheEntries() {
|
|
410
|
+
return Object.create(null);
|
|
411
|
+
}
|
|
412
|
+
function toNpxCacheEntry(value) {
|
|
413
|
+
const raw = asRecord(value);
|
|
414
|
+
if (!raw)
|
|
415
|
+
return null;
|
|
416
|
+
if (typeof raw.resolvedBin !== "string")
|
|
417
|
+
return null;
|
|
418
|
+
if (typeof raw.resolvedAt !== "number" || !Number.isFinite(raw.resolvedAt))
|
|
419
|
+
return null;
|
|
420
|
+
if (typeof raw.isJs !== "boolean")
|
|
421
|
+
return null;
|
|
422
|
+
if (raw.packageVersion !== undefined && typeof raw.packageVersion !== "string")
|
|
423
|
+
return null;
|
|
424
|
+
return {
|
|
425
|
+
resolvedBin: raw.resolvedBin,
|
|
426
|
+
resolvedAt: raw.resolvedAt,
|
|
427
|
+
...(raw.packageVersion !== undefined ? { packageVersion: raw.packageVersion } : {}),
|
|
428
|
+
isJs: raw.isJs,
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
function toNpxCache(value) {
|
|
432
|
+
const raw = asRecord(value);
|
|
433
|
+
if (!raw || raw.version !== CACHE_VERSION)
|
|
434
|
+
return null;
|
|
435
|
+
const rawEntries = asRecord(raw.entries);
|
|
436
|
+
if (!rawEntries)
|
|
437
|
+
return null;
|
|
438
|
+
const entries = createCacheEntries();
|
|
439
|
+
for (const [key, rawEntry] of Object.entries(rawEntries)) {
|
|
440
|
+
const entry = toNpxCacheEntry(rawEntry);
|
|
441
|
+
if (entry)
|
|
442
|
+
entries[key] = entry;
|
|
443
|
+
}
|
|
444
|
+
return { version: CACHE_VERSION, entries };
|
|
445
|
+
}
|
|
446
|
+
function clearLegacyCache() {
|
|
447
|
+
const cachePath = getNpxCachePath();
|
|
448
|
+
const raw = asRecord(readNpxCachePayload(cachePath));
|
|
449
|
+
if (raw?.version !== 1)
|
|
450
|
+
return false;
|
|
451
|
+
try {
|
|
452
|
+
unlinkSync(cachePath);
|
|
453
|
+
}
|
|
454
|
+
catch {
|
|
455
|
+
try {
|
|
456
|
+
writeFileSync(cachePath, "", "utf-8");
|
|
457
|
+
}
|
|
458
|
+
catch {
|
|
459
|
+
// Cache cleanup is best effort; resolution must still proceed.
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
return true;
|
|
463
|
+
}
|
|
464
|
+
clearLegacyCache();
|
|
465
|
+
function loadCache() {
|
|
466
|
+
if (clearLegacyCache())
|
|
467
|
+
return null;
|
|
468
|
+
return toNpxCache(readNpxCachePayload(getNpxCachePath()));
|
|
469
|
+
}
|
|
470
|
+
function saveCacheEntry(key, entry) {
|
|
471
|
+
try {
|
|
472
|
+
const cachePath = getNpxCachePath();
|
|
473
|
+
const dir = dirname(cachePath);
|
|
474
|
+
mkdirSync(dir, { recursive: true });
|
|
475
|
+
const existing = toNpxCache(readNpxCachePayload(cachePath));
|
|
476
|
+
const entries = createCacheEntries();
|
|
477
|
+
if (existing)
|
|
478
|
+
Object.assign(entries, existing.entries);
|
|
479
|
+
const merged = { version: CACHE_VERSION, entries };
|
|
480
|
+
merged.entries[key] = entry;
|
|
481
|
+
const tmpPath = `${cachePath}.${process.pid}.tmp`;
|
|
482
|
+
writeFileSync(tmpPath, JSON.stringify(merged, null, 2), "utf-8");
|
|
483
|
+
renameSync(tmpPath, cachePath);
|
|
484
|
+
}
|
|
485
|
+
catch {
|
|
486
|
+
// Cache writes are best effort; resolution must still proceed.
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
function safeRealpath(path) {
|
|
490
|
+
try {
|
|
491
|
+
return realpathSync(path);
|
|
492
|
+
}
|
|
493
|
+
catch {
|
|
494
|
+
return "";
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
function safeStatMtime(path) {
|
|
498
|
+
try {
|
|
499
|
+
return statSync(path).mtimeMs;
|
|
500
|
+
}
|
|
501
|
+
catch {
|
|
502
|
+
return 0;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
//# sourceMappingURL=npx-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npx-resolver.js","sourceRoot":"","sources":["../../../src/extensions/mcp/npx-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["// npx-resolver.ts - Resolve npx/npm exec binaries to avoid npm parent processes\nimport {\n\tcloseSync,\n\texistsSync,\n\tmkdirSync,\n\topenSync,\n\treaddirSync,\n\treadFileSync,\n\treadSync,\n\trealpathSync,\n\trenameSync,\n\tstatSync,\n\tunlinkSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { dirname, extname, join, resolve, sep } from \"node:path\";\nimport crossSpawn from \"cross-spawn\";\nimport { throwIfAborted } from \"./abort.ts\";\nimport { getAgentPath } from \"./agent-dir.ts\";\n\nconst CACHE_VERSION = 2;\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000;\nconst EXACT_PACKAGE_VERSION_RE = /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z][0-9A-Za-z.-]*)?(?:\\+[0-9A-Za-z][0-9A-Za-z.-]*)?$/;\n\ninterface NpxCacheEntry {\n\tresolvedBin: string;\n\tresolvedAt: number;\n\tpackageVersion?: string;\n\tisJs: boolean;\n}\n\ninterface NpxCache {\n\tversion: number;\n\tentries: Record<string, NpxCacheEntry>;\n}\n\nexport interface NpxResolution {\n\tbinPath: string;\n\textraArgs: string[];\n\tisJs: boolean;\n}\n\ninterface ParsedInvocation {\n\tpackageSpec: string;\n\tbinName?: string;\n\textraArgs: string[];\n}\n\ninterface ParsedPackageSpec {\n\tpackageName: string;\n\texactVersion?: string;\n}\n\nexport async function resolveNpxBinary(\n\tcommand: string,\n\targs: string[],\n\tsignal?: AbortSignal,\n): Promise<NpxResolution | null> {\n\tthrowIfAborted(signal);\n\tconst parsed = command === \"npx\" ? parseNpxArgs(args) : command === \"npm\" ? parseNpmExecArgs(args) : null;\n\n\tif (!parsed) return null;\n\n\tconst packageSpec = parsePackageSpec(parsed.packageSpec);\n\tconst cacheKey = JSON.stringify([command, parsed.packageSpec, parsed.binName ?? \"\"]);\n\tconst cache = loadCache();\n\tconst cached = cache?.entries?.[cacheKey];\n\n\tif (\n\t\tcached &&\n\t\tDate.now() - cached.resolvedAt < CACHE_TTL_MS &&\n\t\texistsSync(cached.resolvedBin) &&\n\t\t(!packageSpec?.exactVersion || cached.packageVersion === packageSpec.exactVersion)\n\t) {\n\t\treturn { binPath: cached.resolvedBin, extraArgs: parsed.extraArgs, isJs: cached.isJs };\n\t}\n\n\tconst resolved = resolveFromNpmCache(parsed.packageSpec, parsed.binName);\n\tif (resolved) {\n\t\tsaveCacheEntry(cacheKey, resolved);\n\t\treturn { binPath: resolved.resolvedBin, extraArgs: parsed.extraArgs, isJs: resolved.isJs };\n\t}\n\n\t// Slow path: force npx cache population\n\tawait forceNpxCache(parsed.packageSpec, signal);\n\tconst resolvedAfterInstall = resolveFromNpmCache(parsed.packageSpec, parsed.binName);\n\tif (resolvedAfterInstall) {\n\t\tsaveCacheEntry(cacheKey, resolvedAfterInstall);\n\t\treturn {\n\t\t\tbinPath: resolvedAfterInstall.resolvedBin,\n\t\t\textraArgs: parsed.extraArgs,\n\t\t\tisJs: resolvedAfterInstall.isJs,\n\t\t};\n\t}\n\n\treturn null;\n}\n\nfunction parseNpxArgs(args: string[]): ParsedInvocation | null {\n\tconst separatorIndex = args.indexOf(\"--\");\n\tconst before = separatorIndex >= 0 ? args.slice(0, separatorIndex) : args;\n\tconst after = separatorIndex >= 0 ? args.slice(separatorIndex + 1) : [];\n\n\tconst positionals: string[] = [];\n\tlet packageSpec: string | undefined;\n\tlet sawPackageFlag = false;\n\tlet foundFirstPositional = false;\n\n\tfor (let i = 0; i < before.length; i++) {\n\t\tconst arg = before[i];\n\t\tif (arg === undefined) return null;\n\t\tif (foundFirstPositional) {\n\t\t\tpositionals.push(arg);\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg === \"-y\" || arg === \"--yes\") continue;\n\t\tif (arg === \"-p\" || arg === \"--package\") {\n\t\t\tconst value = before[i + 1];\n\t\t\tif (!value || value.startsWith(\"-\")) return null;\n\t\t\tif (!packageSpec) packageSpec = value;\n\t\t\tsawPackageFlag = true;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"--package=\")) {\n\t\t\tconst value = arg.slice(\"--package=\".length);\n\t\t\tif (!value) return null;\n\t\t\tif (!packageSpec) packageSpec = value;\n\t\t\tsawPackageFlag = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"-\")) {\n\t\t\treturn null;\n\t\t}\n\t\tpositionals.push(arg);\n\t\tfoundFirstPositional = true;\n\t}\n\n\tconst separatedAfter = separatorIndex >= 0 && after.length > 0 ? [\"--\", ...after] : after;\n\n\tif (sawPackageFlag) {\n\t\tconst binName = positionals[0];\n\t\tif (!packageSpec || !binName) return null;\n\t\tconst extraArgs = positionals.slice(1).concat(separatedAfter);\n\t\treturn { packageSpec, binName, extraArgs };\n\t}\n\n\tconst packagePositional = positionals[0];\n\tif (!packagePositional) return null;\n\tconst extraArgs = positionals.slice(1).concat(separatedAfter);\n\treturn { packageSpec: packagePositional, extraArgs };\n}\n\nfunction parseNpmExecArgs(args: string[]): ParsedInvocation | null {\n\tif (args[0] !== \"exec\") return null;\n\tconst execArgs = args.slice(1);\n\tconst separatorIndex = execArgs.indexOf(\"--\");\n\tif (separatorIndex < 0) return null;\n\n\tconst before = execArgs.slice(0, separatorIndex);\n\tconst after = execArgs.slice(separatorIndex + 1);\n\n\tlet packageSpec: string | undefined;\n\tfor (let i = 0; i < before.length; i++) {\n\t\tconst arg = before[i];\n\t\tif (arg === undefined) return null;\n\t\tif (arg === \"-y\" || arg === \"--yes\") continue;\n\t\tif (arg === \"--package\") {\n\t\t\tconst value = before[i + 1];\n\t\t\tif (!value || value.startsWith(\"-\")) return null;\n\t\t\tif (!packageSpec) packageSpec = value;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"--package=\")) {\n\t\t\tconst value = arg.slice(\"--package=\".length);\n\t\t\tif (!value) return null;\n\t\t\tif (!packageSpec) packageSpec = value;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"-\")) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tconst binName = after[0];\n\tif (!packageSpec || !binName) return null;\n\tconst extraArgs = after.slice(1);\n\treturn { packageSpec, binName, extraArgs };\n}\n\nfunction resolveFromNpmCache(packageSpec: string, binName?: string): NpxCacheEntry | null {\n\tconst cacheDir = getNpmCacheDir();\n\tif (!cacheDir) return null;\n\n\tconst parsedSpec = parsePackageSpec(packageSpec);\n\tif (!parsedSpec) return null;\n\n\tconst { packageName, exactVersion } = parsedSpec;\n\tconst packageDir = findCachedPackageDir(cacheDir, packageName, exactVersion);\n\tif (!packageDir) return null;\n\n\tconst packageJsonPath = join(packageDir, \"package.json\");\n\tif (!existsSync(packageJsonPath)) return null;\n\n\tlet pkg: { bin?: string | Record<string, string>; version?: string } | null = null;\n\ttry {\n\t\tpkg = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as {\n\t\t\tbin?: string | Record<string, string>;\n\t\t\tversion?: string;\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n\n\tconst binField = pkg?.bin;\n\tif (!binField) return null;\n\n\tconst candidates = buildBinCandidates(packageName, binName);\n\tlet chosenBinName: string | undefined;\n\tlet binRel: string | undefined;\n\n\tif (typeof binField === \"string\") {\n\t\tchosenBinName = defaultBinName(packageName);\n\t\tbinRel = binField;\n\t} else {\n\t\tfor (const candidate of candidates) {\n\t\t\tif (binField[candidate]) {\n\t\t\t\tchosenBinName = candidate;\n\t\t\t\tbinRel = binField[candidate];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!binRel) {\n\t\t\tconst firstEntry = Object.entries(binField)[0];\n\t\t\tif (firstEntry) {\n\t\t\t\tchosenBinName = firstEntry[0];\n\t\t\t\tbinRel = firstEntry[1];\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!binRel) return null;\n\n\tconst nodeModulesDir = findNodeModulesDir(packageDir);\n\tconst binLink = chosenBinName ? join(nodeModulesDir, \".bin\", chosenBinName) : null;\n\tlet resolvedBin = binLink && existsSync(binLink) ? safeRealpath(binLink) : \"\";\n\tif (!resolvedBin) {\n\t\tresolvedBin = resolve(packageDir, binRel);\n\t\tif (!existsSync(resolvedBin)) return null;\n\t}\n\n\tconst isJs = detectJsBinary(resolvedBin);\n\treturn {\n\t\tresolvedBin,\n\t\tresolvedAt: Date.now(),\n\t\t...(pkg?.version !== undefined ? { packageVersion: pkg.version } : {}),\n\t\tisJs,\n\t};\n}\n\nconst FORCE_CACHE_TIMEOUT_MS = 30_000;\n\nasync function forceNpxCache(packageSpec: string, signal?: AbortSignal): Promise<void> {\n\tthrowIfAborted(signal);\n\ttry {\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst proc = crossSpawn(\"npm\", [\"exec\", \"--yes\", \"--package\", packageSpec, \"--\", \"node\", \"-e\", \"1\"], {\n\t\t\t\tstdio: \"ignore\",\n\t\t\t});\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tproc.kill();\n\t\t\t\treject(new Error(\"timeout\"));\n\t\t\t}, FORCE_CACHE_TIMEOUT_MS);\n\t\t\tconst abort = () => {\n\t\t\t\tproc.kill();\n\t\t\t\treject(signal?.reason instanceof Error ? signal.reason : new Error(\"MCP request aborted\"));\n\t\t\t};\n\t\t\tsignal?.addEventListener(\"abort\", abort, { once: true });\n\t\t\ttimer.unref();\n\t\t\tproc.on(\"close\", () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tsignal?.removeEventListener(\"abort\", abort);\n\t\t\t\tresolve();\n\t\t\t});\n\t\t\tproc.on(\"error\", (err) => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tsignal?.removeEventListener(\"abort\", abort);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t} catch (_error) {\n\t\tif (signal?.aborted) throwIfAborted(signal);\n\t\t// Ignore failures, resolution will fall back to original command\n\t}\n\tthrowIfAborted(signal);\n}\n\nfunction buildBinCandidates(packageName: string, explicitBin?: string): string[] {\n\tconst candidates: string[] = [];\n\tif (explicitBin) candidates.push(explicitBin);\n\n\tif (packageName.startsWith(\"@\")) {\n\t\tconst namePart = packageName.split(\"/\")[1] ?? \"\";\n\t\tconst scopePart = packageName.split(\"/\")[0]?.replace(\"@\", \"\") ?? \"\";\n\t\tif (namePart) candidates.push(namePart);\n\t\tif (scopePart && namePart) candidates.push(`${scopePart}-${namePart}`);\n\t} else {\n\t\tcandidates.push(packageName);\n\t}\n\n\treturn [...new Set(candidates.filter(Boolean))];\n}\n\nfunction parsePackageSpec(spec: string): ParsedPackageSpec | null {\n\tconst trimmed = spec.trim();\n\tif (!trimmed) return null;\n\n\tlet packageName: string;\n\tlet requestedVersion: string | undefined;\n\tif (trimmed.startsWith(\"@\")) {\n\t\tconst slashIndex = trimmed.indexOf(\"/\");\n\t\tif (slashIndex < 0) return null;\n\t\tconst atIndex = trimmed.lastIndexOf(\"@\");\n\t\tif (atIndex > slashIndex) {\n\t\t\tpackageName = trimmed.slice(0, atIndex);\n\t\t\trequestedVersion = trimmed.slice(atIndex + 1);\n\t\t} else {\n\t\t\tpackageName = trimmed;\n\t\t}\n\t} else {\n\t\tconst atIndex = trimmed.indexOf(\"@\");\n\t\tif (atIndex >= 0) {\n\t\t\tpackageName = trimmed.slice(0, atIndex);\n\t\t\trequestedVersion = trimmed.slice(atIndex + 1);\n\t\t} else {\n\t\t\tpackageName = trimmed;\n\t\t}\n\t}\n\n\tif (!packageName) return null;\n\tconst normalizedVersion = requestedVersion?.replace(/^=/, \"\").replace(/^v/i, \"\");\n\treturn {\n\t\tpackageName,\n\t\t...(normalizedVersion && EXACT_PACKAGE_VERSION_RE.test(normalizedVersion)\n\t\t\t? { exactVersion: normalizedVersion }\n\t\t\t: {}),\n\t};\n}\n\nfunction defaultBinName(packageName: string): string {\n\tif (packageName.startsWith(\"@\")) {\n\t\tconst parts = packageName.split(\"/\");\n\t\treturn parts[1] ?? packageName.replace(\"@\", \"\").replace(\"/\", \"-\");\n\t}\n\treturn packageName;\n}\n\nfunction findCachedPackageDir(cacheDir: string, packageName: string, exactVersion?: string): string | null {\n\tconst npxDir = join(cacheDir, \"_npx\");\n\tif (!existsSync(npxDir)) return null;\n\n\tconst packagePathParts = packageName.startsWith(\"@\") ? packageName.split(\"/\") : [packageName];\n\n\tconst candidates = readdirSync(npxDir, { withFileTypes: true })\n\t\t.filter((entry) => entry.isDirectory())\n\t\t.map((entry) => {\n\t\t\tconst full = join(npxDir, entry.name);\n\t\t\tconst mtime = safeStatMtime(full);\n\t\t\treturn { name: entry.name, mtime };\n\t\t})\n\t\t.sort((a, b) => b.mtime - a.mtime);\n\n\tfor (const entry of candidates) {\n\t\tconst pkgDir = join(npxDir, entry.name, \"node_modules\", ...packagePathParts);\n\t\tconst packageJsonPath = join(pkgDir, \"package.json\");\n\t\tif (!existsSync(packageJsonPath)) continue;\n\t\tif (exactVersion) {\n\t\t\ttry {\n\t\t\t\tconst pkg = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as { version?: unknown };\n\t\t\t\tif (pkg.version !== exactVersion) continue;\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\treturn pkgDir;\n\t}\n\n\treturn null;\n}\n\nfunction findNodeModulesDir(packageDir: string): string {\n\tconst parts = packageDir.split(sep);\n\tconst idx = parts.lastIndexOf(\"node_modules\");\n\tif (idx >= 0) {\n\t\treturn parts.slice(0, idx + 1).join(sep);\n\t}\n\treturn join(packageDir, \"..\");\n}\n\nfunction detectJsBinary(binPath: string): boolean {\n\tconst ext = extname(binPath).toLowerCase();\n\tif (ext === \".js\" || ext === \".mjs\" || ext === \".cjs\") return true;\n\ttry {\n\t\tconst fd = openSync(binPath, \"r\");\n\t\ttry {\n\t\t\tconst buf = Buffer.alloc(256);\n\t\t\treadSync(fd, buf, 0, 256, 0);\n\t\t\tconst firstLine = buf.toString(\"utf-8\").split(\"\\n\")[0] ?? \"\";\n\t\t\treturn firstLine.startsWith(\"#!\") && firstLine.includes(\"node\");\n\t\t} finally {\n\t\t\tcloseSync(fd);\n\t\t}\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nlet npmCacheDirCached: string | null | undefined;\n\nfunction getNpmCacheDir(): string | null {\n\tif (npmCacheDirCached !== undefined) return npmCacheDirCached;\n\tif (process.env.NPM_CONFIG_CACHE) {\n\t\tnpmCacheDirCached = process.env.NPM_CONFIG_CACHE;\n\t\treturn npmCacheDirCached;\n\t}\n\ttry {\n\t\tconst result = crossSpawn.sync(\"npm\", [\"config\", \"get\", \"cache\"], { encoding: \"utf-8\" });\n\t\tif (result.status === 0) {\n\t\t\tconst path = String(result.stdout).trim();\n\t\t\tnpmCacheDirCached = path || null;\n\t\t\treturn npmCacheDirCached;\n\t\t}\n\t} catch {\n\t\tnpmCacheDirCached = null;\n\t\treturn null;\n\t}\n\tnpmCacheDirCached = null;\n\treturn null;\n}\n\nfunction getNpxCachePath(): string {\n\treturn getAgentPath(\"mcp-npx-cache.json\");\n}\n\nfunction readNpxCachePayload(cachePath: string): unknown | null {\n\tif (!existsSync(cachePath)) return null;\n\ttry {\n\t\treturn JSON.parse(readFileSync(cachePath, \"utf-8\")) as unknown;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: null;\n}\n\nfunction createCacheEntries(): Record<string, NpxCacheEntry> {\n\treturn Object.create(null) as Record<string, NpxCacheEntry>;\n}\n\nfunction toNpxCacheEntry(value: unknown): NpxCacheEntry | null {\n\tconst raw = asRecord(value);\n\tif (!raw) return null;\n\tif (typeof raw.resolvedBin !== \"string\") return null;\n\tif (typeof raw.resolvedAt !== \"number\" || !Number.isFinite(raw.resolvedAt)) return null;\n\tif (typeof raw.isJs !== \"boolean\") return null;\n\tif (raw.packageVersion !== undefined && typeof raw.packageVersion !== \"string\") return null;\n\treturn {\n\t\tresolvedBin: raw.resolvedBin,\n\t\tresolvedAt: raw.resolvedAt,\n\t\t...(raw.packageVersion !== undefined ? { packageVersion: raw.packageVersion } : {}),\n\t\tisJs: raw.isJs,\n\t};\n}\n\nfunction toNpxCache(value: unknown): NpxCache | null {\n\tconst raw = asRecord(value);\n\tif (!raw || raw.version !== CACHE_VERSION) return null;\n\tconst rawEntries = asRecord(raw.entries);\n\tif (!rawEntries) return null;\n\n\tconst entries = createCacheEntries();\n\tfor (const [key, rawEntry] of Object.entries(rawEntries)) {\n\t\tconst entry = toNpxCacheEntry(rawEntry);\n\t\tif (entry) entries[key] = entry;\n\t}\n\treturn { version: CACHE_VERSION, entries };\n}\n\nfunction clearLegacyCache(): boolean {\n\tconst cachePath = getNpxCachePath();\n\tconst raw = asRecord(readNpxCachePayload(cachePath));\n\tif (raw?.version !== 1) return false;\n\ttry {\n\t\tunlinkSync(cachePath);\n\t} catch {\n\t\ttry {\n\t\t\twriteFileSync(cachePath, \"\", \"utf-8\");\n\t\t} catch {\n\t\t\t// Cache cleanup is best effort; resolution must still proceed.\n\t\t}\n\t}\n\treturn true;\n}\n\nclearLegacyCache();\n\nfunction loadCache(): NpxCache | null {\n\tif (clearLegacyCache()) return null;\n\n\treturn toNpxCache(readNpxCachePayload(getNpxCachePath()));\n}\n\nfunction saveCacheEntry(key: string, entry: NpxCacheEntry): void {\n\ttry {\n\t\tconst cachePath = getNpxCachePath();\n\t\tconst dir = dirname(cachePath);\n\t\tmkdirSync(dir, { recursive: true });\n\n\t\tconst existing = toNpxCache(readNpxCachePayload(cachePath));\n\t\tconst entries = createCacheEntries();\n\t\tif (existing) Object.assign(entries, existing.entries);\n\t\tconst merged: NpxCache = { version: CACHE_VERSION, entries };\n\n\t\tmerged.entries[key] = entry;\n\t\tconst tmpPath = `${cachePath}.${process.pid}.tmp`;\n\t\twriteFileSync(tmpPath, JSON.stringify(merged, null, 2), \"utf-8\");\n\t\trenameSync(tmpPath, cachePath);\n\t} catch {\n\t\t// Cache writes are best effort; resolution must still proceed.\n\t}\n}\n\nfunction safeRealpath(path: string): string {\n\ttry {\n\t\treturn realpathSync(path);\n\t} catch {\n\t\treturn \"\";\n\t}\n}\n\nfunction safeStatMtime(path: string): number {\n\ttry {\n\t\treturn statSync(path).mtimeMs;\n\t} catch {\n\t\treturn 0;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type AuthStorageOptions, type StoredTokens } from "./mcp-auth.ts";
|
|
2
|
+
export type McpOAuthTokens = StoredTokens;
|
|
3
|
+
export type McpOAuthStorageOptions = AuthStorageOptions;
|
|
4
|
+
export interface McpOAuthTokenOptions {
|
|
5
|
+
authStorageOptions?: McpOAuthStorageOptions;
|
|
6
|
+
signal?: AbortSignal;
|
|
7
|
+
skipIssuerMetadataValidation?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export type McpOAuthTokenStatus = {
|
|
10
|
+
status: "present";
|
|
11
|
+
tokens: McpOAuthTokens;
|
|
12
|
+
} | {
|
|
13
|
+
status: "absent";
|
|
14
|
+
} | {
|
|
15
|
+
status: "unavailable";
|
|
16
|
+
message: string;
|
|
17
|
+
};
|
|
18
|
+
export declare function getMcpOAuthTokensForUrl(serverName: string, serverUrl: string, options?: McpOAuthTokenOptions): Promise<McpOAuthTokens | undefined>;
|
|
19
|
+
export declare function inspectMcpOAuthTokensForUrl(serverName: string, serverUrl: string, options?: McpOAuthStorageOptions): McpOAuthTokenStatus;
|
|
20
|
+
export declare function updateMcpOAuthTokensForUrl(serverName: string, serverUrl: string, tokens: McpOAuthTokens, options?: McpOAuthStorageOptions): void;
|
|
21
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAqB,KAAK,YAAY,EAAgB,MAAM,eAAe,CAAC;AAG5G,MAAM,MAAM,cAAc,GAAG,YAAY,CAAC;AAC1C,MAAM,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AACxD,MAAM,WAAW,oBAAoB;IACpC,kBAAkB,CAAC,EAAE,sBAAsB,CAAC;IAC5C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACvC;AACD,MAAM,MAAM,mBAAmB,GAC5B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GAC7C;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GACpB;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9C,wBAAsB,uBAAuB,CAC5C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,oBAAyB,GAChC,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAErC;AAED,wBAAgB,2BAA2B,CAC1C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,sBAAsB,GAC9B,mBAAmB,CAIrB;AAED,wBAAgB,0BAA0B,CACzC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,sBAAsB,GAC9B,IAAI,CAEN","sourcesContent":["import { type AuthStorageOptions, inspectAuthForUrl, type StoredTokens, updateTokens } from \"./mcp-auth.ts\";\nimport { getValidToken } from \"./mcp-auth-flow.ts\";\n\nexport type McpOAuthTokens = StoredTokens;\nexport type McpOAuthStorageOptions = AuthStorageOptions;\nexport interface McpOAuthTokenOptions {\n\tauthStorageOptions?: McpOAuthStorageOptions;\n\tsignal?: AbortSignal;\n\tskipIssuerMetadataValidation?: boolean;\n}\nexport type McpOAuthTokenStatus =\n\t| { status: \"present\"; tokens: McpOAuthTokens }\n\t| { status: \"absent\" }\n\t| { status: \"unavailable\"; message: string };\n\nexport async function getMcpOAuthTokensForUrl(\n\tserverName: string,\n\tserverUrl: string,\n\toptions: McpOAuthTokenOptions = {},\n): Promise<McpOAuthTokens | undefined> {\n\treturn (await getValidToken(serverName, serverUrl, options)) ?? undefined;\n}\n\nexport function inspectMcpOAuthTokensForUrl(\n\tserverName: string,\n\tserverUrl: string,\n\toptions?: McpOAuthStorageOptions,\n): McpOAuthTokenStatus {\n\tconst status = inspectAuthForUrl(serverName, serverUrl, options);\n\tif (status.status !== \"present\") return status;\n\treturn status.entry.tokens ? { status: \"present\", tokens: status.entry.tokens } : { status: \"absent\" };\n}\n\nexport function updateMcpOAuthTokensForUrl(\n\tserverName: string,\n\tserverUrl: string,\n\ttokens: McpOAuthTokens,\n\toptions?: McpOAuthStorageOptions,\n): void {\n\tupdateTokens(serverName, tokens, serverUrl, options);\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { inspectAuthForUrl, updateTokens } from "./mcp-auth.js";
|
|
2
|
+
import { getValidToken } from "./mcp-auth-flow.js";
|
|
3
|
+
export async function getMcpOAuthTokensForUrl(serverName, serverUrl, options = {}) {
|
|
4
|
+
return (await getValidToken(serverName, serverUrl, options)) ?? undefined;
|
|
5
|
+
}
|
|
6
|
+
export function inspectMcpOAuthTokensForUrl(serverName, serverUrl, options) {
|
|
7
|
+
const status = inspectAuthForUrl(serverName, serverUrl, options);
|
|
8
|
+
if (status.status !== "present")
|
|
9
|
+
return status;
|
|
10
|
+
return status.entry.tokens ? { status: "present", tokens: status.entry.tokens } : { status: "absent" };
|
|
11
|
+
}
|
|
12
|
+
export function updateMcpOAuthTokensForUrl(serverName, serverUrl, tokens, options) {
|
|
13
|
+
updateTokens(serverName, tokens, serverUrl, options);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/extensions/mcp/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,iBAAiB,EAAqB,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5G,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAcnD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC5C,UAAkB,EAClB,SAAiB,EACjB,OAAO,GAAyB,EAAE,EACI;IACtC,OAAO,CAAC,MAAM,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,SAAS,CAAC;AAAA,CAC1E;AAED,MAAM,UAAU,2BAA2B,CAC1C,UAAkB,EAClB,SAAiB,EACjB,OAAgC,EACV;IACtB,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACjE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAC/C,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAAA,CACvG;AAED,MAAM,UAAU,0BAA0B,CACzC,UAAkB,EAClB,SAAiB,EACjB,MAAsB,EACtB,OAAgC,EACzB;IACP,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAAA,CACrD","sourcesContent":["import { type AuthStorageOptions, inspectAuthForUrl, type StoredTokens, updateTokens } from \"./mcp-auth.ts\";\nimport { getValidToken } from \"./mcp-auth-flow.ts\";\n\nexport type McpOAuthTokens = StoredTokens;\nexport type McpOAuthStorageOptions = AuthStorageOptions;\nexport interface McpOAuthTokenOptions {\n\tauthStorageOptions?: McpOAuthStorageOptions;\n\tsignal?: AbortSignal;\n\tskipIssuerMetadataValidation?: boolean;\n}\nexport type McpOAuthTokenStatus =\n\t| { status: \"present\"; tokens: McpOAuthTokens }\n\t| { status: \"absent\" }\n\t| { status: \"unavailable\"; message: string };\n\nexport async function getMcpOAuthTokensForUrl(\n\tserverName: string,\n\tserverUrl: string,\n\toptions: McpOAuthTokenOptions = {},\n): Promise<McpOAuthTokens | undefined> {\n\treturn (await getValidToken(serverName, serverUrl, options)) ?? undefined;\n}\n\nexport function inspectMcpOAuthTokensForUrl(\n\tserverName: string,\n\tserverUrl: string,\n\toptions?: McpOAuthStorageOptions,\n): McpOAuthTokenStatus {\n\tconst status = inspectAuthForUrl(serverName, serverUrl, options);\n\tif (status.status !== \"present\") return status;\n\treturn status.entry.tokens ? { status: \"present\", tokens: status.entry.tokens } : { status: \"absent\" };\n}\n\nexport function updateMcpOAuthTokensForUrl(\n\tserverName: string,\n\tserverUrl: string,\n\ttokens: McpOAuthTokens,\n\toptions?: McpOAuthStorageOptions,\n): void {\n\tupdateTokens(serverName, tokens, serverUrl, options);\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface McpOnboardingState {
|
|
2
|
+
version: 1;
|
|
3
|
+
sharedConfigHintShown: boolean;
|
|
4
|
+
setupCompleted: boolean;
|
|
5
|
+
lastDiscoveryFingerprint?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function getOnboardingStatePath(): string;
|
|
8
|
+
export declare function loadOnboardingState(): McpOnboardingState;
|
|
9
|
+
export declare function saveOnboardingState(state: McpOnboardingState): void;
|
|
10
|
+
export declare function updateOnboardingState(updater: (state: McpOnboardingState) => McpOnboardingState): McpOnboardingState;
|
|
11
|
+
export declare function markSharedConfigHintShown(fingerprint?: string): McpOnboardingState;
|
|
12
|
+
export declare function markSetupCompleted(fingerprint?: string): McpOnboardingState;
|
|
13
|
+
//# sourceMappingURL=onboarding-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding-state.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/onboarding-state.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,CAAC,CAAC;IACX,qBAAqB,EAAE,OAAO,CAAC;IAC/B,cAAc,EAAE,OAAO,CAAC;IACxB,wBAAwB,CAAC,EAAE,MAAM,CAAC;CAClC;AAQD,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,mBAAmB,IAAI,kBAAkB,CAkBxD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAMnE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,kBAAkB,GAAG,kBAAkB,CAIpH;AAED,wBAAgB,yBAAyB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,kBAAkB,CASlF;AAED,wBAAgB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAS3E","sourcesContent":["import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { getAgentPath } from \"./agent-dir.ts\";\n\nexport interface McpOnboardingState {\n\tversion: 1;\n\tsharedConfigHintShown: boolean;\n\tsetupCompleted: boolean;\n\tlastDiscoveryFingerprint?: string;\n}\n\nconst DEFAULT_STATE: McpOnboardingState = {\n\tversion: 1,\n\tsharedConfigHintShown: false,\n\tsetupCompleted: false,\n};\n\nexport function getOnboardingStatePath(): string {\n\treturn getAgentPath(\"mcp-onboarding.json\");\n}\n\nexport function loadOnboardingState(): McpOnboardingState {\n\tconst path = getOnboardingStatePath();\n\tif (!existsSync(path)) return { ...DEFAULT_STATE };\n\n\ttry {\n\t\tconst raw = JSON.parse(readFileSync(path, \"utf-8\")) as Partial<McpOnboardingState>;\n\t\tif (!raw || typeof raw !== \"object\") return { ...DEFAULT_STATE };\n\t\treturn {\n\t\t\tversion: 1,\n\t\t\tsharedConfigHintShown: raw.sharedConfigHintShown === true,\n\t\t\tsetupCompleted: raw.setupCompleted === true,\n\t\t\t...(typeof raw.lastDiscoveryFingerprint === \"string\"\n\t\t\t\t? { lastDiscoveryFingerprint: raw.lastDiscoveryFingerprint }\n\t\t\t\t: {}),\n\t\t};\n\t} catch {\n\t\treturn { ...DEFAULT_STATE };\n\t}\n}\n\nexport function saveOnboardingState(state: McpOnboardingState): void {\n\tconst path = getOnboardingStatePath();\n\tmkdirSync(dirname(path), { recursive: true });\n\tconst tmpPath = `${path}.${process.pid}.tmp`;\n\twriteFileSync(tmpPath, `${JSON.stringify(state, null, 2)}\\n`, \"utf-8\");\n\trenameSync(tmpPath, path);\n}\n\nexport function updateOnboardingState(updater: (state: McpOnboardingState) => McpOnboardingState): McpOnboardingState {\n\tconst next = updater(loadOnboardingState());\n\tsaveOnboardingState(next);\n\treturn next;\n}\n\nexport function markSharedConfigHintShown(fingerprint?: string): McpOnboardingState {\n\treturn updateOnboardingState((state) => {\n\t\tconst lastDiscoveryFingerprint = fingerprint ?? state.lastDiscoveryFingerprint;\n\t\treturn {\n\t\t\t...state,\n\t\t\tsharedConfigHintShown: true,\n\t\t\t...(lastDiscoveryFingerprint !== undefined ? { lastDiscoveryFingerprint } : {}),\n\t\t};\n\t});\n}\n\nexport function markSetupCompleted(fingerprint?: string): McpOnboardingState {\n\treturn updateOnboardingState((state) => {\n\t\tconst lastDiscoveryFingerprint = fingerprint ?? state.lastDiscoveryFingerprint;\n\t\treturn {\n\t\t\t...state,\n\t\t\tsetupCompleted: true,\n\t\t\t...(lastDiscoveryFingerprint !== undefined ? { lastDiscoveryFingerprint } : {}),\n\t\t};\n\t});\n}\n"]}
|