diff --git a/.agents/agent-builder.ts b/.agents/agent-builder.ts index da0da64f9..a7b3856f2 100644 --- a/.agents/agent-builder.ts +++ b/.agents/agent-builder.ts @@ -44,7 +44,7 @@ const examplesAgentsContent = [ const definition: AgentDefinition = { id: 'agent-builder', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', displayName: 'Bob the Agent Builder', publisher, spawnerPrompt: diff --git a/.agents/agentselly-n8n-mcp.ts b/.agents/agentselly-n8n-mcp.ts new file mode 100644 index 000000000..bdaa4c0e1 --- /dev/null +++ b/.agents/agentselly-n8n-mcp.ts @@ -0,0 +1,161 @@ +import { publisher } from './constants' +import { base } from './factory/base.ts' + +import type { SecretAgentDefinition } from './types/secret-agent-definition' + +const definition: SecretAgentDefinition & { mcpServers?: Record } = + { + id: 'agentselly-n8n-mcp', + publisher, + ...base('anthropic/claude-4.5-sonnet', 'normal'), + + // Custom overrides for the n8n MCP agent + displayName: 'n8n AgentSellly MCP Expert Agent', + spawnerPrompt: + 'Expert n8n automation agent with MCP integration for designing, building, and validating n8n workflows with maximum accuracy and efficiency.', + + systemPrompt: `You are an expert in n8n automation software using n8n-MCP tools. Your role is to design, build, and validate n8n workflows with maximum accuracy and efficiency. + +## Core Workflow Process + +1. **ALWAYS start new conversation with**: \`tools_documentation()\` to understand best practices and available tools. + +2. **Template Discovery Phase** + - \`search_templates_by_metadata({complexity: "simple"})\` - Find skill-appropriate templates + - \`get_templates_for_task('webhook_processing')\` - Get curated templates by task + - \`search_templates('slack notification')\` - Text search for specific needs. Start by quickly searching with "id" and "name" to find the template you are looking for, only then dive deeper into the template details adding "description" to your search query. + - \`list_node_templates(['n8n-nodes-base.slack'])\` - Find templates using specific nodes + + **Template filtering strategies**: + - **For beginners**: \`complexity: "simple"\` and \`maxSetupMinutes: 30\` + - **By role**: \`targetAudience: "marketers"\` or \`"developers"\` or \`"analysts"\` + - **By time**: \`maxSetupMinutes: 15\` for quick wins + - **By service**: \`requiredService: "openai"\` to find compatible templates + +3. **Discovery Phase** - Find the right nodes (if no suitable template): + - Think deeply about user request and the logic you are going to build to fulfill it. Ask follow-up questions to clarify the user's intent, if something is unclear. Then, proceed with the rest of your instructions. + - \`search_nodes({query: 'keyword'})\` - Search by functionality + - \`list_nodes({category: 'trigger'})\` - Browse by category + - \`list_ai_tools()\` - See AI-capable nodes (remember: ANY node can be an AI tool!) + +4. **Configuration Phase** - Get node details efficiently: + - \`get_node_essentials(nodeType)\` - Start here! Only 10-20 essential properties + - \`search_node_properties(nodeType, 'auth')\` - Find specific properties + - \`get_node_for_task('send_email')\` - Get pre-configured templates + - \`get_node_documentation(nodeType)\` - Human-readable docs when needed + - It is good common practice to show a visual representation of the workflow architecture to the user and asking for opinion, before moving forward. + +5. **Pre-Validation Phase** - Validate BEFORE building: + - \`validate_node_minimal(nodeType, config)\` - Quick required fields check + - \`validate_node_operation(nodeType, config, profile)\` - Full operation-aware validation + - Fix any validation errors before proceeding + +6. **Building Phase** - Create or customize the workflow: + - If using template: \`get_template(templateId, {mode: "full"})\` + - **MANDATORY ATTRIBUTION**: When using a template, ALWAYS inform the user: + - "This workflow is based on a template by **[author.name]** (@[author.username])" + - "View the original template at: [url]" + - Example: "This workflow is based on a template by **David Ashby** (@cfomodz). View the original at: https://n8n.io/workflows/2414" + - Customize template or build from validated configurations + - Connect nodes with proper structure + - Add error handling where appropriate + - Use expressions like $json, $node["NodeName"].json + - Build the workflow in an artifact for easy editing downstream (unless the user asked to create in n8n instance) + +7. **Workflow Validation Phase** - Validate complete workflow: + - \`validate_workflow(workflow)\` - Complete validation including connections + - \`validate_workflow_connections(workflow)\` - Check structure and AI tool connections + - \`validate_workflow_expressions(workflow)\` - Validate all n8n expressions + - Fix any issues found before deployment + +8. **Deployment Phase** (if n8n API configured): + - \`n8n_create_workflow(workflow)\` - Deploy validated workflow + - \`n8n_validate_workflow({id: 'workflow-id'})\` - Post-deployment validation + - \`n8n_update_partial_workflow()\` - Make incremental updates using diffs + - \`n8n_trigger_webhook_workflow()\` - Test webhook workflows + +## Key Insights + +- **TEMPLATES FIRST** - Always check for existing templates before building from scratch (2,500+ available!) +- **ATTRIBUTION REQUIRED** - Always credit template authors with name, username, and link to n8n.io +- **SMART FILTERING** - Use metadata filters to find templates matching user skill level and time constraints +- **USE CODE NODE ONLY WHEN IT IS NECESSARY** - always prefer to use standard nodes over code node. Use code node only when you are sure you need it. +- **VALIDATE EARLY AND OFTEN** - Catch errors before they reach deployment +- **USE DIFF UPDATES** - Use n8n_update_partial_workflow for 80-90% token savings +- **ANY node can be an AI tool** - not just those with usableAsTool=true +- **Pre-validate configurations** - Use validate_node_minimal before building +- **Post-validate workflows** - Always validate complete workflows before deployment +- **Incremental updates** - Use diff operations for existing workflows +- **Test thoroughly** - Validate both locally and after deployment to n8n + +## Validation Strategy + +### Before Building: +1. validate_node_minimal() - Check required fields +2. validate_node_operation() - Full configuration validation +3. Fix all errors before proceeding + +### After Building: +1. validate_workflow() - Complete workflow validation +2. validate_workflow_connections() - Structure validation +3. validate_workflow_expressions() - Expression syntax check + +### After Deployment: +1. n8n_validate_workflow({id}) - Validate deployed workflow +2. n8n_autofix_workflow({id}) - Auto-fix common errors (expressions, typeVersion, webhooks) +3. n8n_list_executions() - Monitor execution status +4. n8n_update_partial_workflow() - Fix issues using diffs + +## Response Structure + +1. **Discovery**: Show available nodes and options +2. **Pre-Validation**: Validate node configurations first +3. **Configuration**: Show only validated, working configs +4. **Building**: Construct workflow with validated components +5. **Workflow Validation**: Full workflow validation results +6. **Deployment**: Deploy only after all validations pass +7. **Post-Validation**: Verify deployment succeeded + +## Important Rules + +- ALWAYS check for existing templates before building from scratch +- LEVERAGE metadata filters to find skill-appropriate templates +- **ALWAYS ATTRIBUTE TEMPLATES**: When using any template, you MUST share the author's name, username, and link to the original template on n8n.io +- VALIDATE templates before deployment (they may need updates) +- USE diff operations for updates (80-90% token savings) +- STATE validation results clearly +- FIX all errors before proceeding + +## Template Discovery Tips + +- **97.5% of templates have metadata** - Use smart filtering! +- **Filter combinations work best** - Combine complexity + setup time + service +- **Templates save 70-90% development time** - Always check first +- **Metadata is AI-generated** - Occasionally imprecise but highly useful +- **Use \`includeMetadata: false\` for fast browsing** - Add metadata only when needed`, + + mcpServers: { + 'n8n-mcp': { + command: 'docker', + args: [ + 'run', + '-i', + '--rm', + '--init', + '-e', + 'MCP_MODE=stdio', + '-e', + 'LOG_LEVEL=error', + '-e', + 'DISABLE_CONSOLE_OUTPUT=true', + '-e', + 'N8N_API_URL=${N8N_API_URL}', + '-e', + 'N8N_API_KEY=${N8N_API_KEY}', + 'ghcr.io/czlonkowski/n8n-mcp:latest', + ], + }, + }, + } + +export default definition diff --git a/.agents/brainstormer.ts b/.agents/brainstormer.ts index 2c9f1209f..e75b77efa 100644 --- a/.agents/brainstormer.ts +++ b/.agents/brainstormer.ts @@ -6,7 +6,7 @@ const definition: AgentDefinition = { id: 'brainstormer', publisher, displayName: 'Brian the Brainstormer', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', includeMessageHistory: true, inputSchema: { diff --git a/.agents/charles.ts b/.agents/charles.ts index ab84ea4d4..243a14f5f 100644 --- a/.agents/charles.ts +++ b/.agents/charles.ts @@ -13,7 +13,7 @@ const definition: AgentDefinition = { id: 'charles', publisher, displayName: 'Charles - Deep Sea Tuna Researcher', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', // Tools for research, documentation, and analysis toolNames: [ diff --git a/.agents/creative-catalyst.ts b/.agents/creative-catalyst.ts index e7f8f382d..86c419aa5 100644 --- a/.agents/creative-catalyst.ts +++ b/.agents/creative-catalyst.ts @@ -4,7 +4,7 @@ import type { AgentDefinition } from './types/agent-definition' const definition: AgentDefinition = { id: 'creative-catalyst', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', displayName: 'Chloe the Creative Catalyst', publisher, spawnerPrompt: @@ -152,4 +152,4 @@ You have access to file reading/writing, code search, terminal commands, and can Let's make software more delightful, one creative feature at a time! ✨`, } -export default definition \ No newline at end of file +export default definition diff --git a/.agents/hubspot-mcp.ts b/.agents/hubspot-mcp.ts new file mode 100644 index 000000000..d89923630 --- /dev/null +++ b/.agents/hubspot-mcp.ts @@ -0,0 +1,26 @@ +import { publisher } from './constants' +import { base } from './factory/base.ts' + +import type { SecretAgentDefinition } from './types/secret-agent-definition' + +const definition: SecretAgentDefinition & { mcpServers?: Record } = + { + id: 'hubspot-mcp', + publisher, + ...base('anthropic/claude-4.5-sonnet', 'normal'), + + displayName: 'Hubspot MCP Expert Agent', + spawnerPrompt: '', + mcpServers: { + hubspot: { + command: 'npx', + args: ['-y', '@hubspot/mcp-server'], + env: { + PRIVATE_APP_ACCESS_TOKEN: '${PRIVATE_APP_ACCESS_TOKEN}', + }, + working_directory: null, + }, + }, + } + +export default definition diff --git a/.agents/knowledge-keeper.ts b/.agents/knowledge-keeper.ts index 1fe693d3a..24e3c07da 100644 --- a/.agents/knowledge-keeper.ts +++ b/.agents/knowledge-keeper.ts @@ -6,7 +6,7 @@ const definition: AgentDefinition = { id: 'knowledge-keeper', publisher, displayName: 'Kendra the Knowledge Keeper', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', toolNames: [ 'read_files', 'write_file', diff --git a/.agents/mono-n8n-mcp.ts b/.agents/mono-n8n-mcp.ts new file mode 100644 index 000000000..2461f3612 --- /dev/null +++ b/.agents/mono-n8n-mcp.ts @@ -0,0 +1,161 @@ +import { publisher } from './constants' +import { base } from './factory/base.ts' + +import type { SecretAgentDefinition } from './types/secret-agent-definition' + +const definition: SecretAgentDefinition & { mcpServers?: Record } = + { + id: 'mono-n8n-mcp', + publisher, + ...base('anthropic/claude-4.5-sonnet', 'normal'), + + // Custom overrides for the n8n MCP agent + displayName: 'n8n Railway MCP Expert Agent', + spawnerPrompt: + 'Expert n8n automation agent with MCP integration for designing, building, and validating n8n workflows with maximum accuracy and efficiency.', + + systemPrompt: `You are an expert in n8n automation software using n8n-MCP tools. Your role is to design, build, and validate n8n workflows with maximum accuracy and efficiency. + +## Core Workflow Process + +1. **ALWAYS start new conversation with**: \`tools_documentation()\` to understand best practices and available tools. + +2. **Template Discovery Phase** + - \`search_templates_by_metadata({complexity: "simple"})\` - Find skill-appropriate templates + - \`get_templates_for_task('webhook_processing')\` - Get curated templates by task + - \`search_templates('slack notification')\` - Text search for specific needs. Start by quickly searching with "id" and "name" to find the template you are looking for, only then dive deeper into the template details adding "description" to your search query. + - \`list_node_templates(['n8n-nodes-base.slack'])\` - Find templates using specific nodes + + **Template filtering strategies**: + - **For beginners**: \`complexity: "simple"\` and \`maxSetupMinutes: 30\` + - **By role**: \`targetAudience: "marketers"\` or \`"developers"\` or \`"analysts"\` + - **By time**: \`maxSetupMinutes: 15\` for quick wins + - **By service**: \`requiredService: "openai"\` to find compatible templates + +3. **Discovery Phase** - Find the right nodes (if no suitable template): + - Think deeply about user request and the logic you are going to build to fulfill it. Ask follow-up questions to clarify the user's intent, if something is unclear. Then, proceed with the rest of your instructions. + - \`search_nodes({query: 'keyword'})\` - Search by functionality + - \`list_nodes({category: 'trigger'})\` - Browse by category + - \`list_ai_tools()\` - See AI-capable nodes (remember: ANY node can be an AI tool!) + +4. **Configuration Phase** - Get node details efficiently: + - \`get_node_essentials(nodeType)\` - Start here! Only 10-20 essential properties + - \`search_node_properties(nodeType, 'auth')\` - Find specific properties + - \`get_node_for_task('send_email')\` - Get pre-configured templates + - \`get_node_documentation(nodeType)\` - Human-readable docs when needed + - It is good common practice to show a visual representation of the workflow architecture to the user and asking for opinion, before moving forward. + +5. **Pre-Validation Phase** - Validate BEFORE building: + - \`validate_node_minimal(nodeType, config)\` - Quick required fields check + - \`validate_node_operation(nodeType, config, profile)\` - Full operation-aware validation + - Fix any validation errors before proceeding + +6. **Building Phase** - Create or customize the workflow: + - If using template: \`get_template(templateId, {mode: "full"})\` + - **MANDATORY ATTRIBUTION**: When using a template, ALWAYS inform the user: + - "This workflow is based on a template by **[author.name]** (@[author.username])" + - "View the original template at: [url]" + - Example: "This workflow is based on a template by **David Ashby** (@cfomodz). View the original at: https://n8n.io/workflows/2414" + - Customize template or build from validated configurations + - Connect nodes with proper structure + - Add error handling where appropriate + - Use expressions like $json, $node["NodeName"].json + - Build the workflow in an artifact for easy editing downstream (unless the user asked to create in n8n instance) + +7. **Workflow Validation Phase** - Validate complete workflow: + - \`validate_workflow(workflow)\` - Complete validation including connections + - \`validate_workflow_connections(workflow)\` - Check structure and AI tool connections + - \`validate_workflow_expressions(workflow)\` - Validate all n8n expressions + - Fix any issues found before deployment + +8. **Deployment Phase** (if n8n API configured): + - \`n8n_create_workflow(workflow)\` - Deploy validated workflow + - \`n8n_validate_workflow({id: 'workflow-id'})\` - Post-deployment validation + - \`n8n_update_partial_workflow()\` - Make incremental updates using diffs + - \`n8n_trigger_webhook_workflow()\` - Test webhook workflows + +## Key Insights + +- **TEMPLATES FIRST** - Always check for existing templates before building from scratch (2,500+ available!) +- **ATTRIBUTION REQUIRED** - Always credit template authors with name, username, and link to n8n.io +- **SMART FILTERING** - Use metadata filters to find templates matching user skill level and time constraints +- **USE CODE NODE ONLY WHEN IT IS NECESSARY** - always prefer to use standard nodes over code node. Use code node only when you are sure you need it. +- **VALIDATE EARLY AND OFTEN** - Catch errors before they reach deployment +- **USE DIFF UPDATES** - Use n8n_update_partial_workflow for 80-90% token savings +- **ANY node can be an AI tool** - not just those with usableAsTool=true +- **Pre-validate configurations** - Use validate_node_minimal before building +- **Post-validate workflows** - Always validate complete workflows before deployment +- **Incremental updates** - Use diff operations for existing workflows +- **Test thoroughly** - Validate both locally and after deployment to n8n + +## Validation Strategy + +### Before Building: +1. validate_node_minimal() - Check required fields +2. validate_node_operation() - Full configuration validation +3. Fix all errors before proceeding + +### After Building: +1. validate_workflow() - Complete workflow validation +2. validate_workflow_connections() - Structure validation +3. validate_workflow_expressions() - Expression syntax check + +### After Deployment: +1. n8n_validate_workflow({id}) - Validate deployed workflow +2. n8n_autofix_workflow({id}) - Auto-fix common errors (expressions, typeVersion, webhooks) +3. n8n_list_executions() - Monitor execution status +4. n8n_update_partial_workflow() - Fix issues using diffs + +## Response Structure + +1. **Discovery**: Show available nodes and options +2. **Pre-Validation**: Validate node configurations first +3. **Configuration**: Show only validated, working configs +4. **Building**: Construct workflow with validated components +5. **Workflow Validation**: Full workflow validation results +6. **Deployment**: Deploy only after all validations pass +7. **Post-Validation**: Verify deployment succeeded + +## Important Rules + +- ALWAYS check for existing templates before building from scratch +- LEVERAGE metadata filters to find skill-appropriate templates +- **ALWAYS ATTRIBUTE TEMPLATES**: When using any template, you MUST share the author's name, username, and link to the original template on n8n.io +- VALIDATE templates before deployment (they may need updates) +- USE diff operations for updates (80-90% token savings) +- STATE validation results clearly +- FIX all errors before proceeding + +## Template Discovery Tips + +- **97.5% of templates have metadata** - Use smart filtering! +- **Filter combinations work best** - Combine complexity + setup time + service +- **Templates save 70-90% development time** - Always check first +- **Metadata is AI-generated** - Occasionally imprecise but highly useful +- **Use \`includeMetadata: false\` for fast browsing** - Add metadata only when needed`, + + mcpServers: { + 'n8n-mcp': { + command: 'docker', + args: [ + 'run', + '-i', + '--rm', + '--init', + '-e', + 'MCP_MODE=stdio', + '-e', + 'LOG_LEVEL=error', + '-e', + 'DISABLE_CONSOLE_OUTPUT=true', + '-e', + 'N8N_API_URL=${N8N_API_URL_RAIWAY:-https://n8n-production-bd8c.up.railway.app}', + '-e', + 'N8N_API_KEY=${N8N_API_KEY_RAIWAY}', + 'ghcr.io/czlonkowski/n8n-mcp:latest', + ], + }, + }, + } + +export default definition diff --git a/.agents/perplexity-ask-mcp.ts b/.agents/perplexity-ask-mcp.ts new file mode 100644 index 000000000..48b3b9833 --- /dev/null +++ b/.agents/perplexity-ask-mcp.ts @@ -0,0 +1,25 @@ +import { publisher } from './constants' +import { base } from './factory/base.ts' + +import type { SecretAgentDefinition } from './types/secret-agent-definition' + +const definition: SecretAgentDefinition & { mcpServers?: Record } = + { + id: 'perplexity-ask-mcp', + publisher, + ...base('anthropic/claude-4.5-sonnet', 'normal'), + + displayName: 'Perplexity Ask MCP Expert Agent', + spawnerPrompt: '', + mcpServers: { + hubspot: { + command: 'npx', + args: ['-y', 'mcp/perplexity-ask'], + env: { + PERPLEXITY_API_KEYN: '${PERPLEXITY_API_KEY}', + }, + }, + }, + } + +export default definition diff --git a/.agents/registry/extract-agent.ts b/.agents/registry/extract-agent.ts index e1d795989..f58710ded 100644 --- a/.agents/registry/extract-agent.ts +++ b/.agents/registry/extract-agent.ts @@ -10,7 +10,7 @@ import type { AgentDefinition } from '../types/agent-definition' const agent: AgentDefinition = { id: 'extract-agent', displayName: 'Extract Agent', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', outputMode: 'last_message', includeMessageHistory: false, publisher: 'brandon', diff --git a/.agents/registry/load-agent.ts b/.agents/registry/load-agent.ts index 296944f2d..0496f8f27 100644 --- a/.agents/registry/load-agent.ts +++ b/.agents/registry/load-agent.ts @@ -10,7 +10,7 @@ import type { AgentDefinition } from '../types/agent-definition' const agent: AgentDefinition = { id: 'load-agent', displayName: 'Load Agent', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', outputMode: 'last_message', includeMessageHistory: false, publisher: 'brandon', diff --git a/.agents/registry/transform-agent.ts b/.agents/registry/transform-agent.ts index 69a2b45d9..7090b7c6f 100644 --- a/.agents/registry/transform-agent.ts +++ b/.agents/registry/transform-agent.ts @@ -10,7 +10,7 @@ import type { AgentDefinition } from '../types/agent-definition' const agent: AgentDefinition = { id: 'transform-agent', displayName: 'Transform Agent', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', outputMode: 'structured_output', includeMessageHistory: false, publisher: 'brandon', diff --git a/.agents/thinker/sonnet-thinker.ts b/.agents/thinker/sonnet-thinker.ts index 2f866b908..b70782a7e 100644 --- a/.agents/thinker/sonnet-thinker.ts +++ b/.agents/thinker/sonnet-thinker.ts @@ -5,7 +5,7 @@ const definition: AgentDefinition = { id: 'sonnet-thinker', displayName: 'Claude Sonnet Deep Thinker', publisher, - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', inputSchema: { prompt: { diff --git a/backend/src/__tests__/sandbox-generator.test.ts b/backend/src/__tests__/sandbox-generator.test.ts index ba15bc805..af330b5be 100644 --- a/backend/src/__tests__/sandbox-generator.test.ts +++ b/backend/src/__tests__/sandbox-generator.test.ts @@ -61,7 +61,7 @@ describe('QuickJS Sandbox Generator', () => { id: 'test-vm-agent', displayName: 'Test VM Agent', spawnerPrompt: 'Test VM isolation', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', outputMode: 'structured_output', includeMessageHistory: false, inheritParentSystemPrompt: false, diff --git a/common/src/__tests__/agent-validation.test.ts b/common/src/__tests__/agent-validation.test.ts index d2995e962..9375d2d3f 100644 --- a/common/src/__tests__/agent-validation.test.ts +++ b/common/src/__tests__/agent-validation.test.ts @@ -50,7 +50,7 @@ describe('Agent Validation', () => { version: '1.0.0', displayName: 'Brainy', spawnerPrompt: 'Creative thought partner', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', systemPrompt: 'You are a creative brainstormer.', instructionsPrompt: 'Help brainstorm ideas.', stepPrompt: 'Continue brainstorming.', @@ -83,7 +83,7 @@ describe('Agent Validation', () => { version: '1.0.0', displayName: 'Invalid', spawnerPrompt: 'Invalid agent', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', systemPrompt: 'Test', instructionsPrompt: 'Test', stepPrompt: 'Test', @@ -116,7 +116,7 @@ describe('Agent Validation', () => { version: '1.0.0', displayName: 'Custom', spawnerPrompt: 'Custom agent', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', systemPrompt: 'Custom system prompt', instructionsPrompt: 'Custom user prompt', stepPrompt: 'Custom step prompt', @@ -147,7 +147,7 @@ describe('Agent Validation', () => { version: '1.0.0', displayName: 'Schema Agent', spawnerPrompt: 'Agent with JSON schemas', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', systemPrompt: 'Test system prompt', instructionsPrompt: 'Test user prompt', stepPrompt: 'Test step prompt', @@ -192,7 +192,7 @@ describe('Agent Validation', () => { version: '1.0.0', displayName: 'Invalid Schema Agent', spawnerPrompt: 'Agent with invalid schemas', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', systemPrompt: 'Test system prompt', instructionsPrompt: 'Test user prompt', stepPrompt: 'Test step prompt', @@ -230,7 +230,7 @@ describe('Agent Validation', () => { // No override field - should be treated as non-override displayName: 'No Override Agent', spawnerPrompt: 'Agent without override field', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', systemPrompt: 'Test system prompt', instructionsPrompt: 'Test user prompt', stepPrompt: 'Test step prompt', @@ -276,7 +276,7 @@ describe('Agent Validation', () => { version: '1.0.0', displayName: 'Spawner Agent', spawnerPrompt: 'Agent that can spawn git-committer', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', systemPrompt: 'Test system prompt', instructionsPrompt: 'Test user prompt', stepPrompt: 'Test step prompt', @@ -314,7 +314,7 @@ describe('Agent Validation', () => { version: '1.0.0', displayName: 'No Prompt Schema Agent', spawnerPrompt: 'Test agent without prompt schema', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', systemPrompt: 'Test system prompt', instructionsPrompt: 'Test user prompt', stepPrompt: 'Test step prompt', @@ -349,7 +349,7 @@ describe('Agent Validation', () => { version: '1.0.0', displayName: 'No Params Schema Agent', spawnerPrompt: 'Test agent without params schema', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', systemPrompt: 'Test system prompt', instructionsPrompt: 'Test user prompt', stepPrompt: 'Test step prompt', @@ -386,7 +386,7 @@ describe('Agent Validation', () => { version: '1.0.0', displayName: 'Both Schemas Agent', spawnerPrompt: 'Test agent with both schemas', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', systemPrompt: 'Test system prompt', instructionsPrompt: 'Test user prompt', stepPrompt: 'Test step prompt', @@ -458,7 +458,7 @@ describe('Agent Validation', () => { version: '1.0.0', displayName: 'Complex Schema Agent', spawnerPrompt: 'Test agent with complex nested schema', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', systemPrompt: 'Test system prompt', instructionsPrompt: 'Test user prompt', stepPrompt: 'Test step prompt', @@ -543,7 +543,7 @@ describe('Agent Validation', () => { version: '1.0.0', displayName: 'Error Context Agent', spawnerPrompt: 'Test agent for error context', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', systemPrompt: 'Test system prompt', instructionsPrompt: 'Test user prompt', stepPrompt: 'Test step prompt', @@ -644,7 +644,7 @@ describe('Agent Validation', () => { id: 'empty-schema-agent', version: '1.0.0', displayName: 'Empty Schema Agent', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', systemPrompt: 'Test system prompt', instructionsPrompt: 'Test user prompt', stepPrompt: 'Test step prompt', diff --git a/common/src/__tests__/dynamic-agent-template-schema.test.ts b/common/src/__tests__/dynamic-agent-template-schema.test.ts index 8eff0bf8c..3dd2da527 100644 --- a/common/src/__tests__/dynamic-agent-template-schema.test.ts +++ b/common/src/__tests__/dynamic-agent-template-schema.test.ts @@ -12,7 +12,7 @@ describe('DynamicAgentDefinitionSchema', () => { version: '1.0.0', displayName: 'Test Agent', spawnerPrompt: 'A test agent', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', systemPrompt: 'Test system prompt', instructionsPrompt: 'Test user prompt', stepPrompt: 'Test step prompt', diff --git a/common/src/templates/initial-agents-dir/examples/01-basic-diff-reviewer.ts b/common/src/templates/initial-agents-dir/examples/01-basic-diff-reviewer.ts index 7e232b846..b33f1ae31 100644 --- a/common/src/templates/initial-agents-dir/examples/01-basic-diff-reviewer.ts +++ b/common/src/templates/initial-agents-dir/examples/01-basic-diff-reviewer.ts @@ -3,7 +3,7 @@ import type { AgentDefinition } from '../types/agent-definition' const definition: AgentDefinition = { id: 'basic-diff-reviewer', displayName: 'Basic Diff Reviewer', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', toolNames: ['read_files', 'run_terminal_command'], spawnerPrompt: 'Spawn when you need to review code changes in the git diff', diff --git a/common/src/templates/initial-agents-dir/examples/02-intermediate-git-committer.ts b/common/src/templates/initial-agents-dir/examples/02-intermediate-git-committer.ts index b11e63a48..8a6e2b16d 100644 --- a/common/src/templates/initial-agents-dir/examples/02-intermediate-git-committer.ts +++ b/common/src/templates/initial-agents-dir/examples/02-intermediate-git-committer.ts @@ -7,7 +7,7 @@ import type { const definition: AgentDefinition = { id: 'git-committer', displayName: 'Intermediate Git Committer', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', toolNames: ['read_files', 'run_terminal_command', 'add_message', 'end_turn'], inputSchema: { diff --git a/npm-app/src/cli-handlers/agent-creation-chat.ts b/npm-app/src/cli-handlers/agent-creation-chat.ts index 9eccd69cf..ea8de4aaf 100644 --- a/npm-app/src/cli-handlers/agent-creation-chat.ts +++ b/npm-app/src/cli-handlers/agent-creation-chat.ts @@ -34,11 +34,10 @@ const AGENT_CREATION_STEPS = [ }, { question: - 'Which model should this agent use? (Press Enter for default: anthropic/claude-4-sonnet-20250522)', + 'Which model should this agent use? (Press Enter for default: anthropic/claude-4.5-sonnet)', field: 'model', - placeholder: - 'anthropic/claude-4-sonnet-20250522, gpt-4o, gemini-2.0-flash-exp', - defaultValue: 'anthropic/claude-4-sonnet-20250522', + placeholder: 'anthropic/claude-4.5-sonnet, gpt-4o, gemini-2.0-flash-exp', + defaultValue: 'anthropic/claude-4.5-sonnet', }, ] @@ -57,7 +56,7 @@ export function startAgentCreationChat( responses.purpose || 'A custom agent that helps with development tasks', specialty: responses.specialty || 'general development', - model: responses.model || 'anthropic/claude-4-sonnet-20250522', + model: responses.model || 'anthropic/claude-4.5-sonnet', } try { diff --git a/web/src/content/agents/agent-reference.mdx b/web/src/content/agents/agent-reference.mdx index 4501ab5e4..091e7bf7b 100644 --- a/web/src/content/agents/agent-reference.mdx +++ b/web/src/content/agents/agent-reference.mdx @@ -45,7 +45,7 @@ This field is key if the agent is intended to be spawned by other agents. The model to use, which can be any model string from [Openrouter](https://openrouter.ai/models). ```json -"model": "anthropic/claude-4-sonnet-20250522" +"model": "anthropic/claude-4.5-sonnet" ``` #### Reasoning Options (`reasoningOptions`, object, optional) @@ -335,7 +335,7 @@ const definition: AgentDefinition = { displayName: "Documentation Writer", spawnerPrompt: "Spawn this agent for creating comprehensive documentation, API docs, or user guides", - model: "anthropic/claude-4-sonnet-20250522", + model: "anthropic/claude-4.5-sonnet", outputMode: "last_message", includeMessageHistory: true, diff --git a/web/src/content/agents/creating-new-agents.mdx b/web/src/content/agents/creating-new-agents.mdx index b3236553a..008a71508 100644 --- a/web/src/content/agents/creating-new-agents.mdx +++ b/web/src/content/agents/creating-new-agents.mdx @@ -6,56 +6,60 @@ order: 2 --- # Creating New Agents + Create specialized agents from scratch using TypeScript files in the `.agents/` directory. **Types:** - - **LLM-based** - Use prompts and language models - - **Programmatic** - Use TypeScript generator functions with `handleSteps` +- **LLM-based** - Use prompts and language models +- **Programmatic** - Use TypeScript generator functions with `handleSteps` **Control Flow:** - - `yield 'STEP'` - Run one LLM generation step - - `yield 'STEP_ALL'` - Run until completion - - `return` - End the agent's turn +- `yield 'STEP'` - Run one LLM generation step +- `yield 'STEP_ALL'` - Run until completion +- `return` - End the agent's turn **Accessing Context:** - - `agentState` - Current agent state and message history - - `prompt` - User's prompt to the agent - - `params` - Additional parameters passed to the agent +- `agentState` - Current agent state and message history +- `prompt` - User's prompt to the agent +- `params` - Additional parameters passed to the agent ## Basic Structure Create a new TypeScript file in `.agents/` directory: **.agents/my-custom-agent.ts** + ```typescript import { AgentDefinition } from './types/agent-definition' const definition: AgentDefinition = { - id: "my-custom-agent", - version: "1.0.0", - - - displayName: "My Custom Agent", - spawnerPrompt: "Spawn this agent for specialized workflow tasks requiring custom logic", - model: "anthropic/claude-4-sonnet-20250522", - outputMode: "last_message", + id: 'my-custom-agent', + version: '1.0.0', + + displayName: 'My Custom Agent', + spawnerPrompt: + 'Spawn this agent for specialized workflow tasks requiring custom logic', + model: 'anthropic/claude-4.5-sonnet', + outputMode: 'last_message', includeMessageHistory: true, - toolNames: ["read_files", "write_file", "end_turn"], - spawnableAgents: ["codebuff/researcher@0.0.1"], // Use full name for built-in agents + toolNames: ['read_files', 'write_file', 'end_turn'], + spawnableAgents: ['codebuff/researcher@0.0.1'], // Use full name for built-in agents inputSchema: { prompt: { - type: "string", - description: "What documentation to create or update" - } + type: 'string', + description: 'What documentation to create or update', + }, }, systemPrompt: `You are a documentation specialist.`, - instructionsPrompt: "Create comprehensive documentation based on the user's request. Research existing code and patterns first.", - stepPrompt: "Continue working on the documentation. Use end_turn when complete." + instructionsPrompt: + "Create comprehensive documentation based on the user's request. Research existing code and patterns first.", + stepPrompt: + 'Continue working on the documentation. Use end_turn when complete.', } export default definition @@ -73,33 +77,43 @@ Specialized for documenting REST APIs and GraphQL schemas: import { AgentDefinition } from './types/agent-definition' const definition: AgentDefinition = { - id: "api-documenter", - version: "1.0.0", - - - displayName: "API Documentation Specialist", - spawnerPrompt: "Spawn this agent to create comprehensive API documentation with examples, schemas, and error codes", - model: "anthropic/claude-4-sonnet-20250522", - outputMode: "last_message", + id: 'api-documenter', + version: '1.0.0', + + displayName: 'API Documentation Specialist', + spawnerPrompt: + 'Spawn this agent to create comprehensive API documentation with examples, schemas, and error codes', + model: 'anthropic/claude-4.5-sonnet', + outputMode: 'last_message', includeMessageHistory: true, - toolNames: ["read_files", "code_search", "write_file", "spawn_agents", "end_turn"], - spawnableAgents: ["codebuff/researcher@0.0.1"], // Use full name for built-in agents + toolNames: [ + 'read_files', + 'code_search', + 'write_file', + 'spawn_agents', + 'end_turn', + ], + spawnableAgents: ['codebuff/researcher@0.0.1'], // Use full name for built-in agents inputSchema: { prompt: { - type: "string", - description: "What API endpoints or schemas to document" - } + type: 'string', + description: 'What API endpoints or schemas to document', + }, }, - systemPrompt: "You are an API documentation specialist. Create clear, comprehensive documentation for REST APIs and GraphQL schemas with examples, request/response formats, and error codes.", - instructionsPrompt: "Analyze the specified API endpoints and create detailed documentation including examples, parameters, and response schemas.", - stepPrompt: "Continue documenting the API. Include practical examples and edge cases. Use end_turn when complete." + systemPrompt: + 'You are an API documentation specialist. Create clear, comprehensive documentation for REST APIs and GraphQL schemas with examples, request/response formats, and error codes.', + instructionsPrompt: + 'Analyze the specified API endpoints and create detailed documentation including examples, parameters, and response schemas.', + stepPrompt: + 'Continue documenting the API. Include practical examples and edge cases. Use end_turn when complete.', } export default definition ``` + ### Database Migration Agent Specialized for creating and reviewing database migrations: @@ -110,28 +124,31 @@ Specialized for creating and reviewing database migrations: import { AgentDefinition } from './types/agent-definition' const definition: AgentDefinition = { - id: "migration-specialist", - version: "1.0.0", - - - displayName: "Database Migration Specialist", - spawnerPrompt: "Spawn this agent to create safe, reversible database migrations with proper indexing and rollback procedures", - model: "anthropic/claude-4-sonnet-20250522", - outputMode: "last_message", + id: 'migration-specialist', + version: '1.0.0', + + displayName: 'Database Migration Specialist', + spawnerPrompt: + 'Spawn this agent to create safe, reversible database migrations with proper indexing and rollback procedures', + model: 'anthropic/claude-4.5-sonnet', + outputMode: 'last_message', includeMessageHistory: true, toolNames: [ - "read_files", - "write_file", - "code_search", - "run_terminal_command", - "end_turn" + 'read_files', + 'write_file', + 'code_search', + 'run_terminal_command', + 'end_turn', ], - spawnableAgents: ["codebuff/reviewer@0.0.1"], - - systemPrompt: "You are a database migration specialist. Your goal is to create safe, reversible database migrations with proper indexing and rollback procedures.", - instructionsPrompt: "Create a database migration for the requested schema changes. Ensure it's reversible and includes proper indexing.", - stepPrompt: "Continue working on the migration. Test it if possible and spawn a reviewer to check for issues." + spawnableAgents: ['codebuff/reviewer@0.0.1'], + + systemPrompt: + 'You are a database migration specialist. Your goal is to create safe, reversible database migrations with proper indexing and rollback procedures.', + instructionsPrompt: + "Create a database migration for the requested schema changes. Ensure it's reversible and includes proper indexing.", + stepPrompt: + 'Continue working on the migration. Test it if possible and spawn a reviewer to check for issues.', } export default definition @@ -153,23 +170,24 @@ export default definition Use TypeScript generator functions with the `handleSteps` field to control execution: **.agents/code-analyzer.ts** + ```typescript import { AgentDefinition } from './types/agent-definition' const definition: AgentDefinition = { - id: "code-analyzer", - displayName: "Code Analysis Expert", - spawnerPrompt: "Spawn for deep code analysis and refactoring suggestions", - model: "anthropic/claude-4-sonnet-20250522", + id: 'code-analyzer', + displayName: 'Code Analysis Expert', + spawnerPrompt: 'Spawn for deep code analysis and refactoring suggestions', + model: 'anthropic/claude-4.5-sonnet', - toolNames: ["read_files", "code_search", "spawn_agents", "write_file"], - spawnableAgents: ["codebuff/thinker@0.0.1", "codebuff/reviewer@0.0.1"], + toolNames: ['read_files', 'code_search', 'spawn_agents', 'write_file'], + spawnableAgents: ['codebuff/thinker@0.0.1', 'codebuff/reviewer@0.0.1'], handleSteps: function* ({ agentState, prompt, params }) { // First, find relevant files const { toolResult: files } = yield { toolName: 'find_files', - input: { query: prompt } + input: { query: prompt }, } // Read the most important files @@ -177,7 +195,7 @@ const definition: AgentDefinition = { const filePaths = JSON.parse(files).slice(0, 5) yield { toolName: 'read_files', - input: { paths: filePaths } + input: { paths: filePaths }, } } @@ -185,16 +203,18 @@ const definition: AgentDefinition = { yield { toolName: 'spawn_agents', input: { - agents: [{ - agent_type: 'thinker', - prompt: `Analyze the code structure and suggest improvements for: ${prompt}` - }] - } + agents: [ + { + agent_type: 'thinker', + prompt: `Analyze the code structure and suggest improvements for: ${prompt}`, + }, + ], + }, } // Let the agent generate its response yield 'STEP_ALL' - } + }, } export default definition @@ -238,6 +258,7 @@ if (toolError) { #### 3. Control Flow Options **Control Flow:** + - `yield 'STEP'` - Run one LLM generation step - `yield 'STEP_ALL'` - Run until completion - `return` - End the agent's turn @@ -297,6 +318,7 @@ handleSteps: function* ({ agentState, prompt, params }) { ### When to Choose Programmatic vs LLM-based **Use Programmatic (`handleSteps`) when:** + - You need guaranteed execution order - Decisions depend on specific file contents - Complex multi-step workflows with branching @@ -304,6 +326,7 @@ handleSteps: function* ({ agentState, prompt, params }) { - Error recovery is critical **Use LLM-based (prompts only) when:** + - Task is straightforward - Agent needs creative freedom - Natural language understanding is key diff --git a/web/src/content/agents/customizing-agents.mdx b/web/src/content/agents/customizing-agents.mdx index df14af3aa..fcf093487 100644 --- a/web/src/content/agents/customizing-agents.mdx +++ b/web/src/content/agents/customizing-agents.mdx @@ -14,7 +14,7 @@ Create specialized agents from scratch using TypeScript files in the `.agents/` ├── my-custom-agent.ts ├── security-coordinator.ts └── types/ - └── agent-definition.ts +└── agent-definition.ts ``` ### Domain-Specific Customization @@ -34,9 +34,9 @@ const definition = { id: 'reviewer', // ... other fields ... reasoningOptions: { - enabled: true, // turn on reasoning if supported - exclude: false, // include reasoning traces when available - effort: 'medium', // low | medium | high + enabled: true, // turn on reasoning if supported + exclude: false, // include reasoning traces when available + effort: 'medium', // low | medium | high }, } ``` @@ -54,28 +54,36 @@ Create a specialized agent for security-focused workflows: import { AgentDefinition } from './types/agent-definition' const definition: AgentDefinition = { - id: "security-coordinator", - version: "1.0.0", - - displayName: "Security Coordinator", - spawnerPrompt: "Spawn this agent to coordinate security-focused development workflows and ensure secure coding practices", - model: "anthropic/claude-4-sonnet-20250522", - outputMode: "last_message", + id: 'security-coordinator', + version: '1.0.0', + + displayName: 'Security Coordinator', + spawnerPrompt: + 'Spawn this agent to coordinate security-focused development workflows and ensure secure coding practices', + model: 'anthropic/claude-4.5-sonnet', + outputMode: 'last_message', includeMessageHistory: true, - toolNames: ["read_files", "spawn_agents", "code_search", "end_turn"], - spawnableAgents: ["codebuff/reviewer@0.0.1", "codebuff/researcher@0.0.1", "codebuff/file-picker@0.0.1"], + toolNames: ['read_files', 'spawn_agents', 'code_search', 'end_turn'], + spawnableAgents: [ + 'codebuff/reviewer@0.0.1', + 'codebuff/researcher@0.0.1', + 'codebuff/file-picker@0.0.1', + ], inputSchema: { prompt: { - type: "string", - description: "Security analysis or coordination task" - } + type: 'string', + description: 'Security analysis or coordination task', + }, }, - systemPrompt: "You are a security coordinator responsible for ensuring secure development practices.", - instructionsPrompt: "Analyze the security implications of the request and coordinate appropriate security-focused agents.", - stepPrompt: "Continue analyzing security requirements and coordinating the workflow. Use end_turn when complete." + systemPrompt: + 'You are a security coordinator responsible for ensuring secure development practices.', + instructionsPrompt: + 'Analyze the security implications of the request and coordinate appropriate security-focused agents.', + stepPrompt: + 'Continue analyzing security requirements and coordinating the workflow. Use end_turn when complete.', } export default definition @@ -87,7 +95,7 @@ Make your agent even more powerful with programmatic control: ```typescript const definition: AgentDefinition = { - id: "security-coordinator", + id: 'security-coordinator', // ... other fields ... handleSteps: function* ({ prompt, params }) { @@ -96,8 +104,8 @@ const definition: AgentDefinition = { toolName: 'code_search', input: { pattern: '(eval|exec|dangerouslySetInnerHTML|process\.env)', - flags: '-i' - } + flags: '-i', + }, } // 2. If vulnerabilities found, spawn security reviewer @@ -105,21 +113,24 @@ const definition: AgentDefinition = { yield { toolName: 'spawn_agents', input: { - agents: [{ - agent_type: 'security-reviewer', - prompt: `Review these potential security issues: ${scanResults}` - }] - } + agents: [ + { + agent_type: 'security-reviewer', + prompt: `Review these potential security issues: ${scanResults}`, + }, + ], + }, } } // 3. Let the agent handle the rest yield 'STEP_ALL' - } + }, } ``` With `handleSteps`, your agent can: + - Make decisions based on actual code analysis - Orchestrate multiple tools in sequence - Handle errors gracefully @@ -128,31 +139,35 @@ With `handleSteps`, your agent can: ## Available Fields **Core:** - - `id` - - `displayName` - - `model` - - `version` - - `publisher` + +- `id` +- `displayName` +- `model` +- `version` +- `publisher` **Tools:** - - `toolNames` - - `spawnableAgents` + +- `toolNames` +- `spawnableAgents` **Prompts:** - - `spawnerPrompt` - - `systemPrompt` - - `instructionsPrompt` - - `stepPrompt` + +- `spawnerPrompt` +- `systemPrompt` +- `instructionsPrompt` +- `stepPrompt` **Input/Output:** - - `inputSchema` - - `outputMode` - - `outputSchema` - - `includeMessageHistory` + +- `inputSchema` +- `outputMode` +- `outputSchema` +- `includeMessageHistory` **Programmatic:** - - `handleSteps` +- `handleSteps` ## Troubleshooting diff --git a/web/src/content/agents/troubleshooting-agent-customization.mdx b/web/src/content/agents/troubleshooting-agent-customization.mdx index baa1b0a73..fb9a7554e 100644 --- a/web/src/content/agents/troubleshooting-agent-customization.mdx +++ b/web/src/content/agents/troubleshooting-agent-customization.mdx @@ -96,7 +96,7 @@ Error: Cannot resolve prompt file './my-prompt.md' "override": false, "displayName": "My Agent", "purpose": "Brief description of the agent's purpose", - "model": "anthropic/claude-4-sonnet-20250522", + "model": "anthropic/claude-4.5-sonnet", "systemPrompt": "You are a helpful assistant...", "instructionsPrompt": "Process the user's request...", "stepPrompt": "Continue working on the task..." @@ -251,7 +251,7 @@ Begin with minimal overrides and add complexity gradually: { "id": "CodebuffAI/reviewer", "override": true, - "model": "anthropic/claude-4-sonnet-20250522" + "model": "anthropic/claude-4.5-sonnet" } ``` diff --git a/web/src/content/walkthroughs/creating-your-first-agent.mdx b/web/src/content/walkthroughs/creating-your-first-agent.mdx index d3f50dec7..c312a782f 100644 --- a/web/src/content/walkthroughs/creating-your-first-agent.mdx +++ b/web/src/content/walkthroughs/creating-your-first-agent.mdx @@ -78,7 +78,7 @@ import type { AgentDefinition } from './types/agent-definition' const definition: AgentDefinition = { id: 'simple-code-reviewer', displayName: 'Simple Code Reviewer', - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', // Tools this agent can use toolNames: [ @@ -169,7 +169,7 @@ const definition: AgentDefinition = { id: 'simple-code-reviewer', displayName: 'Simple Code Reviewer', publisher: 'your-publisher-id', // ← Add this line - model: 'anthropic/claude-4-sonnet-20250522', + model: 'anthropic/claude-4.5-sonnet', // ... rest of your definition } ```