@defai.digital/ax-cli 3.6.0 → 3.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +447 -102
- package/config-defaults/settings.yaml +24 -0
- package/dist/analyzers/code-smells/detectors/data-clumps-detector.js +7 -9
- package/dist/analyzers/code-smells/detectors/data-clumps-detector.js.map +1 -1
- package/dist/analyzers/code-smells/detectors/dead-code-detector.js +1 -1
- package/dist/analyzers/code-smells/detectors/dead-code-detector.js.map +1 -1
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js +22 -10
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js.map +1 -1
- package/dist/analyzers/code-smells/detectors/feature-envy-detector.js +1 -1
- package/dist/analyzers/code-smells/detectors/feature-envy-detector.js.map +1 -1
- package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js +1 -1
- package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js.map +1 -1
- package/dist/analyzers/code-smells/detectors/large-class-detector.js +4 -1
- package/dist/analyzers/code-smells/detectors/large-class-detector.js.map +1 -1
- package/dist/analyzers/code-smells/detectors/long-method-detector.js +4 -1
- package/dist/analyzers/code-smells/detectors/long-method-detector.js.map +1 -1
- package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js +4 -1
- package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js.map +1 -1
- package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js +4 -5
- package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js.map +1 -1
- package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js +4 -1
- package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js.map +1 -1
- package/dist/constants.d.ts +13 -0
- package/dist/constants.js +28 -0
- package/dist/constants.js.map +1 -1
- package/dist/schemas/settings-schemas.d.ts +40 -0
- package/dist/schemas/settings-schemas.js +32 -0
- package/dist/schemas/settings-schemas.js.map +1 -1
- package/dist/tools/web-search/index.d.ts +0 -2
- package/dist/tools/web-search/index.js +0 -2
- package/dist/tools/web-search/index.js.map +1 -1
- package/dist/tools/web-search/router.d.ts +0 -2
- package/dist/tools/web-search/router.js +2 -37
- package/dist/tools/web-search/router.js.map +1 -1
- package/dist/tools/web-search/web-search-tool.js +2 -12
- package/dist/tools/web-search/web-search-tool.js.map +1 -1
- package/dist/ui/components/chat-history.d.ts +2 -0
- package/dist/ui/components/chat-history.js +32 -81
- package/dist/ui/components/chat-history.js.map +1 -1
- package/dist/ui/components/chat-input.d.ts +4 -1
- package/dist/ui/components/chat-input.js +133 -52
- package/dist/ui/components/chat-input.js.map +1 -1
- package/dist/ui/components/chat-interface.js +4 -4
- package/dist/ui/components/chat-interface.js.map +1 -1
- package/dist/ui/components/keyboard-hints.js +2 -0
- package/dist/ui/components/keyboard-hints.js.map +1 -1
- package/dist/ui/components/status-bar.d.ts +2 -0
- package/dist/ui/components/status-bar.js +31 -17
- package/dist/ui/components/status-bar.js.map +1 -1
- package/dist/ui/components/tool-group-display.d.ts +15 -0
- package/dist/ui/components/tool-group-display.js +91 -0
- package/dist/ui/components/tool-group-display.js.map +1 -0
- package/dist/ui/components/welcome-panel.js +4 -0
- package/dist/ui/components/welcome-panel.js.map +1 -1
- package/dist/ui/hooks/use-enhanced-input.d.ts +4 -0
- package/dist/ui/hooks/use-enhanced-input.js +156 -9
- package/dist/ui/hooks/use-enhanced-input.js.map +1 -1
- package/dist/ui/hooks/use-input-handler.d.ts +4 -0
- package/dist/ui/hooks/use-input-handler.js +28 -10
- package/dist/ui/hooks/use-input-handler.js.map +1 -1
- package/dist/ui/utils/change-summarizer.d.ts +20 -0
- package/dist/ui/utils/change-summarizer.js +193 -0
- package/dist/ui/utils/change-summarizer.js.map +1 -0
- package/dist/ui/utils/tool-grouper.d.ts +62 -0
- package/dist/ui/utils/tool-grouper.js +224 -0
- package/dist/ui/utils/tool-grouper.js.map +1 -0
- package/dist/utils/audit-logger.d.ts +28 -70
- package/dist/utils/audit-logger.js +30 -135
- package/dist/utils/audit-logger.js.map +1 -1
- package/dist/utils/config-loader.d.ts +4 -0
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/paste-utils.d.ts +99 -0
- package/dist/utils/paste-utils.js +265 -0
- package/dist/utils/paste-utils.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +15 -1
- package/dist/utils/rate-limiter.js +15 -1
- package/dist/utils/rate-limiter.js.map +1 -1
- package/package.json +4 -8
- package/packages/schemas/package.json +1 -1
- package/.ax-cli/CUSTOM.md +0 -269
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-2dd84869-e62d-46c8-9885-7e45f37f36e2.json +0 -69
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-484dc350-353f-4808-9ed1-ebb3cefdab37.json +0 -24
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-74a18b87-6172-4215-962b-44bb9f46a662.json +0 -69
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-870a5fb9-6e82-4ff2-8ec8-af4c251cc514.json +0 -44
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-93946601-0e83-456c-ba47-def9713124dd.json +0 -24
- package/.ax-cli/checkpoints/metadata.json +0 -62
- package/.ax-cli/index.json +0 -44
- package/.ax-cli/memory.json +0 -55
- package/.ax-cli/settings.json +0 -1
- package/dist/agent/chat-history-manager.d.ts +0 -56
- package/dist/agent/chat-history-manager.js +0 -150
- package/dist/agent/chat-history-manager.js.map +0 -1
- package/dist/agent/tool-manager.d.ts +0 -39
- package/dist/agent/tool-manager.js +0 -76
- package/dist/agent/tool-manager.js.map +0 -1
- package/dist/tools/web-search/engines/brave.d.ts +0 -16
- package/dist/tools/web-search/engines/brave.js +0 -99
- package/dist/tools/web-search/engines/brave.js.map +0 -1
- package/dist/tools/web-search/engines/tavily.d.ts +0 -17
- package/dist/tools/web-search/engines/tavily.js +0 -73
- package/dist/tools/web-search/engines/tavily.js.map +0 -1
package/.ax-cli/memory.json
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 1,
|
|
3
|
-
"created_at": "2025-11-22T11:59:21.278Z",
|
|
4
|
-
"updated_at": "2025-11-22T11:59:21.278Z",
|
|
5
|
-
"project_root": "/Users/akiralam/code/ax-cli",
|
|
6
|
-
"content_hash": "sha256:213c195995de78eced482260119b8ac69826a6a26f7bffe20ab0e3874b4f0f9f",
|
|
7
|
-
"source": {
|
|
8
|
-
"directories": [
|
|
9
|
-
{
|
|
10
|
-
"path": "src",
|
|
11
|
-
"max_depth": 3
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
"path": "packages",
|
|
15
|
-
"max_depth": 2
|
|
16
|
-
}
|
|
17
|
-
],
|
|
18
|
-
"files": [
|
|
19
|
-
"README.md",
|
|
20
|
-
"readme.md",
|
|
21
|
-
"package.json",
|
|
22
|
-
"tsconfig.json",
|
|
23
|
-
".ax-cli/CUSTOM.md"
|
|
24
|
-
],
|
|
25
|
-
"ignore": [
|
|
26
|
-
"node_modules",
|
|
27
|
-
"dist",
|
|
28
|
-
"build",
|
|
29
|
-
".git",
|
|
30
|
-
".next",
|
|
31
|
-
".nuxt",
|
|
32
|
-
"coverage",
|
|
33
|
-
".cache",
|
|
34
|
-
".turbo",
|
|
35
|
-
".vercel",
|
|
36
|
-
"__pycache__",
|
|
37
|
-
".pytest_cache",
|
|
38
|
-
"target",
|
|
39
|
-
"vendor",
|
|
40
|
-
"*.log",
|
|
41
|
-
"*.lock",
|
|
42
|
-
".DS_Store"
|
|
43
|
-
]
|
|
44
|
-
},
|
|
45
|
-
"context": {
|
|
46
|
-
"formatted": "# Project Context\n\n\n## Architecture Patterns\n- **Project Type**: cli\n- **Primary Language**: TypeScript\n- **Tech Stack**: React, Vitest, Zod, Commander, Ink, ESM, TypeScript\n- **Package Manager**: npm\n- **Entry Point**: dist/index.js\n- **Module System**: ESM\n- **Test Framework**: vitest\n- **Validation**: zod\n- **Linter**: eslint\n- **Key Directories**: source: src, tests: tests\n\n\n## Directory Structure\n```\nsrc/\n├── agent/\n│ ├── specialized/\n│ │ ├── analysis-agent.ts\n│ │ ├── debug-agent.ts\n│ │ ├── documentation-agent.ts\n│ │ ├── index.ts\n│ │ ├── performance-agent.ts\n│ │ ├── refactoring-agent.ts\n│ │ └── testing-agent.ts\n│ ├── chat-history-manager.ts\n│ ├── context-manager.ts\n│ ├── dependency-resolver.ts\n│ ├── index.ts\n│ ├── llm-agent.ts\n│ ├── subagent-orchestrator.ts\n│ ├── subagent-types.ts\n│ ├── subagent.ts\n│ └── tool-manager.ts\n├── analyzers/\n│ ├── architecture/\n│ │ ├── anti-pattern-detectors/\n│ │ ├── pattern-detectors/\n│ │ ├── architecture-analyzer.ts\n│ │ ├── index.ts\n│ │ └── project-structure-scanner.ts\n│ ├── ast/\n│ │ ├── index.ts\n│ │ ├── node-helpers.ts\n│ │ ├── parser.ts\n│ │ ├── traverser.ts\n│ │ └── types.ts\n│ ├── best-practices/\n│ │ ├── rules/\n│ │ ├── base-rule.ts\n│ │ ├── best-practice-validator.ts\n│ │ ├── index.ts\n│ │ └── types.ts\n│ ├── cache/\n│ │ └── analysis-cache.ts\n│ ├── code-smells/\n│ │ ├── detectors/\n│ │ ├── base-smell-detector.ts\n│ │ ├── code-smell-analyzer.ts\n│ │ ├── index.ts\n│ │ └── types.ts\n│ ├── dependency/\n│ │ ├── circular-detector.ts\n│ │ ├── coupling-calculator.ts\n│ │ ├── dependency-analyzer.ts\n│ │ ├── dependency-graph.ts\n│ │ ├── index.ts\n│ │ └── types.ts\n│ ├── git/\n│ │ ├── churn-calculator.ts\n│ │ ├── git-analyzer.ts\n│ │ ├── hotspot-detector.ts\n│ │ ├── index.ts\n│ │ └── types.ts\n│ ├── metrics/\n│ │ ├── halstead-calculator.ts\n│ │ ├── index.ts\n│ │ ├── maintainability-calculator.ts\n│ │ ├── metrics-analyzer.ts\n│ │ └── types.ts\n│ ├── security/\n│ │ ├── detectors/\n│ │ ├── base-detector.ts\n│ │ ├── index.ts\n│ │ ├── security-analyzer.ts\n│ │ └── types.ts\n│ └── errors.ts\n├── checkpoint/\n│ ├── index.ts\n│ ├── manager.ts\n│ ├── storage.ts\n│ └── types.ts\n├── commands/\n│ ├── init/\n│ │ └── wizard.ts\n│ ├── cache.ts\n│ ├── doctor.ts\n│ ├── frontend.ts\n│ ├── init.ts\n│ ├── mcp.ts\n│ ├── memory.ts\n│ ├── models.ts\n│ ├── plan.ts\n│ ├── rewind.ts\n│ ├── setup.ts\n│ ├── templates.ts\n│ ├── update.ts\n│ └── usage.ts\n├── llm/\n│ ├── client.ts\n│ ├── tools.ts\n│ └── types.ts\n├── mcp/\n│ ├── client.ts\n│ ├── config.ts\n│ ├── health.ts\n│ ├── reconnection.ts\n│ ├── registry.ts\n│ ├── resources.ts\n│ ├── ssrf-protection.ts\n│ ├── templates.ts\n│ ├── transports.ts\n│ └── validation.ts\n├── memory/\n│ ├── context-generator.ts\n│ ├── context-injector.ts\n│ ├── context-store.ts\n│ ├── index.ts\n│ ├── schemas.ts\n│ ├── stats-collector.ts\n│ └── types.ts\n├── planner/\n│ ├── prompts/\n│ │ └── planning-prompt.ts\n│ ├── dependency-resolver.ts\n│ ├── index.ts\n│ ├── plan-generator.ts\n│ ├── plan-storage.ts\n│ ├── task-planner.ts\n│ ├── token-estimator.ts\n│ └── types.ts\n├── schemas/\n│ ├── api-schemas.ts\n│ ├── confirmation-schemas.ts\n│ ├── index-unified.ts\n│ ├── index.ts\n│ ├── README.md\n│ ├── settings-schemas.ts\n│ ├── tool-schemas.ts\n│ └── yaml-schemas.ts\n├── sdk/\n│ ├── index.ts\n│ ├── README.md\n│ └── types.ts\n├── tools/\n│ ├── analysis-tools/\n│ │ ├── architecture-tool.ts\n│ │ └── validation-tool.ts\n│ ├── web-search/\n│ │ ├── engines/\n│ │ ├── cache.ts\n│ │ ├── index.ts\n│ │ ├── router.ts\n│ │ ├── types.ts\n│ │ └── web-search-tool.ts\n│ ├── analysis-tools.ts\n│ ├── bash-output.ts\n│ ├── bash.ts\n│ ├── confirmation-tool.ts\n│ ├── index.ts\n│ ├── search.ts\n│ ├── text-editor.ts\n│ └── todo-tool.ts\n├── types/\n│ ├── analysis.ts\n│ ├── index.ts\n│ ├── project-analysis.ts\n│ └── template.ts\n├── ui/\n│ ├── components/\n│ │ ├── api-key-input.tsx\n│ │ ├── chat-history.tsx\n│ │ ├── chat-input.tsx\n│ │ ├── chat-interface.tsx\n│ │ ├── collapsible-tool-result.tsx\n│ │ ├── command-suggestions.tsx\n│ │ ├── confirmation-dialog.tsx\n│ │ ├── diff-renderer.tsx\n│ │ ├── index.ts\n│ │ ├── keyboard-hints.tsx\n│ │ ├── loading-spinner.tsx\n│ │ ├── mcp-status.tsx\n│ │ ├── model-selection.tsx\n│ │ ├── phase-progress.tsx\n│ │ ├── quick-actions.tsx\n│ │ ├── reasoning-display.tsx\n│ │ ├── status-bar.tsx\n│ │ ├── subagent-monitor.tsx\n│ │ ├── toast-notification.tsx\n│ │ ├── virtualized-chat-history.tsx\n│ │ └── welcome-panel.tsx\n│ ├── hooks/\n│ │ ├── use-chat-reducer.ts\n│ │ ├── use-enhanced-input.ts\n│ │ ├── use-input-handler.ts\n│ │ └── use-input-history.ts\n│ ├── shared/\n│ │ └── max-sized-box.tsx\n│ ├── utils/\n│ │ ├── code-colorizer.tsx\n│ │ ├── colors.ts\n│ │ └── markdown-renderer.tsx\n│ └── app.tsx\n├── utils/\n│ ├── analysis-logger.ts\n│ ├── audit-logger.ts\n│ ├── automatosx-detector.ts\n│ ├── background-task-manager.ts\n│ ├── cache.ts\n│ ├── command-security.ts\n│ ├── config-loader.ts\n│ ├── confirmation-service.ts\n│ ├── console-messenger.ts\n│ ├── custom-instructions.ts\n│ ├── encryption.ts\n│ ├── error-handler.ts\n│ ├── error-sanitizer.ts\n│ ├── error-translator.ts\n│ ├── errors.ts\n│ ├── file-cache.ts\n│ ├── history-manager.ts\n│ ├── incremental-analyzer.ts\n│ ├── index.ts\n│ ├── init-previewer.ts\n│ ├── init-validator.ts\n│ ├── input-sanitizer.ts\n│ ├── instruction-generator.ts\n│ ├── json-utils.ts\n│ ├── llm-optimized-instruction-generator.ts\n│ ├── message-optimizer.ts\n│ ├── onboarding-manager.ts\n│ ├── parallel-analyzer.ts\n│ ├── path-security.ts\n│ ├── path-utils.ts\n│ └── ... (17 more)\n├── constants.ts\n└── index.ts\npackages/\n└── schemas/\n ├── __tests__/\n ├── scripts/\n ├── src/\n ├── .eslintrc.js\n ├── package-lock.json\n ├── package.json\n ├── README.md\n ├── tsconfig.json\n └── vitest.config.ts\n```\n\n\n## Key Configuration\n\n### README.md\n\n```\n# AX CLI - Enterprise-Class GLM AI CLI\n\n[](https://npm-stat.com/charts.html?package=%40defai.digital%2Fax-cli)\n[](https://github.com/defai-digital/ax-cli/actions/workflows/test.yml)\n[](https://github.com/defai-digital/ax\n...\n```\n\n### readme.md\n\n```\n# AX CLI - Enterprise-Class GLM AI CLI\n\n[](https://npm-stat.com/charts.html?package=%40defai.digital%2Fax-cli)\n[](https://github.com/defai-digital/ax-cli/actions/workflows/test.yml)\n[](https://github.com/defai-digital/ax\n...\n```\n\n### package.json\n\n- **Name**: @defai.digital/ax-cli\n- **Version**: 3.5.4\n- **Description**: Enterprise-Class AI Command Line Interface - Primary support for GLM (General Language Model) with multi-provider AI orchestration powered by AutomatosX.\n- **Type**: module\n- **CLI**: Yes\n- **Dependencies**: @ax-cli/schemas, @clack/prompts, @modelcontextprotocol/sdk, axios, chalk, clipboardy, commander, dotenv, enquirer, fs-extra (+14 more)\n- **Dev Dependencies**: @types/fs-extra, @types/glob, @types/js-yaml, @types/marked-terminal, @types/node, @types/react, @typescript-eslint/eslint-plugin, @typescript-eslint/parser (+6 more)\n- **Scripts**: build, build:schemas, build:bun, dev, dev:node, start\n\n### tsconfig.json\n\n- **Target**: ES2022\n- **Module**: ESNext\n- **Module Resolution**: Bundler\n- **Strict**: true\n- **Output**: ./dist\n\n### .ax-cli/CUSTOM.md\n\n# @defai.digital/ax-cli - Quick Reference\n\n**Type:** cli | **Lang:** TypeScript | **Ver:** v2.3.1\n**Stack:** React, Vitest, Zod, Commander, Ink, ESM, TypeScript\n\n---\n\n## 🎯 Critical Rules\n\n1. **ESM Imports:** Always use `.js` extension: `import { x } from './y.js'`\n2. **Validation:** Use zod for all external inputs\n3. **Types:** Explicit return types required on all functions\n4. **Testing:** 80%+ coverage, test error paths\n5. **Modules:** Use `import/export` (not `require/module.exports`)\n6. **File Organization:** Follow standardized output paths (see below)\n\n---\n\n## 📁 Project File Organization\n\n### Standard Output Paths\n\nAll AI-generated and project artifacts must follow this structure:\n\n```\nautomatosx/\n├── PRD/ # Product Requirement Documents\n│ ├── features/ # Feature specifications\n│ ├── api/ # API documentation\n│ └── archive/ # Old/deprecated PRDs\n├── REPORT/ # Project reports and analysis\n│ ├── status/ # Status reports\n│ ├\n[...truncated]\n\n\n## README Summary\n\n# AX CLI - Enterprise-Class GLM AI CLI\n\n[](https://npm-stat.com/charts.html?package=%40defai.digital%2Fax-cli)\n[](https://github.com/defai-digital/ax-cli/actions/workflows/test.yml)\n[](https://github.com/defai-digital/ax-cli)\n[](https://www.typescriptlang.org/)\n[](https://nodejs.org/)\n[](https://opensource.org/licenses/MIT)\n[](https://www.apple.com/macos/)\n[](https://www.microsoft.com/windows/)\n[](https://ubuntu.com/)\n\n\n\n<p align=\"center\">\n <strong>GLM-Optimized CLI • Enterprise Architecture • 98%+ Test Coverage • TypeScript & Zod</strong>\n</p>\n\n---\n\n## 🚀 Quick Start\n\n```bash\n# Install globally\nnpm install -g @defai.digital/ax-cli\n\n# Configure your API key\nax-cli setup\n\n# Initialize your project\nax-cli init\n\n# Start interactive mode\nax-cli\n```\n\n## ✨ Features\n\n- **🤖 GLM-Focused AI CLI**: Optimized for Z.AI's GLM models (glm-4.6, glm-4-air, glm-4-airx)\n - **Note**: For xAI Grok models, use [grok-cli](https://github.com/superagent-ai/grok-cli)\n - **Note**: For Anthropic Claude models, use [claude-code](https://claude.ai/code)\n- **🧠 GLM 4.6 Optimized**: Primary support for General Language Model with advanced reasoning\n - **32K max tokens** (industry-standard, matches Claude Code CLI)\n - 200K context window, 128K max output capability\n - 30% more token efficient than GLM 4.5\n - Optimized for complex code generation and refactoring\n- **🎯 Multi-Phase Task Planner** (NEW in v3.0.0): Intelligent task decomposition for complex requests\n - Automatic complexity detection (57 keyword patterns)\n - LLM-based plan generation with phases and dependencies\n - Phase-by-phase execution with progress tracking\n - File modification tracking and context pruning between phases\n - Plan management commands: `/plans`, `/plan`, `/phases`, `/pause`, `/resume`, `/skip`, `/abandon`\n- **🔄 Session Continuity**: Directory-specific conversation history with `--continue` flag\n - Preserve context across sessions for multi-day development\n - Each project maintains its own independent history\n - Seamlessly resume conversations where you left off\n- **🔌 Enhanced MCP Integration**: Model Context Protocol with production-ready templates\n - **One-command setup**: `ax-cli mcp add figma --template`\n - **12+ pre-configured templates**: Figma, GitHub, Vercel, Puppeteer, Storybook, Sentry, and more\n - **Tool discovery**: `ax-cli mcp tools <server>` to preview capabilities\n - **Template browser**: `ax-cli mcp browse` for quick navigation\n - **Front-end focused**: Design-to-code workflows with Figma integration\n - **[Complete Guide](docs/mcp-frontend-guide.md)**: Front-end developer workflows\n- **✅ Production-Ready**: 98%+ test coverage, TypeScript strict mode, Zod validation\n- **🎯 Interactive & Headless**: Chat interface or one-shot commands\n- **📝 Smart Project Init**: Automatic project analysis and custom instructions\n- **🧠 Project Memory** (NEW): Intelligent context caching for z.ai GLM-4.6\n - Automatic project scanning and context generation\n - z.ai implicit caching support (50% token savings on repeated context)\n - Cache statistics tracking and efficiency monitoring\n- **🏥 Health Check** (NEW): Comprehensive diagnostics with `ax-cli doctor`\n - Verify configuration, API connectivity, and d\n\n[...truncated]",
|
|
47
|
-
"token_estimate": 3963,
|
|
48
|
-
"sections": {
|
|
49
|
-
"structure": 1906,
|
|
50
|
-
"readme": 1114,
|
|
51
|
-
"config": 838,
|
|
52
|
-
"patterns": 99
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
package/.ax-cli/settings.json
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Chat History Manager
|
|
3
|
-
*
|
|
4
|
-
* Manages chat history, tool call tracking, and related operations.
|
|
5
|
-
* Extracted from LLMAgent to reduce God Object anti-pattern.
|
|
6
|
-
*/
|
|
7
|
-
import type { ChatEntry } from "./llm-agent.js";
|
|
8
|
-
export declare class ChatHistoryManager {
|
|
9
|
-
private chatHistory;
|
|
10
|
-
private toolCallIndexMap;
|
|
11
|
-
private toolCallArgsCache;
|
|
12
|
-
/**
|
|
13
|
-
* Get all chat history
|
|
14
|
-
*/
|
|
15
|
-
getHistory(): ChatEntry[];
|
|
16
|
-
/**
|
|
17
|
-
* Get chat history for LLM (filtered format)
|
|
18
|
-
*/
|
|
19
|
-
getLLMMessages(): any[];
|
|
20
|
-
/**
|
|
21
|
-
* Add entry to chat history
|
|
22
|
-
*/
|
|
23
|
-
addEntry(entry: ChatEntry): void;
|
|
24
|
-
/**
|
|
25
|
-
* Get recent history (last N entries)
|
|
26
|
-
*/
|
|
27
|
-
getRecentHistory(count: number): ChatEntry[];
|
|
28
|
-
/**
|
|
29
|
-
* Clear chat history
|
|
30
|
-
*/
|
|
31
|
-
clearHistory(): void;
|
|
32
|
-
/**
|
|
33
|
-
* Get tool call index by ID
|
|
34
|
-
*/
|
|
35
|
-
getToolCallIndex(toolCallId: string): number | undefined;
|
|
36
|
-
/**
|
|
37
|
-
* Cache tool call arguments
|
|
38
|
-
*/
|
|
39
|
-
cacheToolCallArgs(toolCallId: string, args: Record<string, unknown>): void;
|
|
40
|
-
/**
|
|
41
|
-
* Get cached tool call arguments
|
|
42
|
-
*/
|
|
43
|
-
getCachedToolCallArgs(toolCallId: string): Record<string, unknown> | undefined;
|
|
44
|
-
/**
|
|
45
|
-
* Get history size
|
|
46
|
-
*/
|
|
47
|
-
getHistorySize(): number;
|
|
48
|
-
/**
|
|
49
|
-
* Get token count estimate for history
|
|
50
|
-
*/
|
|
51
|
-
getTokenCount(): number;
|
|
52
|
-
/**
|
|
53
|
-
* Trim history to stay within token limit
|
|
54
|
-
*/
|
|
55
|
-
trimToTokenLimit(maxTokens: number): void;
|
|
56
|
-
}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Chat History Manager
|
|
3
|
-
*
|
|
4
|
-
* Manages chat history, tool call tracking, and related operations.
|
|
5
|
-
* Extracted from LLMAgent to reduce God Object anti-pattern.
|
|
6
|
-
*/
|
|
7
|
-
export class ChatHistoryManager {
|
|
8
|
-
chatHistory = [];
|
|
9
|
-
toolCallIndexMap = new Map();
|
|
10
|
-
toolCallArgsCache = new Map();
|
|
11
|
-
/**
|
|
12
|
-
* Get all chat history
|
|
13
|
-
*/
|
|
14
|
-
getHistory() {
|
|
15
|
-
return [...this.chatHistory];
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Get chat history for LLM (filtered format)
|
|
19
|
-
*/
|
|
20
|
-
getLLMMessages() {
|
|
21
|
-
return this.chatHistory
|
|
22
|
-
.filter(entry => entry.type === 'user' || entry.type === 'assistant' || entry.type === 'tool_result')
|
|
23
|
-
.map(entry => {
|
|
24
|
-
if (entry.type === 'user') {
|
|
25
|
-
return { role: 'user', content: entry.content };
|
|
26
|
-
}
|
|
27
|
-
else if (entry.type === 'assistant') {
|
|
28
|
-
const message = { role: 'assistant', content: entry.content };
|
|
29
|
-
if (entry.toolCalls && entry.toolCalls.length > 0) {
|
|
30
|
-
message.tool_calls = entry.toolCalls.map((toolCall) => ({
|
|
31
|
-
id: toolCall.id,
|
|
32
|
-
type: 'function',
|
|
33
|
-
function: {
|
|
34
|
-
name: toolCall.function.name,
|
|
35
|
-
arguments: toolCall.function.arguments,
|
|
36
|
-
},
|
|
37
|
-
}));
|
|
38
|
-
}
|
|
39
|
-
return message;
|
|
40
|
-
}
|
|
41
|
-
else if (entry.type === 'tool_result' && entry.toolCall) {
|
|
42
|
-
return {
|
|
43
|
-
role: 'tool',
|
|
44
|
-
tool_call_id: entry.toolCall.id,
|
|
45
|
-
content: entry.content,
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
return null;
|
|
49
|
-
})
|
|
50
|
-
.filter(Boolean);
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Add entry to chat history
|
|
54
|
-
*/
|
|
55
|
-
addEntry(entry) {
|
|
56
|
-
this.chatHistory.push(entry);
|
|
57
|
-
// Track tool call indices for quick lookup
|
|
58
|
-
if (entry.type === 'tool_call' && entry.toolCall) {
|
|
59
|
-
this.toolCallIndexMap.set(entry.toolCall.id, this.chatHistory.length - 1);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Get recent history (last N entries)
|
|
64
|
-
*/
|
|
65
|
-
getRecentHistory(count) {
|
|
66
|
-
return this.chatHistory.slice(-count);
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Clear chat history
|
|
70
|
-
*/
|
|
71
|
-
clearHistory() {
|
|
72
|
-
this.chatHistory = [];
|
|
73
|
-
this.toolCallIndexMap.clear();
|
|
74
|
-
this.toolCallArgsCache.clear();
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Get tool call index by ID
|
|
78
|
-
*/
|
|
79
|
-
getToolCallIndex(toolCallId) {
|
|
80
|
-
return this.toolCallIndexMap.get(toolCallId);
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Cache tool call arguments
|
|
84
|
-
*/
|
|
85
|
-
cacheToolCallArgs(toolCallId, args) {
|
|
86
|
-
this.toolCallArgsCache.set(toolCallId, args);
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Get cached tool call arguments
|
|
90
|
-
*/
|
|
91
|
-
getCachedToolCallArgs(toolCallId) {
|
|
92
|
-
return this.toolCallArgsCache.get(toolCallId);
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Get history size
|
|
96
|
-
*/
|
|
97
|
-
getHistorySize() {
|
|
98
|
-
return this.chatHistory.length;
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Get token count estimate for history
|
|
102
|
-
*/
|
|
103
|
-
getTokenCount() {
|
|
104
|
-
// Simple estimation - could be improved with actual tokenizer
|
|
105
|
-
let totalTokens = 0;
|
|
106
|
-
for (const entry of this.chatHistory) {
|
|
107
|
-
totalTokens += Math.ceil(entry.content.length / 4); // Rough estimate: 1 token per 4 chars
|
|
108
|
-
if (entry.reasoningContent) {
|
|
109
|
-
totalTokens += Math.ceil(entry.reasoningContent.length / 4);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
return totalTokens;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Trim history to stay within token limit
|
|
116
|
-
*/
|
|
117
|
-
trimToTokenLimit(maxTokens) {
|
|
118
|
-
const currentTokens = this.getTokenCount();
|
|
119
|
-
if (currentTokens <= maxTokens) {
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
// Keep recent entries (simple approach for now)
|
|
123
|
-
let tokensToKeep = maxTokens;
|
|
124
|
-
let entriesToKeep = 0;
|
|
125
|
-
let tokenCount = 0;
|
|
126
|
-
// Count from the end backwards
|
|
127
|
-
for (let i = this.chatHistory.length - 1; i >= 0; i--) {
|
|
128
|
-
const entry = this.chatHistory[i];
|
|
129
|
-
const entryTokens = Math.ceil(entry.content.length / 4) +
|
|
130
|
-
(entry.reasoningContent ? Math.ceil(entry.reasoningContent.length / 4) : 0);
|
|
131
|
-
if (tokenCount + entryTokens <= tokensToKeep) {
|
|
132
|
-
tokenCount += entryTokens;
|
|
133
|
-
entriesToKeep++;
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
break;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
// Keep only recent entries
|
|
140
|
-
this.chatHistory = this.chatHistory.slice(-entriesToKeep);
|
|
141
|
-
// Rebuild tool call index map
|
|
142
|
-
this.toolCallIndexMap.clear();
|
|
143
|
-
this.chatHistory.forEach((entry, index) => {
|
|
144
|
-
if (entry.type === 'tool_call' && entry.toolCall) {
|
|
145
|
-
this.toolCallIndexMap.set(entry.toolCall.id, index);
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
//# sourceMappingURL=chat-history-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chat-history-manager.js","sourceRoot":"","sources":["../../src/agent/chat-history-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tool Manager
|
|
3
|
-
*
|
|
4
|
-
* Manages all tool instances and their lifecycle.
|
|
5
|
-
* Extracted from LLMAgent to reduce God Object anti-pattern.
|
|
6
|
-
*/
|
|
7
|
-
import { LLMTool } from "../llm/client.js";
|
|
8
|
-
export declare class ToolManager {
|
|
9
|
-
private tools;
|
|
10
|
-
private initialized;
|
|
11
|
-
/**
|
|
12
|
-
* Initialize tools
|
|
13
|
-
*/
|
|
14
|
-
private initialize;
|
|
15
|
-
/**
|
|
16
|
-
* Get all available tools as LLMTool array
|
|
17
|
-
*/
|
|
18
|
-
getAllTools(): Promise<LLMTool[]>;
|
|
19
|
-
/**
|
|
20
|
-
* Get tool by name
|
|
21
|
-
*/
|
|
22
|
-
getToolByName(name: string): Promise<LLMTool | undefined>;
|
|
23
|
-
/**
|
|
24
|
-
* Load tools safely (for compatibility with existing code)
|
|
25
|
-
*/
|
|
26
|
-
loadToolsSafely(): Promise<LLMTool[]>;
|
|
27
|
-
/**
|
|
28
|
-
* Get tool count
|
|
29
|
-
*/
|
|
30
|
-
getToolCount(): Promise<number>;
|
|
31
|
-
/**
|
|
32
|
-
* Check if tools are available
|
|
33
|
-
*/
|
|
34
|
-
hasTools(): Promise<boolean>;
|
|
35
|
-
/**
|
|
36
|
-
* Dispose all tools
|
|
37
|
-
*/
|
|
38
|
-
dispose(): void;
|
|
39
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tool Manager
|
|
3
|
-
*
|
|
4
|
-
* Manages all tool instances and their lifecycle.
|
|
5
|
-
* Extracted from LLMAgent to reduce God Object anti-pattern.
|
|
6
|
-
*/
|
|
7
|
-
import { getAllGrokTools, } from "../llm/tools.js";
|
|
8
|
-
export class ToolManager {
|
|
9
|
-
tools = [];
|
|
10
|
-
initialized = false;
|
|
11
|
-
/**
|
|
12
|
-
* Initialize tools
|
|
13
|
-
*/
|
|
14
|
-
async initialize() {
|
|
15
|
-
if (this.initialized) {
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
try {
|
|
19
|
-
this.tools = await getAllGrokTools();
|
|
20
|
-
this.initialized = true;
|
|
21
|
-
}
|
|
22
|
-
catch (error) {
|
|
23
|
-
console.warn('⚠️ Error initializing tools:', error);
|
|
24
|
-
this.tools = [];
|
|
25
|
-
this.initialized = true;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Get all available tools as LLMTool array
|
|
30
|
-
*/
|
|
31
|
-
async getAllTools() {
|
|
32
|
-
await this.initialize();
|
|
33
|
-
return [...this.tools];
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Get tool by name
|
|
37
|
-
*/
|
|
38
|
-
async getToolByName(name) {
|
|
39
|
-
const tools = await this.getAllTools();
|
|
40
|
-
return tools.find(tool => tool.function.name === name);
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Load tools safely (for compatibility with existing code)
|
|
44
|
-
*/
|
|
45
|
-
async loadToolsSafely() {
|
|
46
|
-
try {
|
|
47
|
-
return await this.getAllTools();
|
|
48
|
-
}
|
|
49
|
-
catch (error) {
|
|
50
|
-
console.warn('⚠️ Error loading tools:', error);
|
|
51
|
-
return [];
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Get tool count
|
|
56
|
-
*/
|
|
57
|
-
async getToolCount() {
|
|
58
|
-
const tools = await this.getAllTools();
|
|
59
|
-
return tools.length;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Check if tools are available
|
|
63
|
-
*/
|
|
64
|
-
async hasTools() {
|
|
65
|
-
const tools = await this.getAllTools();
|
|
66
|
-
return tools.length > 0;
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Dispose all tools
|
|
70
|
-
*/
|
|
71
|
-
dispose() {
|
|
72
|
-
this.tools = [];
|
|
73
|
-
this.initialized = false;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
//# sourceMappingURL=tool-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tool-manager.js","sourceRoot":"","sources":["../../src/agent/tool-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,eAAe,GAChB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,OAAO,WAAW;IACd,KAAK,GAAc,EAAE,CAAC;IACtB,WAAW,GAAG,KAAK,CAAC;IAE5B;;OAEG;IACK,KAAK,CAAC,UAAU;QACtB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;YACrC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACpD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;YAC/C,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Brave Search Engine
|
|
3
|
-
* Privacy-focused independent search
|
|
4
|
-
* https://brave.com/search/api/
|
|
5
|
-
*/
|
|
6
|
-
import type { SearchEngine, WebSearchResult, SearchOptions } from "../types.js";
|
|
7
|
-
export declare class BraveSearch implements SearchEngine {
|
|
8
|
-
readonly name = "brave";
|
|
9
|
-
private apiKey;
|
|
10
|
-
private baseUrl;
|
|
11
|
-
private timeout;
|
|
12
|
-
constructor();
|
|
13
|
-
isAvailable(): boolean;
|
|
14
|
-
search(query: string, options?: SearchOptions): Promise<WebSearchResult[]>;
|
|
15
|
-
private formatResults;
|
|
16
|
-
}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Brave Search Engine
|
|
3
|
-
* Privacy-focused independent search
|
|
4
|
-
* https://brave.com/search/api/
|
|
5
|
-
*/
|
|
6
|
-
import axios from "axios";
|
|
7
|
-
export class BraveSearch {
|
|
8
|
-
name = "brave";
|
|
9
|
-
apiKey;
|
|
10
|
-
baseUrl = "https://api.search.brave.com/res/v1/web/search";
|
|
11
|
-
timeout = 10000; // 10 second timeout
|
|
12
|
-
constructor() {
|
|
13
|
-
this.apiKey = process.env.BRAVE_API_KEY;
|
|
14
|
-
}
|
|
15
|
-
isAvailable() {
|
|
16
|
-
return !!this.apiKey;
|
|
17
|
-
}
|
|
18
|
-
async search(query, options) {
|
|
19
|
-
if (!this.isAvailable()) {
|
|
20
|
-
throw new Error("Brave API key not configured");
|
|
21
|
-
}
|
|
22
|
-
try {
|
|
23
|
-
const params = new URLSearchParams({
|
|
24
|
-
q: query,
|
|
25
|
-
count: Math.min(options?.maxResults || 10, 20).toString(),
|
|
26
|
-
offset: "0",
|
|
27
|
-
text_decorations: "false",
|
|
28
|
-
spellcheck: "true",
|
|
29
|
-
});
|
|
30
|
-
// Add freshness filter if specified
|
|
31
|
-
if (options?.freshness) {
|
|
32
|
-
const freshnessMap = {
|
|
33
|
-
day: "pd",
|
|
34
|
-
week: "pw",
|
|
35
|
-
month: "pm",
|
|
36
|
-
year: "py",
|
|
37
|
-
};
|
|
38
|
-
params.append("freshness", freshnessMap[options.freshness]);
|
|
39
|
-
}
|
|
40
|
-
const response = await axios.get(`${this.baseUrl}?${params.toString()}`, {
|
|
41
|
-
timeout: options?.timeout || this.timeout,
|
|
42
|
-
headers: {
|
|
43
|
-
Accept: "application/json",
|
|
44
|
-
"Accept-Encoding": "gzip",
|
|
45
|
-
"X-Subscription-Token": this.apiKey,
|
|
46
|
-
},
|
|
47
|
-
});
|
|
48
|
-
return this.formatResults(response.data);
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
if (axios.isAxiosError(error)) {
|
|
52
|
-
if (error.code === "ECONNABORTED") {
|
|
53
|
-
throw new Error("Brave search timeout");
|
|
54
|
-
}
|
|
55
|
-
if (error.response?.status === 401) {
|
|
56
|
-
throw new Error("Invalid Brave API key");
|
|
57
|
-
}
|
|
58
|
-
if (error.response?.status === 429) {
|
|
59
|
-
throw new Error("Brave rate limit exceeded");
|
|
60
|
-
}
|
|
61
|
-
throw new Error(`Brave API error: ${error.response?.data?.message || error.message}`);
|
|
62
|
-
}
|
|
63
|
-
throw error;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
formatResults(response) {
|
|
67
|
-
const results = [];
|
|
68
|
-
// Add web results
|
|
69
|
-
if (response.web?.results) {
|
|
70
|
-
results.push(...response.web.results.map((result, index) => ({
|
|
71
|
-
title: result.title,
|
|
72
|
-
url: result.url,
|
|
73
|
-
snippet: result.description,
|
|
74
|
-
source: this.name,
|
|
75
|
-
relevanceScore: 100 - index * 5, // Simple scoring based on position
|
|
76
|
-
publishedDate: result.age || result.page_age,
|
|
77
|
-
metadata: {
|
|
78
|
-
language: result.language,
|
|
79
|
-
},
|
|
80
|
-
})));
|
|
81
|
-
}
|
|
82
|
-
// Add news results if available
|
|
83
|
-
if (response.news?.results) {
|
|
84
|
-
results.push(...response.news.results.map((result, index) => ({
|
|
85
|
-
title: result.title,
|
|
86
|
-
url: result.url,
|
|
87
|
-
snippet: result.description,
|
|
88
|
-
source: `${this.name}-news`,
|
|
89
|
-
relevanceScore: 95 - index * 5,
|
|
90
|
-
publishedDate: result.age,
|
|
91
|
-
metadata: {
|
|
92
|
-
type: "news",
|
|
93
|
-
},
|
|
94
|
-
})));
|
|
95
|
-
}
|
|
96
|
-
return results;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
//# sourceMappingURL=brave.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"brave.js","sourceRoot":"","sources":["../../../../src/tools/web-search/engines/brave.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tavily AI Search Engine
|
|
3
|
-
* AI-optimized search designed for LLMs
|
|
4
|
-
* https://tavily.com/
|
|
5
|
-
*/
|
|
6
|
-
import type { SearchEngine, WebSearchResult, SearchOptions } from "../types.js";
|
|
7
|
-
export declare class TavilySearch implements SearchEngine {
|
|
8
|
-
readonly name = "tavily";
|
|
9
|
-
private apiKey;
|
|
10
|
-
private baseUrl;
|
|
11
|
-
private timeout;
|
|
12
|
-
constructor();
|
|
13
|
-
isAvailable(): boolean;
|
|
14
|
-
search(query: string, options?: SearchOptions): Promise<WebSearchResult[]>;
|
|
15
|
-
private formatResults;
|
|
16
|
-
getAnswer(results: WebSearchResult[]): string | undefined;
|
|
17
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tavily AI Search Engine
|
|
3
|
-
* AI-optimized search designed for LLMs
|
|
4
|
-
* https://tavily.com/
|
|
5
|
-
*/
|
|
6
|
-
import axios from "axios";
|
|
7
|
-
export class TavilySearch {
|
|
8
|
-
name = "tavily";
|
|
9
|
-
apiKey;
|
|
10
|
-
baseUrl = "https://api.tavily.com/search";
|
|
11
|
-
timeout = 10000; // 10 second timeout
|
|
12
|
-
constructor() {
|
|
13
|
-
this.apiKey = process.env.TAVILY_API_KEY;
|
|
14
|
-
}
|
|
15
|
-
isAvailable() {
|
|
16
|
-
return !!this.apiKey;
|
|
17
|
-
}
|
|
18
|
-
async search(query, options) {
|
|
19
|
-
if (!this.isAvailable()) {
|
|
20
|
-
throw new Error("Tavily API key not configured");
|
|
21
|
-
}
|
|
22
|
-
try {
|
|
23
|
-
const response = await axios.post(this.baseUrl, {
|
|
24
|
-
api_key: this.apiKey,
|
|
25
|
-
query: query,
|
|
26
|
-
search_depth: options?.searchDepth || "basic",
|
|
27
|
-
max_results: Math.min(options?.maxResults || 5, 10),
|
|
28
|
-
include_answer: options?.includeAnswer ?? true,
|
|
29
|
-
include_domains: options?.includeDomains || [],
|
|
30
|
-
exclude_domains: options?.excludeDomains || [],
|
|
31
|
-
}, {
|
|
32
|
-
timeout: options?.timeout || this.timeout,
|
|
33
|
-
headers: {
|
|
34
|
-
"Content-Type": "application/json",
|
|
35
|
-
},
|
|
36
|
-
});
|
|
37
|
-
return this.formatResults(response.data);
|
|
38
|
-
}
|
|
39
|
-
catch (error) {
|
|
40
|
-
if (axios.isAxiosError(error)) {
|
|
41
|
-
if (error.code === "ECONNABORTED") {
|
|
42
|
-
throw new Error("Tavily search timeout");
|
|
43
|
-
}
|
|
44
|
-
if (error.response?.status === 401) {
|
|
45
|
-
throw new Error("Invalid Tavily API key");
|
|
46
|
-
}
|
|
47
|
-
if (error.response?.status === 429) {
|
|
48
|
-
throw new Error("Tavily rate limit exceeded");
|
|
49
|
-
}
|
|
50
|
-
throw new Error(`Tavily API error: ${error.response?.data?.message || error.message}`);
|
|
51
|
-
}
|
|
52
|
-
throw error;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
formatResults(response) {
|
|
56
|
-
return response.results.map((result) => ({
|
|
57
|
-
title: result.title,
|
|
58
|
-
url: result.url,
|
|
59
|
-
snippet: result.content,
|
|
60
|
-
source: this.name,
|
|
61
|
-
relevanceScore: result.score * 100, // Convert 0-1 to 0-100
|
|
62
|
-
publishedDate: result.published_date,
|
|
63
|
-
metadata: {
|
|
64
|
-
answer: response.answer,
|
|
65
|
-
responseTime: response.response_time,
|
|
66
|
-
},
|
|
67
|
-
}));
|
|
68
|
-
}
|
|
69
|
-
getAnswer(results) {
|
|
70
|
-
return results[0]?.metadata?.answer;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
//# sourceMappingURL=tavily.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tavily.js","sourceRoot":"","sources":["../../../../src/tools/web-search/engines/tavily.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAsB1B,MAAM,OAAO,YAAY;IACP,IAAI,GAAG,QAAQ,CAAC;IACxB,MAAM,CAAqB;IAC3B,OAAO,GAAG,+BAA+B,CAAC;IAC1C,OAAO,GAAG,KAAK,CAAC,CAAC,oBAAoB;IAE7C;QACE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC3C,CAAC;IAED,WAAW;QACT,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAM,CACV,KAAa,EACb,OAAuB;QAEvB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,IAAI,CAAC,OAAO,EACZ;gBACE,OAAO,EAAE,IAAI,CAAC,MAAM;gBACpB,KAAK,EAAE,KAAK;gBACZ,YAAY,EAAE,OAAO,EAAE,WAAW,IAAI,OAAO;gBAC7C,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,IAAI,CAAC,EAAE,EAAE,CAAC;gBACnD,cAAc,EAAE,OAAO,EAAE,aAAa,IAAI,IAAI;gBAC9C,eAAe,EAAE,OAAO,EAAE,cAAc,IAAI,EAAE;gBAC9C,eAAe,EAAE,OAAO,EAAE,cAAc,IAAI,EAAE;aAC/C,EACD;gBACE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO;gBACzC,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;aACF,CACF,CAAC;YAEF,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBAClC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAC3C,CAAC;gBACD,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;oBACnC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAC5C,CAAC;gBACD,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;oBACnC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAChD,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,qBAAqB,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,CACtE,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,QAAwB;QAC5C,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,IAAI,CAAC,IAAI;YACjB,cAAc,EAAE,MAAM,CAAC,KAAK,GAAG,GAAG,EAAE,uBAAuB;YAC3D,aAAa,EAAE,MAAM,CAAC,cAAc;YACpC,QAAQ,EAAE;gBACR,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,YAAY,EAAE,QAAQ,CAAC,aAAa;aACrC;SACF,CAAC,CAAC,CAAC;IACN,CAAC;IAED,SAAS,CAAC,OAA0B;QAClC,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC;IACtC,CAAC;CACF"}
|