diff --git a/.changeset/flat-cities-say.md b/.changeset/flat-cities-say.md new file mode 100644 index 00000000..eaab97a4 --- /dev/null +++ b/.changeset/flat-cities-say.md @@ -0,0 +1,5 @@ +--- +"task-master-ai": minor +--- + +Added api keys page on docs website: docs.task-master.dev/getting-started/api-keys diff --git a/.changeset/forty-tables-invite.md b/.changeset/forty-tables-invite.md new file mode 100644 index 00000000..ab05ddaf --- /dev/null +++ b/.changeset/forty-tables-invite.md @@ -0,0 +1,10 @@ +--- +"task-master-ai": minor +--- + +Move to AI SDK v5: + +- Works better with claude-code and gemini-cli as ai providers +- Improved openai model family compatibility +- Migrate ollama provider to v2 +- Closes #1223, #1013, #1161, #1174 diff --git a/apps/docs/docs.json b/apps/docs/docs.json index 973ec67d..787a85e0 100644 --- a/apps/docs/docs.json +++ b/apps/docs/docs.json @@ -32,6 +32,7 @@ "getting-started/quick-start/execute-quick" ] }, + "getting-started/api-keys", "getting-started/faq", "getting-started/contribute" ] diff --git a/apps/docs/getting-started/api-keys.mdx b/apps/docs/getting-started/api-keys.mdx new file mode 100644 index 00000000..a888a4fb --- /dev/null +++ b/apps/docs/getting-started/api-keys.mdx @@ -0,0 +1,267 @@ +# API Keys Configuration + +Task Master supports multiple AI providers through environment variables. This page lists all available API keys and their configuration requirements. + +## Required API Keys + +> **Note**: At least one required API key must be configured for Task Master to function. +> +> "Required: Yes" below means "required to use that specific provider," not "required globally." You only need at least one provider configured. + +### ANTHROPIC_API_KEY (Recommended) +- **Provider**: Anthropic Claude models +- **Format**: `sk-ant-api03-...` +- **Required**: ✅ **Yes** +- **Models**: Claude 3.5 Sonnet, Claude 3 Haiku, Claude 3 Opus +- **Get Key**: [Anthropic Console](https://console.anthropic.com/) + +```bash +ANTHROPIC_API_KEY="sk-ant-api03-your-key-here" +``` + +### PERPLEXITY_API_KEY (Highly Recommended for Research) +- **Provider**: Perplexity AI (Research features) +- **Format**: `pplx-...` +- **Required**: ✅ **Yes** +- **Purpose**: Enables research-backed task expansions and updates +- **Models**: Perplexity Sonar models +- **Get Key**: [Perplexity API](https://www.perplexity.ai/settings/api) + +```bash +PERPLEXITY_API_KEY="pplx-your-key-here" +``` + +### OPENAI_API_KEY +- **Provider**: OpenAI GPT models +- **Format**: `sk-proj-...` or `sk-...` +- **Required**: ✅ **Yes** +- **Models**: GPT-4, GPT-4 Turbo, GPT-3.5 Turbo, O1 models +- **Get Key**: [OpenAI Platform](https://platform.openai.com/api-keys) + +```bash +OPENAI_API_KEY="sk-proj-your-key-here" +``` + +### GOOGLE_API_KEY +- **Provider**: Google Gemini models +- **Format**: Various formats +- **Required**: ✅ **Yes** +- **Models**: Gemini Pro, Gemini Flash, Gemini Ultra +- **Get Key**: [Google AI Studio](https://aistudio.google.com/app/apikey) +- **Alternative**: Use `GOOGLE_APPLICATION_CREDENTIALS` for service account (Google Vertex) + +```bash +GOOGLE_API_KEY="your-google-api-key-here" +``` + +### GROQ_API_KEY +- **Provider**: Groq (High-performance inference) +- **Required**: ✅ **Yes** +- **Models**: Llama models, Mixtral models (via Groq) +- **Get Key**: [Groq Console](https://console.groq.com/keys) + +```bash +GROQ_API_KEY="your-groq-key-here" +``` + +### OPENROUTER_API_KEY +- **Provider**: OpenRouter (Multiple model access) +- **Required**: ✅ **Yes** +- **Models**: Access to various models through single API +- **Get Key**: [OpenRouter](https://openrouter.ai/keys) + +```bash +OPENROUTER_API_KEY="your-openrouter-key-here" +``` + +### AZURE_OPENAI_API_KEY +- **Provider**: Azure OpenAI Service +- **Required**: ✅ **Yes** +- **Requirements**: Also requires `AZURE_OPENAI_ENDPOINT` configuration +- **Models**: GPT models via Azure +- **Get Key**: [Azure Portal](https://portal.azure.com/) + +```bash +AZURE_OPENAI_API_KEY="your-azure-key-here" +``` + +### XAI_API_KEY +- **Provider**: xAI (Grok) models +- **Required**: ✅ **Yes** +- **Models**: Grok models +- **Get Key**: [xAI Console](https://console.x.ai/) + +```bash +XAI_API_KEY="your-xai-key-here" +``` + +## Optional API Keys + +> **Note**: These API keys are optional - providers will work without them or use alternative authentication methods. + +### AWS_ACCESS_KEY_ID (Bedrock) +- **Provider**: AWS Bedrock +- **Required**: ❌ **No** (uses AWS credential chain) +- **Models**: Claude models via AWS Bedrock +- **Authentication**: Uses AWS credential chain (profiles, IAM roles, etc.) +- **Get Key**: [AWS Console](https://console.aws.amazon.com/iam/) + +```bash +# Optional - AWS credential chain is preferred +AWS_ACCESS_KEY_ID="your-aws-access-key" +AWS_SECRET_ACCESS_KEY="your-aws-secret-key" +``` + +### CLAUDE_CODE_API_KEY +- **Provider**: Claude Code CLI +- **Required**: ❌ **No** (uses OAuth tokens) +- **Purpose**: Integration with local Claude Code CLI +- **Authentication**: Uses OAuth tokens, no API key needed + +```bash +# Not typically needed +CLAUDE_CODE_API_KEY="not-usually-required" +``` + +### GEMINI_API_KEY +- **Provider**: Gemini CLI +- **Required**: ❌ **No** (uses OAuth authentication) +- **Purpose**: Integration with Gemini CLI +- **Authentication**: Primarily uses OAuth via CLI, API key is optional + +```bash +# Optional - OAuth via CLI is preferred +GEMINI_API_KEY="your-gemini-key-here" +``` + +### GROK_CLI_API_KEY +- **Provider**: Grok CLI +- **Required**: ❌ **No** (can use CLI config) +- **Purpose**: Integration with Grok CLI +- **Authentication**: Can use Grok CLI's own config file + +```bash +# Optional - CLI config is preferred +GROK_CLI_API_KEY="your-grok-cli-key" +``` + +### OLLAMA_API_KEY +- **Provider**: Ollama (Local/Remote) +- **Required**: ❌ **No** (local installation doesn't need key) +- **Purpose**: For remote Ollama servers that require authentication +- **Requirements**: Only needed for remote servers with authentication +- **Note**: Not needed for local Ollama installations + +```bash +# Only needed for remote Ollama servers +OLLAMA_API_KEY="your-ollama-api-key-here" +``` + +### GITHUB_API_KEY +- **Provider**: GitHub (Import/Export features) +- **Format**: `ghp_...` or `github_pat_...` +- **Required**: ❌ **No** (for GitHub features only) +- **Purpose**: GitHub import/export features +- **Get Key**: [GitHub Settings](https://github.com/settings/tokens) + +```bash +GITHUB_API_KEY="ghp-your-github-key-here" +``` + +## Configuration Methods + +### Method 1: Environment File (.env) +Create a `.env` file in your project root: + +```bash +# Copy from .env.example +cp .env.example .env + +# Edit with your keys +vim .env +``` + +### Method 2: System Environment Variables +```bash +export ANTHROPIC_API_KEY="your-key-here" +export PERPLEXITY_API_KEY="your-key-here" +# ... other keys +``` + +### Method 3: MCP Server Configuration +For Claude Code integration, configure keys in `.mcp.json`: + +```json +{ + "mcpServers": { + "task-master-ai": { + "command": "npx", + "args": ["-y", "task-master-ai"], + "env": { + "ANTHROPIC_API_KEY": "your-key-here", + "PERPLEXITY_API_KEY": "your-key-here", + "OPENAI_API_KEY": "your-key-here" + } + } + } +} +``` + +## Key Requirements + +### Minimum Requirements +- **At least one** AI provider key is required +- **ANTHROPIC_API_KEY** is recommended as the primary provider +- **PERPLEXITY_API_KEY** is highly recommended for research features + +### Provider-Specific Requirements +- **Azure OpenAI**: Requires both `AZURE_OPENAI_API_KEY` and `AZURE_OPENAI_ENDPOINT` configuration +- **Google Vertex**: Requires `VERTEX_PROJECT_ID` and `VERTEX_LOCATION` environment variables +- **AWS Bedrock**: Uses AWS credential chain (profiles, IAM roles, etc.) instead of API keys +- **Ollama**: Only needs API key for remote servers with authentication +- **CLI Providers**: Gemini CLI, Grok CLI, and Claude Code use OAuth/CLI config instead of API keys + +## Model Configuration + +After setting up API keys, configure which models to use: + +```bash +# Interactive model setup +task-master models --setup + +# Set specific models +task-master models --set-main claude-3-5-sonnet-20241022 +task-master models --set-research perplexity-llama-3.1-sonar-large-128k-online +task-master models --set-fallback gpt-4o-mini +``` + +## Security Best Practices + +1. **Never commit API keys** to version control +2. **Use .env files** and add them to `.gitignore` +3. **Rotate keys regularly** especially if compromised +4. **Use minimal permissions** for service accounts +5. **Monitor usage** to detect unauthorized access + +## Troubleshooting + +### Key Validation +```bash +# Check if keys are properly configured +task-master models + +# Test specific provider +task-master add-task --prompt="test task" --model=claude-3-5-sonnet-20241022 +``` + +### Common Issues +- **Invalid key format**: Check the expected format for each provider +- **Insufficient permissions**: Ensure keys have necessary API access +- **Rate limits**: Some providers have usage limits +- **Regional restrictions**: Some models may not be available in all regions + +### Getting Help +If you encounter issues with API key configuration: +- Check the [FAQ](/getting-started/faq) for common solutions +- Join our [Discord community](https://discord.gg/fWJkU7rf) for support +- Report issues on [GitHub](https://github.com/eyaltoledano/claude-task-master/issues) \ No newline at end of file diff --git a/docs/claude-code-integration.md b/docs/claude-code-integration.md new file mode 100644 index 00000000..50898bc9 --- /dev/null +++ b/docs/claude-code-integration.md @@ -0,0 +1,221 @@ +# TODO: Move to apps/docs inside our documentation website + +# Claude Code Integration Guide + +This guide covers how to use Task Master with Claude Code AI SDK integration for enhanced AI-powered development workflows. + +## Overview + +Claude Code integration allows Task Master to leverage the Claude Code CLI for AI operations without requiring direct API keys. The integration uses OAuth tokens managed by the Claude Code CLI itself. + +## Authentication Setup + +The Claude Code provider uses token authentication managed by the Claude Code CLI. + +### Prerequisites + +1. **Install Claude Code CLI** (if not already installed): + ```bash + # Installation method depends on your system + # Follow Claude Code documentation for installation + ``` + +2. **Set up OAuth token** using Claude Code CLI: + ```bash + claude setup-token + ``` + + This command will: + - Guide you through OAuth authentication + - Store the token securely for CLI usage + - Enable Task Master to use Claude Code without manual API key configuration + +### Authentication Priority + +Task Master will attempt authentication in this order: + +1. **Environment Variable** (optional): `CLAUDE_CODE_OAUTH_TOKEN` + - Useful for CI/CD environments or when you want to override the default token + - Not required if you've set up the CLI token + +2. **Claude Code CLI Token** (recommended): Token managed by `claude setup-token` + - Automatically used when available + - Most convenient for local development + +3. **Fallback**: Error if neither is available + +## Configuration + +### Basic Configuration + +Add Claude Code to your Task Master configuration: + +```javascript +// In your .taskmaster/config.json or via task-master models command +{ + "models": { + "main": "claude-code:sonnet", // Use Claude Code with Sonnet + "research": "perplexity-llama-3.1-sonar-large-128k-online", + "fallback": "claude-code:opus" // Use Claude Code with Opus as fallback + } +} +``` + +### Supported Models + +- `claude-code:sonnet` - Claude 3.5 Sonnet via Claude Code CLI +- `claude-code:opus` - Claude 3 Opus via Claude Code CLI + +### Environment Variables (Optional) + +While not required, you can optionally set: + +```bash +export CLAUDE_CODE_OAUTH_TOKEN="your_oauth_token_here" +``` + +This is only needed in specific scenarios like: +- CI/CD pipelines +- Docker containers +- When you want to use a different token than the CLI default + +## Usage Examples + +### Basic Task Operations + +```bash +# Use Claude Code for task operations +task-master add-task --prompt="Implement user authentication system" --research +task-master expand --id=1 --research +task-master update-task --id=1.1 --prompt="Add JWT token validation" +``` + +### Model Configuration Commands + +```bash +# Set Claude Code as main model +task-master models --set-main claude-code:sonnet + +# Use interactive setup +task-master models --setup +# Then select "claude-code" from the provider list +``` + +## Troubleshooting + +### Common Issues + +#### 1. "Claude Code CLI not available" Error + +**Problem**: Task Master cannot connect to Claude Code CLI. + +**Solutions**: +- Ensure Claude Code CLI is installed and in your PATH +- Run `claude setup-token` to configure authentication +- Verify Claude Code CLI works: `claude --help` + +#### 2. Authentication Failures + +**Problem**: Token authentication is failing. + +**Solutions**: +- Re-run `claude setup-token` to refresh your OAuth token +- Check if your token has expired +- Verify Claude Code CLI can authenticate: try a simple `claude` command + +#### 3. Model Not Available + +**Problem**: Specified Claude Code model is not supported. + +**Solutions**: +- Use supported models: `sonnet` or `opus` +- Check model availability: `task-master models --list` +- Verify your Claude Code CLI has access to the requested model + +### Debug Steps + +1. **Test Claude Code CLI directly**: + ```bash + claude --help + # Should show help without errors + ``` + +2. **Test authentication**: + ```bash + claude setup-token --verify + # Should confirm token is valid + ``` + +3. **Test Task Master integration**: + ```bash + task-master models --test claude-code:sonnet + # Should successfully connect and test the model + ``` + +4. **Check logs**: + - Task Master logs will show detailed error messages + - Use `--verbose` flag for more detailed output + +### Environment-Specific Configuration + +#### Docker/Containers + +When running in Docker, you'll need to: + +1. Install Claude Code CLI in your container +2. Set up authentication via environment variable: + ```dockerfile + ENV CLAUDE_CODE_OAUTH_TOKEN="your_token_here" + ``` + +#### CI/CD Pipelines + +For automated environments: + +1. Set up a service account token or use environment variables +2. Ensure Claude Code CLI is available in the pipeline environment +3. Configure authentication before running Task Master commands + +## Integration with AI SDK + +Task Master's Claude Code integration uses the official `ai-sdk-provider-claude-code` package, providing: + +- **Streaming Support**: Real-time token streaming for interactive experiences +- **Full AI SDK Compatibility**: Works with generateText, streamText, and other AI SDK functions +- **Automatic Error Handling**: Graceful degradation when Claude Code is unavailable +- **Type Safety**: Full TypeScript support with proper type definitions + +### Example AI SDK Usage + +```javascript +import { generateText } from 'ai'; +import { ClaudeCodeProvider } from './src/ai-providers/claude-code.js'; + +const provider = new ClaudeCodeProvider(); +const client = provider.getClient(); + +const result = await generateText({ + model: client('sonnet'), + messages: [ + { role: 'user', content: 'Hello Claude!' } + ] +}); + +console.log(result.text); +``` + +## Security Notes + +- OAuth tokens are managed securely by Claude Code CLI +- No API keys need to be stored in your project files +- Tokens are automatically refreshed by the Claude Code CLI +- Environment variables should only be used in secure environments + +## Getting Help + +If you encounter issues: + +1. Check the Claude Code CLI documentation +2. Verify your authentication setup with `claude setup-token --verify` +3. Review Task Master logs for detailed error messages +4. Open an issue with both Task Master and Claude Code version information \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b2a6b523..24761efd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,23 +14,24 @@ "." ], "dependencies": { - "@ai-sdk/amazon-bedrock": "^2.2.9", - "@ai-sdk/anthropic": "^1.2.10", - "@ai-sdk/azure": "^1.3.17", - "@ai-sdk/google": "^1.2.13", - "@ai-sdk/google-vertex": "^2.2.23", - "@ai-sdk/groq": "^1.2.9", - "@ai-sdk/mistral": "^1.2.7", - "@ai-sdk/openai": "^1.3.20", - "@ai-sdk/perplexity": "^1.1.7", - "@ai-sdk/xai": "^1.2.15", - "@anthropic-ai/sdk": "^0.39.0", - "@aws-sdk/credential-providers": "^3.817.0", + "@ai-sdk/amazon-bedrock": "^3.0.23", + "@ai-sdk/anthropic": "^2.0.18", + "@ai-sdk/azure": "^2.0.34", + "@ai-sdk/google": "^2.0.16", + "@ai-sdk/google-vertex": "^3.0.29", + "@ai-sdk/groq": "^2.0.21", + "@ai-sdk/mistral": "^2.0.16", + "@ai-sdk/openai": "^2.0.34", + "@ai-sdk/perplexity": "^2.0.10", + "@ai-sdk/xai": "^2.0.22", + "@aws-sdk/credential-providers": "^3.895.0", "@inquirer/search": "^3.0.15", - "@openrouter/ai-sdk-provider": "^0.4.5", + "@openrouter/ai-sdk-provider": "^1.2.0", "@streamparser/json": "^0.0.22", "@supabase/supabase-js": "^2.57.4", - "ai": "^4.3.10", + "ai": "^5.0.51", + "ai-sdk-provider-claude-code": "^1.1.4", + "ai-sdk-provider-gemini-cli": "^1.1.1", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "boxen": "^8.0.1", @@ -55,12 +56,10 @@ "lru-cache": "^10.2.0", "marked": "^15.0.12", "marked-terminal": "^7.3.0", - "ollama-ai-provider": "^1.2.0", - "openai": "^4.89.0", + "ollama-ai-provider-v2": "^1.3.1", "ora": "^8.2.0", "uuid": "^11.1.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.24.5" + "zod": "^4.1.11" }, "bin": { "task-master": "dist/task-master.js", @@ -95,8 +94,7 @@ }, "optionalDependencies": { "@anthropic-ai/claude-code": "^1.0.88", - "@biomejs/cli-linux-x64": "^1.9.4", - "ai-sdk-provider-gemini-cli": "^0.1.3" + "@biomejs/cli-linux-x64": "^1.9.4" } }, "apps/cli": { @@ -412,13 +410,14 @@ } }, "node_modules/@ai-sdk/amazon-bedrock": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/@ai-sdk/amazon-bedrock/-/amazon-bedrock-2.2.12.tgz", - "integrity": "sha512-m8gARnh45pr1s08Uu4J/Pm8913mwJPejPOm59b+kUqMsP9ilhUtH/bp8432Ra/v+vHuMoBrglG2ZvXtctAaH2g==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@ai-sdk/amazon-bedrock/-/amazon-bedrock-3.0.23.tgz", + "integrity": "sha512-2Kd6YPIiqI9jGlZXXZ9anQcNzAO+U4omuruXWg/i3s4RV9gSZ4JDnaXGOQAe/wH5MwQYdJoMfKu+kg9P54NlFA==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.1.3", - "@ai-sdk/provider-utils": "2.2.8", + "@ai-sdk/anthropic": "2.0.18", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.9", "@smithy/eventstream-codec": "^4.0.1", "@smithy/util-utf8": "^4.0.0", "aws4fetch": "^1.0.20" @@ -427,161 +426,177 @@ "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4" } }, "node_modules/@ai-sdk/anthropic": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-1.2.12.tgz", - "integrity": "sha512-YSzjlko7JvuiyQFmI9RN1tNZdEiZxc+6xld/0tq/VkJaHpEzGAb1yiNxxvmYVcjvfu/PcvCxAAYXmTYQQ63IHQ==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-2.0.18.tgz", + "integrity": "sha512-WPlhSuIiTU0KRESMyhLwCTfrtgD0GsI6px4Q7hqidTvyfDhPDeXMB0q1WShzJPNRTrjpfWRDLuYdLEL/y/+mLQ==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.1.3", - "@ai-sdk/provider-utils": "2.2.8" + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.9" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4" } }, "node_modules/@ai-sdk/azure": { - "version": "1.3.25", - "resolved": "https://registry.npmjs.org/@ai-sdk/azure/-/azure-1.3.25.tgz", - "integrity": "sha512-cTME89A9UYrza0t5pbY9b80yYY02Q5ALQdB2WP3R7/Yl1PLwbFChx994Q3Un0G2XV5h3arlm4fZTViY10isjhQ==", + "version": "2.0.34", + "resolved": "https://registry.npmjs.org/@ai-sdk/azure/-/azure-2.0.34.tgz", + "integrity": "sha512-G3vNJ+//mAi/bcD3Trg1gRXFhBljyRbyltYPcizyV9iOsfPrE8PZIlBfOb4qB0YrMv9VXeqqooFz5YoCAag8vA==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/openai": "1.3.24", - "@ai-sdk/provider": "1.1.3", - "@ai-sdk/provider-utils": "2.2.8" + "@ai-sdk/openai": "2.0.34", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.9" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4" + } + }, + "node_modules/@ai-sdk/gateway": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-1.0.28.tgz", + "integrity": "sha512-e9RKgWVDYHsd4UkKCgKQpK+nxLSDydN18yXctzgNlmf2R7BR+HqUsTKJdZT6ArSoXBWBGhyZss0cJJnpm6YVfw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" } }, "node_modules/@ai-sdk/google": { - "version": "1.2.22", - "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-1.2.22.tgz", - "integrity": "sha512-Ppxu3DIieF1G9pyQ5O1Z646GYR0gkC57YdBqXJ82qvCdhEhZHu0TWhmnOoeIWe2olSbuDeoOY+MfJrW8dzS3Hw==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-2.0.16.tgz", + "integrity": "sha512-VN9QO1syIyKxYfAiS5QPZkw0caV6n/mmyvJui3T+lkhGPS2RXTv7nDrtRv8TroNzdPcPWoaZMgJRJD2W7oEZ+g==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.1.3", - "@ai-sdk/provider-utils": "2.2.8" + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.9" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4" } }, "node_modules/@ai-sdk/google-vertex": { - "version": "2.2.27", - "resolved": "https://registry.npmjs.org/@ai-sdk/google-vertex/-/google-vertex-2.2.27.tgz", - "integrity": "sha512-iDGX/2yrU4OOL1p/ENpfl3MWxuqp9/bE22Z8Ip4DtLCUx6ismUNtrKO357igM1/3jrM6t9C6egCPniHqBsHOJA==", + "version": "3.0.29", + "resolved": "https://registry.npmjs.org/@ai-sdk/google-vertex/-/google-vertex-3.0.29.tgz", + "integrity": "sha512-XJbZtMRj7EAJ1kmYvJdV1StgLLx7xYxrGg6buxeNcBWNTHgSNdQAoqdoG5uo5etfumkPR6mKV7D4ScREg+aPOg==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/anthropic": "1.2.12", - "@ai-sdk/google": "1.2.22", - "@ai-sdk/provider": "1.1.3", - "@ai-sdk/provider-utils": "2.2.8", + "@ai-sdk/anthropic": "2.0.18", + "@ai-sdk/google": "2.0.16", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.9", "google-auth-library": "^9.15.0" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4" } }, "node_modules/@ai-sdk/groq": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@ai-sdk/groq/-/groq-1.2.9.tgz", - "integrity": "sha512-7MoDaxm8yWtiRbD1LipYZG0kBl+Xe0sv/EeyxnHnGPZappXdlgtdOgTZVjjXkT3nWP30jjZi9A45zoVrBMb3Xg==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@ai-sdk/groq/-/groq-2.0.21.tgz", + "integrity": "sha512-ULDrbFFDLk1+1tTEAMdSgw1jmUxwMXTgul3+sL/T/5ooDa5akMsxpywx5WUVEtttRQX1m8jYp6HLpts972jfuA==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.1.3", - "@ai-sdk/provider-utils": "2.2.8" + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.9" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4" } }, "node_modules/@ai-sdk/mistral": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@ai-sdk/mistral/-/mistral-1.2.8.tgz", - "integrity": "sha512-lv857D9UJqCVxiq2Fcu7mSPTypEHBUqLl1K+lCaP6X/7QAkcaxI36QDONG+tOhGHJOXTsS114u8lrUTaEiGXbg==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@ai-sdk/mistral/-/mistral-2.0.16.tgz", + "integrity": "sha512-pUReSoPm3GFRF8kO/TP5a5SmahRg69laODS6qMZKJolVhgf5IP0x7twv0Rdynq5PouOWlGtlGjSENBeQStmK/A==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.1.3", - "@ai-sdk/provider-utils": "2.2.8" + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.9" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4" } }, "node_modules/@ai-sdk/openai": { - "version": "1.3.24", - "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-1.3.24.tgz", - "integrity": "sha512-GYXnGJTHRTZc4gJMSmFRgEQudjqd4PUN0ZjQhPwOAYH1yOAvQoG/Ikqs+HyISRbLPCrhbZnPKCNHuRU4OfpW0Q==", + "version": "2.0.34", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-2.0.34.tgz", + "integrity": "sha512-ATMX1DyXANq2e6DVMpAcAOVvUKiMkNI0hCXbyHs7Bg0M8744B/jiGHM0Can9Ez3DnnLIfhoqZs4XQe1csscSiA==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.1.3", - "@ai-sdk/provider-utils": "2.2.8" + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.9" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4" } }, "node_modules/@ai-sdk/openai-compatible": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/@ai-sdk/openai-compatible/-/openai-compatible-0.2.16.tgz", - "integrity": "sha512-LkvfcM8slJedRyJa/MiMiaOzcMjV1zNDwzTHEGz7aAsgsQV0maLfmJRi/nuSwf5jmp0EouC+JXXDUj2l94HgQw==", + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai-compatible/-/openai-compatible-1.0.18.tgz", + "integrity": "sha512-WSxF83ZVvTpj2vKhgSNe95qr46TaTBRitF7LlX817r1vKAHw3MDFjjrxZTHbR58jcQWX6N9B3D2aX2Ro9fPBNA==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.1.3", - "@ai-sdk/provider-utils": "2.2.8" + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.9" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4" } }, "node_modules/@ai-sdk/perplexity": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@ai-sdk/perplexity/-/perplexity-1.1.9.tgz", - "integrity": "sha512-Ytolh/v2XupXbTvjE18EFBrHLoNMH0Ueji3lfSPhCoRUfkwrgZ2D9jlNxvCNCCRiGJG5kfinSHvzrH5vGDklYA==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@ai-sdk/perplexity/-/perplexity-2.0.10.tgz", + "integrity": "sha512-MexVpPZSAQr+io4jQBMQpHHiK22nouTOp05C6txYkUhuOuA4XjAO7S9XxEbFwGMrNzPChdHsx2315tNGR47G5A==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.1.3", - "@ai-sdk/provider-utils": "2.2.8" + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.9" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4" } }, "node_modules/@ai-sdk/provider": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", - "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", "license": "Apache-2.0", "dependencies": { "json-schema": "^0.4.0" @@ -591,78 +606,37 @@ } }, "node_modules/@ai-sdk/provider-utils": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz", - "integrity": "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.9.tgz", + "integrity": "sha512-Pm571x5efqaI4hf9yW4KsVlDBDme8++UepZRnq+kqVBWWjgvGhQlzU8glaFq0YJEB9kkxZHbRRyVeHoV2sRYaQ==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.1.3", - "nanoid": "^3.3.8", - "secure-json-parse": "^2.7.0" + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.5" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.23.8" - } - }, - "node_modules/@ai-sdk/react": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-1.2.12.tgz", - "integrity": "sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider-utils": "2.2.8", - "@ai-sdk/ui-utils": "1.2.11", - "swr": "^2.2.5", - "throttleit": "2.1.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "^18 || ^19 || ^19.0.0-rc", - "zod": "^3.23.8" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "node_modules/@ai-sdk/ui-utils": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.2.11.tgz", - "integrity": "sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "1.1.3", - "@ai-sdk/provider-utils": "2.2.8", - "zod-to-json-schema": "^3.24.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.23.8" + "zod": "^3.25.76 || ^4" } }, "node_modules/@ai-sdk/xai": { - "version": "1.2.18", - "resolved": "https://registry.npmjs.org/@ai-sdk/xai/-/xai-1.2.18.tgz", - "integrity": "sha512-T70WEu+UKXD/Fdj9ck+ujIqUp5ru06mJ/7usePXeXL5EeTi8KXevXF9AMIDdhyD5MZPT2jI8t19lEr8Bhuh/Bg==", + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@ai-sdk/xai/-/xai-2.0.22.tgz", + "integrity": "sha512-97m55Yw+SH5M42VDWUnajRjB1tbP2mCFExmhgCgXjzv7QCiBCM/rbbEJ8HSxuhR2DDqh20fdVmSCdJ5tSL65MA==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/openai-compatible": "0.2.16", - "@ai-sdk/provider": "1.1.3", - "@ai-sdk/provider-utils": "2.2.8" + "@ai-sdk/openai-compatible": "1.0.18", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.9" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.25.76 || ^4" } }, "node_modules/@alcalzone/ansi-tokenize": { @@ -756,36 +730,6 @@ "@img/sharp-win32-x64": "^0.33.5" } }, - "node_modules/@anthropic-ai/sdk": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.39.0.tgz", - "integrity": "sha512-eMyDIPRZbt1CCLErRCi3exlAvNkBtRe+kW5vvJyef93PmNr/clstYgHhtvmkxN82nlKgzyGPCyGxrm0JQ1ZIdg==", - "license": "MIT", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - } - }, - "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { - "version": "18.19.126", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.126.tgz", - "integrity": "sha512-8AXQlBfrGmtYJEJUPs63F/uZQqVeFiN9o6NUjbDJYfxNxFnArlZufANPw4h6dGhYGKxcyw+TapXFvEsguzIQow==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@anthropic-ai/sdk/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" - }, "node_modules/@ark/schema": { "version": "0.49.0", "resolved": "https://registry.npmjs.org/@ark/schema/-/schema-0.49.0.tgz", @@ -1019,45 +963,45 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.891.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.891.0.tgz", - "integrity": "sha512-DdIoeB+JnA9YtY+aNaaWQBYW99mqM+ERGcIPIYlwM9vJMi0NhU028avTT2hDgNzgoFtMbnxQP0keeJpQgnCvAg==", + "version": "3.895.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.895.0.tgz", + "integrity": "sha512-IwU2LiIqDSq4wj8WtDkWAkKbjnV24EOufqXzcLQfr/QJKd0qkGKeVImOVPXPT8wtksEpB0ViVOpIEyML3BqvAg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.890.0", - "@aws-sdk/credential-provider-node": "3.891.0", - "@aws-sdk/middleware-host-header": "3.891.0", - "@aws-sdk/middleware-logger": "3.891.0", - "@aws-sdk/middleware-recursion-detection": "3.891.0", - "@aws-sdk/middleware-user-agent": "3.891.0", - "@aws-sdk/region-config-resolver": "3.890.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.891.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.891.0", + "@aws-sdk/core": "3.894.0", + "@aws-sdk/credential-provider-node": "3.895.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.895.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.895.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.0", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.2", - "@smithy/middleware-retry": "^4.2.3", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", "@smithy/node-config-provider": "^4.2.2", "@smithy/node-http-handler": "^4.2.1", "@smithy/protocol-http": "^5.2.1", - "@smithy/smithy-client": "^4.6.2", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.2", - "@smithy/util-defaults-mode-node": "^4.1.2", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", @@ -1069,44 +1013,44 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.891.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.891.0.tgz", - "integrity": "sha512-QMDaD9GhJe7l0KQp3Tt7dzqFCz/H2XuyNjQgvi10nM1MfI1RagmLtmEhZveQxMPhZ/AtohLSK0Tisp/I5tR8RQ==", + "version": "3.895.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.895.0.tgz", + "integrity": "sha512-AQHk6iJrwce/NwZa5/Njy0ZGoHdxWCajkgufhXk53L0kRiC3vUPPWEV1m1F3etQWhaUsatcO2xtRuKvLpe4zgA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.890.0", - "@aws-sdk/middleware-host-header": "3.891.0", - "@aws-sdk/middleware-logger": "3.891.0", - "@aws-sdk/middleware-recursion-detection": "3.891.0", - "@aws-sdk/middleware-user-agent": "3.891.0", - "@aws-sdk/region-config-resolver": "3.890.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.891.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.891.0", + "@aws-sdk/core": "3.894.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.895.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.895.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.0", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.2", - "@smithy/middleware-retry": "^4.2.3", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", "@smithy/node-config-provider": "^4.2.2", "@smithy/node-http-handler": "^4.2.1", "@smithy/protocol-http": "^5.2.1", - "@smithy/smithy-client": "^4.6.2", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.2", - "@smithy/util-defaults-mode-node": "^4.1.2", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", @@ -1118,25 +1062,24 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.890.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.890.0.tgz", - "integrity": "sha512-CT+yjhytHdyKvV3Nh/fqBjnZ8+UiQZVz4NMm4LrPATgVSOdfygXHqrWxrPTVgiBtuJWkotg06DF7+pTd5ekLBw==", + "version": "3.894.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.894.0.tgz", + "integrity": "sha512-7zbO31NV2FaocmMtWOg/fuTk3PC2Ji2AC0Fi2KqrppEDIcwLlTTuT9w/rdu/93Pz+wyUhCxWnDc0tPbwtCLs+A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", - "@aws-sdk/xml-builder": "3.887.0", - "@smithy/core": "^3.11.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/xml-builder": "3.894.0", + "@smithy/core": "^3.11.1", "@smithy/node-config-provider": "^4.2.2", "@smithy/property-provider": "^4.1.1", "@smithy/protocol-http": "^5.2.1", "@smithy/signature-v4": "^5.2.1", - "@smithy/smithy-client": "^4.6.2", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-middleware": "^4.1.1", "@smithy/util-utf8": "^4.1.0", - "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { @@ -1144,13 +1087,13 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.891.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.891.0.tgz", - "integrity": "sha512-3dKE1bMEyEuvEe+xx/rCUn4GsJxykwlzIXfPwECUqDWVZJDVjZTmsIhAnnhkVMmBOULPCXSaFXB0itJErWm/Wg==", + "version": "3.895.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.895.0.tgz", + "integrity": "sha512-MxKRfRBM+5yRoAWmF9icfP4NrRYyD5BaQRl+uR5EhT8mxuImMj0tyY9g/fUwKjxNPJ2LKFtrgadZSXUOB+OkNg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.891.0", - "@aws-sdk/types": "3.887.0", + "@aws-sdk/client-cognito-identity": "3.895.0", + "@aws-sdk/types": "3.893.0", "@smithy/property-provider": "^4.1.1", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" @@ -1160,13 +1103,13 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.890.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.890.0.tgz", - "integrity": "sha512-BtsUa2y0Rs8phmB2ScZ5RuPqZVmxJJXjGfeiXctmLFTxTwoayIK1DdNzOWx6SRMPVc3s2RBGN4vO7T1TwN+ajA==", + "version": "3.894.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.894.0.tgz", + "integrity": "sha512-2aiQJIRWOuROPPISKgzQnH/HqSfucdk5z5VMemVH3Mm2EYOrzBwmmiiFpmSMN3ST+sE8c7gusqycUchP+KfALQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.890.0", - "@aws-sdk/types": "3.887.0", + "@aws-sdk/core": "3.894.0", + "@aws-sdk/types": "3.893.0", "@smithy/property-provider": "^4.1.1", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" @@ -1176,20 +1119,20 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.890.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.890.0.tgz", - "integrity": "sha512-0sru3LVwsuGYyzbD90EC/d5HnCZ9PL4O9BA2LYT6b9XceC005Oj86uzE47LXb+mDhTAt3T6ZO0+ZcVQe0DDi8w==", + "version": "3.894.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.894.0.tgz", + "integrity": "sha512-Z5QQpqFRflszrT+lUq6+ORuu4jRDcpgCUSoTtlhczidMqfdOSckKmK3chZEfmUUJPSwoFQZ7EiVTsX3c886fBg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.890.0", - "@aws-sdk/types": "3.887.0", + "@aws-sdk/core": "3.894.0", + "@aws-sdk/types": "3.893.0", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/node-http-handler": "^4.2.1", "@smithy/property-provider": "^4.1.1", "@smithy/protocol-http": "^5.2.1", - "@smithy/smithy-client": "^4.6.2", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", - "@smithy/util-stream": "^4.3.1", + "@smithy/util-stream": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1197,19 +1140,19 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.891.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.891.0.tgz", - "integrity": "sha512-9LOfm97oy2d2frwCQjl53XLkoEYG6/rsNM3Y6n8UtRU3bzGAEjixdIuv3b6Z/Mk/QLeikcQEJ9FMC02DuQh2Yw==", + "version": "3.895.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.895.0.tgz", + "integrity": "sha512-uIh7N4IN/yIk+qYMAkVpVkjhB90SGKSfaXEVcnmxzBDG6e5304HKT0esqoCVZvtFfLKasjm2TOpalM5l3fi/dA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.890.0", - "@aws-sdk/credential-provider-env": "3.890.0", - "@aws-sdk/credential-provider-http": "3.890.0", - "@aws-sdk/credential-provider-process": "3.890.0", - "@aws-sdk/credential-provider-sso": "3.891.0", - "@aws-sdk/credential-provider-web-identity": "3.891.0", - "@aws-sdk/nested-clients": "3.891.0", - "@aws-sdk/types": "3.887.0", + "@aws-sdk/core": "3.894.0", + "@aws-sdk/credential-provider-env": "3.894.0", + "@aws-sdk/credential-provider-http": "3.894.0", + "@aws-sdk/credential-provider-process": "3.894.0", + "@aws-sdk/credential-provider-sso": "3.895.0", + "@aws-sdk/credential-provider-web-identity": "3.895.0", + "@aws-sdk/nested-clients": "3.895.0", + "@aws-sdk/types": "3.893.0", "@smithy/credential-provider-imds": "^4.1.2", "@smithy/property-provider": "^4.1.1", "@smithy/shared-ini-file-loader": "^4.2.0", @@ -1221,18 +1164,18 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.891.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.891.0.tgz", - "integrity": "sha512-IjGvQJhpCN512xlT1DFGaPeE1q0YEm/X62w7wHsRpBindW//M+heSulJzP4KPkoJvmJNVu1NxN26/p4uH+M8TQ==", + "version": "3.895.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.895.0.tgz", + "integrity": "sha512-7xsBCmkBUz+2sNqNsDJ1uyQsBvwhNFzwFt8wX39WrFJTpTQh3uNQ5g8QH21BbkKqIFKCLdvgHgwt3Ub5RGVuPA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.890.0", - "@aws-sdk/credential-provider-http": "3.890.0", - "@aws-sdk/credential-provider-ini": "3.891.0", - "@aws-sdk/credential-provider-process": "3.890.0", - "@aws-sdk/credential-provider-sso": "3.891.0", - "@aws-sdk/credential-provider-web-identity": "3.891.0", - "@aws-sdk/types": "3.887.0", + "@aws-sdk/credential-provider-env": "3.894.0", + "@aws-sdk/credential-provider-http": "3.894.0", + "@aws-sdk/credential-provider-ini": "3.895.0", + "@aws-sdk/credential-provider-process": "3.894.0", + "@aws-sdk/credential-provider-sso": "3.895.0", + "@aws-sdk/credential-provider-web-identity": "3.895.0", + "@aws-sdk/types": "3.893.0", "@smithy/credential-provider-imds": "^4.1.2", "@smithy/property-provider": "^4.1.1", "@smithy/shared-ini-file-loader": "^4.2.0", @@ -1244,13 +1187,13 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.890.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.890.0.tgz", - "integrity": "sha512-dWZ54TI1Q+UerF5YOqGiCzY+x2YfHsSQvkyM3T4QDNTJpb/zjiVv327VbSOULOlI7gHKWY/G3tMz0D9nWI7YbA==", + "version": "3.894.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.894.0.tgz", + "integrity": "sha512-VU74GNsj+SsO+pl4d+JimlQ7+AcderZaC6bFndQssQdFZ5NRad8yFNz5Xbec8CPJr+z/VAwHib6431F5nYF46g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.890.0", - "@aws-sdk/types": "3.887.0", + "@aws-sdk/core": "3.894.0", + "@aws-sdk/types": "3.893.0", "@smithy/property-provider": "^4.1.1", "@smithy/shared-ini-file-loader": "^4.2.0", "@smithy/types": "^4.5.0", @@ -1261,15 +1204,15 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.891.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.891.0.tgz", - "integrity": "sha512-RtF9BwUIZqc/7sFbK6n6qhe0tNaWJQwin89nSeZ1HOsA0Z7TfTOelX8Otd0L5wfeVBMVcgiN3ofqrcZgjFjQjA==", + "version": "3.895.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.895.0.tgz", + "integrity": "sha512-bZCcHUZGz+XlCaK0KEOHGHkMtlwIvnpxJvlZtSCVaBdX/IgouxaB42fxChflxSMRWF45ygdezfky4i17f6vC4w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.891.0", - "@aws-sdk/core": "3.890.0", - "@aws-sdk/token-providers": "3.891.0", - "@aws-sdk/types": "3.887.0", + "@aws-sdk/client-sso": "3.895.0", + "@aws-sdk/core": "3.894.0", + "@aws-sdk/token-providers": "3.895.0", + "@aws-sdk/types": "3.893.0", "@smithy/property-provider": "^4.1.1", "@smithy/shared-ini-file-loader": "^4.2.0", "@smithy/types": "^4.5.0", @@ -1280,14 +1223,14 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.891.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.891.0.tgz", - "integrity": "sha512-yq7kzm1sHZ0GZrtS+qpjMUp4ES66UoT1+H2xxrOuAZkvUnkpQq1iSjOgBgJJ9FW1EsDUEmlgn94i4hJTNvm7fg==", + "version": "3.895.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.895.0.tgz", + "integrity": "sha512-tKbXbOp2xrL02fxKvB7ko1E4Uvyy5TF9qi5pT2MVWNnfSsBlUM80aJ6tyUPKWXdUTdAlPrU3XcwgQl/DnnRa9A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.890.0", - "@aws-sdk/nested-clients": "3.891.0", - "@aws-sdk/types": "3.887.0", + "@aws-sdk/core": "3.894.0", + "@aws-sdk/nested-clients": "3.895.0", + "@aws-sdk/types": "3.893.0", "@smithy/property-provider": "^4.1.1", "@smithy/shared-ini-file-loader": "^4.2.0", "@smithy/types": "^4.5.0", @@ -1298,25 +1241,25 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.891.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.891.0.tgz", - "integrity": "sha512-zIrMjHMrbOtqu3E7Kp/YUeEasE6OHLupWeUWJZhSduAzu4BOZXK8mflkat1Ul4OMtLh0Zlk2pztW6NedMpkYZA==", + "version": "3.895.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.895.0.tgz", + "integrity": "sha512-YAOjBCHKOqWIn1nFOMd1q3Za0h3wzTmcEpZdplhOq7EDlWEOTPGu+NuX2sdZx6fsMWCMzogFJdvV/p8lUXtHcg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.891.0", - "@aws-sdk/core": "3.890.0", - "@aws-sdk/credential-provider-cognito-identity": "3.891.0", - "@aws-sdk/credential-provider-env": "3.890.0", - "@aws-sdk/credential-provider-http": "3.890.0", - "@aws-sdk/credential-provider-ini": "3.891.0", - "@aws-sdk/credential-provider-node": "3.891.0", - "@aws-sdk/credential-provider-process": "3.890.0", - "@aws-sdk/credential-provider-sso": "3.891.0", - "@aws-sdk/credential-provider-web-identity": "3.891.0", - "@aws-sdk/nested-clients": "3.891.0", - "@aws-sdk/types": "3.887.0", + "@aws-sdk/client-cognito-identity": "3.895.0", + "@aws-sdk/core": "3.894.0", + "@aws-sdk/credential-provider-cognito-identity": "3.895.0", + "@aws-sdk/credential-provider-env": "3.894.0", + "@aws-sdk/credential-provider-http": "3.894.0", + "@aws-sdk/credential-provider-ini": "3.895.0", + "@aws-sdk/credential-provider-node": "3.895.0", + "@aws-sdk/credential-provider-process": "3.894.0", + "@aws-sdk/credential-provider-sso": "3.895.0", + "@aws-sdk/credential-provider-web-identity": "3.895.0", + "@aws-sdk/nested-clients": "3.895.0", + "@aws-sdk/types": "3.893.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.0", + "@smithy/core": "^3.11.1", "@smithy/credential-provider-imds": "^4.1.2", "@smithy/node-config-provider": "^4.2.2", "@smithy/property-provider": "^4.1.1", @@ -1328,12 +1271,12 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.891.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.891.0.tgz", - "integrity": "sha512-OYaxbqNDeo/noE7MfYWWQDu86cF/R/bMXdZ2QZwpWpX2yjy8xMwxSg7c/4tEK/OtiDZTKRXXrvPxRxG2+1bnJw==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.893.0.tgz", + "integrity": "sha512-qL5xYRt80ahDfj9nDYLhpCNkDinEXvjLe/Qen/Y/u12+djrR2MB4DRa6mzBCkLkdXDtf0WAoW2EZsNCfGrmOEQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", + "@aws-sdk/types": "3.893.0", "@smithy/protocol-http": "^5.2.1", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" @@ -1343,12 +1286,12 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.891.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.891.0.tgz", - "integrity": "sha512-azL4mg1H1FLpOAECiFtU+r+9VDhpeF6Vh9pzD4m51BWPJ60CVnyHayeI/0gqPsL60+5l90/b9VWonoA8DvAvpg==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.893.0.tgz", + "integrity": "sha512-ZqzMecjju5zkBquSIfVfCORI/3Mge21nUY4nWaGQy+NUXehqCGG4W7AiVpiHGOcY2cGJa7xeEkYcr2E2U9U0AA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", + "@aws-sdk/types": "3.893.0", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -1357,12 +1300,12 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.891.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.891.0.tgz", - "integrity": "sha512-n++KwAEnNlvx5NZdIQZnvl2GjSH/YE3xGSqW2GmPB5780tFY5lOYSb1uA+EUzJSVX4oAKAkSPdR2AOW09kzoew==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.893.0.tgz", + "integrity": "sha512-H7Zotd9zUHQAr/wr3bcWHULYhEeoQrF54artgsoUGIf/9emv6LzY89QUccKIxYd6oHKNTrTyXm9F0ZZrzXNxlg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", + "@aws-sdk/types": "3.893.0", "@aws/lambda-invoke-store": "^0.0.1", "@smithy/protocol-http": "^5.2.1", "@smithy/types": "^4.5.0", @@ -1373,15 +1316,15 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.891.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.891.0.tgz", - "integrity": "sha512-xyxIZtR7FunCWymPAxEm61VUq9lruXxWIYU5AIh5rt0av7nXa2ayAAlscQ7ch9jUlw+lbC2PVbw0K/OYrMovuA==", + "version": "3.895.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.895.0.tgz", + "integrity": "sha512-JUqQW2RPp4I95wZ/Im9fTiaX3DF55oJgeoiNlLdHkQZPSNNS/pT1WMWMReSvJdcfSNU3xSUaLtI+h4mQjQUDbQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.890.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.891.0", - "@smithy/core": "^3.11.0", + "@aws-sdk/core": "3.894.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", + "@smithy/core": "^3.11.1", "@smithy/protocol-http": "^5.2.1", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" @@ -1391,44 +1334,44 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.891.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.891.0.tgz", - "integrity": "sha512-cpol+Yk4T3GXPXbRfUyN2u6tpMEHUxAiesZgrfMm11QGHV+pmzyejJV/QZ0pdJKj5sXKaCr4DCntoJ5iBx++Cw==", + "version": "3.895.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.895.0.tgz", + "integrity": "sha512-8w1ihfYgvds6kfal/qJXQQrHRsKYh2nujSyzWMo2TMKMze9WPZA93G4mRbRtKtbSuQ66mVWePH8Cksq35ABu2Q==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.890.0", - "@aws-sdk/middleware-host-header": "3.891.0", - "@aws-sdk/middleware-logger": "3.891.0", - "@aws-sdk/middleware-recursion-detection": "3.891.0", - "@aws-sdk/middleware-user-agent": "3.891.0", - "@aws-sdk/region-config-resolver": "3.890.0", - "@aws-sdk/types": "3.887.0", - "@aws-sdk/util-endpoints": "3.891.0", - "@aws-sdk/util-user-agent-browser": "3.887.0", - "@aws-sdk/util-user-agent-node": "3.891.0", + "@aws-sdk/core": "3.894.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.895.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.895.0", "@smithy/config-resolver": "^4.2.2", - "@smithy/core": "^3.11.0", + "@smithy/core": "^3.11.1", "@smithy/fetch-http-handler": "^5.2.1", "@smithy/hash-node": "^4.1.1", "@smithy/invalid-dependency": "^4.1.1", "@smithy/middleware-content-length": "^4.1.1", - "@smithy/middleware-endpoint": "^4.2.2", - "@smithy/middleware-retry": "^4.2.3", + "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/middleware-retry": "^4.2.4", "@smithy/middleware-serde": "^4.1.1", "@smithy/middleware-stack": "^4.1.1", "@smithy/node-config-provider": "^4.2.2", "@smithy/node-http-handler": "^4.2.1", "@smithy/protocol-http": "^5.2.1", - "@smithy/smithy-client": "^4.6.2", + "@smithy/smithy-client": "^4.6.3", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-base64": "^4.1.0", "@smithy/util-body-length-browser": "^4.1.0", "@smithy/util-body-length-node": "^4.1.0", - "@smithy/util-defaults-mode-browser": "^4.1.2", - "@smithy/util-defaults-mode-node": "^4.1.2", + "@smithy/util-defaults-mode-browser": "^4.1.3", + "@smithy/util-defaults-mode-node": "^4.1.3", "@smithy/util-endpoints": "^3.1.2", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", @@ -1440,12 +1383,12 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.890.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.890.0.tgz", - "integrity": "sha512-VfdT+tkF9groRYNzKvQCsCGDbOQdeBdzyB1d6hWiq22u13UafMIoskJ1ec0i0H1X29oT6mjTitfnvPq1UiKwzQ==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.893.0.tgz", + "integrity": "sha512-/cJvh3Zsa+Of0Zbg7vl9wp/kZtdb40yk/2+XcroAMVPO9hPvmS9r/UOm6tO7FeX4TtkRFwWaQJiTZTgSdsPY+Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", + "@aws-sdk/types": "3.893.0", "@smithy/node-config-provider": "^4.2.2", "@smithy/types": "^4.5.0", "@smithy/util-config-provider": "^4.1.0", @@ -1457,14 +1400,14 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.891.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.891.0.tgz", - "integrity": "sha512-n31JDMWhj/53QX33C97+1W63JGtgO8pg1/Tfmv4f9TR2VSGf1rFwYH7cPZ7dVIMmcUBeI2VCVhwUIabGNHw86Q==", + "version": "3.895.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.895.0.tgz", + "integrity": "sha512-vJqrEHFFGRZ3ok5T+jII00sa2DQ3HdVkTBIfM0DcrcPssqDV18VKdA767qiBdIEN/cygjdBg8Ri/cuq6ER9BeQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.890.0", - "@aws-sdk/nested-clients": "3.891.0", - "@aws-sdk/types": "3.887.0", + "@aws-sdk/core": "3.894.0", + "@aws-sdk/nested-clients": "3.895.0", + "@aws-sdk/types": "3.893.0", "@smithy/property-provider": "^4.1.1", "@smithy/shared-ini-file-loader": "^4.2.0", "@smithy/types": "^4.5.0", @@ -1475,9 +1418,9 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.887.0.tgz", - "integrity": "sha512-fmTEJpUhsPsovQ12vZSpVTEP/IaRoJAMBGQXlQNjtCpkBp6Iq3KQDa/HDaPINE+3xxo6XvTdtibsNOd5zJLV9A==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.893.0.tgz", + "integrity": "sha512-Aht1nn5SnA0N+Tjv0dzhAY7CQbxVtmq1bBR6xI0MhG7p2XYVh1wXuKTzrldEvQWwA3odOYunAfT9aBiKZx9qIg==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.5.0", @@ -1488,12 +1431,12 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.891.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.891.0.tgz", - "integrity": "sha512-MgxvmHIQJbUK+YquX4bdjDw1MjdBqTRJGHs6iU2KM8nN1ut0bPwvavkq7NrY/wB3ZKKECqmv6J/nw+hYKKUIHA==", + "version": "3.895.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.895.0.tgz", + "integrity": "sha512-MhxBvWbwxmKknuggO2NeMwOVkHOYL98pZ+1ZRI5YwckoCL3AvISMnPJgfN60ww6AIXHGpkp+HhpFdKOe8RHSEg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", + "@aws-sdk/types": "3.893.0", "@smithy/types": "^4.5.0", "@smithy/url-parser": "^4.1.1", "@smithy/util-endpoints": "^3.1.2", @@ -1504,9 +1447,9 @@ } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.873.0.tgz", - "integrity": "sha512-xcVhZF6svjM5Rj89T1WzkjQmrTF6dpR2UvIHPMTnSZoNe6CixejPZ6f0JJ2kAhO8H+dUHwNBlsUgOTIKiK/Syg==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz", + "integrity": "sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -1516,25 +1459,25 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.887.0.tgz", - "integrity": "sha512-X71UmVsYc6ZTH4KU6hA5urOzYowSXc3qvroagJNLJYU1ilgZ529lP4J9XOYfEvTXkLR1hPFSRxa43SrwgelMjA==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.893.0.tgz", + "integrity": "sha512-PE9NtbDBW6Kgl1bG6A5fF3EPo168tnkj8TgMcT0sg4xYBWsBpq0bpJZRh+Jm5Bkwiw9IgTCLjEU7mR6xWaMB9w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.887.0", + "@aws-sdk/types": "3.893.0", "@smithy/types": "^4.5.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.891.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.891.0.tgz", - "integrity": "sha512-/mmvVL2PJE2NMTWj9JSY98OISx7yov0mi72eOViWCHQMRYJCN12DY54i1rc4Q/oPwJwTwIrx69MLjVhQ1OZsgw==", + "version": "3.895.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.895.0.tgz", + "integrity": "sha512-lLRC7BAFOPtJk4cZC0Q0MZBMCGF109QpGnug3L3n/2TJW02Sinz9lzA0ykBpYXe9j60LjIYSENCg+F4DZE5vxg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.891.0", - "@aws-sdk/types": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.895.0", + "@aws-sdk/types": "3.893.0", "@smithy/node-config-provider": "^4.2.2", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" @@ -1552,12 +1495,13 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.887.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.887.0.tgz", - "integrity": "sha512-lMwgWK1kNgUhHGfBvO/5uLe7TKhycwOn3eRCqsKPT9aPCx/HWuTlpcQp8oW2pCRGLS7qzcxqpQulcD+bbUL7XQ==", + "version": "3.894.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.894.0.tgz", + "integrity": "sha512-E6EAMc9dT1a2DOdo4zyOf3fp5+NJ2wI+mcm7RaW1baFIWDwcb99PpvWoV7YEiK7oaBDshuOEGWKUSYXdW+JYgA==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.5.0", + "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { @@ -3580,7 +3524,6 @@ "version": "0.1.22", "resolved": "https://registry.npmjs.org/@google/gemini-cli-core/-/gemini-cli-core-0.1.22.tgz", "integrity": "sha512-PvIod0b8+vB8Wfdpr4axiDopL6sxeQ/4qF4Q1zdXOD3ANUYSLuhq3Af8OrugA0so6vCjDMllyKcnOmGT6s6+ag==", - "optional": true, "dependencies": { "@google/genai": "1.13.0", "@modelcontextprotocol/sdk": "^1.11.0", @@ -3626,7 +3569,6 @@ "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.13.0.tgz", "integrity": "sha512-BxilXzE8cJ0zt5/lXk6KwuBcIT9P2Lbi2WXhwWMbxf1RNeC68/8DmYQqMrzQP333CieRMdbDXs0eNCphLoScWg==", "license": "Apache-2.0", - "optional": true, "dependencies": { "google-auth-library": "^9.14.2", "ws": "^8.18.0" @@ -3648,7 +3590,6 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz", "integrity": "sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==", "license": "BSD-2-Clause", - "optional": true, "engines": { "node": ">=12" }, @@ -3661,7 +3602,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", - "optional": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -3673,11 +3613,10 @@ } }, "node_modules/@google/genai": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.20.0.tgz", - "integrity": "sha512-QdShxO9LX35jFogy3iKprQNqgKKveux4H2QjOnyIvyHRuGi6PHiz3fjNf8Y0VPY8o5V2fHqR2XqiSVoz7yZs0w==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.14.0.tgz", + "integrity": "sha512-jirYprAAJU1svjwSDVCzyVq+FrJpJd5CSxR/g2Ga/gZ0ZYZpcWjMS75KJl9y71K1mDN+tcx6s21CzCbB2R840g==", "license": "Apache-2.0", - "optional": true, "dependencies": { "google-auth-library": "^9.14.2", "ws": "^8.18.0" @@ -3686,7 +3625,7 @@ "node": ">=20.0.0" }, "peerDependencies": { - "@modelcontextprotocol/sdk": "^1.11.4" + "@modelcontextprotocol/sdk": "^1.11.0" }, "peerDependenciesMeta": { "@modelcontextprotocol/sdk": { @@ -3699,7 +3638,6 @@ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.0.tgz", "integrity": "sha512-N8Jx6PaYzcTRNzirReJCtADVoq4z7+1KQ4E70jTg/koQiMoUSN1kbNjPOqpPbhMFhfU1/l7ixspPl8dNY+FoUg==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" @@ -3713,7 +3651,6 @@ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", "license": "Apache-2.0", - "optional": true, "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", @@ -5322,7 +5259,6 @@ "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", "license": "MIT", - "optional": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" @@ -5372,7 +5308,6 @@ "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", "license": "MIT", - "optional": true, "dependencies": { "debug": "^4.1.1" } @@ -5381,8 +5316,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", @@ -6501,6 +6435,16 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/@mintlify/scraping/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/@mintlify/validation": { "version": "0.1.469", "resolved": "https://registry.npmjs.org/@mintlify/validation/-/validation-0.1.469.tgz", @@ -6517,11 +6461,30 @@ "zod-to-json-schema": "^3.20.3" } }, + "node_modules/@mintlify/validation/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@mintlify/validation/node_modules/zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, "node_modules/@modelcontextprotocol/sdk": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.13.3.tgz", "integrity": "sha512-bGwA78F/U5G2jrnsdRkPY3IwIwZeWUEfb5o764b79lb0rJmMT76TLwKhdNZOWakOQtedYefwIR4emisEMvInKA==", - "devOptional": true, "license": "MIT", "dependencies": { "ajv": "^6.12.6", @@ -6545,7 +6508,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "devOptional": true, "license": "MIT", "dependencies": { "mime-types": "^3.0.0", @@ -6559,7 +6521,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "devOptional": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -6576,7 +6537,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "devOptional": true, "license": "MIT", "dependencies": { "bytes": "^3.1.2", @@ -6597,7 +6557,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "devOptional": true, "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -6610,7 +6569,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=6.6.0" @@ -6620,7 +6578,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "devOptional": true, "license": "MIT", "dependencies": { "accepts": "^2.0.0", @@ -6663,7 +6620,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "devOptional": true, "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -6681,7 +6637,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -6691,7 +6646,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "devOptional": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -6704,14 +6658,12 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "devOptional": true, "license": "MIT" }, "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -6721,7 +6673,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -6734,7 +6685,6 @@ "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -6744,7 +6694,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "devOptional": true, "license": "MIT", "dependencies": { "mime-db": "^1.54.0" @@ -6757,7 +6706,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -6767,7 +6715,6 @@ "version": "6.14.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "devOptional": true, "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -6783,7 +6730,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "devOptional": true, "license": "MIT", "dependencies": { "debug": "^4.3.5", @@ -6806,7 +6752,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "devOptional": true, "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", @@ -6822,7 +6767,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "devOptional": true, "license": "MIT", "dependencies": { "content-type": "^1.0.5", @@ -6833,6 +6777,24 @@ "node": ">= 0.6" } }, + "node_modules/@modelcontextprotocol/sdk/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, "node_modules/@napi-rs/wasm-runtime": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.5.tgz", @@ -6908,54 +6870,16 @@ } }, "node_modules/@openrouter/ai-sdk-provider": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-0.4.6.tgz", - "integrity": "sha512-oUa8xtssyUhiKEU/aW662lsZ0HUvIUTRk8vVIF3Ha3KI/DnqX54zmVIuzYnaDpermqhy18CHqblAY4dDt1JW3g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-1.2.0.tgz", + "integrity": "sha512-stuIwq7Yb7DNmk3GuCtz+oS3nZOY4TXEV3V5KsknDGQN7Fpu3KRMQVWRc1J073xKdf0FC9EHOctSyzsACmp5Ag==", "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "1.0.9", - "@ai-sdk/provider-utils": "2.1.10" - }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" - } - }, - "node_modules/@openrouter/ai-sdk-provider/node_modules/@ai-sdk/provider": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.0.9.tgz", - "integrity": "sha512-jie6ZJT2ZR0uVOVCDc9R2xCX5I/Dum/wEK28lx21PJx6ZnFAN9EzD2WsPhcDWfCgGx3OAZZ0GyM3CEobXpa9LA==", - "license": "Apache-2.0", - "dependencies": { - "json-schema": "^0.4.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@openrouter/ai-sdk-provider/node_modules/@ai-sdk/provider-utils": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.1.10.tgz", - "integrity": "sha512-4GZ8GHjOFxePFzkl3q42AU0DQOtTQ5w09vmaWUf/pKFXJPizlnzKSUkF0f+VkapIUfDugyMqPMT1ge8XQzVI7Q==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "1.0.9", - "eventsource-parser": "^3.0.0", - "nanoid": "^3.3.8", - "secure-json-parse": "^2.7.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.0.0" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } + "ai": "^5.0.0", + "zod": "^3.24.1 || ^v4" } }, "node_modules/@opentelemetry/api": { @@ -6972,7 +6896,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz", "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/api": "^1.0.0" }, @@ -6985,7 +6908,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz", "integrity": "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==", "license": "Apache-2.0", - "optional": true, "engines": { "node": ">=14" }, @@ -6998,7 +6920,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, @@ -7014,7 +6935,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.52.1.tgz", "integrity": "sha512-sXgcp4fsL3zCo96A0LmFIGYOj2LSEDI6wD7nBYRhuDDxeRsk18NQgqRVlCf4VIyTBZzGu1M7yOtdFukQPgII1A==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "1.25.1", @@ -7034,7 +6954,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.52.1.tgz", "integrity": "sha512-qKgywId2DbdowPZpOBXQKp0B8DfhfIArmSic15z13Nk/JAOccBUQdPwDjDnjsM5f0ckZFMVR2t/tijTUAqDZoA==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/core": "1.25.1", @@ -7054,7 +6973,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.52.1.tgz", "integrity": "sha512-CE0f1IEE1GQj8JWl/BxKvKwx9wBTLR09OpPQHaIs5LGBw3ODu8ek5kcbrHPNsFYh/pWh+pcjbZQoxq3CqvQVnA==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "1.25.1", @@ -7077,7 +6995,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.52.1.tgz", "integrity": "sha512-oAHPOy1sZi58bwqXaucd19F/v7+qE2EuVslQOEeLQT94CDuZJJ4tbWzx8DpYBTrOSzKqqrMtx9+PMxkrcbxOyQ==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/otlp-exporter-base": "0.52.1", @@ -7097,7 +7014,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.52.1.tgz", "integrity": "sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "1.25.1", @@ -7118,7 +7034,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.52.1.tgz", "integrity": "sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/otlp-exporter-base": "0.52.1", @@ -7138,7 +7053,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.52.1.tgz", "integrity": "sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/otlp-exporter-base": "0.52.1", @@ -7158,7 +7072,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.25.1.tgz", "integrity": "sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", @@ -7177,7 +7090,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz", "integrity": "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@types/shimmer": "^1.0.2", @@ -7198,7 +7110,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.52.1.tgz", "integrity": "sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/instrumentation": "0.52.1", @@ -7217,7 +7128,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.52.1.tgz", "integrity": "sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/otlp-transformer": "0.52.1" @@ -7234,7 +7144,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.52.1.tgz", "integrity": "sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "1.25.1", @@ -7253,7 +7162,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.52.1.tgz", "integrity": "sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/core": "1.25.1", @@ -7275,7 +7183,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.25.1.tgz", "integrity": "sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/core": "1.25.1" }, @@ -7291,7 +7198,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.25.1.tgz", "integrity": "sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/core": "1.25.1" }, @@ -7307,7 +7213,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" @@ -7324,7 +7229,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.52.1.tgz", "integrity": "sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/core": "1.25.1", @@ -7342,7 +7246,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", @@ -7360,7 +7263,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.52.1.tgz", "integrity": "sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/core": "1.25.1", @@ -7388,7 +7290,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", @@ -7406,7 +7307,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.25.1.tgz", "integrity": "sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ==", "license": "Apache-2.0", - "optional": true, "dependencies": { "@opentelemetry/context-async-hooks": "1.25.1", "@opentelemetry/core": "1.25.1", @@ -7427,7 +7327,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", "license": "Apache-2.0", - "optional": true, "engines": { "node": ">=14" } @@ -7511,36 +7410,31 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause", - "optional": true + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause", - "optional": true + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause", - "optional": true + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause", - "optional": true + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "license": "BSD-3-Clause", - "optional": true, "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" @@ -7550,36 +7444,31 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause", - "optional": true + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause", - "optional": true + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause", - "optional": true + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause", - "optional": true + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause", - "optional": true + "license": "BSD-3-Clause" }, "node_modules/@puppeteer/browsers": { "version": "2.3.0", @@ -8850,7 +8739,6 @@ "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", "license": "MIT", - "optional": true, "dependencies": { "domhandler": "^5.0.3", "selderee": "^0.11.0" @@ -9084,9 +8972,9 @@ } }, "node_modules/@smithy/core": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.11.1.tgz", - "integrity": "sha512-REH7crwORgdjSpYs15JBiIWOYjj0hJNC3aCecpJvAlMMaaqL5i2CLb1i6Hc4yevToTKSqslLMI9FKjhugEwALA==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.12.0.tgz", + "integrity": "sha512-zJeAgogZfbwlPGL93y4Z/XNeIN37YCreRUd6YMIRvaq+6RnBK8PPYYIQ85Is/GglPh3kNImD5riDCXbVSDpCiQ==", "license": "Apache-2.0", "dependencies": { "@smithy/middleware-serde": "^4.1.1", @@ -9097,27 +8985,13 @@ "@smithy/util-middleware": "^4.1.1", "@smithy/util-stream": "^4.3.2", "@smithy/util-utf8": "^4.1.0", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/uuid": "^1.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/core/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@smithy/credential-provider-imds": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.1.2.tgz", @@ -9220,12 +9094,12 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.2.3.tgz", - "integrity": "sha512-+1H5A28DeffRVrqmVmtqtRraEjoaC6JVap3xEQdVoBh2EagCVY7noPmcBcG4y7mnr9AJitR1ZAse2l+tEtK5vg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.2.4.tgz", + "integrity": "sha512-FZ4hzupOmthm8Q8ujYrd0I+/MHwVMuSTdkDtIQE0xVuvJt9pLT6Q+b0p4/t+slDyrpcf+Wj7SN+ZqT5OryaaZg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.11.1", + "@smithy/core": "^3.12.0", "@smithy/middleware-serde": "^4.1.1", "@smithy/node-config-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.2.0", @@ -9239,39 +9113,25 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.2.4.tgz", - "integrity": "sha512-amyqYQFewnAviX3yy/rI/n1HqAgfvUdkEhc04kDjxsngAUREKuOI24iwqQUirrj6GtodWmR4iO5Zeyl3/3BwWg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.3.0.tgz", + "integrity": "sha512-qhEX9745fAxZvtLM4bQJAVC98elWjiMO2OiHl1s6p7hUzS4QfZO1gXUYNwEK8m0J6NoCD5W52ggWxbIDHI0XSg==", "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^4.2.2", "@smithy/protocol-http": "^5.2.1", "@smithy/service-error-classification": "^4.1.2", - "@smithy/smithy-client": "^4.6.3", + "@smithy/smithy-client": "^4.6.4", "@smithy/types": "^4.5.0", "@smithy/util-middleware": "^4.1.1", "@smithy/util-retry": "^4.1.2", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/uuid": "^1.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/middleware-retry/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@smithy/middleware-serde": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.1.1.tgz", @@ -9428,13 +9288,13 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.6.3.tgz", - "integrity": "sha512-K27LqywsaqKz4jusdUQYJh/YP2VbnbdskZ42zG8xfV+eovbTtMc2/ZatLWCfSkW0PDsTUXlpvlaMyu8925HsOw==", + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.6.4.tgz", + "integrity": "sha512-qL7O3VDyfzCSN9r+sdbQXGhaHtrfSJL30En6Jboj0I3bobf2g1/T0eP2L4qxqrEW26gWhJ4THI4ElVVLjYyBHg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.11.1", - "@smithy/middleware-endpoint": "^4.2.3", + "@smithy/core": "^3.12.0", + "@smithy/middleware-endpoint": "^4.2.4", "@smithy/middleware-stack": "^4.1.1", "@smithy/protocol-http": "^5.2.1", "@smithy/types": "^4.5.0", @@ -9535,13 +9395,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.1.3.tgz", - "integrity": "sha512-5fm3i2laE95uhY6n6O6uGFxI5SVbqo3/RWEuS3YsT0LVmSZk+0eUqPhKd4qk0KxBRPaT5VNT/WEBUqdMyYoRgg==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.1.4.tgz", + "integrity": "sha512-mLDJ1s4eA3vwOGaQOEPlg5LB4LdZUUMpB5UMOMofeGhWqiS7WR7dTpLiNi9zVn+YziKUd3Af5NLfxDs7NJqmIw==", "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^4.1.1", - "@smithy/smithy-client": "^4.6.3", + "@smithy/smithy-client": "^4.6.4", "@smithy/types": "^4.5.0", "bowser": "^2.11.0", "tslib": "^2.6.2" @@ -9551,16 +9411,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.1.3.tgz", - "integrity": "sha512-lwnMzlMslZ9GJNt+/wVjz6+fe9Wp5tqR1xAyQn+iywmP+Ymj0F6NhU/KfHM5jhGPQchRSCcau5weKhFdLIM4cA==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.1.4.tgz", + "integrity": "sha512-pjX2iMTcOASaSanAd7bu6i3fcMMezr3NTr8Rh64etB0uHRZi+Aw86DoCxPESjY4UTIuA06hhqtTtw95o//imYA==", "license": "Apache-2.0", "dependencies": { "@smithy/config-resolver": "^4.2.2", "@smithy/credential-provider-imds": "^4.1.2", "@smithy/node-config-provider": "^4.2.2", "@smithy/property-provider": "^4.1.1", - "@smithy/smithy-client": "^4.6.3", + "@smithy/smithy-client": "^4.6.4", "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, @@ -9665,6 +9525,18 @@ "node": ">=18.0.0" } }, + "node_modules/@smithy/uuid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.0.0.tgz", + "integrity": "sha512-OlA/yZHh0ekYFnbUkmYBDQPE6fGfdrvgz39ktp8Xf+FA6BfxLejPTMDOG0Nfk5/rDySAz1dRbFf24zaAFYVXlQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", @@ -10611,12 +10483,6 @@ "@types/ms": "*" } }, - "node_modules/@types/diff-match-patch": { - "version": "1.0.36", - "resolved": "https://registry.npmjs.org/@types/diff-match-patch/-/diff-match-patch-1.0.36.tgz", - "integrity": "sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==", - "license": "MIT" - }, "node_modules/@types/es-aggregate-error": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/es-aggregate-error/-/es-aggregate-error-1.0.6.tgz", @@ -10648,7 +10514,6 @@ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", "license": "MIT", - "optional": true, "dependencies": { "@types/minimatch": "^5.1.2", "@types/node": "*" @@ -10678,8 +10543,7 @@ "version": "9.0.4", "resolved": "https://registry.npmjs.org/@types/html-to-text/-/html-to-text-9.0.4.tgz", "integrity": "sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ==", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/@types/http-cache-semantics": { "version": "4.0.4", @@ -10798,8 +10662,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/@types/mocha": { "version": "10.0.10", @@ -10834,16 +10697,6 @@ "undici-types": "~6.21.0" } }, - "node_modules/@types/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.4" - } - }, "node_modules/@types/phoenix": { "version": "1.6.6", "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.6.tgz", @@ -10874,8 +10727,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/@types/stack-utils": { "version": "2.0.3", @@ -10914,12 +10766,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "license": "MIT" - }, "node_modules/@types/vscode": { "version": "1.104.0", "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.104.0.tgz", @@ -11482,6 +11328,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" @@ -11520,7 +11367,6 @@ "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "license": "MIT", - "optional": true, "peerDependencies": { "acorn": "^8" } @@ -11567,18 +11413,6 @@ "node": ">= 14" } }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "license": "MIT", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, "node_modules/aggregate-error": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", @@ -11597,51 +11431,201 @@ } }, "node_modules/ai": { - "version": "4.3.19", - "resolved": "https://registry.npmjs.org/ai/-/ai-4.3.19.tgz", - "integrity": "sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q==", + "version": "5.0.51", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.51.tgz", + "integrity": "sha512-ToKW099QWUJNqePZbWGg8FSfxTxS3UN9U6yCla8rYdW0EBTDNPnpRwK1N6ER9TfV+dFtdUu+ZgKSlhQnEThriQ==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "1.1.3", - "@ai-sdk/provider-utils": "2.2.8", - "@ai-sdk/react": "1.2.12", - "@ai-sdk/ui-utils": "1.2.11", - "@opentelemetry/api": "1.9.0", - "jsondiffpatch": "0.6.0" + "@ai-sdk/gateway": "1.0.28", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.9", + "@opentelemetry/api": "1.9.0" }, "engines": { "node": ">=18" }, "peerDependencies": { - "react": "^18 || ^19 || ^19.0.0-rc", - "zod": "^3.23.8" + "zod": "^3.25.76 || ^4" + } + }, + "node_modules/ai-sdk-provider-claude-code": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/ai-sdk-provider-claude-code/-/ai-sdk-provider-claude-code-1.1.4.tgz", + "integrity": "sha512-nTduCaKHKbeI0kDvmJNzUEvkwRWr91E8WSqKqJLrgy3H58iK46Ccyor1HJn8pyPLkxfCT84v4UtudIwJkIDeRA==", + "license": "MIT", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.3", + "@anthropic-ai/claude-code": "1.0.94", + "jsonc-parser": "^3.3.1" }, - "peerDependenciesMeta": { - "react": { - "optional": true - } + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/ai-sdk-provider-claude-code/node_modules/@ai-sdk/provider-utils": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.3.tgz", + "integrity": "sha512-kAxIw1nYmFW1g5TvE54ZB3eNtgZna0RnLjPUp1ltz1+t9xkXJIuDT4atrwfau9IbS0BOef38wqrI8CjFfQrxhw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.3", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "node_modules/ai-sdk-provider-claude-code/node_modules/@ai-sdk/provider-utils/node_modules/zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, + "node_modules/ai-sdk-provider-claude-code/node_modules/@anthropic-ai/claude-code": { + "version": "1.0.94", + "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-code/-/claude-code-1.0.94.tgz", + "integrity": "sha512-RkiS860XpvCrh5RBE2lluMh2O+4uZgw07JKTnHwfeBDrOPxRbvNCrHCk1ZefCmAvYTjWV6GbuMN+hy5k7I3eVw==", + "license": "SEE LICENSE IN README.md", + "bin": { + "claude": "cli.js" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "^0.33.5", + "@img/sharp-darwin-x64": "^0.33.5", + "@img/sharp-linux-arm": "^0.33.5", + "@img/sharp-linux-arm64": "^0.33.5", + "@img/sharp-linux-x64": "^0.33.5", + "@img/sharp-win32-x64": "^0.33.5" } }, "node_modules/ai-sdk-provider-gemini-cli": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ai-sdk-provider-gemini-cli/-/ai-sdk-provider-gemini-cli-0.1.3.tgz", - "integrity": "sha512-hNsp2YIDLr+nVqxk8l6UzRozj3e1sfh3nzjyNSHB4f47dMBReb9qTq/1GwOlpKGEPcLK7OoibbX9wFC/eWBlvA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ai-sdk-provider-gemini-cli/-/ai-sdk-provider-gemini-cli-1.1.1.tgz", + "integrity": "sha512-AdYCHJrdDSQi/uCDw6gxgQN/xfKwEMk1QDoAnqBz0VLGCJatzLzb1kBCGIwY9+l9PCa3+oHon7S+DJmrByDfUg==", "license": "MIT", - "optional": true, "dependencies": { - "@ai-sdk/provider": "^1.1.3", - "@ai-sdk/provider-utils": "^2.2.8", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.3", "@google/gemini-cli-core": "0.1.22", - "@google/genai": "^1.7.0", - "google-auth-library": "^9.0.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.23.3" + "@google/genai": "1.14.0", + "google-auth-library": "10.2.1", + "zod-to-json-schema": "3.24.6" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.23.8" + "zod": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/ai-sdk-provider-gemini-cli/node_modules/@ai-sdk/provider-utils": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.3.tgz", + "integrity": "sha512-kAxIw1nYmFW1g5TvE54ZB3eNtgZna0RnLjPUp1ltz1+t9xkXJIuDT4atrwfau9IbS0BOef38wqrI8CjFfQrxhw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.3", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "node_modules/ai-sdk-provider-gemini-cli/node_modules/gaxios": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.2.tgz", + "integrity": "sha512-/Szrn8nr+2TsQT1Gp8iIe/BEytJmbyfrbFh419DfGQSkEgNEhbPi7JRJuughjkTzPWgU9gBQf5AVu3DbHt0OXA==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ai-sdk-provider-gemini-cli/node_modules/gcp-metadata": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", + "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ai-sdk-provider-gemini-cli/node_modules/google-auth-library": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.2.1.tgz", + "integrity": "sha512-HMxFl2NfeHYnaL1HoRIN1XgorKS+6CDaM+z9LSSN+i/nKDDL4KFFEWogMXu7jV4HZQy2MsxpY+wA5XIf3w410A==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^7.0.0", + "gcp-metadata": "^7.0.0", + "google-logging-utils": "^1.0.0", + "gtoken": "^8.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ai-sdk-provider-gemini-cli/node_modules/google-logging-utils": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.1.tgz", + "integrity": "sha512-rcX58I7nqpu4mbKztFeOAObbomBbHU2oIb/d3tJfF3dizGSApqtSwYJigGCooHdnMyQBIw8BrWyK96w3YXgr6A==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/ai-sdk-provider-gemini-cli/node_modules/gtoken": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz", + "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==", + "license": "MIT", + "dependencies": { + "gaxios": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ai-sdk-provider-gemini-cli/node_modules/zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" } }, "node_modules/ajv": { @@ -12014,6 +11998,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, "license": "MIT" }, "node_modules/auto-bind": { @@ -12907,7 +12892,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "devOptional": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -13031,7 +13015,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "devOptional": true, "license": "MIT", "dependencies": { "run-applescript": "^7.0.0" @@ -13617,7 +13600,6 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "devOptional": true, "license": "MIT" }, "node_modules/class-variance-authority": { @@ -14060,7 +14042,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "devOptional": true, "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -14075,7 +14056,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -14091,7 +14071,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "devOptional": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -14104,21 +14083,18 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true, "license": "MIT" }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "devOptional": true, "license": "MIT" }, "node_modules/cliui/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "devOptional": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -14133,7 +14109,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "devOptional": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -14284,6 +14259,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -14942,7 +14918,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -14952,7 +14927,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "devOptional": true, "license": "MIT", "dependencies": { "bundle-name": "^4.1.0", @@ -14969,7 +14943,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -15022,7 +14995,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=12" @@ -15075,6 +15047,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" @@ -15103,6 +15076,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -15216,18 +15190,11 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", - "devOptional": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, - "node_modules/diff-match-patch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", - "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", - "license": "Apache-2.0" - }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -15292,7 +15259,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "devOptional": true, "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", @@ -15307,7 +15273,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "devOptional": true, "funding": [ { "type": "github", @@ -15320,7 +15285,6 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "devOptional": true, "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" @@ -15336,7 +15300,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "devOptional": true, "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -15662,7 +15625,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "devOptional": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -15836,6 +15798,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -16170,6 +16133,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -16193,7 +16157,7 @@ "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/execa": { @@ -17010,6 +16974,40 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/fastmcp/node_modules/xsschema": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/xsschema/-/xsschema-0.3.5.tgz", + "integrity": "sha512-f+dcy11dTv7aBEEfTbXWnrm/1b/Ds2k4taN0TpN6KCtPAD58kyE/R1znUdrHdBnhIFexj9k+pS1fm6FgtSISrQ==", + "license": "MIT", + "peerDependencies": { + "@valibot/to-json-schema": "^1.0.0", + "arktype": "^2.1.20", + "effect": "^3.16.0", + "sury": "^10.0.0", + "zod": "^3.25.0 || ^4.0.0", + "zod-to-json-schema": "^3.24.5" + }, + "peerDependenciesMeta": { + "@valibot/to-json-schema": { + "optional": true + }, + "arktype": { + "optional": true + }, + "effect": { + "optional": true + }, + "sury": { + "optional": true + }, + "zod": { + "optional": true + }, + "zod-to-json-schema": { + "optional": true + } + } + }, "node_modules/fastmcp/node_modules/yargs": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", @@ -17036,6 +17034,24 @@ "node": "^20.19.0 || ^22.12.0 || >=23" } }, + "node_modules/fastmcp/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/fastmcp/node_modules/zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -17205,7 +17221,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "devOptional": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -17339,6 +17354,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -17351,12 +17367,6 @@ "node": ">= 6" } }, - "node_modules/form-data-encoder": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", - "license": "MIT" - }, "node_modules/format": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", @@ -17366,19 +17376,6 @@ "node": ">=0.4.x" } }, - "node_modules/formdata-node": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", - "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", - "license": "MIT", - "dependencies": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" - }, - "engines": { - "node": ">= 12.20" - } - }, "node_modules/formidable": { "version": "3.5.4", "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", @@ -17559,8 +17556,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fzf/-/fzf-0.5.2.tgz", "integrity": "sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==", - "license": "BSD-3-Clause", - "optional": true + "license": "BSD-3-Clause" }, "node_modules/gaxios": { "version": "6.7.1", @@ -18109,6 +18105,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -18563,7 +18560,6 @@ "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", "license": "MIT", - "optional": true, "dependencies": { "@selderee/plugin-htmlparser2": "^0.11.0", "deepmerge": "^4.3.1", @@ -18587,7 +18583,6 @@ } ], "license": "MIT", - "optional": true, "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -18723,15 +18718,6 @@ "node": ">=16.17.0" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, "node_modules/iconv-lite": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", @@ -18773,7 +18759,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "license": "MIT", - "optional": true, "engines": { "node": ">= 4" } @@ -18828,7 +18813,6 @@ "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.14.2.tgz", "integrity": "sha512-5tCuY9BV8ujfOpwtAGgsTx9CGUapcFMEEyByLv1B+v2+6DhAcw+Zr0nhQT7uwaZ7DiourxFEscghOR8e1aPLQw==", "license": "Apache-2.0", - "optional": true, "dependencies": { "acorn": "^8.14.0", "acorn-import-attributes": "^1.9.5", @@ -19381,7 +19365,6 @@ "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "devOptional": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -19443,7 +19426,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "devOptional": true, "license": "MIT", "bin": { "is-docker": "cli.js" @@ -19573,7 +19555,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "devOptional": true, "license": "MIT", "dependencies": { "is-docker": "^3.0.0" @@ -19643,7 +19624,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -19960,7 +19940,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "devOptional": true, "license": "MIT", "dependencies": { "is-inside-container": "^1.0.0" @@ -22000,23 +21979,6 @@ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "license": "MIT" }, - "node_modules/jsondiffpatch": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.6.0.tgz", - "integrity": "sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==", - "license": "MIT", - "dependencies": { - "@types/diff-match-patch": "^1.0.36", - "chalk": "^5.3.0", - "diff-match-patch": "^1.0.5" - }, - "bin": { - "jsondiffpatch": "bin/jsondiffpatch.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, "node_modules/jsonfile": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", @@ -22243,7 +22205,6 @@ "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", "license": "MIT", - "optional": true, "funding": { "url": "https://ko-fi.com/killymxi" } @@ -22396,8 +22357,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/lodash.includes": { "version": "4.3.0", @@ -22446,8 +22406,7 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/lodash.once": { "version": "4.1.1", @@ -22550,8 +22509,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0", - "optional": true + "license": "Apache-2.0" }, "node_modules/longest-streak": { "version": "3.1.0", @@ -24021,7 +23979,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "devOptional": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -24035,7 +23992,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -24227,7 +24183,6 @@ "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.40.3.tgz", "integrity": "sha512-Vjyr90sJ23CKKH/qPAgUKicw/v6pRoamxIEDFOF8uSgFME7DqPRpHgRTejWVjkdGg5dXj0/NyxZHZ9bcjH+2uQ==", "license": "MIT", - "optional": true, "dependencies": { "obliterator": "^2.0.4" } @@ -24413,8 +24368,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/mri": { "version": "1.2.0", @@ -24456,6 +24410,7 @@ "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "devOptional": true, "funding": [ { "type": "github", @@ -24584,26 +24539,6 @@ "license": "MIT", "optional": true }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "engines": { - "node": ">=10.5.0" - } - }, "node_modules/node-emoji": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", @@ -24995,29 +24930,22 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", - "license": "MIT", - "optional": true + "license": "MIT" }, - "node_modules/ollama-ai-provider": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ollama-ai-provider/-/ollama-ai-provider-1.2.0.tgz", - "integrity": "sha512-jTNFruwe3O/ruJeppI/quoOUxG7NA6blG3ZyQj3lei4+NnJo7bi3eIRWqlVpRlu/mbzbFXeJSBuYQWF6pzGKww==", + "node_modules/ollama-ai-provider-v2": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ollama-ai-provider-v2/-/ollama-ai-provider-v2-1.3.1.tgz", + "integrity": "sha512-UfDX40h2uz/mHjvjFapQIrPzb7h+QQuq0j8OxYLWXMz6Z5CCydmI5l4oLQtZm/lZijisF3zaG1EkIPNzOVDMcw==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "^1.0.0", - "@ai-sdk/provider-utils": "^2.0.0", - "partial-json": "0.1.7" + "@ai-sdk/provider": "^2.0.0", + "@ai-sdk/provider-utils": "^3.0.7" }, "engines": { "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } + "zod": "^4.0.16" } }, "node_modules/on-finished": { @@ -25080,7 +25008,6 @@ "version": "10.2.0", "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", - "devOptional": true, "license": "MIT", "dependencies": { "default-browser": "^5.2.1", @@ -25095,36 +25022,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/openai": { - "version": "4.104.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.104.0.tgz", - "integrity": "sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==", - "license": "Apache-2.0", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - }, - "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "ws": "^8.18.0", - "zod": "^3.23.8" - }, - "peerDependenciesMeta": { - "ws": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, "node_modules/openai-chat-tokens": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/openai-chat-tokens/-/openai-chat-tokens-0.2.8.tgz", @@ -25134,21 +25031,6 @@ "js-tiktoken": "^1.0.7" } }, - "node_modules/openai/node_modules/@types/node": { - "version": "18.19.126", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.126.tgz", - "integrity": "sha512-8AXQlBfrGmtYJEJUPs63F/uZQqVeFiN9o6NUjbDJYfxNxFnArlZufANPw4h6dGhYGKxcyw+TapXFvEsguzIQow==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/openai/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" - }, "node_modules/openapi-types": { "version": "12.1.3", "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", @@ -25658,7 +25540,6 @@ "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", "license": "MIT", - "optional": true, "dependencies": { "leac": "^0.6.0", "peberminta": "^0.9.0" @@ -25676,12 +25557,6 @@ "node": ">= 0.8" } }, - "node_modules/partial-json": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/partial-json/-/partial-json-0.1.7.tgz", - "integrity": "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==", - "license": "MIT" - }, "node_modules/patch-console": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-2.0.0.tgz", @@ -25725,7 +25600,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "devOptional": true, "license": "MIT" }, "node_modules/path-scurry": { @@ -25781,7 +25655,6 @@ "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==", "license": "MIT", - "optional": true, "funding": { "url": "https://ko-fi.com/killymxi" } @@ -26188,7 +26061,6 @@ "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", "hasInstallScript": true, "license": "BSD-3-Clause", - "optional": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -26542,6 +26414,7 @@ "version": "19.1.1", "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -27236,7 +27109,6 @@ "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", "license": "MIT", - "optional": true, "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3", @@ -27250,7 +27122,6 @@ "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "devOptional": true, "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", @@ -27588,7 +27459,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -27769,18 +27639,11 @@ "node": ">=4" } }, - "node_modules/secure-json-parse": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", - "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", - "license": "BSD-3-Clause" - }, "node_modules/selderee": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", "license": "MIT", - "optional": true, "dependencies": { "parseley": "^0.12.0" }, @@ -28039,7 +27902,6 @@ "version": "1.8.3", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -28069,8 +27931,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", - "license": "BSD-2-Clause", - "optional": true + "license": "BSD-2-Clause" }, "node_modules/side-channel": { "version": "1.1.0", @@ -28230,7 +28091,6 @@ "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.28.0.tgz", "integrity": "sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==", "license": "MIT", - "optional": true, "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", @@ -29118,7 +28978,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -29127,19 +28986,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/swr": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.6.tgz", - "integrity": "sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3", - "use-sync-external-store": "^1.4.0" - }, - "peerDependencies": { - "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/tailwind-merge": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz", @@ -29309,18 +29155,6 @@ "node": ">=0.8" } }, - "node_modules/throttleit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", - "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -29425,7 +29259,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "devOptional": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -30677,15 +30510,6 @@ } } }, - "node_modules/use-sync-external-store": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", - "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -31479,15 +31303,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/web-streams-polyfill": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", - "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -31870,7 +31685,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", - "devOptional": true, "license": "MIT", "dependencies": { "is-wsl": "^3.1.0" @@ -31906,40 +31720,6 @@ "node": ">=4.0" } }, - "node_modules/xsschema": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/xsschema/-/xsschema-0.3.5.tgz", - "integrity": "sha512-f+dcy11dTv7aBEEfTbXWnrm/1b/Ds2k4taN0TpN6KCtPAD58kyE/R1znUdrHdBnhIFexj9k+pS1fm6FgtSISrQ==", - "license": "MIT", - "peerDependencies": { - "@valibot/to-json-schema": "^1.0.0", - "arktype": "^2.1.20", - "effect": "^3.16.0", - "sury": "^10.0.0", - "zod": "^3.25.0 || ^4.0.0", - "zod-to-json-schema": "^3.24.5" - }, - "peerDependenciesMeta": { - "@valibot/to-json-schema": { - "optional": true - }, - "arktype": { - "optional": true - }, - "effect": { - "optional": true - }, - "sury": { - "optional": true - }, - "zod": { - "optional": true - }, - "zod-to-json-schema": { - "optional": true - } - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -31973,7 +31753,6 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "devOptional": true, "license": "MIT", "dependencies": { "cliui": "^8.0.1", @@ -31992,7 +31771,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "devOptional": true, "license": "ISC", "engines": { "node": ">=12" @@ -32031,14 +31809,12 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "devOptional": true, "license": "MIT" }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "devOptional": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -32125,23 +31901,14 @@ "license": "MIT" }, "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", + "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, - "node_modules/zod-to-json-schema": { - "version": "3.24.6", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", - "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", - "license": "ISC", - "peerDependencies": { - "zod": "^3.24.1" - } - }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", @@ -32195,6 +31962,15 @@ "dependencies": { "undici-types": "~6.21.0" } + }, + "packages/tm-core/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index 3fb6eb0a..906c57c3 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "turbo:build": "turbo build", "turbo:typecheck": "turbo typecheck", "build:build-config": "npm run build -w @tm/build-config", - "test": "node --experimental-vm-modules node_modules/.bin/jest", + "test": "cross-env NODE_ENV=test node --experimental-vm-modules node_modules/.bin/jest", "test:unit": "node --experimental-vm-modules node_modules/.bin/jest --testPathPattern=unit", "test:integration": "node --experimental-vm-modules node_modules/.bin/jest --testPathPattern=integration", "test:fails": "node --experimental-vm-modules node_modules/.bin/jest --onlyFailures", @@ -52,23 +52,24 @@ "author": "Eyal Toledano", "license": "MIT WITH Commons-Clause", "dependencies": { - "@ai-sdk/amazon-bedrock": "^2.2.9", - "@ai-sdk/anthropic": "^1.2.10", - "@ai-sdk/azure": "^1.3.17", - "@ai-sdk/google": "^1.2.13", - "@ai-sdk/google-vertex": "^2.2.23", - "@ai-sdk/groq": "^1.2.9", - "@ai-sdk/mistral": "^1.2.7", - "@ai-sdk/openai": "^1.3.20", - "@ai-sdk/perplexity": "^1.1.7", - "@ai-sdk/xai": "^1.2.15", - "@anthropic-ai/sdk": "^0.39.0", - "@aws-sdk/credential-providers": "^3.817.0", + "@ai-sdk/amazon-bedrock": "^3.0.23", + "@ai-sdk/anthropic": "^2.0.18", + "@ai-sdk/azure": "^2.0.34", + "@ai-sdk/google": "^2.0.16", + "@ai-sdk/google-vertex": "^3.0.29", + "@ai-sdk/groq": "^2.0.21", + "@ai-sdk/mistral": "^2.0.16", + "@ai-sdk/openai": "^2.0.34", + "@ai-sdk/perplexity": "^2.0.10", + "@ai-sdk/xai": "^2.0.22", + "@aws-sdk/credential-providers": "^3.895.0", "@inquirer/search": "^3.0.15", - "@openrouter/ai-sdk-provider": "^0.4.5", + "@openrouter/ai-sdk-provider": "^1.2.0", "@streamparser/json": "^0.0.22", "@supabase/supabase-js": "^2.57.4", - "ai": "^4.3.10", + "ai": "^5.0.51", + "ai-sdk-provider-claude-code": "^1.1.4", + "ai-sdk-provider-gemini-cli": "^1.1.1", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "boxen": "^8.0.1", @@ -93,17 +94,14 @@ "lru-cache": "^10.2.0", "marked": "^15.0.12", "marked-terminal": "^7.3.0", - "ollama-ai-provider": "^1.2.0", - "openai": "^4.89.0", + "ollama-ai-provider-v2": "^1.3.1", "ora": "^8.2.0", "uuid": "^11.1.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.24.5" + "zod": "^4.1.11" }, "optionalDependencies": { "@anthropic-ai/claude-code": "^1.0.88", - "@biomejs/cli-linux-x64": "^1.9.4", - "ai-sdk-provider-gemini-cli": "^0.1.3" + "@biomejs/cli-linux-x64": "^1.9.4" }, "engines": { "node": ">=18.0.0" @@ -126,8 +124,8 @@ "@biomejs/biome": "^1.9.4", "@changesets/changelog-github": "^0.5.1", "@changesets/cli": "^2.28.1", - "@manypkg/cli": "^0.25.1", "@tm/cli": "*", + "@manypkg/cli": "^0.25.1", "@types/jest": "^29.5.14", "@types/marked-terminal": "^6.1.1", "concurrently": "^9.2.1", diff --git a/packages/tm-core/package.json b/packages/tm-core/package.json index eec969be..4b36a09e 100644 --- a/packages/tm-core/package.json +++ b/packages/tm-core/package.json @@ -31,7 +31,7 @@ }, "dependencies": { "@supabase/supabase-js": "^2.57.4", - "zod": "^3.23.8" + "zod": "^4.1.11" }, "devDependencies": { "@biomejs/biome": "^1.9.4", diff --git a/scripts/modules/config-manager.js b/scripts/modules/config-manager.js index c8a5033e..78ce94fc 100644 --- a/scripts/modules/config-manager.js +++ b/scripts/modules/config-manager.js @@ -311,7 +311,7 @@ function validateClaudeCodeSettings(settings) { // Define the base settings schema without commandSpecific first const BaseSettingsSchema = z.object({ pathToClaudeCodeExecutable: z.string().optional(), - maxTurns: z.number().int().positive().optional(), + maxTurns: z.int().positive().optional(), customSystemPrompt: z.string().optional(), appendSystemPrompt: z.string().optional(), permissionMode: z @@ -326,16 +326,16 @@ function validateClaudeCodeSettings(settings) { type: z.enum(['stdio', 'sse']).optional(), command: z.string(), args: z.array(z.string()).optional(), - env: z.record(z.string()).optional(), - url: z.string().url().optional(), - headers: z.record(z.string()).optional() + env: z.record(z.string(), z.string()).optional(), + url: z.url().optional(), + headers: z.record(z.string(), z.string()).optional() }) ) .optional() }); // Define CommandSpecificSchema using the base schema - const CommandSpecificSchema = z.record( + const CommandSpecificSchema = z.partialRecord( z.enum(AI_COMMAND_NAMES), BaseSettingsSchema ); diff --git a/scripts/modules/task-manager/expand-task.js b/scripts/modules/task-manager/expand-task.js index 05b33b62..9c367ab3 100644 --- a/scripts/modules/task-manager/expand-task.js +++ b/scripts/modules/task-manager/expand-task.js @@ -31,36 +31,30 @@ import { FuzzyTaskSearch } from '../utils/fuzzyTaskSearch.js'; import { flattenTasksWithSubtasks, findProjectRoot } from '../utils.js'; // --- Zod Schemas (Keep from previous step) --- -const subtaskSchema = z - .object({ - id: z - .number() - .int() - .positive() - .describe('Sequential subtask ID starting from 1'), - title: z.string().min(5).describe('Clear, specific title for the subtask'), - description: z - .string() - .min(10) - .describe('Detailed description of the subtask'), - dependencies: z - .array(z.string()) - .describe( - 'Array of subtask dependencies within the same parent task. Use format ["parentTaskId.1", "parentTaskId.2"]. Subtasks can only depend on siblings, not external tasks.' - ), - details: z.string().min(20).describe('Implementation details and guidance'), - status: z - .string() - .describe( - 'The current status of the subtask (should be pending initially)' - ), - testStrategy: z - .string() - .nullable() - .describe('Approach for testing this subtask') - .default('') - }) - .strict(); +const subtaskSchema = z.strictObject({ + id: z.int().positive().describe('Sequential subtask ID starting from 1'), + title: z.string().min(5).describe('Clear, specific title for the subtask'), + description: z + .string() + .min(10) + .describe('Detailed description of the subtask'), + dependencies: z + .array(z.string()) + .describe( + 'Array of subtask dependencies within the same parent task. Use format ["parentTaskId.1", "parentTaskId.2"]. Subtasks can only depend on siblings, not external tasks.' + ), + details: z.string().min(20).describe('Implementation details and guidance'), + status: z + .string() + .describe( + 'The current status of the subtask (should be pending initially)' + ), + testStrategy: z + .string() + .nullable() + .describe('Approach for testing this subtask') + .prefault('') +}); const subtaskArraySchema = z.array(subtaskSchema); const subtaskWrapperSchema = z.object({ subtasks: subtaskArraySchema.describe('The array of generated subtasks.') diff --git a/scripts/modules/task-manager/scope-adjustment.js b/scripts/modules/task-manager/scope-adjustment.js index cb1558ba..207bd0e9 100644 --- a/scripts/modules/task-manager/scope-adjustment.js +++ b/scripts/modules/task-manager/scope-adjustment.js @@ -355,7 +355,7 @@ Ensure the JSON is valid and properly formatted.`; const subtaskSchema = z.object({ subtasks: z.array( z.object({ - id: z.number().int().positive(), + id: z.int().positive(), title: z.string().min(5), description: z.string().min(10), dependencies: z.array(z.string()), @@ -386,8 +386,21 @@ Ensure the JSON is valid and properly formatted.`; testStrategy: subtask.testStrategy || '' })); + // Ensure new subtasks have unique sequential IDs after the preserved ones + const maxPreservedId = preservedSubtasks.reduce( + (max, st) => Math.max(max, st.id || 0), + 0 + ); + let nextId = maxPreservedId + 1; + const normalizedGeneratedSubtasks = processedGeneratedSubtasks.map( + (st) => ({ + ...st, + id: nextId++ + }) + ); + // Update task with preserved subtasks + newly generated ones - task.subtasks = [...preservedSubtasks, ...processedGeneratedSubtasks]; + task.subtasks = [...preservedSubtasks, ...normalizedGeneratedSubtasks]; return { updatedTask: task, diff --git a/scripts/modules/task-manager/update-task-by-id.js b/scripts/modules/task-manager/update-task-by-id.js index 1a1612c8..9c89f3b5 100644 --- a/scripts/modules/task-manager/update-task-by-id.js +++ b/scripts/modules/task-manager/update-task-by-id.js @@ -33,36 +33,33 @@ import { ContextGatherer } from '../utils/contextGatherer.js'; import { FuzzyTaskSearch } from '../utils/fuzzyTaskSearch.js'; // Zod schema for post-parsing validation of the updated task object -const updatedTaskSchema = z - .object({ - id: z.number().int(), - title: z.string(), // Title should be preserved, but check it exists - description: z.string(), - status: z.string(), - dependencies: z.array(z.union([z.number().int(), z.string()])), - priority: z.string().nullable().default('medium'), - details: z.string().nullable().default(''), - testStrategy: z.string().nullable().default(''), - subtasks: z - .array( - z.object({ - id: z - .number() - .int() - .positive() - .describe('Sequential subtask ID starting from 1'), - title: z.string(), - description: z.string(), - status: z.string(), - dependencies: z.array(z.number().int()).nullable().default([]), - details: z.string().nullable().default(''), - testStrategy: z.string().nullable().default('') - }) - ) - .nullable() - .default([]) - }) - .strip(); // Allows parsing even if AI adds extra fields, but validation focuses on schema +const updatedTaskSchema = z.object({ + id: z.int(), + title: z.string(), // Title should be preserved, but check it exists + description: z.string(), + status: z.string(), + dependencies: z.array(z.union([z.int(), z.string()])), + priority: z.string().nullable().prefault('medium'), + details: z.string().nullable().prefault(''), + testStrategy: z.string().nullable().prefault(''), + subtasks: z + .array( + z.object({ + id: z + .int() + .positive() + .describe('Sequential subtask ID starting from 1'), + title: z.string(), + description: z.string(), + status: z.string(), + dependencies: z.array(z.int()).nullable().prefault([]), + details: z.string().nullable().prefault(''), + testStrategy: z.string().nullable().prefault('') + }) + ) + .nullable() + .prefault([]) +}); // Allows parsing even if AI adds extra fields, but validation focuses on schema /** * Parses a single updated task object from AI's text response. diff --git a/scripts/modules/task-manager/update-tasks.js b/scripts/modules/task-manager/update-tasks.js index a1871ce7..5b3dfa1b 100644 --- a/scripts/modules/task-manager/update-tasks.js +++ b/scripts/modules/task-manager/update-tasks.js @@ -29,19 +29,17 @@ import { FuzzyTaskSearch } from '../utils/fuzzyTaskSearch.js'; import { flattenTasksWithSubtasks, findProjectRoot } from '../utils.js'; // Zod schema for validating the structure of tasks AFTER parsing -const updatedTaskSchema = z - .object({ - id: z.number().int(), - title: z.string(), - description: z.string(), - status: z.string(), - dependencies: z.array(z.union([z.number().int(), z.string()])), - priority: z.string().nullable(), - details: z.string().nullable(), - testStrategy: z.string().nullable(), - subtasks: z.array(z.any()).nullable() // Keep subtasks flexible for now - }) - .strip(); // Allow potential extra fields during parsing if needed, then validate structure +const updatedTaskSchema = z.object({ + id: z.int(), + title: z.string(), + description: z.string(), + status: z.string(), + dependencies: z.array(z.union([z.int(), z.string()])), + priority: z.string().nullable(), + details: z.string().nullable(), + testStrategy: z.string().nullable(), + subtasks: z.array(z.any()).nullable() // Keep subtasks flexible for now +}); // Allow potential extra fields during parsing if needed, then validate structure // Preprocessing schema that adds defaults before validation const preprocessTaskSchema = z.preprocess((task) => { diff --git a/src/ai-providers/base-provider.js b/src/ai-providers/base-provider.js index 79bd2bce..eff767ac 100644 --- a/src/ai-providers/base-provider.js +++ b/src/ai-providers/base-provider.js @@ -126,16 +126,6 @@ export class BaseAIProvider { throw new Error('getRequiredApiKeyName must be implemented by provider'); } - /** - * Determines if a model requires max_completion_tokens instead of maxTokens - * Can be overridden by providers to specify their model requirements - * @param {string} modelId - The model ID to check - * @returns {boolean} True if the model requires max_completion_tokens - */ - requiresMaxCompletionTokens(modelId) { - return false; // Default behavior - most models use maxTokens - } - /** * Prepares token limit parameter based on model requirements * @param {string} modelId - The model ID @@ -150,11 +140,7 @@ export class BaseAIProvider { // Ensure maxTokens is an integer const tokenValue = Math.floor(Number(maxTokens)); - if (this.requiresMaxCompletionTokens(modelId)) { - return { max_completion_tokens: tokenValue }; - } else { - return { maxTokens: tokenValue }; - } + return { maxOutputTokens: tokenValue }; } /** @@ -248,7 +234,7 @@ export class BaseAIProvider { messages: params.messages, schema: zodSchema(params.schema), mode: params.mode || 'auto', - maxTokens: params.maxTokens, + maxOutputTokens: params.maxTokens, temperature: params.temperature }); diff --git a/src/ai-providers/claude-code.js b/src/ai-providers/claude-code.js index 67a89948..a3275057 100644 --- a/src/ai-providers/claude-code.js +++ b/src/ai-providers/claude-code.js @@ -1,54 +1,125 @@ /** * src/ai-providers/claude-code.js * - * Implementation for interacting with Claude models via Claude Code CLI - * using a custom AI SDK implementation. + * Claude Code provider implementation using the ai-sdk-provider-claude-code package. + * This provider uses the local Claude Code CLI with OAuth token authentication. + * + * Authentication: + * - Uses CLAUDE_CODE_OAUTH_TOKEN managed by Claude Code CLI + * - Token is set up via: claude setup-token + * - No manual API key configuration required */ -import { createClaudeCode } from './custom-sdk/claude-code/index.js'; +import { createClaudeCode } from 'ai-sdk-provider-claude-code'; import { BaseAIProvider } from './base-provider.js'; import { getClaudeCodeSettingsForCommand } from '../../scripts/modules/config-manager.js'; +import { execSync } from 'child_process'; +import { log } from '../../scripts/modules/utils.js'; +let _claudeCliChecked = false; +let _claudeCliAvailable = null; + +/** + * Provider for Claude Code CLI integration via AI SDK + * + * Features: + * - No API key required (uses local Claude Code CLI) + * - Supports 'sonnet' and 'opus' models + * - Command-specific configuration support + */ export class ClaudeCodeProvider extends BaseAIProvider { constructor() { super(); this.name = 'Claude Code'; + this.supportedModels = ['sonnet', 'opus']; } + /** + * @returns {string} The environment variable name for API key (not used) + */ getRequiredApiKeyName() { return 'CLAUDE_CODE_API_KEY'; } + /** + * @returns {boolean} False - Claude Code doesn't require API keys + */ isRequiredApiKey() { return false; } /** - * Override validateAuth to skip API key validation for Claude Code - * @param {object} params - Parameters to validate + * Optional CLI availability check for Claude Code + * @param {object} params - Parameters (ignored) */ validateAuth(params) { - // Claude Code doesn't require an API key - // No validation needed + // Claude Code uses local CLI - perform lightweight availability check + // This is optional validation that fails fast with actionable guidance + if ( + process.env.NODE_ENV !== 'test' && + !_claudeCliChecked && + !process.env.CLAUDE_CODE_OAUTH_TOKEN + ) { + try { + execSync('claude --version', { stdio: 'pipe', timeout: 1000 }); + _claudeCliAvailable = true; + } catch (error) { + _claudeCliAvailable = false; + log( + 'warn', + 'Claude Code CLI not detected. Install it with: npm install -g @anthropic-ai/claude-code' + ); + } finally { + _claudeCliChecked = true; + } + } } /** - * Creates and returns a Claude Code client instance. - * @param {object} params - Parameters for client initialization - * @param {string} [params.commandName] - Name of the command invoking the service - * @param {string} [params.baseURL] - Optional custom API endpoint (not used by Claude Code) - * @returns {Function} Claude Code client function - * @throws {Error} If initialization fails + * Creates a Claude Code client instance + * @param {object} params - Client parameters + * @param {string} [params.commandName] - Command name for settings lookup + * @returns {Function} Claude Code provider function + * @throws {Error} If Claude Code CLI is not available or client creation fails */ - getClient(params) { + getClient(params = {}) { try { - // Claude Code doesn't use API keys or base URLs - // Just return the provider factory + const settings = + getClaudeCodeSettingsForCommand(params.commandName) || {}; + return createClaudeCode({ - defaultSettings: getClaudeCodeSettingsForCommand(params?.commandName) + defaultSettings: settings }); } catch (error) { - this.handleError('client initialization', error); + // Provide more helpful error message + const msg = String(error?.message || ''); + const code = error?.code; + if (code === 'ENOENT' || /claude/i.test(msg)) { + const enhancedError = new Error( + `Claude Code CLI not available. Please install Claude Code CLI first. Original error: ${error.message}` + ); + enhancedError.cause = error; + this.handleError('Claude Code CLI initialization', enhancedError); + } else { + this.handleError('client initialization', error); + } } } + + /** + * @returns {string[]} List of supported model IDs + */ + getSupportedModels() { + return this.supportedModels; + } + + /** + * Check if a model is supported + * @param {string} modelId - Model ID to check + * @returns {boolean} True if supported + */ + isModelSupported(modelId) { + if (!modelId) return false; + return this.supportedModels.includes(String(modelId).toLowerCase()); + } } diff --git a/src/ai-providers/custom-sdk/claude-code/errors.js b/src/ai-providers/custom-sdk/claude-code/errors.js deleted file mode 100644 index a0251f37..00000000 --- a/src/ai-providers/custom-sdk/claude-code/errors.js +++ /dev/null @@ -1,126 +0,0 @@ -/** - * @fileoverview Error handling utilities for Claude Code provider - */ - -import { APICallError, LoadAPIKeyError } from '@ai-sdk/provider'; - -/** - * @typedef {import('./types.js').ClaudeCodeErrorMetadata} ClaudeCodeErrorMetadata - */ - -/** - * Create an API call error with Claude Code specific metadata - * @param {Object} params - Error parameters - * @param {string} params.message - Error message - * @param {string} [params.code] - Error code - * @param {number} [params.exitCode] - Process exit code - * @param {string} [params.stderr] - Standard error output - * @param {string} [params.promptExcerpt] - Excerpt of the prompt - * @param {boolean} [params.isRetryable=false] - Whether the error is retryable - * @returns {APICallError} - */ -export function createAPICallError({ - message, - code, - exitCode, - stderr, - promptExcerpt, - isRetryable = false -}) { - /** @type {ClaudeCodeErrorMetadata} */ - const metadata = { - code, - exitCode, - stderr, - promptExcerpt - }; - - return new APICallError({ - message, - isRetryable, - url: 'claude-code-cli://command', - requestBodyValues: promptExcerpt ? { prompt: promptExcerpt } : undefined, - data: metadata - }); -} - -/** - * Create an authentication error - * @param {Object} params - Error parameters - * @param {string} params.message - Error message - * @returns {LoadAPIKeyError} - */ -export function createAuthenticationError({ message }) { - return new LoadAPIKeyError({ - message: - message || - 'Authentication failed. Please ensure Claude Code CLI is properly authenticated.' - }); -} - -/** - * Create a timeout error - * @param {Object} params - Error parameters - * @param {string} params.message - Error message - * @param {string} [params.promptExcerpt] - Excerpt of the prompt - * @param {number} params.timeoutMs - Timeout in milliseconds - * @returns {APICallError} - */ -export function createTimeoutError({ message, promptExcerpt, timeoutMs }) { - // Store timeoutMs in metadata for potential use by error handlers - /** @type {ClaudeCodeErrorMetadata & { timeoutMs: number }} */ - const metadata = { - code: 'TIMEOUT', - promptExcerpt, - timeoutMs - }; - - return new APICallError({ - message, - isRetryable: true, - url: 'claude-code-cli://command', - requestBodyValues: promptExcerpt ? { prompt: promptExcerpt } : undefined, - data: metadata - }); -} - -/** - * Check if an error is an authentication error - * @param {unknown} error - Error to check - * @returns {boolean} - */ -export function isAuthenticationError(error) { - if (error instanceof LoadAPIKeyError) return true; - if ( - error instanceof APICallError && - /** @type {ClaudeCodeErrorMetadata} */ (error.data)?.exitCode === 401 - ) - return true; - return false; -} - -/** - * Check if an error is a timeout error - * @param {unknown} error - Error to check - * @returns {boolean} - */ -export function isTimeoutError(error) { - if ( - error instanceof APICallError && - /** @type {ClaudeCodeErrorMetadata} */ (error.data)?.code === 'TIMEOUT' - ) - return true; - return false; -} - -/** - * Get error metadata from an error - * @param {unknown} error - Error to extract metadata from - * @returns {ClaudeCodeErrorMetadata|undefined} - */ -export function getErrorMetadata(error) { - if (error instanceof APICallError && error.data) { - return /** @type {ClaudeCodeErrorMetadata} */ (error.data); - } - return undefined; -} diff --git a/src/ai-providers/custom-sdk/claude-code/index.js b/src/ai-providers/custom-sdk/claude-code/index.js deleted file mode 100644 index 076a2241..00000000 --- a/src/ai-providers/custom-sdk/claude-code/index.js +++ /dev/null @@ -1,83 +0,0 @@ -/** - * @fileoverview Claude Code provider factory and exports - */ - -import { NoSuchModelError } from '@ai-sdk/provider'; -import { ClaudeCodeLanguageModel } from './language-model.js'; - -/** - * @typedef {import('./types.js').ClaudeCodeSettings} ClaudeCodeSettings - * @typedef {import('./types.js').ClaudeCodeModelId} ClaudeCodeModelId - * @typedef {import('./types.js').ClaudeCodeProvider} ClaudeCodeProvider - * @typedef {import('./types.js').ClaudeCodeProviderSettings} ClaudeCodeProviderSettings - */ - -/** - * Create a Claude Code provider using the official SDK - * @param {ClaudeCodeProviderSettings} [options={}] - Provider configuration options - * @returns {ClaudeCodeProvider} Claude Code provider instance - */ -export function createClaudeCode(options = {}) { - /** - * Create a language model instance - * @param {ClaudeCodeModelId} modelId - Model ID - * @param {ClaudeCodeSettings} [settings={}] - Model settings - * @returns {ClaudeCodeLanguageModel} - */ - const createModel = (modelId, settings = {}) => { - return new ClaudeCodeLanguageModel({ - id: modelId, - settings: { - ...options.defaultSettings, - ...settings - } - }); - }; - - /** - * Provider function - * @param {ClaudeCodeModelId} modelId - Model ID - * @param {ClaudeCodeSettings} [settings] - Model settings - * @returns {ClaudeCodeLanguageModel} - */ - const provider = function (modelId, settings) { - if (new.target) { - throw new Error( - 'The Claude Code model function cannot be called with the new keyword.' - ); - } - - return createModel(modelId, settings); - }; - - provider.languageModel = createModel; - provider.chat = createModel; // Alias for languageModel - - // Add textEmbeddingModel method that throws NoSuchModelError - provider.textEmbeddingModel = (modelId) => { - throw new NoSuchModelError({ - modelId, - modelType: 'textEmbeddingModel' - }); - }; - - return /** @type {ClaudeCodeProvider} */ (provider); -} - -/** - * Default Claude Code provider instance - */ -export const claudeCode = createClaudeCode(); - -// Provider exports -export { ClaudeCodeLanguageModel } from './language-model.js'; - -// Error handling exports -export { - isAuthenticationError, - isTimeoutError, - getErrorMetadata, - createAPICallError, - createAuthenticationError, - createTimeoutError -} from './errors.js'; diff --git a/src/ai-providers/custom-sdk/claude-code/json-extractor.js b/src/ai-providers/custom-sdk/claude-code/json-extractor.js deleted file mode 100644 index 335fff82..00000000 --- a/src/ai-providers/custom-sdk/claude-code/json-extractor.js +++ /dev/null @@ -1,59 +0,0 @@ -/** - * @fileoverview Extract JSON from Claude's response, handling markdown blocks and other formatting - */ - -/** - * Extract JSON from Claude's response - * @param {string} text - The text to extract JSON from - * @returns {string} - The extracted JSON string - */ -export function extractJson(text) { - // Remove markdown code blocks if present - let jsonText = text.trim(); - - // Remove ```json blocks - jsonText = jsonText.replace(/^```json\s*/gm, ''); - jsonText = jsonText.replace(/^```\s*/gm, ''); - jsonText = jsonText.replace(/```\s*$/gm, ''); - - // Remove common TypeScript/JavaScript patterns - jsonText = jsonText.replace(/^const\s+\w+\s*=\s*/, ''); // Remove "const varName = " - jsonText = jsonText.replace(/^let\s+\w+\s*=\s*/, ''); // Remove "let varName = " - jsonText = jsonText.replace(/^var\s+\w+\s*=\s*/, ''); // Remove "var varName = " - jsonText = jsonText.replace(/;?\s*$/, ''); // Remove trailing semicolons - - // Try to extract JSON object or array - const objectMatch = jsonText.match(/{[\s\S]*}/); - const arrayMatch = jsonText.match(/\[[\s\S]*\]/); - - if (objectMatch) { - jsonText = objectMatch[0]; - } else if (arrayMatch) { - jsonText = arrayMatch[0]; - } - - // First try to parse as valid JSON - try { - JSON.parse(jsonText); - return jsonText; - } catch { - // If it's not valid JSON, it might be a JavaScript object literal - // Try to convert it to valid JSON - try { - // This is a simple conversion that handles basic cases - // Replace unquoted keys with quoted keys - const converted = jsonText - .replace(/([{,]\s*)([a-zA-Z_$][a-zA-Z0-9_$]*)\s*:/g, '$1"$2":') - // Replace single quotes with double quotes - .replace(/'/g, '"'); - - // Validate the converted JSON - JSON.parse(converted); - return converted; - } catch { - // If all else fails, return the original text - // The AI SDK will handle the error appropriately - return text; - } - } -} diff --git a/src/ai-providers/custom-sdk/claude-code/language-model.js b/src/ai-providers/custom-sdk/claude-code/language-model.js deleted file mode 100644 index 960da2d7..00000000 --- a/src/ai-providers/custom-sdk/claude-code/language-model.js +++ /dev/null @@ -1,540 +0,0 @@ -/** - * @fileoverview Claude Code Language Model implementation - */ - -import { NoSuchModelError } from '@ai-sdk/provider'; -import { generateId } from '@ai-sdk/provider-utils'; -import { convertToClaudeCodeMessages } from './message-converter.js'; -import { extractJson } from './json-extractor.js'; -import { createAPICallError, createAuthenticationError } from './errors.js'; - -let query; -let AbortError; - -async function loadClaudeCodeModule() { - if (!query || !AbortError) { - try { - const mod = await import('@anthropic-ai/claude-code'); - query = mod.query; - AbortError = mod.AbortError; - } catch (err) { - throw new Error( - "Claude Code SDK is not installed. Please install '@anthropic-ai/claude-code' to use the claude-code provider." - ); - } - } -} - -/** - * @typedef {import('./types.js').ClaudeCodeSettings} ClaudeCodeSettings - * @typedef {import('./types.js').ClaudeCodeModelId} ClaudeCodeModelId - * @typedef {import('./types.js').ClaudeCodeLanguageModelOptions} ClaudeCodeLanguageModelOptions - */ - -const modelMap = { - opus: 'opus', - sonnet: 'sonnet' -}; - -export class ClaudeCodeLanguageModel { - specificationVersion = 'v1'; - defaultObjectGenerationMode = 'json'; - supportsImageUrls = false; - supportsStructuredOutputs = false; - - /** @type {ClaudeCodeModelId} */ - modelId; - - /** @type {ClaudeCodeSettings} */ - settings; - - /** @type {string|undefined} */ - sessionId; - - /** - * @param {ClaudeCodeLanguageModelOptions} options - */ - constructor(options) { - this.modelId = options.id; - this.settings = options.settings ?? {}; - - // Validate model ID format - if ( - !this.modelId || - typeof this.modelId !== 'string' || - this.modelId.trim() === '' - ) { - throw new NoSuchModelError({ - modelId: this.modelId, - modelType: 'languageModel' - }); - } - } - - get provider() { - return 'claude-code'; - } - - /** - * Get the model name for Claude Code CLI - * @returns {string} - */ - getModel() { - const mapped = modelMap[this.modelId]; - return mapped ?? this.modelId; - } - - /** - * Generate unsupported parameter warnings - * @param {Object} options - Generation options - * @returns {Array} Warnings array - */ - generateUnsupportedWarnings(options) { - const warnings = []; - const unsupportedParams = []; - - // Check for unsupported parameters - if (options.temperature !== undefined) - unsupportedParams.push('temperature'); - if (options.maxTokens !== undefined) unsupportedParams.push('maxTokens'); - if (options.topP !== undefined) unsupportedParams.push('topP'); - if (options.topK !== undefined) unsupportedParams.push('topK'); - if (options.presencePenalty !== undefined) - unsupportedParams.push('presencePenalty'); - if (options.frequencyPenalty !== undefined) - unsupportedParams.push('frequencyPenalty'); - if (options.stopSequences !== undefined && options.stopSequences.length > 0) - unsupportedParams.push('stopSequences'); - if (options.seed !== undefined) unsupportedParams.push('seed'); - - if (unsupportedParams.length > 0) { - // Add a warning for each unsupported parameter - for (const param of unsupportedParams) { - warnings.push({ - type: 'unsupported-setting', - setting: param, - details: `Claude Code CLI does not support the ${param} parameter. It will be ignored.` - }); - } - } - - return warnings; - } - - /** - * Generate text using Claude Code - * @param {Object} options - Generation options - * @returns {Promise} - */ - async doGenerate(options) { - await loadClaudeCodeModule(); - const { messagesPrompt } = convertToClaudeCodeMessages( - options.prompt, - options.mode - ); - - const abortController = new AbortController(); - if (options.abortSignal) { - options.abortSignal.addEventListener('abort', () => - abortController.abort() - ); - } - - const queryOptions = { - model: this.getModel(), - abortController, - resume: this.sessionId, - pathToClaudeCodeExecutable: this.settings.pathToClaudeCodeExecutable, - customSystemPrompt: this.settings.customSystemPrompt, - appendSystemPrompt: this.settings.appendSystemPrompt, - maxTurns: this.settings.maxTurns, - maxThinkingTokens: this.settings.maxThinkingTokens, - cwd: this.settings.cwd, - executable: this.settings.executable, - executableArgs: this.settings.executableArgs, - permissionMode: this.settings.permissionMode, - permissionPromptToolName: this.settings.permissionPromptToolName, - continue: this.settings.continue, - allowedTools: this.settings.allowedTools, - disallowedTools: this.settings.disallowedTools, - mcpServers: this.settings.mcpServers - }; - - let text = ''; - let usage = { promptTokens: 0, completionTokens: 0 }; - let finishReason = 'stop'; - let costUsd; - let durationMs; - let rawUsage; - const warnings = this.generateUnsupportedWarnings(options); - - try { - if (!query) { - throw new Error( - "Claude Code SDK is not installed. Please install '@anthropic-ai/claude-code' to use the claude-code provider." - ); - } - const response = query({ - prompt: messagesPrompt, - options: queryOptions - }); - - for await (const message of response) { - if (message.type === 'assistant') { - text += message.message.content - .map((c) => (c.type === 'text' ? c.text : '')) - .join(''); - } else if (message.type === 'result') { - this.sessionId = message.session_id; - costUsd = message.total_cost_usd; - durationMs = message.duration_ms; - - if ('usage' in message) { - rawUsage = message.usage; - usage = { - promptTokens: - (message.usage.cache_creation_input_tokens ?? 0) + - (message.usage.cache_read_input_tokens ?? 0) + - (message.usage.input_tokens ?? 0), - completionTokens: message.usage.output_tokens ?? 0 - }; - } - - if (message.subtype === 'error_max_turns') { - finishReason = 'length'; - } else if (message.subtype === 'error_during_execution') { - finishReason = 'error'; - } - } else if (message.type === 'system' && message.subtype === 'init') { - this.sessionId = message.session_id; - } - } - } catch (error) { - // ------------------------------------------------------------- - // Work-around for Claude-Code CLI/SDK JSON truncation bug (#913) - // ------------------------------------------------------------- - // If the SDK throws a JSON SyntaxError *but* we already hold some - // buffered text, assume the response was truncated by the CLI. - // We keep the accumulated text, mark the finish reason, push a - // provider-warning and *skip* the normal error handling so Task - // Master can continue processing. - const isJsonTruncation = - error instanceof SyntaxError && - /JSON/i.test(error.message || '') && - (error.message.includes('position') || - error.message.includes('Unexpected end')); - if (isJsonTruncation && text && text.length > 0) { - warnings.push({ - type: 'provider-warning', - details: - 'Claude Code SDK emitted a JSON parse error but Task Master recovered buffered text (possible CLI truncation).' - }); - finishReason = 'truncated'; - // Skip re-throwing: fall through so the caller receives usable data - } else { - if (AbortError && error instanceof AbortError) { - throw options.abortSignal?.aborted - ? options.abortSignal.reason - : error; - } - - // Check for authentication errors - if ( - error.message?.includes('not logged in') || - error.message?.includes('authentication') || - error.exitCode === 401 - ) { - throw createAuthenticationError({ - message: - error.message || - 'Authentication failed. Please ensure Claude Code CLI is properly authenticated.' - }); - } - - // Wrap other errors with API call error - throw createAPICallError({ - message: error.message || 'Claude Code CLI error', - code: error.code, - exitCode: error.exitCode, - stderr: error.stderr, - promptExcerpt: messagesPrompt.substring(0, 200), - isRetryable: error.code === 'ENOENT' || error.code === 'ECONNREFUSED' - }); - } - } - - // Extract JSON if in object-json mode - if (options.mode?.type === 'object-json' && text) { - text = extractJson(text); - } - - return { - text: text || undefined, - usage, - finishReason, - rawCall: { - rawPrompt: messagesPrompt, - rawSettings: queryOptions - }, - warnings: warnings.length > 0 ? warnings : undefined, - response: { - id: generateId(), - timestamp: new Date(), - modelId: this.modelId - }, - request: { - body: messagesPrompt - }, - providerMetadata: { - 'claude-code': { - ...(this.sessionId !== undefined && { sessionId: this.sessionId }), - ...(costUsd !== undefined && { costUsd }), - ...(durationMs !== undefined && { durationMs }), - ...(rawUsage !== undefined && { rawUsage }) - } - } - }; - } - - /** - * Stream text using Claude Code - * @param {Object} options - Stream options - * @returns {Promise} - */ - async doStream(options) { - await loadClaudeCodeModule(); - const { messagesPrompt } = convertToClaudeCodeMessages( - options.prompt, - options.mode - ); - - const abortController = new AbortController(); - if (options.abortSignal) { - options.abortSignal.addEventListener('abort', () => - abortController.abort() - ); - } - - const queryOptions = { - model: this.getModel(), - abortController, - resume: this.sessionId, - pathToClaudeCodeExecutable: this.settings.pathToClaudeCodeExecutable, - customSystemPrompt: this.settings.customSystemPrompt, - appendSystemPrompt: this.settings.appendSystemPrompt, - maxTurns: this.settings.maxTurns, - maxThinkingTokens: this.settings.maxThinkingTokens, - cwd: this.settings.cwd, - executable: this.settings.executable, - executableArgs: this.settings.executableArgs, - permissionMode: this.settings.permissionMode, - permissionPromptToolName: this.settings.permissionPromptToolName, - continue: this.settings.continue, - allowedTools: this.settings.allowedTools, - disallowedTools: this.settings.disallowedTools, - mcpServers: this.settings.mcpServers - }; - - const warnings = this.generateUnsupportedWarnings(options); - - const stream = new ReadableStream({ - start: async (controller) => { - try { - if (!query) { - throw new Error( - "Claude Code SDK is not installed. Please install '@anthropic-ai/claude-code' to use the claude-code provider." - ); - } - const response = query({ - prompt: messagesPrompt, - options: queryOptions - }); - - let usage = { promptTokens: 0, completionTokens: 0 }; - let accumulatedText = ''; - - for await (const message of response) { - if (message.type === 'assistant') { - const text = message.message.content - .map((c) => (c.type === 'text' ? c.text : '')) - .join(''); - - if (text) { - accumulatedText += text; - - // In object-json mode, we need to accumulate the full text - // and extract JSON at the end, so don't stream individual deltas - if (options.mode?.type !== 'object-json') { - controller.enqueue({ - type: 'text-delta', - textDelta: text - }); - } - } - } else if (message.type === 'result') { - let rawUsage; - if ('usage' in message) { - rawUsage = message.usage; - usage = { - promptTokens: - (message.usage.cache_creation_input_tokens ?? 0) + - (message.usage.cache_read_input_tokens ?? 0) + - (message.usage.input_tokens ?? 0), - completionTokens: message.usage.output_tokens ?? 0 - }; - } - - let finishReason = 'stop'; - if (message.subtype === 'error_max_turns') { - finishReason = 'length'; - } else if (message.subtype === 'error_during_execution') { - finishReason = 'error'; - } - - // Store session ID in the model instance - this.sessionId = message.session_id; - - // In object-json mode, extract JSON and send the full text at once - if (options.mode?.type === 'object-json' && accumulatedText) { - const extractedJson = extractJson(accumulatedText); - controller.enqueue({ - type: 'text-delta', - textDelta: extractedJson - }); - } - - controller.enqueue({ - type: 'finish', - finishReason, - usage, - providerMetadata: { - 'claude-code': { - sessionId: message.session_id, - ...(message.total_cost_usd !== undefined && { - costUsd: message.total_cost_usd - }), - ...(message.duration_ms !== undefined && { - durationMs: message.duration_ms - }), - ...(rawUsage !== undefined && { rawUsage }) - } - } - }); - } else if ( - message.type === 'system' && - message.subtype === 'init' - ) { - // Store session ID for future use - this.sessionId = message.session_id; - - // Emit response metadata when session is initialized - controller.enqueue({ - type: 'response-metadata', - id: message.session_id, - timestamp: new Date(), - modelId: this.modelId - }); - } - } - - // ------------------------------------------------------------- - // Work-around for Claude-Code CLI/SDK JSON truncation bug (#913) - // ------------------------------------------------------------- - // If we hit the SDK JSON SyntaxError but have buffered text, finalize - // the stream gracefully instead of emitting an error. - const isJsonTruncation = - error instanceof SyntaxError && - /JSON/i.test(error.message || '') && - (error.message.includes('position') || - error.message.includes('Unexpected end')); - - if ( - isJsonTruncation && - accumulatedText && - accumulatedText.length > 0 - ) { - // Prepare final text payload - const finalText = - options.mode?.type === 'object-json' - ? extractJson(accumulatedText) - : accumulatedText; - - // Emit any remaining text - controller.enqueue({ - type: 'text-delta', - textDelta: finalText - }); - - // Emit finish with truncated reason and warning - controller.enqueue({ - type: 'finish', - finishReason: 'truncated', - usage, - providerMetadata: { 'claude-code': { truncated: true } }, - warnings: [ - { - type: 'provider-warning', - details: - 'Claude Code SDK JSON truncation detected; stream recovered.' - } - ] - }); - - controller.close(); - return; // Skip normal error path - } - - controller.close(); - } catch (error) { - let errorToEmit; - - if (AbortError && error instanceof AbortError) { - errorToEmit = options.abortSignal?.aborted - ? options.abortSignal.reason - : error; - } else if ( - error.message?.includes('not logged in') || - error.message?.includes('authentication') || - error.exitCode === 401 - ) { - errorToEmit = createAuthenticationError({ - message: - error.message || - 'Authentication failed. Please ensure Claude Code CLI is properly authenticated.' - }); - } else { - errorToEmit = createAPICallError({ - message: error.message || 'Claude Code CLI error', - code: error.code, - exitCode: error.exitCode, - stderr: error.stderr, - promptExcerpt: messagesPrompt.substring(0, 200), - isRetryable: - error.code === 'ENOENT' || error.code === 'ECONNREFUSED' - }); - } - - // Emit error as a stream part - controller.enqueue({ - type: 'error', - error: errorToEmit - }); - - controller.close(); - } - } - }); - - return { - stream, - rawCall: { - rawPrompt: messagesPrompt, - rawSettings: queryOptions - }, - warnings: warnings.length > 0 ? warnings : undefined, - request: { - body: messagesPrompt - } - }; - } -} diff --git a/src/ai-providers/custom-sdk/claude-code/message-converter.js b/src/ai-providers/custom-sdk/claude-code/message-converter.js deleted file mode 100644 index 7bad0418..00000000 --- a/src/ai-providers/custom-sdk/claude-code/message-converter.js +++ /dev/null @@ -1,139 +0,0 @@ -/** - * @fileoverview Converts AI SDK prompt format to Claude Code message format - */ - -/** - * Convert AI SDK prompt to Claude Code messages format - * @param {Array} prompt - AI SDK prompt array - * @param {Object} [mode] - Generation mode - * @param {string} mode.type - Mode type ('regular', 'object-json', 'object-tool') - * @returns {{messagesPrompt: string, systemPrompt?: string}} - */ -export function convertToClaudeCodeMessages(prompt, mode) { - const messages = []; - let systemPrompt; - - for (const message of prompt) { - switch (message.role) { - case 'system': - systemPrompt = message.content; - break; - - case 'user': - if (typeof message.content === 'string') { - messages.push(message.content); - } else { - // Handle multi-part content - const textParts = message.content - .filter((part) => part.type === 'text') - .map((part) => part.text) - .join('\n'); - - if (textParts) { - messages.push(textParts); - } - - // Note: Image parts are not supported by Claude Code CLI - const imageParts = message.content.filter( - (part) => part.type === 'image' - ); - if (imageParts.length > 0) { - console.warn( - 'Claude Code CLI does not support image inputs. Images will be ignored.' - ); - } - } - break; - - case 'assistant': - if (typeof message.content === 'string') { - messages.push(`Assistant: ${message.content}`); - } else { - const textParts = message.content - .filter((part) => part.type === 'text') - .map((part) => part.text) - .join('\n'); - - if (textParts) { - messages.push(`Assistant: ${textParts}`); - } - - // Handle tool calls if present - const toolCalls = message.content.filter( - (part) => part.type === 'tool-call' - ); - if (toolCalls.length > 0) { - // For now, we'll just note that tool calls were made - messages.push(`Assistant: [Tool calls made]`); - } - } - break; - - case 'tool': - // Tool results could be included in the conversation - messages.push( - `Tool Result (${message.content[0].toolName}): ${JSON.stringify( - message.content[0].result - )}` - ); - break; - } - } - - // For the SDK, we need to provide a single prompt string - // Format the conversation history properly - - // Combine system prompt with messages - let finalPrompt = ''; - - // Add system prompt at the beginning if present - if (systemPrompt) { - finalPrompt = systemPrompt; - } - - if (messages.length === 0) { - return { messagesPrompt: finalPrompt, systemPrompt }; - } - - // Format messages - const formattedMessages = []; - for (let i = 0; i < messages.length; i++) { - const msg = messages[i]; - // Check if this is a user or assistant message based on content - if (msg.startsWith('Assistant:') || msg.startsWith('Tool Result')) { - formattedMessages.push(msg); - } else { - // User messages - formattedMessages.push(`Human: ${msg}`); - } - } - - // Combine system prompt with messages - if (finalPrompt) { - finalPrompt = finalPrompt + '\n\n' + formattedMessages.join('\n\n'); - } else { - finalPrompt = formattedMessages.join('\n\n'); - } - - // For JSON mode, add explicit instruction to ensure JSON output - if (mode?.type === 'object-json') { - // Make the JSON instruction even more explicit - finalPrompt = `${finalPrompt} - -CRITICAL INSTRUCTION: You MUST respond with ONLY valid JSON. Follow these rules EXACTLY: -1. Start your response with an opening brace { -2. End your response with a closing brace } -3. Do NOT include any text before the opening brace -4. Do NOT include any text after the closing brace -5. Do NOT use markdown code blocks or backticks -6. Do NOT include explanations or commentary -7. The ENTIRE response must be valid JSON that can be parsed with JSON.parse() - -Begin your response with { and end with }`; - } - - return { - messagesPrompt: finalPrompt, - systemPrompt - }; -} diff --git a/src/ai-providers/custom-sdk/claude-code/types.js b/src/ai-providers/custom-sdk/claude-code/types.js deleted file mode 100644 index 130d1f65..00000000 --- a/src/ai-providers/custom-sdk/claude-code/types.js +++ /dev/null @@ -1,73 +0,0 @@ -/** - * @fileoverview Type definitions for Claude Code AI SDK provider - * These JSDoc types mirror the TypeScript interfaces from the original provider - */ - -/** - * Claude Code provider settings - * @typedef {Object} ClaudeCodeSettings - * @property {string} [pathToClaudeCodeExecutable='claude'] - Custom path to Claude Code CLI executable - * @property {string} [customSystemPrompt] - Custom system prompt to use - * @property {string} [appendSystemPrompt] - Append additional content to the system prompt - * @property {number} [maxTurns] - Maximum number of turns for the conversation - * @property {number} [maxThinkingTokens] - Maximum thinking tokens for the model - * @property {string} [cwd] - Working directory for CLI operations - * @property {'bun'|'deno'|'node'} [executable='node'] - JavaScript runtime to use - * @property {string[]} [executableArgs] - Additional arguments for the JavaScript runtime - * @property {'default'|'acceptEdits'|'bypassPermissions'|'plan'} [permissionMode='default'] - Permission mode for tool usage - * @property {string} [permissionPromptToolName] - Custom tool name for permission prompts - * @property {boolean} [continue] - Continue the most recent conversation - * @property {string} [resume] - Resume a specific session by ID - * @property {string[]} [allowedTools] - Tools to explicitly allow during execution (e.g., ['Read', 'LS', 'Bash(git log:*)']) - * @property {string[]} [disallowedTools] - Tools to disallow during execution (e.g., ['Write', 'Edit', 'Bash(rm:*)']) - * @property {Object.} [mcpServers] - MCP server configuration - * @property {boolean} [verbose] - Enable verbose logging for debugging - */ - -/** - * MCP Server configuration - * @typedef {Object} MCPServerConfig - * @property {'stdio'|'sse'} [type='stdio'] - Server type - * @property {string} command - Command to execute (for stdio type) - * @property {string[]} [args] - Arguments for the command - * @property {Object.} [env] - Environment variables - * @property {string} url - URL for SSE type servers - * @property {Object.} [headers] - Headers for SSE type servers - */ - -/** - * Model ID type - either 'opus', 'sonnet', or any string - * @typedef {'opus'|'sonnet'|string} ClaudeCodeModelId - */ - -/** - * Language model options - * @typedef {Object} ClaudeCodeLanguageModelOptions - * @property {ClaudeCodeModelId} id - The model ID - * @property {ClaudeCodeSettings} [settings] - Optional settings - */ - -/** - * Error metadata for Claude Code errors - * @typedef {Object} ClaudeCodeErrorMetadata - * @property {string} [code] - Error code - * @property {number} [exitCode] - Process exit code - * @property {string} [stderr] - Standard error output - * @property {string} [promptExcerpt] - Excerpt of the prompt that caused the error - */ - -/** - * Claude Code provider interface - * @typedef {Object} ClaudeCodeProvider - * @property {function(ClaudeCodeModelId, ClaudeCodeSettings=): Object} languageModel - Create a language model - * @property {function(ClaudeCodeModelId, ClaudeCodeSettings=): Object} chat - Alias for languageModel - * @property {function(string): never} textEmbeddingModel - Throws NoSuchModelError (not supported) - */ - -/** - * Claude Code provider settings - * @typedef {Object} ClaudeCodeProviderSettings - * @property {ClaudeCodeSettings} [defaultSettings] - Default settings to use for all models - */ - -export {}; // This ensures the file is treated as a module diff --git a/src/ai-providers/gemini-cli.js b/src/ai-providers/gemini-cli.js index 64e902f8..47aea4fd 100644 --- a/src/ai-providers/gemini-cli.js +++ b/src/ai-providers/gemini-cli.js @@ -9,21 +9,7 @@ import { generateObject, generateText, streamText } from 'ai'; import { parse } from 'jsonc-parser'; import { BaseAIProvider } from './base-provider.js'; import { log } from '../../scripts/modules/utils.js'; - -let createGeminiProvider; - -async function loadGeminiCliModule() { - if (!createGeminiProvider) { - try { - const mod = await import('ai-sdk-provider-gemini-cli'); - createGeminiProvider = mod.createGeminiProvider; - } catch (err) { - throw new Error( - "Gemini CLI SDK is not installed. Please install 'ai-sdk-provider-gemini-cli' to use the gemini-cli provider." - ); - } - } -} +import { createGeminiProvider } from 'ai-sdk-provider-gemini-cli'; export class GeminiCliProvider extends BaseAIProvider { constructor() { @@ -54,8 +40,6 @@ export class GeminiCliProvider extends BaseAIProvider { */ async getClient(params) { try { - // Load the Gemini CLI module dynamically - await loadGeminiCliModule(); // Primary use case: Use existing gemini CLI authentication // Secondary use case: Direct API key (for compatibility) let authOptions = {}; @@ -441,7 +425,7 @@ Generate ${subtaskCount} subtasks based on the original task context. Return ONL model: client(params.modelId), system: systemPrompt, messages: messages, - maxTokens: params.maxTokens, + maxOutputTokens: params.maxTokens, temperature: params.temperature }); @@ -545,7 +529,7 @@ Generate ${subtaskCount} subtasks based on the original task context. Return ONL model: client(params.modelId), system: systemPrompt, messages: messages, - maxTokens: params.maxTokens, + maxOutputTokens: params.maxTokens, temperature: params.temperature }); @@ -604,7 +588,7 @@ Generate ${subtaskCount} subtasks based on the original task context. Return ONL messages: messages, schema: params.schema, mode: 'json', // Use json mode instead of auto for Gemini - maxTokens: params.maxTokens, + maxOutputTokens: params.maxTokens, temperature: params.temperature }); diff --git a/src/ai-providers/ollama.js b/src/ai-providers/ollama.js index 0dfd8f0d..a1805bda 100644 --- a/src/ai-providers/ollama.js +++ b/src/ai-providers/ollama.js @@ -1,9 +1,9 @@ /** * ollama.js - * AI provider implementation for Ollama models using the ollama-ai-provider package. + * AI provider implementation for Ollama models using the ollama-ai-provider-v2 package. */ -import { createOllama } from 'ollama-ai-provider'; +import { createOllama } from 'ollama-ai-provider-v2'; import { BaseAIProvider } from './base-provider.js'; export class OllamaAIProvider extends BaseAIProvider { diff --git a/src/ai-providers/openai.js b/src/ai-providers/openai.js index adf55822..4f7b67eb 100644 --- a/src/ai-providers/openai.js +++ b/src/ai-providers/openai.js @@ -20,16 +20,6 @@ export class OpenAIProvider extends BaseAIProvider { return 'OPENAI_API_KEY'; } - /** - * Determines if a model requires max_completion_tokens instead of maxTokens - * GPT-5 models require max_completion_tokens parameter - * @param {string} modelId - The model ID to check - * @returns {boolean} True if the model requires max_completion_tokens - */ - requiresMaxCompletionTokens(modelId) { - return modelId && modelId.startsWith('gpt-5'); - } - /** * Creates and returns an OpenAI client instance. * @param {object} params - Parameters for client initialization diff --git a/tests/integration/claude-code-error-handling.test.js b/tests/integration/claude-code-error-handling.test.js new file mode 100644 index 00000000..979c3f27 --- /dev/null +++ b/tests/integration/claude-code-error-handling.test.js @@ -0,0 +1,58 @@ +import { jest } from '@jest/globals'; + +// Mock AI SDK functions at the top level +jest.unstable_mockModule('ai', () => ({ + generateObject: jest.fn(), + generateText: jest.fn(), + streamText: jest.fn(), + streamObject: jest.fn(), + zodSchema: jest.fn(), + JSONParseError: class JSONParseError extends Error {}, + NoObjectGeneratedError: class NoObjectGeneratedError extends Error {} +})); + +// Mock CLI failure scenario +jest.unstable_mockModule('ai-sdk-provider-claude-code', () => ({ + createClaudeCode: jest.fn(() => { + throw new Error('Claude Code CLI not found'); + }) +})); + +// Import the provider after mocking +const { ClaudeCodeProvider } = await import( + '../../src/ai-providers/claude-code.js' +); + +describe('Claude Code Error Handling', () => { + it('should handle missing Claude Code CLI gracefully', () => { + const provider = new ClaudeCodeProvider(); + + expect(() => provider.getClient()).toThrow(/Claude Code CLI not available/); + }); + + it('should handle CLI errors during client creation', () => { + const provider = new ClaudeCodeProvider(); + + expect(() => provider.getClient({ commandName: 'test' })).toThrow( + /Claude Code CLI not available/ + ); + }); + + it('should provide a helpful CLI-not-available error', () => { + const provider = new ClaudeCodeProvider(); + expect(() => provider.getClient()).toThrow( + /Claude Code CLI not available/i + ); + }); + + it('should still support basic provider functionality', () => { + const provider = new ClaudeCodeProvider(); + + // These should work even if CLI is not available + expect(provider.name).toBe('Claude Code'); + expect(provider.getSupportedModels()).toEqual(['sonnet', 'opus']); + expect(provider.isModelSupported('sonnet')).toBe(true); + expect(provider.isRequiredApiKey()).toBe(false); + expect(() => provider.validateAuth()).not.toThrow(); + }); +}); diff --git a/tests/integration/claude-code-optional.test.js b/tests/integration/claude-code-optional.test.js index ab90bdb5..28e9268e 100644 --- a/tests/integration/claude-code-optional.test.js +++ b/tests/integration/claude-code-optional.test.js @@ -1,95 +1,128 @@ import { jest } from '@jest/globals'; -// Mock the base provider to avoid circular dependencies -jest.unstable_mockModule('../../src/ai-providers/base-provider.js', () => ({ - BaseAIProvider: class { - constructor() { - this.name = 'Base Provider'; - } - handleError(context, error) { - throw error; - } - } +// Mock AI SDK functions at the top level +const generateText = jest.fn(); +const streamText = jest.fn(); + +jest.unstable_mockModule('ai', () => ({ + generateObject: jest.fn(), + generateText, + streamText, + streamObject: jest.fn(), + zodSchema: jest.fn(), + JSONParseError: class JSONParseError extends Error {}, + NoObjectGeneratedError: class NoObjectGeneratedError extends Error {} })); -// Mock the claude-code SDK to simulate it not being installed -jest.unstable_mockModule('@anthropic-ai/claude-code', () => { - throw new Error("Cannot find module '@anthropic-ai/claude-code'"); -}); +// Mock successful provider creation for all tests +const mockProvider = jest.fn((modelId) => ({ + id: modelId, + doGenerate: jest.fn(), + doStream: jest.fn() +})); +mockProvider.languageModel = jest.fn((id, settings) => ({ id, settings })); +mockProvider.chat = mockProvider.languageModel; -// Import after mocking +jest.unstable_mockModule('ai-sdk-provider-claude-code', () => ({ + createClaudeCode: jest.fn(() => mockProvider) +})); + +// Import the provider after mocking const { ClaudeCodeProvider } = await import( '../../src/ai-providers/claude-code.js' ); -describe('Claude Code Optional Dependency Integration', () => { - describe('when @anthropic-ai/claude-code is not installed', () => { - it('should allow provider instantiation', () => { - // Provider should instantiate without error - const provider = new ClaudeCodeProvider(); - expect(provider).toBeDefined(); - expect(provider.name).toBe('Claude Code'); +describe('Claude Code Integration (Optional)', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should create a working provider instance', () => { + const provider = new ClaudeCodeProvider(); + expect(provider.name).toBe('Claude Code'); + expect(provider.getSupportedModels()).toEqual(['sonnet', 'opus']); + }); + + it('should support model validation', () => { + const provider = new ClaudeCodeProvider(); + expect(provider.isModelSupported('sonnet')).toBe(true); + expect(provider.isModelSupported('opus')).toBe(true); + expect(provider.isModelSupported('haiku')).toBe(false); + expect(provider.isModelSupported('unknown')).toBe(false); + }); + + it('should create a client successfully', () => { + const provider = new ClaudeCodeProvider(); + const client = provider.getClient(); + + expect(client).toBeDefined(); + expect(typeof client).toBe('function'); + expect(client.languageModel).toBeDefined(); + expect(client.chat).toBeDefined(); + expect(client.chat).toBe(client.languageModel); + }); + + it('should pass command-specific settings to client', async () => { + const provider = new ClaudeCodeProvider(); + const client = provider.getClient({ commandName: 'test-command' }); + + expect(client).toBeDefined(); + expect(typeof client).toBe('function'); + const { createClaudeCode } = await import('ai-sdk-provider-claude-code'); + expect(createClaudeCode).toHaveBeenCalledTimes(1); + }); + + it('should handle AI SDK generateText integration', async () => { + const provider = new ClaudeCodeProvider(); + const client = provider.getClient(); + + // Mock successful generation + generateText.mockResolvedValueOnce({ + text: 'Hello from Claude Code!', + usage: { totalTokens: 10 } }); - it('should allow client creation', () => { - const provider = new ClaudeCodeProvider(); - // Client creation should work - const client = provider.getClient({}); - expect(client).toBeDefined(); - expect(typeof client).toBe('function'); + const result = await generateText({ + model: client('sonnet'), + messages: [{ role: 'user', content: 'Hello' }] }); - it('should fail with clear error when trying to use the model', async () => { - const provider = new ClaudeCodeProvider(); - const client = provider.getClient({}); - const model = client('opus'); - - // The actual usage should fail with the lazy loading error - await expect( - model.doGenerate({ - prompt: [{ role: 'user', content: 'Hello' }], - mode: { type: 'regular' } - }) - ).rejects.toThrow( - "Claude Code SDK is not installed. Please install '@anthropic-ai/claude-code' to use the claude-code provider." - ); - }); - - it('should provide helpful error message for streaming', async () => { - const provider = new ClaudeCodeProvider(); - const client = provider.getClient({}); - const model = client('sonnet'); - - await expect( - model.doStream({ - prompt: [{ role: 'user', content: 'Hello' }], - mode: { type: 'regular' } - }) - ).rejects.toThrow( - "Claude Code SDK is not installed. Please install '@anthropic-ai/claude-code' to use the claude-code provider." - ); + expect(result.text).toBe('Hello from Claude Code!'); + expect(generateText).toHaveBeenCalledWith({ + model: expect.any(Object), + messages: [{ role: 'user', content: 'Hello' }] }); }); - describe('provider behavior', () => { - it('should not require API key', () => { - const provider = new ClaudeCodeProvider(); - // Should not throw - expect(() => provider.validateAuth()).not.toThrow(); - expect(() => provider.validateAuth({ apiKey: null })).not.toThrow(); + it('should handle AI SDK streamText integration', async () => { + const provider = new ClaudeCodeProvider(); + const client = provider.getClient(); + + // Mock successful streaming + const mockStream = { + textStream: (async function* () { + yield 'Streamed response'; + })() + }; + streamText.mockResolvedValueOnce(mockStream); + + const streamResult = await streamText({ + model: client('sonnet'), + messages: [{ role: 'user', content: 'Stream test' }] }); - it('should work with ai-services-unified when provider is configured', async () => { - // This tests that the provider can be selected but will fail appropriately - // when the actual model is used - const provider = new ClaudeCodeProvider(); - expect(provider).toBeDefined(); - - // In real usage, ai-services-unified would: - // 1. Get the provider instance (works) - // 2. Call provider.getClient() (works) - // 3. Create a model (works) - // 4. Try to generate (fails with clear error) + expect(streamResult.textStream).toBeDefined(); + expect(streamText).toHaveBeenCalledWith({ + model: expect.any(Object), + messages: [{ role: 'user', content: 'Stream test' }] }); }); + + it('should not require authentication validation', () => { + const provider = new ClaudeCodeProvider(); + expect(provider.isRequiredApiKey()).toBe(false); + expect(() => provider.validateAuth()).not.toThrow(); + expect(() => provider.validateAuth({})).not.toThrow(); + expect(() => provider.validateAuth({ commandName: 'test' })).not.toThrow(); + }); }); diff --git a/tests/unit/ai-providers/claude-code.test.js b/tests/unit/ai-providers/claude-code.test.js index 92388444..ac0fa625 100644 --- a/tests/unit/ai-providers/claude-code.test.js +++ b/tests/unit/ai-providers/claude-code.test.js @@ -1,21 +1,20 @@ import { jest } from '@jest/globals'; -// Mock the claude-code SDK module -jest.unstable_mockModule( - '../../../src/ai-providers/custom-sdk/claude-code/index.js', - () => ({ - createClaudeCode: jest.fn(() => { - const provider = (modelId, settings) => ({ - // Mock language model - id: modelId, - settings - }); - provider.languageModel = jest.fn((id, settings) => ({ id, settings })); - provider.chat = provider.languageModel; - return provider; - }) +// Mock the ai-sdk-provider-claude-code package +jest.unstable_mockModule('ai-sdk-provider-claude-code', () => ({ + createClaudeCode: jest.fn(() => { + const provider = (modelId, settings) => ({ + // Minimal mock language model surface + id: modelId, + settings, + doGenerate: jest.fn(() => ({ text: 'ok', usage: {} })), + doStream: jest.fn(() => ({ stream: true })) + }); + provider.languageModel = jest.fn((id, settings) => ({ id, settings })); + provider.chat = provider.languageModel; + return provider; }) -); +})); // Mock the base provider jest.unstable_mockModule('../../../src/ai-providers/base-provider.js', () => ({ @@ -74,15 +73,14 @@ describe('ClaudeCodeProvider', () => { expect(typeof client).toBe('function'); }); - it('should create client without API key or base URL', () => { - const client = provider.getClient({}); + it('should create client without parameters', () => { + const client = provider.getClient(); expect(client).toBeDefined(); }); - it('should handle params even though they are not used', () => { + it('should handle commandName parameter', () => { const client = provider.getClient({ - baseURL: 'https://example.com', - apiKey: 'unused-key' + commandName: 'test-command' }); expect(client).toBeDefined(); }); @@ -95,12 +93,24 @@ describe('ClaudeCodeProvider', () => { }); }); + describe('model support', () => { + it('should return supported models', () => { + const models = provider.getSupportedModels(); + expect(models).toEqual(['sonnet', 'opus']); + }); + + it('should check if model is supported', () => { + expect(provider.isModelSupported('sonnet')).toBe(true); + expect(provider.isModelSupported('opus')).toBe(true); + expect(provider.isModelSupported('haiku')).toBe(false); + expect(provider.isModelSupported('unknown')).toBe(false); + }); + }); + describe('error handling', () => { it('should handle client initialization errors', async () => { // Force an error by making createClaudeCode throw - const { createClaudeCode } = await import( - '../../../src/ai-providers/custom-sdk/claude-code/index.js' - ); + const { createClaudeCode } = await import('ai-sdk-provider-claude-code'); createClaudeCode.mockImplementationOnce(() => { throw new Error('Mock initialization error'); }); diff --git a/tests/unit/ai-providers/custom-sdk/claude-code/language-model.test.js b/tests/unit/ai-providers/custom-sdk/claude-code/language-model.test.js deleted file mode 100644 index 5f1813aa..00000000 --- a/tests/unit/ai-providers/custom-sdk/claude-code/language-model.test.js +++ /dev/null @@ -1,237 +0,0 @@ -import { jest } from '@jest/globals'; - -// Mock modules before importing -jest.unstable_mockModule('@ai-sdk/provider', () => ({ - NoSuchModelError: class NoSuchModelError extends Error { - constructor({ modelId, modelType }) { - super(`No such model: ${modelId}`); - this.modelId = modelId; - this.modelType = modelType; - } - } -})); - -jest.unstable_mockModule('@ai-sdk/provider-utils', () => ({ - generateId: jest.fn(() => 'test-id-123') -})); - -jest.unstable_mockModule( - '../../../../../src/ai-providers/custom-sdk/claude-code/message-converter.js', - () => ({ - convertToClaudeCodeMessages: jest.fn((prompt) => ({ - messagesPrompt: 'converted-prompt', - systemPrompt: 'system' - })) - }) -); - -jest.unstable_mockModule( - '../../../../../src/ai-providers/custom-sdk/claude-code/json-extractor.js', - () => ({ - extractJson: jest.fn((text) => text) - }) -); - -jest.unstable_mockModule( - '../../../../../src/ai-providers/custom-sdk/claude-code/errors.js', - () => ({ - createAPICallError: jest.fn((opts) => new Error(opts.message)), - createAuthenticationError: jest.fn((opts) => new Error(opts.message)) - }) -); - -// This mock will be controlled by tests -let mockClaudeCodeModule = null; -jest.unstable_mockModule('@anthropic-ai/claude-code', () => { - if (mockClaudeCodeModule) { - return mockClaudeCodeModule; - } - throw new Error("Cannot find module '@anthropic-ai/claude-code'"); -}); - -// Import the module under test -const { ClaudeCodeLanguageModel } = await import( - '../../../../../src/ai-providers/custom-sdk/claude-code/language-model.js' -); - -describe('ClaudeCodeLanguageModel', () => { - beforeEach(() => { - jest.clearAllMocks(); - // Reset the module mock - mockClaudeCodeModule = null; - // Clear module cache to ensure fresh imports - jest.resetModules(); - }); - - describe('constructor', () => { - it('should initialize with valid model ID', () => { - const model = new ClaudeCodeLanguageModel({ - id: 'opus', - settings: { maxTurns: 5 } - }); - - expect(model.modelId).toBe('opus'); - expect(model.settings).toEqual({ maxTurns: 5 }); - expect(model.provider).toBe('claude-code'); - }); - - it('should throw NoSuchModelError for invalid model ID', async () => { - expect( - () => - new ClaudeCodeLanguageModel({ - id: '', - settings: {} - }) - ).toThrow('No such model: '); - - expect( - () => - new ClaudeCodeLanguageModel({ - id: null, - settings: {} - }) - ).toThrow('No such model: null'); - }); - }); - - describe('lazy loading of @anthropic-ai/claude-code', () => { - it('should throw error when package is not installed', async () => { - // Keep mockClaudeCodeModule as null to simulate missing package - const model = new ClaudeCodeLanguageModel({ - id: 'opus', - settings: {} - }); - - await expect( - model.doGenerate({ - prompt: [{ role: 'user', content: 'test' }], - mode: { type: 'regular' } - }) - ).rejects.toThrow( - "Claude Code SDK is not installed. Please install '@anthropic-ai/claude-code' to use the claude-code provider." - ); - }); - - it('should load package successfully when available', async () => { - // Mock successful package load - const mockQuery = jest.fn(async function* () { - yield { - type: 'assistant', - message: { content: [{ type: 'text', text: 'Hello' }] } - }; - yield { - type: 'result', - subtype: 'done', - usage: { output_tokens: 10, input_tokens: 5 } - }; - }); - - mockClaudeCodeModule = { - query: mockQuery, - AbortError: class AbortError extends Error {} - }; - - // Need to re-import to get fresh module with mocks - jest.resetModules(); - const { ClaudeCodeLanguageModel: FreshModel } = await import( - '../../../../../src/ai-providers/custom-sdk/claude-code/language-model.js' - ); - - const model = new FreshModel({ - id: 'opus', - settings: {} - }); - - const result = await model.doGenerate({ - prompt: [{ role: 'user', content: 'test' }], - mode: { type: 'regular' } - }); - - expect(result.text).toBe('Hello'); - expect(mockQuery).toHaveBeenCalled(); - }); - - it('should only attempt to load package once', async () => { - // Get a fresh import to ensure clean state - jest.resetModules(); - const { ClaudeCodeLanguageModel: TestModel } = await import( - '../../../../../src/ai-providers/custom-sdk/claude-code/language-model.js' - ); - - const model = new TestModel({ - id: 'opus', - settings: {} - }); - - // First call should throw - await expect( - model.doGenerate({ - prompt: [{ role: 'user', content: 'test' }], - mode: { type: 'regular' } - }) - ).rejects.toThrow('Claude Code SDK is not installed'); - - // Second call should also throw without trying to load again - await expect( - model.doGenerate({ - prompt: [{ role: 'user', content: 'test' }], - mode: { type: 'regular' } - }) - ).rejects.toThrow('Claude Code SDK is not installed'); - }); - }); - - describe('generateUnsupportedWarnings', () => { - it('should generate warnings for unsupported parameters', () => { - const model = new ClaudeCodeLanguageModel({ - id: 'opus', - settings: {} - }); - - const warnings = model.generateUnsupportedWarnings({ - temperature: 0.7, - maxTokens: 1000, - topP: 0.9, - seed: 42 - }); - - expect(warnings).toHaveLength(4); - expect(warnings[0]).toEqual({ - type: 'unsupported-setting', - setting: 'temperature', - details: - 'Claude Code CLI does not support the temperature parameter. It will be ignored.' - }); - }); - - it('should return empty array when no unsupported parameters', () => { - const model = new ClaudeCodeLanguageModel({ - id: 'opus', - settings: {} - }); - - const warnings = model.generateUnsupportedWarnings({}); - expect(warnings).toEqual([]); - }); - }); - - describe('getModel', () => { - it('should map model IDs correctly', () => { - const model = new ClaudeCodeLanguageModel({ - id: 'opus', - settings: {} - }); - - expect(model.getModel()).toBe('opus'); - }); - - it('should return unmapped model IDs as-is', () => { - const model = new ClaudeCodeLanguageModel({ - id: 'custom-model', - settings: {} - }); - - expect(model.getModel()).toBe('custom-model'); - }); - }); -}); diff --git a/tests/unit/ai-providers/gemini-cli.test.js b/tests/unit/ai-providers/gemini-cli.test.js index 8aa0b389..3f52f128 100644 --- a/tests/unit/ai-providers/gemini-cli.test.js +++ b/tests/unit/ai-providers/gemini-cli.test.js @@ -524,7 +524,7 @@ describe('GeminiCliProvider', () => { }), system: 'You are a helpful assistant', messages: [{ role: 'user', content: 'Hello' }], - maxTokens: 100, + maxOutputTokens: 100, temperature: 0.7 }); expect(result.text).toBe('Hello! How can I help you?'); @@ -550,7 +550,7 @@ describe('GeminiCliProvider', () => { }), system: undefined, messages: [{ role: 'user', content: 'Hello' }], - maxTokens: 100, + maxOutputTokens: 100, temperature: 0.7 }); }); @@ -570,7 +570,7 @@ describe('GeminiCliProvider', () => { }), system: 'You are a helpful assistant', messages: [{ role: 'user', content: 'Hello' }], - maxTokens: 100, + maxOutputTokens: 100, temperature: 0.7 }); expect(result).toBe(mockStream); @@ -609,7 +609,7 @@ describe('GeminiCliProvider', () => { messages: [{ role: 'user', content: 'Hello' }], schema: mockObjectParams.schema, mode: 'json', - maxTokens: 100, + maxOutputTokens: 100, temperature: 0.7 }); expect(result.object).toEqual({ result: 'success' }); diff --git a/tests/unit/ai-providers/openai.test.js b/tests/unit/ai-providers/openai.test.js index 9c090a59..5f2ee6b8 100644 --- a/tests/unit/ai-providers/openai.test.js +++ b/tests/unit/ai-providers/openai.test.js @@ -1,11 +1,10 @@ /** - * Tests for OpenAI Provider - Token parameter handling for GPT-5 + * Tests for OpenAI Provider * * This test suite covers: - * 1. Correct identification of GPT-5 models requiring max_completion_tokens - * 2. Token parameter preparation for different model types - * 3. Validation of maxTokens parameter - * 4. Integer coercion of token values + * 1. Validation of maxTokens parameter + * 2. Client creation and configuration + * 3. Model handling */ import { jest } from '@jest/globals'; @@ -26,81 +25,6 @@ describe('OpenAIProvider', () => { jest.clearAllMocks(); }); - describe('requiresMaxCompletionTokens', () => { - it('should return true for GPT-5 models', () => { - expect(provider.requiresMaxCompletionTokens('gpt-5')).toBe(true); - expect(provider.requiresMaxCompletionTokens('gpt-5-mini')).toBe(true); - expect(provider.requiresMaxCompletionTokens('gpt-5-nano')).toBe(true); - expect(provider.requiresMaxCompletionTokens('gpt-5-turbo')).toBe(true); - }); - - it('should return false for non-GPT-5 models', () => { - expect(provider.requiresMaxCompletionTokens('gpt-4')).toBe(false); - expect(provider.requiresMaxCompletionTokens('gpt-4o')).toBe(false); - expect(provider.requiresMaxCompletionTokens('gpt-3.5-turbo')).toBe(false); - expect(provider.requiresMaxCompletionTokens('o1')).toBe(false); - expect(provider.requiresMaxCompletionTokens('o1-mini')).toBe(false); - }); - - it('should handle null/undefined modelId', () => { - expect(provider.requiresMaxCompletionTokens(null)).toBeFalsy(); - expect(provider.requiresMaxCompletionTokens(undefined)).toBeFalsy(); - expect(provider.requiresMaxCompletionTokens('')).toBeFalsy(); - }); - }); - - describe('prepareTokenParam', () => { - it('should return max_completion_tokens for GPT-5 models', () => { - const result = provider.prepareTokenParam('gpt-5', 1000); - expect(result).toEqual({ max_completion_tokens: 1000 }); - }); - - it('should return maxTokens for non-GPT-5 models', () => { - const result = provider.prepareTokenParam('gpt-4', 1000); - expect(result).toEqual({ maxTokens: 1000 }); - }); - - it('should coerce token value to integer', () => { - // Float values - const result1 = provider.prepareTokenParam('gpt-5', 1000.7); - expect(result1).toEqual({ max_completion_tokens: 1000 }); - - const result2 = provider.prepareTokenParam('gpt-4', 1000.7); - expect(result2).toEqual({ maxTokens: 1000 }); - - // String float - const result3 = provider.prepareTokenParam('gpt-5', '1000.7'); - expect(result3).toEqual({ max_completion_tokens: 1000 }); - - // String integers (common CLI input path) - expect(provider.prepareTokenParam('gpt-5', '1000')).toEqual({ - max_completion_tokens: 1000 - }); - expect(provider.prepareTokenParam('gpt-4', '1000')).toEqual({ - maxTokens: 1000 - }); - }); - - it('should return empty object for undefined maxTokens', () => { - const result = provider.prepareTokenParam('gpt-5', undefined); - expect(result).toEqual({}); - }); - - it('should handle edge cases', () => { - // Test with 0 (should still pass through as 0) - const result1 = provider.prepareTokenParam('gpt-5', 0); - expect(result1).toEqual({ max_completion_tokens: 0 }); - - // Test with string number - const result2 = provider.prepareTokenParam('gpt-5', '100'); - expect(result2).toEqual({ max_completion_tokens: 100 }); - - // Test with negative number (will be floored, validation happens elsewhere) - const result3 = provider.prepareTokenParam('gpt-4', -10.5); - expect(result3).toEqual({ maxTokens: -11 }); - }); - }); - describe('validateOptionalParams', () => { it('should accept valid maxTokens values', () => { expect(() => diff --git a/tests/unit/dependency-manager.test.js b/tests/unit/dependency-manager.test.js index e8ffbd3c..b1b430ef 100644 --- a/tests/unit/dependency-manager.test.js +++ b/tests/unit/dependency-manager.test.js @@ -27,10 +27,6 @@ jest.mock('chalk', () => ({ jest.mock('boxen', () => jest.fn((text) => `[boxed: ${text}]`)); -jest.mock('@anthropic-ai/sdk', () => ({ - Anthropic: jest.fn().mockImplementation(() => ({})) -})); - // Mock utils module const mockTaskExists = jest.fn(); const mockFormatTaskId = jest.fn();