@nghyane/arcane 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3 -0
- package/README.md +12 -0
- package/examples/README.md +21 -0
- package/examples/custom-tools/README.md +109 -0
- package/examples/custom-tools/hello/index.ts +20 -0
- package/examples/custom-tools/todo/index.ts +206 -0
- package/examples/extensions/README.md +143 -0
- package/examples/extensions/api-demo.ts +89 -0
- package/examples/extensions/chalk-logger.ts +25 -0
- package/examples/extensions/hello.ts +32 -0
- package/examples/extensions/pirate.ts +43 -0
- package/examples/extensions/plan-mode.ts +550 -0
- package/examples/extensions/reload-runtime.ts +37 -0
- package/examples/extensions/todo.ts +296 -0
- package/examples/extensions/tools.ts +144 -0
- package/examples/extensions/with-deps/index.ts +35 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +16 -0
- package/examples/hooks/README.md +56 -0
- package/examples/hooks/auto-commit-on-exit.ts +48 -0
- package/examples/hooks/confirm-destructive.ts +58 -0
- package/examples/hooks/custom-compaction.ts +116 -0
- package/examples/hooks/dirty-repo-guard.ts +51 -0
- package/examples/hooks/file-trigger.ts +40 -0
- package/examples/hooks/git-checkpoint.ts +52 -0
- package/examples/hooks/handoff.ts +150 -0
- package/examples/hooks/permission-gate.ts +33 -0
- package/examples/hooks/protected-paths.ts +29 -0
- package/examples/hooks/qna.ts +119 -0
- package/examples/hooks/status-line.ts +39 -0
- package/examples/sdk/01-minimal.ts +21 -0
- package/examples/sdk/02-custom-model.ts +49 -0
- package/examples/sdk/03-custom-prompt.ts +43 -0
- package/examples/sdk/04-skills.ts +43 -0
- package/examples/sdk/06-extensions.ts +80 -0
- package/examples/sdk/06-hooks.ts +61 -0
- package/examples/sdk/07-context-files.ts +35 -0
- package/examples/sdk/08-prompt-templates.ts +36 -0
- package/examples/sdk/08-slash-commands.ts +41 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
- package/examples/sdk/11-sessions.ts +47 -0
- package/examples/sdk/README.md +150 -0
- package/package.json +464 -0
- package/scripts/format-prompts.ts +184 -0
- package/scripts/generate-docs-index.ts +40 -0
- package/scripts/generate-template.ts +32 -0
- package/src/bun-imports.d.ts +22 -0
- package/src/capability/context-file.ts +39 -0
- package/src/capability/extension-module.ts +33 -0
- package/src/capability/extension.ts +47 -0
- package/src/capability/fs.ts +89 -0
- package/src/capability/hook.ts +39 -0
- package/src/capability/index.ts +432 -0
- package/src/capability/instruction.ts +36 -0
- package/src/capability/mcp.ts +60 -0
- package/src/capability/prompt.ts +34 -0
- package/src/capability/rule.ts +223 -0
- package/src/capability/settings.ts +34 -0
- package/src/capability/skill.ts +48 -0
- package/src/capability/slash-command.ts +39 -0
- package/src/capability/ssh.ts +41 -0
- package/src/capability/system-prompt.ts +34 -0
- package/src/capability/tool.ts +37 -0
- package/src/capability/types.ts +156 -0
- package/src/cli/args.ts +259 -0
- package/src/cli/config-cli.ts +357 -0
- package/src/cli/file-processor.ts +124 -0
- package/src/cli/grep-cli.ts +152 -0
- package/src/cli/jupyter-cli.ts +106 -0
- package/src/cli/list-models.ts +103 -0
- package/src/cli/plugin-cli.ts +661 -0
- package/src/cli/session-picker.ts +42 -0
- package/src/cli/setup-cli.ts +376 -0
- package/src/cli/shell-cli.ts +174 -0
- package/src/cli/ssh-cli.ts +179 -0
- package/src/cli/stats-cli.ts +197 -0
- package/src/cli/update-cli.ts +286 -0
- package/src/cli/web-search-cli.ts +143 -0
- package/src/cli.ts +65 -0
- package/src/commands/commit.ts +36 -0
- package/src/commands/config.ts +51 -0
- package/src/commands/grep.ts +41 -0
- package/src/commands/jupyter.ts +32 -0
- package/src/commands/launch.ts +139 -0
- package/src/commands/plugin.ts +70 -0
- package/src/commands/setup.ts +42 -0
- package/src/commands/shell.ts +29 -0
- package/src/commands/ssh.ts +60 -0
- package/src/commands/stats.ts +29 -0
- package/src/commands/update.ts +21 -0
- package/src/commands/web-search.ts +42 -0
- package/src/commit/agentic/agent.ts +311 -0
- package/src/commit/agentic/fallback.ts +96 -0
- package/src/commit/agentic/index.ts +359 -0
- package/src/commit/agentic/prompts/analyze-file.md +22 -0
- package/src/commit/agentic/prompts/session-user.md +25 -0
- package/src/commit/agentic/prompts/split-confirm.md +1 -0
- package/src/commit/agentic/prompts/system.md +38 -0
- package/src/commit/agentic/state.ts +69 -0
- package/src/commit/agentic/tools/analyze-file.ts +118 -0
- package/src/commit/agentic/tools/git-file-diff.ts +194 -0
- package/src/commit/agentic/tools/git-hunk.ts +50 -0
- package/src/commit/agentic/tools/git-overview.ts +84 -0
- package/src/commit/agentic/tools/index.ts +56 -0
- package/src/commit/agentic/tools/propose-changelog.ts +128 -0
- package/src/commit/agentic/tools/propose-commit.ts +154 -0
- package/src/commit/agentic/tools/recent-commits.ts +81 -0
- package/src/commit/agentic/tools/split-commit.ts +280 -0
- package/src/commit/agentic/topo-sort.ts +44 -0
- package/src/commit/agentic/trivial.ts +51 -0
- package/src/commit/agentic/validation.ts +200 -0
- package/src/commit/analysis/conventional.ts +165 -0
- package/src/commit/analysis/index.ts +4 -0
- package/src/commit/analysis/scope.ts +242 -0
- package/src/commit/analysis/summary.ts +112 -0
- package/src/commit/analysis/validation.ts +66 -0
- package/src/commit/changelog/detect.ts +37 -0
- package/src/commit/changelog/generate.ts +110 -0
- package/src/commit/changelog/index.ts +234 -0
- package/src/commit/changelog/parse.ts +44 -0
- package/src/commit/cli.ts +93 -0
- package/src/commit/git/diff.ts +148 -0
- package/src/commit/git/errors.ts +9 -0
- package/src/commit/git/index.ts +211 -0
- package/src/commit/git/operations.ts +54 -0
- package/src/commit/index.ts +5 -0
- package/src/commit/map-reduce/index.ts +64 -0
- package/src/commit/map-reduce/map-phase.ts +178 -0
- package/src/commit/map-reduce/reduce-phase.ts +145 -0
- package/src/commit/map-reduce/utils.ts +9 -0
- package/src/commit/message.ts +11 -0
- package/src/commit/model-selection.ts +69 -0
- package/src/commit/pipeline.ts +243 -0
- package/src/commit/prompts/analysis-system.md +148 -0
- package/src/commit/prompts/analysis-user.md +38 -0
- package/src/commit/prompts/changelog-system.md +50 -0
- package/src/commit/prompts/changelog-user.md +18 -0
- package/src/commit/prompts/file-observer-system.md +24 -0
- package/src/commit/prompts/file-observer-user.md +8 -0
- package/src/commit/prompts/reduce-system.md +50 -0
- package/src/commit/prompts/reduce-user.md +17 -0
- package/src/commit/prompts/summary-retry.md +3 -0
- package/src/commit/prompts/summary-system.md +38 -0
- package/src/commit/prompts/summary-user.md +13 -0
- package/src/commit/prompts/types-description.md +2 -0
- package/src/commit/types.ts +109 -0
- package/src/commit/utils/exclusions.ts +42 -0
- package/src/config/file-lock.ts +121 -0
- package/src/config/keybindings.ts +280 -0
- package/src/config/model-registry.ts +1140 -0
- package/src/config/model-resolver.ts +812 -0
- package/src/config/prompt-templates.ts +526 -0
- package/src/config/resolve-config-value.ts +92 -0
- package/src/config/settings-schema.ts +1236 -0
- package/src/config/settings.ts +706 -0
- package/src/config.ts +414 -0
- package/src/cursor.ts +239 -0
- package/src/debug/index.ts +431 -0
- package/src/debug/log-formatting.ts +60 -0
- package/src/debug/log-viewer.ts +903 -0
- package/src/debug/profiler.ts +158 -0
- package/src/debug/report-bundle.ts +366 -0
- package/src/debug/system-info.ts +112 -0
- package/src/discovery/agents-md.ts +68 -0
- package/src/discovery/agents.ts +199 -0
- package/src/discovery/builtin.ts +815 -0
- package/src/discovery/claude-plugins.ts +205 -0
- package/src/discovery/claude.ts +506 -0
- package/src/discovery/cline.ts +83 -0
- package/src/discovery/codex.ts +532 -0
- package/src/discovery/cursor.ts +218 -0
- package/src/discovery/gemini.ts +395 -0
- package/src/discovery/github.ts +117 -0
- package/src/discovery/helpers.ts +698 -0
- package/src/discovery/index.ts +89 -0
- package/src/discovery/mcp-json.ts +156 -0
- package/src/discovery/opencode.ts +394 -0
- package/src/discovery/ssh.ts +160 -0
- package/src/discovery/vscode.ts +103 -0
- package/src/discovery/windsurf.ts +145 -0
- package/src/exa/company.ts +57 -0
- package/src/exa/index.ts +62 -0
- package/src/exa/linkedin.ts +57 -0
- package/src/exa/mcp-client.ts +289 -0
- package/src/exa/render.ts +244 -0
- package/src/exa/researcher.ts +89 -0
- package/src/exa/search.ts +330 -0
- package/src/exa/types.ts +166 -0
- package/src/exa/websets.ts +247 -0
- package/src/exec/bash-executor.ts +184 -0
- package/src/exec/exec.ts +53 -0
- package/src/export/custom-share.ts +65 -0
- package/src/export/html/index.ts +162 -0
- package/src/export/html/template.css +889 -0
- package/src/export/html/template.generated.ts +2 -0
- package/src/export/html/template.html +45 -0
- package/src/export/html/template.js +1329 -0
- package/src/export/html/template.macro.ts +24 -0
- package/src/export/html/vendor/highlight.min.js +1213 -0
- package/src/export/html/vendor/marked.min.js +6 -0
- package/src/export/ttsr.ts +434 -0
- package/src/extensibility/custom-commands/bundled/review/index.ts +433 -0
- package/src/extensibility/custom-commands/index.ts +15 -0
- package/src/extensibility/custom-commands/loader.ts +231 -0
- package/src/extensibility/custom-commands/types.ts +111 -0
- package/src/extensibility/custom-tools/index.ts +22 -0
- package/src/extensibility/custom-tools/loader.ts +235 -0
- package/src/extensibility/custom-tools/types.ts +226 -0
- package/src/extensibility/custom-tools/wrapper.ts +45 -0
- package/src/extensibility/extensions/index.ts +136 -0
- package/src/extensibility/extensions/loader.ts +520 -0
- package/src/extensibility/extensions/runner.ts +774 -0
- package/src/extensibility/extensions/types.ts +1293 -0
- package/src/extensibility/extensions/wrapper.ts +188 -0
- package/src/extensibility/hooks/index.ts +16 -0
- package/src/extensibility/hooks/loader.ts +273 -0
- package/src/extensibility/hooks/runner.ts +441 -0
- package/src/extensibility/hooks/tool-wrapper.ts +106 -0
- package/src/extensibility/hooks/types.ts +817 -0
- package/src/extensibility/plugins/doctor.ts +65 -0
- package/src/extensibility/plugins/git-url.ts +281 -0
- package/src/extensibility/plugins/index.ts +33 -0
- package/src/extensibility/plugins/installer.ts +192 -0
- package/src/extensibility/plugins/loader.ts +338 -0
- package/src/extensibility/plugins/manager.ts +716 -0
- package/src/extensibility/plugins/parser.ts +105 -0
- package/src/extensibility/plugins/types.ts +190 -0
- package/src/extensibility/skills.ts +385 -0
- package/src/extensibility/slash-commands.ts +287 -0
- package/src/extensibility/tool-proxy.ts +25 -0
- package/src/index.ts +275 -0
- package/src/internal-urls/agent-protocol.ts +136 -0
- package/src/internal-urls/artifact-protocol.ts +97 -0
- package/src/internal-urls/docs-index.generated.ts +54 -0
- package/src/internal-urls/docs-protocol.ts +84 -0
- package/src/internal-urls/index.ts +31 -0
- package/src/internal-urls/json-query.ts +126 -0
- package/src/internal-urls/memory-protocol.ts +133 -0
- package/src/internal-urls/router.ts +70 -0
- package/src/internal-urls/rule-protocol.ts +55 -0
- package/src/internal-urls/skill-protocol.ts +111 -0
- package/src/internal-urls/types.ts +52 -0
- package/src/ipy/executor.ts +556 -0
- package/src/ipy/gateway-coordinator.ts +426 -0
- package/src/ipy/kernel.ts +892 -0
- package/src/ipy/modules.ts +109 -0
- package/src/ipy/prelude.py +831 -0
- package/src/ipy/prelude.ts +3 -0
- package/src/ipy/runtime.ts +222 -0
- package/src/lsp/client.ts +867 -0
- package/src/lsp/clients/biome-client.ts +202 -0
- package/src/lsp/clients/index.ts +50 -0
- package/src/lsp/clients/lsp-linter-client.ts +93 -0
- package/src/lsp/clients/swiftlint-client.ts +120 -0
- package/src/lsp/config.ts +397 -0
- package/src/lsp/defaults.json +464 -0
- package/src/lsp/edits.ts +109 -0
- package/src/lsp/index.ts +1268 -0
- package/src/lsp/lspmux.ts +250 -0
- package/src/lsp/render.ts +689 -0
- package/src/lsp/types.ts +414 -0
- package/src/lsp/utils.ts +549 -0
- package/src/main.ts +773 -0
- package/src/mcp/client.ts +239 -0
- package/src/mcp/config-writer.ts +215 -0
- package/src/mcp/config.ts +363 -0
- package/src/mcp/index.ts +55 -0
- package/src/mcp/json-rpc.ts +84 -0
- package/src/mcp/loader.ts +124 -0
- package/src/mcp/manager.ts +490 -0
- package/src/mcp/oauth-discovery.ts +274 -0
- package/src/mcp/oauth-flow.ts +229 -0
- package/src/mcp/render.ts +123 -0
- package/src/mcp/tool-bridge.ts +372 -0
- package/src/mcp/tool-cache.ts +121 -0
- package/src/mcp/transports/http.ts +332 -0
- package/src/mcp/transports/index.ts +6 -0
- package/src/mcp/transports/stdio.ts +281 -0
- package/src/mcp/types.ts +248 -0
- package/src/memories/index.ts +1099 -0
- package/src/memories/storage.ts +563 -0
- package/src/modes/components/agent-dashboard.ts +1130 -0
- package/src/modes/components/assistant-message.ts +144 -0
- package/src/modes/components/bash-execution.ts +218 -0
- package/src/modes/components/bordered-loader.ts +41 -0
- package/src/modes/components/branch-summary-message.ts +45 -0
- package/src/modes/components/codemode-group.ts +369 -0
- package/src/modes/components/compaction-summary-message.ts +51 -0
- package/src/modes/components/countdown-timer.ts +46 -0
- package/src/modes/components/custom-editor.ts +181 -0
- package/src/modes/components/custom-message.ts +91 -0
- package/src/modes/components/diff.ts +186 -0
- package/src/modes/components/dynamic-border.ts +25 -0
- package/src/modes/components/extensions/extension-dashboard.ts +325 -0
- package/src/modes/components/extensions/extension-list.ts +484 -0
- package/src/modes/components/extensions/index.ts +9 -0
- package/src/modes/components/extensions/inspector-panel.ts +321 -0
- package/src/modes/components/extensions/state-manager.ts +586 -0
- package/src/modes/components/extensions/types.ts +191 -0
- package/src/modes/components/footer.ts +315 -0
- package/src/modes/components/history-search.ts +157 -0
- package/src/modes/components/hook-editor.ts +101 -0
- package/src/modes/components/hook-input.ts +72 -0
- package/src/modes/components/hook-message.ts +100 -0
- package/src/modes/components/hook-selector.ts +155 -0
- package/src/modes/components/index.ts +41 -0
- package/src/modes/components/keybinding-hints.ts +65 -0
- package/src/modes/components/login-dialog.ts +164 -0
- package/src/modes/components/mcp-add-wizard.ts +1295 -0
- package/src/modes/components/model-selector.ts +625 -0
- package/src/modes/components/oauth-selector.ts +210 -0
- package/src/modes/components/plugin-settings.ts +477 -0
- package/src/modes/components/python-execution.ts +196 -0
- package/src/modes/components/queue-mode-selector.ts +56 -0
- package/src/modes/components/read-tool-group.ts +119 -0
- package/src/modes/components/session-selector.ts +242 -0
- package/src/modes/components/settings-defs.ts +340 -0
- package/src/modes/components/settings-selector.ts +529 -0
- package/src/modes/components/show-images-selector.ts +45 -0
- package/src/modes/components/skill-message.ts +90 -0
- package/src/modes/components/status-line/index.ts +4 -0
- package/src/modes/components/status-line/presets.ts +94 -0
- package/src/modes/components/status-line/segments.ts +352 -0
- package/src/modes/components/status-line/separators.ts +55 -0
- package/src/modes/components/status-line/types.ts +75 -0
- package/src/modes/components/status-line-segment-editor.ts +354 -0
- package/src/modes/components/status-line.ts +421 -0
- package/src/modes/components/theme-selector.ts +63 -0
- package/src/modes/components/thinking-selector.ts +64 -0
- package/src/modes/components/todo-display.ts +115 -0
- package/src/modes/components/todo-reminder.ts +40 -0
- package/src/modes/components/tool-execution.ts +703 -0
- package/src/modes/components/tree-selector.ts +904 -0
- package/src/modes/components/ttsr-notification.ts +80 -0
- package/src/modes/components/user-message-selector.ts +146 -0
- package/src/modes/components/user-message.ts +22 -0
- package/src/modes/components/visual-truncate.ts +63 -0
- package/src/modes/components/welcome.ts +247 -0
- package/src/modes/controllers/command-controller.ts +1120 -0
- package/src/modes/controllers/event-controller.ts +479 -0
- package/src/modes/controllers/extension-ui-controller.ts +778 -0
- package/src/modes/controllers/input-controller.ts +671 -0
- package/src/modes/controllers/mcp-command-controller.ts +1315 -0
- package/src/modes/controllers/selector-controller.ts +712 -0
- package/src/modes/controllers/ssh-command-controller.ts +452 -0
- package/src/modes/index.ts +15 -0
- package/src/modes/interactive-mode.ts +1027 -0
- package/src/modes/print-mode.ts +191 -0
- package/src/modes/rpc/rpc-client.ts +583 -0
- package/src/modes/rpc/rpc-mode.ts +700 -0
- package/src/modes/rpc/rpc-types.ts +236 -0
- package/src/modes/theme/dark.json +95 -0
- package/src/modes/theme/defaults/alabaster.json +93 -0
- package/src/modes/theme/defaults/amethyst.json +96 -0
- package/src/modes/theme/defaults/anthracite.json +93 -0
- package/src/modes/theme/defaults/basalt.json +91 -0
- package/src/modes/theme/defaults/birch.json +95 -0
- package/src/modes/theme/defaults/dark-abyss.json +91 -0
- package/src/modes/theme/defaults/dark-arctic.json +104 -0
- package/src/modes/theme/defaults/dark-aurora.json +95 -0
- package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
- package/src/modes/theme/defaults/dark-cavern.json +91 -0
- package/src/modes/theme/defaults/dark-copper.json +95 -0
- package/src/modes/theme/defaults/dark-cosmos.json +90 -0
- package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
- package/src/modes/theme/defaults/dark-dracula.json +98 -0
- package/src/modes/theme/defaults/dark-eclipse.json +91 -0
- package/src/modes/theme/defaults/dark-ember.json +95 -0
- package/src/modes/theme/defaults/dark-equinox.json +90 -0
- package/src/modes/theme/defaults/dark-forest.json +96 -0
- package/src/modes/theme/defaults/dark-github.json +105 -0
- package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
- package/src/modes/theme/defaults/dark-lavender.json +95 -0
- package/src/modes/theme/defaults/dark-lunar.json +89 -0
- package/src/modes/theme/defaults/dark-midnight.json +95 -0
- package/src/modes/theme/defaults/dark-monochrome.json +94 -0
- package/src/modes/theme/defaults/dark-monokai.json +98 -0
- package/src/modes/theme/defaults/dark-nebula.json +90 -0
- package/src/modes/theme/defaults/dark-nord.json +97 -0
- package/src/modes/theme/defaults/dark-ocean.json +101 -0
- package/src/modes/theme/defaults/dark-one.json +100 -0
- package/src/modes/theme/defaults/dark-rainforest.json +91 -0
- package/src/modes/theme/defaults/dark-reef.json +91 -0
- package/src/modes/theme/defaults/dark-retro.json +92 -0
- package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
- package/src/modes/theme/defaults/dark-sakura.json +95 -0
- package/src/modes/theme/defaults/dark-slate.json +95 -0
- package/src/modes/theme/defaults/dark-solarized.json +97 -0
- package/src/modes/theme/defaults/dark-solstice.json +90 -0
- package/src/modes/theme/defaults/dark-starfall.json +91 -0
- package/src/modes/theme/defaults/dark-sunset.json +99 -0
- package/src/modes/theme/defaults/dark-swamp.json +90 -0
- package/src/modes/theme/defaults/dark-synthwave.json +103 -0
- package/src/modes/theme/defaults/dark-taiga.json +91 -0
- package/src/modes/theme/defaults/dark-terminal.json +95 -0
- package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
- package/src/modes/theme/defaults/dark-tundra.json +91 -0
- package/src/modes/theme/defaults/dark-twilight.json +91 -0
- package/src/modes/theme/defaults/dark-volcanic.json +91 -0
- package/src/modes/theme/defaults/graphite.json +92 -0
- package/src/modes/theme/defaults/index.ts +195 -0
- package/src/modes/theme/defaults/light-arctic.json +107 -0
- package/src/modes/theme/defaults/light-aurora-day.json +91 -0
- package/src/modes/theme/defaults/light-canyon.json +91 -0
- package/src/modes/theme/defaults/light-catppuccin.json +106 -0
- package/src/modes/theme/defaults/light-cirrus.json +90 -0
- package/src/modes/theme/defaults/light-coral.json +95 -0
- package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
- package/src/modes/theme/defaults/light-dawn.json +90 -0
- package/src/modes/theme/defaults/light-dunes.json +91 -0
- package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
- package/src/modes/theme/defaults/light-forest.json +100 -0
- package/src/modes/theme/defaults/light-frost.json +95 -0
- package/src/modes/theme/defaults/light-github.json +115 -0
- package/src/modes/theme/defaults/light-glacier.json +91 -0
- package/src/modes/theme/defaults/light-gruvbox.json +108 -0
- package/src/modes/theme/defaults/light-haze.json +90 -0
- package/src/modes/theme/defaults/light-honeycomb.json +95 -0
- package/src/modes/theme/defaults/light-lagoon.json +91 -0
- package/src/modes/theme/defaults/light-lavender.json +95 -0
- package/src/modes/theme/defaults/light-meadow.json +91 -0
- package/src/modes/theme/defaults/light-mint.json +95 -0
- package/src/modes/theme/defaults/light-monochrome.json +101 -0
- package/src/modes/theme/defaults/light-ocean.json +99 -0
- package/src/modes/theme/defaults/light-one.json +99 -0
- package/src/modes/theme/defaults/light-opal.json +91 -0
- package/src/modes/theme/defaults/light-orchard.json +91 -0
- package/src/modes/theme/defaults/light-paper.json +95 -0
- package/src/modes/theme/defaults/light-prism.json +90 -0
- package/src/modes/theme/defaults/light-retro.json +98 -0
- package/src/modes/theme/defaults/light-sand.json +95 -0
- package/src/modes/theme/defaults/light-savanna.json +91 -0
- package/src/modes/theme/defaults/light-solarized.json +102 -0
- package/src/modes/theme/defaults/light-soleil.json +90 -0
- package/src/modes/theme/defaults/light-sunset.json +99 -0
- package/src/modes/theme/defaults/light-synthwave.json +98 -0
- package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
- package/src/modes/theme/defaults/light-wetland.json +91 -0
- package/src/modes/theme/defaults/light-zenith.json +89 -0
- package/src/modes/theme/defaults/limestone.json +94 -0
- package/src/modes/theme/defaults/mahogany.json +97 -0
- package/src/modes/theme/defaults/marble.json +93 -0
- package/src/modes/theme/defaults/obsidian.json +91 -0
- package/src/modes/theme/defaults/onyx.json +91 -0
- package/src/modes/theme/defaults/pearl.json +93 -0
- package/src/modes/theme/defaults/porcelain.json +91 -0
- package/src/modes/theme/defaults/quartz.json +96 -0
- package/src/modes/theme/defaults/sandstone.json +95 -0
- package/src/modes/theme/defaults/titanium.json +90 -0
- package/src/modes/theme/light.json +93 -0
- package/src/modes/theme/mermaid-cache.ts +111 -0
- package/src/modes/theme/theme-schema.json +429 -0
- package/src/modes/theme/theme.ts +2333 -0
- package/src/modes/types.ts +216 -0
- package/src/modes/utils/ui-helpers.ts +529 -0
- package/src/patch/applicator.ts +1482 -0
- package/src/patch/diff.ts +425 -0
- package/src/patch/fuzzy.ts +784 -0
- package/src/patch/hashline.ts +972 -0
- package/src/patch/index.ts +964 -0
- package/src/patch/normalize.ts +397 -0
- package/src/patch/normative.ts +72 -0
- package/src/patch/parser.ts +532 -0
- package/src/patch/shared.ts +400 -0
- package/src/patch/types.ts +292 -0
- package/src/priority.json +35 -0
- package/src/prompts/agents/explore.md +48 -0
- package/src/prompts/agents/frontmatter.md +9 -0
- package/src/prompts/agents/init.md +36 -0
- package/src/prompts/agents/librarian.md +53 -0
- package/src/prompts/agents/oracle.md +51 -0
- package/src/prompts/agents/reviewer.md +70 -0
- package/src/prompts/agents/task.md +14 -0
- package/src/prompts/compaction/branch-summary-context.md +5 -0
- package/src/prompts/compaction/branch-summary-preamble.md +2 -0
- package/src/prompts/compaction/branch-summary.md +30 -0
- package/src/prompts/compaction/compaction-short-summary.md +9 -0
- package/src/prompts/compaction/compaction-summary-context.md +5 -0
- package/src/prompts/compaction/compaction-summary.md +38 -0
- package/src/prompts/compaction/compaction-turn-prefix.md +17 -0
- package/src/prompts/compaction/compaction-update-summary.md +45 -0
- package/src/prompts/memories/consolidation.md +30 -0
- package/src/prompts/memories/read_path.md +11 -0
- package/src/prompts/memories/stage_one_input.md +6 -0
- package/src/prompts/memories/stage_one_system.md +21 -0
- package/src/prompts/review-request.md +64 -0
- package/src/prompts/system/agent-creation-architect.md +65 -0
- package/src/prompts/system/agent-creation-user.md +6 -0
- package/src/prompts/system/custom-system-prompt.md +68 -0
- package/src/prompts/system/file-operations.md +10 -0
- package/src/prompts/system/subagent-submit-reminder.md +11 -0
- package/src/prompts/system/subagent-system-prompt.md +31 -0
- package/src/prompts/system/subagent-user-prompt.md +8 -0
- package/src/prompts/system/summarization-system.md +3 -0
- package/src/prompts/system/system-prompt.md +300 -0
- package/src/prompts/system/title-system.md +2 -0
- package/src/prompts/system/ttsr-interrupt.md +7 -0
- package/src/prompts/system/web-search.md +28 -0
- package/src/prompts/tools/ask.md +44 -0
- package/src/prompts/tools/bash.md +24 -0
- package/src/prompts/tools/browser.md +33 -0
- package/src/prompts/tools/calculator.md +12 -0
- package/src/prompts/tools/explore.md +29 -0
- package/src/prompts/tools/fetch.md +16 -0
- package/src/prompts/tools/find.md +18 -0
- package/src/prompts/tools/gemini-image.md +23 -0
- package/src/prompts/tools/grep.md +28 -0
- package/src/prompts/tools/hashline.md +232 -0
- package/src/prompts/tools/librarian.md +24 -0
- package/src/prompts/tools/lsp.md +28 -0
- package/src/prompts/tools/oracle.md +26 -0
- package/src/prompts/tools/patch.md +74 -0
- package/src/prompts/tools/python.md +66 -0
- package/src/prompts/tools/read.md +36 -0
- package/src/prompts/tools/replace.md +38 -0
- package/src/prompts/tools/reviewer.md +41 -0
- package/src/prompts/tools/ssh.md +51 -0
- package/src/prompts/tools/task-summary.md +28 -0
- package/src/prompts/tools/task.md +275 -0
- package/src/prompts/tools/todo-write.md +65 -0
- package/src/prompts/tools/undo-edit.md +7 -0
- package/src/prompts/tools/web-search.md +19 -0
- package/src/prompts/tools/write.md +18 -0
- package/src/sdk.ts +1287 -0
- package/src/secrets/index.ts +116 -0
- package/src/secrets/obfuscator.ts +269 -0
- package/src/secrets/regex.ts +21 -0
- package/src/session/agent-session.ts +4669 -0
- package/src/session/agent-storage.ts +621 -0
- package/src/session/artifacts.ts +132 -0
- package/src/session/auth-storage.ts +1433 -0
- package/src/session/blob-store.ts +103 -0
- package/src/session/compaction/branch-summarization.ts +315 -0
- package/src/session/compaction/compaction.ts +864 -0
- package/src/session/compaction/index.ts +7 -0
- package/src/session/compaction/pruning.ts +91 -0
- package/src/session/compaction/utils.ts +171 -0
- package/src/session/history-storage.ts +170 -0
- package/src/session/messages.ts +317 -0
- package/src/session/session-manager.ts +2276 -0
- package/src/session/session-storage.ts +342 -0
- package/src/session/streaming-output.ts +565 -0
- package/src/slash-commands/builtin-registry.ts +439 -0
- package/src/ssh/config-writer.ts +183 -0
- package/src/ssh/connection-manager.ts +444 -0
- package/src/ssh/ssh-executor.ts +127 -0
- package/src/ssh/sshfs-mount.ts +135 -0
- package/src/stt/downloader.ts +71 -0
- package/src/stt/index.ts +3 -0
- package/src/stt/recorder.ts +351 -0
- package/src/stt/setup.ts +52 -0
- package/src/stt/stt-controller.ts +160 -0
- package/src/stt/transcribe.py +70 -0
- package/src/stt/transcriber.ts +91 -0
- package/src/system-prompt.ts +685 -0
- package/src/task/agents.ts +155 -0
- package/src/task/batch.ts +102 -0
- package/src/task/commands.ts +134 -0
- package/src/task/discovery.ts +126 -0
- package/src/task/executor.ts +908 -0
- package/src/task/index.ts +223 -0
- package/src/task/output-manager.ts +107 -0
- package/src/task/parallel.ts +84 -0
- package/src/task/render.ts +326 -0
- package/src/task/subprocess-tool-registry.ts +88 -0
- package/src/task/template.ts +32 -0
- package/src/task/types.ts +144 -0
- package/src/tools/ask.ts +523 -0
- package/src/tools/bash-interactive.ts +419 -0
- package/src/tools/bash-interceptor.ts +105 -0
- package/src/tools/bash-normalize.ts +107 -0
- package/src/tools/bash-skill-urls.ts +177 -0
- package/src/tools/bash.ts +347 -0
- package/src/tools/browser.ts +1374 -0
- package/src/tools/calculator.ts +537 -0
- package/src/tools/context.ts +39 -0
- package/src/tools/explore.ts +23 -0
- package/src/tools/fetch.ts +1091 -0
- package/src/tools/find.ts +540 -0
- package/src/tools/fs-cache-invalidation.ts +28 -0
- package/src/tools/gemini-image.ts +907 -0
- package/src/tools/grep.ts +489 -0
- package/src/tools/index.ts +337 -0
- package/src/tools/json-tree.ts +231 -0
- package/src/tools/jtd-to-json-schema.ts +247 -0
- package/src/tools/jtd-to-typescript.ts +198 -0
- package/src/tools/librarian.ts +33 -0
- package/src/tools/list-limit.ts +40 -0
- package/src/tools/notebook.ts +287 -0
- package/src/tools/oracle.ts +40 -0
- package/src/tools/output-meta.ts +459 -0
- package/src/tools/output-utils.ts +63 -0
- package/src/tools/path-utils.ts +116 -0
- package/src/tools/puppeteer/00_stealth_tampering.txt +63 -0
- package/src/tools/puppeteer/01_stealth_activity.txt +20 -0
- package/src/tools/puppeteer/02_stealth_hairline.txt +11 -0
- package/src/tools/puppeteer/03_stealth_botd.txt +384 -0
- package/src/tools/puppeteer/04_stealth_iframe.txt +81 -0
- package/src/tools/puppeteer/05_stealth_webgl.txt +75 -0
- package/src/tools/puppeteer/06_stealth_screen.txt +72 -0
- package/src/tools/puppeteer/07_stealth_fonts.txt +97 -0
- package/src/tools/puppeteer/08_stealth_audio.txt +51 -0
- package/src/tools/puppeteer/09_stealth_locale.txt +46 -0
- package/src/tools/puppeteer/10_stealth_plugins.txt +206 -0
- package/src/tools/puppeteer/11_stealth_hardware.txt +8 -0
- package/src/tools/puppeteer/12_stealth_codecs.txt +40 -0
- package/src/tools/puppeteer/13_stealth_worker.txt +74 -0
- package/src/tools/python.ts +1118 -0
- package/src/tools/read.ts +1193 -0
- package/src/tools/render-utils.ts +680 -0
- package/src/tools/renderers.ts +60 -0
- package/src/tools/reviewer-tool.ts +41 -0
- package/src/tools/ssh.ts +326 -0
- package/src/tools/subagent-tool.ts +169 -0
- package/src/tools/submit-result.ts +152 -0
- package/src/tools/todo-write.ts +255 -0
- package/src/tools/tool-errors.ts +92 -0
- package/src/tools/tool-result.ts +86 -0
- package/src/tools/undo-edit.ts +145 -0
- package/src/tools/undo-history.ts +22 -0
- package/src/tools/write.ts +274 -0
- package/src/tui/code-cell.ts +108 -0
- package/src/tui/file-list.ts +47 -0
- package/src/tui/index.ts +11 -0
- package/src/tui/output-block.ts +144 -0
- package/src/tui/status-line.ts +39 -0
- package/src/tui/tree-list.ts +53 -0
- package/src/tui/types.ts +16 -0
- package/src/tui/utils.ts +116 -0
- package/src/utils/changelog.ts +98 -0
- package/src/utils/event-bus.ts +33 -0
- package/src/utils/external-editor.ts +59 -0
- package/src/utils/file-display-mode.ts +36 -0
- package/src/utils/file-mentions.ts +384 -0
- package/src/utils/frontmatter.ts +101 -0
- package/src/utils/fuzzy.ts +108 -0
- package/src/utils/ignore-files.ts +119 -0
- package/src/utils/image-convert.ts +27 -0
- package/src/utils/image-resize.ts +236 -0
- package/src/utils/mime.ts +30 -0
- package/src/utils/open.ts +20 -0
- package/src/utils/shell-snapshot.ts +199 -0
- package/src/utils/timings.ts +26 -0
- package/src/utils/title-generator.ts +167 -0
- package/src/utils/tools-manager.ts +362 -0
- package/src/web/scrapers/artifacthub.ts +215 -0
- package/src/web/scrapers/arxiv.ts +88 -0
- package/src/web/scrapers/aur.ts +175 -0
- package/src/web/scrapers/biorxiv.ts +141 -0
- package/src/web/scrapers/bluesky.ts +284 -0
- package/src/web/scrapers/brew.ts +177 -0
- package/src/web/scrapers/cheatsh.ts +78 -0
- package/src/web/scrapers/chocolatey.ts +158 -0
- package/src/web/scrapers/choosealicense.ts +110 -0
- package/src/web/scrapers/cisa-kev.ts +100 -0
- package/src/web/scrapers/clojars.ts +180 -0
- package/src/web/scrapers/coingecko.ts +184 -0
- package/src/web/scrapers/crates-io.ts +128 -0
- package/src/web/scrapers/crossref.ts +149 -0
- package/src/web/scrapers/devto.ts +177 -0
- package/src/web/scrapers/discogs.ts +307 -0
- package/src/web/scrapers/discourse.ts +221 -0
- package/src/web/scrapers/dockerhub.ts +160 -0
- package/src/web/scrapers/fdroid.ts +158 -0
- package/src/web/scrapers/firefox-addons.ts +214 -0
- package/src/web/scrapers/flathub.ts +239 -0
- package/src/web/scrapers/github-gist.ts +68 -0
- package/src/web/scrapers/github.ts +490 -0
- package/src/web/scrapers/gitlab.ts +456 -0
- package/src/web/scrapers/go-pkg.ts +275 -0
- package/src/web/scrapers/hackage.ts +94 -0
- package/src/web/scrapers/hackernews.ts +208 -0
- package/src/web/scrapers/hex.ts +121 -0
- package/src/web/scrapers/huggingface.ts +385 -0
- package/src/web/scrapers/iacr.ts +86 -0
- package/src/web/scrapers/index.ts +249 -0
- package/src/web/scrapers/jetbrains-marketplace.ts +169 -0
- package/src/web/scrapers/lemmy.ts +220 -0
- package/src/web/scrapers/lobsters.ts +186 -0
- package/src/web/scrapers/mastodon.ts +310 -0
- package/src/web/scrapers/maven.ts +152 -0
- package/src/web/scrapers/mdn.ts +172 -0
- package/src/web/scrapers/metacpan.ts +253 -0
- package/src/web/scrapers/musicbrainz.ts +272 -0
- package/src/web/scrapers/npm.ts +114 -0
- package/src/web/scrapers/nuget.ts +205 -0
- package/src/web/scrapers/nvd.ts +243 -0
- package/src/web/scrapers/ollama.ts +265 -0
- package/src/web/scrapers/open-vsx.ts +119 -0
- package/src/web/scrapers/opencorporates.ts +275 -0
- package/src/web/scrapers/openlibrary.ts +319 -0
- package/src/web/scrapers/orcid.ts +298 -0
- package/src/web/scrapers/osv.ts +192 -0
- package/src/web/scrapers/packagist.ts +174 -0
- package/src/web/scrapers/pub-dev.ts +185 -0
- package/src/web/scrapers/pubmed.ts +177 -0
- package/src/web/scrapers/pypi.ts +129 -0
- package/src/web/scrapers/rawg.ts +124 -0
- package/src/web/scrapers/readthedocs.ts +125 -0
- package/src/web/scrapers/reddit.ts +104 -0
- package/src/web/scrapers/repology.ts +262 -0
- package/src/web/scrapers/rfc.ts +209 -0
- package/src/web/scrapers/rubygems.ts +117 -0
- package/src/web/scrapers/searchcode.ts +217 -0
- package/src/web/scrapers/sec-edgar.ts +274 -0
- package/src/web/scrapers/semantic-scholar.ts +190 -0
- package/src/web/scrapers/snapcraft.ts +200 -0
- package/src/web/scrapers/sourcegraph.ts +373 -0
- package/src/web/scrapers/spdx.ts +121 -0
- package/src/web/scrapers/spotify.ts +217 -0
- package/src/web/scrapers/stackoverflow.ts +124 -0
- package/src/web/scrapers/terraform.ts +304 -0
- package/src/web/scrapers/tldr.ts +51 -0
- package/src/web/scrapers/twitter.ts +97 -0
- package/src/web/scrapers/types.ts +200 -0
- package/src/web/scrapers/utils.ts +142 -0
- package/src/web/scrapers/vimeo.ts +152 -0
- package/src/web/scrapers/vscode-marketplace.ts +195 -0
- package/src/web/scrapers/w3c.ts +163 -0
- package/src/web/scrapers/wikidata.ts +357 -0
- package/src/web/scrapers/wikipedia.ts +95 -0
- package/src/web/scrapers/youtube.ts +312 -0
- package/src/web/search/auth.ts +178 -0
- package/src/web/search/index.ts +598 -0
- package/src/web/search/provider.ts +77 -0
- package/src/web/search/providers/anthropic.ts +284 -0
- package/src/web/search/providers/base.ts +22 -0
- package/src/web/search/providers/brave.ts +165 -0
- package/src/web/search/providers/codex.ts +377 -0
- package/src/web/search/providers/exa.ts +158 -0
- package/src/web/search/providers/gemini.ts +437 -0
- package/src/web/search/providers/jina.ts +99 -0
- package/src/web/search/providers/kimi.ts +196 -0
- package/src/web/search/providers/perplexity.ts +546 -0
- package/src/web/search/providers/synthetic.ts +136 -0
- package/src/web/search/providers/zai.ts +352 -0
- package/src/web/search/render.ts +299 -0
- package/src/web/search/types.ts +437 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP configuration loader.
|
|
3
|
+
*
|
|
4
|
+
* Uses the capability system to load MCP servers from multiple sources.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { getMCPConfigPath } from "@nghyane/arcane-utils/dirs";
|
|
8
|
+
import { mcpCapability } from "../capability/mcp";
|
|
9
|
+
import type { SourceMeta } from "../capability/types";
|
|
10
|
+
import type { MCPServer } from "../discovery";
|
|
11
|
+
import { loadCapability } from "../discovery";
|
|
12
|
+
import { readDisabledServers } from "./config-writer";
|
|
13
|
+
import type { MCPServerConfig } from "./types";
|
|
14
|
+
|
|
15
|
+
/** Options for loading MCP configs */
|
|
16
|
+
export interface LoadMCPConfigsOptions {
|
|
17
|
+
/** Whether to load project-level config (default: true) */
|
|
18
|
+
enableProjectConfig?: boolean;
|
|
19
|
+
/** Whether to filter out Exa MCP servers (default: true) */
|
|
20
|
+
filterExa?: boolean;
|
|
21
|
+
/** Whether to filter out browser MCP servers when builtin browser tool is enabled (default: false) */
|
|
22
|
+
filterBrowser?: boolean;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Result of loading MCP configs */
|
|
26
|
+
export interface LoadMCPConfigsResult {
|
|
27
|
+
/** Loaded server configs */
|
|
28
|
+
configs: Record<string, MCPServerConfig>;
|
|
29
|
+
/** Extracted Exa API keys (if any were filtered) */
|
|
30
|
+
exaApiKeys: string[];
|
|
31
|
+
/** Source metadata for each server */
|
|
32
|
+
sources: Record<string, SourceMeta>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Convert canonical MCPServer to legacy MCPServerConfig.
|
|
37
|
+
*/
|
|
38
|
+
function convertToLegacyConfig(server: MCPServer): MCPServerConfig {
|
|
39
|
+
// Determine transport type
|
|
40
|
+
const transport = server.transport ?? (server.command ? "stdio" : server.url ? "http" : "stdio");
|
|
41
|
+
const shared = {
|
|
42
|
+
enabled: server.enabled,
|
|
43
|
+
timeout: server.timeout,
|
|
44
|
+
auth: server.auth,
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
if (transport === "stdio") {
|
|
48
|
+
const config: MCPServerConfig = {
|
|
49
|
+
...shared,
|
|
50
|
+
type: "stdio" as const,
|
|
51
|
+
command: server.command ?? "",
|
|
52
|
+
};
|
|
53
|
+
if (server.args) config.args = server.args;
|
|
54
|
+
if (server.env) config.env = server.env;
|
|
55
|
+
return config;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (transport === "http") {
|
|
59
|
+
const config: MCPServerConfig = {
|
|
60
|
+
...shared,
|
|
61
|
+
type: "http" as const,
|
|
62
|
+
url: server.url ?? "",
|
|
63
|
+
};
|
|
64
|
+
if (server.headers) config.headers = server.headers;
|
|
65
|
+
return config;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (transport === "sse") {
|
|
69
|
+
const config: MCPServerConfig = {
|
|
70
|
+
...shared,
|
|
71
|
+
type: "sse" as const,
|
|
72
|
+
url: server.url ?? "",
|
|
73
|
+
};
|
|
74
|
+
if (server.headers) config.headers = server.headers;
|
|
75
|
+
return config;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Fallback to stdio
|
|
79
|
+
return {
|
|
80
|
+
...shared,
|
|
81
|
+
type: "stdio" as const,
|
|
82
|
+
command: server.command ?? "",
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Load all MCP server configs from standard locations.
|
|
88
|
+
* Uses the capability system for multi-source discovery.
|
|
89
|
+
*
|
|
90
|
+
* @param cwd Working directory (project root)
|
|
91
|
+
* @param options Load options
|
|
92
|
+
*/
|
|
93
|
+
export async function loadAllMCPConfigs(cwd: string, options?: LoadMCPConfigsOptions): Promise<LoadMCPConfigsResult> {
|
|
94
|
+
const enableProjectConfig = options?.enableProjectConfig ?? true;
|
|
95
|
+
const filterExa = options?.filterExa ?? true;
|
|
96
|
+
const filterBrowser = options?.filterBrowser ?? false;
|
|
97
|
+
|
|
98
|
+
// Load MCP servers via capability system
|
|
99
|
+
const result = await loadCapability<MCPServer>(mcpCapability.id, { cwd });
|
|
100
|
+
|
|
101
|
+
// Filter out project-level configs if disabled
|
|
102
|
+
const servers = enableProjectConfig
|
|
103
|
+
? result.items
|
|
104
|
+
: result.items.filter(server => server._source.level !== "project");
|
|
105
|
+
|
|
106
|
+
// Load user-level disabled servers list
|
|
107
|
+
const disabledServers = new Set(await readDisabledServers(getMCPConfigPath("user", cwd)));
|
|
108
|
+
// Convert to legacy format and preserve source metadata
|
|
109
|
+
let configs: Record<string, MCPServerConfig> = {};
|
|
110
|
+
let sources: Record<string, SourceMeta> = {};
|
|
111
|
+
for (const server of servers) {
|
|
112
|
+
const config = convertToLegacyConfig(server);
|
|
113
|
+
if (config.enabled === false || (server._source.level !== "user" && disabledServers.has(server.name))) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
configs[server.name] = config;
|
|
117
|
+
sources[server.name] = server._source;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
let exaApiKeys: string[] = [];
|
|
121
|
+
|
|
122
|
+
if (filterExa) {
|
|
123
|
+
const exaResult = filterExaMCPServers(configs, sources);
|
|
124
|
+
configs = exaResult.configs;
|
|
125
|
+
sources = exaResult.sources;
|
|
126
|
+
exaApiKeys = exaResult.exaApiKeys;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (filterBrowser) {
|
|
130
|
+
const browserResult = filterBrowserMCPServers(configs, sources);
|
|
131
|
+
configs = browserResult.configs;
|
|
132
|
+
sources = browserResult.sources;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return { configs, exaApiKeys, sources };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Pattern to match Exa MCP servers */
|
|
139
|
+
const EXA_MCP_URL_PATTERN = /mcp\.exa\.ai/i;
|
|
140
|
+
const EXA_API_KEY_PATTERN = /exaApiKey=([^&\s]+)/i;
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Check if a server config is an Exa MCP server.
|
|
144
|
+
*/
|
|
145
|
+
export function isExaMCPServer(name: string, config: MCPServerConfig): boolean {
|
|
146
|
+
// Check by server name
|
|
147
|
+
if (name.toLowerCase() === "exa") {
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Check by URL for HTTP/SSE servers
|
|
152
|
+
if (config.type === "http" || config.type === "sse") {
|
|
153
|
+
const httpConfig = config as { url?: string };
|
|
154
|
+
if (httpConfig.url && EXA_MCP_URL_PATTERN.test(httpConfig.url)) {
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Check by args for stdio servers (e.g., mcp-remote to exa)
|
|
160
|
+
if (!config.type || config.type === "stdio") {
|
|
161
|
+
const stdioConfig = config as { args?: string[] };
|
|
162
|
+
if (stdioConfig.args?.some(arg => EXA_MCP_URL_PATTERN.test(arg))) {
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Extract Exa API key from an MCP server config.
|
|
172
|
+
*/
|
|
173
|
+
export function extractExaApiKey(config: MCPServerConfig): string | undefined {
|
|
174
|
+
// Check URL for HTTP/SSE servers
|
|
175
|
+
if (config.type === "http" || config.type === "sse") {
|
|
176
|
+
const httpConfig = config as { url?: string };
|
|
177
|
+
if (httpConfig.url) {
|
|
178
|
+
const match = EXA_API_KEY_PATTERN.exec(httpConfig.url);
|
|
179
|
+
if (match) return match[1];
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Check args for stdio servers
|
|
184
|
+
if (!config.type || config.type === "stdio") {
|
|
185
|
+
const stdioConfig = config as { args?: string[] };
|
|
186
|
+
if (stdioConfig.args) {
|
|
187
|
+
for (const arg of stdioConfig.args) {
|
|
188
|
+
const match = EXA_API_KEY_PATTERN.exec(arg);
|
|
189
|
+
if (match) return match[1];
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Check env vars
|
|
195
|
+
if ("env" in config && config.env) {
|
|
196
|
+
const envConfig = config as { env: Record<string, string> };
|
|
197
|
+
if (envConfig.env.EXA_API_KEY) {
|
|
198
|
+
return envConfig.env.EXA_API_KEY;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return undefined;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/** Result of filtering Exa MCP servers */
|
|
206
|
+
export interface ExaFilterResult {
|
|
207
|
+
/** Configs with Exa servers removed */
|
|
208
|
+
configs: Record<string, MCPServerConfig>;
|
|
209
|
+
/** Extracted Exa API keys (if any) */
|
|
210
|
+
exaApiKeys: string[];
|
|
211
|
+
/** Source metadata for remaining servers */
|
|
212
|
+
sources: Record<string, SourceMeta>;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Filter out Exa MCP servers and extract their API keys.
|
|
217
|
+
* Since we have native Exa integration, we don't need the MCP server.
|
|
218
|
+
*/
|
|
219
|
+
export function filterExaMCPServers(
|
|
220
|
+
configs: Record<string, MCPServerConfig>,
|
|
221
|
+
sources: Record<string, SourceMeta>,
|
|
222
|
+
): ExaFilterResult {
|
|
223
|
+
const filtered: Record<string, MCPServerConfig> = {};
|
|
224
|
+
const filteredSources: Record<string, SourceMeta> = {};
|
|
225
|
+
const exaApiKeys: string[] = [];
|
|
226
|
+
|
|
227
|
+
for (const [name, config] of Object.entries(configs)) {
|
|
228
|
+
if (isExaMCPServer(name, config)) {
|
|
229
|
+
// Extract API key before filtering
|
|
230
|
+
const apiKey = extractExaApiKey(config);
|
|
231
|
+
if (apiKey) {
|
|
232
|
+
exaApiKeys.push(apiKey);
|
|
233
|
+
}
|
|
234
|
+
} else {
|
|
235
|
+
filtered[name] = config;
|
|
236
|
+
if (sources[name]) {
|
|
237
|
+
filteredSources[name] = sources[name];
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return { configs: filtered, exaApiKeys, sources: filteredSources };
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Validate server config has required fields.
|
|
247
|
+
*/
|
|
248
|
+
export function validateServerConfig(name: string, config: MCPServerConfig): string[] {
|
|
249
|
+
const errors: string[] = [];
|
|
250
|
+
|
|
251
|
+
const serverType = config.type ?? "stdio";
|
|
252
|
+
|
|
253
|
+
// Check for conflicting transport fields
|
|
254
|
+
const hasCommand = "command" in config && config.command;
|
|
255
|
+
const hasUrl = "url" in config && (config as { url?: string }).url;
|
|
256
|
+
if (hasCommand && hasUrl) {
|
|
257
|
+
errors.push(
|
|
258
|
+
`Server "${name}": both "command" and "url" are set - server should be either stdio (command) OR http/sse (url), not both`,
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if (serverType === "stdio") {
|
|
263
|
+
const stdioConfig = config as { command?: string };
|
|
264
|
+
if (!stdioConfig.command) {
|
|
265
|
+
errors.push(`Server "${name}": stdio server requires "command" field`);
|
|
266
|
+
}
|
|
267
|
+
} else if (serverType === "http" || serverType === "sse") {
|
|
268
|
+
const httpConfig = config as { url?: string };
|
|
269
|
+
if (!httpConfig.url) {
|
|
270
|
+
errors.push(`Server "${name}": ${serverType} server requires "url" field`);
|
|
271
|
+
}
|
|
272
|
+
} else {
|
|
273
|
+
errors.push(`Server "${name}": unknown server type "${serverType}"`);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
return errors;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/** Known browser automation MCP server names (lowercase) */
|
|
280
|
+
const BROWSER_MCP_NAMES = new Set([
|
|
281
|
+
"puppeteer",
|
|
282
|
+
"playwright",
|
|
283
|
+
"browserbase",
|
|
284
|
+
"browser-tools",
|
|
285
|
+
"browser-use",
|
|
286
|
+
"browser",
|
|
287
|
+
]);
|
|
288
|
+
|
|
289
|
+
/** Patterns matching browser MCP package names in command/args */
|
|
290
|
+
const BROWSER_MCP_PKG_PATTERN =
|
|
291
|
+
// Official packages
|
|
292
|
+
// - @modelcontextprotocol/server-puppeteer
|
|
293
|
+
// - @playwright/mcp
|
|
294
|
+
// - @browserbasehq/mcp-server-browserbase
|
|
295
|
+
// - @agentdeskai/browser-tools-mcp
|
|
296
|
+
// - @agent-infra/mcp-server-browser
|
|
297
|
+
// Community packages: puppeteer-mcp-server, playwright-mcp, pptr-mcp, etc.
|
|
298
|
+
/(?:@modelcontextprotocol\/server-puppeteer|@playwright\/mcp|@browserbasehq\/mcp-server-browserbase|@agentdeskai\/browser-tools-mcp|@agent-infra\/mcp-server-browser|puppeteer-mcp|playwright-mcp|pptr-mcp|browser-use-mcp|mcp-browser-use)/i;
|
|
299
|
+
|
|
300
|
+
/** URL patterns for hosted browser MCP services */
|
|
301
|
+
const BROWSER_MCP_URL_PATTERN = /browserbase\.com|browser-use\.com/i;
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Check if a server config is a browser automation MCP server.
|
|
305
|
+
*/
|
|
306
|
+
export function isBrowserMCPServer(name: string, config: MCPServerConfig): boolean {
|
|
307
|
+
// Check by server name
|
|
308
|
+
if (BROWSER_MCP_NAMES.has(name.toLowerCase())) {
|
|
309
|
+
return true;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Check by URL for HTTP/SSE servers
|
|
313
|
+
if (config.type === "http" || config.type === "sse") {
|
|
314
|
+
const httpConfig = config as { url?: string };
|
|
315
|
+
if (httpConfig.url && BROWSER_MCP_URL_PATTERN.test(httpConfig.url)) {
|
|
316
|
+
return true;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Check by command/args for stdio servers
|
|
321
|
+
if (!config.type || config.type === "stdio") {
|
|
322
|
+
const stdioConfig = config as { command?: string; args?: string[] };
|
|
323
|
+
if (stdioConfig.command && BROWSER_MCP_PKG_PATTERN.test(stdioConfig.command)) {
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
if (stdioConfig.args?.some(arg => BROWSER_MCP_PKG_PATTERN.test(arg))) {
|
|
327
|
+
return true;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/** Result of filtering browser MCP servers */
|
|
335
|
+
export interface BrowserFilterResult {
|
|
336
|
+
/** Configs with browser servers removed */
|
|
337
|
+
configs: Record<string, MCPServerConfig>;
|
|
338
|
+
/** Source metadata for remaining servers */
|
|
339
|
+
sources: Record<string, SourceMeta>;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Filter out browser automation MCP servers.
|
|
344
|
+
* Since we have a native browser tool, we don't need these MCP servers.
|
|
345
|
+
*/
|
|
346
|
+
export function filterBrowserMCPServers(
|
|
347
|
+
configs: Record<string, MCPServerConfig>,
|
|
348
|
+
sources: Record<string, SourceMeta>,
|
|
349
|
+
): BrowserFilterResult {
|
|
350
|
+
const filtered: Record<string, MCPServerConfig> = {};
|
|
351
|
+
const filteredSources: Record<string, SourceMeta> = {};
|
|
352
|
+
|
|
353
|
+
for (const [name, config] of Object.entries(configs)) {
|
|
354
|
+
if (!isBrowserMCPServer(name, config)) {
|
|
355
|
+
filtered[name] = config;
|
|
356
|
+
if (sources[name]) {
|
|
357
|
+
filteredSources[name] = sources[name];
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
return { configs: filtered, sources: filteredSources };
|
|
363
|
+
}
|
package/src/mcp/index.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP (Model Context Protocol) support.
|
|
3
|
+
*
|
|
4
|
+
* Provides per-project .mcp.json configuration for connecting to
|
|
5
|
+
* MCP servers via stdio or HTTP transports.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// Client
|
|
9
|
+
export { callTool, connectToServer, disconnectServer, listTools, serverSupportsTools } from "./client";
|
|
10
|
+
// Config
|
|
11
|
+
export type { BrowserFilterResult, ExaFilterResult, LoadMCPConfigsOptions, LoadMCPConfigsResult } from "./config";
|
|
12
|
+
export {
|
|
13
|
+
extractExaApiKey,
|
|
14
|
+
filterBrowserMCPServers,
|
|
15
|
+
filterExaMCPServers,
|
|
16
|
+
isBrowserMCPServer,
|
|
17
|
+
isExaMCPServer,
|
|
18
|
+
loadAllMCPConfigs,
|
|
19
|
+
validateServerConfig,
|
|
20
|
+
} from "./config";
|
|
21
|
+
export { validateServerName } from "./config-writer";
|
|
22
|
+
// JSON-RPC (lightweight HTTP-based MCP calls)
|
|
23
|
+
export type { JsonRpcResponse } from "./json-rpc";
|
|
24
|
+
export { callMCP, parseSSE } from "./json-rpc";
|
|
25
|
+
// Loader (for SDK integration)
|
|
26
|
+
export type { MCPToolsLoadOptions, MCPToolsLoadResult } from "./loader";
|
|
27
|
+
export { discoverAndLoadMCPTools } from "./loader";
|
|
28
|
+
// Manager
|
|
29
|
+
export type { MCPDiscoverOptions, MCPLoadResult } from "./manager";
|
|
30
|
+
export { createMCPManager, MCPManager } from "./manager";
|
|
31
|
+
// OAuth Discovery
|
|
32
|
+
export type { AuthDetectionResult, OAuthEndpoints } from "./oauth-discovery";
|
|
33
|
+
export { analyzeAuthError, detectAuthError, discoverOAuthEndpoints, extractOAuthEndpoints } from "./oauth-discovery";
|
|
34
|
+
// Tool bridge
|
|
35
|
+
export type { MCPToolDetails } from "./tool-bridge";
|
|
36
|
+
export { createMCPToolName, DeferredMCPTool, MCPTool, parseMCPToolName } from "./tool-bridge";
|
|
37
|
+
// Tool cache
|
|
38
|
+
export { MCPToolCache } from "./tool-cache";
|
|
39
|
+
// Transports
|
|
40
|
+
export { createHttpTransport, HttpTransport } from "./transports/http";
|
|
41
|
+
export { createStdioTransport, StdioTransport } from "./transports/stdio";
|
|
42
|
+
// Types
|
|
43
|
+
export type {
|
|
44
|
+
MCPConfigFile,
|
|
45
|
+
MCPContent,
|
|
46
|
+
MCPHttpServerConfig,
|
|
47
|
+
MCPServerCapabilities,
|
|
48
|
+
MCPServerConfig,
|
|
49
|
+
MCPServerConnection,
|
|
50
|
+
MCPSseServerConfig,
|
|
51
|
+
MCPStdioServerConfig,
|
|
52
|
+
MCPToolDefinition,
|
|
53
|
+
MCPToolWithServer,
|
|
54
|
+
MCPTransport,
|
|
55
|
+
} from "./types";
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP JSON-RPC 2.0 over HTTPS.
|
|
3
|
+
*
|
|
4
|
+
* Lightweight utilities for calling MCP servers directly via HTTP
|
|
5
|
+
* without maintaining persistent connections.
|
|
6
|
+
*/
|
|
7
|
+
import { logger } from "@nghyane/arcane-utils";
|
|
8
|
+
|
|
9
|
+
/** Parse SSE response format (lines starting with "data: ") */
|
|
10
|
+
export function parseSSE(text: string): unknown {
|
|
11
|
+
const lines = text.split("\n");
|
|
12
|
+
for (const line of lines) {
|
|
13
|
+
if (line.startsWith("data: ")) {
|
|
14
|
+
const data = line.slice(6).trim();
|
|
15
|
+
if (data === "[DONE]") continue;
|
|
16
|
+
const result = JSON.parse(data) as unknown;
|
|
17
|
+
if (result) return result;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
// Fallback: try parsing entire response as JSON
|
|
21
|
+
try {
|
|
22
|
+
return JSON.parse(text);
|
|
23
|
+
} catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** JSON-RPC 2.0 response structure */
|
|
29
|
+
export interface JsonRpcResponse<T = unknown> {
|
|
30
|
+
jsonrpc: "2.0";
|
|
31
|
+
id: string | number;
|
|
32
|
+
result?: T;
|
|
33
|
+
error?: {
|
|
34
|
+
code: number;
|
|
35
|
+
message: string;
|
|
36
|
+
data?: unknown;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Call an MCP server with JSON-RPC 2.0 over HTTPS.
|
|
42
|
+
*
|
|
43
|
+
* @param url - Full MCP server URL (including any query parameters)
|
|
44
|
+
* @param method - JSON-RPC method name (e.g., "tools/list", "tools/call")
|
|
45
|
+
* @param params - Method parameters
|
|
46
|
+
* @returns Parsed JSON-RPC response
|
|
47
|
+
*/
|
|
48
|
+
export async function callMCP<T = unknown>(
|
|
49
|
+
url: string,
|
|
50
|
+
method: string,
|
|
51
|
+
params?: Record<string, unknown>,
|
|
52
|
+
): Promise<JsonRpcResponse<T>> {
|
|
53
|
+
const body = {
|
|
54
|
+
jsonrpc: "2.0",
|
|
55
|
+
id: Math.random().toString(36).slice(2),
|
|
56
|
+
method,
|
|
57
|
+
params: params ?? {},
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const response = await fetch(url, {
|
|
61
|
+
method: "POST",
|
|
62
|
+
headers: {
|
|
63
|
+
"Content-Type": "application/json",
|
|
64
|
+
Accept: "application/json, text/event-stream",
|
|
65
|
+
},
|
|
66
|
+
body: JSON.stringify(body),
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
if (!response.ok) {
|
|
70
|
+
const errorMsg = `MCP request failed: ${response.status} ${response.statusText}`;
|
|
71
|
+
logger.error(errorMsg, { url, method, params });
|
|
72
|
+
throw new Error(errorMsg);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const text = await response.text();
|
|
76
|
+
const result = parseSSE(text) as JsonRpcResponse<T> | null;
|
|
77
|
+
|
|
78
|
+
if (!result) {
|
|
79
|
+
logger.error("Failed to parse MCP response", { url, method, responseText: text.slice(0, 500) });
|
|
80
|
+
throw new Error("Failed to parse MCP response");
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tools loader.
|
|
3
|
+
*
|
|
4
|
+
* Integrates MCP tool discovery with the custom tools system.
|
|
5
|
+
*/
|
|
6
|
+
import { logger } from "@nghyane/arcane-utils";
|
|
7
|
+
import type { LoadedCustomTool } from "../extensibility/custom-tools/types";
|
|
8
|
+
import { AgentStorage } from "../session/agent-storage";
|
|
9
|
+
import type { AuthStorage } from "../session/auth-storage";
|
|
10
|
+
import { type MCPLoadResult, MCPManager } from "./manager";
|
|
11
|
+
import { MCPToolCache } from "./tool-cache";
|
|
12
|
+
|
|
13
|
+
/** Result from loading MCP tools */
|
|
14
|
+
export interface MCPToolsLoadResult {
|
|
15
|
+
/** MCP manager (for lifecycle management) */
|
|
16
|
+
manager: MCPManager;
|
|
17
|
+
/** Loaded tools as LoadedCustomTool format */
|
|
18
|
+
tools: LoadedCustomTool[];
|
|
19
|
+
/** Errors keyed by server name */
|
|
20
|
+
errors: Array<{ path: string; error: string }>;
|
|
21
|
+
/** Connected server names */
|
|
22
|
+
connectedServers: string[];
|
|
23
|
+
/** Extracted Exa API keys from filtered MCP servers */
|
|
24
|
+
exaApiKeys: string[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Options for loading MCP tools */
|
|
28
|
+
export interface MCPToolsLoadOptions {
|
|
29
|
+
/** Called when starting to connect to servers */
|
|
30
|
+
onConnecting?: (serverNames: string[]) => void;
|
|
31
|
+
/** Whether to load project-level config (default: true) */
|
|
32
|
+
enableProjectConfig?: boolean;
|
|
33
|
+
/** Whether to filter out Exa MCP servers (default: true) */
|
|
34
|
+
filterExa?: boolean;
|
|
35
|
+
/** Whether to filter out browser MCP servers when builtin browser tool is enabled (default: false) */
|
|
36
|
+
filterBrowser?: boolean;
|
|
37
|
+
/** SQLite storage for MCP tool cache (null disables cache) */
|
|
38
|
+
cacheStorage?: AgentStorage | null;
|
|
39
|
+
/** Auth storage used to resolve OAuth credentials before initial MCP connect */
|
|
40
|
+
authStorage?: AuthStorage;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async function resolveToolCache(storage: AgentStorage | null | undefined): Promise<MCPToolCache | null> {
|
|
44
|
+
if (storage === null) return null;
|
|
45
|
+
try {
|
|
46
|
+
const resolved = storage ?? (await AgentStorage.open());
|
|
47
|
+
return new MCPToolCache(resolved);
|
|
48
|
+
} catch (error) {
|
|
49
|
+
logger.warn("MCP tool cache unavailable", { error: String(error) });
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Discover and load MCP tools from .mcp.json files.
|
|
56
|
+
*
|
|
57
|
+
* @param cwd Working directory (project root)
|
|
58
|
+
* @param options Load options including progress callbacks
|
|
59
|
+
* @returns MCP tools in LoadedCustomTool format for integration
|
|
60
|
+
*/
|
|
61
|
+
export async function discoverAndLoadMCPTools(cwd: string, options?: MCPToolsLoadOptions): Promise<MCPToolsLoadResult> {
|
|
62
|
+
const toolCache = await resolveToolCache(options?.cacheStorage);
|
|
63
|
+
const manager = new MCPManager(cwd, toolCache);
|
|
64
|
+
if (options?.authStorage) {
|
|
65
|
+
manager.setAuthStorage(options.authStorage);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
let result: MCPLoadResult;
|
|
69
|
+
try {
|
|
70
|
+
result = await manager.discoverAndConnect({
|
|
71
|
+
onConnecting: options?.onConnecting,
|
|
72
|
+
enableProjectConfig: options?.enableProjectConfig,
|
|
73
|
+
filterExa: options?.filterExa,
|
|
74
|
+
filterBrowser: options?.filterBrowser,
|
|
75
|
+
});
|
|
76
|
+
} catch (error) {
|
|
77
|
+
// If discovery fails entirely, return empty result
|
|
78
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
79
|
+
return {
|
|
80
|
+
manager,
|
|
81
|
+
tools: [],
|
|
82
|
+
errors: [{ path: ".mcp.json", error: message }],
|
|
83
|
+
connectedServers: [],
|
|
84
|
+
exaApiKeys: [],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Convert MCP tools to LoadedCustomTool format
|
|
89
|
+
const loadedTools: LoadedCustomTool[] = result.tools.map(tool => {
|
|
90
|
+
// MCPTool and DeferredMCPTool have these properties
|
|
91
|
+
const mcpTool = tool as { mcpServerName?: string };
|
|
92
|
+
const serverName = mcpTool.mcpServerName;
|
|
93
|
+
|
|
94
|
+
// Get provider info from manager's connection if available
|
|
95
|
+
const connection = serverName ? manager.getConnection(serverName) : undefined;
|
|
96
|
+
const source = serverName ? manager.getSource(serverName) : undefined;
|
|
97
|
+
const providerName =
|
|
98
|
+
connection?._source?.providerName ?? source?.providerName ?? connection?._source?.provider ?? source?.provider;
|
|
99
|
+
|
|
100
|
+
// Format path with provider info if available
|
|
101
|
+
// Format: "mcp:serverName via providerName" (e.g., "mcp:agentx via Claude Code")
|
|
102
|
+
const path = serverName && providerName ? `mcp:${serverName} via ${providerName}` : `mcp:${tool.name}`;
|
|
103
|
+
|
|
104
|
+
return {
|
|
105
|
+
path,
|
|
106
|
+
resolvedPath: `mcp:${tool.name}`,
|
|
107
|
+
tool: tool as any, // MCPToolDetails is compatible with CustomTool<TSchema, any>
|
|
108
|
+
};
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// Convert error map to array format
|
|
112
|
+
const errors: Array<{ path: string; error: string }> = [];
|
|
113
|
+
for (const [serverName, errorMsg] of result.errors) {
|
|
114
|
+
errors.push({ path: `mcp:${serverName}`, error: errorMsg });
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return {
|
|
118
|
+
manager,
|
|
119
|
+
tools: loadedTools,
|
|
120
|
+
errors,
|
|
121
|
+
connectedServers: result.connectedServers,
|
|
122
|
+
exaApiKeys: result.exaApiKeys,
|
|
123
|
+
};
|
|
124
|
+
}
|