@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,373 @@
|
|
|
1
|
+
import { type AxNode, matchNode } from "./ax";
|
|
2
|
+
import { type BridgeServer, startBridgeServer, type ToolResult } from "./extension-bridge";
|
|
3
|
+
import { ExtensionPageActions } from "./extension-page-actions";
|
|
4
|
+
import type { AcquiredBrowser, BrowserProvider, BrowserProviderStatus } from "./provider";
|
|
5
|
+
import { parseLocator } from "./selector";
|
|
6
|
+
|
|
7
|
+
/** The extension's AX tree shape: an {@link AxNode} carrying a `ref` handle. */
|
|
8
|
+
export type AxRefNode = AxNode & { ref?: string; children?: AxRefNode[] };
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Pure adapter: resolve a selector to the extension's `ref` handle by reusing
|
|
12
|
+
* xcsh's existing AX matcher. Throws if nothing matches (via {@link matchNode})
|
|
13
|
+
* or the matched node carries no `ref`.
|
|
14
|
+
*/
|
|
15
|
+
export function resolveRef(tree: AxRefNode, selector: string): string {
|
|
16
|
+
const node = matchNode(tree as AxNode, parseLocator(selector)) as AxRefNode;
|
|
17
|
+
if (!node.ref) throw new Error(`matched node for "${selector}" has no ref handle`);
|
|
18
|
+
return node.ref;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Thin wrapper over the bridge for the page-level operations the agent needs. */
|
|
22
|
+
export interface ExtensionPage {
|
|
23
|
+
navigate(url: string): Promise<void>;
|
|
24
|
+
login(
|
|
25
|
+
email: string,
|
|
26
|
+
password: string,
|
|
27
|
+
consoleUrl: string,
|
|
28
|
+
): Promise<{ loggedIn: boolean; finalUrl: string; steps: string[] }>;
|
|
29
|
+
readAx(): Promise<AxRefNode>;
|
|
30
|
+
click(ref: string): Promise<void>;
|
|
31
|
+
screenshot(): Promise<string>;
|
|
32
|
+
// Phase 1 additions:
|
|
33
|
+
formInput(ref: string, value: string): Promise<void>;
|
|
34
|
+
keyPress(key: string): Promise<void>;
|
|
35
|
+
selectOption(ref: string, value: string): Promise<void>;
|
|
36
|
+
scrollTo(ref: string): Promise<void>;
|
|
37
|
+
waitFor(selector: string, context?: string, timeoutMs?: number): Promise<string>;
|
|
38
|
+
assertText(selector: string, expected: string, context?: string): Promise<void>;
|
|
39
|
+
find(selector: string): Promise<Array<{ ref: string; role: string; name: string }>>;
|
|
40
|
+
getPageText(): Promise<string>;
|
|
41
|
+
javascriptTool(code: string): Promise<unknown>;
|
|
42
|
+
tabsList(): Promise<Array<{ id: number; url: string; title: string; active: boolean }>>;
|
|
43
|
+
tabsCreate(url: string): Promise<number>;
|
|
44
|
+
tabsClose(tabId: number): Promise<void>;
|
|
45
|
+
resizeWindow(width: number, height: number): Promise<void>;
|
|
46
|
+
readConsole(pattern?: string): Promise<Array<{ type: string; text: string }>>;
|
|
47
|
+
readNetwork(pattern?: string): Promise<Array<{ method: string; url: string; status?: number }>>;
|
|
48
|
+
fileUpload(ref: string, files: Array<{ data: string; name: string; mimeType: string }>): Promise<void>;
|
|
49
|
+
browserBatch(
|
|
50
|
+
actions: Array<{ tool: string; params: unknown }>,
|
|
51
|
+
): Promise<Array<{ tool: string; content: unknown; is_error: boolean }>>;
|
|
52
|
+
/** Trusted CDP click at viewport coordinates. Last-resort primitive for points
|
|
53
|
+
* with no backing element (e.g. a computed portal point); prefer clickElement. */
|
|
54
|
+
clickXy(x: number, y: number): Promise<void>;
|
|
55
|
+
/** Deterministic click: `js` is an expression returning an Element (or null).
|
|
56
|
+
* The extension derives the clickable point from the renderer's layout
|
|
57
|
+
* (DOM.getContentQuads) and hit-tests it (document.elementFromPoint) before
|
|
58
|
+
* dispatching — no JS getBoundingClientRect, no silent mis-clicks. `waitMs`
|
|
59
|
+
* polls for the element (async portals). Throws loudly on occlusion. */
|
|
60
|
+
clickElement(js: string, waitMs?: number): Promise<{ x: number; y: number; hit: boolean }>;
|
|
61
|
+
/** CDP Input.insertText into the focused element (genuine trusted input events). */
|
|
62
|
+
typeText(text: string): Promise<void>;
|
|
63
|
+
/** Atomically type into a CDK-portal typeahead + click the matching option.
|
|
64
|
+
* Keeps the input focused throughout (uses plain Runtime.evaluate, not the
|
|
65
|
+
* evaluateWithRecovery path that defocuses by detaching the debugger). */
|
|
66
|
+
labelSelect(
|
|
67
|
+
selector: string,
|
|
68
|
+
value: string,
|
|
69
|
+
waitMs?: number,
|
|
70
|
+
): Promise<{
|
|
71
|
+
selected: string;
|
|
72
|
+
matchedKind: string;
|
|
73
|
+
value: string;
|
|
74
|
+
optionCount: number;
|
|
75
|
+
}>;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Unwrap a {@link ToolResult}, throwing on the error flag. */
|
|
79
|
+
function unwrap(result: ToolResult, tool: string): unknown {
|
|
80
|
+
if (result.is_error) {
|
|
81
|
+
throw new Error(`extension tool "${tool}" failed: ${JSON.stringify(result.content)}`);
|
|
82
|
+
}
|
|
83
|
+
return result.content;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
class BridgeExtensionPage implements ExtensionPage {
|
|
87
|
+
#server: BridgeServer;
|
|
88
|
+
|
|
89
|
+
constructor(server: BridgeServer) {
|
|
90
|
+
this.#server = server;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async navigate(url: string): Promise<void> {
|
|
94
|
+
unwrap(await this.#server.request("navigate", { url }), "navigate");
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async login(
|
|
98
|
+
email: string,
|
|
99
|
+
password: string,
|
|
100
|
+
consoleUrl: string,
|
|
101
|
+
): Promise<{ loggedIn: boolean; finalUrl: string; steps: string[] }> {
|
|
102
|
+
// Defense-in-depth: validate the console URL before sending credentials
|
|
103
|
+
// over the bridge — only https F5 XC console domains are allowed, so a
|
|
104
|
+
// bad consoleUrl can never carry credentials to a foreign host.
|
|
105
|
+
const parsed = new URL(consoleUrl); // throws on malformed
|
|
106
|
+
if (parsed.protocol !== "https:") {
|
|
107
|
+
throw new Error(`login: consoleUrl must use https, got ${parsed.protocol}`);
|
|
108
|
+
}
|
|
109
|
+
if (!/\.volterra\.us$|\.console\.ves\.volterra\.io$/.test(parsed.hostname)) {
|
|
110
|
+
throw new Error(`login: consoleUrl host "${parsed.hostname}" is not an allowed F5 XC console domain`);
|
|
111
|
+
}
|
|
112
|
+
return unwrap(
|
|
113
|
+
await this.#server.request("login", { email, password, consoleUrl: parsed.toString() }, 90_000),
|
|
114
|
+
"login",
|
|
115
|
+
) as { loggedIn: boolean; finalUrl: string; steps: string[] };
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async readAx(): Promise<AxRefNode> {
|
|
119
|
+
return unwrap(await this.#server.request("read_ax", {}), "read_ax") as AxRefNode;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
async click(ref: string): Promise<void> {
|
|
123
|
+
unwrap(await this.#server.request("click", { ref }), "click");
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async screenshot(): Promise<string> {
|
|
127
|
+
return unwrap(await this.#server.request("screenshot", {}), "screenshot") as string;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async formInput(ref: string, value: string): Promise<void> {
|
|
131
|
+
unwrap(await this.#server.request("form_input", { ref, value }), "form_input");
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async keyPress(key: string): Promise<void> {
|
|
135
|
+
unwrap(await this.#server.request("key_press", { key }), "key_press");
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async selectOption(ref: string, value: string): Promise<void> {
|
|
139
|
+
unwrap(await this.#server.request("select_option", { ref, value }), "select_option");
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async scrollTo(ref: string): Promise<void> {
|
|
143
|
+
unwrap(await this.#server.request("scroll_to", { ref }), "scroll_to");
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
async waitFor(selector: string, context?: string, timeoutMs?: number): Promise<string> {
|
|
147
|
+
return unwrap(await this.#server.request("wait_for", { selector, context, timeoutMs }), "wait_for") as string;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async assertText(selector: string, expected: string, context?: string): Promise<void> {
|
|
151
|
+
unwrap(await this.#server.request("assert_text", { selector, expected, context }), "assert_text");
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
async find(selector: string): Promise<Array<{ ref: string; role: string; name: string }>> {
|
|
155
|
+
return unwrap(await this.#server.request("find", { selector }), "find") as Array<{
|
|
156
|
+
ref: string;
|
|
157
|
+
role: string;
|
|
158
|
+
name: string;
|
|
159
|
+
}>;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
async getPageText(): Promise<string> {
|
|
163
|
+
return unwrap(await this.#server.request("get_page_text", {}), "get_page_text") as string;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
async javascriptTool(code: string): Promise<unknown> {
|
|
167
|
+
return unwrap(await this.#server.request("javascript_tool", { code }), "javascript_tool");
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
async tabsList(): Promise<Array<{ id: number; url: string; title: string; active: boolean }>> {
|
|
171
|
+
return unwrap(await this.#server.request("tabs_list", {}), "tabs_list") as Array<{
|
|
172
|
+
id: number;
|
|
173
|
+
url: string;
|
|
174
|
+
title: string;
|
|
175
|
+
active: boolean;
|
|
176
|
+
}>;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
async tabsCreate(url: string): Promise<number> {
|
|
180
|
+
return unwrap(await this.#server.request("tabs_create", { url }), "tabs_create") as number;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
async tabsClose(tabId: number): Promise<void> {
|
|
184
|
+
unwrap(await this.#server.request("tabs_close", { tabId }), "tabs_close");
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
async resizeWindow(width: number, height: number): Promise<void> {
|
|
188
|
+
unwrap(await this.#server.request("resize_window", { width, height }), "resize_window");
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
async readConsole(pattern?: string): Promise<Array<{ type: string; text: string }>> {
|
|
192
|
+
return unwrap(await this.#server.request("read_console", { pattern }), "read_console") as Array<{
|
|
193
|
+
type: string;
|
|
194
|
+
text: string;
|
|
195
|
+
}>;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
async readNetwork(pattern?: string): Promise<Array<{ method: string; url: string; status?: number }>> {
|
|
199
|
+
return unwrap(await this.#server.request("read_network", { pattern }), "read_network") as Array<{
|
|
200
|
+
method: string;
|
|
201
|
+
url: string;
|
|
202
|
+
status?: number;
|
|
203
|
+
}>;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
async fileUpload(ref: string, files: Array<{ data: string; name: string; mimeType: string }>): Promise<void> {
|
|
207
|
+
unwrap(await this.#server.request("file_upload", { ref, files }), "file_upload");
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
async browserBatch(
|
|
211
|
+
actions: Array<{ tool: string; params: unknown }>,
|
|
212
|
+
): Promise<Array<{ tool: string; content: unknown; is_error: boolean }>> {
|
|
213
|
+
return unwrap(await this.#server.request("browser_batch", { actions }), "browser_batch") as Array<{
|
|
214
|
+
tool: string;
|
|
215
|
+
content: unknown;
|
|
216
|
+
is_error: boolean;
|
|
217
|
+
}>;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
async clickXy(x: number, y: number): Promise<void> {
|
|
221
|
+
unwrap(await this.#server.request("click_xy", { x, y }), "click_xy");
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
async clickElement(js: string, waitMs?: number): Promise<{ x: number; y: number; hit: boolean }> {
|
|
225
|
+
const timeout = Math.max(30_000, (waitMs ?? 0) + 5_000);
|
|
226
|
+
return unwrap(await this.#server.request("click_element", { js, wait_ms: waitMs }, timeout), "click_element") as {
|
|
227
|
+
x: number;
|
|
228
|
+
y: number;
|
|
229
|
+
hit: boolean;
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
async typeText(text: string): Promise<void> {
|
|
234
|
+
unwrap(await this.#server.request("type_text", { text }), "type_text");
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
async labelSelect(
|
|
238
|
+
selector: string,
|
|
239
|
+
value: string,
|
|
240
|
+
waitMs?: number,
|
|
241
|
+
): Promise<{ selected: string; matchedKind: string; value: string; optionCount: number }> {
|
|
242
|
+
// Request timeout must exceed the handler's internal poll budget.
|
|
243
|
+
const timeout = Math.max(30_000, (waitMs ?? 8_000) + 5_000);
|
|
244
|
+
return unwrap(
|
|
245
|
+
await this.#server.request("label_select", { selector, value, wait_ms: waitMs }, timeout),
|
|
246
|
+
"label_select",
|
|
247
|
+
) as { selected: string; matchedKind: string; value: string; optionCount: number };
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const CONNECT_TIMEOUT_MS = 30_000;
|
|
252
|
+
const POLL_INTERVAL_MS = 100;
|
|
253
|
+
|
|
254
|
+
/** Wait (bounded) for the extension to connect to the bridge server. */
|
|
255
|
+
async function waitForConnection(server: BridgeServer, timeoutMs: number): Promise<void> {
|
|
256
|
+
if (server.connected) return;
|
|
257
|
+
const deadline = Date.now() + timeoutMs;
|
|
258
|
+
while (Date.now() < deadline) {
|
|
259
|
+
if (server.connected) return;
|
|
260
|
+
await new Promise(resolve => setTimeout(resolve, POLL_INTERVAL_MS));
|
|
261
|
+
}
|
|
262
|
+
if (!server.connected) {
|
|
263
|
+
throw new Error(
|
|
264
|
+
`extension did not connect within ${timeoutMs}ms — is the Chrome extension installed and running?`,
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* BrowserProvider that drives the page through the Chrome extension over the
|
|
271
|
+
* bridge socket. Acquires by ensuring the bridge is up, waiting for the
|
|
272
|
+
* extension to connect, pinging, and navigating to the console URL.
|
|
273
|
+
*/
|
|
274
|
+
export class ExtensionBrowserProvider implements BrowserProvider {
|
|
275
|
+
readonly name = "extension";
|
|
276
|
+
#server: BridgeServer | null;
|
|
277
|
+
|
|
278
|
+
constructor(opts?: { server?: BridgeServer }) {
|
|
279
|
+
this.#server = opts?.server ?? null;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Acquire the extension-driven page. The returned `page` is an
|
|
284
|
+
* {@link ExtensionPageActions} wrapping the runtime {@link ExtensionPage},
|
|
285
|
+
* satisfying the {@link AcquiredBrowser.page} {@link PageActions} contract.
|
|
286
|
+
* The extension seam substitutes a thin `ExtensionPage` for puppeteer's
|
|
287
|
+
* `Page` behind the shared `PageActions` surface.
|
|
288
|
+
*/
|
|
289
|
+
async acquire(consoleUrl: string): Promise<AcquiredBrowser> {
|
|
290
|
+
const server = this.#server ?? (await startBridgeServer());
|
|
291
|
+
this.#server = server;
|
|
292
|
+
await waitForConnection(server, CONNECT_TIMEOUT_MS);
|
|
293
|
+
unwrap(await server.request("ping", {}), "ping");
|
|
294
|
+
|
|
295
|
+
const page: ExtensionPage = new BridgeExtensionPage(server);
|
|
296
|
+
|
|
297
|
+
// Auto-login: if XCSH_USERNAME + XCSH_CONSOLE_PASSWORD are available (set by
|
|
298
|
+
// ContextService from the context's env map), login automatically — the login
|
|
299
|
+
// tool handles "already authenticated" (instant return) so calling it every
|
|
300
|
+
// time is cheap and guarantees a valid session. Falls back to navigate-only
|
|
301
|
+
// (co-drive) if credentials aren't available.
|
|
302
|
+
const email = process.env.XCSH_USERNAME;
|
|
303
|
+
const password = process.env.XCSH_CONSOLE_PASSWORD;
|
|
304
|
+
if (email && password) {
|
|
305
|
+
await page.login(email, password, consoleUrl);
|
|
306
|
+
} else {
|
|
307
|
+
unwrap(await server.request("navigate", { url: consoleUrl }), "navigate");
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
return {
|
|
311
|
+
page: new ExtensionPageActions(page),
|
|
312
|
+
mode: "extension",
|
|
313
|
+
release: async () => {
|
|
314
|
+
await server.request("detach", {}).catch(() => {});
|
|
315
|
+
},
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
async status(): Promise<BrowserProviderStatus & { extensionConnected: boolean }> {
|
|
320
|
+
const extensionConnected = this.#server?.connected === true;
|
|
321
|
+
let detail: string;
|
|
322
|
+
if (extensionConnected) {
|
|
323
|
+
detail = "Chrome extension is connected to the xcsh bridge.";
|
|
324
|
+
} else if (chromeDeveloperModeEnabled() === false) {
|
|
325
|
+
// An unpacked (Load-unpacked) extension only runs while Chrome's
|
|
326
|
+
// Developer Mode is ON. If it's off, the extension is loaded but inert,
|
|
327
|
+
// so it never connects — surface that specific, common cause.
|
|
328
|
+
detail =
|
|
329
|
+
"Chrome extension is not connected — Chrome Developer Mode appears to be OFF, so the unpacked xcsh extension won't run. Enable it: chrome://extensions → toggle 'Developer mode' (top-right), then reload the extension.";
|
|
330
|
+
} else {
|
|
331
|
+
detail =
|
|
332
|
+
"Chrome extension is not connected — ensure it's loaded/enabled, Chrome is running, and `xcsh chrome setup` has run.";
|
|
333
|
+
}
|
|
334
|
+
return {
|
|
335
|
+
debuggableNow: false,
|
|
336
|
+
chromeRunning: false,
|
|
337
|
+
chromeInstalled: false,
|
|
338
|
+
plannedAction: "no-chrome",
|
|
339
|
+
detail,
|
|
340
|
+
extensionConnected,
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Best-effort read of whether Chrome's Developer Mode is enabled, from the
|
|
347
|
+
* profile Preferences (`extensions.ui.developer_mode`). Unpacked extensions
|
|
348
|
+
* require Developer Mode to actually run. Returns null if it can't be read.
|
|
349
|
+
*/
|
|
350
|
+
export function chromeDeveloperModeEnabled(): boolean | null {
|
|
351
|
+
const candidates =
|
|
352
|
+
process.platform === "darwin"
|
|
353
|
+
? [
|
|
354
|
+
"Library/Application Support/Google/Chrome/Default/Preferences",
|
|
355
|
+
"Library/Application Support/Google/Chrome/Profile 1/Preferences",
|
|
356
|
+
]
|
|
357
|
+
: process.platform === "win32"
|
|
358
|
+
? ["AppData/Local/Google/Chrome/User Data/Default/Preferences"]
|
|
359
|
+
: [".config/google-chrome/Default/Preferences"];
|
|
360
|
+
for (const rel of candidates) {
|
|
361
|
+
try {
|
|
362
|
+
const fs = require("node:fs") as typeof import("node:fs");
|
|
363
|
+
const os = require("node:os") as typeof import("node:os");
|
|
364
|
+
const p = `${os.homedir()}/${rel}`;
|
|
365
|
+
if (!fs.existsSync(p)) continue;
|
|
366
|
+
const prefs = JSON.parse(fs.readFileSync(p, "utf8"));
|
|
367
|
+
return prefs?.extensions?.ui?.developer_mode === true;
|
|
368
|
+
} catch {
|
|
369
|
+
/* try next candidate */
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
return null;
|
|
373
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export * from "./acquire";
|
|
2
|
+
export * from "./actions";
|
|
3
|
+
export * from "./auth";
|
|
4
|
+
export * from "./ax";
|
|
5
|
+
export * from "./cdp-core";
|
|
6
|
+
export * from "./cdp-page-actions";
|
|
7
|
+
export * from "./chrome-locate";
|
|
8
|
+
export * from "./dom-context";
|
|
9
|
+
export * from "./extension-bridge";
|
|
10
|
+
export * from "./extension-page-actions";
|
|
11
|
+
export * from "./extension-provider";
|
|
12
|
+
export * from "./input-commit";
|
|
13
|
+
export * from "./native-messaging";
|
|
14
|
+
export * from "./page-actions";
|
|
15
|
+
export * from "./provider";
|
|
16
|
+
export * from "./resolver";
|
|
17
|
+
export * from "./selector";
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commit a value into a form control so that a framework which patched the
|
|
3
|
+
* element's `value` descriptor still observes the change.
|
|
4
|
+
*
|
|
5
|
+
* Why this exists: the XCSH console's `vsui-input` (e.g. over the HTTP-LB
|
|
6
|
+
* "Domains" ngx-datatable cell) overrides the native `<input>` `value`
|
|
7
|
+
* descriptor with its own accessor. Typing real keystrokes — or assigning
|
|
8
|
+
* `el.value = …` directly — leaves the text in the DOM but never reaches the
|
|
9
|
+
* Angular reactive-form model, so the form reports the field as still empty.
|
|
10
|
+
*
|
|
11
|
+
* The fix, verified live against the staging console: write through the
|
|
12
|
+
* *prototype's* native value setter (skipping any instance-level patch), then
|
|
13
|
+
* dispatch bubbling `input` and `change` events so the framework's own change
|
|
14
|
+
* detection runs.
|
|
15
|
+
*
|
|
16
|
+
* This module is intentionally dependency-free (DOM only) so it can be both
|
|
17
|
+
* unit-tested (linkedom/fakes) and DRY-injected into the live page via
|
|
18
|
+
* `.toString()` — the same pattern used by dom-context/dt-context.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/** Minimal KeyboardEvent constructor shape — typed loosely because this module
|
|
22
|
+
* is type-checked under the webworker lib (no DOM `KeyboardEvent` global) but is
|
|
23
|
+
* injected into and runs in the page, where `view.KeyboardEvent` exists. */
|
|
24
|
+
type KeyboardEventCtor = new (type: string, init?: { bubbles?: boolean; key?: string; code?: string }) => unknown;
|
|
25
|
+
|
|
26
|
+
interface CommittableElement {
|
|
27
|
+
value: string;
|
|
28
|
+
ownerDocument?: { defaultView?: { Event?: typeof Event; KeyboardEvent?: KeyboardEventCtor } | null } | null;
|
|
29
|
+
dispatchEvent(event: unknown): unknown;
|
|
30
|
+
closest?(selector: string): unknown;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function commitInputValue(el: CommittableElement, value: string): void {
|
|
34
|
+
// Walk the prototype chain (starting ABOVE the instance) for the `value`
|
|
35
|
+
// setter. Starting above the instance is what bypasses a framework's
|
|
36
|
+
// instance-level patch and reaches the real (native) accessor.
|
|
37
|
+
let descriptor: PropertyDescriptor | undefined;
|
|
38
|
+
let proto: object | null = Object.getPrototypeOf(el);
|
|
39
|
+
while (proto) {
|
|
40
|
+
descriptor = Object.getOwnPropertyDescriptor(proto, "value");
|
|
41
|
+
if (descriptor) break;
|
|
42
|
+
proto = Object.getPrototypeOf(proto);
|
|
43
|
+
}
|
|
44
|
+
if (descriptor?.set) descriptor.set.call(el, value);
|
|
45
|
+
else el.value = value;
|
|
46
|
+
|
|
47
|
+
const view = el.ownerDocument?.defaultView ?? undefined;
|
|
48
|
+
const EventCtor = view?.Event ?? (typeof Event !== "undefined" ? Event : undefined);
|
|
49
|
+
if (EventCtor) {
|
|
50
|
+
// `input`/`change` cover controls that update on value change; `blur`/
|
|
51
|
+
// `focusout` cover Angular controls configured `updateOn: 'blur'` (the
|
|
52
|
+
// console's vsui-input commits to the model on blur, not on keystroke).
|
|
53
|
+
el.dispatchEvent(new EventCtor("input", { bubbles: true }));
|
|
54
|
+
el.dispatchEvent(new EventCtor("change", { bubbles: true }));
|
|
55
|
+
// ngx-datatable inline-edit cells that persist on Enter (ip-prefix-set
|
|
56
|
+
// "IPv4 Prefix") revert on a bare blur. For inputs inside a datatable,
|
|
57
|
+
// dispatch Enter BEFORE blur so the row commits first; http-lb "Domains"
|
|
58
|
+
// (commits on blur) is unaffected because blur still fires afterwards.
|
|
59
|
+
// Only the page provides KeyboardEvent (this module type-checks under the
|
|
60
|
+
// webworker lib, which has no DOM KeyboardEvent global) — if absent, skip
|
|
61
|
+
// the best-effort Enter and let the blur below carry the commit.
|
|
62
|
+
const KeyCtor = view?.KeyboardEvent;
|
|
63
|
+
const inGrid =
|
|
64
|
+
typeof el.closest === "function" &&
|
|
65
|
+
!!el.closest("ngx-datatable,datatable-body-cell,datatable-body-row,[class*=datatable]");
|
|
66
|
+
if (inGrid && KeyCtor) {
|
|
67
|
+
for (const t of ["keydown", "keypress", "keyup"] as const) {
|
|
68
|
+
el.dispatchEvent(new KeyCtor(t, { bubbles: true, key: "Enter", code: "Enter" }));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
el.dispatchEvent(new EventCtor("blur", { bubbles: false }));
|
|
72
|
+
el.dispatchEvent(new EventCtor("focusout", { bubbles: true }));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function encodeNm(msg: unknown): Uint8Array {
|
|
2
|
+
const json = new TextEncoder().encode(JSON.stringify(msg));
|
|
3
|
+
const out = new Uint8Array(4 + json.length);
|
|
4
|
+
new DataView(out.buffer).setUint32(0, json.length, true); // little-endian
|
|
5
|
+
out.set(json, 4);
|
|
6
|
+
return out;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function decodeNm(buf: Uint8Array): { messages: unknown[]; rest: Uint8Array } {
|
|
10
|
+
const messages: unknown[] = [];
|
|
11
|
+
let offset = 0;
|
|
12
|
+
while (buf.length - offset >= 4) {
|
|
13
|
+
const len = new DataView(buf.buffer, buf.byteOffset + offset, 4).getUint32(0, true);
|
|
14
|
+
if (buf.length - offset - 4 < len) break;
|
|
15
|
+
const json = new TextDecoder().decode(buf.subarray(offset + 4, offset + 4 + len));
|
|
16
|
+
messages.push(JSON.parse(json));
|
|
17
|
+
offset += 4 + len;
|
|
18
|
+
}
|
|
19
|
+
return { messages, rest: buf.subarray(offset) };
|
|
20
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backend-agnostic page-driving abstraction.
|
|
3
|
+
*
|
|
4
|
+
* Lets the catalog-workflow-runner drive both a CDP (Puppeteer) page and the
|
|
5
|
+
* Chrome extension through one identical surface. Implementations: `CdpPageActions`
|
|
6
|
+
* (./cdp-page-actions) and the extension-backed equivalent.
|
|
7
|
+
*/
|
|
8
|
+
export interface PageActions {
|
|
9
|
+
goto(url: string, opts?: { waitUntil?: string; timeout?: number }): Promise<void>;
|
|
10
|
+
click(selector: string, context?: string): Promise<void>;
|
|
11
|
+
fill(selector: string, value: string, context?: string): Promise<void>;
|
|
12
|
+
selectOption(selector: string, value: string, context?: string): Promise<void>;
|
|
13
|
+
scrollIntoView(selector: string, context?: string): Promise<void>;
|
|
14
|
+
pressKey(key: string): Promise<void>;
|
|
15
|
+
assertText(selector: string, expected: string, context?: string): Promise<void>;
|
|
16
|
+
waitFor(selector: string, context?: string, timeoutMs?: number): Promise<void>;
|
|
17
|
+
screenshot(file: string): Promise<void>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { type AcquireAction, acquirePage, decideAcquireAction, isChromeRunning } from "./acquire";
|
|
2
|
+
import { ensureAuthenticated } from "./auth";
|
|
3
|
+
import { CdpPageActions } from "./cdp-page-actions";
|
|
4
|
+
import { locateChrome } from "./chrome-locate";
|
|
5
|
+
import { startBridgeServer } from "./extension-bridge";
|
|
6
|
+
import { ExtensionBrowserProvider } from "./extension-provider";
|
|
7
|
+
import type { PageActions } from "./page-actions";
|
|
8
|
+
|
|
9
|
+
export interface AcquiredBrowser {
|
|
10
|
+
page: PageActions;
|
|
11
|
+
mode: string;
|
|
12
|
+
release(): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface BrowserProviderStatus {
|
|
16
|
+
debuggableNow: boolean;
|
|
17
|
+
chromeRunning: boolean;
|
|
18
|
+
chromeInstalled: boolean;
|
|
19
|
+
plannedAction: AcquireAction;
|
|
20
|
+
detail: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface BrowserProvider {
|
|
24
|
+
readonly name: string;
|
|
25
|
+
acquire(consoleUrl: string): Promise<AcquiredBrowser>;
|
|
26
|
+
status(): Promise<BrowserProviderStatus>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
type Settings = { get(key: string): unknown };
|
|
30
|
+
const DEBUG_PORT = 9222;
|
|
31
|
+
|
|
32
|
+
/** Probe the loopback debug endpoint without attaching. */
|
|
33
|
+
async function probeDebuggableDefault(): Promise<boolean> {
|
|
34
|
+
try {
|
|
35
|
+
const r = await fetch(`http://127.0.0.1:${DEBUG_PORT}/json/version`);
|
|
36
|
+
return r.ok;
|
|
37
|
+
} catch {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const DETAIL: Record<AcquireAction, string> = {
|
|
43
|
+
attach: "A debuggable Chrome is reachable on 127.0.0.1:9222 — xcsh will attach and co-drive it.",
|
|
44
|
+
launch: "Chrome is installed and not running — xcsh will launch it on your real profile with a loopback debug port.",
|
|
45
|
+
relaunch:
|
|
46
|
+
"Your Chrome is running without a debug port — xcsh will gracefully quit and reopen it on your real profile (consent granted).",
|
|
47
|
+
dedicated:
|
|
48
|
+
"Your Chrome is running without a debug port and relaunch is off — xcsh will use an isolated profile (run `/chrome relaunch` or set browser.allowChromeRelaunch to use your real session).",
|
|
49
|
+
"no-chrome": "Google Chrome was not found — install it or set browser.chromePath.",
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export class CdpBrowserProvider implements BrowserProvider {
|
|
53
|
+
readonly name = "cdp";
|
|
54
|
+
#settings: Settings;
|
|
55
|
+
#probes: { probeDebuggable: () => Promise<boolean>; chromeRunning: () => boolean; chromeInstalled: () => boolean };
|
|
56
|
+
|
|
57
|
+
constructor(
|
|
58
|
+
settings: Settings,
|
|
59
|
+
probes?: {
|
|
60
|
+
probeDebuggable: () => Promise<boolean>;
|
|
61
|
+
chromeRunning: () => boolean;
|
|
62
|
+
chromeInstalled: () => boolean;
|
|
63
|
+
},
|
|
64
|
+
) {
|
|
65
|
+
this.#settings = settings;
|
|
66
|
+
this.#probes = probes ?? {
|
|
67
|
+
probeDebuggable: probeDebuggableDefault,
|
|
68
|
+
chromeRunning: () => isChromeRunning(),
|
|
69
|
+
chromeInstalled: () => locateChrome({ settings }) != null,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async status(): Promise<BrowserProviderStatus> {
|
|
74
|
+
const debuggableNow = await this.#probes.probeDebuggable();
|
|
75
|
+
const chromeRunning = this.#probes.chromeRunning();
|
|
76
|
+
const chromeInstalled = this.#probes.chromeInstalled();
|
|
77
|
+
const allowRelaunch = this.#settings.get("browser.allowChromeRelaunch") === true;
|
|
78
|
+
const plannedAction = decideAcquireAction({ debuggableNow, chromeRunning, chromeInstalled, allowRelaunch });
|
|
79
|
+
return { debuggableNow, chromeRunning, chromeInstalled, plannedAction, detail: DETAIL[plannedAction] };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async acquire(consoleUrl: string): Promise<AcquiredBrowser> {
|
|
83
|
+
const { browser, page, mode } = await acquirePage({ settings: this.#settings, debugPort: DEBUG_PORT });
|
|
84
|
+
await ensureAuthenticated(page, consoleUrl);
|
|
85
|
+
const dropPort = this.#settings.get("browser.dropPortAfter") === true;
|
|
86
|
+
const relaunched = mode === "relaunched-default";
|
|
87
|
+
return {
|
|
88
|
+
page: new CdpPageActions(page),
|
|
89
|
+
mode,
|
|
90
|
+
release: async () => {
|
|
91
|
+
await browser.disconnect().catch(() => {});
|
|
92
|
+
// dropPortAfter: only meaningful when WE opened the port via relaunch; reopening
|
|
93
|
+
// the real profile without the flag is itself a relaunch — gate it tightly.
|
|
94
|
+
if (dropPort && relaunched) {
|
|
95
|
+
// Best-effort: leave to a follow-up; never force-kill. (No-op stub acceptable here —
|
|
96
|
+
// the port closes when the user next restarts Chrome. See spec "dropPortAfter".)
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Select the best available browser provider: if the Chrome extension bridge is
|
|
105
|
+
* reachable (the extension is loaded + xcsh chrome setup ran), use it (real profile,
|
|
106
|
+
* no debug port needed). Otherwise fall back to CDP (dedicated profile).
|
|
107
|
+
*
|
|
108
|
+
* The probe is bounded: if the extension doesn't connect within `probeTimeoutMs`,
|
|
109
|
+
* the CDP provider is used — so this never blocks a session indefinitely.
|
|
110
|
+
*/
|
|
111
|
+
export async function selectProvider(
|
|
112
|
+
settings: Settings,
|
|
113
|
+
opts?: { probeTimeoutMs?: number; bridgeServer?: import("./extension-bridge").BridgeServer },
|
|
114
|
+
): Promise<BrowserProvider> {
|
|
115
|
+
// `XCSH_BROWSER_PROVIDER=extension` forces the extension (real Chrome) and
|
|
116
|
+
// disables the CDP fallback — required for the NL-driven console automation
|
|
117
|
+
// flagship, where falling back to a separate CDP profile is never wanted.
|
|
118
|
+
// `XCSH_BROWSER_PROVIDER=cdp` forces CDP. The probe timeout is configurable
|
|
119
|
+
// via `XCSH_BRIDGE_PROBE_MS` (default 5s) — the extension can take a few
|
|
120
|
+
// seconds to (re)connect after the bridge socket is (re)bound, and 5s races
|
|
121
|
+
// that reconnect, so callers expecting the extension should raise it.
|
|
122
|
+
const forced = process.env.XCSH_BROWSER_PROVIDER?.toLowerCase();
|
|
123
|
+
const envProbe = Number(process.env.XCSH_BRIDGE_PROBE_MS);
|
|
124
|
+
// Forced-extension default is 45s: the MV3 service worker can suspend between
|
|
125
|
+
// runs, after which only its ~30s reconnect alarm re-attaches it — a shorter
|
|
126
|
+
// probe races (and loses to) that alarm. 45s clears the alarm + reconnect.
|
|
127
|
+
const probeMs =
|
|
128
|
+
opts?.probeTimeoutMs ??
|
|
129
|
+
(Number.isFinite(envProbe) && envProbe > 0 ? envProbe : forced === "extension" ? 45_000 : 5_000);
|
|
130
|
+
|
|
131
|
+
if (forced === "cdp") return new CdpBrowserProvider(settings);
|
|
132
|
+
|
|
133
|
+
try {
|
|
134
|
+
const server = opts?.bridgeServer ?? (await startBridgeServer());
|
|
135
|
+
const deadline = Date.now() + probeMs;
|
|
136
|
+
while (Date.now() < deadline) {
|
|
137
|
+
if (server.connected) {
|
|
138
|
+
return new ExtensionBrowserProvider({ server });
|
|
139
|
+
}
|
|
140
|
+
await new Promise(r => setTimeout(r, 300));
|
|
141
|
+
}
|
|
142
|
+
if (forced === "extension") {
|
|
143
|
+
// Don't tear down the bridge or fall back — keep waiting for the extension.
|
|
144
|
+
throw new Error(
|
|
145
|
+
`XCSH_BROWSER_PROVIDER=extension but the Chrome extension did not connect within ${probeMs}ms. ` +
|
|
146
|
+
`Ensure the extension is loaded and \`xcsh chrome setup\` has run.`,
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
await server.close();
|
|
150
|
+
} catch (err) {
|
|
151
|
+
if (forced === "extension") throw err; // never silently fall back to CDP when extension is required
|
|
152
|
+
// Bridge server failed to start — fall back silently.
|
|
153
|
+
}
|
|
154
|
+
return new CdpBrowserProvider(settings);
|
|
155
|
+
}
|