@travisennis/acai 0.0.1
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/.acai/acai.json +9 -0
- package/.acai/prompts/add-openrouter-model.md +13 -0
- package/.acai/prompts/project-status.md +4 -0
- package/.acai/prompts/update-architecture-document.md +9 -0
- package/.acai/rules/learned-rules.md +9 -0
- package/.ai/docs/available-tools.txt +3 -0
- package/.ai/docs/cognitive_complexity_refactoring_progress.md +65 -0
- package/.ai/docs/deleted_tools.md +168 -0
- package/.ai/docs/deleted_tools_88ced9ef.md +56 -0
- package/.ai/docs/image-pasting.md +46 -0
- package/.ai/docs/initialize-app.md +117 -0
- package/.ai/docs/issue-4-plan.md +44 -0
- package/.ai/docs/marked-renderer-debug.md +15 -0
- package/.ai/docs/marked-renderer-refactor-plan.md +64 -0
- package/.ai/docs/memory-use-cases.md +55 -0
- package/.ai/docs/prompt-consistency.md +31 -0
- package/.ai/docs/refactoring-tools.md +98 -0
- package/.ai/docs/system-prompt-update.md +174 -0
- package/.ai/docs/system_prompt.txt +210 -0
- package/.ai/docs/tasks.md +49 -0
- package/.ai/plan.md +131 -0
- package/.ai/prompt.md +1 -0
- package/.ai/scripts/fetch_models.js +27 -0
- package/.ai/scripts/generateSystemPrompt.ts +15 -0
- package/.ai/scripts/list-tools.mjs +4 -0
- package/.ai/scripts/p5_geometric_shapes.js +149 -0
- package/.husky/commit-msg +1 -0
- package/.husky/pre-commit +3 -0
- package/.husky/pre-push +1 -0
- package/.ignore +4 -0
- package/AGENTS.md +25 -0
- package/ARCHITECTURE.md +304 -0
- package/LICENSE +21 -0
- package/README.md +392 -0
- package/TODO.md +2 -0
- package/biome.json +61 -0
- package/commitlint.config.js +3 -0
- package/dist/cli.d.ts +19 -0
- package/dist/cli.js +116 -0
- package/dist/commands/application-log-command.d.ts +2 -0
- package/dist/commands/application-log-command.js +43 -0
- package/dist/commands/clear-command.d.ts +2 -0
- package/dist/commands/clear-command.js +12 -0
- package/dist/commands/compact-command.d.ts +2 -0
- package/dist/commands/compact-command.js +51 -0
- package/dist/commands/copy-command.d.ts +2 -0
- package/dist/commands/copy-command.js +51 -0
- package/dist/commands/edit-command.d.ts +2 -0
- package/dist/commands/edit-command.js +53 -0
- package/dist/commands/edit-prompt-command.d.ts +2 -0
- package/dist/commands/edit-prompt-command.js +25 -0
- package/dist/commands/exit-command.d.ts +2 -0
- package/dist/commands/exit-command.js +14 -0
- package/dist/commands/files-command.d.ts +2 -0
- package/dist/commands/files-command.js +63 -0
- package/dist/commands/generate-rules-command.d.ts +2 -0
- package/dist/commands/generate-rules-command.js +61 -0
- package/dist/commands/help-command.d.ts +2 -0
- package/dist/commands/help-command.js +19 -0
- package/dist/commands/init-command.d.ts +2 -0
- package/dist/commands/init-command.js +40 -0
- package/dist/commands/last-log-command.d.ts +2 -0
- package/dist/commands/last-log-command.js +76 -0
- package/dist/commands/manager.d.ts +22 -0
- package/dist/commands/manager.js +123 -0
- package/dist/commands/model-command.d.ts +2 -0
- package/dist/commands/model-command.js +84 -0
- package/dist/commands/paste-command.d.ts +2 -0
- package/dist/commands/paste-command.js +40 -0
- package/dist/commands/prompt-command.d.ts +2 -0
- package/dist/commands/prompt-command.js +111 -0
- package/dist/commands/reset-command.d.ts +2 -0
- package/dist/commands/reset-command.js +16 -0
- package/dist/commands/rules-command.d.ts +2 -0
- package/dist/commands/rules-command.js +68 -0
- package/dist/commands/save-command.d.ts +2 -0
- package/dist/commands/save-command.js +14 -0
- package/dist/commands/types.d.ts +26 -0
- package/dist/commands/types.js +1 -0
- package/dist/commands/usage-command.d.ts +2 -0
- package/dist/commands/usage-command.js +21 -0
- package/dist/config.d.ts +60 -0
- package/dist/config.js +193 -0
- package/dist/conversation-analyzer.d.ts +10 -0
- package/dist/conversation-analyzer.js +88 -0
- package/dist/dedent.d.ts +3 -0
- package/dist/dedent.js +38 -0
- package/dist/formatting.d.ts +17 -0
- package/dist/formatting.js +103 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +213 -0
- package/dist/logger.d.ts +2 -0
- package/dist/logger.js +24 -0
- package/dist/mentions.d.ts +9 -0
- package/dist/mentions.js +182 -0
- package/dist/messages.d.ts +69 -0
- package/dist/messages.js +261 -0
- package/dist/middleware/audit-message.d.ts +5 -0
- package/dist/middleware/audit-message.js +95 -0
- package/dist/middleware/index.d.ts +2 -0
- package/dist/middleware/index.js +2 -0
- package/dist/middleware/rate-limit.d.ts +4 -0
- package/dist/middleware/rate-limit.js +17 -0
- package/dist/models/ai-config.d.ts +12 -0
- package/dist/models/ai-config.js +87 -0
- package/dist/models/anthropic-provider.d.ts +25 -0
- package/dist/models/anthropic-provider.js +184 -0
- package/dist/models/deepseek-provider.d.ts +20 -0
- package/dist/models/deepseek-provider.js +42 -0
- package/dist/models/google-provider.d.ts +19 -0
- package/dist/models/google-provider.js +56 -0
- package/dist/models/manager.d.ts +15 -0
- package/dist/models/manager.js +48 -0
- package/dist/models/openai-provider.d.ts +22 -0
- package/dist/models/openai-provider.js +70 -0
- package/dist/models/openrouter-provider.d.ts +36 -0
- package/dist/models/openrouter-provider.js +276 -0
- package/dist/models/providers.d.ts +33 -0
- package/dist/models/providers.js +116 -0
- package/dist/models/xai-provider.d.ts +20 -0
- package/dist/models/xai-provider.js +47 -0
- package/dist/parsing.d.ts +2 -0
- package/dist/parsing.js +18 -0
- package/dist/prompts/manager.d.ts +19 -0
- package/dist/prompts/manager.js +71 -0
- package/dist/prompts.d.ts +4 -0
- package/dist/prompts.js +158 -0
- package/dist/repl-prompt.d.ts +14 -0
- package/dist/repl-prompt.js +147 -0
- package/dist/repl.d.ts +27 -0
- package/dist/repl.js +431 -0
- package/dist/source/cli.d.ts +19 -0
- package/dist/source/cli.js +116 -0
- package/dist/source/commands/application-log-command.d.ts +2 -0
- package/dist/source/commands/application-log-command.js +43 -0
- package/dist/source/commands/clear-command.d.ts +2 -0
- package/dist/source/commands/clear-command.js +12 -0
- package/dist/source/commands/compact-command.d.ts +2 -0
- package/dist/source/commands/compact-command.js +51 -0
- package/dist/source/commands/copy-command.d.ts +2 -0
- package/dist/source/commands/copy-command.js +51 -0
- package/dist/source/commands/edit-command.d.ts +2 -0
- package/dist/source/commands/edit-command.js +53 -0
- package/dist/source/commands/edit-prompt-command.d.ts +2 -0
- package/dist/source/commands/edit-prompt-command.js +25 -0
- package/dist/source/commands/exit-command.d.ts +2 -0
- package/dist/source/commands/exit-command.js +14 -0
- package/dist/source/commands/files-command.d.ts +2 -0
- package/dist/source/commands/files-command.js +63 -0
- package/dist/source/commands/generate-rules-command.d.ts +2 -0
- package/dist/source/commands/generate-rules-command.js +61 -0
- package/dist/source/commands/help-command.d.ts +2 -0
- package/dist/source/commands/help-command.js +19 -0
- package/dist/source/commands/init-command.d.ts +2 -0
- package/dist/source/commands/init-command.js +40 -0
- package/dist/source/commands/last-log-command.d.ts +2 -0
- package/dist/source/commands/last-log-command.js +76 -0
- package/dist/source/commands/manager.d.ts +22 -0
- package/dist/source/commands/manager.js +123 -0
- package/dist/source/commands/model-command.d.ts +2 -0
- package/dist/source/commands/model-command.js +84 -0
- package/dist/source/commands/paste-command.d.ts +2 -0
- package/dist/source/commands/paste-command.js +40 -0
- package/dist/source/commands/prompt-command.d.ts +2 -0
- package/dist/source/commands/prompt-command.js +111 -0
- package/dist/source/commands/reset-command.d.ts +2 -0
- package/dist/source/commands/reset-command.js +16 -0
- package/dist/source/commands/rules-command.d.ts +2 -0
- package/dist/source/commands/rules-command.js +68 -0
- package/dist/source/commands/save-command.d.ts +2 -0
- package/dist/source/commands/save-command.js +14 -0
- package/dist/source/commands/types.d.ts +26 -0
- package/dist/source/commands/types.js +1 -0
- package/dist/source/commands/usage-command.d.ts +2 -0
- package/dist/source/commands/usage-command.js +21 -0
- package/dist/source/config.d.ts +60 -0
- package/dist/source/config.js +193 -0
- package/dist/source/conversation-analyzer.d.ts +10 -0
- package/dist/source/conversation-analyzer.js +88 -0
- package/dist/source/dedent.d.ts +3 -0
- package/dist/source/dedent.js +38 -0
- package/dist/source/formatting.d.ts +17 -0
- package/dist/source/formatting.js +103 -0
- package/dist/source/index.d.ts +18 -0
- package/dist/source/index.js +213 -0
- package/dist/source/logger.d.ts +2 -0
- package/dist/source/logger.js +24 -0
- package/dist/source/mentions.d.ts +9 -0
- package/dist/source/mentions.js +182 -0
- package/dist/source/messages.d.ts +69 -0
- package/dist/source/messages.js +261 -0
- package/dist/source/middleware/audit-message.d.ts +5 -0
- package/dist/source/middleware/audit-message.js +95 -0
- package/dist/source/middleware/index.d.ts +2 -0
- package/dist/source/middleware/index.js +2 -0
- package/dist/source/middleware/rate-limit.d.ts +4 -0
- package/dist/source/middleware/rate-limit.js +17 -0
- package/dist/source/models/ai-config.d.ts +12 -0
- package/dist/source/models/ai-config.js +87 -0
- package/dist/source/models/anthropic-provider.d.ts +25 -0
- package/dist/source/models/anthropic-provider.js +184 -0
- package/dist/source/models/deepseek-provider.d.ts +20 -0
- package/dist/source/models/deepseek-provider.js +42 -0
- package/dist/source/models/google-provider.d.ts +19 -0
- package/dist/source/models/google-provider.js +56 -0
- package/dist/source/models/manager.d.ts +15 -0
- package/dist/source/models/manager.js +48 -0
- package/dist/source/models/openai-provider.d.ts +22 -0
- package/dist/source/models/openai-provider.js +70 -0
- package/dist/source/models/openrouter-provider.d.ts +36 -0
- package/dist/source/models/openrouter-provider.js +276 -0
- package/dist/source/models/providers.d.ts +33 -0
- package/dist/source/models/providers.js +116 -0
- package/dist/source/models/xai-provider.d.ts +20 -0
- package/dist/source/models/xai-provider.js +47 -0
- package/dist/source/parsing.d.ts +2 -0
- package/dist/source/parsing.js +18 -0
- package/dist/source/prompts/manager.d.ts +19 -0
- package/dist/source/prompts/manager.js +71 -0
- package/dist/source/prompts.d.ts +4 -0
- package/dist/source/prompts.js +158 -0
- package/dist/source/repl-prompt.d.ts +14 -0
- package/dist/source/repl-prompt.js +147 -0
- package/dist/source/repl.d.ts +27 -0
- package/dist/source/repl.js +431 -0
- package/dist/source/terminal/formatting.d.ts +37 -0
- package/dist/source/terminal/formatting.js +106 -0
- package/dist/source/terminal/index.d.ts +94 -0
- package/dist/source/terminal/index.js +420 -0
- package/dist/source/terminal/markdown-utils.d.ts +2 -0
- package/dist/source/terminal/markdown-utils.js +81 -0
- package/dist/source/terminal/markdown.d.ts +1 -0
- package/dist/source/terminal/markdown.js +111 -0
- package/dist/source/terminal/types.d.ts +71 -0
- package/dist/source/terminal/types.js +1 -0
- package/dist/source/terminal-output.d.ts +8 -0
- package/dist/source/terminal-output.js +213 -0
- package/dist/source/terminal-output.test.d.ts +8 -0
- package/dist/source/terminal-output.test.js +213 -0
- package/dist/source/token-tracker.d.ts +14 -0
- package/dist/source/token-tracker.js +53 -0
- package/dist/source/token-utils.d.ts +7 -0
- package/dist/source/token-utils.js +13 -0
- package/dist/source/tools/agent.d.ts +17 -0
- package/dist/source/tools/agent.js +87 -0
- package/dist/source/tools/bash.d.ts +19 -0
- package/dist/source/tools/bash.js +294 -0
- package/dist/source/tools/code-interpreter.d.ts +12 -0
- package/dist/source/tools/code-interpreter.js +131 -0
- package/dist/source/tools/command-validation.d.ts +8 -0
- package/dist/source/tools/command-validation.js +69 -0
- package/dist/source/tools/delete-file.d.ts +12 -0
- package/dist/source/tools/delete-file.js +56 -0
- package/dist/source/tools/directory-tree.d.ts +12 -0
- package/dist/source/tools/directory-tree.js +38 -0
- package/dist/source/tools/edit-file.d.ts +19 -0
- package/dist/source/tools/edit-file.js +107 -0
- package/dist/source/tools/filesystem-utils.d.ts +22 -0
- package/dist/source/tools/filesystem-utils.js +191 -0
- package/dist/source/tools/git-utils.d.ts +14 -0
- package/dist/source/tools/git-utils.js +64 -0
- package/dist/source/tools/grep.d.ts +17 -0
- package/dist/source/tools/grep.js +138 -0
- package/dist/source/tools/index.d.ts +161 -0
- package/dist/source/tools/index.js +209 -0
- package/dist/source/tools/memory-read.d.ts +13 -0
- package/dist/source/tools/memory-read.js +135 -0
- package/dist/source/tools/memory-write.d.ts +12 -0
- package/dist/source/tools/memory-write.js +83 -0
- package/dist/source/tools/move-file.d.ts +13 -0
- package/dist/source/tools/move-file.js +44 -0
- package/dist/source/tools/read-file.d.ts +17 -0
- package/dist/source/tools/read-file.js +86 -0
- package/dist/source/tools/read-multiple-files.d.ts +14 -0
- package/dist/source/tools/read-multiple-files.js +55 -0
- package/dist/source/tools/save-file.d.ts +17 -0
- package/dist/source/tools/save-file.js +98 -0
- package/dist/source/tools/think.d.ts +11 -0
- package/dist/source/tools/think.js +45 -0
- package/dist/source/tools/types.d.ts +29 -0
- package/dist/source/tools/types.js +14 -0
- package/dist/source/tools/web-fetch.d.ts +47 -0
- package/dist/source/tools/web-fetch.js +246 -0
- package/dist/source/tools/web-search.d.ts +13 -0
- package/dist/source/tools/web-search.js +80 -0
- package/dist/source/utils/process.d.ts +36 -0
- package/dist/source/utils/process.js +75 -0
- package/dist/source/version.d.ts +1 -0
- package/dist/source/version.js +21 -0
- package/dist/terminal/formatting.d.ts +37 -0
- package/dist/terminal/formatting.js +106 -0
- package/dist/terminal/index.d.ts +94 -0
- package/dist/terminal/index.js +420 -0
- package/dist/terminal/markdown-utils.d.ts +2 -0
- package/dist/terminal/markdown-utils.js +81 -0
- package/dist/terminal/markdown.d.ts +1 -0
- package/dist/terminal/markdown.js +111 -0
- package/dist/terminal/types.d.ts +71 -0
- package/dist/terminal/types.js +1 -0
- package/dist/terminal-output.d.ts +8 -0
- package/dist/terminal-output.js +213 -0
- package/dist/token-tracker.d.ts +14 -0
- package/dist/token-tracker.js +53 -0
- package/dist/token-utils.d.ts +7 -0
- package/dist/token-utils.js +13 -0
- package/dist/tools/agent.d.ts +17 -0
- package/dist/tools/agent.js +87 -0
- package/dist/tools/bash.d.ts +19 -0
- package/dist/tools/bash.js +294 -0
- package/dist/tools/code-interpreter.d.ts +12 -0
- package/dist/tools/code-interpreter.js +131 -0
- package/dist/tools/command-validation.d.ts +8 -0
- package/dist/tools/command-validation.js +69 -0
- package/dist/tools/delete-file.d.ts +12 -0
- package/dist/tools/delete-file.js +56 -0
- package/dist/tools/directory-tree.d.ts +12 -0
- package/dist/tools/directory-tree.js +38 -0
- package/dist/tools/edit-file.d.ts +19 -0
- package/dist/tools/edit-file.js +107 -0
- package/dist/tools/filesystem-utils.d.ts +22 -0
- package/dist/tools/filesystem-utils.js +191 -0
- package/dist/tools/git-utils.d.ts +14 -0
- package/dist/tools/git-utils.js +64 -0
- package/dist/tools/grep.d.ts +17 -0
- package/dist/tools/grep.js +138 -0
- package/dist/tools/index.d.ts +161 -0
- package/dist/tools/index.js +209 -0
- package/dist/tools/memory-read.d.ts +13 -0
- package/dist/tools/memory-read.js +135 -0
- package/dist/tools/memory-write.d.ts +12 -0
- package/dist/tools/memory-write.js +83 -0
- package/dist/tools/move-file.d.ts +13 -0
- package/dist/tools/move-file.js +44 -0
- package/dist/tools/read-file.d.ts +17 -0
- package/dist/tools/read-file.js +86 -0
- package/dist/tools/read-multiple-files.d.ts +14 -0
- package/dist/tools/read-multiple-files.js +55 -0
- package/dist/tools/save-file.d.ts +17 -0
- package/dist/tools/save-file.js +98 -0
- package/dist/tools/think.d.ts +11 -0
- package/dist/tools/think.js +45 -0
- package/dist/tools/types.d.ts +29 -0
- package/dist/tools/types.js +14 -0
- package/dist/tools/web-fetch.d.ts +47 -0
- package/dist/tools/web-fetch.js +246 -0
- package/dist/tools/web-search.d.ts +13 -0
- package/dist/tools/web-search.js +80 -0
- package/dist/utils/process.d.ts +36 -0
- package/dist/utils/process.js +75 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +21 -0
- package/knip.json +5 -0
- package/package.json +83 -0
- package/source/cli.ts +172 -0
- package/source/commands/application-log-command.ts +53 -0
- package/source/commands/clear-command.ts +14 -0
- package/source/commands/compact-command.ts +64 -0
- package/source/commands/copy-command.ts +55 -0
- package/source/commands/edit-command.ts +63 -0
- package/source/commands/edit-prompt-command.ts +31 -0
- package/source/commands/exit-command.ts +18 -0
- package/source/commands/files-command.ts +85 -0
- package/source/commands/generate-rules-command.ts +82 -0
- package/source/commands/help-command.ts +27 -0
- package/source/commands/init-command.ts +48 -0
- package/source/commands/last-log-command.ts +88 -0
- package/source/commands/manager.ts +151 -0
- package/source/commands/model-command.ts +123 -0
- package/source/commands/paste-command.ts +62 -0
- package/source/commands/prompt-command.ts +150 -0
- package/source/commands/reset-command.ts +22 -0
- package/source/commands/rules-command.ts +76 -0
- package/source/commands/save-command.ts +20 -0
- package/source/commands/types.ts +28 -0
- package/source/commands/usage-command.ts +26 -0
- package/source/config.ts +223 -0
- package/source/conversation-analyzer.ts +115 -0
- package/source/dedent.ts +53 -0
- package/source/formatting.ts +132 -0
- package/source/index.ts +240 -0
- package/source/logger.ts +29 -0
- package/source/mentions.ts +227 -0
- package/source/messages.ts +360 -0
- package/source/middleware/audit-message.ts +133 -0
- package/source/middleware/index.ts +2 -0
- package/source/middleware/rate-limit.ts +24 -0
- package/source/models/ai-config.ts +109 -0
- package/source/models/anthropic-provider.ts +199 -0
- package/source/models/deepseek-provider.ts +53 -0
- package/source/models/google-provider.ts +68 -0
- package/source/models/manager.ts +84 -0
- package/source/models/openai-provider.ts +81 -0
- package/source/models/openrouter-provider.ts +288 -0
- package/source/models/providers.ts +197 -0
- package/source/models/xai-provider.ts +59 -0
- package/source/parsing.ts +20 -0
- package/source/prompts/manager.ts +90 -0
- package/source/prompts.ts +172 -0
- package/source/repl-prompt.ts +196 -0
- package/source/repl.ts +572 -0
- package/source/terminal/formatting.ts +121 -0
- package/source/terminal/index.ts +518 -0
- package/source/terminal/markdown-utils.ts +89 -0
- package/source/terminal/markdown.ts +155 -0
- package/source/terminal/types.ts +84 -0
- package/source/terminal-output.test.ts +266 -0
- package/source/token-tracker.ts +78 -0
- package/source/token-utils.ts +17 -0
- package/source/tools/agent.ts +107 -0
- package/source/tools/bash.ts +367 -0
- package/source/tools/code-interpreter.ts +172 -0
- package/source/tools/command-validation.ts +81 -0
- package/source/tools/delete-file.ts +71 -0
- package/source/tools/directory-tree.ts +54 -0
- package/source/tools/edit-file.ts +155 -0
- package/source/tools/filesystem-utils.ts +265 -0
- package/source/tools/git-utils.ts +70 -0
- package/source/tools/grep.ts +184 -0
- package/source/tools/index.ts +278 -0
- package/source/tools/memory-read.ts +174 -0
- package/source/tools/memory-write.ts +105 -0
- package/source/tools/move-file.ts +59 -0
- package/source/tools/read-file.ts +129 -0
- package/source/tools/read-multiple-files.ts +80 -0
- package/source/tools/save-file.ts +147 -0
- package/source/tools/think.ts +51 -0
- package/source/tools/types.ts +58 -0
- package/source/tools/web-fetch.ts +327 -0
- package/source/tools/web-search.ts +101 -0
- package/source/utils/process.ts +121 -0
- package/source/version.ts +21 -0
- package/test/commands/copy-command.test.ts +69 -0
- package/test/config.test.ts +200 -0
- package/test/terminal/markdown-utils.test.ts +124 -0
- package/test/tools/bash-tool.test.ts +58 -0
- package/test/tools/code-interpreter.test.ts +91 -0
- package/test/tools/command-validation.test.ts +48 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.json +30 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TokenCounter } from "../token-utils.ts";
|
|
2
|
+
import type { SendData } from "./types.ts";
|
|
3
|
+
export declare const WebSearchTool: {
|
|
4
|
+
name: "webSearch";
|
|
5
|
+
};
|
|
6
|
+
export declare const createWebSearchTool: ({ sendData, tokenCounter, }: {
|
|
7
|
+
sendData?: SendData;
|
|
8
|
+
tokenCounter: TokenCounter;
|
|
9
|
+
}) => {
|
|
10
|
+
webSearch: import("ai").Tool<{
|
|
11
|
+
query: string;
|
|
12
|
+
}, string>;
|
|
13
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { tool } from "ai";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { SafeSearchType, search } from "duck-duck-scrape";
|
|
4
|
+
import Exa from "exa-js";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
export const WebSearchTool = {
|
|
7
|
+
name: "webSearch",
|
|
8
|
+
};
|
|
9
|
+
export const createWebSearchTool = ({ sendData, tokenCounter, }) => {
|
|
10
|
+
return {
|
|
11
|
+
[WebSearchTool.name]: tool({
|
|
12
|
+
description: "Searches the web and returns match documents with their title, url, and text content. The query should be formulated as a natural language question.",
|
|
13
|
+
inputSchema: z.object({
|
|
14
|
+
query: z.string().describe("The search query."),
|
|
15
|
+
}),
|
|
16
|
+
execute: async ({ query }, { toolCallId }) => {
|
|
17
|
+
sendData?.({
|
|
18
|
+
id: toolCallId,
|
|
19
|
+
event: "tool-init",
|
|
20
|
+
data: `Web search: ${chalk.cyan(query)}`,
|
|
21
|
+
});
|
|
22
|
+
const result = await performSearch(query);
|
|
23
|
+
const sources = result.results.map((source) => `## ${source.title}\nURL: ${source.url}\n\n${source.text}`);
|
|
24
|
+
const resultText = `# Search Results:\n\n${sources.join("\n\n")}`;
|
|
25
|
+
const tokenCount = tokenCounter.count(resultText);
|
|
26
|
+
sendData?.({
|
|
27
|
+
id: toolCallId,
|
|
28
|
+
event: "tool-completion",
|
|
29
|
+
data: `Found ${result.results.length} results. (${tokenCount} tokens)`,
|
|
30
|
+
});
|
|
31
|
+
return resultText;
|
|
32
|
+
},
|
|
33
|
+
}),
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
async function performSearch(query) {
|
|
37
|
+
// Check if EXA API key is available
|
|
38
|
+
const hasExaApiKey = process.env["EXA_API_KEY"] && process.env["EXA_API_KEY"].trim() !== "";
|
|
39
|
+
if (hasExaApiKey) {
|
|
40
|
+
// Use Exa search
|
|
41
|
+
try {
|
|
42
|
+
const exa = new Exa(process.env["EXA_API_KEY"]);
|
|
43
|
+
const result = await exa.searchAndContents(query, {
|
|
44
|
+
numResults: 5,
|
|
45
|
+
text: true,
|
|
46
|
+
});
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
// If Exa fails, fall back to duck duck scrape
|
|
51
|
+
console.info("Exa search failed, falling back to DuckDuckGo:", error);
|
|
52
|
+
return await searchWithDuckDuckGo(query);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// Use DuckDuckGo search as fallback
|
|
57
|
+
console.info("EXA_API_KEY not set, using DuckDuckGo search");
|
|
58
|
+
return await searchWithDuckDuckGo(query);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function searchWithDuckDuckGo(query) {
|
|
62
|
+
try {
|
|
63
|
+
const searchResults = await search(query, {
|
|
64
|
+
safeSearch: SafeSearchType.MODERATE,
|
|
65
|
+
});
|
|
66
|
+
// Transform duck-duck-scrape results to match Exa format
|
|
67
|
+
// Take only first 5 results to match Exa behavior
|
|
68
|
+
const results = searchResults.results
|
|
69
|
+
.slice(0, 5)
|
|
70
|
+
.map((result) => ({
|
|
71
|
+
title: result.title,
|
|
72
|
+
url: result.url,
|
|
73
|
+
text: result.description || "",
|
|
74
|
+
}));
|
|
75
|
+
return { results };
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
throw new Error(`Failed to perform web search: ${error}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
interface ExecuteOptions {
|
|
2
|
+
/** Working directory where the command will be executed */
|
|
3
|
+
cwd?: string;
|
|
4
|
+
/** Timeout in milliseconds before killing the process */
|
|
5
|
+
timeout?: number;
|
|
6
|
+
/** AbortSignal to cancel the execution */
|
|
7
|
+
abortSignal?: AbortSignal;
|
|
8
|
+
/** Whether to use shell syntax (defaults to false) */
|
|
9
|
+
shell?: boolean;
|
|
10
|
+
/** Whether to throw an error on non-zero exit codes (defaults to false) */
|
|
11
|
+
throwOnError?: boolean;
|
|
12
|
+
/** Whether to include stdout/stderr in the result even when there's an error (defaults to true) */
|
|
13
|
+
preserveOutputOnError?: boolean;
|
|
14
|
+
/** Maximum buffer size in bytes (defaults to 1MB) */
|
|
15
|
+
maxBuffer?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface ExecuteResult {
|
|
18
|
+
/** Standard output from the command */
|
|
19
|
+
stdout: string;
|
|
20
|
+
/** Standard error from the command */
|
|
21
|
+
stderr: string;
|
|
22
|
+
/** Exit code (0 for success, non-zero for errors) */
|
|
23
|
+
code: number;
|
|
24
|
+
/** The signal that terminated the process, if any */
|
|
25
|
+
signal?: NodeJS.Signals;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Executes a command and returns the result, providing unified error handling
|
|
29
|
+
*
|
|
30
|
+
* @param command Either a string command with arguments or an array where the first item is the command
|
|
31
|
+
* and the rest are arguments
|
|
32
|
+
* @param options Execution options
|
|
33
|
+
* @returns Promise resolving to an object containing stdout, stderr, and exit code
|
|
34
|
+
*/
|
|
35
|
+
export declare function executeCommand(command: string | [string, ...string[]], options?: ExecuteOptions): Promise<ExecuteResult>;
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { isUndefined } from "@travisennis/stdlib/typeguards";
|
|
3
|
+
const MS_IN_SECOND = 1000;
|
|
4
|
+
const SECONDS_IN_MINUTE = 60;
|
|
5
|
+
const DEFAULT_TIMEOUT = 2 * SECONDS_IN_MINUTE * MS_IN_SECOND;
|
|
6
|
+
/**
|
|
7
|
+
* Executes a command and returns the result, providing unified error handling
|
|
8
|
+
*
|
|
9
|
+
* @param command Either a string command with arguments or an array where the first item is the command
|
|
10
|
+
* and the rest are arguments
|
|
11
|
+
* @param options Execution options
|
|
12
|
+
* @returns Promise resolving to an object containing stdout, stderr, and exit code
|
|
13
|
+
*/
|
|
14
|
+
export function executeCommand(command, options) {
|
|
15
|
+
const { cwd = process.cwd(), timeout = DEFAULT_TIMEOUT, abortSignal, shell = false, throwOnError = false, preserveOutputOnError = true, maxBuffer = 1_000_000, } = options || {};
|
|
16
|
+
let cmd;
|
|
17
|
+
let args;
|
|
18
|
+
if (Array.isArray(command)) {
|
|
19
|
+
[cmd, ...args] = command;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
const parts = command.split(" ");
|
|
23
|
+
cmd = parts[0] ?? "";
|
|
24
|
+
args = parts.slice(1);
|
|
25
|
+
}
|
|
26
|
+
if (isUndefined(cmd) || cmd.trim() === "") {
|
|
27
|
+
const result = {
|
|
28
|
+
stdout: "",
|
|
29
|
+
stderr: "Missing command",
|
|
30
|
+
code: 1,
|
|
31
|
+
};
|
|
32
|
+
return throwOnError
|
|
33
|
+
? Promise.reject(new Error("Missing command"))
|
|
34
|
+
: Promise.resolve(result);
|
|
35
|
+
}
|
|
36
|
+
return new Promise((resolve, reject) => {
|
|
37
|
+
try {
|
|
38
|
+
execFile(cmd, args, {
|
|
39
|
+
cwd,
|
|
40
|
+
timeout,
|
|
41
|
+
signal: abortSignal,
|
|
42
|
+
shell,
|
|
43
|
+
maxBuffer,
|
|
44
|
+
}, (error, stdout, stderr) => {
|
|
45
|
+
if (error) {
|
|
46
|
+
const errorCode = typeof error.code === "number" ? error.code : 1;
|
|
47
|
+
const result = {
|
|
48
|
+
stdout: preserveOutputOnError ? stdout : "",
|
|
49
|
+
stderr: preserveOutputOnError ? stderr : "",
|
|
50
|
+
code: errorCode,
|
|
51
|
+
signal: error.signal ?? undefined,
|
|
52
|
+
};
|
|
53
|
+
if (throwOnError) {
|
|
54
|
+
reject(Object.assign(error, { result }));
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
resolve(result);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
resolve({ stdout, stderr, code: 0 });
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
const result = { stdout: "", stderr: "", code: 1 };
|
|
67
|
+
if (throwOnError) {
|
|
68
|
+
reject(error);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
resolve(result);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getPackageVersion(fallback?: string): string;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "@travisennis/stdlib/desm";
|
|
3
|
+
export function getPackageVersion(fallback = "unavailable") {
|
|
4
|
+
try {
|
|
5
|
+
const pkgPath = join(import.meta.url, "..", "package.json");
|
|
6
|
+
const pkgRaw = readFileSync(pkgPath, "utf8");
|
|
7
|
+
const parsed = JSON.parse(pkgRaw);
|
|
8
|
+
const v = typeof parsed.version === "string" ? parsed.version : undefined;
|
|
9
|
+
if (v && v.length > 0) {
|
|
10
|
+
return v;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// ignore
|
|
15
|
+
}
|
|
16
|
+
const envV = process.env["npm_package_version"];
|
|
17
|
+
if (typeof envV === "string" && envV.length > 0) {
|
|
18
|
+
return envV;
|
|
19
|
+
}
|
|
20
|
+
return fallback;
|
|
21
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal Formatting Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides functions for formatting and displaying text in the terminal.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Clear the terminal screen
|
|
8
|
+
*/
|
|
9
|
+
export declare function clearScreen(): void;
|
|
10
|
+
/**
|
|
11
|
+
* Clear the terminal screen including scrollback buffer
|
|
12
|
+
*
|
|
13
|
+
* Unlike clearScreen, this function:
|
|
14
|
+
* 1. Clears the entire screen (\x1b[2J)
|
|
15
|
+
* 2. Clears the scrollback buffer (\x1b[3J)
|
|
16
|
+
* 3. Moves cursor to home position (\x1b[H)
|
|
17
|
+
* 4. Returns a Promise that resolves when the write operation completes
|
|
18
|
+
*
|
|
19
|
+
* @returns Promise that resolves when the terminal has been cleared
|
|
20
|
+
*/
|
|
21
|
+
export declare function clearTerminal(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Sets the terminal title
|
|
24
|
+
*/
|
|
25
|
+
export declare function setTerminalTitle(title: string): void;
|
|
26
|
+
/**
|
|
27
|
+
* Get the terminal size (rows and columns)
|
|
28
|
+
*/
|
|
29
|
+
export declare function getTerminalSize(): {
|
|
30
|
+
rows: number;
|
|
31
|
+
columns: number;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Word wrap text to the specified width
|
|
35
|
+
*/
|
|
36
|
+
export declare function wordWrap(text: string, width: number): string;
|
|
37
|
+
export declare const link: (text: string, url: string) => string;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal Formatting Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides functions for formatting and displaying text in the terminal.
|
|
5
|
+
*/
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
/**
|
|
8
|
+
* Clear the terminal screen
|
|
9
|
+
*/
|
|
10
|
+
export function clearScreen() {
|
|
11
|
+
// Clear screen and move cursor to top-left
|
|
12
|
+
process.stdout.write("\x1b[2J\x1b[0f");
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Clear the terminal screen including scrollback buffer
|
|
16
|
+
*
|
|
17
|
+
* Unlike clearScreen, this function:
|
|
18
|
+
* 1. Clears the entire screen (\x1b[2J)
|
|
19
|
+
* 2. Clears the scrollback buffer (\x1b[3J)
|
|
20
|
+
* 3. Moves cursor to home position (\x1b[H)
|
|
21
|
+
* 4. Returns a Promise that resolves when the write operation completes
|
|
22
|
+
*
|
|
23
|
+
* @returns Promise that resolves when the terminal has been cleared
|
|
24
|
+
*/
|
|
25
|
+
export function clearTerminal() {
|
|
26
|
+
return new Promise((resolve) => {
|
|
27
|
+
process.stdout.write("\x1b[2J\x1b[3J\x1b[H", () => {
|
|
28
|
+
resolve();
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Sets the terminal title
|
|
34
|
+
*/
|
|
35
|
+
export function setTerminalTitle(title) {
|
|
36
|
+
if (process.platform === "win32") {
|
|
37
|
+
process.title = title ? `✳✳ ${title}` : title;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
process.stdout.write(`\x1b]0;${title ? `✳✳ ${title}` : ""}\x07`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get the terminal size (rows and columns)
|
|
45
|
+
*/
|
|
46
|
+
export function getTerminalSize() {
|
|
47
|
+
// Default to a reasonable size if we can't determine the actual size
|
|
48
|
+
const defaultSize = { rows: 24, columns: 80 };
|
|
49
|
+
try {
|
|
50
|
+
if (process.stdout.isTTY) {
|
|
51
|
+
return {
|
|
52
|
+
rows: process.stdout.rows || defaultSize.rows,
|
|
53
|
+
columns: process.stdout.columns || defaultSize.columns,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (_error) {
|
|
58
|
+
// Ignore errors
|
|
59
|
+
}
|
|
60
|
+
return defaultSize;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Word wrap text to the specified width
|
|
64
|
+
*/
|
|
65
|
+
export function wordWrap(text, width) {
|
|
66
|
+
const lines = text.split("\n");
|
|
67
|
+
return lines.map((line) => wrapLine(line, width)).join("\n");
|
|
68
|
+
}
|
|
69
|
+
function wrapLine(line, width) {
|
|
70
|
+
// If the line is a code block or already shorter than the width, leave it as is
|
|
71
|
+
if (line.trim().startsWith("┃") || line.length <= width) {
|
|
72
|
+
return line;
|
|
73
|
+
}
|
|
74
|
+
// Word wrap the line
|
|
75
|
+
const words = line.split(" ");
|
|
76
|
+
const wrappedLines = [];
|
|
77
|
+
let currentLine = "";
|
|
78
|
+
for (const word of words) {
|
|
79
|
+
// If adding this word would exceed the width
|
|
80
|
+
if (currentLine.length + word.length + 1 > width) {
|
|
81
|
+
// Add the current line to wrapped lines if it's not empty
|
|
82
|
+
if (currentLine) {
|
|
83
|
+
wrappedLines.push(currentLine);
|
|
84
|
+
currentLine = word;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
// If the current line is empty, it means the word itself is longer than the width
|
|
88
|
+
wrappedLines.push(word);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// Add the word to the current line
|
|
93
|
+
currentLine = currentLine ? `${currentLine} ${word}` : word;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Add the last line if it's not empty
|
|
97
|
+
if (currentLine) {
|
|
98
|
+
wrappedLines.push(currentLine);
|
|
99
|
+
}
|
|
100
|
+
return wrappedLines.join("\n");
|
|
101
|
+
}
|
|
102
|
+
// const ESC = "\u001B[";
|
|
103
|
+
const OSC = "\u001B]";
|
|
104
|
+
const BEL = "\u0007";
|
|
105
|
+
const SEP = ";";
|
|
106
|
+
export const link = (text, url) => chalk.underline.blue([OSC, "8", SEP, SEP, url, BEL, text, OSC, "8", SEP, SEP, BEL].join(""));
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal Interface Module
|
|
3
|
+
*
|
|
4
|
+
* Provides a user interface for interacting with Claude Code in the terminal.
|
|
5
|
+
* Handles input/output, formatting, and display.
|
|
6
|
+
*/
|
|
7
|
+
import { type ChalkInstance } from "chalk";
|
|
8
|
+
import type { SpinnerInstance, TerminalConfig } from "./types.ts";
|
|
9
|
+
/**
|
|
10
|
+
* Initialize the terminal interface
|
|
11
|
+
*/
|
|
12
|
+
export declare function initTerminal(config?: Partial<TerminalConfig>): Terminal;
|
|
13
|
+
/**
|
|
14
|
+
* Terminal class for handling user interaction
|
|
15
|
+
*/
|
|
16
|
+
export declare class Terminal {
|
|
17
|
+
private config;
|
|
18
|
+
private activeSpinners;
|
|
19
|
+
private terminalWidth;
|
|
20
|
+
private terminalHeight;
|
|
21
|
+
private isInteractive;
|
|
22
|
+
constructor(config: TerminalConfig);
|
|
23
|
+
/**
|
|
24
|
+
* Detect terminal capabilities
|
|
25
|
+
*/
|
|
26
|
+
detectCapabilities(): void;
|
|
27
|
+
setTitle(title: string): void;
|
|
28
|
+
getLogo(): string;
|
|
29
|
+
/**
|
|
30
|
+
* Display the welcome message
|
|
31
|
+
*/
|
|
32
|
+
displayWelcome(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Clear the terminal screen
|
|
35
|
+
*/
|
|
36
|
+
clear(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Display formatted content
|
|
39
|
+
*/
|
|
40
|
+
display(content: string, wrap?: boolean): void;
|
|
41
|
+
/**
|
|
42
|
+
* Display a message with emphasis
|
|
43
|
+
*/
|
|
44
|
+
emphasize(message: string): void;
|
|
45
|
+
/**
|
|
46
|
+
* Display an informational message
|
|
47
|
+
*/
|
|
48
|
+
info(message: string): void;
|
|
49
|
+
/**
|
|
50
|
+
* Display a success message
|
|
51
|
+
*/
|
|
52
|
+
success(message: string): void;
|
|
53
|
+
/**
|
|
54
|
+
* Display a warning message
|
|
55
|
+
*/
|
|
56
|
+
warn(message: string): void;
|
|
57
|
+
/**
|
|
58
|
+
* Display an error message
|
|
59
|
+
*/
|
|
60
|
+
error(message: string): void;
|
|
61
|
+
/**
|
|
62
|
+
* Emits an alert.
|
|
63
|
+
*/
|
|
64
|
+
alert(): void;
|
|
65
|
+
write(input: string): void;
|
|
66
|
+
writeln(input: string): void;
|
|
67
|
+
lineBreak(): void;
|
|
68
|
+
header(header: string, chalkFn?: ChalkInstance): void;
|
|
69
|
+
box(header: string, content: string): Promise<void>;
|
|
70
|
+
hr(chalkFn?: ChalkInstance): void;
|
|
71
|
+
/**
|
|
72
|
+
* Create a clickable link in the terminal if supported
|
|
73
|
+
*/
|
|
74
|
+
link(text: string, url: string): string;
|
|
75
|
+
/**
|
|
76
|
+
* Display a table of data
|
|
77
|
+
*/
|
|
78
|
+
table(data: [string, string | number][], options?: {
|
|
79
|
+
header?: string[];
|
|
80
|
+
colWidths?: number[];
|
|
81
|
+
}): void;
|
|
82
|
+
/**
|
|
83
|
+
* Create a spinner for showing progress
|
|
84
|
+
*/
|
|
85
|
+
spinner(text: string, id?: string): SpinnerInstance;
|
|
86
|
+
/**
|
|
87
|
+
* Displays a horizontal progress bar in the console.
|
|
88
|
+
* @param current The current value.
|
|
89
|
+
* @param total The target value.
|
|
90
|
+
*/
|
|
91
|
+
displayProgressBar(current: number, total: number): void;
|
|
92
|
+
private formatMarkdown;
|
|
93
|
+
}
|
|
94
|
+
export * from "./types.ts";
|