@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,580 @@
|
|
|
1
|
+
import type { Dirent } from "node:fs";
|
|
2
|
+
import * as fs from "node:fs/promises";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import { projfsOverlayStart, projfsOverlayStop } from "@f5xc-salesdemos/pi-natives";
|
|
6
|
+
import { $which, getWorktreeDir, isEnoent, logger, Snowflake } from "@f5xc-salesdemos/pi-utils";
|
|
7
|
+
import { $ } from "bun";
|
|
8
|
+
import * as git from "../utils/git";
|
|
9
|
+
|
|
10
|
+
/** Baseline state for a single git repository. */
|
|
11
|
+
export interface RepoBaseline {
|
|
12
|
+
repoRoot: string;
|
|
13
|
+
headCommit: string;
|
|
14
|
+
staged: string;
|
|
15
|
+
unstaged: string;
|
|
16
|
+
untracked: string[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Baseline state for the project, including any nested git repos. */
|
|
20
|
+
export interface WorktreeBaseline {
|
|
21
|
+
root: RepoBaseline;
|
|
22
|
+
/** Nested git repos (path relative to root.repoRoot). */
|
|
23
|
+
nested: Array<{ relativePath: string; baseline: RepoBaseline }>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function getEncodedProjectName(cwd: string): string {
|
|
27
|
+
return `--${cwd.replace(/^[/\\]/, "").replace(/[/\\:]/g, "-")}--`;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export async function getRepoRoot(cwd: string): Promise<string> {
|
|
31
|
+
const repoRoot = await git.repo.root(cwd);
|
|
32
|
+
if (!repoRoot) {
|
|
33
|
+
throw new Error("Git repository not found for isolated task execution.");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return repoRoot;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const PROJFS_UNAVAILABLE_PREFIX = "PROJFS_UNAVAILABLE:";
|
|
40
|
+
const GIT_NO_INDEX_NULL_PATH = process.platform === "win32" ? "NUL" : "/dev/null";
|
|
41
|
+
|
|
42
|
+
export function isProjfsUnavailableError(err: unknown): boolean {
|
|
43
|
+
return err instanceof Error && err.message.includes(PROJFS_UNAVAILABLE_PREFIX);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function getGitNoIndexNullPath(): string {
|
|
47
|
+
return GIT_NO_INDEX_NULL_PATH;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export async function ensureWorktree(baseCwd: string, id: string): Promise<string> {
|
|
51
|
+
const repoRoot = await getRepoRoot(baseCwd);
|
|
52
|
+
const encodedProject = getEncodedProjectName(repoRoot);
|
|
53
|
+
const worktreeDir = getWorktreeDir(encodedProject, id);
|
|
54
|
+
await fs.mkdir(path.dirname(worktreeDir), { recursive: true });
|
|
55
|
+
await git.worktree.tryRemove(repoRoot, worktreeDir);
|
|
56
|
+
await fs.rm(worktreeDir, { recursive: true, force: true });
|
|
57
|
+
await git.worktree.add(repoRoot, worktreeDir, "HEAD", { detach: true });
|
|
58
|
+
return worktreeDir;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Find nested git repositories (non-submodule) under the given root. */
|
|
62
|
+
async function discoverNestedRepos(repoRoot: string): Promise<string[]> {
|
|
63
|
+
// Get submodule paths so we can exclude them
|
|
64
|
+
const submodulePaths = new Set(await git.ls.submodules(repoRoot));
|
|
65
|
+
|
|
66
|
+
// Find all .git dirs/files that aren't the root or known submodules
|
|
67
|
+
const result: string[] = [];
|
|
68
|
+
async function walk(dir: string): Promise<void> {
|
|
69
|
+
let entries: Dirent[];
|
|
70
|
+
try {
|
|
71
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
72
|
+
} catch {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
for (const entry of entries) {
|
|
76
|
+
if (entry.name === "node_modules" || entry.name === ".git") continue;
|
|
77
|
+
if (!entry.isDirectory()) continue;
|
|
78
|
+
const full = path.join(dir, entry.name);
|
|
79
|
+
const rel = path.relative(repoRoot, full);
|
|
80
|
+
// Check if this directory is itself a git repo
|
|
81
|
+
const gitDir = path.join(full, ".git");
|
|
82
|
+
let hasGit = false;
|
|
83
|
+
try {
|
|
84
|
+
await fs.access(gitDir);
|
|
85
|
+
hasGit = true;
|
|
86
|
+
} catch {}
|
|
87
|
+
if (hasGit && !submodulePaths.has(rel)) {
|
|
88
|
+
result.push(rel);
|
|
89
|
+
// Don't recurse into nested repos — they manage their own tree
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
await walk(full);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
await walk(repoRoot);
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async function captureRepoBaseline(repoRoot: string): Promise<RepoBaseline> {
|
|
100
|
+
const headCommit = (await git.head.sha(repoRoot)) ?? "";
|
|
101
|
+
const staged = await git.diff(repoRoot, { binary: true, cached: true });
|
|
102
|
+
const unstaged = await git.diff(repoRoot, { binary: true });
|
|
103
|
+
const untracked = await git.ls.untracked(repoRoot);
|
|
104
|
+
return { repoRoot, headCommit, staged, unstaged, untracked };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export async function captureBaseline(repoRoot: string): Promise<WorktreeBaseline> {
|
|
108
|
+
const [root, nestedPaths] = await Promise.all([captureRepoBaseline(repoRoot), discoverNestedRepos(repoRoot)]);
|
|
109
|
+
const nested = await Promise.all(
|
|
110
|
+
nestedPaths.map(async relativePath => ({
|
|
111
|
+
relativePath,
|
|
112
|
+
baseline: await captureRepoBaseline(path.join(repoRoot, relativePath)),
|
|
113
|
+
})),
|
|
114
|
+
);
|
|
115
|
+
return { root, nested };
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async function applyRepoBaseline(worktreeDir: string, rb: RepoBaseline, sourceRoot: string): Promise<void> {
|
|
119
|
+
await git.patch.applyText(worktreeDir, rb.staged, { cached: true });
|
|
120
|
+
await git.patch.applyText(worktreeDir, rb.staged);
|
|
121
|
+
await git.patch.applyText(worktreeDir, rb.unstaged);
|
|
122
|
+
|
|
123
|
+
for (const entry of rb.untracked) {
|
|
124
|
+
const source = path.join(sourceRoot, entry);
|
|
125
|
+
const destination = path.join(worktreeDir, entry);
|
|
126
|
+
try {
|
|
127
|
+
await fs.mkdir(path.dirname(destination), { recursive: true });
|
|
128
|
+
await fs.cp(source, destination, { recursive: true });
|
|
129
|
+
} catch (err) {
|
|
130
|
+
if (isEnoent(err)) continue;
|
|
131
|
+
throw err;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export async function applyBaseline(worktreeDir: string, baseline: WorktreeBaseline): Promise<void> {
|
|
137
|
+
await applyRepoBaseline(worktreeDir, baseline.root, baseline.root.repoRoot);
|
|
138
|
+
|
|
139
|
+
// Restore nested repos into the worktree
|
|
140
|
+
for (const entry of baseline.nested) {
|
|
141
|
+
const nestedDir = path.join(worktreeDir, entry.relativePath);
|
|
142
|
+
// Copy the nested repo wholesale (it's not managed by root git)
|
|
143
|
+
const sourceDir = path.join(baseline.root.repoRoot, entry.relativePath);
|
|
144
|
+
try {
|
|
145
|
+
await fs.cp(sourceDir, nestedDir, { recursive: true });
|
|
146
|
+
} catch (err) {
|
|
147
|
+
if (isEnoent(err)) continue;
|
|
148
|
+
throw err;
|
|
149
|
+
}
|
|
150
|
+
// Apply any uncommitted changes from the nested baseline
|
|
151
|
+
await applyRepoBaseline(nestedDir, entry.baseline, entry.baseline.repoRoot);
|
|
152
|
+
// Commit baseline state so captureRepoDeltaPatch can cleanly subtract it.
|
|
153
|
+
// Without this, `git add -A && git commit` by the task would include
|
|
154
|
+
// baseline untracked files in the diff-tree output.
|
|
155
|
+
if ((await git.status(nestedDir)).trim().length > 0) {
|
|
156
|
+
await git.stage.files(nestedDir);
|
|
157
|
+
await git.commit(nestedDir, "xcsh-baseline", { allowEmpty: true });
|
|
158
|
+
// Update baseline to reflect the committed state — prevents double-apply
|
|
159
|
+
// in captureRepoDeltaPatch's temp-index path
|
|
160
|
+
entry.baseline.headCommit = (await git.head.sha(nestedDir)) ?? "";
|
|
161
|
+
entry.baseline.staged = "";
|
|
162
|
+
entry.baseline.unstaged = "";
|
|
163
|
+
entry.baseline.untracked = [];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
async function captureRepoDeltaPatch(repoDir: string, rb: RepoBaseline): Promise<string> {
|
|
169
|
+
// Check if HEAD advanced (task committed changes)
|
|
170
|
+
const currentHead = (await git.head.sha(repoDir)) ?? "";
|
|
171
|
+
const headAdvanced = currentHead && currentHead !== rb.headCommit;
|
|
172
|
+
|
|
173
|
+
if (headAdvanced) {
|
|
174
|
+
// HEAD moved: use diff-tree to capture committed changes, plus any uncommitted on top
|
|
175
|
+
const parts: string[] = [];
|
|
176
|
+
|
|
177
|
+
// Committed changes since baseline
|
|
178
|
+
const committedDiff = await git.diff.tree(repoDir, rb.headCommit, currentHead, {
|
|
179
|
+
allowFailure: true,
|
|
180
|
+
binary: true,
|
|
181
|
+
});
|
|
182
|
+
if (committedDiff.trim()) parts.push(committedDiff);
|
|
183
|
+
|
|
184
|
+
// Uncommitted changes on top of the new HEAD
|
|
185
|
+
const staged = await git.diff(repoDir, { binary: true, cached: true });
|
|
186
|
+
const unstaged = await git.diff(repoDir, { binary: true });
|
|
187
|
+
if (staged.trim()) parts.push(staged);
|
|
188
|
+
if (unstaged.trim()) parts.push(unstaged);
|
|
189
|
+
|
|
190
|
+
// New untracked files (relative to both baseline and current tracking)
|
|
191
|
+
const currentUntracked = await git.ls.untracked(repoDir);
|
|
192
|
+
const baselineUntracked = new Set(rb.untracked);
|
|
193
|
+
const newUntracked = currentUntracked.filter(entry => !baselineUntracked.has(entry));
|
|
194
|
+
if (newUntracked.length > 0) {
|
|
195
|
+
const nullPath = getGitNoIndexNullPath();
|
|
196
|
+
const untrackedDiffs = await Promise.all(
|
|
197
|
+
newUntracked.map(entry =>
|
|
198
|
+
git.diff(repoDir, {
|
|
199
|
+
allowFailure: true,
|
|
200
|
+
binary: true,
|
|
201
|
+
noIndex: { left: nullPath, right: entry },
|
|
202
|
+
}),
|
|
203
|
+
),
|
|
204
|
+
);
|
|
205
|
+
parts.push(...untrackedDiffs.filter(d => d.trim()));
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return parts.join("\n");
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// HEAD unchanged: use temp index approach (subtracts baseline from delta)
|
|
212
|
+
const tempIndex = path.join(os.tmpdir(), `xcsh-task-index-${Snowflake.next()}`);
|
|
213
|
+
try {
|
|
214
|
+
await git.readTree(repoDir, rb.headCommit, {
|
|
215
|
+
env: { GIT_INDEX_FILE: tempIndex },
|
|
216
|
+
});
|
|
217
|
+
await git.patch.applyText(repoDir, rb.staged, {
|
|
218
|
+
cached: true,
|
|
219
|
+
env: { GIT_INDEX_FILE: tempIndex },
|
|
220
|
+
});
|
|
221
|
+
await git.patch.applyText(repoDir, rb.unstaged, {
|
|
222
|
+
cached: true,
|
|
223
|
+
env: { GIT_INDEX_FILE: tempIndex },
|
|
224
|
+
});
|
|
225
|
+
const diff = await git.diff(repoDir, {
|
|
226
|
+
binary: true,
|
|
227
|
+
env: { GIT_INDEX_FILE: tempIndex },
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
const currentUntracked = await git.ls.untracked(repoDir);
|
|
231
|
+
const baselineUntracked = new Set(rb.untracked);
|
|
232
|
+
const newUntracked = currentUntracked.filter(entry => !baselineUntracked.has(entry));
|
|
233
|
+
|
|
234
|
+
if (newUntracked.length === 0) return diff;
|
|
235
|
+
|
|
236
|
+
const nullPath = getGitNoIndexNullPath();
|
|
237
|
+
const untrackedDiffs = await Promise.all(
|
|
238
|
+
newUntracked.map(entry =>
|
|
239
|
+
git.diff(repoDir, {
|
|
240
|
+
allowFailure: true,
|
|
241
|
+
binary: true,
|
|
242
|
+
noIndex: { left: nullPath, right: entry },
|
|
243
|
+
}),
|
|
244
|
+
),
|
|
245
|
+
);
|
|
246
|
+
return `${diff}${diff && !diff.endsWith("\n") ? "\n" : ""}${untrackedDiffs.join("\n")}`;
|
|
247
|
+
} finally {
|
|
248
|
+
await fs.rm(tempIndex, { force: true });
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export interface NestedRepoPatch {
|
|
253
|
+
relativePath: string;
|
|
254
|
+
patch: string;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export interface DeltaPatchResult {
|
|
258
|
+
rootPatch: string;
|
|
259
|
+
nestedPatches: NestedRepoPatch[];
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export async function captureDeltaPatch(isolationDir: string, baseline: WorktreeBaseline): Promise<DeltaPatchResult> {
|
|
263
|
+
const rootPatch = await captureRepoDeltaPatch(isolationDir, baseline.root);
|
|
264
|
+
const nestedPatches: NestedRepoPatch[] = [];
|
|
265
|
+
|
|
266
|
+
for (const { relativePath, baseline: nb } of baseline.nested) {
|
|
267
|
+
const nestedDir = path.join(isolationDir, relativePath);
|
|
268
|
+
try {
|
|
269
|
+
await fs.access(path.join(nestedDir, ".git"));
|
|
270
|
+
} catch {
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
const patch = await captureRepoDeltaPatch(nestedDir, nb);
|
|
274
|
+
if (patch.trim()) nestedPatches.push({ relativePath, patch });
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
return { rootPatch, nestedPatches };
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Apply nested repo patches directly to their working directories after parent merge.
|
|
282
|
+
* @param commitMessage Optional async function to generate a commit message from the combined diff.
|
|
283
|
+
* If omitted or returns null, falls back to a generic message.
|
|
284
|
+
*/
|
|
285
|
+
export async function applyNestedPatches(
|
|
286
|
+
repoRoot: string,
|
|
287
|
+
patches: NestedRepoPatch[],
|
|
288
|
+
commitMessage?: (diff: string) => Promise<string | null>,
|
|
289
|
+
): Promise<void> {
|
|
290
|
+
// Group patches by target repo to apply all at once and commit
|
|
291
|
+
const byRepo = new Map<string, NestedRepoPatch[]>();
|
|
292
|
+
for (const p of patches) {
|
|
293
|
+
if (!p.patch.trim()) continue;
|
|
294
|
+
const group = byRepo.get(p.relativePath) ?? [];
|
|
295
|
+
group.push(p);
|
|
296
|
+
byRepo.set(p.relativePath, group);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
for (const [relativePath, repoPatches] of byRepo) {
|
|
300
|
+
const nestedDir = path.join(repoRoot, relativePath);
|
|
301
|
+
try {
|
|
302
|
+
await fs.access(path.join(nestedDir, ".git"));
|
|
303
|
+
} catch {
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
const combinedDiff = repoPatches.map(p => p.patch).join("\n");
|
|
308
|
+
for (const { patch } of repoPatches) {
|
|
309
|
+
await git.patch.applyText(nestedDir, patch);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Commit so nested repo history reflects the task changes
|
|
313
|
+
if ((await git.status(nestedDir)).trim().length > 0) {
|
|
314
|
+
const msg = (await commitMessage?.(combinedDiff)) ?? "changes from isolated task(s)";
|
|
315
|
+
await git.stage.files(nestedDir);
|
|
316
|
+
await git.commit(nestedDir, msg);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
export async function cleanupWorktree(dir: string): Promise<void> {
|
|
322
|
+
try {
|
|
323
|
+
const repository = await git.repo.resolve(dir);
|
|
324
|
+
const commonDir = repository?.commonDir ?? "";
|
|
325
|
+
if (commonDir && path.basename(commonDir) === ".git") {
|
|
326
|
+
const repoRoot = path.dirname(commonDir);
|
|
327
|
+
await git.worktree.tryRemove(repoRoot, dir);
|
|
328
|
+
}
|
|
329
|
+
} finally {
|
|
330
|
+
await fs.rm(dir, { recursive: true, force: true });
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
335
|
+
// Fuse-overlay isolation (Unix)
|
|
336
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
337
|
+
|
|
338
|
+
export async function ensureFuseOverlay(baseCwd: string, id: string): Promise<string> {
|
|
339
|
+
if (process.platform === "win32") {
|
|
340
|
+
throw new Error('fuse-overlay isolation is unsupported on Windows. Use task.isolation.mode = "fuse-projfs".');
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
const repoRoot = await getRepoRoot(baseCwd);
|
|
344
|
+
const encodedProject = getEncodedProjectName(repoRoot);
|
|
345
|
+
const baseDir = getWorktreeDir(encodedProject, id);
|
|
346
|
+
const upperDir = path.join(baseDir, "upper");
|
|
347
|
+
const workDir = path.join(baseDir, "work");
|
|
348
|
+
const mergedDir = path.join(baseDir, "merged");
|
|
349
|
+
|
|
350
|
+
// Clean up any stale mount at this path (linux only)
|
|
351
|
+
const fusermount = $which("fusermount3") ?? $which("fusermount");
|
|
352
|
+
if (fusermount) {
|
|
353
|
+
await $`${fusermount} -u ${mergedDir}`.quiet().nothrow();
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
await fs.rm(baseDir, { recursive: true, force: true });
|
|
357
|
+
await fs.mkdir(upperDir, { recursive: true });
|
|
358
|
+
await fs.mkdir(workDir, { recursive: true });
|
|
359
|
+
await fs.mkdir(mergedDir, { recursive: true });
|
|
360
|
+
|
|
361
|
+
const binary = $which("fuse-overlayfs");
|
|
362
|
+
if (!binary) {
|
|
363
|
+
await fs.rm(baseDir, { recursive: true, force: true });
|
|
364
|
+
throw new Error(
|
|
365
|
+
"fuse-overlayfs not found. Install it (e.g. `apt install fuse-overlayfs` or `pacman -S fuse-overlayfs`) to use fuse-overlay isolation.",
|
|
366
|
+
);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
const result = await $`${binary} -o lowerdir=${repoRoot},upperdir=${upperDir},workdir=${workDir} ${mergedDir}`
|
|
370
|
+
.quiet()
|
|
371
|
+
.nothrow();
|
|
372
|
+
if (result.exitCode !== 0) {
|
|
373
|
+
const stderr = result.stderr.toString().trim();
|
|
374
|
+
await fs.rm(baseDir, { recursive: true, force: true });
|
|
375
|
+
throw new Error(`fuse-overlayfs mount failed (exit ${result.exitCode}): ${stderr}`);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
return mergedDir;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
export async function cleanupFuseOverlay(mergedDir: string): Promise<void> {
|
|
382
|
+
try {
|
|
383
|
+
const fusermount = $which("fusermount3") ?? $which("fusermount");
|
|
384
|
+
if (fusermount) {
|
|
385
|
+
await $`${fusermount} -u ${mergedDir}`.quiet().nothrow();
|
|
386
|
+
}
|
|
387
|
+
} finally {
|
|
388
|
+
// baseDir is the parent of the merged directory
|
|
389
|
+
const baseDir = path.dirname(mergedDir);
|
|
390
|
+
await fs.rm(baseDir, { recursive: true, force: true });
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
395
|
+
// ProjFS isolation (Windows)
|
|
396
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
397
|
+
|
|
398
|
+
export async function ensureProjfsOverlay(baseCwd: string, id: string): Promise<string> {
|
|
399
|
+
if (process.platform !== "win32") {
|
|
400
|
+
throw new Error("fuse-projfs isolation is only available on Windows.");
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
const repoRoot = await getRepoRoot(baseCwd);
|
|
404
|
+
const encodedProject = getEncodedProjectName(repoRoot);
|
|
405
|
+
const baseDir = getWorktreeDir(encodedProject, id);
|
|
406
|
+
const mergedDir = path.join(baseDir, "merged");
|
|
407
|
+
|
|
408
|
+
await fs.rm(baseDir, { recursive: true, force: true });
|
|
409
|
+
await fs.mkdir(mergedDir, { recursive: true });
|
|
410
|
+
try {
|
|
411
|
+
projfsOverlayStart(repoRoot, mergedDir);
|
|
412
|
+
return mergedDir;
|
|
413
|
+
} catch (err) {
|
|
414
|
+
await fs.rm(baseDir, { recursive: true, force: true });
|
|
415
|
+
throw err;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
export async function cleanupProjfsOverlay(mergedDir: string): Promise<void> {
|
|
420
|
+
try {
|
|
421
|
+
if (process.platform === "win32") {
|
|
422
|
+
try {
|
|
423
|
+
projfsOverlayStop(mergedDir);
|
|
424
|
+
} catch (err) {
|
|
425
|
+
logger.warn("ProjFS overlay stop failed during cleanup", {
|
|
426
|
+
mergedDir,
|
|
427
|
+
error: err instanceof Error ? err.message : String(err),
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
} finally {
|
|
432
|
+
// baseDir is the parent of the merged directory
|
|
433
|
+
const baseDir = path.dirname(mergedDir);
|
|
434
|
+
await fs.rm(baseDir, { recursive: true, force: true });
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
439
|
+
// Branch-mode isolation
|
|
440
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
441
|
+
|
|
442
|
+
export interface CommitToBranchResult {
|
|
443
|
+
branchName?: string;
|
|
444
|
+
nestedPatches: NestedRepoPatch[];
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* Commit task-only changes to a new branch.
|
|
449
|
+
* Only root repo changes go on the branch. Nested repo patches are returned
|
|
450
|
+
* separately since the parent git can't track files inside gitlinks.
|
|
451
|
+
*/
|
|
452
|
+
export async function commitToBranch(
|
|
453
|
+
isolationDir: string,
|
|
454
|
+
baseline: WorktreeBaseline,
|
|
455
|
+
taskId: string,
|
|
456
|
+
description: string | undefined,
|
|
457
|
+
commitMessage?: (diff: string) => Promise<string | null>,
|
|
458
|
+
): Promise<CommitToBranchResult | null> {
|
|
459
|
+
const { rootPatch, nestedPatches } = await captureDeltaPatch(isolationDir, baseline);
|
|
460
|
+
if (!rootPatch.trim() && nestedPatches.length === 0) return null;
|
|
461
|
+
|
|
462
|
+
const repoRoot = baseline.root.repoRoot;
|
|
463
|
+
const branchName = `xcsh/task/${taskId}`;
|
|
464
|
+
const fallbackMessage = description || taskId;
|
|
465
|
+
|
|
466
|
+
// Only create a branch if the root repo has changes
|
|
467
|
+
if (rootPatch.trim()) {
|
|
468
|
+
await git.branch.create(repoRoot, branchName);
|
|
469
|
+
const tmpDir = path.join(os.tmpdir(), `xcsh-branch-${Snowflake.next()}`);
|
|
470
|
+
try {
|
|
471
|
+
await git.worktree.add(repoRoot, tmpDir, branchName);
|
|
472
|
+
try {
|
|
473
|
+
await git.patch.applyText(tmpDir, rootPatch);
|
|
474
|
+
} catch (err) {
|
|
475
|
+
if (err instanceof git.GitCommandError) {
|
|
476
|
+
const stderr = err.result.stderr.slice(0, 2000);
|
|
477
|
+
logger.error("commitToBranch: git apply failed", {
|
|
478
|
+
taskId,
|
|
479
|
+
exitCode: err.result.exitCode,
|
|
480
|
+
stderr,
|
|
481
|
+
patchSize: rootPatch.length,
|
|
482
|
+
patchHead: rootPatch.slice(0, 500),
|
|
483
|
+
});
|
|
484
|
+
throw new Error(`git apply failed for task ${taskId}: ${stderr}`);
|
|
485
|
+
}
|
|
486
|
+
throw err;
|
|
487
|
+
}
|
|
488
|
+
await git.stage.files(tmpDir);
|
|
489
|
+
const msg = (commitMessage && (await commitMessage(rootPatch))) || fallbackMessage;
|
|
490
|
+
await git.commit(tmpDir, msg);
|
|
491
|
+
} finally {
|
|
492
|
+
await git.worktree.tryRemove(repoRoot, tmpDir);
|
|
493
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
return { branchName: rootPatch.trim() ? branchName : undefined, nestedPatches };
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
export interface MergeBranchResult {
|
|
501
|
+
merged: string[];
|
|
502
|
+
failed: string[];
|
|
503
|
+
conflict?: string;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/**
|
|
507
|
+
* Cherry-pick task branch commits sequentially onto HEAD.
|
|
508
|
+
* Each branch has a single commit that gets replayed cleanly.
|
|
509
|
+
* Stops on first conflict and reports which branches succeeded.
|
|
510
|
+
*/
|
|
511
|
+
export async function mergeTaskBranches(
|
|
512
|
+
repoRoot: string,
|
|
513
|
+
branches: Array<{ branchName: string; taskId: string; description?: string }>,
|
|
514
|
+
): Promise<MergeBranchResult> {
|
|
515
|
+
const merged: string[] = [];
|
|
516
|
+
const failed: string[] = [];
|
|
517
|
+
|
|
518
|
+
// Stash dirty working tree so cherry-pick can operate on a clean HEAD.
|
|
519
|
+
// Without this, cherry-pick refuses to run when uncommitted changes exist.
|
|
520
|
+
const didStash = await git.stash.push(repoRoot, "xcsh-task-merge");
|
|
521
|
+
|
|
522
|
+
let conflictResult: MergeBranchResult | undefined;
|
|
523
|
+
|
|
524
|
+
try {
|
|
525
|
+
for (const { branchName } of branches) {
|
|
526
|
+
try {
|
|
527
|
+
await git.cherryPick(repoRoot, branchName);
|
|
528
|
+
} catch (err) {
|
|
529
|
+
try {
|
|
530
|
+
await git.cherryPick.abort(repoRoot);
|
|
531
|
+
} catch {
|
|
532
|
+
/* no state to abort */
|
|
533
|
+
}
|
|
534
|
+
const stderr =
|
|
535
|
+
err instanceof git.GitCommandError
|
|
536
|
+
? err.result.stderr.trim()
|
|
537
|
+
: err instanceof Error
|
|
538
|
+
? err.message
|
|
539
|
+
: String(err);
|
|
540
|
+
failed.push(branchName);
|
|
541
|
+
conflictResult = {
|
|
542
|
+
merged,
|
|
543
|
+
failed: [...failed, ...branches.slice(merged.length + failed.length).map(b => b.branchName)],
|
|
544
|
+
conflict: `${branchName}: ${stderr}`,
|
|
545
|
+
};
|
|
546
|
+
break;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
merged.push(branchName);
|
|
550
|
+
}
|
|
551
|
+
} finally {
|
|
552
|
+
if (didStash) {
|
|
553
|
+
try {
|
|
554
|
+
await git.stash.pop(repoRoot, { index: true });
|
|
555
|
+
} catch {
|
|
556
|
+
// Stash-pop conflicts mean the replayed changes clash with the user's
|
|
557
|
+
// uncommitted edits. Treat this as a merge failure so the caller preserves
|
|
558
|
+
// recovery branches instead of reporting success and deleting them.
|
|
559
|
+
logger.warn("Failed to restore stashed changes after task merge; stash entry preserved");
|
|
560
|
+
if (!conflictResult) {
|
|
561
|
+
conflictResult = {
|
|
562
|
+
merged,
|
|
563
|
+
failed: merged,
|
|
564
|
+
conflict:
|
|
565
|
+
"stash pop: cherry-picked changes conflict with uncommitted edits. Run `git stash pop` and resolve manually.",
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
return conflictResult ?? { merged, failed };
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
/** Clean up temporary task branches. */
|
|
576
|
+
export async function cleanupTaskBranches(repoRoot: string, branches: string[]): Promise<void> {
|
|
577
|
+
for (const branch of branches) {
|
|
578
|
+
await git.branch.tryDelete(repoRoot, branch);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
|
|
3
|
+
import { $env } from "@f5xc-salesdemos/pi-utils";
|
|
4
|
+
|
|
5
|
+
interface OmpCommand {
|
|
6
|
+
cmd: string;
|
|
7
|
+
args: string[];
|
|
8
|
+
shell: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const DEFAULT_CMD = process.platform === "win32" ? "xcsh.cmd" : "xcsh";
|
|
12
|
+
const DEFAULT_SHELL = process.platform === "win32";
|
|
13
|
+
|
|
14
|
+
export function resolveOmpCommand(): OmpCommand {
|
|
15
|
+
const envCmd = $env.PI_SUBPROCESS_CMD;
|
|
16
|
+
if (envCmd?.trim()) {
|
|
17
|
+
return { cmd: envCmd, args: [], shell: DEFAULT_SHELL };
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const entry = process.argv[1];
|
|
21
|
+
if (entry && (entry.endsWith(".ts") || entry.endsWith(".js"))) {
|
|
22
|
+
return { cmd: process.execPath, args: [entry], shell: false };
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return { cmd: DEFAULT_CMD, args: [], shell: DEFAULT_SHELL };
|
|
26
|
+
}
|
package/src/thinking.ts
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { type ResolvedThinkingLevel, ThinkingLevel } from "@f5xc-salesdemos/pi-agent-core";
|
|
2
|
+
import { clampThinkingLevelForModel, type Effort, type Model, THINKING_EFFORTS } from "@f5xc-salesdemos/pi-ai";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Metadata used to render thinking selector values in the coding-agent UI.
|
|
6
|
+
*/
|
|
7
|
+
export interface ThinkingLevelMetadata {
|
|
8
|
+
value: ThinkingLevel;
|
|
9
|
+
label: string;
|
|
10
|
+
description: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const THINKING_LEVEL_METADATA: Record<ThinkingLevel, ThinkingLevelMetadata> = {
|
|
14
|
+
[ThinkingLevel.Inherit]: {
|
|
15
|
+
value: ThinkingLevel.Inherit,
|
|
16
|
+
label: "inherit",
|
|
17
|
+
description: "Inherit session default",
|
|
18
|
+
},
|
|
19
|
+
[ThinkingLevel.Off]: { value: ThinkingLevel.Off, label: "off", description: "No reasoning" },
|
|
20
|
+
[ThinkingLevel.Minimal]: {
|
|
21
|
+
value: ThinkingLevel.Minimal,
|
|
22
|
+
label: "min",
|
|
23
|
+
description: "Very brief reasoning (~1k tokens)",
|
|
24
|
+
},
|
|
25
|
+
[ThinkingLevel.Low]: { value: ThinkingLevel.Low, label: "low", description: "Light reasoning (~2k tokens)" },
|
|
26
|
+
[ThinkingLevel.Medium]: {
|
|
27
|
+
value: ThinkingLevel.Medium,
|
|
28
|
+
label: "medium",
|
|
29
|
+
description: "Moderate reasoning (~8k tokens)",
|
|
30
|
+
},
|
|
31
|
+
[ThinkingLevel.High]: { value: ThinkingLevel.High, label: "high", description: "Deep reasoning (~16k tokens)" },
|
|
32
|
+
[ThinkingLevel.XHigh]: {
|
|
33
|
+
value: ThinkingLevel.XHigh,
|
|
34
|
+
label: "xhigh",
|
|
35
|
+
description: "Maximum reasoning (~32k tokens)",
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const THINKING_LEVELS = new Set<string>([ThinkingLevel.Inherit, ThinkingLevel.Off, ...THINKING_EFFORTS]);
|
|
40
|
+
const EFFORT_LEVELS = new Set<string>(THINKING_EFFORTS);
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Parses a provider-facing effort value.
|
|
44
|
+
*/
|
|
45
|
+
export function parseEffort(value: string | null | undefined): Effort | undefined {
|
|
46
|
+
return value !== undefined && value !== null && EFFORT_LEVELS.has(value) ? (value as Effort) : undefined;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Parses an agent-local thinking selector.
|
|
51
|
+
*/
|
|
52
|
+
export function parseThinkingLevel(value: string | null | undefined): ThinkingLevel | undefined {
|
|
53
|
+
return value !== undefined && value !== null && THINKING_LEVELS.has(value) ? (value as ThinkingLevel) : undefined;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Returns display metadata for a thinking selector.
|
|
58
|
+
*/
|
|
59
|
+
export function getThinkingLevelMetadata(level: ThinkingLevel): ThinkingLevelMetadata {
|
|
60
|
+
return THINKING_LEVEL_METADATA[level];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Converts an agent-local selector into the effort sent to providers.
|
|
65
|
+
*/
|
|
66
|
+
export function toReasoningEffort(level: ThinkingLevel | undefined): Effort | undefined {
|
|
67
|
+
if (level === undefined || level === ThinkingLevel.Off || level === ThinkingLevel.Inherit) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
return level;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Resolves a selector against the current model while preserving explicit "off".
|
|
75
|
+
*/
|
|
76
|
+
export function resolveThinkingLevelForModel(
|
|
77
|
+
model: Model | undefined,
|
|
78
|
+
level: ThinkingLevel | undefined,
|
|
79
|
+
): ResolvedThinkingLevel | undefined {
|
|
80
|
+
if (level === undefined || level === ThinkingLevel.Inherit) {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
if (level === ThinkingLevel.Off) {
|
|
84
|
+
return ThinkingLevel.Off;
|
|
85
|
+
}
|
|
86
|
+
return clampThinkingLevelForModel(model, level);
|
|
87
|
+
}
|