diff --git a/packages/agent/agent-platform/dist/sub-agents/index.d.ts b/packages/agent/agent-platform/dist/sub-agents/index.d.ts index 16407a90b..131aee81f 100644 --- a/packages/agent/agent-platform/dist/sub-agents/index.d.ts +++ b/packages/agent/agent-platform/dist/sub-agents/index.d.ts @@ -1,6 +1,7 @@ export * from './interfaces.js'; export * from './errors.js'; export * from './sub-agent.js'; +export * from './extended-agents.js'; export * from './sub-agent-factory.js'; export * from './agent-pool.js'; export * from './task-splitter.js'; diff --git a/packages/agent/agent-platform/dist/sub-agents/index.d.ts.map b/packages/agent/agent-platform/dist/sub-agents/index.d.ts.map index bbac9df62..969011c94 100644 --- a/packages/agent/agent-platform/dist/sub-agents/index.d.ts.map +++ b/packages/agent/agent-platform/dist/sub-agents/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sub-agents/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sub-agents/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"} \ No newline at end of file diff --git a/packages/agent/agent-platform/dist/sub-agents/index.js b/packages/agent/agent-platform/dist/sub-agents/index.js index 9920845db..56d4c5705 100644 --- a/packages/agent/agent-platform/dist/sub-agents/index.js +++ b/packages/agent/agent-platform/dist/sub-agents/index.js @@ -1,6 +1,7 @@ export * from './interfaces.js'; export * from './errors.js'; export * from './sub-agent.js'; +export * from './extended-agents.js'; export * from './sub-agent-factory.js'; export * from './agent-pool.js'; export * from './task-splitter.js'; diff --git a/packages/agent/agent-platform/dist/sub-agents/index.js.map b/packages/agent/agent-platform/dist/sub-agents/index.js.map index c14619344..6e4213b0e 100644 --- a/packages/agent/agent-platform/dist/sub-agents/index.js.map +++ b/packages/agent/agent-platform/dist/sub-agents/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sub-agents/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sub-agents/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"} \ No newline at end of file diff --git a/packages/agent/agent-platform/dist/sub-agents/sub-agent-factory.js b/packages/agent/agent-platform/dist/sub-agents/sub-agent-factory.js index fa77f7638..f9143a2c8 100644 --- a/packages/agent/agent-platform/dist/sub-agents/sub-agent-factory.js +++ b/packages/agent/agent-platform/dist/sub-agents/sub-agent-factory.js @@ -1,5 +1,5 @@ -import { CoderAgent, ReviewerAgent, TesterAgent, SecurityAgent } from './sub-agent.js'; -import { PlannerAgent, ArchitectAgent, DocumentationAgent, QAAgent } from './extended-agents.js'; +import { PlannerAgent, ArchitectAgent, CoderAgent, ReviewerAgent, TesterAgent, SecurityAgent } from './sub-agent.js'; +import { DocumentationAgent, QAAgent } from './extended-agents.js'; export class SubAgentFactory { createAgent(role) { const id = `${role}-${Math.random().toString(36).substring(2, 9)}`; diff --git a/packages/agent/agent-platform/dist/sub-agents/sub-agent-factory.js.map b/packages/agent/agent-platform/dist/sub-agents/sub-agent-factory.js.map index b85f6c1f1..ebdb03e57 100644 --- a/packages/agent/agent-platform/dist/sub-agents/sub-agent-factory.js.map +++ b/packages/agent/agent-platform/dist/sub-agents/sub-agent-factory.js.map @@ -1 +1 @@ -{"version":3,"file":"sub-agent-factory.js","sourceRoot":"","sources":["../../src/sub-agents/sub-agent-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEjG,MAAM,OAAO,eAAe;IACnB,WAAW,CAAC,IAAe;QAChC,MAAM,EAAE,GAAG,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACnE,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,SAAS;gBACZ,OAAO,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;YAC9B,KAAK,WAAW;gBACd,OAAO,IAAI,cAAc,CAAC,EAAE,CAAC,CAAC;YAChC,KAAK,OAAO;gBACV,OAAO,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;YAC5B,KAAK,UAAU;gBACb,OAAO,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC;YAC/B,KAAK,QAAQ;gBACX,OAAO,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;YAC7B,KAAK,UAAU;gBACb,OAAO,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC;YAC/B,KAAK,eAAe;gBAClB,OAAO,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAC;YACpC,KAAK,IAAI;gBACP,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC,CAAC;YACzB;gBACE,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;CACF"} \ No newline at end of file +{"version":3,"file":"sub-agent-factory.js","sourceRoot":"","sources":["../../src/sub-agents/sub-agent-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACrH,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEnE,MAAM,OAAO,eAAe;IACnB,WAAW,CAAC,IAAe;QAChC,MAAM,EAAE,GAAG,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACnE,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,SAAS;gBACZ,OAAO,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;YAC9B,KAAK,WAAW;gBACd,OAAO,IAAI,cAAc,CAAC,EAAE,CAAC,CAAC;YAChC,KAAK,OAAO;gBACV,OAAO,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;YAC5B,KAAK,UAAU;gBACb,OAAO,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC;YAC/B,KAAK,QAAQ;gBACX,OAAO,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;YAC7B,KAAK,UAAU;gBACb,OAAO,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC;YAC/B,KAAK,eAAe;gBAClB,OAAO,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAC;YACpC,KAAK,IAAI;gBACP,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC,CAAC;YACzB;gBACE,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;CACF"} \ No newline at end of file diff --git a/packages/agent/agent-platform/src/sub-agents/extended-agents.ts b/packages/agent/agent-platform/src/sub-agents/extended-agents.ts index 6fcf6f56a..efd9ee13b 100644 --- a/packages/agent/agent-platform/src/sub-agents/extended-agents.ts +++ b/packages/agent/agent-platform/src/sub-agents/extended-agents.ts @@ -10,29 +10,148 @@ * main index to keep the core roster clean. */ -import { BaseSubAgent } from './sub-agent.js'; -import type { AgentConfig } from './interfaces.js'; +import type { TaskModel } from '@agentx/core-runtime'; +import type { CompletionRequest, CompletionResponse } from '@agentx/provider-sdk'; +import { ProviderRegistry } from '@agentx/provider-sdk'; +import type { AgentRole, AgentConfig } from './interfaces.js'; -export class PlannerAgent extends BaseSubAgent { - constructor(id: string, config?: AgentConfig) { - super(id, 'planner', config); +export abstract class BaseExtendedAgent { + public readonly id: string; + public readonly role: AgentRole; + protected readonly providerId?: string; + protected readonly promptTemplate?: string; + protected readonly providerRegistry: ProviderRegistry; + + constructor( + id: string, + role: AgentRole, + config?: AgentConfig, + providerRegistry?: ProviderRegistry, + ) { + this.id = id; + this.role = role; + this.providerId = config?.providerId; + this.promptTemplate = config?.promptTemplate; + this.providerRegistry = providerRegistry || new ProviderRegistry(); } -} -export class ArchitectAgent extends BaseSubAgent { - constructor(id: string, config?: AgentConfig) { - super(id, 'architect', config); + protected async callLLM( + prompt: string, + systemPrompt?: string, + modelId?: string, + ): Promise { + const providers = this.providerRegistry.list(); + const provider = providers[0]; + if (!provider) { + throw new Error('No provider configured'); + } + + const request: CompletionRequest = { + systemPrompt: systemPrompt || '', + userPrompt: prompt, + modelId: modelId || 'claude-sonnet-4-20250514', + }; + + return this.providerRegistry.complete(provider.id, request); } + + public abstract execute(task: TaskModel, _context: unknown): Promise; } -export class DocumentationAgent extends BaseSubAgent { - constructor(id: string, config?: AgentConfig) { - super(id, 'documentation', config); +export class DocumentationAgent extends BaseExtendedAgent { + constructor(id: string, config?: AgentConfig, providerRegistry?: ProviderRegistry) { + super(id, 'documentation', config, providerRegistry); + } + + public async execute(task: TaskModel, _context: unknown): Promise { + const prompt = `You are an expert technical writer and documentation engineer. Create comprehensive documentation for: + +Goal: ${task.goal} + +Provide: +1. Clear, concise documentation with proper structure +2. API reference documentation (if applicable) +3. Usage examples and code snippets +4. Installation and setup instructions +5. Troubleshooting guide +6. FAQ section + +Follow best practices for technical writing: +- Use active voice +- Write for the target audience +- Include diagrams where helpful (text-based) +- Ensure consistency in terminology`; + + try { + const response = await this.callLLM(prompt); + return { + agentId: this.id, + role: this.role, + taskId: task.id, + providerId: this.providerId, + status: 'success', + output: response.text, + usage: response.usage, + toolCalls: response.toolCalls, + }; + } catch (error) { + return { + agentId: this.id, + role: this.role, + taskId: task.id, + status: 'failure', + error: error instanceof Error ? error.message : String(error), + }; + } } } -export class QAAgent extends BaseSubAgent { - constructor(id: string, config?: AgentConfig) { - super(id, 'qa', config); +export class QAAgent extends BaseExtendedAgent { + constructor(id: string, config?: AgentConfig, providerRegistry?: ProviderRegistry) { + super(id, 'qa', config, providerRegistry); + } + + public async execute(task: TaskModel, _context: unknown): Promise { + const prompt = `You are an expert quality assurance engineer. Perform comprehensive QA analysis for: + +Goal: ${task.goal} + +Provide: +1. Test plan with test scenarios +2. Functional testing checklist +3. Non-functional testing requirements (performance, security, usability) +4. Edge cases and boundary conditions +5. Regression testing strategy +6. Acceptance criteria validation +7. Defect reports with severity ratings + +QA Best Practices: +- Test from user perspective +- Consider all user roles and permissions +- Validate against requirements +- Document reproducible steps for any issues +- Prioritize findings by impact`; + + try { + const response = await this.callLLM(prompt); + return { + agentId: this.id, + role: this.role, + taskId: task.id, + providerId: this.providerId, + status: 'success', + output: response.text, + usage: response.usage, + toolCalls: response.toolCalls, + }; + } catch (error) { + return { + agentId: this.id, + role: this.role, + taskId: task.id, + status: 'failure', + error: error instanceof Error ? error.message : String(error), + }; + } } } diff --git a/packages/agent/agent-platform/src/sub-agents/index.ts b/packages/agent/agent-platform/src/sub-agents/index.ts index 219a03031..76ab20e49 100644 --- a/packages/agent/agent-platform/src/sub-agents/index.ts +++ b/packages/agent/agent-platform/src/sub-agents/index.ts @@ -1,6 +1,7 @@ export * from './interfaces.js'; export * from './errors.js'; export * from './sub-agent.js'; +export * from './extended-agents.js'; export * from './sub-agent-factory.js'; export * from './agent-pool.js'; export * from './task-splitter.js'; diff --git a/packages/agent/agent-platform/src/sub-agents/sub-agent-factory.ts b/packages/agent/agent-platform/src/sub-agents/sub-agent-factory.ts index 42e0c0cd9..884396438 100644 --- a/packages/agent/agent-platform/src/sub-agents/sub-agent-factory.ts +++ b/packages/agent/agent-platform/src/sub-agents/sub-agent-factory.ts @@ -1,6 +1,13 @@ import type { AgentRole, SubAgent } from './interfaces.js'; -import { CoderAgent, ReviewerAgent, TesterAgent, SecurityAgent } from './sub-agent.js'; -import { PlannerAgent, ArchitectAgent, DocumentationAgent, QAAgent } from './extended-agents.js'; +import { + PlannerAgent, + ArchitectAgent, + CoderAgent, + ReviewerAgent, + TesterAgent, + SecurityAgent, +} from './sub-agent.js'; +import { DocumentationAgent, QAAgent } from './extended-agents.js'; export class SubAgentFactory { public createAgent(role: AgentRole): SubAgent {