@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,80 @@
|
|
|
1
|
+
import { Box, Container, Spacer, Text } from "@f5xc-salesdemos/pi-tui";
|
|
2
|
+
import type { Rule } from "../../capability/rule";
|
|
3
|
+
import { theme } from "../../modes/theme/theme";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Component that renders a TTSR (Time Traveling Stream Rules) notification.
|
|
7
|
+
* Shows when a rule violation is detected and the stream is being rewound.
|
|
8
|
+
*/
|
|
9
|
+
export class TtsrNotificationComponent extends Container {
|
|
10
|
+
#box: Box;
|
|
11
|
+
#expanded = false;
|
|
12
|
+
|
|
13
|
+
constructor(private readonly rules: Rule[]) {
|
|
14
|
+
super();
|
|
15
|
+
|
|
16
|
+
this.addChild(new Spacer(1));
|
|
17
|
+
|
|
18
|
+
// Use inverse warning color for yellow background effect
|
|
19
|
+
this.#box = new Box(1, 0, t => theme.inverse(theme.fg("warning", t)));
|
|
20
|
+
this.addChild(this.#box);
|
|
21
|
+
|
|
22
|
+
this.#rebuild();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
setExpanded(expanded: boolean): void {
|
|
26
|
+
if (this.#expanded !== expanded) {
|
|
27
|
+
this.#expanded = expanded;
|
|
28
|
+
this.#rebuild();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
isExpanded(): boolean {
|
|
33
|
+
return this.#expanded;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
#rebuild(): void {
|
|
37
|
+
this.#box.clear();
|
|
38
|
+
|
|
39
|
+
// Build header: warning symbol + rule name + rewind icon
|
|
40
|
+
const ruleNames = this.rules.map(r => theme.bold(r.name)).join(", ");
|
|
41
|
+
const label = this.rules.length === 1 ? "rule" : "rules";
|
|
42
|
+
const header = `${theme.icon.warning} Injecting ${label}: ${ruleNames}`;
|
|
43
|
+
|
|
44
|
+
// Create header with rewind icon on the right
|
|
45
|
+
const rewindIcon = theme.icon.rewind;
|
|
46
|
+
|
|
47
|
+
this.#box.addChild(new Text(`${header} ${rewindIcon}`, 0, 0));
|
|
48
|
+
|
|
49
|
+
// Show description(s) - italic and truncated
|
|
50
|
+
for (const rule of this.rules) {
|
|
51
|
+
const desc = rule.description || rule.content;
|
|
52
|
+
if (desc) {
|
|
53
|
+
this.#box.addChild(new Spacer(1));
|
|
54
|
+
|
|
55
|
+
let displayText = desc.trim();
|
|
56
|
+
if (!this.#expanded) {
|
|
57
|
+
// Truncate to first 2 lines
|
|
58
|
+
const lines = displayText.split("\n");
|
|
59
|
+
if (lines.length > 2) {
|
|
60
|
+
displayText = `${lines.slice(0, 2).join("\n")}…`;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Use italic for subtle distinction (fg colors conflict with inverse)
|
|
65
|
+
this.#box.addChild(new Text(theme.italic(displayText), 0, 0));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Show expand hint if collapsed and there's more content
|
|
70
|
+
if (!this.#expanded) {
|
|
71
|
+
const hasMoreContent = this.rules.some(r => {
|
|
72
|
+
const desc = r.description || r.content;
|
|
73
|
+
return desc && desc.split("\n").length > 2;
|
|
74
|
+
});
|
|
75
|
+
if (hasMoreContent) {
|
|
76
|
+
this.#box.addChild(new Text(theme.italic(" (ctrl+o to expand)"), 0, 0));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { type Component, Container, matchesKey, Spacer, Text, truncateToWidth } from "@f5xc-salesdemos/pi-tui";
|
|
2
|
+
import { theme } from "../../modes/theme/theme";
|
|
3
|
+
import { matchesSelectCancel } from "../../modes/utils/keybinding-matchers";
|
|
4
|
+
import { DynamicBorder } from "./dynamic-border";
|
|
5
|
+
|
|
6
|
+
interface UserMessageItem {
|
|
7
|
+
id: string; // Entry ID in the session
|
|
8
|
+
text: string; // The message text
|
|
9
|
+
timestamp?: string; // Optional timestamp if available
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Custom user message list component with selection
|
|
14
|
+
*/
|
|
15
|
+
class UserMessageList implements Component {
|
|
16
|
+
#selectedIndex: number = 0;
|
|
17
|
+
onSelect?: (entryId: string) => void;
|
|
18
|
+
onCancel?: () => void;
|
|
19
|
+
#maxVisible: number = 10; // Max messages visible
|
|
20
|
+
|
|
21
|
+
constructor(private readonly messages: UserMessageItem[]) {
|
|
22
|
+
// Store messages in chronological order (oldest to newest)
|
|
23
|
+
// Start with the last (most recent) message selected
|
|
24
|
+
this.#selectedIndex = Math.max(0, this.messages.length - 1);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
invalidate(): void {
|
|
28
|
+
// No cached state to invalidate currently
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
render(width: number): string[] {
|
|
32
|
+
const lines: string[] = [];
|
|
33
|
+
|
|
34
|
+
if (this.messages.length === 0) {
|
|
35
|
+
lines.push(theme.fg("muted", " No user messages found"));
|
|
36
|
+
return lines;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Calculate visible range with scrolling
|
|
40
|
+
const startIndex = Math.max(
|
|
41
|
+
0,
|
|
42
|
+
Math.min(this.#selectedIndex - Math.floor(this.#maxVisible / 2), this.messages.length - this.#maxVisible),
|
|
43
|
+
);
|
|
44
|
+
const endIndex = Math.min(startIndex + this.#maxVisible, this.messages.length);
|
|
45
|
+
|
|
46
|
+
// Render visible messages (2 lines per message + blank line)
|
|
47
|
+
for (let i = startIndex; i < endIndex; i++) {
|
|
48
|
+
const message = this.messages[i];
|
|
49
|
+
const isSelected = i === this.#selectedIndex;
|
|
50
|
+
|
|
51
|
+
// Normalize message to single line
|
|
52
|
+
const normalizedMessage = message.text.replace(/\n/g, " ").trim();
|
|
53
|
+
|
|
54
|
+
// First line: cursor + message
|
|
55
|
+
const cursor = isSelected ? theme.fg("chromeAccent", "› ") : " ";
|
|
56
|
+
const maxMsgWidth = width - 2; // Account for cursor (2 chars)
|
|
57
|
+
const truncatedMsg = truncateToWidth(normalizedMessage, maxMsgWidth);
|
|
58
|
+
const messageLine = cursor + (isSelected ? theme.bold(truncatedMsg) : truncatedMsg);
|
|
59
|
+
|
|
60
|
+
lines.push(messageLine);
|
|
61
|
+
|
|
62
|
+
// Second line: metadata (position in history)
|
|
63
|
+
const position = i + 1;
|
|
64
|
+
const metadata = ` Message ${position} of ${this.messages.length}`;
|
|
65
|
+
const metadataLine = theme.fg("muted", metadata);
|
|
66
|
+
lines.push(metadataLine);
|
|
67
|
+
lines.push(""); // Blank line between messages
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Add scroll indicator if needed
|
|
71
|
+
if (startIndex > 0 || endIndex < this.messages.length) {
|
|
72
|
+
const scrollInfo = theme.fg("muted", ` (${this.#selectedIndex + 1}/${this.messages.length})`);
|
|
73
|
+
lines.push(scrollInfo);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return lines;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
handleInput(keyData: string): void {
|
|
80
|
+
// Up arrow - go to previous (older) message, wrap to bottom when at top
|
|
81
|
+
if (matchesKey(keyData, "up")) {
|
|
82
|
+
this.#selectedIndex = this.#selectedIndex === 0 ? this.messages.length - 1 : this.#selectedIndex - 1;
|
|
83
|
+
}
|
|
84
|
+
// Down arrow - go to next (newer) message, wrap to top when at bottom
|
|
85
|
+
else if (matchesKey(keyData, "down")) {
|
|
86
|
+
this.#selectedIndex = this.#selectedIndex === this.messages.length - 1 ? 0 : this.#selectedIndex + 1;
|
|
87
|
+
}
|
|
88
|
+
// Enter - select message and branch
|
|
89
|
+
else if (matchesKey(keyData, "enter") || matchesKey(keyData, "return") || keyData === "\n") {
|
|
90
|
+
const selected = this.messages[this.#selectedIndex];
|
|
91
|
+
if (selected && this.onSelect) {
|
|
92
|
+
this.onSelect(selected.id);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Escape / cancel
|
|
96
|
+
else if (matchesSelectCancel(keyData)) {
|
|
97
|
+
if (this.onCancel) {
|
|
98
|
+
this.onCancel();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Component that renders a user message selector for branching
|
|
106
|
+
*/
|
|
107
|
+
export class UserMessageSelectorComponent extends Container {
|
|
108
|
+
#messageList: UserMessageList;
|
|
109
|
+
|
|
110
|
+
constructor(messages: UserMessageItem[], onSelect: (entryId: string) => void, onCancel: () => void) {
|
|
111
|
+
super();
|
|
112
|
+
|
|
113
|
+
// Add header
|
|
114
|
+
this.addChild(new Spacer(1));
|
|
115
|
+
this.addChild(new Text(theme.bold("Branch from Message"), 1, 0));
|
|
116
|
+
this.addChild(new Text(theme.fg("muted", "Select a message to create a new branch from that point"), 1, 0));
|
|
117
|
+
this.addChild(new Spacer(1));
|
|
118
|
+
this.addChild(new DynamicBorder());
|
|
119
|
+
this.addChild(new Spacer(1));
|
|
120
|
+
|
|
121
|
+
// Create message list
|
|
122
|
+
this.#messageList = new UserMessageList(messages);
|
|
123
|
+
this.#messageList.onSelect = onSelect;
|
|
124
|
+
this.#messageList.onCancel = onCancel;
|
|
125
|
+
|
|
126
|
+
this.addChild(this.#messageList);
|
|
127
|
+
|
|
128
|
+
// Add bottom border
|
|
129
|
+
this.addChild(new Spacer(1));
|
|
130
|
+
this.addChild(new DynamicBorder());
|
|
131
|
+
|
|
132
|
+
// Auto-cancel if no messages
|
|
133
|
+
if (messages.length === 0) {
|
|
134
|
+
setTimeout(() => onCancel(), 100);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
getMessageList(): UserMessageList {
|
|
139
|
+
return this.#messageList;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { Container, Markdown, padding, Spacer, visibleWidth } from "@f5xc-salesdemos/pi-tui";
|
|
2
|
+
import { getMarkdownTheme, theme } from "../../modes/theme/theme";
|
|
3
|
+
|
|
4
|
+
// U+2503 BOX DRAWINGS HEAVY VERTICAL — continuation bar on wrapped lines.
|
|
5
|
+
const CONTINUATION_BAR = "┃";
|
|
6
|
+
// Markdown child uses paddingX=1 and clamps contentWidth>=1, so its minimum
|
|
7
|
+
// render output is 3 terminal cells. Anything narrower than prefix+3 would
|
|
8
|
+
// overflow the requested width — bail out instead.
|
|
9
|
+
const MIN_MARKDOWN_WIDTH = 3;
|
|
10
|
+
// Two-column layout: the gutter (col 0..GUTTER_WIDTH-1) stays outside the
|
|
11
|
+
// userMessageBg painted region and holds the π icon on the first content
|
|
12
|
+
// line / two spaces on continuations — mirroring how GutterBlock renders
|
|
13
|
+
// its ● indicator at col 0. The painted region starts at col GUTTER_WIDTH
|
|
14
|
+
// and hosts the ┃ accent bar on every content line (including the first).
|
|
15
|
+
const GUTTER_WIDTH = 2;
|
|
16
|
+
const GUTTER_PAD = " ";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Renders a user message as an F5-branded admonition block with a two-column
|
|
20
|
+
* layout: the π icon sits in the gutter at col 0 on the first content line
|
|
21
|
+
* (outside the painted region, matching the `●` indicator pattern used by
|
|
22
|
+
* `GutterBlock`); the ┃ heavy vertical bar renders at col GUTTER_WIDTH inside
|
|
23
|
+
* `userMessageBg` on every content line including the first. Both glyphs use
|
|
24
|
+
* the `border` fg. The bg is painted across the full requested width, and a
|
|
25
|
+
* leading blank spacer separates the prompt from the preceding block.
|
|
26
|
+
*/
|
|
27
|
+
export class UserMessageComponent extends Container {
|
|
28
|
+
#text: string;
|
|
29
|
+
#synthetic: boolean;
|
|
30
|
+
|
|
31
|
+
constructor(text: string, synthetic = false) {
|
|
32
|
+
super();
|
|
33
|
+
this.#text = text;
|
|
34
|
+
this.#synthetic = synthetic;
|
|
35
|
+
this.#rebuild();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Mirror AssistantMessageComponent: on invalidate, drop the Markdown child
|
|
39
|
+
// and rebuild it so getMarkdownTheme() is re-captured. Without this, a
|
|
40
|
+
// theme change leaves the Markdown child rendering with the original
|
|
41
|
+
// construction-time theme.
|
|
42
|
+
override invalidate(): void {
|
|
43
|
+
super.invalidate();
|
|
44
|
+
this.#rebuild();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
#rebuild(): void {
|
|
48
|
+
this.children = [];
|
|
49
|
+
const color = this.#synthetic
|
|
50
|
+
? (value: string) => theme.fg("dim", value)
|
|
51
|
+
: (value: string) => `\x1b[3m${theme.fg("userMessageText", value)}\x1b[23m`;
|
|
52
|
+
this.addChild(new Spacer(1));
|
|
53
|
+
this.addChild(new Markdown(this.#text, 0, 0, getMarkdownTheme(), { color }));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
override render(width: number): string[] {
|
|
57
|
+
const contPrefix = `${CONTINUATION_BAR} `;
|
|
58
|
+
// π lives in the fixed-width gutter (see the content map below), so it
|
|
59
|
+
// does not factor into innerWidth. Only contPrefix eats content budget.
|
|
60
|
+
const innerWidth = width - GUTTER_WIDTH - visibleWidth(contPrefix);
|
|
61
|
+
if (innerWidth < MIN_MARKDOWN_WIDTH) {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
const raw = super.render(innerWidth);
|
|
65
|
+
if (raw.length === 0) {
|
|
66
|
+
return raw;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
let firstContent = 0;
|
|
70
|
+
while (firstContent < raw.length && raw[firstContent] === "") {
|
|
71
|
+
firstContent++;
|
|
72
|
+
}
|
|
73
|
+
if (firstContent === raw.length) {
|
|
74
|
+
return raw;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// First-line gutter: π icon padded to exactly GUTTER_WIDTH cells. The
|
|
78
|
+
// glyph width is theme-dependent (Unicode π = 1 col, Nerd Font PUA = 2
|
|
79
|
+
// cols, ASCII "pi" = 2 cols); right-pad with spaces so the gutter
|
|
80
|
+
// occupies a fixed slot and the ┃ bar at col GUTTER_WIDTH aligns across
|
|
81
|
+
// every content line.
|
|
82
|
+
const piIcon = theme.icon.pi;
|
|
83
|
+
const piPadSize = Math.max(0, GUTTER_WIDTH - visibleWidth(piIcon));
|
|
84
|
+
// Pad inside the theme.fg wrap so the border-fg escape, glyph, and
|
|
85
|
+
// pad space form one contiguous span (no intervening fg reset). This
|
|
86
|
+
// matches the shape the raw-escape assertion in test 6 looks for.
|
|
87
|
+
const piGutter = theme.fg("border", piIcon + " ".repeat(piPadSize));
|
|
88
|
+
|
|
89
|
+
const leading = raw.slice(0, firstContent);
|
|
90
|
+
const content = raw.slice(firstContent).map((line, i) => {
|
|
91
|
+
const prefix = theme.fg("border", contPrefix);
|
|
92
|
+
const combined = prefix + line;
|
|
93
|
+
const pad = Math.max(0, width - GUTTER_WIDTH - visibleWidth(combined));
|
|
94
|
+
const gutter = i === 0 ? piGutter : GUTTER_PAD;
|
|
95
|
+
return gutter + theme.bg("userMessageBg", combined + padding(pad));
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
return [...leading, ...content];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utility for truncating text to visual lines (accounting for line wrapping).
|
|
3
|
+
* Used by both tool-execution.ts and bash-execution.ts for consistent behavior.
|
|
4
|
+
*/
|
|
5
|
+
import { Text } from "@f5xc-salesdemos/pi-tui";
|
|
6
|
+
|
|
7
|
+
export interface VisualTruncateResult {
|
|
8
|
+
/** The visual lines to display */
|
|
9
|
+
visualLines: string[];
|
|
10
|
+
/** Number of visual lines that were skipped (hidden) */
|
|
11
|
+
skippedCount: number;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const textCache = new Map<number, Text>();
|
|
15
|
+
|
|
16
|
+
function getCachedText(paddingX: number): Text {
|
|
17
|
+
let text = textCache.get(paddingX);
|
|
18
|
+
if (!text) {
|
|
19
|
+
text = new Text("", paddingX, 0);
|
|
20
|
+
textCache.set(paddingX, text);
|
|
21
|
+
}
|
|
22
|
+
return text;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Truncate text to a maximum number of visual lines (from the end).
|
|
27
|
+
* This accounts for line wrapping based on terminal width.
|
|
28
|
+
*
|
|
29
|
+
* @param text - The text content (may contain newlines)
|
|
30
|
+
* @param maxVisualLines - Maximum number of visual lines to show
|
|
31
|
+
* @param width - Terminal/render width
|
|
32
|
+
* @param paddingX - Horizontal padding for Text component (default 0).
|
|
33
|
+
* Use 0 when result will be placed in a Box (Box adds its own padding).
|
|
34
|
+
* Use 1 when result will be placed in a plain Container.
|
|
35
|
+
* @returns The truncated visual lines and count of skipped lines
|
|
36
|
+
*/
|
|
37
|
+
export function truncateToVisualLines(
|
|
38
|
+
text: string,
|
|
39
|
+
maxVisualLines: number,
|
|
40
|
+
width: number,
|
|
41
|
+
paddingX: number = 0,
|
|
42
|
+
): VisualTruncateResult {
|
|
43
|
+
if (!text) {
|
|
44
|
+
return { visualLines: [], skippedCount: 0 };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Create a temporary Text component to render and get visual lines
|
|
48
|
+
const tempText = getCachedText(paddingX);
|
|
49
|
+
if (tempText.getText() !== text) {
|
|
50
|
+
tempText.setText(text);
|
|
51
|
+
}
|
|
52
|
+
const allVisualLines = tempText.render(width);
|
|
53
|
+
|
|
54
|
+
if (allVisualLines.length <= maxVisualLines) {
|
|
55
|
+
return { visualLines: allVisualLines, skippedCount: 0 };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Take the last N visual lines
|
|
59
|
+
const truncatedLines = allVisualLines.slice(-maxVisualLines);
|
|
60
|
+
const skippedCount = allVisualLines.length - maxVisualLines;
|
|
61
|
+
|
|
62
|
+
return { visualLines: truncatedLines, skippedCount };
|
|
63
|
+
}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import type { Model } from "@f5xc-salesdemos/pi-ai";
|
|
2
|
+
import { validateApiKeyAgainstModelsEndpoint } from "@f5xc-salesdemos/pi-ai/utils/oauth/api-key-validation";
|
|
3
|
+
import { logger } from "@f5xc-salesdemos/pi-utils";
|
|
4
|
+
import { MarketplaceManager } from "../../extensibility/plugins/marketplace";
|
|
5
|
+
import {
|
|
6
|
+
getInstalledPluginsRegistryPath,
|
|
7
|
+
getMarketplacesCacheDir,
|
|
8
|
+
getMarketplacesRegistryPath,
|
|
9
|
+
getPluginsCacheDir,
|
|
10
|
+
} from "../../extensibility/plugins/marketplace/registry";
|
|
11
|
+
import { type AuthStatus, ContextService } from "../../services/xcsh-context";
|
|
12
|
+
import { deriveTenantFromUrl } from "../../services/xcsh-env";
|
|
13
|
+
import type { AuthStorage } from "../../session/auth-storage";
|
|
14
|
+
import { normalizePluginDisplayName } from "./plugins/utils";
|
|
15
|
+
|
|
16
|
+
// Startup validation budget. These are longer than validateToken's 3000ms default because
|
|
17
|
+
// the welcome path runs during TLS/DNS cold-start — a single 3s shot races against warm-up
|
|
18
|
+
// and falsely reports offline for contexts that reconnect cleanly moments later.
|
|
19
|
+
const STARTUP_FIRST_TIMEOUT_MS = 4000;
|
|
20
|
+
const STARTUP_RETRY_TIMEOUT_MS = 5000;
|
|
21
|
+
const STARTUP_RETRY_DELAY_MS = 500;
|
|
22
|
+
|
|
23
|
+
type ContextValidator = (opts: {
|
|
24
|
+
timeoutMs: number;
|
|
25
|
+
}) => Promise<{ status: AuthStatus; latencyMs?: number; errorClass?: "network" | "credential" | "url_not_found" }>;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Runs the context validator once with a startup-sized timeout; if the result is `offline`
|
|
29
|
+
* (the only transient class — auth_error/connected/unknown are definitive), waits briefly
|
|
30
|
+
* to let DNS/TLS warm up, then tries once more with a longer timeout.
|
|
31
|
+
*/
|
|
32
|
+
export async function validateContextWithStartupRetry(
|
|
33
|
+
validate: ContextValidator,
|
|
34
|
+
options?: {
|
|
35
|
+
firstTimeoutMs?: number;
|
|
36
|
+
retryTimeoutMs?: number;
|
|
37
|
+
retryDelayMs?: number;
|
|
38
|
+
},
|
|
39
|
+
): Promise<{ status: AuthStatus; latencyMs?: number; errorClass?: "network" | "credential" | "url_not_found" }> {
|
|
40
|
+
const firstTimeoutMs = options?.firstTimeoutMs ?? STARTUP_FIRST_TIMEOUT_MS;
|
|
41
|
+
const retryTimeoutMs = options?.retryTimeoutMs ?? STARTUP_RETRY_TIMEOUT_MS;
|
|
42
|
+
const retryDelayMs = options?.retryDelayMs ?? STARTUP_RETRY_DELAY_MS;
|
|
43
|
+
|
|
44
|
+
const first = await validate({ timeoutMs: firstTimeoutMs });
|
|
45
|
+
if (first.status !== "offline") return first;
|
|
46
|
+
|
|
47
|
+
if (retryDelayMs > 0) {
|
|
48
|
+
await new Promise(resolve => setTimeout(resolve, retryDelayMs));
|
|
49
|
+
}
|
|
50
|
+
return await validate({ timeoutMs: retryTimeoutMs });
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export type ModelCheckState = "no_provider" | "connected" | "auth_error";
|
|
54
|
+
|
|
55
|
+
export interface ModelStatus {
|
|
56
|
+
state: ModelCheckState;
|
|
57
|
+
provider?: string;
|
|
58
|
+
latencyMs?: number;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export type ContextCheckState = "no_context" | "connected" | "auth_error" | "offline";
|
|
62
|
+
|
|
63
|
+
export interface WelcomeContextStatus {
|
|
64
|
+
state: ContextCheckState;
|
|
65
|
+
name?: string;
|
|
66
|
+
latencyMs?: number;
|
|
67
|
+
errorClass?: "network" | "credential" | "url_not_found";
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface WelcomeCheckResult {
|
|
71
|
+
model: ModelStatus;
|
|
72
|
+
context?: WelcomeContextStatus;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Providers that don't store API keys (local inference servers) */
|
|
76
|
+
const KEYLESS_PROVIDERS = new Set(["ollama", "llama.cpp", "lm-studio", "llamafile", "local"]);
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Run blocking startup checks for the welcome screen.
|
|
80
|
+
* Model check always runs. Context check only runs if model is connected.
|
|
81
|
+
*/
|
|
82
|
+
export async function runWelcomeChecks(
|
|
83
|
+
model: Model | undefined,
|
|
84
|
+
authStorage: AuthStorage,
|
|
85
|
+
): Promise<WelcomeCheckResult> {
|
|
86
|
+
const provider = model?.provider ?? "unknown";
|
|
87
|
+
|
|
88
|
+
// Step 1: Check model provider credentials exist
|
|
89
|
+
// Keyless local providers (ollama, llama.cpp, lm-studio, etc.) don't store credentials
|
|
90
|
+
if (!authStorage.hasAuth(provider) && !KEYLESS_PROVIDERS.has(provider)) {
|
|
91
|
+
return { model: { state: "no_provider", provider } };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Step 2: Live model validation — try to reach the models endpoint
|
|
95
|
+
const modelStatus = await validateModelConnection(model, authStorage);
|
|
96
|
+
if (modelStatus.state !== "connected") {
|
|
97
|
+
return { model: modelStatus };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Step 3: Context check (only if model is connected)
|
|
101
|
+
const contextStatus = await checkContextStatus();
|
|
102
|
+
return { model: modelStatus, context: contextStatus };
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async function validateModelConnection(model: Model | undefined, authStorage: AuthStorage): Promise<ModelStatus> {
|
|
106
|
+
const provider = model?.provider ?? "unknown";
|
|
107
|
+
try {
|
|
108
|
+
const rawApiKey = await authStorage.peekApiKey(provider);
|
|
109
|
+
if (!rawApiKey) {
|
|
110
|
+
// Keyless providers skip validation
|
|
111
|
+
if (KEYLESS_PROVIDERS.has(provider)) {
|
|
112
|
+
return { state: "connected", provider, latencyMs: 0 };
|
|
113
|
+
}
|
|
114
|
+
return { state: "auth_error", provider };
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Detect unresolved env var names (e.g. "LITELLM_API_KEY" sent as literal)
|
|
118
|
+
if (/^[A-Z][A-Z0-9]*(?:_[A-Z][A-Z0-9]*)+$/.test(rawApiKey)) {
|
|
119
|
+
return { state: "auth_error", provider };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const baseUrl = model?.baseUrl;
|
|
123
|
+
if (!baseUrl) {
|
|
124
|
+
return { state: "auth_error", provider };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// GitHub Copilot returns a structured JSON token {token, enterpriseUrl};
|
|
128
|
+
// extract the actual token for API validation
|
|
129
|
+
let apiKey = rawApiKey;
|
|
130
|
+
if (provider === "github-copilot" && rawApiKey.startsWith("{")) {
|
|
131
|
+
try {
|
|
132
|
+
const parsed = JSON.parse(rawApiKey);
|
|
133
|
+
apiKey = parsed.token ?? rawApiKey;
|
|
134
|
+
} catch {
|
|
135
|
+
// Not JSON — use as-is
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const modelsUrl = `${baseUrl}/models`;
|
|
140
|
+
const start = performance.now();
|
|
141
|
+
await validateApiKeyAgainstModelsEndpoint({
|
|
142
|
+
provider,
|
|
143
|
+
apiKey,
|
|
144
|
+
modelsUrl,
|
|
145
|
+
});
|
|
146
|
+
const latencyMs = Math.round(performance.now() - start);
|
|
147
|
+
return { state: "connected", provider, latencyMs };
|
|
148
|
+
} catch {
|
|
149
|
+
logger.warn("Welcome model validation failed");
|
|
150
|
+
return { state: "auth_error", provider };
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
async function checkContextStatus(): Promise<WelcomeContextStatus> {
|
|
155
|
+
try {
|
|
156
|
+
const contextService = ContextService.instance;
|
|
157
|
+
if (!contextService) {
|
|
158
|
+
return { state: "no_context" };
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const status = contextService.getStatus();
|
|
162
|
+
if (!status.isConfigured) {
|
|
163
|
+
return { state: "no_context" };
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const name =
|
|
167
|
+
status.activeContextName ??
|
|
168
|
+
(status.credentialSource === "environment" && status.activeContextUrl
|
|
169
|
+
? (deriveTenantFromUrl(status.activeContextUrl) ?? "(environment)")
|
|
170
|
+
: undefined);
|
|
171
|
+
const result = await validateContextWithStartupRetry(opts => contextService.validateToken(opts));
|
|
172
|
+
|
|
173
|
+
switch (result.status) {
|
|
174
|
+
case "connected":
|
|
175
|
+
return { state: "connected", name, latencyMs: result.latencyMs };
|
|
176
|
+
case "auth_error":
|
|
177
|
+
return { state: "auth_error", name };
|
|
178
|
+
case "offline":
|
|
179
|
+
return { state: "offline", name, errorClass: result.errorClass };
|
|
180
|
+
default:
|
|
181
|
+
return { state: "no_context" };
|
|
182
|
+
}
|
|
183
|
+
} catch {
|
|
184
|
+
logger.warn("Welcome context validation failed");
|
|
185
|
+
return { state: "no_context" };
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export type ServiceState = "connected" | "unauthenticated" | "unavailable";
|
|
190
|
+
|
|
191
|
+
export interface ServiceStatus {
|
|
192
|
+
name: string;
|
|
193
|
+
state: ServiceState;
|
|
194
|
+
hint?: string;
|
|
195
|
+
_isPlugin?: boolean;
|
|
196
|
+
_group?: string;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export function mapContextStatus(status: WelcomeContextStatus): ServiceStatus {
|
|
200
|
+
switch (status.state) {
|
|
201
|
+
case "connected":
|
|
202
|
+
return { name: "F5 XC Context", state: "connected" };
|
|
203
|
+
case "no_context":
|
|
204
|
+
return { name: "F5 XC Context", state: "unauthenticated", hint: "run: /context create" };
|
|
205
|
+
case "auth_error":
|
|
206
|
+
return { name: "F5 XC Context", state: "unauthenticated", hint: "run: /context" };
|
|
207
|
+
case "offline":
|
|
208
|
+
switch (status.errorClass) {
|
|
209
|
+
case "network":
|
|
210
|
+
return { name: "F5 XC Context", state: "unauthenticated", hint: "network unreachable" };
|
|
211
|
+
case "url_not_found":
|
|
212
|
+
return { name: "F5 XC Context", state: "unauthenticated", hint: "tenant URL not found" };
|
|
213
|
+
default:
|
|
214
|
+
return { name: "F5 XC Context", state: "unauthenticated", hint: "run: /context" };
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export interface FixableService {
|
|
220
|
+
name: string;
|
|
221
|
+
prompt: string;
|
|
222
|
+
command: string[];
|
|
223
|
+
recheck: () => Promise<ServiceStatus>;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export type UnifiedPluginState = "connected" | "unauthenticated" | "unavailable" | "installed" | "not_installed";
|
|
227
|
+
|
|
228
|
+
export interface UnifiedPluginStatus {
|
|
229
|
+
name: string;
|
|
230
|
+
state: UnifiedPluginState;
|
|
231
|
+
hint?: string;
|
|
232
|
+
group?: string;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export interface ServiceStatusContributionInput {
|
|
236
|
+
name: string;
|
|
237
|
+
group?: string;
|
|
238
|
+
check: () => Promise<{ state: ServiceState; hint?: string }>;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
export async function buildUnifiedPluginList(
|
|
242
|
+
contributions: ServiceStatusContributionInput[],
|
|
243
|
+
): Promise<UnifiedPluginStatus[]> {
|
|
244
|
+
const map = new Map<string, UnifiedPluginStatus>();
|
|
245
|
+
|
|
246
|
+
for (const contribution of contributions) {
|
|
247
|
+
try {
|
|
248
|
+
const status = await contribution.check();
|
|
249
|
+
map.set(contribution.name.toLowerCase(), {
|
|
250
|
+
name: contribution.name,
|
|
251
|
+
state: status.state,
|
|
252
|
+
hint: status.hint,
|
|
253
|
+
group: contribution.group,
|
|
254
|
+
});
|
|
255
|
+
} catch {
|
|
256
|
+
map.set(contribution.name.toLowerCase(), {
|
|
257
|
+
name: contribution.name,
|
|
258
|
+
state: "unavailable",
|
|
259
|
+
hint: "check failed",
|
|
260
|
+
group: contribution.group,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
try {
|
|
266
|
+
const mgr = new MarketplaceManager({
|
|
267
|
+
marketplacesRegistryPath: getMarketplacesRegistryPath(),
|
|
268
|
+
installedRegistryPath: getInstalledPluginsRegistryPath(),
|
|
269
|
+
marketplacesCacheDir: getMarketplacesCacheDir(),
|
|
270
|
+
pluginsCacheDir: getPluginsCacheDir(),
|
|
271
|
+
clearPluginRootsCache: () => {},
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
const [marketplaces, installedSummaries] = await Promise.all([
|
|
275
|
+
mgr.listMarketplaces(),
|
|
276
|
+
mgr.listInstalledPlugins(),
|
|
277
|
+
]);
|
|
278
|
+
|
|
279
|
+
const installedIds = new Set(installedSummaries.map(s => s.id));
|
|
280
|
+
|
|
281
|
+
for (const mkt of marketplaces) {
|
|
282
|
+
const available = await mgr.listAvailablePlugins(mkt.name).catch(() => []);
|
|
283
|
+
for (const entry of available) {
|
|
284
|
+
if (!entry.recommended) continue;
|
|
285
|
+
const displayName = normalizePluginDisplayName(entry.name);
|
|
286
|
+
const key = displayName.toLowerCase();
|
|
287
|
+
if (map.has(key)) continue;
|
|
288
|
+
const pluginId = `${entry.name}@${mkt.name}`;
|
|
289
|
+
map.set(key, {
|
|
290
|
+
name: displayName,
|
|
291
|
+
state: installedIds.has(pluginId) ? "installed" : "not_installed",
|
|
292
|
+
hint: installedIds.has(pluginId) ? undefined : "run: /plugin setup",
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
} catch (err) {
|
|
297
|
+
logger.debug("buildUnifiedPluginList marketplace check failed", { error: String(err) });
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
const stateOrder: Record<UnifiedPluginState, number> = {
|
|
301
|
+
connected: 0,
|
|
302
|
+
unauthenticated: 1,
|
|
303
|
+
unavailable: 2,
|
|
304
|
+
installed: 3,
|
|
305
|
+
not_installed: 4,
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
return [...map.values()].sort((a, b) => {
|
|
309
|
+
const orderDiff = stateOrder[a.state] - stateOrder[b.state];
|
|
310
|
+
if (orderDiff !== 0) return orderDiff;
|
|
311
|
+
return a.name.localeCompare(b.name);
|
|
312
|
+
});
|
|
313
|
+
}
|