@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,147 @@
|
|
|
1
|
+
# xcsh Chrome Extension Bridge — Tool API Reference
|
|
2
|
+
|
|
3
|
+
> Surfaced via `xcsh://extension`. The xcsh assistant drives the browser through
|
|
4
|
+
> the Chrome extension bridge (native messaging → service worker → CDP). Knowing
|
|
5
|
+
> which tool to use — and which to avoid — for each interaction is essential for
|
|
6
|
+
> deterministic, non-fragile automation.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Deterministic click path (PREFERRED)
|
|
11
|
+
|
|
12
|
+
### `click_element { js, wait_ms? }`
|
|
13
|
+
**Use for:** clicking any element that exists in the page's main document.
|
|
14
|
+
|
|
15
|
+
`js` is a JavaScript expression that returns the target **Element** (or null). The
|
|
16
|
+
extension resolves geometry from the renderer (`DOM.getContentQuads` — CSS viewport
|
|
17
|
+
px with transforms/zoom/DPR baked in) and **hit-tests** the point
|
|
18
|
+
(`document.elementFromPoint`) before dispatching the trusted click. On occlusion it
|
|
19
|
+
re-scrolls once, then **fails loudly** naming the occluder — never a silent mis-click.
|
|
20
|
+
`wait_ms` polls for async elements (CDK portals, lazy content).
|
|
21
|
+
|
|
22
|
+
**Guarantees:**
|
|
23
|
+
- Deterministic across window sizes and zoom levels (layout-engine coords, not JS rects).
|
|
24
|
+
- Catches overlays (CDK portals, dialogs) and tells you what's in the way.
|
|
25
|
+
- Holds the element handle atomically across scroll → measure → verify → click.
|
|
26
|
+
|
|
27
|
+
**Build the `js` arg via** `buildElementResolverScript(selector)` (the same catalogue
|
|
28
|
+
selector grammar: `text('…')`, `role:text('…')`, `role[name='…']`, CSS, row-scoped `>>`)
|
|
29
|
+
so the click resolves the same element the workflow YAML names.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
### `click { ref }`
|
|
34
|
+
Use when you already have an AX `ref` handle (from `read_ax`). Routes through
|
|
35
|
+
`click_element` internally — same determinism guarantees.
|
|
36
|
+
|
|
37
|
+
### `click_xy { x, y }`
|
|
38
|
+
**Last-resort.** Only for viewport points with no backing element (e.g. a computed
|
|
39
|
+
portal-overlay coordinate, or testing a specific pixel). Skips hit-testing.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## CDK-portal / typeahead (REQUIRED for CDK portals)
|
|
44
|
+
|
|
45
|
+
### `label_select { selector, value, label_value?, wait_ms? }`
|
|
46
|
+
**Use for:** any CDK-portal typeahead (`.cdk-overlay-container`): label-selector
|
|
47
|
+
key/operator/value steps, vsui "Type to search" inputs.
|
|
48
|
+
|
|
49
|
+
The extension keeps the input **focused throughout** (uses plain `Runtime.evaluate`,
|
|
50
|
+
NOT `evaluateWithRecovery` which detaches the debugger and kills focus). It:
|
|
51
|
+
1. Clicks the input (focus).
|
|
52
|
+
2. Types `value` via `Input.insertText` (keeps focus).
|
|
53
|
+
3. Polls the CDK portal for a matching option (`span` in `.cdk-overlay-container`).
|
|
54
|
+
4. Clicks the option via trusted CDP.
|
|
55
|
+
5. If `label_value` is provided, enters it into the value field that appears (uses the
|
|
56
|
+
secret-textarea real-typing path if it's a `<textarea>`).
|
|
57
|
+
|
|
58
|
+
**Why mandatory for CDK portals:** `javascript_tool` routes through `evaluateWithRecovery`
|
|
59
|
+
which DETACHES the CDP debugger on timeout — killing input focus and closing the portal.
|
|
60
|
+
`label_select` uses plain `Runtime.evaluate` and holds focus end-to-end.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Input (trusted)
|
|
65
|
+
|
|
66
|
+
### `type_text { text }`
|
|
67
|
+
Inserts text via `Input.insertText` into the currently-focused element. Fires genuine
|
|
68
|
+
trusted input events that Angular's ControlValueAccessor and vsui pick up. Use this
|
|
69
|
+
(or `fill` via page-actions) for text fields, not programmatic value setting.
|
|
70
|
+
|
|
71
|
+
### `key_press { key }`
|
|
72
|
+
Dispatches a trusted `Input.dispatchKeyEvent` (keyDown + keyUp) for the named key
|
|
73
|
+
(e.g. `"Enter"`, `"Tab"`, `"Escape"`, `"Backspace"`).
|
|
74
|
+
|
|
75
|
+
### `form_input { ref, value }`
|
|
76
|
+
Sets a form field's value via `Runtime.callFunctionOn` — the Angular-compat path that
|
|
77
|
+
bypasses vsui's value-descriptor patching. Use when `fill` isn't available.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## DOM inspection (caution: defocuses active input)
|
|
82
|
+
|
|
83
|
+
### `javascript_tool { code }`
|
|
84
|
+
Evaluates arbitrary JavaScript and returns the result. Routes through
|
|
85
|
+
`evaluateWithRecovery` — **IMPORTANT: this defocuses the currently-focused input and
|
|
86
|
+
closes any open CDK portal / vsui dropdown.** Never call it between a typeahead open
|
|
87
|
+
and a portal selection. Safe for reading DOM state BEFORE opening a typeahead.
|
|
88
|
+
|
|
89
|
+
### `read_ax { }` / `find { selector }`
|
|
90
|
+
Reads the accessibility tree or finds AX nodes by selector. Both freeze the MV3
|
|
91
|
+
service worker on heavy F5 XC SPA pages (30s+) — prefer `javascript_tool` for quick
|
|
92
|
+
DOM queries. `read_ax` is usable on lighter pages.
|
|
93
|
+
|
|
94
|
+
### `get_page_text { }`
|
|
95
|
+
Returns the visible text content of the current page.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Navigation
|
|
100
|
+
|
|
101
|
+
### `navigate { url }`
|
|
102
|
+
Navigates to a URL. Auto-accepts `beforeunload` ("Leave site?") dialogs — so a dirty
|
|
103
|
+
form's dialog does NOT block navigation. Wait for the target page to settle before
|
|
104
|
+
querying the DOM.
|
|
105
|
+
|
|
106
|
+
### `wait_for { selector, context?, timeoutMs? }` / `assert_text { selector, expected }`
|
|
107
|
+
Wait for an element to appear / assert text. Use these as post-navigation settle points.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Tab management
|
|
112
|
+
|
|
113
|
+
### `tabs_list`, `tabs_create`, `tabs_close`
|
|
114
|
+
Enumerate, open, and close browser tabs. Useful for multi-tab flows or checking that a
|
|
115
|
+
navigation landed on the intended page.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Screenshot (avoid in automation)
|
|
120
|
+
|
|
121
|
+
### `screenshot { }` → base64 JPEG
|
|
122
|
+
Captures a scaled canvas screenshot. **Avoid in automation loops** — `captureVisibleTab`
|
|
123
|
+
freezes the MV3 service worker event loop on retina Mac displays, blocking all
|
|
124
|
+
subsequent bridge requests for several seconds.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Debugging tools
|
|
129
|
+
|
|
130
|
+
### `read_console { pattern? }` / `read_network { pattern? }`
|
|
131
|
+
Read Chrome DevTools console logs or network requests. Use for debugging — not required
|
|
132
|
+
in deterministic create/read/update/delete flows.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Summary: which tool for which job
|
|
137
|
+
|
|
138
|
+
| Situation | Tool |
|
|
139
|
+
|-----------|------|
|
|
140
|
+
| Click a button/tab/link in the page | `click_element` (buildElementResolverScript) |
|
|
141
|
+
| Click inside a CDK portal option | `label_select` (the ONLY reliable path) |
|
|
142
|
+
| Fill a text input | page-actions `fill` → `type_text` under the hood |
|
|
143
|
+
| Select from a vsui listbox | page-actions `selectOption` → `click_element` + poll |
|
|
144
|
+
| Need current DOM state | `javascript_tool` (but check there's no open typeahead first) |
|
|
145
|
+
| Navigate between pages | `navigate` |
|
|
146
|
+
| Verify something appeared | `wait_for` / `assert_text` |
|
|
147
|
+
| Raw coordinates only | `click_xy` (last resort) |
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal URL routing system for internal protocols like agent://, memory://, skill://, mcp://, and local://.
|
|
3
|
+
*
|
|
4
|
+
* This module provides a unified way to resolve internal URLs without
|
|
5
|
+
* exposing filesystem paths to the agent.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { InternalUrlRouter, AgentProtocolHandler, MemoryProtocolHandler, SkillProtocolHandler } from './internal-urls';
|
|
10
|
+
*
|
|
11
|
+
* const router = new InternalUrlRouter();
|
|
12
|
+
* router.register(new AgentProtocolHandler({ getArtifactsDir: () => sessionDir }));
|
|
13
|
+
* router.register(new MemoryProtocolHandler({ getMemoryRoot: () => memoryRoot }));
|
|
14
|
+
* router.register(new SkillProtocolHandler({ getSkills: () => skills }));
|
|
15
|
+
*
|
|
16
|
+
* if (router.canHandle('agent://reviewer_0')) {
|
|
17
|
+
* const resource = await router.resolve('agent://reviewer_0');
|
|
18
|
+
* console.log(resource.content);
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
export * from "./agent-protocol";
|
|
24
|
+
export * from "./api-catalog-resolve";
|
|
25
|
+
export * from "./api-catalog-types";
|
|
26
|
+
export * from "./api-spec-resolve";
|
|
27
|
+
export * from "./api-spec-types";
|
|
28
|
+
export * from "./artifact-protocol";
|
|
29
|
+
export * from "./computer-profile";
|
|
30
|
+
export * from "./console-catalog-types";
|
|
31
|
+
export * from "./console-resolve";
|
|
32
|
+
export * from "./jobs-protocol";
|
|
33
|
+
export * from "./json-query";
|
|
34
|
+
export * from "./local-protocol";
|
|
35
|
+
export * from "./mcp-protocol";
|
|
36
|
+
export * from "./memory-protocol";
|
|
37
|
+
export * from "./parse";
|
|
38
|
+
export * from "./profile-collectors";
|
|
39
|
+
export * from "./router";
|
|
40
|
+
export * from "./rule-protocol";
|
|
41
|
+
export * from "./skill-protocol";
|
|
42
|
+
export * from "./terraform-resolve";
|
|
43
|
+
export type * from "./terraform-types";
|
|
44
|
+
export type * from "./types";
|
|
45
|
+
export * from "./user-profile";
|
|
46
|
+
export * from "./xcsh-protocol";
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { AsyncJobManager } from "../async";
|
|
2
|
+
import { formatDuration } from "../tools/render-utils";
|
|
3
|
+
import type { InternalResource, InternalUrl, ProtocolHandler } from "./types";
|
|
4
|
+
|
|
5
|
+
export interface JobsProtocolOptions {
|
|
6
|
+
getAsyncJobManager: () => AsyncJobManager | undefined;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function formatJobTime(startTime: number): string {
|
|
10
|
+
return new Date(startTime).toISOString();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function formatJobDuration(startTime: number): string {
|
|
14
|
+
return formatDuration(Math.max(0, Date.now() - startTime));
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function normalizeJobId(url: InternalUrl): string {
|
|
18
|
+
const host = url.rawHost || url.hostname;
|
|
19
|
+
const pathname = (url.rawPathname ?? url.pathname).replace(/^\/+/, "").trim();
|
|
20
|
+
if (host && pathname) return `${host}/${pathname}`;
|
|
21
|
+
if (host) return host;
|
|
22
|
+
return pathname;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export class JobsProtocolHandler implements ProtocolHandler {
|
|
26
|
+
readonly scheme = "jobs";
|
|
27
|
+
|
|
28
|
+
constructor(private readonly options: JobsProtocolOptions) {}
|
|
29
|
+
|
|
30
|
+
async resolve(url: InternalUrl): Promise<InternalResource> {
|
|
31
|
+
const manager = this.options.getAsyncJobManager();
|
|
32
|
+
if (!manager) {
|
|
33
|
+
const content =
|
|
34
|
+
"# Jobs\n\nBackground job support is disabled. Enable `async.enabled` or `bash.autoBackground.enabled` to use jobs://.";
|
|
35
|
+
return {
|
|
36
|
+
url: url.href,
|
|
37
|
+
content,
|
|
38
|
+
contentType: "text/markdown",
|
|
39
|
+
size: Buffer.byteLength(content, "utf-8"),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const jobId = normalizeJobId(url);
|
|
44
|
+
if (!jobId) {
|
|
45
|
+
return this.#listJobs(url, manager);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return this.#getJob(url, manager, jobId);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
#listJobs(url: InternalUrl, manager: AsyncJobManager): InternalResource {
|
|
52
|
+
const jobs = manager.getAllJobs();
|
|
53
|
+
const running = jobs.filter(job => job.status === "running").sort((a, b) => a.startTime - b.startTime);
|
|
54
|
+
const done = jobs.filter(job => job.status !== "running").sort((a, b) => b.startTime - a.startTime);
|
|
55
|
+
const ordered = [...running, ...done];
|
|
56
|
+
|
|
57
|
+
if (ordered.length === 0) {
|
|
58
|
+
const content = "# Jobs\n\nNo background jobs found.";
|
|
59
|
+
return {
|
|
60
|
+
url: url.href,
|
|
61
|
+
content,
|
|
62
|
+
contentType: "text/markdown",
|
|
63
|
+
size: Buffer.byteLength(content, "utf-8"),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const lines = ordered.map(job => {
|
|
68
|
+
return `- \`${job.id}\` [${job.type}] **${job.status}** — ${job.label} \n started: ${formatJobTime(job.startTime)} · duration: ${formatJobDuration(job.startTime)}`;
|
|
69
|
+
});
|
|
70
|
+
const content = `# Jobs\n\n${ordered.length} job${ordered.length === 1 ? "" : "s"}\n\n${lines.join("\n")}`;
|
|
71
|
+
return {
|
|
72
|
+
url: url.href,
|
|
73
|
+
content,
|
|
74
|
+
contentType: "text/markdown",
|
|
75
|
+
size: Buffer.byteLength(content, "utf-8"),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
#getJob(url: InternalUrl, manager: AsyncJobManager, jobId: string): InternalResource {
|
|
80
|
+
const job = manager.getJob(jobId);
|
|
81
|
+
if (!job) {
|
|
82
|
+
const content = `# Job Not Found\n\n404: No async job found with id \`${jobId}\`.`;
|
|
83
|
+
return {
|
|
84
|
+
url: url.href,
|
|
85
|
+
content,
|
|
86
|
+
contentType: "text/markdown",
|
|
87
|
+
size: Buffer.byteLength(content, "utf-8"),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const sections = [
|
|
92
|
+
`# Job ${job.id}`,
|
|
93
|
+
"",
|
|
94
|
+
`- type: ${job.type}`,
|
|
95
|
+
`- status: ${job.status}`,
|
|
96
|
+
`- label: ${job.label}`,
|
|
97
|
+
`- start: ${formatJobTime(job.startTime)}`,
|
|
98
|
+
`- duration: ${formatJobDuration(job.startTime)}`,
|
|
99
|
+
];
|
|
100
|
+
|
|
101
|
+
if (job.status === "completed" && job.resultText) {
|
|
102
|
+
sections.push("", "## Result", "", "```", job.resultText, "```");
|
|
103
|
+
}
|
|
104
|
+
if (job.status === "failed" && job.errorText) {
|
|
105
|
+
sections.push("", "## Error", "", "```", job.errorText, "```");
|
|
106
|
+
}
|
|
107
|
+
if (job.status === "cancelled" && job.errorText) {
|
|
108
|
+
sections.push("", "## Cancellation", "", "```", job.errorText, "```");
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const content = sections.join("\n");
|
|
112
|
+
return {
|
|
113
|
+
url: url.href,
|
|
114
|
+
content,
|
|
115
|
+
contentType: "text/markdown",
|
|
116
|
+
size: Buffer.byteLength(content, "utf-8"),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON query parser and executor for agent:// URL extraction.
|
|
3
|
+
*
|
|
4
|
+
* Supports jq-like syntax: .foo, [0], .foo.bar[0].baz, ["special-key"]
|
|
5
|
+
* Also supports path form: /foo/bar/0 -> .foo.bar[0]
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Parse a jq-like query string into tokens.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* parseQuery(".foo.bar[0]") // ["foo", "bar", 0]
|
|
13
|
+
* parseQuery(".foo['special-key']") // ["foo", "special-key"]
|
|
14
|
+
*/
|
|
15
|
+
export function parseQuery(query: string): Array<string | number> {
|
|
16
|
+
let input = query.trim();
|
|
17
|
+
if (!input) return [];
|
|
18
|
+
if (input.startsWith(".")) input = input.slice(1);
|
|
19
|
+
if (!input) return [];
|
|
20
|
+
|
|
21
|
+
const tokens: Array<string | number> = [];
|
|
22
|
+
let i = 0;
|
|
23
|
+
|
|
24
|
+
const isIdentChar = (ch: string) => /[A-Za-z0-9_-]/.test(ch);
|
|
25
|
+
|
|
26
|
+
while (i < input.length) {
|
|
27
|
+
const ch = input[i];
|
|
28
|
+
if (ch === ".") {
|
|
29
|
+
i++;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (ch === "[") {
|
|
33
|
+
const closeIndex = input.indexOf("]", i + 1);
|
|
34
|
+
if (closeIndex === -1) {
|
|
35
|
+
throw new Error(`Invalid query: missing ] in ${query}`);
|
|
36
|
+
}
|
|
37
|
+
const raw = input.slice(i + 1, closeIndex).trim();
|
|
38
|
+
if (!raw) {
|
|
39
|
+
throw new Error(`Invalid query: empty [] in ${query}`);
|
|
40
|
+
}
|
|
41
|
+
const quote = raw[0];
|
|
42
|
+
if ((quote === '"' || quote === "'") && raw.endsWith(quote)) {
|
|
43
|
+
let inner = raw.slice(1, -1);
|
|
44
|
+
inner = inner.replace(/\\(["'\\])/g, "$1");
|
|
45
|
+
tokens.push(inner);
|
|
46
|
+
} else if (/^\d+$/.test(raw)) {
|
|
47
|
+
tokens.push(Number(raw));
|
|
48
|
+
} else {
|
|
49
|
+
tokens.push(raw);
|
|
50
|
+
}
|
|
51
|
+
i = closeIndex + 1;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const start = i;
|
|
56
|
+
while (i < input.length && isIdentChar(input[i])) {
|
|
57
|
+
i++;
|
|
58
|
+
}
|
|
59
|
+
if (start === i) {
|
|
60
|
+
throw new Error(`Invalid query: unexpected token '${input[i]}' in ${query}`);
|
|
61
|
+
}
|
|
62
|
+
const ident = input.slice(start, i);
|
|
63
|
+
tokens.push(ident);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return tokens;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Apply a parsed query to a JSON value.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* applyQuery({ foo: { bar: [1, 2, 3] } }, ".foo.bar[0]") // 1
|
|
74
|
+
*/
|
|
75
|
+
export function applyQuery(data: unknown, query: string): unknown {
|
|
76
|
+
const tokens = parseQuery(query);
|
|
77
|
+
let current: unknown = data;
|
|
78
|
+
for (const token of tokens) {
|
|
79
|
+
if (current === null || current === undefined) return undefined;
|
|
80
|
+
if (typeof token === "number") {
|
|
81
|
+
if (!Array.isArray(current)) return undefined;
|
|
82
|
+
current = current[token];
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (typeof current !== "object") return undefined;
|
|
86
|
+
const record = current as Record<string, unknown>;
|
|
87
|
+
current = record[token];
|
|
88
|
+
}
|
|
89
|
+
return current;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Convert a URL path form to a query string.
|
|
94
|
+
*
|
|
95
|
+
* Path form: /foo/bar/0 -> .foo.bar[0]
|
|
96
|
+
* Trailing slash is normalized (ignored).
|
|
97
|
+
*
|
|
98
|
+
* Segments that are not valid identifiers use bracket notation: ['segment']
|
|
99
|
+
*/
|
|
100
|
+
export function pathToQuery(urlPath: string): string {
|
|
101
|
+
if (!urlPath || urlPath === "/") return "";
|
|
102
|
+
|
|
103
|
+
const segments = urlPath.split("/").filter(Boolean);
|
|
104
|
+
if (segments.length === 0) return "";
|
|
105
|
+
|
|
106
|
+
const parts: string[] = [];
|
|
107
|
+
for (const segment of segments) {
|
|
108
|
+
let decoded = segment;
|
|
109
|
+
try {
|
|
110
|
+
decoded = decodeURIComponent(segment);
|
|
111
|
+
} catch {
|
|
112
|
+
decoded = segment;
|
|
113
|
+
}
|
|
114
|
+
const isIdentifier = /^[A-Za-z0-9_-]+$/.test(decoded);
|
|
115
|
+
if (/^\d+$/.test(decoded)) {
|
|
116
|
+
parts.push(`[${decoded}]`);
|
|
117
|
+
} else if (isIdentifier) {
|
|
118
|
+
parts.push(`.${decoded}`);
|
|
119
|
+
} else {
|
|
120
|
+
const escaped = decoded.replace(/\\/g, String.raw`\\`).replace(/'/g, String.raw`\'`);
|
|
121
|
+
parts.push(`['${escaped}']`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return parts.join("");
|
|
126
|
+
}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as os from "node:os";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { isEnoent } from "@f5xc-salesdemos/pi-utils";
|
|
5
|
+
import { parseInternalUrl } from "./parse";
|
|
6
|
+
import { validateRelativePath } from "./skill-protocol";
|
|
7
|
+
import type { InternalResource, InternalUrl, ProtocolHandler } from "./types";
|
|
8
|
+
|
|
9
|
+
export interface LocalProtocolOptions {
|
|
10
|
+
getArtifactsDir?: () => string | null;
|
|
11
|
+
getSessionId?: () => string | null;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function parseLocalUrl(input: string): InternalUrl {
|
|
15
|
+
return parseInternalUrl(input);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function ensureWithinRoot(targetPath: string, rootPath: string): void {
|
|
19
|
+
if (targetPath !== rootPath && !targetPath.startsWith(`${rootPath}${path.sep}`)) {
|
|
20
|
+
throw new Error("local:// URL escapes local root");
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function toLocalValidationError(error: unknown): Error {
|
|
25
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
26
|
+
return new Error(message.replace("skill://", "local://"));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function getContentType(filePath: string): InternalResource["contentType"] {
|
|
30
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
31
|
+
if (ext === ".md") return "text/markdown";
|
|
32
|
+
if (ext === ".json") return "application/json";
|
|
33
|
+
return "text/plain";
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function listFilesRecursively(rootPath: string): Promise<string[]> {
|
|
37
|
+
const pending = [""];
|
|
38
|
+
const files: string[] = [];
|
|
39
|
+
|
|
40
|
+
while (pending.length > 0) {
|
|
41
|
+
const relativeDir = pending.pop();
|
|
42
|
+
if (relativeDir === undefined) continue;
|
|
43
|
+
const absoluteDir = path.join(rootPath, relativeDir);
|
|
44
|
+
const entries = await fs.readdir(absoluteDir, { withFileTypes: true });
|
|
45
|
+
|
|
46
|
+
for (const entry of entries) {
|
|
47
|
+
const entryPath = path.join(relativeDir, entry.name);
|
|
48
|
+
if (entry.isDirectory()) {
|
|
49
|
+
pending.push(entryPath);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (entry.isFile()) {
|
|
53
|
+
files.push(entryPath.replaceAll(path.sep, "/"));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return files.sort((a, b) => a.localeCompare(b));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function buildListing(url: InternalUrl, localRoot: string): Promise<InternalResource> {
|
|
62
|
+
const files = await listFilesRecursively(localRoot);
|
|
63
|
+
const listing = files.length === 0 ? "(empty)" : files.map(file => `- [${file}](local://${file})`).join("\n");
|
|
64
|
+
const content =
|
|
65
|
+
`# Local\n\n` +
|
|
66
|
+
`Session-scoped scratch space for large intermediate data, subagent handoffs, and reusable planning artifacts.\n\n` +
|
|
67
|
+
`Root: ${localRoot}\n\n` +
|
|
68
|
+
`${files.length} file${files.length === 1 ? "" : "s"} available:\n\n` +
|
|
69
|
+
`${listing}\n`;
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
url: url.href,
|
|
73
|
+
content,
|
|
74
|
+
contentType: "text/markdown",
|
|
75
|
+
size: Buffer.byteLength(content, "utf-8"),
|
|
76
|
+
sourcePath: localRoot,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function extractRelativePath(url: InternalUrl): string {
|
|
81
|
+
const host = url.rawHost || url.hostname;
|
|
82
|
+
const pathname = url.rawPathname ?? url.pathname;
|
|
83
|
+
|
|
84
|
+
const combined = host
|
|
85
|
+
? pathname && pathname !== "/"
|
|
86
|
+
? `${host}${pathname}`
|
|
87
|
+
: host
|
|
88
|
+
: pathname && pathname !== "/"
|
|
89
|
+
? pathname.slice(1)
|
|
90
|
+
: "";
|
|
91
|
+
|
|
92
|
+
if (!combined) {
|
|
93
|
+
return "";
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
let decoded: string;
|
|
97
|
+
try {
|
|
98
|
+
decoded = decodeURIComponent(combined.replaceAll("\\", "/"));
|
|
99
|
+
} catch {
|
|
100
|
+
throw new Error(`Invalid URL encoding in local:// path: ${url.href}`);
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
validateRelativePath(decoded);
|
|
104
|
+
} catch (error) {
|
|
105
|
+
throw toLocalValidationError(error);
|
|
106
|
+
}
|
|
107
|
+
return decoded;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function resolveLocalRoot(options: LocalProtocolOptions): string {
|
|
111
|
+
const artifactsDir = options.getArtifactsDir?.();
|
|
112
|
+
if (artifactsDir) {
|
|
113
|
+
return path.resolve(artifactsDir, "local");
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const sessionId = options.getSessionId?.() ?? "session";
|
|
117
|
+
const safeSessionId = sessionId.replace(/[^a-zA-Z0-9_.-]/g, "_");
|
|
118
|
+
return path.join(os.tmpdir(), "xcsh-local", safeSessionId);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export function resolveLocalUrlToPath(input: string | InternalUrl, options: LocalProtocolOptions): string {
|
|
122
|
+
const url = typeof input === "string" ? parseLocalUrl(input) : input;
|
|
123
|
+
const localRoot = path.resolve(resolveLocalRoot(options));
|
|
124
|
+
const relativePath = extractRelativePath(url);
|
|
125
|
+
|
|
126
|
+
if (!relativePath) {
|
|
127
|
+
return localRoot;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const resolved = path.resolve(localRoot, relativePath);
|
|
131
|
+
ensureWithinRoot(resolved, localRoot);
|
|
132
|
+
return resolved;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Protocol handler for local:// URLs.
|
|
137
|
+
*
|
|
138
|
+
* URL forms:
|
|
139
|
+
* - local:// - Lists all session local files
|
|
140
|
+
* - local://<path> - Reads a file under session local root
|
|
141
|
+
*/
|
|
142
|
+
export class LocalProtocolHandler implements ProtocolHandler {
|
|
143
|
+
readonly scheme = "local";
|
|
144
|
+
|
|
145
|
+
constructor(private readonly options: LocalProtocolOptions) {}
|
|
146
|
+
|
|
147
|
+
async resolve(url: InternalUrl): Promise<InternalResource> {
|
|
148
|
+
const localRoot = path.resolve(resolveLocalRoot(this.options));
|
|
149
|
+
await fs.mkdir(localRoot, { recursive: true });
|
|
150
|
+
|
|
151
|
+
let resolvedRoot: string;
|
|
152
|
+
try {
|
|
153
|
+
resolvedRoot = await fs.realpath(localRoot);
|
|
154
|
+
} catch (error) {
|
|
155
|
+
if (isEnoent(error)) {
|
|
156
|
+
throw new Error("Unable to initialize local:// root");
|
|
157
|
+
}
|
|
158
|
+
throw error;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const relativePath = extractRelativePath(url);
|
|
162
|
+
const targetPath = relativePath ? path.resolve(resolvedRoot, relativePath) : resolvedRoot;
|
|
163
|
+
ensureWithinRoot(targetPath, resolvedRoot);
|
|
164
|
+
|
|
165
|
+
if (targetPath === resolvedRoot) {
|
|
166
|
+
return buildListing(url, resolvedRoot);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const parentDir = path.dirname(targetPath);
|
|
170
|
+
try {
|
|
171
|
+
const realParent = await fs.realpath(parentDir);
|
|
172
|
+
ensureWithinRoot(realParent, resolvedRoot);
|
|
173
|
+
} catch (error) {
|
|
174
|
+
if (!isEnoent(error)) {
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
let realTargetPath: string;
|
|
180
|
+
try {
|
|
181
|
+
realTargetPath = await fs.realpath(targetPath);
|
|
182
|
+
} catch (error) {
|
|
183
|
+
if (isEnoent(error)) {
|
|
184
|
+
throw new Error(`Local file not found: ${url.href}`);
|
|
185
|
+
}
|
|
186
|
+
throw error;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
ensureWithinRoot(realTargetPath, resolvedRoot);
|
|
190
|
+
|
|
191
|
+
const stat = await fs.stat(realTargetPath);
|
|
192
|
+
if (!stat.isFile()) {
|
|
193
|
+
throw new Error(`local:// URL must resolve to a file: ${url.href}`);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const content = await Bun.file(realTargetPath).text();
|
|
197
|
+
return {
|
|
198
|
+
url: url.href,
|
|
199
|
+
content,
|
|
200
|
+
contentType: getContentType(realTargetPath),
|
|
201
|
+
size: Buffer.byteLength(content, "utf-8"),
|
|
202
|
+
sourcePath: realTargetPath,
|
|
203
|
+
notes: ["Use write path local://<file> to persist large intermediate artifacts across turns."],
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
}
|