@nghyane/arcane 0.1.0
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 +3 -0
- package/README.md +12 -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 +550 -0
- package/examples/extensions/reload-runtime.ts +37 -0
- package/examples/extensions/todo.ts +296 -0
- package/examples/extensions/tools.ts +144 -0
- package/examples/extensions/with-deps/index.ts +35 -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 +116 -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 +150 -0
- package/examples/hooks/permission-gate.ts +33 -0
- package/examples/hooks/protected-paths.ts +29 -0
- package/examples/hooks/qna.ts +119 -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 +36 -0
- package/examples/sdk/08-slash-commands.ts +41 -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 +150 -0
- package/package.json +464 -0
- package/scripts/format-prompts.ts +184 -0
- package/scripts/generate-docs-index.ts +40 -0
- package/scripts/generate-template.ts +32 -0
- package/src/bun-imports.d.ts +22 -0
- package/src/capability/context-file.ts +39 -0
- package/src/capability/extension-module.ts +33 -0
- package/src/capability/extension.ts +47 -0
- package/src/capability/fs.ts +89 -0
- package/src/capability/hook.ts +39 -0
- package/src/capability/index.ts +432 -0
- package/src/capability/instruction.ts +36 -0
- package/src/capability/mcp.ts +60 -0
- package/src/capability/prompt.ts +34 -0
- package/src/capability/rule.ts +223 -0
- package/src/capability/settings.ts +34 -0
- package/src/capability/skill.ts +48 -0
- package/src/capability/slash-command.ts +39 -0
- package/src/capability/ssh.ts +41 -0
- package/src/capability/system-prompt.ts +34 -0
- package/src/capability/tool.ts +37 -0
- package/src/capability/types.ts +156 -0
- package/src/cli/args.ts +259 -0
- package/src/cli/config-cli.ts +357 -0
- package/src/cli/file-processor.ts +124 -0
- package/src/cli/grep-cli.ts +152 -0
- package/src/cli/jupyter-cli.ts +106 -0
- package/src/cli/list-models.ts +103 -0
- package/src/cli/plugin-cli.ts +661 -0
- package/src/cli/session-picker.ts +42 -0
- package/src/cli/setup-cli.ts +376 -0
- package/src/cli/shell-cli.ts +174 -0
- package/src/cli/ssh-cli.ts +179 -0
- package/src/cli/stats-cli.ts +197 -0
- package/src/cli/update-cli.ts +286 -0
- package/src/cli/web-search-cli.ts +143 -0
- package/src/cli.ts +65 -0
- package/src/commands/commit.ts +36 -0
- package/src/commands/config.ts +51 -0
- package/src/commands/grep.ts +41 -0
- package/src/commands/jupyter.ts +32 -0
- package/src/commands/launch.ts +139 -0
- package/src/commands/plugin.ts +70 -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 +42 -0
- package/src/commit/agentic/agent.ts +311 -0
- package/src/commit/agentic/fallback.ts +96 -0
- package/src/commit/agentic/index.ts +359 -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 +69 -0
- package/src/commit/agentic/tools/analyze-file.ts +118 -0
- package/src/commit/agentic/tools/git-file-diff.ts +194 -0
- package/src/commit/agentic/tools/git-hunk.ts +50 -0
- package/src/commit/agentic/tools/git-overview.ts +84 -0
- package/src/commit/agentic/tools/index.ts +56 -0
- package/src/commit/agentic/tools/propose-changelog.ts +128 -0
- package/src/commit/agentic/tools/propose-commit.ts +154 -0
- package/src/commit/agentic/tools/recent-commits.ts +81 -0
- package/src/commit/agentic/tools/split-commit.ts +280 -0
- package/src/commit/agentic/topo-sort.ts +44 -0
- package/src/commit/agentic/trivial.ts +51 -0
- package/src/commit/agentic/validation.ts +200 -0
- package/src/commit/analysis/conventional.ts +165 -0
- package/src/commit/analysis/index.ts +4 -0
- package/src/commit/analysis/scope.ts +242 -0
- package/src/commit/analysis/summary.ts +112 -0
- package/src/commit/analysis/validation.ts +66 -0
- package/src/commit/changelog/detect.ts +37 -0
- package/src/commit/changelog/generate.ts +110 -0
- package/src/commit/changelog/index.ts +234 -0
- package/src/commit/changelog/parse.ts +44 -0
- package/src/commit/cli.ts +93 -0
- package/src/commit/git/diff.ts +148 -0
- package/src/commit/git/errors.ts +9 -0
- package/src/commit/git/index.ts +211 -0
- package/src/commit/git/operations.ts +54 -0
- package/src/commit/index.ts +5 -0
- package/src/commit/map-reduce/index.ts +64 -0
- package/src/commit/map-reduce/map-phase.ts +178 -0
- package/src/commit/map-reduce/reduce-phase.ts +145 -0
- package/src/commit/map-reduce/utils.ts +9 -0
- package/src/commit/message.ts +11 -0
- package/src/commit/model-selection.ts +69 -0
- package/src/commit/pipeline.ts +243 -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 +109 -0
- package/src/commit/utils/exclusions.ts +42 -0
- package/src/config/file-lock.ts +121 -0
- package/src/config/keybindings.ts +280 -0
- package/src/config/model-registry.ts +1140 -0
- package/src/config/model-resolver.ts +812 -0
- package/src/config/prompt-templates.ts +526 -0
- package/src/config/resolve-config-value.ts +92 -0
- package/src/config/settings-schema.ts +1236 -0
- package/src/config/settings.ts +706 -0
- package/src/config.ts +414 -0
- package/src/cursor.ts +239 -0
- package/src/debug/index.ts +431 -0
- package/src/debug/log-formatting.ts +60 -0
- package/src/debug/log-viewer.ts +903 -0
- package/src/debug/profiler.ts +158 -0
- package/src/debug/report-bundle.ts +366 -0
- package/src/debug/system-info.ts +112 -0
- package/src/discovery/agents-md.ts +68 -0
- package/src/discovery/agents.ts +199 -0
- package/src/discovery/builtin.ts +815 -0
- package/src/discovery/claude-plugins.ts +205 -0
- package/src/discovery/claude.ts +506 -0
- package/src/discovery/cline.ts +83 -0
- package/src/discovery/codex.ts +532 -0
- package/src/discovery/cursor.ts +218 -0
- package/src/discovery/gemini.ts +395 -0
- package/src/discovery/github.ts +117 -0
- package/src/discovery/helpers.ts +698 -0
- package/src/discovery/index.ts +89 -0
- package/src/discovery/mcp-json.ts +156 -0
- package/src/discovery/opencode.ts +394 -0
- package/src/discovery/ssh.ts +160 -0
- package/src/discovery/vscode.ts +103 -0
- package/src/discovery/windsurf.ts +145 -0
- package/src/exa/company.ts +57 -0
- package/src/exa/index.ts +62 -0
- package/src/exa/linkedin.ts +57 -0
- package/src/exa/mcp-client.ts +289 -0
- package/src/exa/render.ts +244 -0
- package/src/exa/researcher.ts +89 -0
- package/src/exa/search.ts +330 -0
- package/src/exa/types.ts +166 -0
- package/src/exa/websets.ts +247 -0
- package/src/exec/bash-executor.ts +184 -0
- package/src/exec/exec.ts +53 -0
- package/src/export/custom-share.ts +65 -0
- package/src/export/html/index.ts +162 -0
- package/src/export/html/template.css +889 -0
- package/src/export/html/template.generated.ts +2 -0
- package/src/export/html/template.html +45 -0
- package/src/export/html/template.js +1329 -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/review/index.ts +433 -0
- package/src/extensibility/custom-commands/index.ts +15 -0
- package/src/extensibility/custom-commands/loader.ts +231 -0
- package/src/extensibility/custom-commands/types.ts +111 -0
- package/src/extensibility/custom-tools/index.ts +22 -0
- package/src/extensibility/custom-tools/loader.ts +235 -0
- package/src/extensibility/custom-tools/types.ts +226 -0
- package/src/extensibility/custom-tools/wrapper.ts +45 -0
- package/src/extensibility/extensions/index.ts +136 -0
- package/src/extensibility/extensions/loader.ts +520 -0
- package/src/extensibility/extensions/runner.ts +774 -0
- package/src/extensibility/extensions/types.ts +1293 -0
- package/src/extensibility/extensions/wrapper.ts +188 -0
- package/src/extensibility/hooks/index.ts +16 -0
- package/src/extensibility/hooks/loader.ts +273 -0
- package/src/extensibility/hooks/runner.ts +441 -0
- package/src/extensibility/hooks/tool-wrapper.ts +106 -0
- package/src/extensibility/hooks/types.ts +817 -0
- package/src/extensibility/plugins/doctor.ts +65 -0
- package/src/extensibility/plugins/git-url.ts +281 -0
- package/src/extensibility/plugins/index.ts +33 -0
- package/src/extensibility/plugins/installer.ts +192 -0
- package/src/extensibility/plugins/loader.ts +338 -0
- package/src/extensibility/plugins/manager.ts +716 -0
- package/src/extensibility/plugins/parser.ts +105 -0
- package/src/extensibility/plugins/types.ts +190 -0
- package/src/extensibility/skills.ts +385 -0
- package/src/extensibility/slash-commands.ts +287 -0
- package/src/extensibility/tool-proxy.ts +25 -0
- package/src/index.ts +275 -0
- package/src/internal-urls/agent-protocol.ts +136 -0
- package/src/internal-urls/artifact-protocol.ts +97 -0
- package/src/internal-urls/docs-index.generated.ts +54 -0
- package/src/internal-urls/docs-protocol.ts +84 -0
- package/src/internal-urls/index.ts +31 -0
- package/src/internal-urls/json-query.ts +126 -0
- package/src/internal-urls/memory-protocol.ts +133 -0
- package/src/internal-urls/router.ts +70 -0
- package/src/internal-urls/rule-protocol.ts +55 -0
- package/src/internal-urls/skill-protocol.ts +111 -0
- package/src/internal-urls/types.ts +52 -0
- package/src/ipy/executor.ts +556 -0
- package/src/ipy/gateway-coordinator.ts +426 -0
- package/src/ipy/kernel.ts +892 -0
- package/src/ipy/modules.ts +109 -0
- package/src/ipy/prelude.py +831 -0
- package/src/ipy/prelude.ts +3 -0
- package/src/ipy/runtime.ts +222 -0
- package/src/lsp/client.ts +867 -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 +397 -0
- package/src/lsp/defaults.json +464 -0
- package/src/lsp/edits.ts +109 -0
- package/src/lsp/index.ts +1268 -0
- package/src/lsp/lspmux.ts +250 -0
- package/src/lsp/render.ts +689 -0
- package/src/lsp/types.ts +414 -0
- package/src/lsp/utils.ts +549 -0
- package/src/main.ts +773 -0
- package/src/mcp/client.ts +239 -0
- package/src/mcp/config-writer.ts +215 -0
- package/src/mcp/config.ts +363 -0
- package/src/mcp/index.ts +55 -0
- package/src/mcp/json-rpc.ts +84 -0
- package/src/mcp/loader.ts +124 -0
- package/src/mcp/manager.ts +490 -0
- package/src/mcp/oauth-discovery.ts +274 -0
- package/src/mcp/oauth-flow.ts +229 -0
- package/src/mcp/render.ts +123 -0
- package/src/mcp/tool-bridge.ts +372 -0
- package/src/mcp/tool-cache.ts +121 -0
- package/src/mcp/transports/http.ts +332 -0
- package/src/mcp/transports/index.ts +6 -0
- package/src/mcp/transports/stdio.ts +281 -0
- package/src/mcp/types.ts +248 -0
- package/src/memories/index.ts +1099 -0
- package/src/memories/storage.ts +563 -0
- package/src/modes/components/agent-dashboard.ts +1130 -0
- package/src/modes/components/assistant-message.ts +144 -0
- package/src/modes/components/bash-execution.ts +218 -0
- package/src/modes/components/bordered-loader.ts +41 -0
- package/src/modes/components/branch-summary-message.ts +45 -0
- package/src/modes/components/codemode-group.ts +369 -0
- package/src/modes/components/compaction-summary-message.ts +51 -0
- package/src/modes/components/countdown-timer.ts +46 -0
- package/src/modes/components/custom-editor.ts +181 -0
- package/src/modes/components/custom-message.ts +91 -0
- package/src/modes/components/diff.ts +186 -0
- package/src/modes/components/dynamic-border.ts +25 -0
- package/src/modes/components/extensions/extension-dashboard.ts +325 -0
- package/src/modes/components/extensions/extension-list.ts +484 -0
- package/src/modes/components/extensions/index.ts +9 -0
- package/src/modes/components/extensions/inspector-panel.ts +321 -0
- package/src/modes/components/extensions/state-manager.ts +586 -0
- package/src/modes/components/extensions/types.ts +191 -0
- package/src/modes/components/footer.ts +315 -0
- package/src/modes/components/history-search.ts +157 -0
- package/src/modes/components/hook-editor.ts +101 -0
- package/src/modes/components/hook-input.ts +72 -0
- package/src/modes/components/hook-message.ts +100 -0
- package/src/modes/components/hook-selector.ts +155 -0
- package/src/modes/components/index.ts +41 -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 +1295 -0
- package/src/modes/components/model-selector.ts +625 -0
- package/src/modes/components/oauth-selector.ts +210 -0
- package/src/modes/components/plugin-settings.ts +477 -0
- package/src/modes/components/python-execution.ts +196 -0
- package/src/modes/components/queue-mode-selector.ts +56 -0
- package/src/modes/components/read-tool-group.ts +119 -0
- package/src/modes/components/session-selector.ts +242 -0
- package/src/modes/components/settings-defs.ts +340 -0
- package/src/modes/components/settings-selector.ts +529 -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/index.ts +4 -0
- package/src/modes/components/status-line/presets.ts +94 -0
- package/src/modes/components/status-line/segments.ts +352 -0
- package/src/modes/components/status-line/separators.ts +55 -0
- package/src/modes/components/status-line/types.ts +75 -0
- package/src/modes/components/status-line-segment-editor.ts +354 -0
- package/src/modes/components/status-line.ts +421 -0
- package/src/modes/components/theme-selector.ts +63 -0
- package/src/modes/components/thinking-selector.ts +64 -0
- package/src/modes/components/todo-display.ts +115 -0
- package/src/modes/components/todo-reminder.ts +40 -0
- package/src/modes/components/tool-execution.ts +703 -0
- package/src/modes/components/tree-selector.ts +904 -0
- package/src/modes/components/ttsr-notification.ts +80 -0
- package/src/modes/components/user-message-selector.ts +146 -0
- package/src/modes/components/user-message.ts +22 -0
- package/src/modes/components/visual-truncate.ts +63 -0
- package/src/modes/components/welcome.ts +247 -0
- package/src/modes/controllers/command-controller.ts +1120 -0
- package/src/modes/controllers/event-controller.ts +479 -0
- package/src/modes/controllers/extension-ui-controller.ts +778 -0
- package/src/modes/controllers/input-controller.ts +671 -0
- package/src/modes/controllers/mcp-command-controller.ts +1315 -0
- package/src/modes/controllers/selector-controller.ts +712 -0
- package/src/modes/controllers/ssh-command-controller.ts +452 -0
- package/src/modes/index.ts +15 -0
- package/src/modes/interactive-mode.ts +1027 -0
- package/src/modes/print-mode.ts +191 -0
- package/src/modes/rpc/rpc-client.ts +583 -0
- package/src/modes/rpc/rpc-mode.ts +700 -0
- package/src/modes/rpc/rpc-types.ts +236 -0
- package/src/modes/theme/dark.json +95 -0
- package/src/modes/theme/defaults/alabaster.json +93 -0
- package/src/modes/theme/defaults/amethyst.json +96 -0
- package/src/modes/theme/defaults/anthracite.json +93 -0
- package/src/modes/theme/defaults/basalt.json +91 -0
- package/src/modes/theme/defaults/birch.json +95 -0
- package/src/modes/theme/defaults/dark-abyss.json +91 -0
- package/src/modes/theme/defaults/dark-arctic.json +104 -0
- package/src/modes/theme/defaults/dark-aurora.json +95 -0
- package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
- package/src/modes/theme/defaults/dark-cavern.json +91 -0
- package/src/modes/theme/defaults/dark-copper.json +95 -0
- package/src/modes/theme/defaults/dark-cosmos.json +90 -0
- package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
- package/src/modes/theme/defaults/dark-dracula.json +98 -0
- package/src/modes/theme/defaults/dark-eclipse.json +91 -0
- package/src/modes/theme/defaults/dark-ember.json +95 -0
- package/src/modes/theme/defaults/dark-equinox.json +90 -0
- package/src/modes/theme/defaults/dark-forest.json +96 -0
- package/src/modes/theme/defaults/dark-github.json +105 -0
- package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
- package/src/modes/theme/defaults/dark-lavender.json +95 -0
- package/src/modes/theme/defaults/dark-lunar.json +89 -0
- package/src/modes/theme/defaults/dark-midnight.json +95 -0
- package/src/modes/theme/defaults/dark-monochrome.json +94 -0
- package/src/modes/theme/defaults/dark-monokai.json +98 -0
- package/src/modes/theme/defaults/dark-nebula.json +90 -0
- package/src/modes/theme/defaults/dark-nord.json +97 -0
- package/src/modes/theme/defaults/dark-ocean.json +101 -0
- package/src/modes/theme/defaults/dark-one.json +100 -0
- package/src/modes/theme/defaults/dark-rainforest.json +91 -0
- package/src/modes/theme/defaults/dark-reef.json +91 -0
- package/src/modes/theme/defaults/dark-retro.json +92 -0
- package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
- package/src/modes/theme/defaults/dark-sakura.json +95 -0
- package/src/modes/theme/defaults/dark-slate.json +95 -0
- package/src/modes/theme/defaults/dark-solarized.json +97 -0
- package/src/modes/theme/defaults/dark-solstice.json +90 -0
- package/src/modes/theme/defaults/dark-starfall.json +91 -0
- package/src/modes/theme/defaults/dark-sunset.json +99 -0
- package/src/modes/theme/defaults/dark-swamp.json +90 -0
- package/src/modes/theme/defaults/dark-synthwave.json +103 -0
- package/src/modes/theme/defaults/dark-taiga.json +91 -0
- package/src/modes/theme/defaults/dark-terminal.json +95 -0
- package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
- package/src/modes/theme/defaults/dark-tundra.json +91 -0
- package/src/modes/theme/defaults/dark-twilight.json +91 -0
- package/src/modes/theme/defaults/dark-volcanic.json +91 -0
- package/src/modes/theme/defaults/graphite.json +92 -0
- package/src/modes/theme/defaults/index.ts +195 -0
- package/src/modes/theme/defaults/light-arctic.json +107 -0
- package/src/modes/theme/defaults/light-aurora-day.json +91 -0
- package/src/modes/theme/defaults/light-canyon.json +91 -0
- package/src/modes/theme/defaults/light-catppuccin.json +106 -0
- package/src/modes/theme/defaults/light-cirrus.json +90 -0
- package/src/modes/theme/defaults/light-coral.json +95 -0
- package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
- package/src/modes/theme/defaults/light-dawn.json +90 -0
- package/src/modes/theme/defaults/light-dunes.json +91 -0
- package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
- package/src/modes/theme/defaults/light-forest.json +100 -0
- package/src/modes/theme/defaults/light-frost.json +95 -0
- package/src/modes/theme/defaults/light-github.json +115 -0
- package/src/modes/theme/defaults/light-glacier.json +91 -0
- package/src/modes/theme/defaults/light-gruvbox.json +108 -0
- package/src/modes/theme/defaults/light-haze.json +90 -0
- package/src/modes/theme/defaults/light-honeycomb.json +95 -0
- package/src/modes/theme/defaults/light-lagoon.json +91 -0
- package/src/modes/theme/defaults/light-lavender.json +95 -0
- package/src/modes/theme/defaults/light-meadow.json +91 -0
- package/src/modes/theme/defaults/light-mint.json +95 -0
- package/src/modes/theme/defaults/light-monochrome.json +101 -0
- package/src/modes/theme/defaults/light-ocean.json +99 -0
- package/src/modes/theme/defaults/light-one.json +99 -0
- package/src/modes/theme/defaults/light-opal.json +91 -0
- package/src/modes/theme/defaults/light-orchard.json +91 -0
- package/src/modes/theme/defaults/light-paper.json +95 -0
- package/src/modes/theme/defaults/light-prism.json +90 -0
- package/src/modes/theme/defaults/light-retro.json +98 -0
- package/src/modes/theme/defaults/light-sand.json +95 -0
- package/src/modes/theme/defaults/light-savanna.json +91 -0
- package/src/modes/theme/defaults/light-solarized.json +102 -0
- package/src/modes/theme/defaults/light-soleil.json +90 -0
- package/src/modes/theme/defaults/light-sunset.json +99 -0
- package/src/modes/theme/defaults/light-synthwave.json +98 -0
- package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
- package/src/modes/theme/defaults/light-wetland.json +91 -0
- package/src/modes/theme/defaults/light-zenith.json +89 -0
- package/src/modes/theme/defaults/limestone.json +94 -0
- package/src/modes/theme/defaults/mahogany.json +97 -0
- package/src/modes/theme/defaults/marble.json +93 -0
- package/src/modes/theme/defaults/obsidian.json +91 -0
- package/src/modes/theme/defaults/onyx.json +91 -0
- package/src/modes/theme/defaults/pearl.json +93 -0
- package/src/modes/theme/defaults/porcelain.json +91 -0
- package/src/modes/theme/defaults/quartz.json +96 -0
- package/src/modes/theme/defaults/sandstone.json +95 -0
- package/src/modes/theme/defaults/titanium.json +90 -0
- package/src/modes/theme/light.json +93 -0
- package/src/modes/theme/mermaid-cache.ts +111 -0
- package/src/modes/theme/theme-schema.json +429 -0
- package/src/modes/theme/theme.ts +2333 -0
- package/src/modes/types.ts +216 -0
- package/src/modes/utils/ui-helpers.ts +529 -0
- package/src/patch/applicator.ts +1482 -0
- package/src/patch/diff.ts +425 -0
- package/src/patch/fuzzy.ts +784 -0
- package/src/patch/hashline.ts +972 -0
- package/src/patch/index.ts +964 -0
- package/src/patch/normalize.ts +397 -0
- package/src/patch/normative.ts +72 -0
- package/src/patch/parser.ts +532 -0
- package/src/patch/shared.ts +400 -0
- package/src/patch/types.ts +292 -0
- package/src/priority.json +35 -0
- package/src/prompts/agents/explore.md +48 -0
- package/src/prompts/agents/frontmatter.md +9 -0
- package/src/prompts/agents/init.md +36 -0
- package/src/prompts/agents/librarian.md +53 -0
- package/src/prompts/agents/oracle.md +51 -0
- package/src/prompts/agents/reviewer.md +70 -0
- package/src/prompts/agents/task.md +14 -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 +64 -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/custom-system-prompt.md +68 -0
- package/src/prompts/system/file-operations.md +10 -0
- package/src/prompts/system/subagent-submit-reminder.md +11 -0
- package/src/prompts/system/subagent-system-prompt.md +31 -0
- package/src/prompts/system/subagent-user-prompt.md +8 -0
- package/src/prompts/system/summarization-system.md +3 -0
- package/src/prompts/system/system-prompt.md +300 -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 +44 -0
- package/src/prompts/tools/bash.md +24 -0
- package/src/prompts/tools/browser.md +33 -0
- package/src/prompts/tools/calculator.md +12 -0
- package/src/prompts/tools/explore.md +29 -0
- package/src/prompts/tools/fetch.md +16 -0
- package/src/prompts/tools/find.md +18 -0
- package/src/prompts/tools/gemini-image.md +23 -0
- package/src/prompts/tools/grep.md +28 -0
- package/src/prompts/tools/hashline.md +232 -0
- package/src/prompts/tools/librarian.md +24 -0
- package/src/prompts/tools/lsp.md +28 -0
- package/src/prompts/tools/oracle.md +26 -0
- package/src/prompts/tools/patch.md +74 -0
- package/src/prompts/tools/python.md +66 -0
- package/src/prompts/tools/read.md +36 -0
- package/src/prompts/tools/replace.md +38 -0
- package/src/prompts/tools/reviewer.md +41 -0
- package/src/prompts/tools/ssh.md +51 -0
- package/src/prompts/tools/task-summary.md +28 -0
- package/src/prompts/tools/task.md +275 -0
- package/src/prompts/tools/todo-write.md +65 -0
- package/src/prompts/tools/undo-edit.md +7 -0
- package/src/prompts/tools/web-search.md +19 -0
- package/src/prompts/tools/write.md +18 -0
- package/src/sdk.ts +1287 -0
- package/src/secrets/index.ts +116 -0
- package/src/secrets/obfuscator.ts +269 -0
- package/src/secrets/regex.ts +21 -0
- package/src/session/agent-session.ts +4669 -0
- package/src/session/agent-storage.ts +621 -0
- package/src/session/artifacts.ts +132 -0
- package/src/session/auth-storage.ts +1433 -0
- package/src/session/blob-store.ts +103 -0
- package/src/session/compaction/branch-summarization.ts +315 -0
- package/src/session/compaction/compaction.ts +864 -0
- package/src/session/compaction/index.ts +7 -0
- package/src/session/compaction/pruning.ts +91 -0
- package/src/session/compaction/utils.ts +171 -0
- package/src/session/history-storage.ts +170 -0
- package/src/session/messages.ts +317 -0
- package/src/session/session-manager.ts +2276 -0
- package/src/session/session-storage.ts +342 -0
- package/src/session/streaming-output.ts +565 -0
- package/src/slash-commands/builtin-registry.ts +439 -0
- package/src/ssh/config-writer.ts +183 -0
- package/src/ssh/connection-manager.ts +444 -0
- package/src/ssh/ssh-executor.ts +127 -0
- package/src/ssh/sshfs-mount.ts +135 -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 +685 -0
- package/src/task/agents.ts +155 -0
- package/src/task/batch.ts +102 -0
- package/src/task/commands.ts +134 -0
- package/src/task/discovery.ts +126 -0
- package/src/task/executor.ts +908 -0
- package/src/task/index.ts +223 -0
- package/src/task/output-manager.ts +107 -0
- package/src/task/parallel.ts +84 -0
- package/src/task/render.ts +326 -0
- package/src/task/subprocess-tool-registry.ts +88 -0
- package/src/task/template.ts +32 -0
- package/src/task/types.ts +144 -0
- package/src/tools/ask.ts +523 -0
- package/src/tools/bash-interactive.ts +419 -0
- package/src/tools/bash-interceptor.ts +105 -0
- package/src/tools/bash-normalize.ts +107 -0
- package/src/tools/bash-skill-urls.ts +177 -0
- package/src/tools/bash.ts +347 -0
- package/src/tools/browser.ts +1374 -0
- package/src/tools/calculator.ts +537 -0
- package/src/tools/context.ts +39 -0
- package/src/tools/explore.ts +23 -0
- package/src/tools/fetch.ts +1091 -0
- package/src/tools/find.ts +540 -0
- package/src/tools/fs-cache-invalidation.ts +28 -0
- package/src/tools/gemini-image.ts +907 -0
- package/src/tools/grep.ts +489 -0
- package/src/tools/index.ts +337 -0
- package/src/tools/json-tree.ts +231 -0
- package/src/tools/jtd-to-json-schema.ts +247 -0
- package/src/tools/jtd-to-typescript.ts +198 -0
- package/src/tools/librarian.ts +33 -0
- package/src/tools/list-limit.ts +40 -0
- package/src/tools/notebook.ts +287 -0
- package/src/tools/oracle.ts +40 -0
- package/src/tools/output-meta.ts +459 -0
- package/src/tools/output-utils.ts +63 -0
- package/src/tools/path-utils.ts +116 -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 +1118 -0
- package/src/tools/read.ts +1193 -0
- package/src/tools/render-utils.ts +680 -0
- package/src/tools/renderers.ts +60 -0
- package/src/tools/reviewer-tool.ts +41 -0
- package/src/tools/ssh.ts +326 -0
- package/src/tools/subagent-tool.ts +169 -0
- package/src/tools/submit-result.ts +152 -0
- package/src/tools/todo-write.ts +255 -0
- package/src/tools/tool-errors.ts +92 -0
- package/src/tools/tool-result.ts +86 -0
- package/src/tools/undo-edit.ts +145 -0
- package/src/tools/undo-history.ts +22 -0
- package/src/tools/write.ts +274 -0
- package/src/tui/code-cell.ts +108 -0
- package/src/tui/file-list.ts +47 -0
- package/src/tui/index.ts +11 -0
- package/src/tui/output-block.ts +144 -0
- package/src/tui/status-line.ts +39 -0
- package/src/tui/tree-list.ts +53 -0
- package/src/tui/types.ts +16 -0
- package/src/tui/utils.ts +116 -0
- package/src/utils/changelog.ts +98 -0
- package/src/utils/event-bus.ts +33 -0
- package/src/utils/external-editor.ts +59 -0
- package/src/utils/file-display-mode.ts +36 -0
- package/src/utils/file-mentions.ts +384 -0
- package/src/utils/frontmatter.ts +101 -0
- package/src/utils/fuzzy.ts +108 -0
- package/src/utils/ignore-files.ts +119 -0
- package/src/utils/image-convert.ts +27 -0
- package/src/utils/image-resize.ts +236 -0
- package/src/utils/mime.ts +30 -0
- package/src/utils/open.ts +20 -0
- package/src/utils/shell-snapshot.ts +199 -0
- package/src/utils/timings.ts +26 -0
- package/src/utils/title-generator.ts +167 -0
- package/src/utils/tools-manager.ts +362 -0
- package/src/web/scrapers/artifacthub.ts +215 -0
- package/src/web/scrapers/arxiv.ts +88 -0
- package/src/web/scrapers/aur.ts +175 -0
- package/src/web/scrapers/biorxiv.ts +141 -0
- package/src/web/scrapers/bluesky.ts +284 -0
- package/src/web/scrapers/brew.ts +177 -0
- package/src/web/scrapers/cheatsh.ts +78 -0
- package/src/web/scrapers/chocolatey.ts +158 -0
- package/src/web/scrapers/choosealicense.ts +110 -0
- package/src/web/scrapers/cisa-kev.ts +100 -0
- package/src/web/scrapers/clojars.ts +180 -0
- package/src/web/scrapers/coingecko.ts +184 -0
- package/src/web/scrapers/crates-io.ts +128 -0
- package/src/web/scrapers/crossref.ts +149 -0
- package/src/web/scrapers/devto.ts +177 -0
- package/src/web/scrapers/discogs.ts +307 -0
- package/src/web/scrapers/discourse.ts +221 -0
- package/src/web/scrapers/dockerhub.ts +160 -0
- package/src/web/scrapers/fdroid.ts +158 -0
- package/src/web/scrapers/firefox-addons.ts +214 -0
- package/src/web/scrapers/flathub.ts +239 -0
- package/src/web/scrapers/github-gist.ts +68 -0
- package/src/web/scrapers/github.ts +490 -0
- package/src/web/scrapers/gitlab.ts +456 -0
- package/src/web/scrapers/go-pkg.ts +275 -0
- package/src/web/scrapers/hackage.ts +94 -0
- package/src/web/scrapers/hackernews.ts +208 -0
- package/src/web/scrapers/hex.ts +121 -0
- package/src/web/scrapers/huggingface.ts +385 -0
- package/src/web/scrapers/iacr.ts +86 -0
- package/src/web/scrapers/index.ts +249 -0
- package/src/web/scrapers/jetbrains-marketplace.ts +169 -0
- package/src/web/scrapers/lemmy.ts +220 -0
- package/src/web/scrapers/lobsters.ts +186 -0
- package/src/web/scrapers/mastodon.ts +310 -0
- package/src/web/scrapers/maven.ts +152 -0
- package/src/web/scrapers/mdn.ts +172 -0
- package/src/web/scrapers/metacpan.ts +253 -0
- package/src/web/scrapers/musicbrainz.ts +272 -0
- package/src/web/scrapers/npm.ts +114 -0
- package/src/web/scrapers/nuget.ts +205 -0
- package/src/web/scrapers/nvd.ts +243 -0
- package/src/web/scrapers/ollama.ts +265 -0
- package/src/web/scrapers/open-vsx.ts +119 -0
- package/src/web/scrapers/opencorporates.ts +275 -0
- package/src/web/scrapers/openlibrary.ts +319 -0
- package/src/web/scrapers/orcid.ts +298 -0
- package/src/web/scrapers/osv.ts +192 -0
- package/src/web/scrapers/packagist.ts +174 -0
- package/src/web/scrapers/pub-dev.ts +185 -0
- package/src/web/scrapers/pubmed.ts +177 -0
- package/src/web/scrapers/pypi.ts +129 -0
- package/src/web/scrapers/rawg.ts +124 -0
- package/src/web/scrapers/readthedocs.ts +125 -0
- package/src/web/scrapers/reddit.ts +104 -0
- package/src/web/scrapers/repology.ts +262 -0
- package/src/web/scrapers/rfc.ts +209 -0
- package/src/web/scrapers/rubygems.ts +117 -0
- package/src/web/scrapers/searchcode.ts +217 -0
- package/src/web/scrapers/sec-edgar.ts +274 -0
- package/src/web/scrapers/semantic-scholar.ts +190 -0
- package/src/web/scrapers/snapcraft.ts +200 -0
- package/src/web/scrapers/sourcegraph.ts +373 -0
- package/src/web/scrapers/spdx.ts +121 -0
- package/src/web/scrapers/spotify.ts +217 -0
- package/src/web/scrapers/stackoverflow.ts +124 -0
- package/src/web/scrapers/terraform.ts +304 -0
- package/src/web/scrapers/tldr.ts +51 -0
- package/src/web/scrapers/twitter.ts +97 -0
- package/src/web/scrapers/types.ts +200 -0
- package/src/web/scrapers/utils.ts +142 -0
- package/src/web/scrapers/vimeo.ts +152 -0
- package/src/web/scrapers/vscode-marketplace.ts +195 -0
- package/src/web/scrapers/w3c.ts +163 -0
- package/src/web/scrapers/wikidata.ts +357 -0
- package/src/web/scrapers/wikipedia.ts +95 -0
- package/src/web/scrapers/youtube.ts +312 -0
- package/src/web/search/auth.ts +178 -0
- package/src/web/search/index.ts +598 -0
- package/src/web/search/provider.ts +77 -0
- package/src/web/search/providers/anthropic.ts +284 -0
- package/src/web/search/providers/base.ts +22 -0
- package/src/web/search/providers/brave.ts +165 -0
- package/src/web/search/providers/codex.ts +377 -0
- package/src/web/search/providers/exa.ts +158 -0
- package/src/web/search/providers/gemini.ts +437 -0
- package/src/web/search/providers/jina.ts +99 -0
- package/src/web/search/providers/kimi.ts +196 -0
- package/src/web/search/providers/perplexity.ts +546 -0
- package/src/web/search/providers/synthetic.ts +136 -0
- package/src/web/search/providers/zai.ts +352 -0
- package/src/web/search/render.ts +299 -0
- package/src/web/search/types.ts +437 -0
|
@@ -0,0 +1,598 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Web Search Tool
|
|
3
|
+
*
|
|
4
|
+
* Single tool supporting Anthropic, Perplexity, Exa, Brave, Jina, Kimi, Gemini, Codex, Z.AI, and Synthetic
|
|
5
|
+
* providers with provider-specific parameters exposed conditionally.
|
|
6
|
+
*
|
|
7
|
+
* When EXA_API_KEY is available, additional specialized tools are exposed:
|
|
8
|
+
* - web_search_deep: Natural language web search with synthesized results
|
|
9
|
+
* - web_search_code_context: Search code snippets, docs, and examples
|
|
10
|
+
* - web_search_crawl: Extract content from specific URLs
|
|
11
|
+
* - web_search_linkedin: Search LinkedIn profiles and companies
|
|
12
|
+
* - web_search_company: Comprehensive company research
|
|
13
|
+
*/
|
|
14
|
+
import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@nghyane/arcane-agent";
|
|
15
|
+
import { StringEnum } from "@nghyane/arcane-ai";
|
|
16
|
+
import { Type } from "@sinclair/typebox";
|
|
17
|
+
import { renderPromptTemplate } from "../../config/prompt-templates";
|
|
18
|
+
import { callExaTool, findApiKey as findExaKey, formatSearchResults, isSearchResponse } from "../../exa/mcp-client";
|
|
19
|
+
import { renderExaCall, renderExaResult } from "../../exa/render";
|
|
20
|
+
import type { ExaRenderDetails } from "../../exa/types";
|
|
21
|
+
import type { CustomTool, CustomToolContext, RenderResultOptions } from "../../extensibility/custom-tools/types";
|
|
22
|
+
import type { Theme } from "../../modes/theme/theme";
|
|
23
|
+
import webSearchSystemPrompt from "../../prompts/system/web-search.md" with { type: "text" };
|
|
24
|
+
import webSearchDescription from "../../prompts/tools/web-search.md" with { type: "text" };
|
|
25
|
+
import type { ToolSession } from "../../tools";
|
|
26
|
+
import { formatAge } from "../../tools/render-utils";
|
|
27
|
+
import { getSearchProvider, resolveProviderChain, type SearchProvider } from "./provider";
|
|
28
|
+
import { renderSearchCall, renderSearchResult, type SearchRenderDetails } from "./render";
|
|
29
|
+
import type { SearchResponse } from "./types";
|
|
30
|
+
import { SearchProviderError } from "./types";
|
|
31
|
+
|
|
32
|
+
/** Web search parameters schema */
|
|
33
|
+
export const webSearchSchema = Type.Object({
|
|
34
|
+
query: Type.String({ description: "Search query" }),
|
|
35
|
+
provider: Type.Optional(
|
|
36
|
+
StringEnum(
|
|
37
|
+
["auto", "exa", "brave", "jina", "kimi", "zai", "anthropic", "perplexity", "gemini", "codex", "synthetic"],
|
|
38
|
+
{
|
|
39
|
+
description: "Search provider (default: auto)",
|
|
40
|
+
},
|
|
41
|
+
),
|
|
42
|
+
),
|
|
43
|
+
recency: Type.Optional(
|
|
44
|
+
StringEnum(["day", "week", "month", "year"], {
|
|
45
|
+
description: "Recency filter (Brave, Perplexity)",
|
|
46
|
+
}),
|
|
47
|
+
),
|
|
48
|
+
limit: Type.Optional(Type.Number({ description: "Max results to return" })),
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
export type SearchParams = {
|
|
52
|
+
query: string;
|
|
53
|
+
provider?:
|
|
54
|
+
| "auto"
|
|
55
|
+
| "exa"
|
|
56
|
+
| "brave"
|
|
57
|
+
| "jina"
|
|
58
|
+
| "kimi"
|
|
59
|
+
| "zai"
|
|
60
|
+
| "anthropic"
|
|
61
|
+
| "perplexity"
|
|
62
|
+
| "gemini"
|
|
63
|
+
| "codex"
|
|
64
|
+
| "synthetic";
|
|
65
|
+
recency?: "day" | "week" | "month" | "year";
|
|
66
|
+
limit?: number;
|
|
67
|
+
/** Maximum output tokens. Defaults to 4096. */
|
|
68
|
+
max_tokens?: number;
|
|
69
|
+
/** Sampling temperature (0–1). Lower = more focused/factual. Defaults to 0.2. */
|
|
70
|
+
temperature?: number;
|
|
71
|
+
/** Number of search results to retrieve. Defaults to 10. */
|
|
72
|
+
num_search_results?: number;
|
|
73
|
+
/** Disable provider fallback when explicit provider is selected (CLI/debug use). */
|
|
74
|
+
no_fallback?: boolean;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
function formatProviderList(providers: SearchProvider[]): string {
|
|
78
|
+
return providers.map(provider => provider.label).join(", ");
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function formatProviderError(error: unknown, provider: SearchProvider): string {
|
|
82
|
+
if (error instanceof SearchProviderError) {
|
|
83
|
+
if (error.provider === "anthropic" && error.status === 404) {
|
|
84
|
+
return "Anthropic web search returned 404 (model or endpoint not found).";
|
|
85
|
+
}
|
|
86
|
+
if (error.status === 401 || error.status === 403) {
|
|
87
|
+
if (error.provider === "zai") {
|
|
88
|
+
return error.message;
|
|
89
|
+
}
|
|
90
|
+
return `${getSearchProvider(error.provider).label} authorization failed (${error.status}). Check API key or base URL.`;
|
|
91
|
+
}
|
|
92
|
+
return error.message;
|
|
93
|
+
}
|
|
94
|
+
if (error instanceof Error) return error.message;
|
|
95
|
+
return `Unknown error from ${provider.label}`;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Truncate text for tool output */
|
|
99
|
+
function truncateText(text: string, maxLen: number): string {
|
|
100
|
+
if (text.length <= maxLen) return text;
|
|
101
|
+
return `${text.slice(0, Math.max(0, maxLen - 1))}…`;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function formatCount(label: string, count: number): string {
|
|
105
|
+
return `${count} ${label}${count === 1 ? "" : "s"}`;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Format response for LLM consumption */
|
|
109
|
+
function formatForLLM(response: SearchResponse): string {
|
|
110
|
+
const parts: string[] = [];
|
|
111
|
+
|
|
112
|
+
parts.push("## Answer");
|
|
113
|
+
parts.push(response.answer ? response.answer : "No answer text returned.");
|
|
114
|
+
|
|
115
|
+
if (response.sources.length > 0) {
|
|
116
|
+
parts.push("\n## Sources");
|
|
117
|
+
parts.push(formatCount("source", response.sources.length));
|
|
118
|
+
for (const [i, src] of response.sources.entries()) {
|
|
119
|
+
const age = formatAge(src.ageSeconds) || src.publishedDate;
|
|
120
|
+
const agePart = age ? ` (${age})` : "";
|
|
121
|
+
parts.push(`[${i + 1}] ${src.title}${agePart}\n ${src.url}`);
|
|
122
|
+
if (src.snippet) {
|
|
123
|
+
parts.push(` ${truncateText(src.snippet, 240)}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
} else {
|
|
127
|
+
parts.push("\n## Sources");
|
|
128
|
+
parts.push("0 sources");
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (response.citations && response.citations.length > 0) {
|
|
132
|
+
parts.push("\n## Citations");
|
|
133
|
+
parts.push(formatCount("citation", response.citations.length));
|
|
134
|
+
for (const [i, citation] of response.citations.entries()) {
|
|
135
|
+
const title = citation.title || citation.url;
|
|
136
|
+
parts.push(`[${i + 1}] ${title}\n ${citation.url}`);
|
|
137
|
+
if (citation.citedText) {
|
|
138
|
+
parts.push(` ${truncateText(citation.citedText, 240)}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (response.relatedQuestions && response.relatedQuestions.length > 0) {
|
|
144
|
+
parts.push("\n## Related");
|
|
145
|
+
parts.push(formatCount("question", response.relatedQuestions.length));
|
|
146
|
+
for (const q of response.relatedQuestions) {
|
|
147
|
+
parts.push(`- ${q}`);
|
|
148
|
+
}
|
|
149
|
+
} else {
|
|
150
|
+
parts.push("\n## Related");
|
|
151
|
+
parts.push("0 questions");
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
parts.push("\n## Meta");
|
|
155
|
+
parts.push(`Provider: ${response.provider}`);
|
|
156
|
+
if (response.model) {
|
|
157
|
+
parts.push(`Model: ${response.model}`);
|
|
158
|
+
}
|
|
159
|
+
if (response.usage) {
|
|
160
|
+
const usageParts: string[] = [];
|
|
161
|
+
if (response.usage.inputTokens !== undefined) usageParts.push(`in ${response.usage.inputTokens}`);
|
|
162
|
+
if (response.usage.outputTokens !== undefined) usageParts.push(`out ${response.usage.outputTokens}`);
|
|
163
|
+
if (response.usage.totalTokens !== undefined) usageParts.push(`total ${response.usage.totalTokens}`);
|
|
164
|
+
if (response.usage.searchRequests !== undefined) usageParts.push(`search ${response.usage.searchRequests}`);
|
|
165
|
+
if (usageParts.length > 0) {
|
|
166
|
+
parts.push(`Usage: ${usageParts.join(" | ")}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (response.requestId) {
|
|
170
|
+
parts.push(`Request: ${truncateText(response.requestId, 64)}`);
|
|
171
|
+
}
|
|
172
|
+
if (response.searchQueries && response.searchQueries.length > 0) {
|
|
173
|
+
parts.push(`Search queries: ${response.searchQueries.length}`);
|
|
174
|
+
for (const query of response.searchQueries.slice(0, 3)) {
|
|
175
|
+
parts.push(`- ${truncateText(query, 120)}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return parts.join("\n");
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** Execute web search */
|
|
183
|
+
async function executeSearch(
|
|
184
|
+
_toolCallId: string,
|
|
185
|
+
params: SearchParams,
|
|
186
|
+
): Promise<{ content: Array<{ type: "text"; text: string }>; details: SearchRenderDetails }> {
|
|
187
|
+
const providers =
|
|
188
|
+
params.provider && params.provider !== "auto" && params.no_fallback
|
|
189
|
+
? (await getSearchProvider(params.provider).isAvailable())
|
|
190
|
+
? [getSearchProvider(params.provider)]
|
|
191
|
+
: []
|
|
192
|
+
: await resolveProviderChain(params.provider);
|
|
193
|
+
|
|
194
|
+
if (providers.length === 0) {
|
|
195
|
+
const message = "No web search provider configured.";
|
|
196
|
+
return {
|
|
197
|
+
content: [{ type: "text" as const, text: `Error: ${message}` }],
|
|
198
|
+
details: { response: { provider: "none", sources: [] }, error: message },
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
let lastError: unknown;
|
|
203
|
+
let lastProvider = providers[0];
|
|
204
|
+
|
|
205
|
+
for (const provider of providers) {
|
|
206
|
+
lastProvider = provider;
|
|
207
|
+
try {
|
|
208
|
+
const response = await provider.search({
|
|
209
|
+
query: params.query.replace(/202\d/g, String(new Date().getFullYear())), // LUL
|
|
210
|
+
limit: params.limit,
|
|
211
|
+
recency: params.recency,
|
|
212
|
+
systemPrompt: webSearchSystemPrompt,
|
|
213
|
+
maxOutputTokens: params.max_tokens,
|
|
214
|
+
numSearchResults: params.num_search_results,
|
|
215
|
+
temperature: params.temperature,
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
const text = formatForLLM(response);
|
|
219
|
+
|
|
220
|
+
return {
|
|
221
|
+
content: [{ type: "text" as const, text }],
|
|
222
|
+
details: { response },
|
|
223
|
+
};
|
|
224
|
+
} catch (error) {
|
|
225
|
+
lastError = error;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const baseMessage = formatProviderError(lastError, lastProvider);
|
|
230
|
+
const message =
|
|
231
|
+
providers.length > 1
|
|
232
|
+
? `All web search providers failed (${formatProviderList(providers)}). Last error: ${baseMessage}`
|
|
233
|
+
: baseMessage;
|
|
234
|
+
|
|
235
|
+
return {
|
|
236
|
+
content: [{ type: "text" as const, text: `Error: ${message}` }],
|
|
237
|
+
details: { response: { provider: lastProvider.id, sources: [] }, error: message },
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Execute a web search query for CLI/testing workflows.
|
|
243
|
+
*/
|
|
244
|
+
export async function runSearchQuery(
|
|
245
|
+
params: SearchParams,
|
|
246
|
+
): Promise<{ content: Array<{ type: "text"; text: string }>; details: SearchRenderDetails }> {
|
|
247
|
+
return executeSearch("cli-web-search", params);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Web search tool implementation.
|
|
252
|
+
*
|
|
253
|
+
* Supports Anthropic, Perplexity, Exa, Brave, Jina, Kimi, Gemini, Codex, Z.AI, and Synthetic providers with automatic fallback.
|
|
254
|
+
* Session is accepted for interface consistency but not used.
|
|
255
|
+
*/
|
|
256
|
+
export class SearchTool implements AgentTool<typeof webSearchSchema, SearchRenderDetails> {
|
|
257
|
+
readonly name = "web_search";
|
|
258
|
+
readonly label = "Web Search";
|
|
259
|
+
readonly description: string;
|
|
260
|
+
readonly parameters = webSearchSchema;
|
|
261
|
+
|
|
262
|
+
constructor(_session: ToolSession) {
|
|
263
|
+
this.description = renderPromptTemplate(webSearchDescription);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
async execute(
|
|
267
|
+
_toolCallId: string,
|
|
268
|
+
params: SearchParams,
|
|
269
|
+
_signal?: AbortSignal,
|
|
270
|
+
_onUpdate?: AgentToolUpdateCallback<SearchRenderDetails>,
|
|
271
|
+
_context?: AgentToolContext,
|
|
272
|
+
): Promise<AgentToolResult<SearchRenderDetails>> {
|
|
273
|
+
return executeSearch(_toolCallId, params);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/** Web search tool as CustomTool (for TUI rendering support) */
|
|
278
|
+
export const webSearchCustomTool: CustomTool<typeof webSearchSchema, SearchRenderDetails> = {
|
|
279
|
+
name: "web_search",
|
|
280
|
+
label: "Web Search",
|
|
281
|
+
description: renderPromptTemplate(webSearchDescription),
|
|
282
|
+
parameters: webSearchSchema,
|
|
283
|
+
|
|
284
|
+
async execute(toolCallId: string, params: SearchParams, _onUpdate, _ctx: CustomToolContext, _signal?: AbortSignal) {
|
|
285
|
+
return executeSearch(toolCallId, params);
|
|
286
|
+
},
|
|
287
|
+
|
|
288
|
+
renderCall(args: SearchParams, options: RenderResultOptions, theme: Theme) {
|
|
289
|
+
return renderSearchCall(args, options, theme);
|
|
290
|
+
},
|
|
291
|
+
|
|
292
|
+
renderResult(result, options: RenderResultOptions, theme: Theme) {
|
|
293
|
+
return renderSearchResult(result, options, theme);
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
// ============================================================================
|
|
298
|
+
// Exa-specific tools (available when EXA_API_KEY is present)
|
|
299
|
+
// ============================================================================
|
|
300
|
+
|
|
301
|
+
/** Schema for deep search */
|
|
302
|
+
const webSearchDeepSchema = Type.Object({
|
|
303
|
+
query: Type.String({ description: "Research query" }),
|
|
304
|
+
type: Type.Optional(
|
|
305
|
+
StringEnum(["keyword", "neural", "auto"], {
|
|
306
|
+
description: "Search type - neural (semantic), keyword (exact), or auto",
|
|
307
|
+
}),
|
|
308
|
+
),
|
|
309
|
+
include_domains: Type.Optional(
|
|
310
|
+
Type.Array(Type.String(), { description: "Only include results from these domains" }),
|
|
311
|
+
),
|
|
312
|
+
exclude_domains: Type.Optional(Type.Array(Type.String(), { description: "Exclude results from these domains" })),
|
|
313
|
+
start_published_date: Type.Optional(
|
|
314
|
+
Type.String({ description: "Filter results published after this date (ISO 8601)" }),
|
|
315
|
+
),
|
|
316
|
+
end_published_date: Type.Optional(
|
|
317
|
+
Type.String({ description: "Filter results published before this date (ISO 8601)" }),
|
|
318
|
+
),
|
|
319
|
+
num_results: Type.Optional(
|
|
320
|
+
Type.Number({ description: "Maximum results (default: 10, max: 100)", minimum: 1, maximum: 100 }),
|
|
321
|
+
),
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
/** Schema for code context search */
|
|
325
|
+
const webSearchCodeContextSchema = Type.Object({
|
|
326
|
+
query: Type.String({ description: "Code or technical search query" }),
|
|
327
|
+
code_context: Type.Optional(Type.String({ description: "Additional context about what you're looking for" })),
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
/** Schema for URL crawling */
|
|
331
|
+
const webSearchCrawlSchema = Type.Object({
|
|
332
|
+
url: Type.String({ description: "URL to crawl and extract content from" }),
|
|
333
|
+
text: Type.Optional(Type.Boolean({ description: "Include full page text content (default: false)" })),
|
|
334
|
+
highlights: Type.Optional(Type.Boolean({ description: "Include highlighted relevant snippets (default: false)" })),
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
/** Schema for LinkedIn search */
|
|
338
|
+
const webSearchLinkedinSchema = Type.Object({
|
|
339
|
+
query: Type.String({ description: 'LinkedIn search query (e.g., "Software Engineer at OpenAI")' }),
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
/** Schema for company research */
|
|
343
|
+
const webSearchCompanySchema = Type.Object({
|
|
344
|
+
company_name: Type.String({ description: "Name of the company to research" }),
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
/** Helper to execute Exa tool and format response */
|
|
348
|
+
async function executeExaTool(
|
|
349
|
+
mcpToolName: string,
|
|
350
|
+
params: Record<string, unknown>,
|
|
351
|
+
toolName: string,
|
|
352
|
+
): Promise<{ content: Array<{ type: "text"; text: string }>; details: ExaRenderDetails }> {
|
|
353
|
+
try {
|
|
354
|
+
const apiKey = await findExaKey();
|
|
355
|
+
if (!apiKey) {
|
|
356
|
+
return {
|
|
357
|
+
content: [{ type: "text" as const, text: "Error: EXA_API_KEY not found" }],
|
|
358
|
+
details: { error: "EXA_API_KEY not found", toolName },
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
const response = await callExaTool(mcpToolName, params, apiKey);
|
|
363
|
+
|
|
364
|
+
if (isSearchResponse(response)) {
|
|
365
|
+
const formatted = formatSearchResults(response);
|
|
366
|
+
return {
|
|
367
|
+
content: [{ type: "text" as const, text: formatted }],
|
|
368
|
+
details: { response, toolName },
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
return {
|
|
373
|
+
content: [{ type: "text" as const, text: JSON.stringify(response, null, 2) }],
|
|
374
|
+
details: { raw: response, toolName },
|
|
375
|
+
};
|
|
376
|
+
} catch (error) {
|
|
377
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
378
|
+
return {
|
|
379
|
+
content: [{ type: "text" as const, text: `Error: ${message}` }],
|
|
380
|
+
details: { error: message, toolName },
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/** Deep search - AI-synthesized research with multiple sources */
|
|
386
|
+
export const webSearchDeepTool: CustomTool<typeof webSearchDeepSchema, ExaRenderDetails> = {
|
|
387
|
+
name: "web_search_deep",
|
|
388
|
+
label: "Deep Search",
|
|
389
|
+
description: `Natural language web search with synthesized results (requires Exa).
|
|
390
|
+
|
|
391
|
+
Performs AI-powered deep research that synthesizes information from multiple sources.
|
|
392
|
+
Best for complex research queries that need comprehensive answers.
|
|
393
|
+
|
|
394
|
+
Parameters:
|
|
395
|
+
- query: Research query (required)
|
|
396
|
+
- type: Search type - neural (semantic), keyword (exact), or auto
|
|
397
|
+
- include_domains/exclude_domains: Domain filters
|
|
398
|
+
- start/end_published_date: Date range filter (ISO 8601)
|
|
399
|
+
- num_results: Maximum results (default: 10)`,
|
|
400
|
+
parameters: webSearchDeepSchema,
|
|
401
|
+
|
|
402
|
+
async execute(_toolCallId, params, _onUpdate, _ctx, _signal) {
|
|
403
|
+
const { num_results, ...rest } = params as Record<string, unknown>;
|
|
404
|
+
const args = { ...rest, type: "deep", numResults: num_results ?? 10 };
|
|
405
|
+
return executeExaTool("web_search_exa", args, "web_search_deep");
|
|
406
|
+
},
|
|
407
|
+
|
|
408
|
+
renderCall(args, _options, theme) {
|
|
409
|
+
return renderExaCall(args as Record<string, unknown>, "Deep Search", theme);
|
|
410
|
+
},
|
|
411
|
+
|
|
412
|
+
renderResult(result, options, theme) {
|
|
413
|
+
return renderExaResult(result, options, theme);
|
|
414
|
+
},
|
|
415
|
+
};
|
|
416
|
+
|
|
417
|
+
/** Code context search - optimized for code snippets and documentation */
|
|
418
|
+
export const webSearchCodeContextTool: CustomTool<typeof webSearchCodeContextSchema, ExaRenderDetails> = {
|
|
419
|
+
name: "web_search_code_context",
|
|
420
|
+
label: "Code Search",
|
|
421
|
+
description: `Search code snippets, documentation, and technical examples (requires Exa).
|
|
422
|
+
|
|
423
|
+
Optimized for finding:
|
|
424
|
+
- Code examples and snippets
|
|
425
|
+
- API documentation
|
|
426
|
+
- Technical tutorials
|
|
427
|
+
- Stack Overflow answers
|
|
428
|
+
- GitHub code references
|
|
429
|
+
|
|
430
|
+
Parameters:
|
|
431
|
+
- query: Code or technical search query (required)
|
|
432
|
+
- code_context: Additional context about what you're looking for`,
|
|
433
|
+
parameters: webSearchCodeContextSchema,
|
|
434
|
+
|
|
435
|
+
async execute(_toolCallId, params, _onUpdate, _ctx, _signal) {
|
|
436
|
+
return executeExaTool("get_code_context_exa", params as Record<string, unknown>, "web_search_code_context");
|
|
437
|
+
},
|
|
438
|
+
|
|
439
|
+
renderCall(args, _options, theme) {
|
|
440
|
+
return renderExaCall(args as Record<string, unknown>, "Code Search", theme);
|
|
441
|
+
},
|
|
442
|
+
|
|
443
|
+
renderResult(result, options, theme) {
|
|
444
|
+
return renderExaResult(result, options, theme);
|
|
445
|
+
},
|
|
446
|
+
};
|
|
447
|
+
|
|
448
|
+
/** URL crawl - extract content from specific URLs */
|
|
449
|
+
export const webSearchCrawlTool: CustomTool<typeof webSearchCrawlSchema, ExaRenderDetails> = {
|
|
450
|
+
name: "web_search_crawl",
|
|
451
|
+
label: "Crawl URL",
|
|
452
|
+
description: `Extract content from a specific URL (requires Exa).
|
|
453
|
+
|
|
454
|
+
Fetches and extracts content from a URL with optional text and highlights.
|
|
455
|
+
Useful when you have a specific URL and want its content.
|
|
456
|
+
|
|
457
|
+
Parameters:
|
|
458
|
+
- url: URL to crawl (required)
|
|
459
|
+
- text: Include full page text content (default: false)
|
|
460
|
+
- highlights: Include highlighted snippets (default: false)`,
|
|
461
|
+
parameters: webSearchCrawlSchema,
|
|
462
|
+
|
|
463
|
+
async execute(_toolCallId, params, _onUpdate, _ctx, _signal) {
|
|
464
|
+
return executeExaTool("crawling", params as Record<string, unknown>, "web_search_crawl");
|
|
465
|
+
},
|
|
466
|
+
|
|
467
|
+
renderCall(args, _options, theme) {
|
|
468
|
+
const url = (args as { url: string }).url;
|
|
469
|
+
return renderExaCall({ query: url }, "Crawl URL", theme);
|
|
470
|
+
},
|
|
471
|
+
|
|
472
|
+
renderResult(result, options, theme) {
|
|
473
|
+
return renderExaResult(result, options, theme);
|
|
474
|
+
},
|
|
475
|
+
};
|
|
476
|
+
|
|
477
|
+
/** LinkedIn search - search LinkedIn profiles and companies */
|
|
478
|
+
export const webSearchLinkedinTool: CustomTool<typeof webSearchLinkedinSchema, ExaRenderDetails> = {
|
|
479
|
+
name: "web_search_linkedin",
|
|
480
|
+
label: "LinkedIn Search",
|
|
481
|
+
description: `Search LinkedIn for people, companies, and professional content (requires Exa + LinkedIn addon).
|
|
482
|
+
|
|
483
|
+
Returns LinkedIn profiles, company pages, posts, and professional content.
|
|
484
|
+
|
|
485
|
+
Examples:
|
|
486
|
+
- "Software Engineer at OpenAI"
|
|
487
|
+
- "Y Combinator companies"
|
|
488
|
+
- "CEO fintech startup San Francisco"
|
|
489
|
+
|
|
490
|
+
Parameters:
|
|
491
|
+
- query: LinkedIn search query (required)`,
|
|
492
|
+
parameters: webSearchLinkedinSchema,
|
|
493
|
+
|
|
494
|
+
async execute(_toolCallId, params, _onUpdate, _ctx, _signal) {
|
|
495
|
+
return executeExaTool("linkedin_search", params as Record<string, unknown>, "web_search_linkedin");
|
|
496
|
+
},
|
|
497
|
+
|
|
498
|
+
renderCall(args, _options, theme) {
|
|
499
|
+
return renderExaCall(args as Record<string, unknown>, "LinkedIn Search", theme);
|
|
500
|
+
},
|
|
501
|
+
|
|
502
|
+
renderResult(result, options, theme) {
|
|
503
|
+
return renderExaResult(result, options, theme);
|
|
504
|
+
},
|
|
505
|
+
};
|
|
506
|
+
|
|
507
|
+
/** Company research - comprehensive company information */
|
|
508
|
+
export const webSearchCompanyTool: CustomTool<typeof webSearchCompanySchema, ExaRenderDetails> = {
|
|
509
|
+
name: "web_search_company",
|
|
510
|
+
label: "Company Research",
|
|
511
|
+
description: `Comprehensive company research (requires Exa + Company addon).
|
|
512
|
+
|
|
513
|
+
Returns detailed company information including:
|
|
514
|
+
- Company overview and description
|
|
515
|
+
- Recent news and announcements
|
|
516
|
+
- Key people and leadership
|
|
517
|
+
- Funding and financial information
|
|
518
|
+
- Products and services
|
|
519
|
+
|
|
520
|
+
Parameters:
|
|
521
|
+
- company_name: Name of the company to research (required)`,
|
|
522
|
+
parameters: webSearchCompanySchema,
|
|
523
|
+
|
|
524
|
+
async execute(_toolCallId, params, _onUpdate, _ctx, _signal) {
|
|
525
|
+
return executeExaTool("company_research", params as Record<string, unknown>, "web_search_company");
|
|
526
|
+
},
|
|
527
|
+
|
|
528
|
+
renderCall(args, _options, theme) {
|
|
529
|
+
const name = (args as { company_name: string }).company_name;
|
|
530
|
+
return renderExaCall({ query: name }, "Company Research", theme);
|
|
531
|
+
},
|
|
532
|
+
|
|
533
|
+
renderResult(result, options, theme) {
|
|
534
|
+
return renderExaResult(result, options, theme);
|
|
535
|
+
},
|
|
536
|
+
};
|
|
537
|
+
|
|
538
|
+
/** All Exa-specific web search tools */
|
|
539
|
+
export const exaSearchTools: CustomTool<any, ExaRenderDetails>[] = [
|
|
540
|
+
webSearchDeepTool,
|
|
541
|
+
webSearchCodeContextTool,
|
|
542
|
+
webSearchCrawlTool,
|
|
543
|
+
];
|
|
544
|
+
|
|
545
|
+
/** LinkedIn-specific tool (requires LinkedIn addon on Exa account) */
|
|
546
|
+
export const linkedinSearchTools: CustomTool<any, ExaRenderDetails>[] = [webSearchLinkedinTool];
|
|
547
|
+
|
|
548
|
+
/** Company-specific tool (requires Company addon on Exa account) */
|
|
549
|
+
export const companySearchTools: CustomTool<any, ExaRenderDetails>[] = [webSearchCompanyTool];
|
|
550
|
+
|
|
551
|
+
export interface SearchToolsOptions {
|
|
552
|
+
/** Enable LinkedIn search tool (requires Exa LinkedIn addon) */
|
|
553
|
+
enableLinkedin?: boolean;
|
|
554
|
+
/** Enable company research tool (requires Exa Company addon) */
|
|
555
|
+
enableCompany?: boolean;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
/**
|
|
559
|
+
* Get all available web search tools based on API key availability.
|
|
560
|
+
*
|
|
561
|
+
* Returns:
|
|
562
|
+
* - Always: web_search (unified, works with Anthropic/Perplexity/Exa)
|
|
563
|
+
* - With EXA_API_KEY: web_search_deep, web_search_code_context, web_search_crawl
|
|
564
|
+
* - With EXA_API_KEY + options.enableLinkedin: web_search_linkedin
|
|
565
|
+
* - With EXA_API_KEY + options.enableCompany: web_search_company
|
|
566
|
+
*/
|
|
567
|
+
export async function getSearchTools(options: SearchToolsOptions = {}): Promise<CustomTool<any, any>[]> {
|
|
568
|
+
const tools: CustomTool<any, any>[] = [webSearchCustomTool];
|
|
569
|
+
|
|
570
|
+
// Check for Exa API key
|
|
571
|
+
const exaKey = await findExaKey();
|
|
572
|
+
if (exaKey) {
|
|
573
|
+
tools.push(...exaSearchTools);
|
|
574
|
+
|
|
575
|
+
if (options.enableLinkedin) {
|
|
576
|
+
tools.push(...linkedinSearchTools);
|
|
577
|
+
}
|
|
578
|
+
if (options.enableCompany) {
|
|
579
|
+
tools.push(...companySearchTools);
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
return tools;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
/**
|
|
587
|
+
* Check if Exa-specific web search tools are available.
|
|
588
|
+
*/
|
|
589
|
+
export async function hasExaSearch(): Promise<boolean> {
|
|
590
|
+
const exaKey = await findExaKey();
|
|
591
|
+
return exaKey !== null;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
export {
|
|
595
|
+
getSearchProvider,
|
|
596
|
+
setPreferredSearchProvider,
|
|
597
|
+
} from "./provider";
|
|
598
|
+
export type { SearchProviderId as SearchProvider, SearchResponse } from "./types";
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { AnthropicProvider } from "./providers/anthropic";
|
|
2
|
+
import type { SearchProvider } from "./providers/base";
|
|
3
|
+
import { BraveProvider } from "./providers/brave";
|
|
4
|
+
import { CodexProvider } from "./providers/codex";
|
|
5
|
+
import { ExaProvider } from "./providers/exa";
|
|
6
|
+
import { GeminiProvider } from "./providers/gemini";
|
|
7
|
+
import { JinaProvider } from "./providers/jina";
|
|
8
|
+
import { KimiProvider } from "./providers/kimi";
|
|
9
|
+
import { PerplexityProvider } from "./providers/perplexity";
|
|
10
|
+
import { SyntheticProvider } from "./providers/synthetic";
|
|
11
|
+
import { ZaiProvider } from "./providers/zai";
|
|
12
|
+
import type { SearchProviderId } from "./types";
|
|
13
|
+
|
|
14
|
+
export type { SearchParams } from "./providers/base";
|
|
15
|
+
export { SearchProvider } from "./providers/base";
|
|
16
|
+
|
|
17
|
+
const SEARCH_PROVIDERS: Record<SearchProviderId, SearchProvider> = {
|
|
18
|
+
exa: new ExaProvider(),
|
|
19
|
+
brave: new BraveProvider(),
|
|
20
|
+
jina: new JinaProvider(),
|
|
21
|
+
perplexity: new PerplexityProvider(),
|
|
22
|
+
kimi: new KimiProvider(),
|
|
23
|
+
zai: new ZaiProvider(),
|
|
24
|
+
anthropic: new AnthropicProvider(),
|
|
25
|
+
gemini: new GeminiProvider(),
|
|
26
|
+
codex: new CodexProvider(),
|
|
27
|
+
synthetic: new SyntheticProvider(),
|
|
28
|
+
} as const;
|
|
29
|
+
|
|
30
|
+
export const SEARCH_PROVIDER_ORDER: SearchProviderId[] = [
|
|
31
|
+
"perplexity",
|
|
32
|
+
"exa",
|
|
33
|
+
"brave",
|
|
34
|
+
"jina",
|
|
35
|
+
"kimi",
|
|
36
|
+
"anthropic",
|
|
37
|
+
"gemini",
|
|
38
|
+
"codex",
|
|
39
|
+
"zai",
|
|
40
|
+
"synthetic",
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
export function getSearchProvider(provider: SearchProviderId): SearchProvider {
|
|
44
|
+
return SEARCH_PROVIDERS[provider];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Preferred provider set via settings (default: auto) */
|
|
48
|
+
let preferredProvId: SearchProviderId | "auto" = "auto";
|
|
49
|
+
|
|
50
|
+
/** Set the preferred web search provider from settings */
|
|
51
|
+
export function setPreferredSearchProvider(provider: SearchProviderId | "auto"): void {
|
|
52
|
+
preferredProvId = provider;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Determine which providers are configured (priority: Perplexity → Exa → Brave → Jina → Kimi → Anthropic → Gemini → Codex → Z.AI → Synthetic) */
|
|
56
|
+
export async function resolveProviderChain(
|
|
57
|
+
preferredProvider: SearchProviderId | "auto" = preferredProvId,
|
|
58
|
+
): Promise<SearchProvider[]> {
|
|
59
|
+
const providers: SearchProvider[] = [];
|
|
60
|
+
|
|
61
|
+
if (preferredProvider !== "auto") {
|
|
62
|
+
if (await getSearchProvider(preferredProvider).isAvailable()) {
|
|
63
|
+
providers.push(getSearchProvider(preferredProvider));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
for (const id of SEARCH_PROVIDER_ORDER) {
|
|
68
|
+
if (id === preferredProvider) continue;
|
|
69
|
+
|
|
70
|
+
const provider = getSearchProvider(id);
|
|
71
|
+
if (await provider.isAvailable()) {
|
|
72
|
+
providers.push(provider);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return providers;
|
|
77
|
+
}
|