@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,105 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const UI_STREAM_HOST_CONTEXT_KEY = "nexus-mcp/stream";
|
|
3
|
+
export declare const UI_STREAM_REQUEST_META_KEY = "nexus-mcp/stream-token";
|
|
4
|
+
export declare const UI_STREAM_RESULT_PATCH_METHOD = "notifications/nexus-mcp/ui-result-patch";
|
|
5
|
+
export declare const SERVER_STREAM_RESULT_PATCH_METHOD = "notifications/nexus-mcp/result-patch";
|
|
6
|
+
export declare const UI_STREAM_STRUCTURED_CONTENT_KEY = "nexus-mcp/stream";
|
|
7
|
+
export declare const uiStreamModeSchema: z.ZodEnum<{
|
|
8
|
+
eager: "eager";
|
|
9
|
+
"stream-first": "stream-first";
|
|
10
|
+
}>;
|
|
11
|
+
export type UiStreamMode = z.infer<typeof uiStreamModeSchema>;
|
|
12
|
+
export declare const visualizationStreamPhaseSchema: z.ZodEnum<{
|
|
13
|
+
detail: "detail";
|
|
14
|
+
narrative: "narrative";
|
|
15
|
+
settled: "settled";
|
|
16
|
+
shell: "shell";
|
|
17
|
+
structure: "structure";
|
|
18
|
+
}>;
|
|
19
|
+
export type VisualizationStreamPhase = z.infer<typeof visualizationStreamPhaseSchema>;
|
|
20
|
+
export declare const visualizationStreamFrameTypeSchema: z.ZodEnum<{
|
|
21
|
+
checkpoint: "checkpoint";
|
|
22
|
+
final: "final";
|
|
23
|
+
patch: "patch";
|
|
24
|
+
}>;
|
|
25
|
+
export type VisualizationStreamFrameType = z.infer<typeof visualizationStreamFrameTypeSchema>;
|
|
26
|
+
export declare const visualizationStreamStatusSchema: z.ZodEnum<{
|
|
27
|
+
error: "error";
|
|
28
|
+
ok: "ok";
|
|
29
|
+
}>;
|
|
30
|
+
export type VisualizationStreamStatus = z.infer<typeof visualizationStreamStatusSchema>;
|
|
31
|
+
export declare const uiStreamHostContextSchema: z.ZodObject<{
|
|
32
|
+
mode: z.ZodEnum<{
|
|
33
|
+
eager: "eager";
|
|
34
|
+
"stream-first": "stream-first";
|
|
35
|
+
}>;
|
|
36
|
+
streamId: z.ZodString;
|
|
37
|
+
intermediateResultPatches: z.ZodBoolean;
|
|
38
|
+
partialInput: z.ZodBoolean;
|
|
39
|
+
}, z.core.$strip>;
|
|
40
|
+
export type UiStreamHostContext = z.infer<typeof uiStreamHostContextSchema>;
|
|
41
|
+
export declare const visualizationStreamEnvelopeSchema: z.ZodObject<{
|
|
42
|
+
streamId: z.ZodString;
|
|
43
|
+
sequence: z.ZodNumber;
|
|
44
|
+
frameType: z.ZodEnum<{
|
|
45
|
+
checkpoint: "checkpoint";
|
|
46
|
+
final: "final";
|
|
47
|
+
patch: "patch";
|
|
48
|
+
}>;
|
|
49
|
+
phase: z.ZodEnum<{
|
|
50
|
+
detail: "detail";
|
|
51
|
+
narrative: "narrative";
|
|
52
|
+
settled: "settled";
|
|
53
|
+
shell: "shell";
|
|
54
|
+
structure: "structure";
|
|
55
|
+
}>;
|
|
56
|
+
status: z.ZodEnum<{
|
|
57
|
+
error: "error";
|
|
58
|
+
ok: "ok";
|
|
59
|
+
}>;
|
|
60
|
+
message: z.ZodOptional<z.ZodString>;
|
|
61
|
+
spec: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
62
|
+
checkpoint: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
63
|
+
}, z.core.$strip>;
|
|
64
|
+
export type VisualizationStreamEnvelope = z.infer<typeof visualizationStreamEnvelopeSchema>;
|
|
65
|
+
export declare const uiStreamCallToolResultSchema: z.ZodObject<{
|
|
66
|
+
content: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
|
|
67
|
+
structuredContent: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
68
|
+
isError: z.ZodOptional<z.ZodBoolean>;
|
|
69
|
+
_meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
70
|
+
}, z.core.$loose>;
|
|
71
|
+
export type UiStreamCallToolResult = z.infer<typeof uiStreamCallToolResultSchema>;
|
|
72
|
+
export declare const uiStreamResultPatchNotificationSchema: z.ZodObject<{
|
|
73
|
+
method: z.ZodLiteral<"notifications/nexus-mcp/ui-result-patch">;
|
|
74
|
+
params: z.ZodObject<{
|
|
75
|
+
content: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
|
|
76
|
+
structuredContent: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
77
|
+
isError: z.ZodOptional<z.ZodBoolean>;
|
|
78
|
+
_meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
79
|
+
}, z.core.$loose>;
|
|
80
|
+
}, z.core.$strip>;
|
|
81
|
+
export type UiStreamResultPatchNotification = z.infer<typeof uiStreamResultPatchNotificationSchema>;
|
|
82
|
+
export declare const serverStreamResultPatchNotificationSchema: z.ZodObject<{
|
|
83
|
+
method: z.ZodLiteral<"notifications/nexus-mcp/result-patch">;
|
|
84
|
+
params: z.ZodObject<{
|
|
85
|
+
streamToken: z.ZodString;
|
|
86
|
+
result: z.ZodObject<{
|
|
87
|
+
content: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
|
|
88
|
+
structuredContent: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
89
|
+
isError: z.ZodOptional<z.ZodBoolean>;
|
|
90
|
+
_meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
91
|
+
}, z.core.$loose>;
|
|
92
|
+
}, z.core.$strip>;
|
|
93
|
+
}, z.core.$strip>;
|
|
94
|
+
export type ServerStreamResultPatchNotification = z.infer<typeof serverStreamResultPatchNotificationSchema>;
|
|
95
|
+
export interface UiStreamSummary {
|
|
96
|
+
streamId: string;
|
|
97
|
+
mode: UiStreamMode;
|
|
98
|
+
frames: number;
|
|
99
|
+
phases: VisualizationStreamPhase[];
|
|
100
|
+
finalStatus?: VisualizationStreamStatus;
|
|
101
|
+
lastMessage?: string;
|
|
102
|
+
}
|
|
103
|
+
export declare function getUiStreamHostContext(hostContext: Record<string, unknown> | undefined): UiStreamHostContext | undefined;
|
|
104
|
+
export declare function getVisualizationStreamEnvelope(structuredContent: unknown): VisualizationStreamEnvelope | undefined;
|
|
105
|
+
//# sourceMappingURL=ui-stream-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-stream-types.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/ui-stream-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,0BAA0B,qBAAqB,CAAC;AAC7D,eAAO,MAAM,0BAA0B,2BAA2B,CAAC;AACnE,eAAO,MAAM,6BAA6B,4CAA4C,CAAC;AACvF,eAAO,MAAM,iCAAiC,yCAAyC,CAAC;AACxF,eAAO,MAAM,gCAAgC,qBAAqB,CAAC;AAEnE,eAAO,MAAM,kBAAkB;;;EAAoC,CAAC;AACpE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,8BAA8B;;;;;;EAAmE,CAAC;AAC/G,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAEtF,eAAO,MAAM,kCAAkC;;;;EAA2C,CAAC;AAC3F,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kCAAkC,CAAC,CAAC;AAE9F,eAAO,MAAM,+BAA+B;;;EAA0B,CAAC;AACvE,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAKxF,eAAO,MAAM,yBAAyB;;;;;;;;iBAKpC,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;;;;;iBAS5C,CAAC;AACH,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAC;AAE5F,eAAO,MAAM,4BAA4B;;;;;iBAO1B,CAAC;AAChB,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,eAAO,MAAM,qCAAqC;;;;;;;;iBAGhD,CAAC;AACH,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qCAAqC,CAAC,CAAC;AAEpG,eAAO,MAAM,yCAAyC;;;;;;;;;;;iBAMpD,CAAC;AACH,MAAM,MAAM,mCAAmC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yCAAyC,CAAC,CAAC;AAE5G,MAAM,WAAW,eAAe;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACnC,WAAW,CAAC,EAAE,yBAAyB,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,sBAAsB,CACrC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC9C,mBAAmB,GAAG,SAAS,CAIjC;AAED,wBAAgB,8BAA8B,CAAC,iBAAiB,EAAE,OAAO,GAAG,2BAA2B,GAAG,SAAS,CAOlH","sourcesContent":["import { z } from \"zod\";\n\nexport const UI_STREAM_HOST_CONTEXT_KEY = \"nexus-mcp/stream\";\nexport const UI_STREAM_REQUEST_META_KEY = \"nexus-mcp/stream-token\";\nexport const UI_STREAM_RESULT_PATCH_METHOD = \"notifications/nexus-mcp/ui-result-patch\";\nexport const SERVER_STREAM_RESULT_PATCH_METHOD = \"notifications/nexus-mcp/result-patch\";\nexport const UI_STREAM_STRUCTURED_CONTENT_KEY = \"nexus-mcp/stream\";\n\nexport const uiStreamModeSchema = z.enum([\"eager\", \"stream-first\"]);\nexport type UiStreamMode = z.infer<typeof uiStreamModeSchema>;\n\nexport const visualizationStreamPhaseSchema = z.enum([\"shell\", \"narrative\", \"structure\", \"detail\", \"settled\"]);\nexport type VisualizationStreamPhase = z.infer<typeof visualizationStreamPhaseSchema>;\n\nexport const visualizationStreamFrameTypeSchema = z.enum([\"patch\", \"checkpoint\", \"final\"]);\nexport type VisualizationStreamFrameType = z.infer<typeof visualizationStreamFrameTypeSchema>;\n\nexport const visualizationStreamStatusSchema = z.enum([\"ok\", \"error\"]);\nexport type VisualizationStreamStatus = z.infer<typeof visualizationStreamStatusSchema>;\n\nconst looseRecordSchema = z.record(z.string(), z.unknown());\nconst looseArraySchema = z.array(z.unknown());\n\nexport const uiStreamHostContextSchema = z.object({\n\tmode: uiStreamModeSchema,\n\tstreamId: z.string().min(1),\n\tintermediateResultPatches: z.boolean(),\n\tpartialInput: z.boolean(),\n});\nexport type UiStreamHostContext = z.infer<typeof uiStreamHostContextSchema>;\n\nexport const visualizationStreamEnvelopeSchema = z.object({\n\tstreamId: z.string().min(1),\n\tsequence: z.number().int().nonnegative(),\n\tframeType: visualizationStreamFrameTypeSchema,\n\tphase: visualizationStreamPhaseSchema,\n\tstatus: visualizationStreamStatusSchema,\n\tmessage: z.string().optional(),\n\tspec: looseRecordSchema.optional(),\n\tcheckpoint: looseRecordSchema.optional(),\n});\nexport type VisualizationStreamEnvelope = z.infer<typeof visualizationStreamEnvelopeSchema>;\n\nexport const uiStreamCallToolResultSchema = z\n\t.object({\n\t\tcontent: looseArraySchema.optional(),\n\t\tstructuredContent: looseRecordSchema.optional(),\n\t\tisError: z.boolean().optional(),\n\t\t_meta: looseRecordSchema.optional(),\n\t})\n\t.passthrough();\nexport type UiStreamCallToolResult = z.infer<typeof uiStreamCallToolResultSchema>;\n\nexport const uiStreamResultPatchNotificationSchema = z.object({\n\tmethod: z.literal(UI_STREAM_RESULT_PATCH_METHOD),\n\tparams: uiStreamCallToolResultSchema,\n});\nexport type UiStreamResultPatchNotification = z.infer<typeof uiStreamResultPatchNotificationSchema>;\n\nexport const serverStreamResultPatchNotificationSchema = z.object({\n\tmethod: z.literal(SERVER_STREAM_RESULT_PATCH_METHOD),\n\tparams: z.object({\n\t\tstreamToken: z.string().min(1),\n\t\tresult: uiStreamCallToolResultSchema,\n\t}),\n});\nexport type ServerStreamResultPatchNotification = z.infer<typeof serverStreamResultPatchNotificationSchema>;\n\nexport interface UiStreamSummary {\n\tstreamId: string;\n\tmode: UiStreamMode;\n\tframes: number;\n\tphases: VisualizationStreamPhase[];\n\tfinalStatus?: VisualizationStreamStatus;\n\tlastMessage?: string;\n}\n\nexport function getUiStreamHostContext(\n\thostContext: Record<string, unknown> | undefined,\n): UiStreamHostContext | undefined {\n\tconst candidate = hostContext?.[UI_STREAM_HOST_CONTEXT_KEY];\n\tconst parsed = uiStreamHostContextSchema.safeParse(candidate);\n\treturn parsed.success ? parsed.data : undefined;\n}\n\nexport function getVisualizationStreamEnvelope(structuredContent: unknown): VisualizationStreamEnvelope | undefined {\n\tif (!structuredContent || typeof structuredContent !== \"object\" || Array.isArray(structuredContent)) {\n\t\treturn undefined;\n\t}\n\tconst candidate = (structuredContent as Record<string, unknown>)[UI_STREAM_STRUCTURED_CONTENT_KEY];\n\tconst parsed = visualizationStreamEnvelopeSchema.safeParse(candidate);\n\treturn parsed.success ? parsed.data : undefined;\n}\n"]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const UI_STREAM_HOST_CONTEXT_KEY = "nexus-mcp/stream";
|
|
3
|
+
export const UI_STREAM_REQUEST_META_KEY = "nexus-mcp/stream-token";
|
|
4
|
+
export const UI_STREAM_RESULT_PATCH_METHOD = "notifications/nexus-mcp/ui-result-patch";
|
|
5
|
+
export const SERVER_STREAM_RESULT_PATCH_METHOD = "notifications/nexus-mcp/result-patch";
|
|
6
|
+
export const UI_STREAM_STRUCTURED_CONTENT_KEY = "nexus-mcp/stream";
|
|
7
|
+
export const uiStreamModeSchema = z.enum(["eager", "stream-first"]);
|
|
8
|
+
export const visualizationStreamPhaseSchema = z.enum(["shell", "narrative", "structure", "detail", "settled"]);
|
|
9
|
+
export const visualizationStreamFrameTypeSchema = z.enum(["patch", "checkpoint", "final"]);
|
|
10
|
+
export const visualizationStreamStatusSchema = z.enum(["ok", "error"]);
|
|
11
|
+
const looseRecordSchema = z.record(z.string(), z.unknown());
|
|
12
|
+
const looseArraySchema = z.array(z.unknown());
|
|
13
|
+
export const uiStreamHostContextSchema = z.object({
|
|
14
|
+
mode: uiStreamModeSchema,
|
|
15
|
+
streamId: z.string().min(1),
|
|
16
|
+
intermediateResultPatches: z.boolean(),
|
|
17
|
+
partialInput: z.boolean(),
|
|
18
|
+
});
|
|
19
|
+
export const visualizationStreamEnvelopeSchema = z.object({
|
|
20
|
+
streamId: z.string().min(1),
|
|
21
|
+
sequence: z.number().int().nonnegative(),
|
|
22
|
+
frameType: visualizationStreamFrameTypeSchema,
|
|
23
|
+
phase: visualizationStreamPhaseSchema,
|
|
24
|
+
status: visualizationStreamStatusSchema,
|
|
25
|
+
message: z.string().optional(),
|
|
26
|
+
spec: looseRecordSchema.optional(),
|
|
27
|
+
checkpoint: looseRecordSchema.optional(),
|
|
28
|
+
});
|
|
29
|
+
export const uiStreamCallToolResultSchema = z
|
|
30
|
+
.object({
|
|
31
|
+
content: looseArraySchema.optional(),
|
|
32
|
+
structuredContent: looseRecordSchema.optional(),
|
|
33
|
+
isError: z.boolean().optional(),
|
|
34
|
+
_meta: looseRecordSchema.optional(),
|
|
35
|
+
})
|
|
36
|
+
.passthrough();
|
|
37
|
+
export const uiStreamResultPatchNotificationSchema = z.object({
|
|
38
|
+
method: z.literal(UI_STREAM_RESULT_PATCH_METHOD),
|
|
39
|
+
params: uiStreamCallToolResultSchema,
|
|
40
|
+
});
|
|
41
|
+
export const serverStreamResultPatchNotificationSchema = z.object({
|
|
42
|
+
method: z.literal(SERVER_STREAM_RESULT_PATCH_METHOD),
|
|
43
|
+
params: z.object({
|
|
44
|
+
streamToken: z.string().min(1),
|
|
45
|
+
result: uiStreamCallToolResultSchema,
|
|
46
|
+
}),
|
|
47
|
+
});
|
|
48
|
+
export function getUiStreamHostContext(hostContext) {
|
|
49
|
+
const candidate = hostContext?.[UI_STREAM_HOST_CONTEXT_KEY];
|
|
50
|
+
const parsed = uiStreamHostContextSchema.safeParse(candidate);
|
|
51
|
+
return parsed.success ? parsed.data : undefined;
|
|
52
|
+
}
|
|
53
|
+
export function getVisualizationStreamEnvelope(structuredContent) {
|
|
54
|
+
if (!structuredContent || typeof structuredContent !== "object" || Array.isArray(structuredContent)) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
const candidate = structuredContent[UI_STREAM_STRUCTURED_CONTENT_KEY];
|
|
58
|
+
const parsed = visualizationStreamEnvelopeSchema.safeParse(candidate);
|
|
59
|
+
return parsed.success ? parsed.data : undefined;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=ui-stream-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-stream-types.js","sourceRoot":"","sources":["../../../src/extensions/mcp/ui-stream-types.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod\";\n\nexport const UI_STREAM_HOST_CONTEXT_KEY = \"nexus-mcp/stream\";\nexport const UI_STREAM_REQUEST_META_KEY = \"nexus-mcp/stream-token\";\nexport const UI_STREAM_RESULT_PATCH_METHOD = \"notifications/nexus-mcp/ui-result-patch\";\nexport const SERVER_STREAM_RESULT_PATCH_METHOD = \"notifications/nexus-mcp/result-patch\";\nexport const UI_STREAM_STRUCTURED_CONTENT_KEY = \"nexus-mcp/stream\";\n\nexport const uiStreamModeSchema = z.enum([\"eager\", \"stream-first\"]);\nexport type UiStreamMode = z.infer<typeof uiStreamModeSchema>;\n\nexport const visualizationStreamPhaseSchema = z.enum([\"shell\", \"narrative\", \"structure\", \"detail\", \"settled\"]);\nexport type VisualizationStreamPhase = z.infer<typeof visualizationStreamPhaseSchema>;\n\nexport const visualizationStreamFrameTypeSchema = z.enum([\"patch\", \"checkpoint\", \"final\"]);\nexport type VisualizationStreamFrameType = z.infer<typeof visualizationStreamFrameTypeSchema>;\n\nexport const visualizationStreamStatusSchema = z.enum([\"ok\", \"error\"]);\nexport type VisualizationStreamStatus = z.infer<typeof visualizationStreamStatusSchema>;\n\nconst looseRecordSchema = z.record(z.string(), z.unknown());\nconst looseArraySchema = z.array(z.unknown());\n\nexport const uiStreamHostContextSchema = z.object({\n\tmode: uiStreamModeSchema,\n\tstreamId: z.string().min(1),\n\tintermediateResultPatches: z.boolean(),\n\tpartialInput: z.boolean(),\n});\nexport type UiStreamHostContext = z.infer<typeof uiStreamHostContextSchema>;\n\nexport const visualizationStreamEnvelopeSchema = z.object({\n\tstreamId: z.string().min(1),\n\tsequence: z.number().int().nonnegative(),\n\tframeType: visualizationStreamFrameTypeSchema,\n\tphase: visualizationStreamPhaseSchema,\n\tstatus: visualizationStreamStatusSchema,\n\tmessage: z.string().optional(),\n\tspec: looseRecordSchema.optional(),\n\tcheckpoint: looseRecordSchema.optional(),\n});\nexport type VisualizationStreamEnvelope = z.infer<typeof visualizationStreamEnvelopeSchema>;\n\nexport const uiStreamCallToolResultSchema = z\n\t.object({\n\t\tcontent: looseArraySchema.optional(),\n\t\tstructuredContent: looseRecordSchema.optional(),\n\t\tisError: z.boolean().optional(),\n\t\t_meta: looseRecordSchema.optional(),\n\t})\n\t.passthrough();\nexport type UiStreamCallToolResult = z.infer<typeof uiStreamCallToolResultSchema>;\n\nexport const uiStreamResultPatchNotificationSchema = z.object({\n\tmethod: z.literal(UI_STREAM_RESULT_PATCH_METHOD),\n\tparams: uiStreamCallToolResultSchema,\n});\nexport type UiStreamResultPatchNotification = z.infer<typeof uiStreamResultPatchNotificationSchema>;\n\nexport const serverStreamResultPatchNotificationSchema = z.object({\n\tmethod: z.literal(SERVER_STREAM_RESULT_PATCH_METHOD),\n\tparams: z.object({\n\t\tstreamToken: z.string().min(1),\n\t\tresult: uiStreamCallToolResultSchema,\n\t}),\n});\nexport type ServerStreamResultPatchNotification = z.infer<typeof serverStreamResultPatchNotificationSchema>;\n\nexport interface UiStreamSummary {\n\tstreamId: string;\n\tmode: UiStreamMode;\n\tframes: number;\n\tphases: VisualizationStreamPhase[];\n\tfinalStatus?: VisualizationStreamStatus;\n\tlastMessage?: string;\n}\n\nexport function getUiStreamHostContext(\n\thostContext: Record<string, unknown> | undefined,\n): UiStreamHostContext | undefined {\n\tconst candidate = hostContext?.[UI_STREAM_HOST_CONTEXT_KEY];\n\tconst parsed = uiStreamHostContextSchema.safeParse(candidate);\n\treturn parsed.success ? parsed.data : undefined;\n}\n\nexport function getVisualizationStreamEnvelope(structuredContent: unknown): VisualizationStreamEnvelope | undefined {\n\tif (!structuredContent || typeof structuredContent !== \"object\" || Array.isArray(structuredContent)) {\n\t\treturn undefined;\n\t}\n\tconst candidate = (structuredContent as Record<string, unknown>)[UI_STREAM_STRUCTURED_CONTENT_KEY];\n\tconst parsed = visualizationStreamEnvelopeSchema.safeParse(candidate);\n\treturn parsed.success ? parsed.data : undefined;\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type UiToolVisibility = "model" | "app";
|
|
2
|
+
export declare function extractUiToolVisibility(meta: Record<string, unknown> | undefined): UiToolVisibility[] | undefined;
|
|
3
|
+
export declare function isUiToolVisibleToModel(visibility: readonly UiToolVisibility[] | undefined): boolean;
|
|
4
|
+
export declare function isUiToolCallableByApp(visibility: readonly UiToolVisibility[] | undefined): boolean;
|
|
5
|
+
//# sourceMappingURL=ui-tool-visibility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-tool-visibility.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/ui-tool-visibility.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,KAAK,CAAC;AAE/C,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,gBAAgB,EAAE,GAAG,SAAS,CAcjH;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,SAAS,gBAAgB,EAAE,GAAG,SAAS,GAAG,OAAO,CAEnG;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,SAAS,gBAAgB,EAAE,GAAG,SAAS,GAAG,OAAO,CAElG","sourcesContent":["export type UiToolVisibility = \"model\" | \"app\";\n\nexport function extractUiToolVisibility(meta: Record<string, unknown> | undefined): UiToolVisibility[] | undefined {\n\tif (!meta || typeof meta !== \"object\") return undefined;\n\tconst ui = meta.ui;\n\tif (!ui || typeof ui !== \"object\" || Array.isArray(ui)) return undefined;\n\tconst visibility = (ui as Record<string, unknown>).visibility;\n\tif (visibility === undefined) return undefined;\n\tif (!Array.isArray(visibility)) return [];\n\n\tconst values: UiToolVisibility[] = [];\n\tfor (const entry of visibility) {\n\t\tif (entry !== \"model\" && entry !== \"app\") return [];\n\t\tif (!values.includes(entry)) values.push(entry);\n\t}\n\treturn values;\n}\n\nexport function isUiToolVisibleToModel(visibility: readonly UiToolVisibility[] | undefined): boolean {\n\treturn visibility === undefined || visibility.includes(\"model\");\n}\n\nexport function isUiToolCallableByApp(visibility: readonly UiToolVisibility[] | undefined): boolean {\n\treturn visibility === undefined || visibility.includes(\"app\");\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export function extractUiToolVisibility(meta) {
|
|
2
|
+
if (!meta || typeof meta !== "object")
|
|
3
|
+
return undefined;
|
|
4
|
+
const ui = meta.ui;
|
|
5
|
+
if (!ui || typeof ui !== "object" || Array.isArray(ui))
|
|
6
|
+
return undefined;
|
|
7
|
+
const visibility = ui.visibility;
|
|
8
|
+
if (visibility === undefined)
|
|
9
|
+
return undefined;
|
|
10
|
+
if (!Array.isArray(visibility))
|
|
11
|
+
return [];
|
|
12
|
+
const values = [];
|
|
13
|
+
for (const entry of visibility) {
|
|
14
|
+
if (entry !== "model" && entry !== "app")
|
|
15
|
+
return [];
|
|
16
|
+
if (!values.includes(entry))
|
|
17
|
+
values.push(entry);
|
|
18
|
+
}
|
|
19
|
+
return values;
|
|
20
|
+
}
|
|
21
|
+
export function isUiToolVisibleToModel(visibility) {
|
|
22
|
+
return visibility === undefined || visibility.includes("model");
|
|
23
|
+
}
|
|
24
|
+
export function isUiToolCallableByApp(visibility) {
|
|
25
|
+
return visibility === undefined || visibility.includes("app");
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=ui-tool-visibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-tool-visibility.js","sourceRoot":"","sources":["../../../src/extensions/mcp/ui-tool-visibility.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,uBAAuB,CAAC,IAAyC,EAAkC;IAClH,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACxD,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IACzE,MAAM,UAAU,GAAI,EAA8B,CAAC,UAAU,CAAC;IAC9D,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1C,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAChC,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,KAAK;YAAE,OAAO,EAAE,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,MAAM,CAAC;AAAA,CACd;AAED,MAAM,UAAU,sBAAsB,CAAC,UAAmD,EAAW;IACpG,OAAO,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAAA,CAChE;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAmD,EAAW;IACnG,OAAO,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAAA,CAC9D","sourcesContent":["export type UiToolVisibility = \"model\" | \"app\";\n\nexport function extractUiToolVisibility(meta: Record<string, unknown> | undefined): UiToolVisibility[] | undefined {\n\tif (!meta || typeof meta !== \"object\") return undefined;\n\tconst ui = meta.ui;\n\tif (!ui || typeof ui !== \"object\" || Array.isArray(ui)) return undefined;\n\tconst visibility = (ui as Record<string, unknown>).visibility;\n\tif (visibility === undefined) return undefined;\n\tif (!Array.isArray(visibility)) return [];\n\n\tconst values: UiToolVisibility[] = [];\n\tfor (const entry of visibility) {\n\t\tif (entry !== \"model\" && entry !== \"app\") return [];\n\t\tif (!values.includes(entry)) values.push(entry);\n\t}\n\treturn values;\n}\n\nexport function isUiToolVisibleToModel(visibility: readonly UiToolVisibility[] | undefined): boolean {\n\treturn visibility === undefined || visibility.includes(\"model\");\n}\n\nexport function isUiToolCallableByApp(visibility: readonly UiToolVisibility[] | undefined): boolean {\n\treturn visibility === undefined || visibility.includes(\"app\");\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { JSONRPCMessage, Transport } from "@modelcontextprotocol/client";
|
|
2
|
+
/** MCP JSONL transport for an explicitly configured Unix-domain socket. */
|
|
3
|
+
export declare class UnixSocketClientTransport implements Transport {
|
|
4
|
+
private socket;
|
|
5
|
+
private readonly readBuffer;
|
|
6
|
+
onclose?: () => void;
|
|
7
|
+
onerror?: (error: Error) => void;
|
|
8
|
+
onmessage?: (message: JSONRPCMessage) => void;
|
|
9
|
+
private readonly socketPath;
|
|
10
|
+
constructor(socketPath: string);
|
|
11
|
+
start(): Promise<void>;
|
|
12
|
+
close(): Promise<void>;
|
|
13
|
+
send(message: JSONRPCMessage): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=unix-socket-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unix-socket-transport.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/unix-socket-transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAG9E,2EAA2E;AAC3E,qBAAa,yBAA0B,YAAW,SAAS;IAC1D,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAE/C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,YAAY,UAAU,EAAE,MAAM,EAE7B;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAsC3B;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAe3B;IAEK,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAUjD;CACD","sourcesContent":["import { createConnection, type Socket } from \"node:net\";\nimport type { JSONRPCMessage, Transport } from \"@modelcontextprotocol/client\";\nimport { ReadBuffer, serializeMessage } from \"@modelcontextprotocol/client\";\n\n/** MCP JSONL transport for an explicitly configured Unix-domain socket. */\nexport class UnixSocketClientTransport implements Transport {\n\tprivate socket: Socket | undefined;\n\tprivate readonly readBuffer = new ReadBuffer();\n\n\tonclose?: () => void;\n\tonerror?: (error: Error) => void;\n\tonmessage?: (message: JSONRPCMessage) => void;\n\tprivate readonly socketPath: string;\n\n\tconstructor(socketPath: string) {\n\t\tthis.socketPath = socketPath;\n\t}\n\n\tasync start(): Promise<void> {\n\t\tif (this.socket) {\n\t\t\tthrow new Error(\"UnixSocketClientTransport already started\");\n\t\t}\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst socket = createConnection(this.socketPath);\n\t\t\tthis.socket = socket;\n\t\t\tlet connected = false;\n\n\t\t\tsocket.once(\"connect\", () => {\n\t\t\t\tconnected = true;\n\t\t\t\tresolve();\n\t\t\t});\n\t\t\tsocket.on(\"data\", (chunk) => {\n\t\t\t\ttry {\n\t\t\t\t\tthis.readBuffer.append(chunk);\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tconst message = this.readBuffer.readMessage();\n\t\t\t\t\t\tif (message === null) break;\n\t\t\t\t\t\tthis.onmessage?.(message);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst cause = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\tthis.onerror?.(cause);\n\t\t\t\t\tvoid this.close();\n\t\t\t\t}\n\t\t\t});\n\t\t\tsocket.on(\"error\", (error) => {\n\t\t\t\tif (!connected) reject(error);\n\t\t\t\tthis.onerror?.(error);\n\t\t\t});\n\t\t\tsocket.on(\"close\", () => {\n\t\t\t\tif (this.socket === socket) this.socket = undefined;\n\t\t\t\tthis.readBuffer.clear();\n\t\t\t\tthis.onclose?.();\n\t\t\t});\n\t\t});\n\t}\n\n\tasync close(): Promise<void> {\n\t\tconst socket = this.socket;\n\t\tthis.socket = undefined;\n\t\tthis.readBuffer.clear();\n\t\tif (!socket || socket.destroyed) return;\n\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tconst timeout = setTimeout(() => socket.destroy(), 2_000);\n\t\t\ttimeout.unref();\n\t\t\tsocket.once(\"close\", () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve();\n\t\t\t});\n\t\t\tsocket.end();\n\t\t});\n\t}\n\n\tasync send(message: JSONRPCMessage): Promise<void> {\n\t\tconst socket = this.socket;\n\t\tif (!socket || socket.destroyed) throw new Error(\"Unix socket is not connected\");\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tsocket.write(serializeMessage(message), (error) => {\n\t\t\t\tif (error) reject(error);\n\t\t\t\telse resolve();\n\t\t\t});\n\t\t});\n\t}\n}\n"]}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { createConnection } from "node:net";
|
|
2
|
+
import { ReadBuffer, serializeMessage } from "@modelcontextprotocol/client";
|
|
3
|
+
/** MCP JSONL transport for an explicitly configured Unix-domain socket. */
|
|
4
|
+
export class UnixSocketClientTransport {
|
|
5
|
+
socket;
|
|
6
|
+
readBuffer = new ReadBuffer();
|
|
7
|
+
onclose;
|
|
8
|
+
onerror;
|
|
9
|
+
onmessage;
|
|
10
|
+
socketPath;
|
|
11
|
+
constructor(socketPath) {
|
|
12
|
+
this.socketPath = socketPath;
|
|
13
|
+
}
|
|
14
|
+
async start() {
|
|
15
|
+
if (this.socket) {
|
|
16
|
+
throw new Error("UnixSocketClientTransport already started");
|
|
17
|
+
}
|
|
18
|
+
await new Promise((resolve, reject) => {
|
|
19
|
+
const socket = createConnection(this.socketPath);
|
|
20
|
+
this.socket = socket;
|
|
21
|
+
let connected = false;
|
|
22
|
+
socket.once("connect", () => {
|
|
23
|
+
connected = true;
|
|
24
|
+
resolve();
|
|
25
|
+
});
|
|
26
|
+
socket.on("data", (chunk) => {
|
|
27
|
+
try {
|
|
28
|
+
this.readBuffer.append(chunk);
|
|
29
|
+
while (true) {
|
|
30
|
+
const message = this.readBuffer.readMessage();
|
|
31
|
+
if (message === null)
|
|
32
|
+
break;
|
|
33
|
+
this.onmessage?.(message);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
const cause = error instanceof Error ? error : new Error(String(error));
|
|
38
|
+
this.onerror?.(cause);
|
|
39
|
+
void this.close();
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
socket.on("error", (error) => {
|
|
43
|
+
if (!connected)
|
|
44
|
+
reject(error);
|
|
45
|
+
this.onerror?.(error);
|
|
46
|
+
});
|
|
47
|
+
socket.on("close", () => {
|
|
48
|
+
if (this.socket === socket)
|
|
49
|
+
this.socket = undefined;
|
|
50
|
+
this.readBuffer.clear();
|
|
51
|
+
this.onclose?.();
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
async close() {
|
|
56
|
+
const socket = this.socket;
|
|
57
|
+
this.socket = undefined;
|
|
58
|
+
this.readBuffer.clear();
|
|
59
|
+
if (!socket || socket.destroyed)
|
|
60
|
+
return;
|
|
61
|
+
await new Promise((resolve) => {
|
|
62
|
+
const timeout = setTimeout(() => socket.destroy(), 2_000);
|
|
63
|
+
timeout.unref();
|
|
64
|
+
socket.once("close", () => {
|
|
65
|
+
clearTimeout(timeout);
|
|
66
|
+
resolve();
|
|
67
|
+
});
|
|
68
|
+
socket.end();
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
async send(message) {
|
|
72
|
+
const socket = this.socket;
|
|
73
|
+
if (!socket || socket.destroyed)
|
|
74
|
+
throw new Error("Unix socket is not connected");
|
|
75
|
+
await new Promise((resolve, reject) => {
|
|
76
|
+
socket.write(serializeMessage(message), (error) => {
|
|
77
|
+
if (error)
|
|
78
|
+
reject(error);
|
|
79
|
+
else
|
|
80
|
+
resolve();
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=unix-socket-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unix-socket-transport.js","sourceRoot":"","sources":["../../../src/extensions/mcp/unix-socket-transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { createConnection, type Socket } from \"node:net\";\nimport type { JSONRPCMessage, Transport } from \"@modelcontextprotocol/client\";\nimport { ReadBuffer, serializeMessage } from \"@modelcontextprotocol/client\";\n\n/** MCP JSONL transport for an explicitly configured Unix-domain socket. */\nexport class UnixSocketClientTransport implements Transport {\n\tprivate socket: Socket | undefined;\n\tprivate readonly readBuffer = new ReadBuffer();\n\n\tonclose?: () => void;\n\tonerror?: (error: Error) => void;\n\tonmessage?: (message: JSONRPCMessage) => void;\n\tprivate readonly socketPath: string;\n\n\tconstructor(socketPath: string) {\n\t\tthis.socketPath = socketPath;\n\t}\n\n\tasync start(): Promise<void> {\n\t\tif (this.socket) {\n\t\t\tthrow new Error(\"UnixSocketClientTransport already started\");\n\t\t}\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst socket = createConnection(this.socketPath);\n\t\t\tthis.socket = socket;\n\t\t\tlet connected = false;\n\n\t\t\tsocket.once(\"connect\", () => {\n\t\t\t\tconnected = true;\n\t\t\t\tresolve();\n\t\t\t});\n\t\t\tsocket.on(\"data\", (chunk) => {\n\t\t\t\ttry {\n\t\t\t\t\tthis.readBuffer.append(chunk);\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tconst message = this.readBuffer.readMessage();\n\t\t\t\t\t\tif (message === null) break;\n\t\t\t\t\t\tthis.onmessage?.(message);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst cause = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\tthis.onerror?.(cause);\n\t\t\t\t\tvoid this.close();\n\t\t\t\t}\n\t\t\t});\n\t\t\tsocket.on(\"error\", (error) => {\n\t\t\t\tif (!connected) reject(error);\n\t\t\t\tthis.onerror?.(error);\n\t\t\t});\n\t\t\tsocket.on(\"close\", () => {\n\t\t\t\tif (this.socket === socket) this.socket = undefined;\n\t\t\t\tthis.readBuffer.clear();\n\t\t\t\tthis.onclose?.();\n\t\t\t});\n\t\t});\n\t}\n\n\tasync close(): Promise<void> {\n\t\tconst socket = this.socket;\n\t\tthis.socket = undefined;\n\t\tthis.readBuffer.clear();\n\t\tif (!socket || socket.destroyed) return;\n\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tconst timeout = setTimeout(() => socket.destroy(), 2_000);\n\t\t\ttimeout.unref();\n\t\t\tsocket.once(\"close\", () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve();\n\t\t\t});\n\t\t\tsocket.end();\n\t\t});\n\t}\n\n\tasync send(message: JSONRPCMessage): Promise<void> {\n\t\tconst socket = this.socket;\n\t\tif (!socket || socket.destroyed) throw new Error(\"Unix socket is not connected\");\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tsocket.write(serializeMessage(message), (error) => {\n\t\t\t\tif (error) reject(error);\n\t\t\t\telse resolve();\n\t\t\t});\n\t\t});\n\t}\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "../../core/extensions/types.ts";
|
|
2
|
+
import type { McpConfig, ServerEntry } from "./types.ts";
|
|
3
|
+
export declare function openUrl(nexus: ExtensionAPI, url: string, browser?: string, signal?: AbortSignal): Promise<void>;
|
|
4
|
+
export declare function openPath(nexus: ExtensionAPI, targetPath: string): Promise<void>;
|
|
5
|
+
export declare function parallelLimit<T, R>(items: T[], limit: number, fn: (item: T) => Promise<R>): Promise<R[]>;
|
|
6
|
+
export declare function getConfigPathFromArgv(): string | undefined;
|
|
7
|
+
export declare function interpolateEnvVars(value: string): string;
|
|
8
|
+
export declare function toStringRecord(value: unknown): Record<string, string> | undefined;
|
|
9
|
+
export declare function interpolateEnvRecord(values: Record<string, string> | undefined): Record<string, string> | undefined;
|
|
10
|
+
/** Resolve a secret value, executing only a single leading `!` command marker. */
|
|
11
|
+
export declare function resolveCommandSecret(value: string, context: string): string;
|
|
12
|
+
export declare function resolveCommandSecret(value: undefined, context: string): undefined;
|
|
13
|
+
export declare function resolveCommandSecret(value: string | undefined, context: string): string | undefined;
|
|
14
|
+
/** Resolve command markers in a configured record without mutating the input. */
|
|
15
|
+
export declare function resolveCommandSecretsRecord(values: Record<string, string> | undefined, context: (key: string) => string): Record<string, string> | undefined;
|
|
16
|
+
export declare function resolveServerUrl(definition: Pick<ServerEntry, "url">): string | undefined;
|
|
17
|
+
export declare function resolveConfigPath(value: string | undefined): string | undefined;
|
|
18
|
+
export declare function resolveBearerToken(definition: Pick<ServerEntry, "bearerToken" | "bearerTokenEnv">): string | undefined;
|
|
19
|
+
/** Remove OSC control strings, including payloads that have no terminator. */
|
|
20
|
+
export declare function stripOscSequences(text: string): string;
|
|
21
|
+
export declare function sanitizeTerminalText(text: string): string;
|
|
22
|
+
export declare function formatTerminalError(error: unknown): string;
|
|
23
|
+
export declare function truncateAtWord(text: string, target: number): string;
|
|
24
|
+
export declare function normalizeDirectToolInputSchema(schema: unknown): Record<string, unknown>;
|
|
25
|
+
export declare function normalizeToolArguments(value: unknown, context?: string): Record<string, unknown>;
|
|
26
|
+
export declare function formatAuthRequiredMessage(config: Pick<McpConfig, "settings">, serverName: string, defaultMessage: string): string;
|
|
27
|
+
export declare function formatMcpStatus(config: Pick<McpConfig, "settings">, message: string): string | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Extract the adapter-owned UI stream mode from tool metadata.
|
|
30
|
+
*/
|
|
31
|
+
export declare function extractToolUiStreamMode(toolMeta: Record<string, unknown> | undefined): "eager" | "stream-first" | undefined;
|
|
32
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { homedir, platform } from \"node:os\";\nimport { extname, isAbsolute, join } from \"node:path\";\nimport type { ExtensionAPI } from \"../../core/extensions/types.ts\";\nimport type { McpConfig, ServerEntry } from \"./types.ts\";\n\nasync function execOpen(nexus: ExtensionAPI, target: string, browser?: string, signal?: AbortSignal) {\n\tconst os = platform();\n\n\tif (os === \"darwin\") {\n\t\tif (browser) {\n\t\t\t// An absolute executable path (e.g. from $BROWSER) names a launcher\n\t\t\t// binary. App bundles still go through `open -a`, which handles them.\n\t\t\treturn isAbsolute(browser) && extname(browser).toLowerCase() !== \".app\"\n\t\t\t\t? nexus.exec(browser, [target], signal ? { signal } : {})\n\t\t\t\t: nexus.exec(\"open\", [\"-a\", browser, target], signal ? { signal } : {});\n\t\t}\n\t\treturn nexus.exec(\"open\", [target], signal ? { signal } : {});\n\t}\n\tif (os === \"win32\") {\n\t\treturn browser\n\t\t\t? nexus.exec(\"cmd\", [\"/c\", \"start\", \"\", browser, target], signal ? { signal } : {})\n\t\t\t: nexus.exec(\"cmd\", [\"/c\", \"start\", \"\", target], signal ? { signal } : {});\n\t}\n\treturn browser\n\t\t? nexus.exec(browser, [target], signal ? { signal } : {})\n\t\t: nexus.exec(\"xdg-open\", [target], signal ? { signal } : {});\n}\n\nexport async function openUrl(nexus: ExtensionAPI, url: string, browser?: string, signal?: AbortSignal): Promise<void> {\n\tconst result = await execOpen(nexus, url, browser, signal);\n\tif (result.code !== 0) {\n\t\tthrow new Error(result.stderr || `Failed to open browser (exit code ${result.code})`);\n\t}\n}\n\nexport async function openPath(nexus: ExtensionAPI, targetPath: string): Promise<void> {\n\tconst result = await execOpen(nexus, targetPath);\n\tif (result.code !== 0) {\n\t\tthrow new Error(result.stderr || `Failed to open path (exit code ${result.code})`);\n\t}\n}\n\nexport async function parallelLimit<T, R>(items: T[], limit: number, fn: (item: T) => Promise<R>): Promise<R[]> {\n\tconst results: R[] = [];\n\tconst iterator = items.entries();\n\n\tasync function worker() {\n\t\twhile (true) {\n\t\t\tconst next = iterator.next();\n\t\t\tif (next.done) return;\n\t\t\tconst [index, item] = next.value;\n\t\t\tresults[index] = await fn(item);\n\t\t}\n\t}\n\n\tconst workers = Array(Math.min(limit, items.length))\n\t\t.fill(null)\n\t\t.map(() => worker());\n\tawait Promise.all(workers);\n\treturn results;\n}\n\nexport function getConfigPathFromArgv(): string | undefined {\n\tconst idx = process.argv.indexOf(\"--mcp-config\");\n\tif (idx >= 0 && idx + 1 < process.argv.length) {\n\t\treturn process.argv[idx + 1];\n\t}\n\treturn undefined;\n}\n\nexport function interpolateEnvVars(value: string): string {\n\treturn value\n\t\t.replace(/\\$\\{(\\w+)\\}/g, (_, name) => process.env[name] ?? \"\")\n\t\t.replace(/\\$env:(\\w+)/g, (_, name) => process.env[name] ?? \"\")\n\t\t.replace(/\\{env:(\\w+)\\}/g, (_, name) => process.env[name] ?? \"\");\n}\n\nfunction getMissingEnvVars(value: string): string[] {\n\tconst missing = new Set<string>();\n\tfor (const match of value.matchAll(/\\$\\{(\\w+)\\}|\\$env:(\\w+)|\\{env:(\\w+)\\}/g)) {\n\t\tconst name = match[1] ?? match[2] ?? match[3];\n\t\tif (name && process.env[name] === undefined) {\n\t\t\tmissing.add(name);\n\t\t}\n\t}\n\treturn [...missing];\n}\n\nexport function toStringRecord(value: unknown): Record<string, string> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\n\tconst result: Record<string, string> = {};\n\tfor (const [key, entry] of Object.entries(value)) {\n\t\tif (typeof entry === \"string\") result[key] = entry;\n\t}\n\treturn Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction interpolateSecretExpression(value: string): string {\n\tif (value.startsWith(\"!!\")) return interpolateEnvVars(value.slice(1));\n\treturn value.startsWith(\"!\") ? value : interpolateEnvVars(value);\n}\n\nexport function interpolateEnvRecord(values: Record<string, string> | undefined): Record<string, string> | undefined {\n\tif (!values) return undefined;\n\n\treturn Object.fromEntries(Object.entries(values).map(([key, value]) => [key, interpolateSecretExpression(value)]));\n}\n\nconst COMMAND_SECRET_TIMEOUT_MS = 10_000;\nconst COMMAND_SECRET_MAX_OUTPUT_BYTES = 1024 * 1024;\n\n/** Resolve a secret value, executing only a single leading `!` command marker. */\nexport function resolveCommandSecret(value: string, context: string): string;\nexport function resolveCommandSecret(value: undefined, context: string): undefined;\nexport function resolveCommandSecret(value: string | undefined, context: string): string | undefined;\nexport function resolveCommandSecret(value: string | undefined, context: string): string | undefined {\n\tif (value === undefined) return undefined;\n\tif (value.startsWith(\"!!\")) return interpolateEnvVars(value.slice(1));\n\tif (!value.startsWith(\"!\")) return interpolateEnvVars(value);\n\n\tconst result = spawnSync(value.slice(1), {\n\t\tshell: true,\n\t\tencoding: \"utf8\",\n\t\ttimeout: COMMAND_SECRET_TIMEOUT_MS,\n\t\tmaxBuffer: COMMAND_SECRET_MAX_OUTPUT_BYTES,\n\t\tstdio: [\"ignore\", \"pipe\", \"ignore\"],\n\t\twindowsHide: true,\n\t});\n\tif (result.error) {\n\t\tconst code = (result.error as NodeJS.ErrnoException).code;\n\t\tconst reason =\n\t\t\tcode === \"ETIMEDOUT\"\n\t\t\t\t? \"command timed out after 10 seconds\"\n\t\t\t\t: code === \"ENOBUFS\"\n\t\t\t\t\t? \"command output exceeded 1 MiB\"\n\t\t\t\t\t: \"command failed to start\";\n\t\tthrow new Error(`Failed to resolve ${context}: ${reason}`);\n\t}\n\tif (result.status !== 0) {\n\t\tthrow new Error(`Failed to resolve ${context}: command exited with code ${result.status ?? \"unknown\"}`);\n\t}\n\n\tconst resolved = result.stdout.trim();\n\tif (!resolved) throw new Error(`Failed to resolve ${context}: command returned empty output`);\n\treturn resolved;\n}\n\n/** Resolve command markers in a configured record without mutating the input. */\nexport function resolveCommandSecretsRecord(\n\tvalues: Record<string, string> | undefined,\n\tcontext: (key: string) => string,\n): Record<string, string> | undefined {\n\tif (!values) return undefined;\n\n\treturn Object.fromEntries(\n\t\tObject.entries(values).map(([key, value]) => [key, resolveCommandSecret(value, context(key))]),\n\t);\n}\n\nexport function resolveServerUrl(definition: Pick<ServerEntry, \"url\">): string | undefined {\n\tif (definition.url == null) return undefined;\n\tif (typeof definition.url !== \"string\") {\n\t\tthrow new Error(\"MCP server URL must be a string\");\n\t}\n\n\tconst missing = getMissingEnvVars(definition.url);\n\tif (missing.length > 0) {\n\t\tthrow new Error(\n\t\t\t`Missing environment variable${missing.length === 1 ? \"\" : \"s\"} in MCP server URL: ${missing.join(\", \")}`,\n\t\t);\n\t}\n\n\tconst resolved = interpolateEnvVars(definition.url);\n\ttry {\n\t\tnew URL(resolved);\n\t} catch (error) {\n\t\tthrow new Error(`Invalid MCP server URL after environment interpolation: ${resolved}`, { cause: error });\n\t}\n\treturn resolved;\n}\n\nexport function resolveConfigPath(value: string | undefined): string | undefined {\n\tif (value === undefined) return undefined;\n\n\tconst resolved = interpolateEnvVars(value);\n\tif (resolved === \"~\") return homedir();\n\tif (resolved.startsWith(\"~/\") || resolved.startsWith(\"~\\\\\")) {\n\t\treturn join(homedir(), resolved.slice(2));\n\t}\n\treturn resolved;\n}\n\nexport function resolveBearerToken(\n\tdefinition: Pick<ServerEntry, \"bearerToken\" | \"bearerTokenEnv\">,\n): string | undefined {\n\tif (definition.bearerToken !== undefined) {\n\t\treturn interpolateSecretExpression(definition.bearerToken);\n\t}\n\treturn definition.bearerTokenEnv ? process.env[definition.bearerTokenEnv] : undefined;\n}\n\n/** Remove OSC control strings, including payloads that have no terminator. */\nexport function stripOscSequences(text: string): string {\n\tlet result = \"\";\n\tlet index = 0;\n\twhile (index < text.length) {\n\t\tconst isEscOsc = text.charCodeAt(index) === 0x1b && text[index + 1] === \"]\";\n\t\tconst isC1Osc = text.charCodeAt(index) === 0x9d;\n\t\tif (!isEscOsc && !isC1Osc) {\n\t\t\tresult += text[index++];\n\t\t\tcontinue;\n\t\t}\n\n\t\tindex += isEscOsc ? 2 : 1;\n\t\twhile (index < text.length) {\n\t\t\tconst code = text.charCodeAt(index++);\n\t\t\tif (code === 0x07 || code === 0x9c) break;\n\t\t\tif (code === 0x1b && text[index] === \"\\\\\") {\n\t\t\t\tindex++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n\nexport function sanitizeTerminalText(text: string): string {\n\treturn stripOscSequences(text)\n\t\t.replace(/(?:\\x1b\\[[0-?]*[ -/]*[@-~]|\\x1b[@-Z\\\\-_])/g, \"\")\n\t\t.replace(/[\\u0000-\\u001f\\u007f-\\u009f]+/g, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\nexport function formatTerminalError(error: unknown): string {\n\tconst messages: string[] = [];\n\tconst seen = new Set<unknown>();\n\tconst collect = (value: unknown) => {\n\t\tif (seen.has(value)) return;\n\t\tif ((typeof value === \"object\" && value !== null) || typeof value === \"function\") seen.add(value);\n\n\t\tif (value instanceof AggregateError) {\n\t\t\tconst countBefore = messages.length;\n\t\t\tfor (const nested of value.errors) collect(nested);\n\t\t\tif (value.cause !== undefined) collect(value.cause);\n\t\t\tif (messages.length === countBefore && value.message) messages.push(value.message);\n\t\t\treturn;\n\t\t}\n\t\tif (value instanceof Error) {\n\t\t\tif (value.message) messages.push(value.message);\n\t\t\tif (value.cause !== undefined) collect(value.cause);\n\t\t\treturn;\n\t\t}\n\t\tmessages.push(String(value));\n\t};\n\n\tcollect(error);\n\treturn sanitizeTerminalText([...new Set(messages)].join(\": \"));\n}\n\nexport function truncateAtWord(text: string, target: number): string {\n\tif (!text || text.length <= target) return text;\n\n\tconst truncated = text.slice(0, target);\n\tconst lastSpace = truncated.lastIndexOf(\" \");\n\n\tif (lastSpace > target * 0.6) {\n\t\treturn `${truncated.slice(0, lastSpace)}...`;\n\t}\n\n\treturn `${truncated}...`;\n}\n\nexport function normalizeDirectToolInputSchema(schema: unknown): Record<string, unknown> {\n\tconst inputSchema =\n\t\tschema && typeof schema === \"object\" && !Array.isArray(schema)\n\t\t\t? (schema as Record<string, unknown>)\n\t\t\t: { type: \"object\", properties: {} };\n\tconst normalized = { ...inputSchema };\n\tdelete normalized.$schema;\n\tdelete normalized.additionalProperties;\n\treturn normalized;\n}\n\nexport function normalizeToolArguments(value: unknown, context = \"tool arguments\"): Record<string, unknown> {\n\tif (value === undefined || value === null || value === \"\") return {};\n\n\tif (typeof value === \"string\") {\n\t\tconst trimmed = value.trim();\n\t\tif (trimmed === \"\") return {};\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(trimmed);\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`${context}: invalid args JSON (${error instanceof SyntaxError ? error.message : String(error)}); ` +\n\t\t\t\t\t`pass args as a JSON object, or as a valid JSON string encoding one`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\t\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n\t\t\tthrow new Error(`${context}: expected a JSON object, got ${Array.isArray(parsed) ? \"array\" : typeof parsed}`);\n\t\t}\n\t\treturn parsed as Record<string, unknown>;\n\t}\n\n\tif (typeof value !== \"object\" || Array.isArray(value)) {\n\t\tthrow new Error(`${context}: expected a JSON object, got ${Array.isArray(value) ? \"array\" : typeof value}`);\n\t}\n\n\tassertJsonSerializable(value, context);\n\ttry {\n\t\treturn JSON.parse(JSON.stringify(value)) as Record<string, unknown>;\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`${context}: value is not JSON-serializable: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t{ cause: error },\n\t\t);\n\t}\n}\n\nfunction assertJsonSerializable(value: unknown, context: string, path = \"\"): void {\n\tif (value === null) return;\n\tif (typeof value === \"string\" || typeof value === \"boolean\") return;\n\tif (typeof value === \"number\") {\n\t\tif (!Number.isFinite(value)) throw new Error(`${context}: value at ${path || \"root\"} is not a finite number`);\n\t\treturn;\n\t}\n\tif (Array.isArray(value)) {\n\t\tfor (const [index, item] of value.entries()) assertJsonSerializable(item, context, `${path}[${index}]`);\n\t\treturn;\n\t}\n\tif (typeof value === \"object\") {\n\t\tif (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) {\n\t\t\tthrow new Error(`${context}: value at ${path || \"root\"} is not a plain JSON object`);\n\t\t}\n\t\tif (Object.getOwnPropertySymbols(value).length > 0) {\n\t\t\tthrow new Error(`${context}: value at ${path || \"root\"} has symbol keys`);\n\t\t}\n\t\tfor (const [key, item] of Object.entries(value)) {\n\t\t\tassertJsonSerializable(item, context, path ? `${path}.${key}` : key);\n\t\t}\n\t\treturn;\n\t}\n\tthrow new Error(`${context}: value at ${path || \"root\"} is not JSON-serializable`);\n}\n\nexport function formatAuthRequiredMessage(\n\tconfig: Pick<McpConfig, \"settings\">,\n\tserverName: string,\n\tdefaultMessage: string,\n): string {\n\tconst template = config.settings?.authRequiredMessage;\n\treturn template ? template.replaceAll(`\\${server}`, serverName) : defaultMessage;\n}\n\nexport function formatMcpStatus(config: Pick<McpConfig, \"settings\">, message: string): string | undefined {\n\tif (config.settings?.mcpFooterStatus === \"off\") return undefined;\n\treturn `${config.settings?.showStatusIcon === false ? \"MCP: \" : \"🔌 MCP: \"}${message}`;\n}\n\n/**\n * Extract the adapter-owned UI stream mode from tool metadata.\n */\nexport function extractToolUiStreamMode(\n\ttoolMeta: Record<string, unknown> | undefined,\n): \"eager\" | \"stream-first\" | undefined {\n\tconst uiMeta = toolMeta?.ui;\n\tif (!uiMeta || typeof uiMeta !== \"object\") return undefined;\n\tconst streamMode = (uiMeta as Record<string, unknown>)[\"nexus-mcp.streamMode\"];\n\tif (streamMode === \"eager\" || streamMode === \"stream-first\") {\n\t\treturn streamMode;\n\t}\n\treturn undefined;\n}\n"]}
|