@f5-sales-demo/xcsh 19.51.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 +7073 -0
- package/README.md +14 -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 +551 -0
- package/examples/extensions/reload-runtime.ts +37 -0
- package/examples/extensions/todo.ts +296 -0
- package/examples/extensions/tools.ts +145 -0
- package/examples/extensions/with-deps/index.ts +36 -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 +115 -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 +149 -0
- package/examples/hooks/permission-gate.ts +33 -0
- package/examples/hooks/protected-paths.ts +29 -0
- package/examples/hooks/qna.ts +118 -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 +41 -0
- package/examples/sdk/08-slash-commands.ts +46 -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 +172 -0
- package/package.json +539 -0
- package/scripts/build-info/resolvers.ts +51 -0
- package/scripts/capture-ax-fixture.ts +84 -0
- package/scripts/capture-login-fixture.ts +30 -0
- package/scripts/check-workflow-field-coverage.ts +101 -0
- package/scripts/extension-uat-harness.ts +340 -0
- package/scripts/format-prompts.ts +68 -0
- package/scripts/generate-api-spec-index.ts +580 -0
- package/scripts/generate-branding-index.ts +81 -0
- package/scripts/generate-build-info.ts +106 -0
- package/scripts/generate-console-catalog.ts +88 -0
- package/scripts/generate-console-field-metadata.ts +74 -0
- package/scripts/generate-docs-index.ts +40 -0
- package/scripts/generate-template.ts +32 -0
- package/scripts/generate-terraform-index.ts +81 -0
- package/scripts/mermaid-gallery.ts +132 -0
- package/scripts/uat-matrix-modalities.ts +451 -0
- package/scripts/uat-matrix-report.ts +175 -0
- package/scripts/uat-matrix.ts +353 -0
- package/src/async/index.ts +2 -0
- package/src/async/job-manager.ts +416 -0
- package/src/async/support.ts +5 -0
- package/src/autoresearch/apply-contract-to-state.ts +1 -0
- package/src/autoresearch/command-resume.md +17 -0
- package/src/autoresearch/contract.ts +205 -0
- package/src/autoresearch/dashboard.ts +374 -0
- package/src/autoresearch/git.ts +191 -0
- package/src/autoresearch/helpers.ts +328 -0
- package/src/autoresearch/index.ts +402 -0
- package/src/autoresearch/prompt.md +236 -0
- package/src/autoresearch/resume-message.md +16 -0
- package/src/autoresearch/state.ts +303 -0
- package/src/autoresearch/tools/init-experiment.ts +400 -0
- package/src/autoresearch/tools/log-experiment.ts +793 -0
- package/src/autoresearch/tools/run-experiment.ts +679 -0
- package/src/autoresearch/types.ts +114 -0
- package/src/browser/acquire.ts +249 -0
- package/src/browser/actions.ts +126 -0
- package/src/browser/auth.ts +176 -0
- package/src/browser/ax.ts +134 -0
- package/src/browser/cdp-core.ts +45 -0
- package/src/browser/cdp-page-actions.ts +51 -0
- package/src/browser/chrome-locate.ts +66 -0
- package/src/browser/dom-context.ts +89 -0
- package/src/browser/dt-context.ts +100 -0
- package/src/browser/extension-bridge.ts +182 -0
- package/src/browser/extension-page-actions.ts +397 -0
- package/src/browser/extension-provider.ts +373 -0
- package/src/browser/index.ts +17 -0
- package/src/browser/input-commit.ts +74 -0
- package/src/browser/native-messaging.ts +20 -0
- package/src/browser/page-actions.ts +18 -0
- package/src/browser/provider.ts +155 -0
- package/src/browser/resolver.ts +126 -0
- package/src/browser/selector.ts +40 -0
- package/src/bun-imports.d.ts +22 -0
- package/src/capability/context-file.ts +43 -0
- package/src/capability/extension-module.ts +34 -0
- package/src/capability/extension.ts +47 -0
- package/src/capability/fs.ts +107 -0
- package/src/capability/hook.ts +40 -0
- package/src/capability/index.ts +438 -0
- package/src/capability/instruction.ts +37 -0
- package/src/capability/mcp.ts +74 -0
- package/src/capability/prompt.ts +35 -0
- package/src/capability/rule.ts +224 -0
- package/src/capability/settings.ts +34 -0
- package/src/capability/skill.ts +50 -0
- package/src/capability/slash-command.ts +40 -0
- package/src/capability/ssh.ts +41 -0
- package/src/capability/system-prompt.ts +34 -0
- package/src/capability/tool.ts +38 -0
- package/src/capability/types.ts +168 -0
- package/src/cli/agents-cli.ts +138 -0
- package/src/cli/args.ts +286 -0
- package/src/cli/chrome-cli.ts +88 -0
- package/src/cli/classify-install-target.ts +50 -0
- package/src/cli/commands/init-xdg.ts +27 -0
- package/src/cli/config-cli.ts +418 -0
- package/src/cli/file-processor.ts +121 -0
- package/src/cli/grep-cli.ts +160 -0
- package/src/cli/grievances-cli.ts +78 -0
- package/src/cli/initial-message.ts +58 -0
- package/src/cli/jupyter-cli.ts +106 -0
- package/src/cli/list-models.ts +128 -0
- package/src/cli/plugin-cli.ts +964 -0
- package/src/cli/read-cli.ts +68 -0
- package/src/cli/session-picker.ts +52 -0
- package/src/cli/setup-cli.ts +479 -0
- package/src/cli/shell-cli.ts +174 -0
- package/src/cli/ssh-cli.ts +179 -0
- package/src/cli/stats-cli.ts +182 -0
- package/src/cli/update-cli.ts +446 -0
- package/src/cli/web-search-cli.ts +203 -0
- package/src/cli.ts +123 -0
- package/src/commands/agents.ts +57 -0
- package/src/commands/chrome-host.ts +71 -0
- package/src/commands/chrome.ts +28 -0
- package/src/commands/commit.ts +36 -0
- package/src/commands/config.ts +51 -0
- package/src/commands/grep.ts +48 -0
- package/src/commands/grievances.ts +20 -0
- package/src/commands/jupyter.ts +32 -0
- package/src/commands/launch.ts +144 -0
- package/src/commands/plugin.ts +78 -0
- package/src/commands/read.ts +33 -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 +46 -0
- package/src/commit/agentic/agent.ts +314 -0
- package/src/commit/agentic/fallback.ts +96 -0
- package/src/commit/agentic/index.ts +354 -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 +60 -0
- package/src/commit/agentic/tools/analyze-file.ts +127 -0
- package/src/commit/agentic/tools/git-file-diff.ts +191 -0
- package/src/commit/agentic/tools/git-hunk.ts +50 -0
- package/src/commit/agentic/tools/git-overview.ts +81 -0
- package/src/commit/agentic/tools/index.ts +54 -0
- package/src/commit/agentic/tools/propose-changelog.ts +139 -0
- package/src/commit/agentic/tools/propose-commit.ts +122 -0
- package/src/commit/agentic/tools/recent-commits.ts +81 -0
- package/src/commit/agentic/tools/schemas.ts +31 -0
- package/src/commit/agentic/tools/split-commit.ts +251 -0
- package/src/commit/agentic/topo-sort.ts +44 -0
- package/src/commit/agentic/trivial.ts +51 -0
- package/src/commit/agentic/validation.ts +183 -0
- package/src/commit/analysis/conventional.ts +122 -0
- package/src/commit/analysis/index.ts +4 -0
- package/src/commit/analysis/scope.ts +242 -0
- package/src/commit/analysis/summary.ts +105 -0
- package/src/commit/analysis/validation.ts +66 -0
- package/src/commit/changelog/detect.ts +40 -0
- package/src/commit/changelog/generate.ts +101 -0
- package/src/commit/changelog/index.ts +234 -0
- package/src/commit/changelog/parse.ts +44 -0
- package/src/commit/cli.ts +85 -0
- package/src/commit/git/diff.ts +148 -0
- package/src/commit/index.ts +5 -0
- package/src/commit/map-reduce/index.ts +69 -0
- package/src/commit/map-reduce/map-phase.ts +193 -0
- package/src/commit/map-reduce/reduce-phase.ts +108 -0
- package/src/commit/map-reduce/utils.ts +9 -0
- package/src/commit/message.ts +11 -0
- package/src/commit/model-selection.ts +66 -0
- package/src/commit/pipeline.ts +242 -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 +118 -0
- package/src/commit/utils/exclusions.ts +42 -0
- package/src/commit/utils.ts +44 -0
- package/src/config/auto-config.ts +698 -0
- package/src/config/context-schema.json +115 -0
- package/src/config/file-lock.ts +121 -0
- package/src/config/keybindings.ts +493 -0
- package/src/config/mcp-schema.json +230 -0
- package/src/config/model-equivalence.ts +675 -0
- package/src/config/model-registry.ts +2265 -0
- package/src/config/model-resolver.ts +1289 -0
- package/src/config/prompt-templates.ts +271 -0
- package/src/config/resolve-config-value.ts +110 -0
- package/src/config/settings-schema.ts +2155 -0
- package/src/config/settings.ts +730 -0
- package/src/config.ts +418 -0
- package/src/cursor.ts +323 -0
- package/src/dap/client.ts +674 -0
- package/src/dap/config.ts +150 -0
- package/src/dap/defaults.json +211 -0
- package/src/dap/index.ts +4 -0
- package/src/dap/session.ts +1255 -0
- package/src/dap/types.ts +600 -0
- package/src/debug/index.ts +440 -0
- package/src/debug/log-formatting.ts +58 -0
- package/src/debug/log-viewer.ts +908 -0
- package/src/debug/profiler.ts +158 -0
- package/src/debug/report-bundle.ts +365 -0
- package/src/debug/system-info.ts +107 -0
- package/src/discovery/agents-md.ts +67 -0
- package/src/discovery/agents.ts +219 -0
- package/src/discovery/builtin.ts +851 -0
- package/src/discovery/claude-plugins.ts +297 -0
- package/src/discovery/claude.ts +543 -0
- package/src/discovery/cline.ts +83 -0
- package/src/discovery/codex.ts +535 -0
- package/src/discovery/cursor.ts +220 -0
- package/src/discovery/gemini.ts +396 -0
- package/src/discovery/github.ts +118 -0
- package/src/discovery/helpers.ts +934 -0
- package/src/discovery/index.ts +79 -0
- package/src/discovery/language.ts +46 -0
- package/src/discovery/mcp-json.ts +171 -0
- package/src/discovery/opencode.ts +393 -0
- package/src/discovery/plugin-dir-roots.ts +28 -0
- package/src/discovery/ssh.ts +153 -0
- package/src/discovery/substitute-plugin-root.ts +29 -0
- package/src/discovery/vscode.ts +105 -0
- package/src/discovery/windsurf.ts +147 -0
- package/src/edit/diff.ts +818 -0
- package/src/edit/index.ts +481 -0
- package/src/edit/line-hash.ts +67 -0
- package/src/edit/modes/chunk.ts +762 -0
- package/src/edit/modes/hashline.ts +1366 -0
- package/src/edit/modes/patch.ts +1791 -0
- package/src/edit/modes/replace.ts +1115 -0
- package/src/edit/normalize.ts +375 -0
- package/src/edit/renderer.ts +627 -0
- package/src/exa/factory.ts +61 -0
- package/src/exa/index.ts +27 -0
- package/src/exa/mcp-client.ts +293 -0
- package/src/exa/render.ts +232 -0
- package/src/exa/researcher.ts +47 -0
- package/src/exa/search.ts +86 -0
- package/src/exa/types.ts +166 -0
- package/src/exa/websets.ts +247 -0
- package/src/exec/bash-executor.ts +332 -0
- package/src/exec/exec.ts +53 -0
- package/src/exec/idle-timeout-watchdog.ts +126 -0
- package/src/exec/non-interactive-env.ts +48 -0
- package/src/export/custom-share.ts +65 -0
- package/src/export/html/index.ts +161 -0
- package/src/export/html/template.css +1001 -0
- package/src/export/html/template.generated.ts +2 -0
- package/src/export/html/template.html +46 -0
- package/src/export/html/template.js +1950 -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/ci-green/index.ts +25 -0
- package/src/extensibility/custom-commands/bundled/review/index.ts +456 -0
- package/src/extensibility/custom-commands/index.ts +2 -0
- package/src/extensibility/custom-commands/loader.ts +236 -0
- package/src/extensibility/custom-commands/types.ts +111 -0
- package/src/extensibility/custom-tools/index.ts +7 -0
- package/src/extensibility/custom-tools/loader.ts +238 -0
- package/src/extensibility/custom-tools/types.ts +251 -0
- package/src/extensibility/custom-tools/wrapper.ts +47 -0
- package/src/extensibility/extensions/index.ts +15 -0
- package/src/extensibility/extensions/loader.ts +572 -0
- package/src/extensibility/extensions/runner.ts +848 -0
- package/src/extensibility/extensions/types.ts +1394 -0
- package/src/extensibility/extensions/wrapper.ts +191 -0
- package/src/extensibility/hooks/index.ts +5 -0
- package/src/extensibility/hooks/loader.ts +255 -0
- package/src/extensibility/hooks/runner.ts +425 -0
- package/src/extensibility/hooks/tool-wrapper.ts +108 -0
- package/src/extensibility/hooks/types.ts +826 -0
- package/src/extensibility/plugins/doctor.ts +66 -0
- package/src/extensibility/plugins/git-url.ts +281 -0
- package/src/extensibility/plugins/index.ts +9 -0
- package/src/extensibility/plugins/installer.ts +192 -0
- package/src/extensibility/plugins/loader.ts +267 -0
- package/src/extensibility/plugins/manager.ts +731 -0
- package/src/extensibility/plugins/marketplace/cache.ts +136 -0
- package/src/extensibility/plugins/marketplace/fetcher.ts +318 -0
- package/src/extensibility/plugins/marketplace/index.ts +6 -0
- package/src/extensibility/plugins/marketplace/manager.ts +781 -0
- package/src/extensibility/plugins/marketplace/prerequisites.ts +255 -0
- package/src/extensibility/plugins/marketplace/registry.ts +196 -0
- package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
- package/src/extensibility/plugins/marketplace/types.ts +201 -0
- package/src/extensibility/plugins/parser.ts +105 -0
- package/src/extensibility/plugins/types.ts +194 -0
- package/src/extensibility/skills.ts +269 -0
- package/src/extensibility/slash-commands.ts +246 -0
- package/src/extensibility/tool-proxy.ts +25 -0
- package/src/extensibility/utils.ts +38 -0
- package/src/index.ts +61 -0
- package/src/internal-urls/agent-protocol.ts +136 -0
- package/src/internal-urls/api-catalog-resolve.ts +495 -0
- package/src/internal-urls/api-catalog-types.ts +94 -0
- package/src/internal-urls/api-spec-resolve.ts +1036 -0
- package/src/internal-urls/api-spec-types.ts +239 -0
- package/src/internal-urls/artifact-protocol.ts +97 -0
- package/src/internal-urls/branding-index.generated.ts +88 -0
- package/src/internal-urls/build-info-runtime.ts +302 -0
- package/src/internal-urls/build-info.generated.ts +33 -0
- package/src/internal-urls/computer-profile.ts +692 -0
- package/src/internal-urls/console-catalog-types.ts +21 -0
- package/src/internal-urls/console-catalog.generated.ts +532 -0
- package/src/internal-urls/console-field-metadata-types.ts +59 -0
- package/src/internal-urls/console-field-metadata.generated.ts +4841 -0
- package/src/internal-urls/console-resolve.ts +178 -0
- package/src/internal-urls/docs-index.generated.ts +698 -0
- package/src/internal-urls/extension-api.md +147 -0
- package/src/internal-urls/index.ts +46 -0
- package/src/internal-urls/jobs-protocol.ts +119 -0
- package/src/internal-urls/json-query.ts +126 -0
- package/src/internal-urls/local-protocol.ts +206 -0
- package/src/internal-urls/mcp-protocol.ts +156 -0
- package/src/internal-urls/memory-protocol.ts +133 -0
- package/src/internal-urls/parse.ts +72 -0
- package/src/internal-urls/profile-collectors.ts +106 -0
- package/src/internal-urls/router.ts +55 -0
- package/src/internal-urls/rule-protocol.ts +55 -0
- package/src/internal-urls/skill-protocol.ts +111 -0
- package/src/internal-urls/terraform-index.generated.ts +1852 -0
- package/src/internal-urls/terraform-resolve.ts +184 -0
- package/src/internal-urls/terraform-types.ts +45 -0
- package/src/internal-urls/types.ts +52 -0
- package/src/internal-urls/user-profile.ts +363 -0
- package/src/internal-urls/xcsh-protocol.ts +644 -0
- package/src/ipy/cancellation.ts +28 -0
- package/src/ipy/executor.ts +1155 -0
- package/src/ipy/gateway-coordinator.ts +424 -0
- package/src/ipy/kernel.ts +1091 -0
- package/src/ipy/modules.ts +144 -0
- package/src/ipy/prelude.py +849 -0
- package/src/ipy/prelude.ts +3 -0
- package/src/ipy/runtime.ts +221 -0
- package/src/locales/ar.json +512 -0
- package/src/locales/de.json +512 -0
- package/src/locales/en.json +549 -0
- package/src/locales/es.json +512 -0
- package/src/locales/fr.json +512 -0
- package/src/locales/hi.json +512 -0
- package/src/locales/index.ts +29 -0
- package/src/locales/it.json +512 -0
- package/src/locales/ja.json +512 -0
- package/src/locales/ko.json +512 -0
- package/src/locales/pt-br.json +512 -0
- package/src/locales/th.json +512 -0
- package/src/locales/zh-cn.json +512 -0
- package/src/locales/zh-tw.json +512 -0
- package/src/lsp/client.ts +941 -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 +418 -0
- package/src/lsp/defaults.json +999 -0
- package/src/lsp/edits.ts +109 -0
- package/src/lsp/index.ts +1746 -0
- package/src/lsp/lspmux.ts +233 -0
- package/src/lsp/render.ts +692 -0
- package/src/lsp/startup-events.ts +13 -0
- package/src/lsp/types.ts +444 -0
- package/src/lsp/utils.ts +691 -0
- package/src/main.ts +944 -0
- package/src/mcp/client.ts +482 -0
- package/src/mcp/config-writer.ts +225 -0
- package/src/mcp/config.ts +365 -0
- package/src/mcp/discoverable-tool-metadata.ts +202 -0
- package/src/mcp/index.ts +29 -0
- package/src/mcp/json-rpc.ts +84 -0
- package/src/mcp/loader.ts +124 -0
- package/src/mcp/manager.ts +1152 -0
- package/src/mcp/oauth-discovery.ts +349 -0
- package/src/mcp/oauth-flow.ts +387 -0
- package/src/mcp/render.ts +157 -0
- package/src/mcp/smithery-auth.ts +104 -0
- package/src/mcp/smithery-connect.ts +145 -0
- package/src/mcp/smithery-registry.ts +477 -0
- package/src/mcp/tool-bridge.ts +417 -0
- package/src/mcp/tool-cache.ts +117 -0
- package/src/mcp/transports/http.ts +475 -0
- package/src/mcp/transports/index.ts +6 -0
- package/src/mcp/transports/stdio.ts +325 -0
- package/src/mcp/types.ts +423 -0
- package/src/memories/index.ts +1115 -0
- package/src/memories/storage.ts +577 -0
- package/src/modes/acp/acp-agent.ts +1361 -0
- package/src/modes/acp/acp-event-mapper.ts +538 -0
- package/src/modes/acp/acp-mode.ts +15 -0
- package/src/modes/acp/index.ts +2 -0
- package/src/modes/components/agent-dashboard.ts +1124 -0
- package/src/modes/components/assistant-message.ts +213 -0
- package/src/modes/components/bash-execution.ts +345 -0
- package/src/modes/components/bordered-loader.ts +41 -0
- package/src/modes/components/branch-summary-message.ts +45 -0
- package/src/modes/components/btw-panel.ts +103 -0
- package/src/modes/components/compaction-summary-message.ts +51 -0
- package/src/modes/components/context-add-wizard.ts +534 -0
- package/src/modes/components/countdown-timer.ts +75 -0
- package/src/modes/components/custom-editor.ts +238 -0
- package/src/modes/components/custom-message.ts +91 -0
- package/src/modes/components/diff.ts +210 -0
- package/src/modes/components/dynamic-border.ts +25 -0
- package/src/modes/components/extensions/extension-dashboard.ts +326 -0
- package/src/modes/components/extensions/extension-list.ts +492 -0
- package/src/modes/components/extensions/index.ts +9 -0
- package/src/modes/components/extensions/inspector-panel.ts +317 -0
- package/src/modes/components/extensions/state-manager.ts +587 -0
- package/src/modes/components/extensions/types.ts +191 -0
- package/src/modes/components/footer.ts +262 -0
- package/src/modes/components/gutter-block.ts +315 -0
- package/src/modes/components/history-search.ts +158 -0
- package/src/modes/components/hook-editor.ts +151 -0
- package/src/modes/components/hook-input.ts +81 -0
- package/src/modes/components/hook-message.ts +100 -0
- package/src/modes/components/hook-selector.ts +192 -0
- package/src/modes/components/index.ts +36 -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 +1314 -0
- package/src/modes/components/model-selector.ts +946 -0
- package/src/modes/components/oauth-selector.ts +211 -0
- package/src/modes/components/plugin-selector.ts +95 -0
- package/src/modes/components/plugin-settings.ts +477 -0
- package/src/modes/components/plugins/index.ts +5 -0
- package/src/modes/components/plugins/plugin-dashboard.ts +523 -0
- package/src/modes/components/plugins/plugin-inspector-pane.ts +84 -0
- package/src/modes/components/plugins/plugin-list-pane.ts +109 -0
- package/src/modes/components/plugins/state-manager.ts +229 -0
- package/src/modes/components/plugins/types.ts +51 -0
- package/src/modes/components/plugins/utils.ts +6 -0
- package/src/modes/components/python-execution.ts +244 -0
- package/src/modes/components/queue-mode-selector.ts +56 -0
- package/src/modes/components/read-tool-group.ts +137 -0
- package/src/modes/components/session-observer-overlay.ts +483 -0
- package/src/modes/components/session-selector.ts +343 -0
- package/src/modes/components/settings-defs.ts +568 -0
- package/src/modes/components/settings-selector.ts +641 -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/context-gradient.ts +64 -0
- package/src/modes/components/status-line/git-utils.ts +42 -0
- package/src/modes/components/status-line/hex-ansi.ts +29 -0
- package/src/modes/components/status-line/index.ts +4 -0
- package/src/modes/components/status-line/presets.ts +174 -0
- package/src/modes/components/status-line/segments.ts +494 -0
- package/src/modes/components/status-line/separators.ts +55 -0
- package/src/modes/components/status-line/token-rate.ts +66 -0
- package/src/modes/components/status-line/types.ts +96 -0
- package/src/modes/components/status-line-segment-editor.ts +361 -0
- package/src/modes/components/status-line.ts +729 -0
- package/src/modes/components/theme-selector.ts +63 -0
- package/src/modes/components/thinking-selector.ts +52 -0
- package/src/modes/components/todo-reminder.ts +54 -0
- package/src/modes/components/tool-execution.ts +781 -0
- package/src/modes/components/tree-selector.ts +908 -0
- package/src/modes/components/ttsr-notification.ts +80 -0
- package/src/modes/components/user-message-selector.ts +141 -0
- package/src/modes/components/user-message.ts +100 -0
- package/src/modes/components/visual-truncate.ts +63 -0
- package/src/modes/components/welcome-checks.ts +313 -0
- package/src/modes/components/welcome.ts +270 -0
- package/src/modes/controllers/btw-controller.ts +193 -0
- package/src/modes/controllers/chord-routing.ts +37 -0
- package/src/modes/controllers/command-controller.ts +1293 -0
- package/src/modes/controllers/context-command-controller.ts +61 -0
- package/src/modes/controllers/event-controller.ts +743 -0
- package/src/modes/controllers/extension-ui-controller.ts +983 -0
- package/src/modes/controllers/input-controller.ts +877 -0
- package/src/modes/controllers/mcp-command-controller.ts +1940 -0
- package/src/modes/controllers/selector-controller.ts +1292 -0
- package/src/modes/controllers/ssh-command-controller.ts +421 -0
- package/src/modes/index.ts +34 -0
- package/src/modes/interactive-mode.ts +1781 -0
- package/src/modes/oauth-manual-input.ts +42 -0
- package/src/modes/print-mode.ts +196 -0
- package/src/modes/prompt-action-autocomplete.ts +231 -0
- package/src/modes/rpc/host-tools.ts +186 -0
- package/src/modes/rpc/rpc-client.ts +762 -0
- package/src/modes/rpc/rpc-mode.ts +877 -0
- package/src/modes/rpc/rpc-types.ts +322 -0
- package/src/modes/session-observer-registry.ts +146 -0
- package/src/modes/shared.ts +30 -0
- package/src/modes/theme/defaults/index.ts +7 -0
- package/src/modes/theme/defaults/xcsh-dark.json +113 -0
- package/src/modes/theme/defaults/xcsh-light.json +115 -0
- package/src/modes/theme/mermaid-cache.ts +151 -0
- package/src/modes/theme/mermaid-palette.ts +39 -0
- package/src/modes/theme/theme-schema.json +553 -0
- package/src/modes/theme/theme.ts +2563 -0
- package/src/modes/types.ts +273 -0
- package/src/modes/utils/hotkeys-markdown.ts +60 -0
- package/src/modes/utils/keybinding-matchers.ts +30 -0
- package/src/modes/utils/read-group-outcome-aggregator.ts +55 -0
- package/src/modes/utils/sanitize-error-message.ts +60 -0
- package/src/modes/utils/tools-markdown.ts +28 -0
- package/src/modes/utils/ui-helpers.ts +734 -0
- package/src/plan-mode/approved-plan.ts +55 -0
- package/src/plan-mode/state.ts +6 -0
- package/src/priority.json +37 -0
- package/src/prompts/agents/designer.md +67 -0
- package/src/prompts/agents/explore.md +61 -0
- package/src/prompts/agents/frontmatter.md +10 -0
- package/src/prompts/agents/init.md +36 -0
- package/src/prompts/agents/librarian.md +121 -0
- package/src/prompts/agents/plan.md +49 -0
- package/src/prompts/agents/reviewer.md +127 -0
- package/src/prompts/agents/task.md +16 -0
- package/src/prompts/ci-green-request.md +35 -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 +70 -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/auto-handoff-threshold-focus.md +1 -0
- package/src/prompts/system/btw-user.md +8 -0
- package/src/prompts/system/commit-message-system.md +2 -0
- package/src/prompts/system/custom-system-prompt.md +82 -0
- package/src/prompts/system/eager-todo.md +13 -0
- package/src/prompts/system/file-operations.md +10 -0
- package/src/prompts/system/handoff-document.md +48 -0
- package/src/prompts/system/plan-mode-active.md +114 -0
- package/src/prompts/system/plan-mode-approved.md +23 -0
- package/src/prompts/system/plan-mode-reference.md +14 -0
- package/src/prompts/system/plan-mode-subagent.md +34 -0
- package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
- package/src/prompts/system/subagent-submit-reminder.md +7 -0
- package/src/prompts/system/subagent-system-prompt.md +36 -0
- package/src/prompts/system/subagent-user-prompt.md +12 -0
- package/src/prompts/system/summarization-system.md +3 -0
- package/src/prompts/system/system-prompt.md +698 -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 +28 -0
- package/src/prompts/tools/ast-edit.md +48 -0
- package/src/prompts/tools/ast-grep.md +54 -0
- package/src/prompts/tools/async-result.md +5 -0
- package/src/prompts/tools/bash.md +67 -0
- package/src/prompts/tools/browser.md +26 -0
- package/src/prompts/tools/calculator.md +10 -0
- package/src/prompts/tools/cancel-job.md +5 -0
- package/src/prompts/tools/catalog-workflow-runner.md +13 -0
- package/src/prompts/tools/checkpoint.md +16 -0
- package/src/prompts/tools/chunk-edit.md +279 -0
- package/src/prompts/tools/debug.md +43 -0
- package/src/prompts/tools/display-image.md +23 -0
- package/src/prompts/tools/exit-plan-mode.md +41 -0
- package/src/prompts/tools/find.md +26 -0
- package/src/prompts/tools/gemini-image.md +7 -0
- package/src/prompts/tools/grep.md +29 -0
- package/src/prompts/tools/hashline.md +131 -0
- package/src/prompts/tools/inspect-image-system.md +20 -0
- package/src/prompts/tools/inspect-image.md +32 -0
- package/src/prompts/tools/lsp.md +33 -0
- package/src/prompts/tools/patch.md +77 -0
- package/src/prompts/tools/poll.md +5 -0
- package/src/prompts/tools/python.md +60 -0
- package/src/prompts/tools/read-chunk.md +35 -0
- package/src/prompts/tools/read.md +63 -0
- package/src/prompts/tools/render-mermaid.md +9 -0
- package/src/prompts/tools/replace.md +36 -0
- package/src/prompts/tools/resolve.md +8 -0
- package/src/prompts/tools/rewind.md +13 -0
- package/src/prompts/tools/search-tool-bm25.md +34 -0
- package/src/prompts/tools/ssh.md +44 -0
- package/src/prompts/tools/task-summary.md +28 -0
- package/src/prompts/tools/task.md +131 -0
- package/src/prompts/tools/todo-write.md +89 -0
- package/src/prompts/tools/vim.md +98 -0
- package/src/prompts/tools/web-search.md +10 -0
- package/src/prompts/tools/write.md +14 -0
- package/src/prompts/tools/xcsh-api.md +283 -0
- package/src/resource-management/index.ts +42 -0
- package/src/sdk.ts +2123 -0
- package/src/secrets/index.ts +146 -0
- package/src/secrets/obfuscator.ts +290 -0
- package/src/secrets/regex.ts +21 -0
- package/src/services/context-env.ts +102 -0
- package/src/services/xcsh-api-client.ts +230 -0
- package/src/services/xcsh-context-command.ts +803 -0
- package/src/services/xcsh-context-display.ts +49 -0
- package/src/services/xcsh-context-indicators.ts +17 -0
- package/src/services/xcsh-context-segment.ts +39 -0
- package/src/services/xcsh-context.ts +1410 -0
- package/src/services/xcsh-env.ts +107 -0
- package/src/services/xcsh-knowledge.ts +177 -0
- package/src/services/xcsh-table.ts +164 -0
- package/src/session/agent-session.ts +6690 -0
- package/src/session/agent-storage.ts +451 -0
- package/src/session/artifacts.ts +132 -0
- package/src/session/auth-storage.ts +17 -0
- package/src/session/blob-store.ts +135 -0
- package/src/session/compaction/branch-summarization.ts +322 -0
- package/src/session/compaction/compaction.ts +1388 -0
- package/src/session/compaction/index.ts +7 -0
- package/src/session/compaction/pruning.ts +91 -0
- package/src/session/compaction/utils.ts +184 -0
- package/src/session/history-storage.ts +253 -0
- package/src/session/messages.ts +597 -0
- package/src/session/session-dump-format.ts +203 -0
- package/src/session/session-manager.ts +2816 -0
- package/src/session/session-storage.ts +370 -0
- package/src/session/streaming-output.ts +770 -0
- package/src/session/tool-choice-queue.ts +213 -0
- package/src/slash-commands/builtin-registry.ts +1614 -0
- package/src/slash-commands/export-command.ts +178 -0
- package/src/slash-commands/marketplace-install-parser.ts +99 -0
- package/src/slash-commands/resource-commands.ts +250 -0
- package/src/ssh/config-writer.ts +183 -0
- package/src/ssh/connection-manager.ts +445 -0
- package/src/ssh/ssh-executor.ts +131 -0
- package/src/ssh/sshfs-mount.ts +137 -0
- package/src/ssh/utils.ts +8 -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 +688 -0
- package/src/task/agents.ts +166 -0
- package/src/task/commands.ts +131 -0
- package/src/task/discovery.ts +126 -0
- package/src/task/executor.ts +1324 -0
- package/src/task/index.ts +1197 -0
- package/src/task/isolation-backend.ts +72 -0
- package/src/task/name-generator.ts +1577 -0
- package/src/task/output-manager.ts +107 -0
- package/src/task/parallel.ts +116 -0
- package/src/task/render.ts +1035 -0
- package/src/task/subprocess-tool-registry.ts +88 -0
- package/src/task/template.ts +33 -0
- package/src/task/types.ts +230 -0
- package/src/task/worktree.ts +580 -0
- package/src/task/xcsh-command.ts +26 -0
- package/src/thinking.ts +87 -0
- package/src/tools/action-renderer.ts +198 -0
- package/src/tools/archive-reader.ts +315 -0
- package/src/tools/ask.ts +791 -0
- package/src/tools/ast-edit.ts +492 -0
- package/src/tools/ast-grep.ts +453 -0
- package/src/tools/auto-generated-guard.ts +305 -0
- package/src/tools/bash-interactive.ts +383 -0
- package/src/tools/bash-interceptor.ts +67 -0
- package/src/tools/bash-normalize.ts +107 -0
- package/src/tools/bash-skill-urls.ts +246 -0
- package/src/tools/bash.ts +878 -0
- package/src/tools/browser-renderer.ts +129 -0
- package/src/tools/browser.ts +1366 -0
- package/src/tools/calculator.ts +543 -0
- package/src/tools/cancel-job.ts +100 -0
- package/src/tools/catalog-workflow-runner.ts +718 -0
- package/src/tools/checkpoint.ts +133 -0
- package/src/tools/context.ts +39 -0
- package/src/tools/debug.ts +1004 -0
- package/src/tools/display-image-renderer.ts +96 -0
- package/src/tools/display-image.ts +109 -0
- package/src/tools/exit-plan-mode.ts +101 -0
- package/src/tools/fetch.ts +1462 -0
- package/src/tools/find.ts +437 -0
- package/src/tools/fs-cache-invalidation.ts +33 -0
- package/src/tools/gemini-image.ts +1004 -0
- package/src/tools/grep.ts +705 -0
- package/src/tools/index.ts +442 -0
- package/src/tools/inspect-image-renderer.ts +101 -0
- package/src/tools/inspect-image.ts +176 -0
- package/src/tools/json-tree.ts +266 -0
- package/src/tools/jtd-to-json-schema.ts +199 -0
- package/src/tools/jtd-to-typescript.ts +136 -0
- package/src/tools/jtd-utils.ts +102 -0
- package/src/tools/list-limit.ts +40 -0
- package/src/tools/mermaid-renderer.ts +127 -0
- package/src/tools/notebook.ts +288 -0
- package/src/tools/output-meta.ts +588 -0
- package/src/tools/path-utils.ts +560 -0
- package/src/tools/plan-mode-guard.ts +41 -0
- package/src/tools/poll-tool.ts +177 -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 +1184 -0
- package/src/tools/read.ts +1591 -0
- package/src/tools/render-mermaid.ts +93 -0
- package/src/tools/render-utils.ts +677 -0
- package/src/tools/renderers.ts +82 -0
- package/src/tools/report-tool-issue.ts +80 -0
- package/src/tools/resolve.ts +196 -0
- package/src/tools/review.ts +238 -0
- package/src/tools/search-tool-bm25.ts +288 -0
- package/src/tools/sqlite-reader.ts +623 -0
- package/src/tools/ssh.ts +322 -0
- package/src/tools/submit-result.ts +229 -0
- package/src/tools/todo-render.ts +33 -0
- package/src/tools/todo-write.ts +440 -0
- package/src/tools/tool-errors.ts +62 -0
- package/src/tools/tool-result.ts +93 -0
- package/src/tools/tool-timeouts.ts +30 -0
- package/src/tools/vim.ts +981 -0
- package/src/tools/write.ts +671 -0
- package/src/tools/xcsh-api-renderer.ts +402 -0
- package/src/tools/xcsh-api.ts +887 -0
- package/src/tui/code-cell.ts +101 -0
- package/src/tui/file-list.ts +47 -0
- package/src/tui/index.ts +11 -0
- package/src/tui/output-block.ts +175 -0
- package/src/tui/status-line.ts +39 -0
- package/src/tui/tree-list.ts +84 -0
- package/src/tui/types.ts +15 -0
- package/src/tui/utils.ts +103 -0
- package/src/utils/changelog.ts +98 -0
- package/src/utils/clipboard.ts +80 -0
- package/src/utils/command-args.ts +76 -0
- package/src/utils/commit-message-generator.ts +137 -0
- package/src/utils/edit-mode.ts +50 -0
- package/src/utils/event-bus.ts +33 -0
- package/src/utils/external-editor.ts +65 -0
- package/src/utils/file-display-mode.ts +37 -0
- package/src/utils/file-mentions.ts +376 -0
- package/src/utils/fuzzy.ts +108 -0
- package/src/utils/git.ts +1495 -0
- package/src/utils/gitstatus.ts +140 -0
- package/src/utils/image-convert.ts +27 -0
- package/src/utils/image-loading.ts +98 -0
- package/src/utils/image-passthrough.ts +118 -0
- package/src/utils/image-resize.ts +272 -0
- package/src/utils/image-viewer.ts +17 -0
- package/src/utils/lang-from-path.ts +239 -0
- package/src/utils/markit.ts +81 -0
- package/src/utils/open.ts +20 -0
- package/src/utils/session-color.ts +55 -0
- package/src/utils/shell-snapshot.ts +188 -0
- package/src/utils/title-generator.ts +193 -0
- package/src/utils/tool-choice.ts +28 -0
- package/src/utils/tools-manager.ts +356 -0
- package/src/vim/buffer.ts +309 -0
- package/src/vim/commands.ts +382 -0
- package/src/vim/engine.ts +2426 -0
- package/src/vim/parser.ts +151 -0
- package/src/vim/render.ts +252 -0
- package/src/vim/types.ts +197 -0
- package/src/web/kagi.ts +174 -0
- package/src/web/parallel.ts +346 -0
- package/src/web/scrapers/artifacthub.ts +207 -0
- package/src/web/scrapers/arxiv.ts +83 -0
- package/src/web/scrapers/aur.ts +162 -0
- package/src/web/scrapers/biorxiv.ts +133 -0
- package/src/web/scrapers/bluesky.ts +262 -0
- package/src/web/scrapers/brew.ts +172 -0
- package/src/web/scrapers/cheatsh.ts +68 -0
- package/src/web/scrapers/chocolatey.ts +196 -0
- package/src/web/scrapers/choosealicense.ts +95 -0
- package/src/web/scrapers/cisa-kev.ts +87 -0
- package/src/web/scrapers/clojars.ts +154 -0
- package/src/web/scrapers/coingecko.ts +177 -0
- package/src/web/scrapers/crates-io.ts +110 -0
- package/src/web/scrapers/crossref.ts +136 -0
- package/src/web/scrapers/devto.ts +147 -0
- package/src/web/scrapers/discogs.ts +306 -0
- package/src/web/scrapers/discourse.ts +197 -0
- package/src/web/scrapers/dockerhub.ts +138 -0
- package/src/web/scrapers/docs-rs.ts +653 -0
- package/src/web/scrapers/fdroid.ts +134 -0
- package/src/web/scrapers/firefox-addons.ts +191 -0
- package/src/web/scrapers/flathub.ts +223 -0
- package/src/web/scrapers/github-gist.ts +58 -0
- package/src/web/scrapers/github.ts +452 -0
- package/src/web/scrapers/gitlab.ts +401 -0
- package/src/web/scrapers/go-pkg.ts +266 -0
- package/src/web/scrapers/hackage.ts +140 -0
- package/src/web/scrapers/hackernews.ts +189 -0
- package/src/web/scrapers/hex.ts +105 -0
- package/src/web/scrapers/huggingface.ts +321 -0
- package/src/web/scrapers/iacr.ts +89 -0
- package/src/web/scrapers/index.ts +252 -0
- package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
- package/src/web/scrapers/lemmy.ts +203 -0
- package/src/web/scrapers/lobsters.ts +175 -0
- package/src/web/scrapers/mastodon.ts +292 -0
- package/src/web/scrapers/maven.ts +138 -0
- package/src/web/scrapers/mdn.ts +169 -0
- package/src/web/scrapers/metacpan.ts +222 -0
- package/src/web/scrapers/musicbrainz.ts +250 -0
- package/src/web/scrapers/npm.ts +98 -0
- package/src/web/scrapers/nuget.ts +183 -0
- package/src/web/scrapers/nvd.ts +222 -0
- package/src/web/scrapers/ollama.ts +239 -0
- package/src/web/scrapers/open-vsx.ts +106 -0
- package/src/web/scrapers/opencorporates.ts +292 -0
- package/src/web/scrapers/openlibrary.ts +336 -0
- package/src/web/scrapers/orcid.ts +286 -0
- package/src/web/scrapers/osv.ts +176 -0
- package/src/web/scrapers/packagist.ts +160 -0
- package/src/web/scrapers/pub-dev.ts +143 -0
- package/src/web/scrapers/pubmed.ts +211 -0
- package/src/web/scrapers/pypi.ts +112 -0
- package/src/web/scrapers/rawg.ts +110 -0
- package/src/web/scrapers/readthedocs.ts +120 -0
- package/src/web/scrapers/reddit.ts +95 -0
- package/src/web/scrapers/repology.ts +251 -0
- package/src/web/scrapers/rfc.ts +201 -0
- package/src/web/scrapers/rubygems.ts +103 -0
- package/src/web/scrapers/searchcode.ts +190 -0
- package/src/web/scrapers/sec-edgar.ts +261 -0
- package/src/web/scrapers/semantic-scholar.ts +171 -0
- package/src/web/scrapers/snapcraft.ts +187 -0
- package/src/web/scrapers/sourcegraph.ts +336 -0
- package/src/web/scrapers/spdx.ts +108 -0
- package/src/web/scrapers/spotify.ts +198 -0
- package/src/web/scrapers/stackoverflow.ts +120 -0
- package/src/web/scrapers/terraform.ts +277 -0
- package/src/web/scrapers/tldr.ts +47 -0
- package/src/web/scrapers/twitter.ts +93 -0
- package/src/web/scrapers/types.ts +267 -0
- package/src/web/scrapers/utils.ts +109 -0
- package/src/web/scrapers/vimeo.ts +133 -0
- package/src/web/scrapers/vscode-marketplace.ts +187 -0
- package/src/web/scrapers/w3c.ts +156 -0
- package/src/web/scrapers/wikidata.ts +344 -0
- package/src/web/scrapers/wikipedia.ts +84 -0
- package/src/web/scrapers/youtube.ts +313 -0
- package/src/web/search/errors.ts +120 -0
- package/src/web/search/index.ts +346 -0
- package/src/web/search/params.ts +129 -0
- package/src/web/search/provider.ts +97 -0
- package/src/web/search/providers/anthropic.ts +339 -0
- package/src/web/search/providers/base.ts +35 -0
- package/src/web/search/providers/brave.ts +150 -0
- package/src/web/search/providers/codex.ts +402 -0
- package/src/web/search/providers/exa.ts +264 -0
- package/src/web/search/providers/firecrawl.ts +115 -0
- package/src/web/search/providers/gemini.ts +566 -0
- package/src/web/search/providers/jina.ts +99 -0
- package/src/web/search/providers/kagi.ts +70 -0
- package/src/web/search/providers/kimi.ts +157 -0
- package/src/web/search/providers/parallel.ts +63 -0
- package/src/web/search/providers/perplexity.ts +546 -0
- package/src/web/search/providers/synthetic.ts +113 -0
- package/src/web/search/providers/tavily.ts +162 -0
- package/src/web/search/providers/utils.ts +36 -0
- package/src/web/search/providers/zai.ts +311 -0
- package/src/web/search/render.ts +348 -0
- package/src/web/search/types.ts +438 -0
- package/src/web/search/utils.ts +17 -0
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Client.
|
|
3
|
+
*
|
|
4
|
+
* Handles connection initialization, tool listing, and tool calling.
|
|
5
|
+
*/
|
|
6
|
+
import * as path from "node:path";
|
|
7
|
+
import * as url from "node:url";
|
|
8
|
+
import { getProjectDir, logger, withTimeout } from "@f5xc-salesdemos/pi-utils";
|
|
9
|
+
import { createHttpTransport } from "./transports/http";
|
|
10
|
+
import { createStdioTransport } from "./transports/stdio";
|
|
11
|
+
import type {
|
|
12
|
+
MCPGetPromptParams,
|
|
13
|
+
MCPGetPromptResult,
|
|
14
|
+
MCPHttpServerConfig,
|
|
15
|
+
MCPInitializeParams,
|
|
16
|
+
MCPInitializeResult,
|
|
17
|
+
MCPPrompt,
|
|
18
|
+
MCPPromptsListResult,
|
|
19
|
+
MCPRequestOptions,
|
|
20
|
+
MCPResource,
|
|
21
|
+
MCPResourceReadParams,
|
|
22
|
+
MCPResourceReadResult,
|
|
23
|
+
MCPResourceSubscribeParams,
|
|
24
|
+
MCPResourcesListResult,
|
|
25
|
+
MCPResourceTemplate,
|
|
26
|
+
MCPResourceTemplatesListResult,
|
|
27
|
+
MCPServerCapabilities,
|
|
28
|
+
MCPServerConfig,
|
|
29
|
+
MCPServerConnection,
|
|
30
|
+
MCPSseServerConfig,
|
|
31
|
+
MCPStdioServerConfig,
|
|
32
|
+
MCPToolCallParams,
|
|
33
|
+
MCPToolCallResult,
|
|
34
|
+
MCPToolDefinition,
|
|
35
|
+
MCPToolsListResult,
|
|
36
|
+
MCPTransport,
|
|
37
|
+
} from "./types";
|
|
38
|
+
|
|
39
|
+
/** MCP protocol version we support */
|
|
40
|
+
const PROTOCOL_VERSION = "2025-03-26";
|
|
41
|
+
|
|
42
|
+
/** Default connection timeout in ms */
|
|
43
|
+
const CONNECTION_TIMEOUT_MS = 30_000;
|
|
44
|
+
|
|
45
|
+
/** Client info sent during initialization */
|
|
46
|
+
const CLIENT_INFO = {
|
|
47
|
+
name: "xcsh-coding-agent",
|
|
48
|
+
version: "1.0.0",
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Default handler for standard MCP server-to-client requests.
|
|
53
|
+
* Handles `ping` and `roots/list`; rejects unknown methods with -32601.
|
|
54
|
+
* Reads getProjectDir() at call time so the root stays stable even if
|
|
55
|
+
* the process cwd changes during tool execution.
|
|
56
|
+
*/
|
|
57
|
+
async function defaultRequestHandler(method: string, _params: unknown): Promise<unknown> {
|
|
58
|
+
switch (method) {
|
|
59
|
+
case "ping":
|
|
60
|
+
return {};
|
|
61
|
+
case "roots/list": {
|
|
62
|
+
const cwd = getProjectDir();
|
|
63
|
+
return {
|
|
64
|
+
roots: [{ uri: url.pathToFileURL(cwd).href, name: path.basename(cwd) }],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
default:
|
|
68
|
+
throw Object.assign(new Error(`Unsupported server request: ${method}`), { code: -32601 });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Create a transport for the given server config.
|
|
74
|
+
*/
|
|
75
|
+
async function createTransport(config: MCPServerConfig): Promise<MCPTransport> {
|
|
76
|
+
const serverType = config.type ?? "stdio";
|
|
77
|
+
|
|
78
|
+
switch (serverType) {
|
|
79
|
+
case "stdio":
|
|
80
|
+
return createStdioTransport(config as MCPStdioServerConfig);
|
|
81
|
+
case "http":
|
|
82
|
+
case "sse":
|
|
83
|
+
return createHttpTransport(config as MCPHttpServerConfig | MCPSseServerConfig);
|
|
84
|
+
default:
|
|
85
|
+
throw new Error(`Unknown server type: ${serverType}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Initialize connection with MCP server.
|
|
91
|
+
*/
|
|
92
|
+
async function initializeConnection(
|
|
93
|
+
transport: MCPTransport,
|
|
94
|
+
options?: {
|
|
95
|
+
signal?: AbortSignal;
|
|
96
|
+
/** Called after the initialize response (which sets the session ID) but before notifications/initialized. */
|
|
97
|
+
onInitialized?: () => void | Promise<void>;
|
|
98
|
+
},
|
|
99
|
+
): Promise<MCPInitializeResult> {
|
|
100
|
+
const params: MCPInitializeParams = {
|
|
101
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
102
|
+
capabilities: {
|
|
103
|
+
roots: { listChanged: false },
|
|
104
|
+
},
|
|
105
|
+
clientInfo: CLIENT_INFO,
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const result = await transport.request<MCPInitializeResult>(
|
|
109
|
+
"initialize",
|
|
110
|
+
params as unknown as Record<string, unknown>,
|
|
111
|
+
{ signal: options?.signal },
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
if (options?.signal?.aborted) {
|
|
115
|
+
throw options.signal.reason instanceof Error ? options.signal.reason : new Error("Aborted");
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Hook point: the transport now has the session ID from the initialize response.
|
|
119
|
+
// For HTTP, this is the moment to open the SSE stream so server-to-client requests
|
|
120
|
+
// triggered by notifications/initialized (e.g. roots/list) can be delivered.
|
|
121
|
+
await options?.onInitialized?.();
|
|
122
|
+
|
|
123
|
+
// Send initialized notification
|
|
124
|
+
await transport.notify("notifications/initialized");
|
|
125
|
+
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Connect to an MCP server.
|
|
131
|
+
* Has a 30 second timeout to prevent blocking startup.
|
|
132
|
+
*/
|
|
133
|
+
export async function connectToServer(
|
|
134
|
+
name: string,
|
|
135
|
+
config: MCPServerConfig,
|
|
136
|
+
options?: {
|
|
137
|
+
signal?: AbortSignal;
|
|
138
|
+
onNotification?: (method: string, params: unknown) => void;
|
|
139
|
+
onRequest?: (method: string, params: unknown) => Promise<unknown>;
|
|
140
|
+
},
|
|
141
|
+
): Promise<MCPServerConnection> {
|
|
142
|
+
const timeoutMs = config.timeout ?? CONNECTION_TIMEOUT_MS;
|
|
143
|
+
let transport: MCPTransport | undefined;
|
|
144
|
+
|
|
145
|
+
const connect = async (): Promise<MCPServerConnection> => {
|
|
146
|
+
transport = await createTransport(config);
|
|
147
|
+
if (options?.onNotification) {
|
|
148
|
+
transport.onNotification = options.onNotification;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Always handle standard MCP server-to-client requests (ping, roots/list).
|
|
152
|
+
// The initialize request declares roots capability, so we must respond to
|
|
153
|
+
// roots/list — even for short-lived test connections.
|
|
154
|
+
transport.onRequest = options?.onRequest ?? defaultRequestHandler;
|
|
155
|
+
|
|
156
|
+
try {
|
|
157
|
+
const initResult = await initializeConnection(transport, {
|
|
158
|
+
signal: options?.signal,
|
|
159
|
+
async onInitialized() {
|
|
160
|
+
// Open the SSE stream before sending initialized, so server-to-client
|
|
161
|
+
// requests triggered by on_initialized (e.g. roots/list) are delivered.
|
|
162
|
+
if ("startSSEListener" in transport! && typeof transport!.startSSEListener === "function") {
|
|
163
|
+
await (transport as { startSSEListener(): Promise<void> }).startSSEListener();
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
return {
|
|
169
|
+
name,
|
|
170
|
+
config,
|
|
171
|
+
transport,
|
|
172
|
+
serverInfo: initResult.serverInfo,
|
|
173
|
+
capabilities: initResult.capabilities,
|
|
174
|
+
instructions: initResult.instructions,
|
|
175
|
+
};
|
|
176
|
+
} catch (error) {
|
|
177
|
+
await transport.close();
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
try {
|
|
183
|
+
return await withTimeout(
|
|
184
|
+
connect(),
|
|
185
|
+
timeoutMs,
|
|
186
|
+
`Connection to MCP server "${name}" timed out after ${timeoutMs}ms`,
|
|
187
|
+
options?.signal,
|
|
188
|
+
);
|
|
189
|
+
} catch (error) {
|
|
190
|
+
// If withTimeout rejected (timeout/abort) while connect() was still pending,
|
|
191
|
+
// the transport may be alive with an open SSE listener. Close it.
|
|
192
|
+
if (transport) {
|
|
193
|
+
void transport.close().catch(() => {});
|
|
194
|
+
}
|
|
195
|
+
throw error;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* List tools from a connected server.
|
|
201
|
+
*/
|
|
202
|
+
export async function listTools(
|
|
203
|
+
connection: MCPServerConnection,
|
|
204
|
+
options?: { signal?: AbortSignal },
|
|
205
|
+
): Promise<MCPToolDefinition[]> {
|
|
206
|
+
// Check if server supports tools
|
|
207
|
+
if (!connection.capabilities.tools) {
|
|
208
|
+
return [];
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Return cached tools if available
|
|
212
|
+
if (connection.tools) {
|
|
213
|
+
return connection.tools;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const allTools: MCPToolDefinition[] = [];
|
|
217
|
+
let cursor: string | undefined;
|
|
218
|
+
|
|
219
|
+
do {
|
|
220
|
+
const params: Record<string, unknown> = {};
|
|
221
|
+
if (cursor) {
|
|
222
|
+
params.cursor = cursor;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const result = await connection.transport.request<MCPToolsListResult>("tools/list", params, options);
|
|
226
|
+
allTools.push(...result.tools);
|
|
227
|
+
cursor = result.nextCursor;
|
|
228
|
+
} while (cursor);
|
|
229
|
+
|
|
230
|
+
// Cache tools
|
|
231
|
+
connection.tools = allTools;
|
|
232
|
+
|
|
233
|
+
return allTools;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Call a tool on a connected server.
|
|
238
|
+
*/
|
|
239
|
+
export async function callTool(
|
|
240
|
+
connection: MCPServerConnection,
|
|
241
|
+
toolName: string,
|
|
242
|
+
args: Record<string, unknown> = {},
|
|
243
|
+
options?: MCPRequestOptions,
|
|
244
|
+
): Promise<MCPToolCallResult> {
|
|
245
|
+
const params: MCPToolCallParams = {
|
|
246
|
+
name: toolName,
|
|
247
|
+
arguments: args,
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
return connection.transport.request<MCPToolCallResult>(
|
|
251
|
+
"tools/call",
|
|
252
|
+
params as unknown as Record<string, unknown>,
|
|
253
|
+
options,
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Disconnect from a server.
|
|
259
|
+
*/
|
|
260
|
+
export async function disconnectServer(connection: MCPServerConnection): Promise<void> {
|
|
261
|
+
await connection.transport.close();
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Check if a server supports tools.
|
|
266
|
+
*/
|
|
267
|
+
export function serverSupportsTools(capabilities: MCPServerCapabilities): boolean {
|
|
268
|
+
return capabilities.tools !== undefined;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* List resources from a connected server.
|
|
273
|
+
*/
|
|
274
|
+
export async function listResources(
|
|
275
|
+
connection: MCPServerConnection,
|
|
276
|
+
options?: { signal?: AbortSignal },
|
|
277
|
+
): Promise<MCPResource[]> {
|
|
278
|
+
if (!connection.capabilities.resources) {
|
|
279
|
+
return [];
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
if (connection.resources) {
|
|
283
|
+
return connection.resources;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const allResources: MCPResource[] = [];
|
|
287
|
+
let cursor: string | undefined;
|
|
288
|
+
|
|
289
|
+
do {
|
|
290
|
+
const params: Record<string, unknown> = {};
|
|
291
|
+
if (cursor) {
|
|
292
|
+
params.cursor = cursor;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
const result = await connection.transport.request<MCPResourcesListResult>("resources/list", params, options);
|
|
296
|
+
allResources.push(...result.resources);
|
|
297
|
+
cursor = result.nextCursor;
|
|
298
|
+
} while (cursor);
|
|
299
|
+
|
|
300
|
+
connection.resources = allResources;
|
|
301
|
+
return allResources;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* List resource templates from a connected server.
|
|
306
|
+
*/
|
|
307
|
+
export async function listResourceTemplates(
|
|
308
|
+
connection: MCPServerConnection,
|
|
309
|
+
options?: { signal?: AbortSignal },
|
|
310
|
+
): Promise<MCPResourceTemplate[]> {
|
|
311
|
+
if (!connection.capabilities.resources) {
|
|
312
|
+
return [];
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
if (connection.resourceTemplates) {
|
|
316
|
+
return connection.resourceTemplates;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
const allTemplates: MCPResourceTemplate[] = [];
|
|
320
|
+
let cursor: string | undefined;
|
|
321
|
+
|
|
322
|
+
do {
|
|
323
|
+
const params: Record<string, unknown> = {};
|
|
324
|
+
if (cursor) {
|
|
325
|
+
params.cursor = cursor;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
const result = await connection.transport.request<MCPResourceTemplatesListResult>(
|
|
329
|
+
"resources/templates/list",
|
|
330
|
+
params,
|
|
331
|
+
options,
|
|
332
|
+
);
|
|
333
|
+
allTemplates.push(...result.resourceTemplates);
|
|
334
|
+
cursor = result.nextCursor;
|
|
335
|
+
} while (cursor);
|
|
336
|
+
|
|
337
|
+
connection.resourceTemplates = allTemplates;
|
|
338
|
+
return allTemplates;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Read a resource from a connected server.
|
|
343
|
+
*/
|
|
344
|
+
export async function readResource(
|
|
345
|
+
connection: MCPServerConnection,
|
|
346
|
+
uri: string,
|
|
347
|
+
options?: MCPRequestOptions,
|
|
348
|
+
): Promise<MCPResourceReadResult> {
|
|
349
|
+
const params: MCPResourceReadParams = { uri };
|
|
350
|
+
return connection.transport.request<MCPResourceReadResult>(
|
|
351
|
+
"resources/read",
|
|
352
|
+
params as unknown as Record<string, unknown>,
|
|
353
|
+
options,
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Subscribe to resource update notifications.
|
|
359
|
+
*/
|
|
360
|
+
export async function subscribeToResources(
|
|
361
|
+
connection: MCPServerConnection,
|
|
362
|
+
uris: string[],
|
|
363
|
+
options?: MCPRequestOptions,
|
|
364
|
+
): Promise<void> {
|
|
365
|
+
if (uris.length === 0 || !connection.capabilities.resources?.subscribe) return;
|
|
366
|
+
const results = await Promise.allSettled(
|
|
367
|
+
uris.map(uri => {
|
|
368
|
+
const params: MCPResourceSubscribeParams = { uri };
|
|
369
|
+
return connection.transport.request(
|
|
370
|
+
"resources/subscribe",
|
|
371
|
+
params as unknown as Record<string, unknown>,
|
|
372
|
+
options,
|
|
373
|
+
);
|
|
374
|
+
}),
|
|
375
|
+
);
|
|
376
|
+
for (const result of results) {
|
|
377
|
+
if (result.status === "rejected") {
|
|
378
|
+
logger.warn("Failed to subscribe to MCP resource", { error: result.reason });
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Unsubscribe from resource update notifications.
|
|
385
|
+
*/
|
|
386
|
+
export async function unsubscribeFromResources(
|
|
387
|
+
connection: MCPServerConnection,
|
|
388
|
+
uris: string[],
|
|
389
|
+
options?: MCPRequestOptions,
|
|
390
|
+
): Promise<void> {
|
|
391
|
+
if (uris.length === 0 || !connection.capabilities.resources?.subscribe) return;
|
|
392
|
+
const results = await Promise.allSettled(
|
|
393
|
+
uris.map(uri => {
|
|
394
|
+
const params: MCPResourceSubscribeParams = { uri };
|
|
395
|
+
return connection.transport.request(
|
|
396
|
+
"resources/unsubscribe",
|
|
397
|
+
params as unknown as Record<string, unknown>,
|
|
398
|
+
options,
|
|
399
|
+
);
|
|
400
|
+
}),
|
|
401
|
+
);
|
|
402
|
+
for (const result of results) {
|
|
403
|
+
if (result.status === "rejected") {
|
|
404
|
+
logger.warn("Failed to unsubscribe from MCP resource", { error: result.reason });
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Check if a server supports resource subscriptions.
|
|
411
|
+
*/
|
|
412
|
+
export function serverSupportsResourceSubscriptions(capabilities: MCPServerCapabilities): boolean {
|
|
413
|
+
return capabilities.resources?.subscribe === true;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* Check if a server supports resources.
|
|
418
|
+
*/
|
|
419
|
+
export function serverSupportsResources(capabilities: MCPServerCapabilities): boolean {
|
|
420
|
+
return capabilities.resources !== undefined;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* List prompts from a connected server.
|
|
425
|
+
*/
|
|
426
|
+
export async function listPrompts(
|
|
427
|
+
connection: MCPServerConnection,
|
|
428
|
+
options?: { signal?: AbortSignal },
|
|
429
|
+
): Promise<MCPPrompt[]> {
|
|
430
|
+
if (!connection.capabilities.prompts) {
|
|
431
|
+
return [];
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
if (connection.prompts) {
|
|
435
|
+
return connection.prompts;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
const allPrompts: MCPPrompt[] = [];
|
|
439
|
+
let cursor: string | undefined;
|
|
440
|
+
|
|
441
|
+
do {
|
|
442
|
+
const params: Record<string, unknown> = {};
|
|
443
|
+
if (cursor) {
|
|
444
|
+
params.cursor = cursor;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
const result = await connection.transport.request<MCPPromptsListResult>("prompts/list", params, options);
|
|
448
|
+
allPrompts.push(...result.prompts);
|
|
449
|
+
cursor = result.nextCursor;
|
|
450
|
+
} while (cursor);
|
|
451
|
+
|
|
452
|
+
connection.prompts = allPrompts;
|
|
453
|
+
return allPrompts;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
/**
|
|
457
|
+
* Get a specific prompt from a connected server.
|
|
458
|
+
*/
|
|
459
|
+
export async function getPrompt(
|
|
460
|
+
connection: MCPServerConnection,
|
|
461
|
+
name: string,
|
|
462
|
+
args?: Record<string, string>,
|
|
463
|
+
options?: MCPRequestOptions,
|
|
464
|
+
): Promise<MCPGetPromptResult> {
|
|
465
|
+
const params: MCPGetPromptParams = { name };
|
|
466
|
+
if (args && Object.keys(args).length > 0) {
|
|
467
|
+
params.arguments = args;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
return connection.transport.request<MCPGetPromptResult>(
|
|
471
|
+
"prompts/get",
|
|
472
|
+
params as unknown as Record<string, unknown>,
|
|
473
|
+
options,
|
|
474
|
+
);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* Check if a server supports prompts.
|
|
479
|
+
*/
|
|
480
|
+
export function serverSupportsPrompts(capabilities: MCPServerCapabilities): boolean {
|
|
481
|
+
return capabilities.prompts !== undefined;
|
|
482
|
+
}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Configuration File Writer
|
|
3
|
+
*
|
|
4
|
+
* Utilities for reading/writing .xcsh/mcp.json files at user or project level.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from "node:fs";
|
|
7
|
+
import * as path from "node:path";
|
|
8
|
+
import { isEnoent } from "@f5xc-salesdemos/pi-utils";
|
|
9
|
+
import { invalidate as invalidateFsCache } from "../capability/fs";
|
|
10
|
+
|
|
11
|
+
import { validateServerConfig } from "./config";
|
|
12
|
+
import { MCP_CONFIG_SCHEMA_URL, type MCPConfigFile, type MCPServerConfig } from "./types";
|
|
13
|
+
|
|
14
|
+
function withSchema(config: MCPConfigFile): MCPConfigFile {
|
|
15
|
+
return {
|
|
16
|
+
$schema: config.$schema ?? MCP_CONFIG_SCHEMA_URL,
|
|
17
|
+
...config,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Read an MCP config file.
|
|
23
|
+
* Returns empty config if file doesn't exist.
|
|
24
|
+
*/
|
|
25
|
+
export async function readMCPConfigFile(filePath: string): Promise<MCPConfigFile> {
|
|
26
|
+
try {
|
|
27
|
+
const content = await fs.promises.readFile(filePath, "utf-8");
|
|
28
|
+
const parsed = JSON.parse(content) as MCPConfigFile;
|
|
29
|
+
return parsed;
|
|
30
|
+
} catch (error) {
|
|
31
|
+
if (isEnoent(error)) {
|
|
32
|
+
// File doesn't exist, return empty config
|
|
33
|
+
return { mcpServers: {} };
|
|
34
|
+
}
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Write an MCP config file atomically.
|
|
41
|
+
* Creates parent directories if they don't exist.
|
|
42
|
+
*/
|
|
43
|
+
export async function writeMCPConfigFile(filePath: string, config: MCPConfigFile): Promise<void> {
|
|
44
|
+
// Ensure parent directory exists
|
|
45
|
+
const dir = path.dirname(filePath);
|
|
46
|
+
await fs.promises.mkdir(dir, { recursive: true, mode: 0o700 });
|
|
47
|
+
|
|
48
|
+
// Write to temp file first (atomic write)
|
|
49
|
+
const tmpPath = `${filePath}.tmp`;
|
|
50
|
+
const content = JSON.stringify(withSchema(config), null, 2);
|
|
51
|
+
await fs.promises.writeFile(tmpPath, content, { encoding: "utf-8", mode: 0o600 });
|
|
52
|
+
|
|
53
|
+
// Rename to final path (atomic on most systems)
|
|
54
|
+
await fs.promises.rename(tmpPath, filePath);
|
|
55
|
+
// Invalidate the capability fs cache so subsequent reads see the new content
|
|
56
|
+
invalidateFsCache(filePath);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Validate server name.
|
|
61
|
+
* @returns Error message if invalid, undefined if valid
|
|
62
|
+
*/
|
|
63
|
+
export function validateServerName(name: string): string | undefined {
|
|
64
|
+
if (!name) {
|
|
65
|
+
return "Server name cannot be empty";
|
|
66
|
+
}
|
|
67
|
+
if (name.length > 100) {
|
|
68
|
+
return "Server name is too long (max 100 characters)";
|
|
69
|
+
}
|
|
70
|
+
// Check for invalid characters (only allow alphanumeric, dash, underscore, dot)
|
|
71
|
+
if (!/^[a-zA-Z0-9_.-]+$/.test(name)) {
|
|
72
|
+
return "Server name can only contain letters, numbers, dash, underscore, and dot";
|
|
73
|
+
}
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Add an MCP server to a config file.
|
|
79
|
+
* Validates the config before writing.
|
|
80
|
+
*
|
|
81
|
+
* @throws Error if server name already exists or validation fails
|
|
82
|
+
*/
|
|
83
|
+
export async function addMCPServer(filePath: string, name: string, config: MCPServerConfig): Promise<void> {
|
|
84
|
+
// Validate server name
|
|
85
|
+
const nameError = validateServerName(name);
|
|
86
|
+
if (nameError) {
|
|
87
|
+
throw new Error(nameError);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Validate the config
|
|
91
|
+
const errors = validateServerConfig(name, config);
|
|
92
|
+
if (errors.length > 0) {
|
|
93
|
+
throw new Error(`Invalid server config: ${errors.join("; ")}`);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Read existing config
|
|
97
|
+
const existing = await readMCPConfigFile(filePath);
|
|
98
|
+
|
|
99
|
+
// Check for duplicate name
|
|
100
|
+
if (existing.mcpServers?.[name]) {
|
|
101
|
+
throw new Error(`Server "${name}" already exists in ${filePath}`);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Add server
|
|
105
|
+
const updated: MCPConfigFile = {
|
|
106
|
+
...existing,
|
|
107
|
+
mcpServers: {
|
|
108
|
+
...existing.mcpServers,
|
|
109
|
+
[name]: config,
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// Write back
|
|
114
|
+
await writeMCPConfigFile(filePath, updated);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Update an existing MCP server in a config file.
|
|
119
|
+
* If the server doesn't exist, this will add it.
|
|
120
|
+
*
|
|
121
|
+
* @throws Error if validation fails
|
|
122
|
+
*/
|
|
123
|
+
export async function updateMCPServer(filePath: string, name: string, config: MCPServerConfig): Promise<void> {
|
|
124
|
+
// Validate server name
|
|
125
|
+
const nameError = validateServerName(name);
|
|
126
|
+
if (nameError) {
|
|
127
|
+
throw new Error(nameError);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Validate the config
|
|
131
|
+
const errors = validateServerConfig(name, config);
|
|
132
|
+
if (errors.length > 0) {
|
|
133
|
+
throw new Error(`Invalid server config: ${errors.join("; ")}`);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Read existing config
|
|
137
|
+
const existing = await readMCPConfigFile(filePath);
|
|
138
|
+
|
|
139
|
+
// Update server
|
|
140
|
+
const updated: MCPConfigFile = {
|
|
141
|
+
...existing,
|
|
142
|
+
mcpServers: {
|
|
143
|
+
...existing.mcpServers,
|
|
144
|
+
[name]: config,
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
// Write back
|
|
149
|
+
await writeMCPConfigFile(filePath, updated);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Remove an MCP server from a config file.
|
|
154
|
+
*
|
|
155
|
+
* @throws Error if server doesn't exist
|
|
156
|
+
*/
|
|
157
|
+
export async function removeMCPServer(filePath: string, name: string): Promise<void> {
|
|
158
|
+
// Read existing config
|
|
159
|
+
const existing = await readMCPConfigFile(filePath);
|
|
160
|
+
|
|
161
|
+
// Check if server exists
|
|
162
|
+
if (!existing.mcpServers?.[name]) {
|
|
163
|
+
throw new Error(`Server "${name}" not found in ${filePath}`);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Remove server
|
|
167
|
+
const { [name]: _removed, ...remaining } = existing.mcpServers;
|
|
168
|
+
const updated: MCPConfigFile = {
|
|
169
|
+
...existing,
|
|
170
|
+
mcpServers: remaining,
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
// Write back
|
|
174
|
+
await writeMCPConfigFile(filePath, updated);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Get a specific server config from a file.
|
|
179
|
+
* Returns undefined if server doesn't exist.
|
|
180
|
+
*/
|
|
181
|
+
export async function getMCPServer(filePath: string, name: string): Promise<MCPServerConfig | undefined> {
|
|
182
|
+
const config = await readMCPConfigFile(filePath);
|
|
183
|
+
return config.mcpServers?.[name];
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* List all server names in a config file.
|
|
188
|
+
*/
|
|
189
|
+
export async function listMCPServers(filePath: string): Promise<string[]> {
|
|
190
|
+
const config = await readMCPConfigFile(filePath);
|
|
191
|
+
return Object.keys(config.mcpServers ?? {});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Read the disabled servers list from a config file.
|
|
196
|
+
*/
|
|
197
|
+
export async function readDisabledServers(filePath: string): Promise<string[]> {
|
|
198
|
+
const config = await readMCPConfigFile(filePath);
|
|
199
|
+
return Array.isArray(config.disabledServers) ? config.disabledServers : [];
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Add or remove a server name from the disabled servers list.
|
|
204
|
+
*/
|
|
205
|
+
export async function setServerDisabled(filePath: string, name: string, disabled: boolean): Promise<void> {
|
|
206
|
+
const config = await readMCPConfigFile(filePath);
|
|
207
|
+
const current = new Set(config.disabledServers ?? []);
|
|
208
|
+
|
|
209
|
+
if (disabled) {
|
|
210
|
+
current.add(name);
|
|
211
|
+
} else {
|
|
212
|
+
current.delete(name);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const updated: MCPConfigFile = {
|
|
216
|
+
...config,
|
|
217
|
+
disabledServers: current.size > 0 ? Array.from(current).sort() : undefined,
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
if (!updated.disabledServers) {
|
|
221
|
+
delete updated.disabledServers;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
await writeMCPConfigFile(filePath, updated);
|
|
225
|
+
}
|