@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,156 @@
|
|
|
1
|
+
import type { MCPManager } from "../mcp/manager";
|
|
2
|
+
import type { MCPResourceReadResult } from "../mcp/types";
|
|
3
|
+
import type { InternalResource, InternalUrl, ProtocolHandler } from "./types";
|
|
4
|
+
|
|
5
|
+
export interface McpProtocolOptions {
|
|
6
|
+
getMcpManager: () => MCPManager | undefined;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function escapeRegex(text: string): string {
|
|
10
|
+
return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function getUriTemplateMatchScore(
|
|
14
|
+
uri: string,
|
|
15
|
+
uriTemplate: string,
|
|
16
|
+
): { literalChars: number; expressionCount: number } | undefined {
|
|
17
|
+
const expressionPattern = /\{[^}]+\}/g;
|
|
18
|
+
const literalSegments = uriTemplate.split(expressionPattern);
|
|
19
|
+
const expressionCount = (uriTemplate.match(expressionPattern) ?? []).length;
|
|
20
|
+
const pattern = literalSegments.map(escapeRegex).join("(.*?)");
|
|
21
|
+
const regex = new RegExp(`^${pattern}$`);
|
|
22
|
+
if (!regex.test(uri)) return undefined;
|
|
23
|
+
const literalChars = literalSegments.reduce((total, segment) => total + segment.length, 0);
|
|
24
|
+
return { literalChars, expressionCount };
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function extractResourceUri(url: InternalUrl): string {
|
|
28
|
+
const host = url.rawHost || url.hostname;
|
|
29
|
+
const rawPathname = url.rawPathname ?? url.pathname;
|
|
30
|
+
const hasPath = rawPathname && rawPathname !== "/";
|
|
31
|
+
const uri = `${host}${hasPath ? rawPathname : ""}${url.search}${url.hash}`.trim();
|
|
32
|
+
if (!uri) {
|
|
33
|
+
throw new Error("mcp:// URL requires a resource URI: mcp://<resource-uri>");
|
|
34
|
+
}
|
|
35
|
+
return uri;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function resolveTargetServer(mcpManager: MCPManager, uri: string): string | undefined {
|
|
39
|
+
const servers = mcpManager.getConnectedServers();
|
|
40
|
+
for (const name of servers) {
|
|
41
|
+
const serverResources = mcpManager.getServerResources(name);
|
|
42
|
+
if (serverResources?.resources.some(r => r.uri === uri)) {
|
|
43
|
+
return name;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
let bestTemplateMatch:
|
|
48
|
+
| {
|
|
49
|
+
serverName: string;
|
|
50
|
+
literalChars: number;
|
|
51
|
+
expressionCount: number;
|
|
52
|
+
serverIndex: number;
|
|
53
|
+
templateIndex: number;
|
|
54
|
+
}
|
|
55
|
+
| undefined;
|
|
56
|
+
|
|
57
|
+
for (const [serverIndex, name] of servers.entries()) {
|
|
58
|
+
const serverResources = mcpManager.getServerResources(name);
|
|
59
|
+
if (!serverResources) continue;
|
|
60
|
+
|
|
61
|
+
for (const [templateIndex, template] of serverResources.templates.entries()) {
|
|
62
|
+
const match = getUriTemplateMatchScore(uri, template.uriTemplate);
|
|
63
|
+
if (!match) continue;
|
|
64
|
+
|
|
65
|
+
const isBetterMatch =
|
|
66
|
+
!bestTemplateMatch ||
|
|
67
|
+
match.literalChars > bestTemplateMatch.literalChars ||
|
|
68
|
+
(match.literalChars === bestTemplateMatch.literalChars &&
|
|
69
|
+
(match.expressionCount < bestTemplateMatch.expressionCount ||
|
|
70
|
+
(match.expressionCount === bestTemplateMatch.expressionCount &&
|
|
71
|
+
(serverIndex < bestTemplateMatch.serverIndex ||
|
|
72
|
+
(serverIndex === bestTemplateMatch.serverIndex &&
|
|
73
|
+
templateIndex < bestTemplateMatch.templateIndex)))));
|
|
74
|
+
|
|
75
|
+
if (isBetterMatch) {
|
|
76
|
+
bestTemplateMatch = {
|
|
77
|
+
serverName: name,
|
|
78
|
+
literalChars: match.literalChars,
|
|
79
|
+
expressionCount: match.expressionCount,
|
|
80
|
+
serverIndex,
|
|
81
|
+
templateIndex,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return bestTemplateMatch?.serverName;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function formatAvailableResources(mcpManager: MCPManager): string {
|
|
91
|
+
const available = mcpManager
|
|
92
|
+
.getConnectedServers()
|
|
93
|
+
.flatMap(name => {
|
|
94
|
+
const serverResources = mcpManager.getServerResources(name);
|
|
95
|
+
return (serverResources?.resources ?? []).map(r => ` ${r.uri} (${name})`);
|
|
96
|
+
})
|
|
97
|
+
.join("\n");
|
|
98
|
+
return available || " (none)";
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Protocol handler for mcp:// URLs.
|
|
103
|
+
*
|
|
104
|
+
* URL form:
|
|
105
|
+
* - mcp://<resource-uri> (e.g. mcp://test://notes, mcp://ibkr://portfolio/positions)
|
|
106
|
+
*/
|
|
107
|
+
export class McpProtocolHandler implements ProtocolHandler {
|
|
108
|
+
readonly scheme = "mcp";
|
|
109
|
+
|
|
110
|
+
constructor(private readonly options: McpProtocolOptions) {}
|
|
111
|
+
|
|
112
|
+
async resolve(url: InternalUrl): Promise<InternalResource> {
|
|
113
|
+
const mcpManager = this.options.getMcpManager();
|
|
114
|
+
if (!mcpManager) {
|
|
115
|
+
throw new Error("No MCP manager available. MCP servers may not be configured.");
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const uri = extractResourceUri(url);
|
|
119
|
+
const targetServer = resolveTargetServer(mcpManager, uri);
|
|
120
|
+
if (!targetServer) {
|
|
121
|
+
throw new Error(
|
|
122
|
+
`No MCP server has resource "${uri}".\n\nAvailable resources:\n${formatAvailableResources(mcpManager)}`,
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
let result: MCPResourceReadResult | undefined;
|
|
127
|
+
try {
|
|
128
|
+
result = await mcpManager.readServerResource(targetServer, uri);
|
|
129
|
+
} catch (error) {
|
|
130
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
131
|
+
throw new Error(`MCP resource read error: ${message}`);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (!result) {
|
|
135
|
+
throw new Error(`Server "${targetServer}" returned no content for "${uri}".`);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const textParts: string[] = [];
|
|
139
|
+
for (const item of result.contents) {
|
|
140
|
+
if (item.text !== undefined && item.text !== null) {
|
|
141
|
+
textParts.push(item.text);
|
|
142
|
+
} else if (item.blob) {
|
|
143
|
+
textParts.push(`[Binary content: ${item.mimeType ?? "unknown"}, base64 length ${item.blob.length}]`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const content = textParts.length > 0 ? textParts.join("\n---\n") : "(empty resource)";
|
|
148
|
+
return {
|
|
149
|
+
url: url.href,
|
|
150
|
+
content,
|
|
151
|
+
contentType: "text/plain",
|
|
152
|
+
size: Buffer.byteLength(content, "utf-8"),
|
|
153
|
+
notes: [`MCP server: ${targetServer}`],
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { isEnoent } from "@f5xc-salesdemos/pi-utils";
|
|
4
|
+
import { validateRelativePath } from "./skill-protocol";
|
|
5
|
+
import type { InternalResource, InternalUrl, ProtocolHandler } from "./types";
|
|
6
|
+
|
|
7
|
+
const DEFAULT_MEMORY_FILE = "memory_summary.md";
|
|
8
|
+
const MEMORY_NAMESPACE = "root";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Options for the memory:// URL protocol.
|
|
12
|
+
*/
|
|
13
|
+
export interface MemoryProtocolOptions {
|
|
14
|
+
/**
|
|
15
|
+
* Returns the absolute path to the current project's memory root.
|
|
16
|
+
*/
|
|
17
|
+
getMemoryRoot: () => string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function ensureWithinRoot(targetPath: string, rootPath: string): void {
|
|
21
|
+
if (targetPath !== rootPath && !targetPath.startsWith(`${rootPath}${path.sep}`)) {
|
|
22
|
+
throw new Error("memory:// URL escapes memory root");
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function toMemoryValidationError(error: unknown): Error {
|
|
27
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
28
|
+
return new Error(message.replace("skill://", "memory://"));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Resolve a memory:// URL to an absolute filesystem path under memory root.
|
|
33
|
+
*/
|
|
34
|
+
export function resolveMemoryUrlToPath(url: InternalUrl, memoryRoot: string): string {
|
|
35
|
+
const namespace = url.rawHost || url.hostname;
|
|
36
|
+
if (!namespace) {
|
|
37
|
+
throw new Error("memory:// URL requires a namespace: memory://root");
|
|
38
|
+
}
|
|
39
|
+
if (namespace !== MEMORY_NAMESPACE) {
|
|
40
|
+
throw new Error(`Unknown memory namespace: ${namespace}. Supported: ${MEMORY_NAMESPACE}`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const rawPathname = url.rawPathname ?? url.pathname;
|
|
44
|
+
const hasPath = rawPathname && rawPathname !== "/" && rawPathname !== "";
|
|
45
|
+
if (!hasPath) {
|
|
46
|
+
return path.resolve(memoryRoot, DEFAULT_MEMORY_FILE);
|
|
47
|
+
}
|
|
48
|
+
let relativePath: string;
|
|
49
|
+
try {
|
|
50
|
+
relativePath = decodeURIComponent(rawPathname.slice(1));
|
|
51
|
+
} catch {
|
|
52
|
+
throw new Error(`Invalid URL encoding in memory:// path: ${url.href}`);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
try {
|
|
56
|
+
validateRelativePath(relativePath);
|
|
57
|
+
} catch (error) {
|
|
58
|
+
throw toMemoryValidationError(error);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return path.resolve(memoryRoot, relativePath);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Protocol handler for memory:// URLs.
|
|
66
|
+
*
|
|
67
|
+
* URL forms:
|
|
68
|
+
* - memory://root - Reads memory_summary.md
|
|
69
|
+
* - memory://root/<path> - Reads a relative file under memory root
|
|
70
|
+
*/
|
|
71
|
+
export class MemoryProtocolHandler implements ProtocolHandler {
|
|
72
|
+
readonly scheme = "memory";
|
|
73
|
+
|
|
74
|
+
constructor(private readonly options: MemoryProtocolOptions) {}
|
|
75
|
+
|
|
76
|
+
async resolve(url: InternalUrl): Promise<InternalResource> {
|
|
77
|
+
const memoryRoot = path.resolve(this.options.getMemoryRoot());
|
|
78
|
+
let resolvedRoot: string;
|
|
79
|
+
try {
|
|
80
|
+
resolvedRoot = await fs.realpath(memoryRoot);
|
|
81
|
+
} catch (error) {
|
|
82
|
+
if (isEnoent(error)) {
|
|
83
|
+
throw new Error(
|
|
84
|
+
"Memory artifacts are not available for this project yet. Run a session with memories enabled first.",
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const targetPath = resolveMemoryUrlToPath(url, resolvedRoot);
|
|
91
|
+
ensureWithinRoot(targetPath, resolvedRoot);
|
|
92
|
+
|
|
93
|
+
const parentDir = path.dirname(targetPath);
|
|
94
|
+
try {
|
|
95
|
+
const realParent = await fs.realpath(parentDir);
|
|
96
|
+
ensureWithinRoot(realParent, resolvedRoot);
|
|
97
|
+
} catch (error) {
|
|
98
|
+
if (!isEnoent(error)) {
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
let realTargetPath: string;
|
|
104
|
+
try {
|
|
105
|
+
realTargetPath = await fs.realpath(targetPath);
|
|
106
|
+
} catch (error) {
|
|
107
|
+
if (isEnoent(error)) {
|
|
108
|
+
throw new Error(`Memory file not found: ${url.href}`);
|
|
109
|
+
}
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
ensureWithinRoot(realTargetPath, resolvedRoot);
|
|
114
|
+
|
|
115
|
+
const stat = await fs.stat(realTargetPath);
|
|
116
|
+
if (!stat.isFile()) {
|
|
117
|
+
throw new Error(`memory:// URL must resolve to a file: ${url.href}`);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const content = await Bun.file(realTargetPath).text();
|
|
121
|
+
const ext = path.extname(realTargetPath).toLowerCase();
|
|
122
|
+
const contentType: InternalResource["contentType"] = ext === ".md" ? "text/markdown" : "text/plain";
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
url: url.href,
|
|
126
|
+
content,
|
|
127
|
+
contentType,
|
|
128
|
+
size: Buffer.byteLength(content, "utf-8"),
|
|
129
|
+
sourcePath: realTargetPath,
|
|
130
|
+
notes: [],
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal URL parser that handles colons in the host segment.
|
|
3
|
+
*
|
|
4
|
+
* Standard `new URL()` interprets colons as port separators, which breaks
|
|
5
|
+
* namespaced internal URLs like `skill://plugin:name`. This parser extracts
|
|
6
|
+
* components via regex first, then falls back to a minimal URL-like object
|
|
7
|
+
* when `new URL()` fails.
|
|
8
|
+
*
|
|
9
|
+
* All code that parses internal URLs (router, protocol handlers, tools)
|
|
10
|
+
* MUST use this function instead of calling `new URL()` directly.
|
|
11
|
+
*/
|
|
12
|
+
import type { InternalUrl } from "./types";
|
|
13
|
+
|
|
14
|
+
const SCHEME_HOST_RE = /^([a-z][a-z0-9+.-]*):\/\/([^/?#]*)/i;
|
|
15
|
+
const PATHNAME_RE = /^[a-z][a-z0-9+.-]*:\/\/[^/?#]*(\/[^?#]*)?/i;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Parse an internal URL into an InternalUrl.
|
|
19
|
+
*
|
|
20
|
+
* Handles URLs where `new URL()` would fail (e.g., `skill://plugin:name`
|
|
21
|
+
* where the colon is not a port separator).
|
|
22
|
+
*/
|
|
23
|
+
export function parseInternalUrl(input: string): InternalUrl {
|
|
24
|
+
const hostMatch = input.match(SCHEME_HOST_RE);
|
|
25
|
+
const pathMatch = input.match(PATHNAME_RE);
|
|
26
|
+
|
|
27
|
+
let parsed: URL;
|
|
28
|
+
try {
|
|
29
|
+
parsed = new URL(input);
|
|
30
|
+
} catch {
|
|
31
|
+
// URL parse failed — build a minimal URL-like object from regex matches.
|
|
32
|
+
if (!hostMatch) {
|
|
33
|
+
throw new Error(`Invalid URL: ${input}`);
|
|
34
|
+
}
|
|
35
|
+
// Extract search and hash from the raw input before constructing the object.
|
|
36
|
+
const hashIdx = input.indexOf("#");
|
|
37
|
+
const hash = hashIdx !== -1 ? input.slice(hashIdx) : "";
|
|
38
|
+
const withoutHash = hashIdx !== -1 ? input.slice(0, hashIdx) : input;
|
|
39
|
+
const queryIdx = withoutHash.indexOf("?");
|
|
40
|
+
const search = queryIdx !== -1 ? withoutHash.slice(queryIdx) : "";
|
|
41
|
+
const queryString = search.slice(1); // strip leading ?
|
|
42
|
+
|
|
43
|
+
// Strip search/hash from pathname captured by regex.
|
|
44
|
+
let rawPathname = pathMatch?.[1] ?? "";
|
|
45
|
+
if (queryIdx !== -1 && rawPathname.includes("?")) {
|
|
46
|
+
rawPathname = rawPathname.slice(0, rawPathname.indexOf("?"));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
parsed = {
|
|
50
|
+
protocol: `${hostMatch[1]}:`,
|
|
51
|
+
hostname: hostMatch[2] ?? "",
|
|
52
|
+
host: hostMatch[2] ?? "",
|
|
53
|
+
pathname: rawPathname,
|
|
54
|
+
href: input,
|
|
55
|
+
search,
|
|
56
|
+
hash,
|
|
57
|
+
searchParams: new URLSearchParams(queryString),
|
|
58
|
+
} as unknown as URL;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
let rawHost = hostMatch ? hostMatch[2] : parsed.hostname;
|
|
62
|
+
try {
|
|
63
|
+
rawHost = decodeURIComponent(rawHost);
|
|
64
|
+
} catch {
|
|
65
|
+
// Leave rawHost as-is if decoding fails.
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const result = parsed as InternalUrl;
|
|
69
|
+
result.rawHost = rawHost;
|
|
70
|
+
result.rawPathname = pathMatch?.[1] ?? parsed.pathname;
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { logger } from "@f5xc-salesdemos/pi-utils";
|
|
2
|
+
import { $ } from "bun";
|
|
3
|
+
|
|
4
|
+
import type { UserProfile } from "./user-profile";
|
|
5
|
+
|
|
6
|
+
export interface ProfileCollector {
|
|
7
|
+
/** Unique identifier for this collector */
|
|
8
|
+
readonly id: string;
|
|
9
|
+
/** Human-readable name */
|
|
10
|
+
readonly name: string;
|
|
11
|
+
/** Fields this collector is the authoritative source for. Overwrites even pre-existing values. */
|
|
12
|
+
readonly authoritativeFields?: readonly string[];
|
|
13
|
+
/** Check if this collector can run (binary exists, platform ok, etc.) */
|
|
14
|
+
available(): Promise<boolean>;
|
|
15
|
+
/** Run the collector and return partial profile fields to merge */
|
|
16
|
+
collect(): Promise<Partial<UserProfile>>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// System (macOS)
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
|
|
23
|
+
async function detectDarwinLanguages(): Promise<string[]> {
|
|
24
|
+
const proc = await $`defaults read NSGlobalDomain AppleLanguages`.quiet().nothrow();
|
|
25
|
+
if (proc.exitCode !== 0) return [];
|
|
26
|
+
|
|
27
|
+
const raw = proc.stdout.toString().trim();
|
|
28
|
+
const inner = raw.replace(/^\(\s*/, "").replace(/\s*\)$/, "");
|
|
29
|
+
return inner
|
|
30
|
+
.split(",")
|
|
31
|
+
.map(s => s.trim().replace(/^"/, "").replace(/"$/, ""))
|
|
32
|
+
.filter(s => s.length > 0);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function detectLinuxLanguages(): string[] {
|
|
36
|
+
const languages: string[] = [];
|
|
37
|
+
|
|
38
|
+
// $LANGUAGE is a colon-separated priority list (e.g., "fr:de:en")
|
|
39
|
+
const langList = process.env.LANGUAGE;
|
|
40
|
+
if (langList) {
|
|
41
|
+
for (const l of langList.split(":")) {
|
|
42
|
+
const trimmed = l.trim();
|
|
43
|
+
if (trimmed) languages.push(trimmed);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Fall back to $LANG (e.g., "fr_FR.UTF-8")
|
|
48
|
+
if (languages.length === 0) {
|
|
49
|
+
const lang = process.env.LANG;
|
|
50
|
+
if (lang) {
|
|
51
|
+
const code = lang.split(".")[0];
|
|
52
|
+
if (code && code !== "C" && code !== "POSIX") languages.push(code.replace(/_/g, "-"));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return languages;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const systemCollector: ProfileCollector = {
|
|
60
|
+
id: "system",
|
|
61
|
+
name: "System",
|
|
62
|
+
|
|
63
|
+
async available(): Promise<boolean> {
|
|
64
|
+
return process.platform === "darwin" || process.platform === "linux";
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
async collect(): Promise<Partial<UserProfile>> {
|
|
68
|
+
try {
|
|
69
|
+
const languages = process.platform === "darwin" ? await detectDarwinLanguages() : detectLinuxLanguages();
|
|
70
|
+
|
|
71
|
+
if (languages.length === 0) return {};
|
|
72
|
+
return { knowsLanguage: languages };
|
|
73
|
+
} catch (err: unknown) {
|
|
74
|
+
logger.debug("system collector failed", { error: err });
|
|
75
|
+
return {};
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// Registry
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
|
|
84
|
+
const _collectors: ProfileCollector[] = [systemCollector];
|
|
85
|
+
|
|
86
|
+
export const PROFILE_COLLECTORS: readonly ProfileCollector[] = _collectors;
|
|
87
|
+
|
|
88
|
+
export function registerProfileCollector(collector: ProfileCollector): void {
|
|
89
|
+
if (_collectors.some(c => c.id === collector.id)) {
|
|
90
|
+
logger.warn(`Profile collector '${collector.id}' already registered, skipping`);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
_collectors.push(collector);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function unregisterProfileCollector(id: string): boolean {
|
|
97
|
+
const idx = _collectors.findIndex(c => c.id === id);
|
|
98
|
+
if (idx === -1) return false;
|
|
99
|
+
_collectors.splice(idx, 1);
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export const collectorRegistry = {
|
|
104
|
+
register: registerProfileCollector,
|
|
105
|
+
unregister: unregisterProfileCollector,
|
|
106
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal URL router for internal protocols
|
|
3
|
+
* (agent://, artifact://, memory://, skill://, rule://, mcp://, xcsh://, local://, jobs://).
|
|
4
|
+
*/
|
|
5
|
+
import { parseInternalUrl } from "./parse";
|
|
6
|
+
import type { InternalResource, InternalUrl, ProtocolHandler } from "./types";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Router for internal URL schemes.
|
|
10
|
+
*
|
|
11
|
+
* Dispatches URLs like `agent://output_id` or `memory://root/memory_summary.md` to
|
|
12
|
+
* registered protocol handlers.
|
|
13
|
+
*/
|
|
14
|
+
export class InternalUrlRouter {
|
|
15
|
+
#handlers = new Map<string, ProtocolHandler>();
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Register a protocol handler.
|
|
19
|
+
* @param handler Handler to register (uses handler.scheme as key)
|
|
20
|
+
*/
|
|
21
|
+
register(handler: ProtocolHandler): void {
|
|
22
|
+
this.#handlers.set(handler.scheme, handler);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Check if the router can handle a URL.
|
|
27
|
+
* @param input URL string to check
|
|
28
|
+
*/
|
|
29
|
+
canHandle(input: string): boolean {
|
|
30
|
+
const match = input.match(/^([a-z][a-z0-9+.-]*):\/\//i);
|
|
31
|
+
if (!match) return false;
|
|
32
|
+
const scheme = match[1].toLowerCase();
|
|
33
|
+
return this.#handlers.has(scheme);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Resolve an internal URL to its content.
|
|
38
|
+
* @param input URL string (e.g., "agent://reviewer_0", "skill://notion-pages")
|
|
39
|
+
* @throws Error if scheme is not registered or resolution fails
|
|
40
|
+
*/
|
|
41
|
+
async resolve(input: string): Promise<InternalResource> {
|
|
42
|
+
const parsed = parseInternalUrl(input);
|
|
43
|
+
const scheme = parsed.protocol.replace(/:$/, "").toLowerCase();
|
|
44
|
+
const handler = this.#handlers.get(scheme);
|
|
45
|
+
|
|
46
|
+
if (!handler) {
|
|
47
|
+
const available = Array.from(this.#handlers.keys())
|
|
48
|
+
.map(s => `${s}://`)
|
|
49
|
+
.join(", ");
|
|
50
|
+
throw new Error(`Unknown protocol: ${scheme}://\nSupported: ${available || "none"}`);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return handler.resolve(parsed as InternalUrl);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol handler for rule:// URLs.
|
|
3
|
+
*
|
|
4
|
+
* Resolves rule names to their content files.
|
|
5
|
+
*
|
|
6
|
+
* URL forms:
|
|
7
|
+
* - rule://<name> - Reads rule content
|
|
8
|
+
*/
|
|
9
|
+
import type { Rule } from "../capability/rule";
|
|
10
|
+
import type { InternalResource, InternalUrl, ProtocolHandler } from "./types";
|
|
11
|
+
|
|
12
|
+
export interface RuleProtocolOptions {
|
|
13
|
+
/**
|
|
14
|
+
* Returns the currently loaded rules.
|
|
15
|
+
*/
|
|
16
|
+
getRules: () => readonly Rule[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Handler for rule:// URLs.
|
|
21
|
+
*
|
|
22
|
+
* Resolves rule names to their content.
|
|
23
|
+
*/
|
|
24
|
+
export class RuleProtocolHandler implements ProtocolHandler {
|
|
25
|
+
readonly scheme = "rule";
|
|
26
|
+
|
|
27
|
+
constructor(private readonly options: RuleProtocolOptions) {}
|
|
28
|
+
|
|
29
|
+
async resolve(url: InternalUrl): Promise<InternalResource> {
|
|
30
|
+
const rules = this.options.getRules();
|
|
31
|
+
|
|
32
|
+
// Extract rule name from host
|
|
33
|
+
const ruleName = url.rawHost || url.hostname;
|
|
34
|
+
if (!ruleName) {
|
|
35
|
+
throw new Error("rule:// URL requires a rule name: rule://<name>");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Find the rule
|
|
39
|
+
const rule = rules.find(r => r.name === ruleName);
|
|
40
|
+
if (!rule) {
|
|
41
|
+
const available = rules.map(r => r.name);
|
|
42
|
+
const availableStr = available.length > 0 ? available.join(", ") : "none";
|
|
43
|
+
throw new Error(`Unknown rule: ${ruleName}\nAvailable: ${availableStr}`);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
url: url.href,
|
|
48
|
+
content: rule.content,
|
|
49
|
+
contentType: "text/markdown",
|
|
50
|
+
size: Buffer.byteLength(rule.content, "utf-8"),
|
|
51
|
+
sourcePath: rule.path,
|
|
52
|
+
notes: [],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol handler for skill:// URLs.
|
|
3
|
+
*
|
|
4
|
+
* Resolves skill names to their SKILL.md files or relative paths within skill directories.
|
|
5
|
+
*
|
|
6
|
+
* URL forms:
|
|
7
|
+
* - skill://<name> - Reads SKILL.md
|
|
8
|
+
* - skill://<name>/<path> - Reads relative path within skill's baseDir
|
|
9
|
+
*/
|
|
10
|
+
import * as path from "node:path";
|
|
11
|
+
import type { Skill } from "../extensibility/skills";
|
|
12
|
+
import type { InternalResource, InternalUrl, ProtocolHandler } from "./types";
|
|
13
|
+
|
|
14
|
+
export interface SkillProtocolOptions {
|
|
15
|
+
/**
|
|
16
|
+
* Returns the currently loaded skills.
|
|
17
|
+
*/
|
|
18
|
+
getSkills: () => readonly Skill[];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Get content type based on file extension.
|
|
23
|
+
*/
|
|
24
|
+
function getContentType(filePath: string): InternalResource["contentType"] {
|
|
25
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
26
|
+
if (ext === ".md") return "text/markdown";
|
|
27
|
+
return "text/plain";
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Validate that a path is safe (no traversal, no absolute paths).
|
|
32
|
+
*/
|
|
33
|
+
export function validateRelativePath(relativePath: string): void {
|
|
34
|
+
if (path.isAbsolute(relativePath)) {
|
|
35
|
+
throw new Error("Absolute paths are not allowed in skill:// URLs");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const normalized = path.normalize(relativePath);
|
|
39
|
+
if (normalized.startsWith("..") || normalized.includes("/../") || normalized.includes("/..")) {
|
|
40
|
+
throw new Error("Path traversal (..) is not allowed in skill:// URLs");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Handler for skill:// URLs.
|
|
46
|
+
*
|
|
47
|
+
* Resolves skill names to their content files.
|
|
48
|
+
*/
|
|
49
|
+
export class SkillProtocolHandler implements ProtocolHandler {
|
|
50
|
+
readonly scheme = "skill";
|
|
51
|
+
|
|
52
|
+
constructor(private readonly options: SkillProtocolOptions) {}
|
|
53
|
+
|
|
54
|
+
async resolve(url: InternalUrl): Promise<InternalResource> {
|
|
55
|
+
const skills = this.options.getSkills();
|
|
56
|
+
|
|
57
|
+
// Extract skill name from host
|
|
58
|
+
const skillName = url.rawHost || url.hostname;
|
|
59
|
+
if (!skillName) {
|
|
60
|
+
throw new Error("skill:// URL requires a skill name: skill://<name>");
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Find the skill
|
|
64
|
+
const skill = skills.find(s => s.name === skillName);
|
|
65
|
+
if (!skill) {
|
|
66
|
+
const available = skills.map(s => s.name);
|
|
67
|
+
const availableStr = available.length > 0 ? available.join(", ") : "none";
|
|
68
|
+
throw new Error(`Unknown skill: ${skillName}\nAvailable: ${availableStr}`);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Determine the file to read
|
|
72
|
+
let targetPath: string;
|
|
73
|
+
const urlPath = url.pathname;
|
|
74
|
+
const hasRelativePath = urlPath && urlPath !== "/" && urlPath !== "";
|
|
75
|
+
|
|
76
|
+
if (hasRelativePath) {
|
|
77
|
+
// Read relative path within skill's baseDir
|
|
78
|
+
const relativePath = decodeURIComponent(urlPath.slice(1)); // Remove leading /
|
|
79
|
+
validateRelativePath(relativePath);
|
|
80
|
+
targetPath = path.join(skill.baseDir, relativePath);
|
|
81
|
+
|
|
82
|
+
// Verify the resolved path is still within baseDir
|
|
83
|
+
const resolvedPath = path.resolve(targetPath);
|
|
84
|
+
const resolvedBaseDir = path.resolve(skill.baseDir);
|
|
85
|
+
if (!resolvedPath.startsWith(resolvedBaseDir + path.sep) && resolvedPath !== resolvedBaseDir) {
|
|
86
|
+
throw new Error("Path traversal is not allowed");
|
|
87
|
+
}
|
|
88
|
+
} else {
|
|
89
|
+
// Read SKILL.md
|
|
90
|
+
targetPath = skill.filePath;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Read the file
|
|
94
|
+
const file = Bun.file(targetPath);
|
|
95
|
+
if (!(await file.exists())) {
|
|
96
|
+
throw new Error(`File not found: ${targetPath}`);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const content = await file.text();
|
|
100
|
+
const contentType = getContentType(targetPath);
|
|
101
|
+
|
|
102
|
+
return {
|
|
103
|
+
url: url.href,
|
|
104
|
+
content,
|
|
105
|
+
contentType,
|
|
106
|
+
size: Buffer.byteLength(content, "utf-8"),
|
|
107
|
+
sourcePath: targetPath,
|
|
108
|
+
notes: [],
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|