summaryrefslogtreecommitdiff
path: root/admin-panel/src/server/agents/planner.ts
diff options
context:
space:
mode:
Diffstat (limited to 'admin-panel/src/server/agents/planner.ts')
-rw-r--r--admin-panel/src/server/agents/planner.ts45
1 files changed, 45 insertions, 0 deletions
diff --git a/admin-panel/src/server/agents/planner.ts b/admin-panel/src/server/agents/planner.ts
new file mode 100644
index 0000000..eb004f9
--- /dev/null
+++ b/admin-panel/src/server/agents/planner.ts
@@ -0,0 +1,45 @@
+import { BaseAgent, type AgentContext, type AgentResult } from './base-agent.js';
+import type { ClaudeResponse } from '../services/claude.service.js';
+
+export class PlannerAgent extends BaseAgent {
+ name = 'planner';
+ templateFile = 'planner.md';
+ model = 'claude-opus-4-20250514';
+
+ protected getSystemPrompt(): string {
+ return 'You are a meticulous software architect who creates clear, actionable implementation plans. Be thorough but concise. Focus on practical steps, not theory.';
+ }
+
+ protected getMaxTokens(): number {
+ return 16384;
+ }
+
+ protected parseResponse(response: ClaudeResponse, _ctx: AgentContext): AgentResult {
+ const content = response.content;
+
+ // Extract sections
+ const plan = content;
+ const doneWhen = extractSection(content, 'Done When') || '';
+ const decisionLog = extractSection(content, 'Decisions') || '';
+
+ return {
+ success: true,
+ content,
+ tokensUsed: response.tokensUsed,
+ model: response.model,
+ updates: {
+ plan,
+ done_when: doneWhen,
+ decision_log: decisionLog,
+ status: 'plan_review',
+ },
+ message: 'Generated implementation plan',
+ };
+ }
+}
+
+function extractSection(text: string, heading: string): string | null {
+ const regex = new RegExp(`###\\s*${heading}\\s*\\n([\\s\\S]*?)(?=###|$)`, 'i');
+ const match = text.match(regex);
+ return match ? match[1].trim() : null;
+}