@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,397 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension-backed {@link PageActions} implementation.
|
|
3
|
+
*
|
|
4
|
+
* Resolves catalogue workflow selectors **without a full `read_ax`** — instead
|
|
5
|
+
* of serializing the entire AX tree (which FREEZES the MV3 service worker on
|
|
6
|
+
* heavy create forms), each interaction asks the in-page DOM for the ONE
|
|
7
|
+
* element that matches the selector, scrolls it into view, and returns its
|
|
8
|
+
* viewport-center coords. Then `click_xy` / `type_text` dispatch a trusted CDP
|
|
9
|
+
* action — trusted events fire inside Angular's NgZone, so vsui dropdowns,
|
|
10
|
+
* form submit, and the console's reactive forms all work.
|
|
11
|
+
*
|
|
12
|
+
* **Selector grammar** (matches the catalogue YAML + the AX resolver):
|
|
13
|
+
* - `text('X')` — element whose textContent includes X.
|
|
14
|
+
* - `role:text('X')` — element of `role` (tag-derived) with text X.
|
|
15
|
+
* - `role[name='X']` — input/control whose label/name/aria matches X.
|
|
16
|
+
* - bare `role` — first element of that role.
|
|
17
|
+
* - anything else — CSS querySelector.
|
|
18
|
+
*
|
|
19
|
+
* This approach was validated by the manual full-UI CRUD smoke (login → create
|
|
20
|
+
* health-check via form → delete via kebab → verify) which used javascript_tool
|
|
21
|
+
* + click_xy/type_text to bypass the read_ax freeze.
|
|
22
|
+
*/
|
|
23
|
+
import type { ExtensionPage } from "./extension-provider";
|
|
24
|
+
import type { PageActions } from "./page-actions";
|
|
25
|
+
|
|
26
|
+
const ALLOWED_SCHEMES = new Set(["https:"]);
|
|
27
|
+
const CONSOLE_DOMAIN_RE = /\.(volterra\.us|console\.ves\.volterra\.io)$/;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* A self-contained in-page resolver: given a catalogue selector string, finds
|
|
31
|
+
* the matching element, scrolls it into view, and returns its viewport-center
|
|
32
|
+
* coords. Runs entirely via `javascript_tool` — one small returnByValue, no
|
|
33
|
+
* full AX serialization.
|
|
34
|
+
*/
|
|
35
|
+
/**
|
|
36
|
+
* Shared element-matching JS for the catalogue selector grammar (text('…'),
|
|
37
|
+
* role:text('…'), role[name='…'], bare role, and "row:has-text('…') >> sub").
|
|
38
|
+
* Both buildResolverScript (returns coords) and buildElementResolverScript
|
|
39
|
+
* (returns the live element for the deterministic click path) embed this verbatim
|
|
40
|
+
* so they resolve identically — only their tails differ.
|
|
41
|
+
*/
|
|
42
|
+
const RESOLVER_HELPERS = `
|
|
43
|
+
function roleToSelector(role){
|
|
44
|
+
switch(role){
|
|
45
|
+
case'button':return'button,input[type=button],input[type=submit],[role=button]';
|
|
46
|
+
case'link':return'a[href],[role=link]';
|
|
47
|
+
case'tab':return'[role=tab]';
|
|
48
|
+
case'textbox':return'input:not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=button]),textarea,[role=textbox]';
|
|
49
|
+
case'textarea':return'textarea';
|
|
50
|
+
case'spinbutton':return'input[type=number],[role=spinbutton]';
|
|
51
|
+
case'checkbox':return'input[type=checkbox],[role=checkbox]';
|
|
52
|
+
case'radio':return'input[type=radio],[role=radio]';
|
|
53
|
+
case'combobox':return'select,[role=combobox]';
|
|
54
|
+
case'listbox':return'[role=listbox],select';
|
|
55
|
+
case'option':return'[role=option],option';
|
|
56
|
+
case'heading':return'h1,h2,h3,h4,h5,h6,[role=heading]';
|
|
57
|
+
case'menuitem':return'[role=menuitem]';
|
|
58
|
+
case'dialog':return'dialog,[role=dialog],[role=alertdialog]';
|
|
59
|
+
case'navigation':return'nav,[role=navigation]';
|
|
60
|
+
case'table':return'table,[role=table]';
|
|
61
|
+
case'row':return'tr,[role=row],datatable-body-row';
|
|
62
|
+
case'cell':return'td,th,[role=cell],[role=gridcell],[role=columnheader]';
|
|
63
|
+
case'img':return'img,[role=img]';
|
|
64
|
+
case'switch':return'[role=switch]';
|
|
65
|
+
default:return'[role='+role+']';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function isVisible(e){
|
|
69
|
+
if(!e||!e.getBoundingClientRect)return false;
|
|
70
|
+
const r=e.getBoundingClientRect();
|
|
71
|
+
if(r.width===0&&r.height===0)return false;
|
|
72
|
+
// offsetParent is null for display:none (and position:fixed, hence the rect check above).
|
|
73
|
+
return e.offsetParent!==null||r.width>0||r.height>0;
|
|
74
|
+
}
|
|
75
|
+
function findByText(text,roleSel){
|
|
76
|
+
const all=roleSel?[...document.querySelectorAll(roleSel)]:[...document.querySelectorAll('*')];
|
|
77
|
+
const norm=t=>t.replace(/\\u0421/g,'C').replace(/\\s+/g,' ').trim();
|
|
78
|
+
const want=norm(text);
|
|
79
|
+
// Match by text FIRST (cheap, no layout), then prefer a VISIBLE match — a
|
|
80
|
+
// hidden/template duplicate (e.g. an off-screen 'Delete' button) resolves to
|
|
81
|
+
// rect 0,0 and the trusted click misses. Computing visibility only on the few
|
|
82
|
+
// text matches avoids forcing a full-page reflow per call.
|
|
83
|
+
const exact=all.filter(e=>norm(e.textContent||'')===want);
|
|
84
|
+
if(exact.length)return exact.find(isVisible)||exact[0];
|
|
85
|
+
const sub=all.filter(e=>norm(e.textContent||'').includes(want));
|
|
86
|
+
return sub.find(isVisible)||sub[0];
|
|
87
|
+
}
|
|
88
|
+
function findByRoleName(role,name){
|
|
89
|
+
const roleSel=roleToSelector(role);
|
|
90
|
+
const candidates=[...document.querySelectorAll(roleSel)];
|
|
91
|
+
const norm=t=>t.replace(/\\s+/g,' ').trim();
|
|
92
|
+
const want=norm(name);
|
|
93
|
+
const byAttr=candidates.filter(e=>{
|
|
94
|
+
const n=norm(e.getAttribute('aria-label')||e.getAttribute('name')||e.getAttribute('placeholder')||e.textContent||'');
|
|
95
|
+
return n===want||n.includes(want);
|
|
96
|
+
});
|
|
97
|
+
if(byAttr.length)return byAttr.find(isVisible)||byAttr[0];
|
|
98
|
+
if(role==='textbox'){
|
|
99
|
+
const byLabel=candidates.filter(e=>norm((e.closest('[class*=form-group],[class*=field],.row')||{}).textContent||'').includes(want));
|
|
100
|
+
return byLabel.find(isVisible)||byLabel[0]||null;
|
|
101
|
+
}
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
// Row-scoping: "row:has-text('NAME') >> <subSelector>" finds the table row
|
|
105
|
+
// containing NAME, then resolves <subSelector> WITHIN that row. Essential for
|
|
106
|
+
// per-row actions (kebab/Delete) when a list has many rows.
|
|
107
|
+
function findInScope(s){
|
|
108
|
+
const textM=s.match(/^text\\('([^']*)'\\)$/);
|
|
109
|
+
const roleTextM=s.match(/^([a-z]+):text\\('([^']*)'\\)$/);
|
|
110
|
+
const roleNameM=s.match(/^([a-z]+)\\[name='([^']*)'\\]$/);
|
|
111
|
+
const bareRoleM=s.match(/^[a-z]+$/);
|
|
112
|
+
if(textM)return findByText(textM[1]);
|
|
113
|
+
if(roleTextM)return findByText(roleTextM[2],roleToSelector(roleTextM[1]));
|
|
114
|
+
if(roleNameM)return findByRoleName(roleNameM[1],roleNameM[2]);
|
|
115
|
+
if(bareRoleM){const c=[...document.querySelectorAll(roleToSelector(s))].filter(isVisible);return c[0]||document.querySelector(roleToSelector(s));}
|
|
116
|
+
{const c=[...document.querySelectorAll(s)].filter(isVisible);return c[0]||document.querySelector(s);}
|
|
117
|
+
}
|
|
118
|
+
`;
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* The element-finding block, shared. `__FAIL__('msg')` sentinels are substituted
|
|
122
|
+
* per builder: buildResolverScript → a {found:false,error} JSON return;
|
|
123
|
+
* buildElementResolverScript → `return null`. Sets `el` and scrolls it into view.
|
|
124
|
+
*/
|
|
125
|
+
const RESOLVER_FIND = `
|
|
126
|
+
let el=null;
|
|
127
|
+
if(sel.includes('>>')){
|
|
128
|
+
const parts=sel.split('>>').map(p=>p.trim());
|
|
129
|
+
const rowM=parts[0].match(/^row:has-text\\('([^']*)'\\)$/);
|
|
130
|
+
const want=rowM?rowM[1].replace(/\\u0421/g,'C'):'';
|
|
131
|
+
const rows=[...document.querySelectorAll('tr,[role=row],datatable-body-row')];
|
|
132
|
+
const row=rows.find(r=>(r.textContent||'').replace(/\\u0421/g,'C').includes(want));
|
|
133
|
+
if(!row)__FAIL__('no row matching '+parts[0]);
|
|
134
|
+
const subTextM=parts[1].match(/^([a-z]+):text\\('([^']*)'\\)$/);
|
|
135
|
+
if(subTextM){const want2=subTextM[2];const cs=[...row.querySelectorAll(roleToSelector(subTextM[1]))].filter(isVisible);const nm=t=>t.replace(/\\s+/g,' ').trim();el=cs.find(e=>nm(e.textContent||'')===want2)||cs.find(e=>nm(e.textContent||'').includes(want2));}
|
|
136
|
+
else{const cs=[...row.querySelectorAll(parts[1])].filter(isVisible);el=cs[0]||row.querySelector(parts[1]);}
|
|
137
|
+
if(!el)__FAIL__('sub-selector '+parts[1]+' not found in row');
|
|
138
|
+
}else{
|
|
139
|
+
el=findInScope(sel);
|
|
140
|
+
}
|
|
141
|
+
if(!el)__FAIL__('no match for '+sel);
|
|
142
|
+
el.scrollIntoView({block:'center',inline:'center'});
|
|
143
|
+
`;
|
|
144
|
+
|
|
145
|
+
/** Resolve a selector to viewport-center coords (returns JSON). */
|
|
146
|
+
export function buildResolverScript(selector: string): string {
|
|
147
|
+
const sel = JSON.stringify(selector);
|
|
148
|
+
const find = RESOLVER_FIND.replace(/__FAIL__\(([^;]*?)\);/g, "return JSON.stringify({found:false,error:($1)});");
|
|
149
|
+
return `(()=>{
|
|
150
|
+
const sel=${sel};
|
|
151
|
+
${RESOLVER_HELPERS}
|
|
152
|
+
${find}
|
|
153
|
+
const r=el.getBoundingClientRect();
|
|
154
|
+
const inGrid=!!el.closest&&!!el.closest('ngx-datatable,datatable-body-cell,datatable-body-row,[class*=datatable]');
|
|
155
|
+
return JSON.stringify({found:true,x:Math.round(r.x+r.width/2),y:Math.round(r.y+r.height/2),tag:el.tagName,txt:(el.textContent||'').trim().slice(0,30),inGrid:inGrid,val:(el.value!==undefined&&el.value!==null?String(el.value):'')});
|
|
156
|
+
})()`;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** Resolve a selector to the live ELEMENT (returns the element or null) — the
|
|
160
|
+
* input to the deterministic click path (clickElement → getContentQuads + hit-test). */
|
|
161
|
+
export function buildElementResolverScript(selector: string): string {
|
|
162
|
+
const sel = JSON.stringify(selector);
|
|
163
|
+
const find = RESOLVER_FIND.replace(/__FAIL__\([^;]*?\);/g, "return null;");
|
|
164
|
+
return `(()=>{
|
|
165
|
+
const sel=${sel};
|
|
166
|
+
${RESOLVER_HELPERS}
|
|
167
|
+
${find}
|
|
168
|
+
return el;
|
|
169
|
+
})()`;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Run a `javascript_tool` snippet whose body returns a JSON string, and parse it.
|
|
174
|
+
* The bridge's `javascript_tool` wraps the evaluated value as `{ result: <value> }`,
|
|
175
|
+
* so unwrap `.result` first; tolerate either the wrapper, a bare string, or a bare
|
|
176
|
+
* object so this works against the real BridgeExtensionPage AND test doubles.
|
|
177
|
+
*/
|
|
178
|
+
async function evalJson(ext: ExtensionPage, code: string): Promise<any> {
|
|
179
|
+
const raw = await ext.javascriptTool(code);
|
|
180
|
+
const payload =
|
|
181
|
+
raw && typeof raw === "object" && "result" in (raw as object) ? (raw as { result: unknown }).result : raw;
|
|
182
|
+
return typeof payload === "string" ? JSON.parse(payload) : payload;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** Resolve a selector to viewport-center coords via `javascript_tool`. */
|
|
186
|
+
async function resolveCoords(ext: ExtensionPage, selector: string): Promise<{ x: number; y: number }> {
|
|
187
|
+
const result = await evalJson(ext, buildResolverScript(selector));
|
|
188
|
+
if (!result?.found) {
|
|
189
|
+
throw new Error(`selector "${selector}" not found in the page: ${result?.error ?? "no match"}`);
|
|
190
|
+
}
|
|
191
|
+
return { x: result.x as number, y: result.y as number };
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Fill a field located by selector: find it → focus → set value via the
|
|
196
|
+
* framework-safe native-setter technique → dispatch events to commit to
|
|
197
|
+
* Angular's form model. Runs entirely via `javascript_tool`, never serializing
|
|
198
|
+
* the whole AX tree. The selector-matching logic is inlined (same grammar as
|
|
199
|
+
* buildResolverScript) so the fill runs as a single, self-contained eval.
|
|
200
|
+
*/
|
|
201
|
+
function buildFillScript(selector: string, value: string): string {
|
|
202
|
+
const sel = JSON.stringify(selector);
|
|
203
|
+
const val = JSON.stringify(value);
|
|
204
|
+
return `(()=>{
|
|
205
|
+
const sel=${sel};
|
|
206
|
+
function roleToSel(r){const m={button:'button,input[type=button],input[type=submit],[role=button]',link:'a[href],[role=link]',tab:'[role=tab]',textbox:'input:not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=button]),textarea,[role=textbox]',textarea:'textarea',spinbutton:'input[type=number],[role=spinbutton]',checkbox:'input[type=checkbox],[role=checkbox]',combobox:'select,[role=combobox]',listbox:'[role=listbox],select',option:'[role=option],option',heading:'h1,h2,h3,h4,h5,h6,[role=heading]'};return m[r]||'[role='+r+']';}
|
|
207
|
+
function norm(t){return t.replace(/\\u0421/g,'C').replace(/\\s+/g,' ').trim();}
|
|
208
|
+
function findText(text,rSel){return(rSel?[...document.querySelectorAll(rSel)]:[...document.querySelectorAll('*')]).find(e=>{const n=norm(e.textContent||'');return n===norm(text)||n.includes(norm(text));});}
|
|
209
|
+
function findRoleName(role,name){const cs=[...document.querySelectorAll(roleToSel(role))];const w=norm(name);return cs.find(e=>norm(e.getAttribute('aria-label')||e.getAttribute('name')||e.getAttribute('placeholder')||e.textContent||'').includes(w))||(role==='textbox'?cs.find(e=>norm((e.closest('[class*=form-group],[class*=field],.row')||{}).textContent||'').includes(w)):null);}
|
|
210
|
+
let el=null;
|
|
211
|
+
const tm=sel.match(/^text\\('([^']*)'\\)$/),rtm=sel.match(/^([a-z]+):text\\('([^']*)'\\)$/),rnm=sel.match(/^([a-z]+)\\[name='([^']*)'\\]$/),br=sel.match(/^[a-z]+$/);
|
|
212
|
+
if(tm)el=findText(tm[1]);else if(rtm)el=findText(rtm[2],roleToSel(rtm[1]));else if(rnm)el=findRoleName(rnm[1],rnm[2]);else if(br)el=document.querySelector(roleToSel(sel));else el=document.querySelector(sel);
|
|
213
|
+
if(!el)return JSON.stringify({filled:false,error:'selector not found: '+sel});
|
|
214
|
+
el.scrollIntoView({block:'center',inline:'center'});el.focus();
|
|
215
|
+
let p=Object.getPrototypeOf(el),d;while(p){d=Object.getOwnPropertyDescriptor(p,'value');if(d&&d.set)break;p=Object.getPrototypeOf(p);}
|
|
216
|
+
const v=${val};d&&d.set?d.set.call(el,v):el.value=v;
|
|
217
|
+
// Commit to Angular's form model: input+change first. ngx-datatable inline-edit
|
|
218
|
+
// cells differ in how they persist: http-lb "Domains" (vsui-input) commits on
|
|
219
|
+
// BLUR, while ip-prefix-set "IPv4 Prefix" reverts on a bare blur and only persists
|
|
220
|
+
// on an Enter keydown. So for inputs inside a datatable we dispatch Enter BEFORE
|
|
221
|
+
// blur (Enter commits the row; the subsequent blur then re-renders from a model
|
|
222
|
+
// that already holds the value, instead of reverting). Plain textboxes get only
|
|
223
|
+
// blur/focusout — no synthetic Enter, which would risk a premature form submit.
|
|
224
|
+
el.dispatchEvent(new Event('input',{bubbles:true}));
|
|
225
|
+
el.dispatchEvent(new Event('change',{bubbles:true}));
|
|
226
|
+
const inGrid=!!el.closest&&!!el.closest('ngx-datatable,datatable-body-cell,datatable-body-row,[class*=datatable]');
|
|
227
|
+
if(inGrid){for(const t of['keydown','keypress','keyup'])el.dispatchEvent(new KeyboardEvent(t,{bubbles:true,key:'Enter',code:'Enter',keyCode:13,which:13}));}
|
|
228
|
+
el.dispatchEvent(new Event('blur',{bubbles:true}));
|
|
229
|
+
el.dispatchEvent(new Event('focusout',{bubbles:true}));
|
|
230
|
+
return JSON.stringify({filled:true,val:el.value,inGrid:inGrid});
|
|
231
|
+
})()`;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export class ExtensionPageActions implements PageActions {
|
|
235
|
+
#ext: ExtensionPage;
|
|
236
|
+
|
|
237
|
+
constructor(ext: ExtensionPage) {
|
|
238
|
+
this.#ext = ext;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
async goto(url: string): Promise<void> {
|
|
242
|
+
const parsed = new URL(url);
|
|
243
|
+
if (!ALLOWED_SCHEMES.has(parsed.protocol)) {
|
|
244
|
+
throw new Error(`Disallowed URL scheme: ${parsed.protocol} (only https: is allowed)`);
|
|
245
|
+
}
|
|
246
|
+
if (!CONSOLE_DOMAIN_RE.test(parsed.hostname)) {
|
|
247
|
+
throw new Error(`URL "${parsed.hostname}" is not an F5 XC console domain`);
|
|
248
|
+
}
|
|
249
|
+
await this.#ext.navigate(url);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
async click(selector: string, _context?: string): Promise<void> {
|
|
253
|
+
// Deterministic click: resolve the selector to the live element, then let the
|
|
254
|
+
// extension derive geometry from the renderer (DOM.getContentQuads) and
|
|
255
|
+
// hit-test the point (document.elementFromPoint) before dispatching. This
|
|
256
|
+
// replaces the JS getBoundingClientRect coords + 300ms settle heuristic —
|
|
257
|
+
// the hit-test is the gate now (it fails loudly on occlusion instead of
|
|
258
|
+
// landing mid-transition or on an overlay).
|
|
259
|
+
await this.#ext.clickElement(buildElementResolverScript(selector));
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
async fill(selector: string, value: string, _context?: string): Promise<void> {
|
|
263
|
+
// Probe the element: location, current value, and whether it's an
|
|
264
|
+
// ngx-datatable inline-edit cell. Most console inputs commit reliably via
|
|
265
|
+
// the native-setter path (buildFillScript) — that's what the verified
|
|
266
|
+
// resources use. But ngx-datatable inline cells (e.g. ip-prefix-set's
|
|
267
|
+
// "IPv4 Prefix") do NOT pick up a synthetic value-setter: the cell stays
|
|
268
|
+
// ng-untouched and the reactive form reports the field empty at save. Those
|
|
269
|
+
// cells only commit through REAL keystrokes (each keydown runs inside
|
|
270
|
+
// Angular's NgZone), so for grid inputs we focus the cell and type via CDP.
|
|
271
|
+
const probe = await evalJson(this.#ext, buildResolverScript(selector));
|
|
272
|
+
if (!probe?.found) {
|
|
273
|
+
throw new Error(`fill("${selector}"): ${probe?.error ?? "selector not found"}`);
|
|
274
|
+
}
|
|
275
|
+
// Two element classes need REAL CDP keystrokes, not a synthetic value-setter:
|
|
276
|
+
// - ngx-datatable inline cells (probe.inGrid) — commit on Enter.
|
|
277
|
+
// - <textarea> inside vsui secret/Blindfold sub-forms (container_registry's
|
|
278
|
+
// "Secret to Blindfold") — the native setter leaves them empty/required.
|
|
279
|
+
// For textareas we must NOT press Enter (it inserts a newline); Tab blurs.
|
|
280
|
+
const isTextarea = probe.tag === "TEXTAREA";
|
|
281
|
+
if (probe.inGrid || isTextarea) {
|
|
282
|
+
// Focus the cell/textarea via the deterministic path (hit-tested).
|
|
283
|
+
await this.#ext.clickElement(buildElementResolverScript(selector));
|
|
284
|
+
await new Promise(r => setTimeout(r, 200));
|
|
285
|
+
// Clear any pre-existing text (Backspace ×N) so re-fills are clean —
|
|
286
|
+
// fresh Add-Item rows are empty, so this is a no-op for create.
|
|
287
|
+
const curLen = typeof probe.val === "string" ? probe.val.length : 0;
|
|
288
|
+
for (let i = 0; i < curLen; i++) await this.#ext.keyPress("Backspace").catch(() => {});
|
|
289
|
+
await this.#ext.typeText(value);
|
|
290
|
+
await new Promise(r => setTimeout(r, 200));
|
|
291
|
+
await this.#ext.keyPress(probe.inGrid && !isTextarea ? "Enter" : "Tab").catch(() => {});
|
|
292
|
+
await new Promise(r => setTimeout(r, 300));
|
|
293
|
+
const after = await evalJson(this.#ext, buildResolverScript(selector));
|
|
294
|
+
if (typeof after?.val === "string" && after.val.includes(value)) return;
|
|
295
|
+
// Real typing didn't stick — fall through to the native-setter backstop.
|
|
296
|
+
}
|
|
297
|
+
const result = await evalJson(this.#ext, buildFillScript(selector, value));
|
|
298
|
+
if (!result?.filled) {
|
|
299
|
+
throw new Error(`fill("${selector}"): ${result?.error ?? "could not set value"}`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
async selectOption(selector: string, value: string, _context?: string): Promise<void> {
|
|
304
|
+
// F5 XC vsui listboxes are <input role="listbox"> — clicking opens the
|
|
305
|
+
// panel, and typing FILTERS the options (the target option often isn't in
|
|
306
|
+
// the initial set). So: focus → type to filter → click the matching option.
|
|
307
|
+
// Bound every sub-step so a frozen/blocking dropdown can never hang the whole
|
|
308
|
+
// workflow — the option set may load async, and many selects have a sensible
|
|
309
|
+
// default, so option selection is best-effort.
|
|
310
|
+
const withTimeout = <R>(p: Promise<R>, ms: number, label: string): Promise<R> =>
|
|
311
|
+
Promise.race([
|
|
312
|
+
p,
|
|
313
|
+
new Promise<R>((_, rej) =>
|
|
314
|
+
setTimeout(() => rej(new Error(`selectOption ${label} timed out after ${ms}ms`)), ms),
|
|
315
|
+
),
|
|
316
|
+
]);
|
|
317
|
+
// Click the listbox to open it — do NOT type into it. The vsui listbox
|
|
318
|
+
// dropdowns are <input role="listbox"> but typing filter text corrupts the
|
|
319
|
+
// display ("HTTPS with Automatic Ceruat-lbr...", "BlockingMonitoring").
|
|
320
|
+
// All options appear on click; the option is clicked directly below.
|
|
321
|
+
const resolved = await withTimeout(evalJson(this.#ext, buildResolverScript(selector)), 10_000, "resolve-listbox");
|
|
322
|
+
if (!resolved?.found) throw new Error(`selectOption: selector "${selector}" not found`);
|
|
323
|
+
await withTimeout(this.#ext.clickElement(buildElementResolverScript(selector)), 10_000, "click-listbox");
|
|
324
|
+
await new Promise(r => setTimeout(r, 1200));
|
|
325
|
+
// Click the option whose text matches value (exact-first via the resolver).
|
|
326
|
+
// Best-effort: if it never renders, fall through — the default value usually
|
|
327
|
+
// already applies, and a hard failure here would block create flows.
|
|
328
|
+
try {
|
|
329
|
+
// Deterministic option click — polls for the option to render (async panel)
|
|
330
|
+
// and hit-tests it. Best-effort; on no-match it throws and we Escape below.
|
|
331
|
+
await withTimeout(
|
|
332
|
+
this.#ext.clickElement(buildElementResolverScript(`option:text('${value}')`), 6_000),
|
|
333
|
+
12_000,
|
|
334
|
+
"click-option",
|
|
335
|
+
);
|
|
336
|
+
await new Promise(r => setTimeout(r, 600));
|
|
337
|
+
} catch {
|
|
338
|
+
// Option not selectable (already default, or non-standard widget) — press
|
|
339
|
+
// Escape to dismiss any open overlay and continue.
|
|
340
|
+
await this.#ext.keyPress("Escape").catch(() => {});
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
async selectLabel(selector: string, value: string, _context?: string): Promise<void> {
|
|
345
|
+
// Atomic CDK-portal typeahead interaction: the extension's label_select tool
|
|
346
|
+
// handles type → poll → click in ONE handler without losing focus (the root
|
|
347
|
+
// cause of all previous label-selector failures). Uses plain Runtime.evaluate
|
|
348
|
+
// (not evaluateWithRecovery which detaches the debugger and closes the portal).
|
|
349
|
+
await this.#ext.labelSelect(selector, value);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
async scrollIntoView(selector: string, _context?: string): Promise<void> {
|
|
353
|
+
// resolveCoords already does scrollIntoView.
|
|
354
|
+
await resolveCoords(this.#ext, selector);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
async pressKey(key: string): Promise<void> {
|
|
358
|
+
await this.#ext.keyPress(key);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
async assertText(selector: string, expected: string, _context?: string): Promise<void> {
|
|
362
|
+
// Use javascript_tool to check text presence (avoids read_ax freeze).
|
|
363
|
+
const result = await evalJson(this.#ext, buildResolverScript(selector));
|
|
364
|
+
if (!result?.found) throw new Error(`assertText: selector "${selector}" not found`);
|
|
365
|
+
const txt = result.txt ?? "";
|
|
366
|
+
if (!txt.includes(expected)) {
|
|
367
|
+
throw new Error(`assertText: expected "${expected}" not found in "${txt}"`);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
async waitFor(selector: string, _context?: string, timeoutMs?: number): Promise<void> {
|
|
372
|
+
// Poll via javascript_tool (not read_ax, which freezes on heavy forms).
|
|
373
|
+
const ms = timeoutMs ?? 30_000;
|
|
374
|
+
const deadline = Date.now() + ms;
|
|
375
|
+
while (Date.now() < deadline) {
|
|
376
|
+
try {
|
|
377
|
+
await resolveCoords(this.#ext, selector);
|
|
378
|
+
return; // found
|
|
379
|
+
} catch {
|
|
380
|
+
await new Promise(r => setTimeout(r, 1000));
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
throw new Error(`waitFor "${selector}" timed out after ${ms}ms`);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// biome-ignore lint/suspicious/useAwait: signature is async (PageActions contract)
|
|
387
|
+
async screenshot(_file: string): Promise<void> {
|
|
388
|
+
// Intentionally a no-op for the extension provider. CDP captureScreenshot
|
|
389
|
+
// transiently FREEZES the MV3 service worker; in observable mode the runner
|
|
390
|
+
// shoots after EVERY step, so the freeze cascades into the next step's
|
|
391
|
+
// operations (each then blocking on the 30s bridge timeout) — that is what
|
|
392
|
+
// hung multi-step flows like delete. The extension provider's whole value is
|
|
393
|
+
// that the human watches the LIVE Chrome, so per-step PNG artifacts are
|
|
394
|
+
// redundant. Skipping the capture removes the freeze entirely. (CDP-provider
|
|
395
|
+
// screenshots are unaffected — this override is extension-only.)
|
|
396
|
+
}
|
|
397
|
+
}
|