@posthog/agent 1.10.0 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -65
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/src/adapters/types.d.ts +1 -1
- package/dist/src/agent.d.ts +5 -13
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +300 -187
- package/dist/src/agent.js.map +1 -1
- package/dist/src/agents/execution.d.ts +1 -1
- package/dist/src/agents/execution.js +2 -2
- package/dist/src/agents/execution.js.map +1 -1
- package/dist/src/agents/research.d.ts +2 -0
- package/dist/src/agents/research.d.ts.map +1 -0
- package/dist/src/agents/research.js +105 -0
- package/dist/src/agents/research.js.map +1 -0
- package/dist/src/file-manager.d.ts +19 -0
- package/dist/src/file-manager.d.ts.map +1 -1
- package/dist/src/file-manager.js +39 -0
- package/dist/src/file-manager.js.map +1 -1
- package/dist/src/git-manager.d.ts +4 -0
- package/dist/src/git-manager.d.ts.map +1 -1
- package/dist/src/git-manager.js +42 -1
- package/dist/src/git-manager.js.map +1 -1
- package/dist/src/posthog-api.d.ts +0 -8
- package/dist/src/posthog-api.d.ts.map +1 -1
- package/dist/src/posthog-api.js +0 -32
- package/dist/src/posthog-api.js.map +1 -1
- package/dist/src/prompt-builder.d.ts +1 -0
- package/dist/src/prompt-builder.d.ts.map +1 -1
- package/dist/src/prompt-builder.js +40 -0
- package/dist/src/prompt-builder.js.map +1 -1
- package/dist/src/structured-extraction.d.ts +22 -0
- package/dist/src/structured-extraction.d.ts.map +1 -0
- package/dist/src/structured-extraction.js +136 -0
- package/dist/src/structured-extraction.js.map +1 -0
- package/dist/src/task-progress-reporter.d.ts +0 -6
- package/dist/src/task-progress-reporter.d.ts.map +1 -1
- package/dist/src/task-progress-reporter.js +2 -26
- package/dist/src/task-progress-reporter.js.map +1 -1
- package/dist/src/template-manager.d.ts.map +1 -1
- package/dist/src/template-manager.js +26 -4
- package/dist/src/template-manager.js.map +1 -1
- package/dist/src/types.d.ts +7 -4
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +0 -1
- package/dist/src/types.js.map +1 -1
- package/package.json +5 -5
- package/src/adapters/types.ts +1 -1
- package/src/agent.ts +326 -195
- package/src/agents/execution.ts +2 -2
- package/src/agents/research.ts +103 -0
- package/src/file-manager.ts +64 -0
- package/src/git-manager.ts +53 -1
- package/src/posthog-api.ts +0 -40
- package/src/prompt-builder.ts +53 -0
- package/src/structured-extraction.ts +167 -0
- package/src/task-progress-reporter.ts +2 -34
- package/src/template-manager.ts +35 -5
- package/src/types.ts +8 -7
- package/dist/src/agent-registry.d.ts +0 -16
- package/dist/src/agent-registry.d.ts.map +0 -1
- package/dist/src/agent-registry.js +0 -56
- package/dist/src/agent-registry.js.map +0 -1
- package/dist/src/stage-executor.d.ts +0 -19
- package/dist/src/stage-executor.d.ts.map +0 -1
- package/dist/src/stage-executor.js +0 -135
- package/dist/src/stage-executor.js.map +0 -1
- package/dist/src/workflow-registry.d.ts +0 -11
- package/dist/src/workflow-registry.d.ts.map +0 -1
- package/dist/src/workflow-registry.js +0 -27
- package/dist/src/workflow-registry.js.map +0 -1
- package/dist/src/workflow-types.d.ts +0 -45
- package/dist/src/workflow-types.d.ts.map +0 -1
- package/src/agent-registry.ts +0 -59
- package/src/stage-executor.ts +0 -160
- package/src/workflow-registry.ts +0 -30
- package/src/workflow-types.ts +0 -52
package/src/types.ts
CHANGED
|
@@ -5,7 +5,6 @@ export interface Task {
|
|
|
5
5
|
description: string;
|
|
6
6
|
origin_product: 'error_tracking' | 'eval_clusters' | 'user_created' | 'support_queue' | 'session_summaries';
|
|
7
7
|
position?: number;
|
|
8
|
-
workflow?: string | null;
|
|
9
8
|
github_integration?: number | null;
|
|
10
9
|
repository_config?: unknown; // JSONField
|
|
11
10
|
repository_list: string;
|
|
@@ -34,7 +33,6 @@ export interface TaskRun {
|
|
|
34
33
|
task: string; // Task ID
|
|
35
34
|
team: number;
|
|
36
35
|
branch: string | null;
|
|
37
|
-
current_stage: string | null; // WorkflowStage ID
|
|
38
36
|
status: 'started' | 'in_progress' | 'completed' | 'failed';
|
|
39
37
|
log: LogEntry[]; // Array of log entry objects
|
|
40
38
|
error_message: string | null;
|
|
@@ -52,8 +50,6 @@ export interface SupportingFile {
|
|
|
52
50
|
created_at: string;
|
|
53
51
|
}
|
|
54
52
|
|
|
55
|
-
// Removed legacy ExecutionMode in favor of configurable workflows
|
|
56
|
-
|
|
57
53
|
export enum PermissionMode {
|
|
58
54
|
PLAN = "plan",
|
|
59
55
|
DEFAULT = "default",
|
|
@@ -66,6 +62,14 @@ export interface ExecutionOptions {
|
|
|
66
62
|
permissionMode?: PermissionMode;
|
|
67
63
|
}
|
|
68
64
|
|
|
65
|
+
export interface TaskExecutionOptions {
|
|
66
|
+
repositoryPath?: string;
|
|
67
|
+
permissionMode?: PermissionMode;
|
|
68
|
+
isCloudMode?: boolean; // Determines local vs cloud behavior (local pauses after each phase)
|
|
69
|
+
autoProgress?: boolean;
|
|
70
|
+
queryOverrides?: Record<string, any>;
|
|
71
|
+
}
|
|
72
|
+
|
|
69
73
|
// Base event with timestamp
|
|
70
74
|
interface BaseEvent {
|
|
71
75
|
ts: number;
|
|
@@ -147,11 +151,9 @@ export interface StatusEvent extends BaseEvent {
|
|
|
147
151
|
type: 'status';
|
|
148
152
|
phase: string;
|
|
149
153
|
// Common optional fields (varies by phase):
|
|
150
|
-
stage?: string; // Workflow stage (plan, code, complete)
|
|
151
154
|
kind?: string; // Kind of status (plan, implementation)
|
|
152
155
|
branch?: string; // Git branch name
|
|
153
156
|
prUrl?: string; // Pull request URL
|
|
154
|
-
workflowId?: string; // Workflow identifier
|
|
155
157
|
taskId?: string; // Task identifier
|
|
156
158
|
messageId?: string; // Claude message ID
|
|
157
159
|
model?: string; // Model name
|
|
@@ -263,7 +265,6 @@ export interface TaskExecutionResult {
|
|
|
263
265
|
task: Task;
|
|
264
266
|
plan?: string;
|
|
265
267
|
executionResult?: ExecutionResult;
|
|
266
|
-
// Deprecated: mode removed in workflow-based execution
|
|
267
268
|
}
|
|
268
269
|
|
|
269
270
|
// MCP Server configuration types (re-exported from Claude SDK for convenience)
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { AgentDefinition, AgentType } from './workflow-types.js';
|
|
2
|
-
export declare class AgentRegistry {
|
|
3
|
-
private agentsByName;
|
|
4
|
-
constructor(definitions?: AgentDefinition[]);
|
|
5
|
-
static getDefaultAgents(): AgentDefinition[];
|
|
6
|
-
register(def: AgentDefinition): void;
|
|
7
|
-
getAgent(name: string): AgentDefinition | undefined;
|
|
8
|
-
listAgents(): AgentDefinition[];
|
|
9
|
-
exportForPostHog(): {
|
|
10
|
-
id: string;
|
|
11
|
-
name: string;
|
|
12
|
-
agent_type: AgentType;
|
|
13
|
-
description?: string;
|
|
14
|
-
}[];
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=agent-registry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-registry.d.ts","sourceRoot":"","sources":["../../src/agent-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEtE,qBAAa,aAAa;IACxB,OAAO,CAAC,YAAY,CAA2C;gBAEnD,WAAW,CAAC,EAAE,eAAe,EAAE;IAQ3C,MAAM,CAAC,gBAAgB,IAAI,eAAe,EAAE;IA6B5C,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAIpC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAInD,UAAU,IAAI,eAAe,EAAE;IAI/B,gBAAgB,IAAI;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,SAAS,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE;CAGhG"}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
class AgentRegistry {
|
|
2
|
-
agentsByName = new Map();
|
|
3
|
-
constructor(definitions) {
|
|
4
|
-
if (definitions) {
|
|
5
|
-
for (const def of definitions)
|
|
6
|
-
this.register(def);
|
|
7
|
-
}
|
|
8
|
-
else {
|
|
9
|
-
for (const def of AgentRegistry.getDefaultAgents())
|
|
10
|
-
this.register(def);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
static getDefaultAgents() {
|
|
14
|
-
return [
|
|
15
|
-
{
|
|
16
|
-
id: 'planning',
|
|
17
|
-
name: 'planning',
|
|
18
|
-
agent_type: 'planning',
|
|
19
|
-
description: 'Analyze repo and produce implementation plan',
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
id: 'code_generation',
|
|
23
|
-
name: 'code_generation',
|
|
24
|
-
agent_type: 'execution',
|
|
25
|
-
description: 'Implements code changes using Claude SDK',
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
id: 'review',
|
|
29
|
-
name: 'review',
|
|
30
|
-
agent_type: 'review',
|
|
31
|
-
description: 'Reviews changes and suggests fixes',
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
id: 'testing',
|
|
35
|
-
name: 'testing',
|
|
36
|
-
agent_type: 'testing',
|
|
37
|
-
description: 'Runs tests and reports results',
|
|
38
|
-
},
|
|
39
|
-
];
|
|
40
|
-
}
|
|
41
|
-
register(def) {
|
|
42
|
-
this.agentsByName.set(def.name, def);
|
|
43
|
-
}
|
|
44
|
-
getAgent(name) {
|
|
45
|
-
return this.agentsByName.get(name);
|
|
46
|
-
}
|
|
47
|
-
listAgents() {
|
|
48
|
-
return Array.from(this.agentsByName.values());
|
|
49
|
-
}
|
|
50
|
-
exportForPostHog() {
|
|
51
|
-
return this.listAgents().map(({ id, name, agent_type, description }) => ({ id, name, agent_type, description }));
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export { AgentRegistry };
|
|
56
|
-
//# sourceMappingURL=agent-registry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-registry.js","sources":["../../src/agent-registry.ts"],"sourcesContent":["import type { AgentDefinition, AgentType } from './workflow-types.js';\n\nexport class AgentRegistry {\n private agentsByName: Map<string, AgentDefinition> = new Map();\n\n constructor(definitions?: AgentDefinition[]) {\n if (definitions) {\n for (const def of definitions) this.register(def);\n } else {\n for (const def of AgentRegistry.getDefaultAgents()) this.register(def);\n }\n }\n\n static getDefaultAgents(): AgentDefinition[] {\n return [\n {\n id: 'planning',\n name: 'planning',\n agent_type: 'planning',\n description: 'Analyze repo and produce implementation plan',\n },\n {\n id: 'code_generation',\n name: 'code_generation',\n agent_type: 'execution',\n description: 'Implements code changes using Claude SDK',\n },\n {\n id: 'review',\n name: 'review',\n agent_type: 'review',\n description: 'Reviews changes and suggests fixes',\n },\n {\n id: 'testing',\n name: 'testing',\n agent_type: 'testing',\n description: 'Runs tests and reports results',\n },\n ];\n }\n\n register(def: AgentDefinition): void {\n this.agentsByName.set(def.name, def);\n }\n\n getAgent(name: string): AgentDefinition | undefined {\n return this.agentsByName.get(name);\n }\n\n listAgents(): AgentDefinition[] {\n return Array.from(this.agentsByName.values());\n }\n\n exportForPostHog(): { id: string; name: string; agent_type: AgentType; description?: string }[] {\n return this.listAgents().map(({ id, name, agent_type, description }) => ({ id, name, agent_type, description }));\n }\n}\n\n"],"names":[],"mappings":"MAEa,aAAa,CAAA;AAChB,IAAA,YAAY,GAAiC,IAAI,GAAG,EAAE;AAE9D,IAAA,WAAA,CAAY,WAA+B,EAAA;QACzC,IAAI,WAAW,EAAE;YACf,KAAK,MAAM,GAAG,IAAI,WAAW;AAAE,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QACnD;aAAO;AACL,YAAA,KAAK,MAAM,GAAG,IAAI,aAAa,CAAC,gBAAgB,EAAE;AAAE,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QACxE;IACF;AAEA,IAAA,OAAO,gBAAgB,GAAA;QACrB,OAAO;AACL,YAAA;AACE,gBAAA,EAAE,EAAE,UAAU;AACd,gBAAA,IAAI,EAAE,UAAU;AAChB,gBAAA,UAAU,EAAE,UAAU;AACtB,gBAAA,WAAW,EAAE,8CAA8C;AAC5D,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,iBAAiB;AACrB,gBAAA,IAAI,EAAE,iBAAiB;AACvB,gBAAA,UAAU,EAAE,WAAW;AACvB,gBAAA,WAAW,EAAE,0CAA0C;AACxD,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,QAAQ;AACZ,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,UAAU,EAAE,QAAQ;AACpB,gBAAA,WAAW,EAAE,oCAAoC;AAClD,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,SAAS;AACb,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,UAAU,EAAE,SAAS;AACrB,gBAAA,WAAW,EAAE,gCAAgC;AAC9C,aAAA;SACF;IACH;AAEA,IAAA,QAAQ,CAAC,GAAoB,EAAA;QAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;IACtC;AAEA,IAAA,QAAQ,CAAC,IAAY,EAAA;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IACpC;IAEA,UAAU,GAAA;QACR,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;IAC/C;IAEA,gBAAgB,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;IAClH;AACD;;;;"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Logger } from './utils/logger.js';
|
|
2
|
-
import { AgentRegistry } from './agent-registry.js';
|
|
3
|
-
import type { AgentEvent, Task, McpServerConfig } from './types.js';
|
|
4
|
-
import type { WorkflowStage, WorkflowStageExecutionResult, WorkflowExecutionOptions } from './workflow-types.js';
|
|
5
|
-
import { PromptBuilder } from './prompt-builder.js';
|
|
6
|
-
export declare class StageExecutor {
|
|
7
|
-
private registry;
|
|
8
|
-
private logger;
|
|
9
|
-
private adapter;
|
|
10
|
-
private promptBuilder;
|
|
11
|
-
private eventHandler?;
|
|
12
|
-
private mcpServers?;
|
|
13
|
-
constructor(registry: AgentRegistry, logger: Logger, promptBuilder?: PromptBuilder, eventHandler?: (event: AgentEvent) => void, mcpServers?: Record<string, McpServerConfig>);
|
|
14
|
-
setEventHandler(handler?: (event: AgentEvent) => void): void;
|
|
15
|
-
execute(task: Task, stage: WorkflowStage, options: WorkflowExecutionOptions): Promise<WorkflowStageExecutionResult>;
|
|
16
|
-
private runPlanning;
|
|
17
|
-
private runExecution;
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=stage-executor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stage-executor.d.ts","sourceRoot":"","sources":["../../src/stage-executor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAGjH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,YAAY,CAAC,CAA8B;IACnD,OAAO,CAAC,UAAU,CAAC,CAAkC;gBAGnD,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,aAAa,EAC7B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EAC1C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAc9C,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;IAItD,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,4BAA4B,CAAC;YA+B3G,WAAW;YA+CX,YAAY;CAwC3B"}
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
2
|
-
import './utils/logger.js';
|
|
3
|
-
import { ClaudeAdapter } from './adapters/claude/claude-adapter.js';
|
|
4
|
-
import { PLANNING_SYSTEM_PROMPT } from './agents/planning.js';
|
|
5
|
-
import { EXECUTION_SYSTEM_PROMPT } from './agents/execution.js';
|
|
6
|
-
import { PromptBuilder } from './prompt-builder.js';
|
|
7
|
-
|
|
8
|
-
class StageExecutor {
|
|
9
|
-
registry;
|
|
10
|
-
logger;
|
|
11
|
-
adapter;
|
|
12
|
-
promptBuilder;
|
|
13
|
-
eventHandler;
|
|
14
|
-
mcpServers;
|
|
15
|
-
constructor(registry, logger, promptBuilder, eventHandler, mcpServers) {
|
|
16
|
-
this.registry = registry;
|
|
17
|
-
this.logger = logger.child('StageExecutor');
|
|
18
|
-
this.adapter = new ClaudeAdapter();
|
|
19
|
-
this.promptBuilder = promptBuilder || new PromptBuilder({
|
|
20
|
-
getTaskFiles: async () => [],
|
|
21
|
-
generatePlanTemplate: async () => '',
|
|
22
|
-
logger,
|
|
23
|
-
});
|
|
24
|
-
this.eventHandler = eventHandler;
|
|
25
|
-
this.mcpServers = mcpServers;
|
|
26
|
-
}
|
|
27
|
-
setEventHandler(handler) {
|
|
28
|
-
this.eventHandler = handler;
|
|
29
|
-
}
|
|
30
|
-
async execute(task, stage, options) {
|
|
31
|
-
const isManual = stage.is_manual_only === true;
|
|
32
|
-
if (isManual) {
|
|
33
|
-
this.logger.info('Manual stage detected; skipping agent execution', { stage: stage.key });
|
|
34
|
-
return { results: [] };
|
|
35
|
-
}
|
|
36
|
-
const inferredAgent = stage.key.toLowerCase().includes('plan') ? 'planning_basic' : 'code_generation';
|
|
37
|
-
const agentName = stage.agent_name || inferredAgent;
|
|
38
|
-
const agent = this.registry.getAgent(agentName);
|
|
39
|
-
if (!agent) {
|
|
40
|
-
throw new Error(`Unknown agent '${agentName}' for stage '${stage.key}'`);
|
|
41
|
-
}
|
|
42
|
-
const permissionMode = options.permissionMode || 'acceptEdits';
|
|
43
|
-
const cwd = options.repositoryPath || process.cwd();
|
|
44
|
-
switch (agent.agent_type) {
|
|
45
|
-
case 'planning':
|
|
46
|
-
return this.runPlanning(task, cwd, options, stage.key);
|
|
47
|
-
case 'execution':
|
|
48
|
-
return this.runExecution(task, cwd, permissionMode, options, stage.key);
|
|
49
|
-
case 'review': // TODO: Implement review
|
|
50
|
-
case 'testing': // TODO: Implement testing
|
|
51
|
-
default:
|
|
52
|
-
// throw new Error(`Unsupported agent type: ${agent.agent_type}`);
|
|
53
|
-
console.warn(`Unsupported agent type: ${agent.agent_type}`);
|
|
54
|
-
return { results: [] };
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
async runPlanning(task, cwd, options, stageKey) {
|
|
58
|
-
const contextPrompt = await this.promptBuilder.buildPlanningPrompt(task, cwd);
|
|
59
|
-
let prompt = PLANNING_SYSTEM_PROMPT + '\n\n' + contextPrompt;
|
|
60
|
-
const stageOverrides = options.stageOverrides?.[stageKey] || options.stageOverrides?.['plan'];
|
|
61
|
-
const mergedOverrides = {
|
|
62
|
-
...(options.queryOverrides || {}),
|
|
63
|
-
...(stageOverrides?.queryOverrides || {}),
|
|
64
|
-
};
|
|
65
|
-
const baseOptions = {
|
|
66
|
-
model: 'claude-sonnet-4-5-20250929',
|
|
67
|
-
cwd,
|
|
68
|
-
permissionMode: 'plan',
|
|
69
|
-
settingSources: ['local'],
|
|
70
|
-
mcpServers: this.mcpServers
|
|
71
|
-
};
|
|
72
|
-
const response = query({
|
|
73
|
-
prompt,
|
|
74
|
-
options: { ...baseOptions, ...mergedOverrides },
|
|
75
|
-
});
|
|
76
|
-
let plan = '';
|
|
77
|
-
for await (const message of response) {
|
|
78
|
-
// Emit raw SDK event first
|
|
79
|
-
this.eventHandler?.(this.adapter.createRawSDKEvent(message));
|
|
80
|
-
// Then emit transformed event
|
|
81
|
-
const transformed = this.adapter.transform(message);
|
|
82
|
-
if (transformed) {
|
|
83
|
-
if (transformed.type !== 'token') {
|
|
84
|
-
this.logger.debug('Planning event', { type: transformed.type });
|
|
85
|
-
}
|
|
86
|
-
this.eventHandler?.(transformed);
|
|
87
|
-
}
|
|
88
|
-
if (message.type === 'assistant' && message.message?.content) {
|
|
89
|
-
for (const c of message.message.content) {
|
|
90
|
-
if (c.type === 'text' && c.text)
|
|
91
|
-
plan += c.text + '\n';
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return { plan: plan.trim() };
|
|
96
|
-
}
|
|
97
|
-
async runExecution(task, cwd, permissionMode, options, stageKey) {
|
|
98
|
-
const contextPrompt = await this.promptBuilder.buildExecutionPrompt(task, cwd);
|
|
99
|
-
let prompt = EXECUTION_SYSTEM_PROMPT + '\n\n' + contextPrompt;
|
|
100
|
-
const stageOverrides = options.stageOverrides?.[stageKey];
|
|
101
|
-
const mergedOverrides = {
|
|
102
|
-
...(options.queryOverrides || {}),
|
|
103
|
-
...(stageOverrides?.queryOverrides || {}),
|
|
104
|
-
};
|
|
105
|
-
const baseOptions = {
|
|
106
|
-
model: 'claude-sonnet-4-5-20250929',
|
|
107
|
-
cwd,
|
|
108
|
-
permissionMode,
|
|
109
|
-
settingSources: ['local'],
|
|
110
|
-
mcpServers: this.mcpServers
|
|
111
|
-
};
|
|
112
|
-
const response = query({
|
|
113
|
-
prompt,
|
|
114
|
-
options: { ...baseOptions, ...mergedOverrides },
|
|
115
|
-
});
|
|
116
|
-
const results = [];
|
|
117
|
-
for await (const message of response) {
|
|
118
|
-
// Emit raw SDK event first
|
|
119
|
-
this.eventHandler?.(this.adapter.createRawSDKEvent(message));
|
|
120
|
-
// Then emit transformed event
|
|
121
|
-
const transformed = this.adapter.transform(message);
|
|
122
|
-
if (transformed) {
|
|
123
|
-
if (transformed.type !== 'token') {
|
|
124
|
-
this.logger.debug('Execution event', { type: transformed.type });
|
|
125
|
-
}
|
|
126
|
-
this.eventHandler?.(transformed);
|
|
127
|
-
}
|
|
128
|
-
results.push(message);
|
|
129
|
-
}
|
|
130
|
-
return { results };
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
export { StageExecutor };
|
|
135
|
-
//# sourceMappingURL=stage-executor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stage-executor.js","sources":["../../src/stage-executor.ts"],"sourcesContent":["import { query } from '@anthropic-ai/claude-agent-sdk';\nimport { Logger } from './utils/logger.js';\nimport { ClaudeAdapter } from './adapters/claude/claude-adapter.js';\nimport { AgentRegistry } from './agent-registry.js';\nimport type { AgentEvent, Task, McpServerConfig } from './types.js';\nimport type { WorkflowStage, WorkflowStageExecutionResult, WorkflowExecutionOptions } from './workflow-types.js';\nimport { PLANNING_SYSTEM_PROMPT } from './agents/planning.js';\nimport { EXECUTION_SYSTEM_PROMPT } from './agents/execution.js';\nimport { PromptBuilder } from './prompt-builder.js';\n\nexport class StageExecutor {\n private registry: AgentRegistry;\n private logger: Logger;\n private adapter: ClaudeAdapter;\n private promptBuilder: PromptBuilder;\n private eventHandler?: (event: AgentEvent) => void;\n private mcpServers?: Record<string, McpServerConfig>;\n\n constructor(\n registry: AgentRegistry,\n logger: Logger,\n promptBuilder?: PromptBuilder,\n eventHandler?: (event: AgentEvent) => void,\n mcpServers?: Record<string, McpServerConfig>,\n ) {\n this.registry = registry;\n this.logger = logger.child('StageExecutor');\n this.adapter = new ClaudeAdapter();\n this.promptBuilder = promptBuilder || new PromptBuilder({\n getTaskFiles: async () => [],\n generatePlanTemplate: async () => '',\n logger,\n });\n this.eventHandler = eventHandler;\n this.mcpServers = mcpServers;\n }\n\n setEventHandler(handler?: (event: AgentEvent) => void): void {\n this.eventHandler = handler;\n }\n\n async execute(task: Task, stage: WorkflowStage, options: WorkflowExecutionOptions): Promise<WorkflowStageExecutionResult> {\n const isManual = stage.is_manual_only === true;\n if (isManual) {\n this.logger.info('Manual stage detected; skipping agent execution', { stage: stage.key });\n return { results: [] };\n }\n\n const inferredAgent = stage.key.toLowerCase().includes('plan') ? 'planning_basic' : 'code_generation';\n const agentName = stage.agent_name || inferredAgent;\n const agent = this.registry.getAgent(agentName);\n if (!agent) {\n throw new Error(`Unknown agent '${agentName}' for stage '${stage.key}'`);\n }\n\n const permissionMode = (options.permissionMode as any) || 'acceptEdits';\n const cwd = options.repositoryPath || process.cwd();\n\n switch (agent.agent_type) {\n case 'planning':\n return this.runPlanning(task, cwd, options, stage.key);\n case 'execution':\n return this.runExecution(task, cwd, permissionMode, options, stage.key);\n case 'review': // TODO: Implement review\n case 'testing': // TODO: Implement testing\n default:\n // throw new Error(`Unsupported agent type: ${agent.agent_type}`);\n console.warn(`Unsupported agent type: ${agent.agent_type}`);\n return { results: [] };\n }\n }\n\n private async runPlanning(task: Task, cwd: string, options: WorkflowExecutionOptions, stageKey: string): Promise<WorkflowStageExecutionResult> {\n const contextPrompt = await this.promptBuilder.buildPlanningPrompt(task, cwd);\n let prompt = PLANNING_SYSTEM_PROMPT + '\\n\\n' + contextPrompt;\n\n const stageOverrides = options.stageOverrides?.[stageKey] || options.stageOverrides?.['plan'];\n const mergedOverrides = {\n ...(options.queryOverrides || {}),\n ...(stageOverrides?.queryOverrides || {}),\n } as Record<string, any>;\n\n const baseOptions: Record<string, any> = {\n model: 'claude-sonnet-4-5-20250929',\n cwd,\n permissionMode: 'plan',\n settingSources: ['local'],\n mcpServers: this.mcpServers\n };\n\n const response = query({\n prompt,\n options: { ...baseOptions, ...mergedOverrides },\n });\n\n let plan = '';\n for await (const message of response) {\n // Emit raw SDK event first\n this.eventHandler?.(this.adapter.createRawSDKEvent(message));\n\n // Then emit transformed event\n const transformed = this.adapter.transform(message);\n if (transformed) {\n if (transformed.type !== 'token') {\n this.logger.debug('Planning event', { type: transformed.type });\n }\n this.eventHandler?.(transformed);\n }\n\n if (message.type === 'assistant' && message.message?.content) {\n for (const c of message.message.content) {\n if (c.type === 'text' && c.text) plan += c.text + '\\n';\n }\n }\n }\n\n return { plan: plan.trim() };\n }\n\n private async runExecution(task: Task, cwd: string, permissionMode: WorkflowExecutionOptions['permissionMode'], options: WorkflowExecutionOptions, stageKey: string): Promise<WorkflowStageExecutionResult> {\n const contextPrompt = await this.promptBuilder.buildExecutionPrompt(task, cwd);\n let prompt = EXECUTION_SYSTEM_PROMPT + '\\n\\n' + contextPrompt;\n\n const stageOverrides = options.stageOverrides?.[stageKey];\n const mergedOverrides = {\n ...(options.queryOverrides || {}),\n ...(stageOverrides?.queryOverrides || {}),\n } as Record<string, any>;\n\n const baseOptions: Record<string, any> = {\n model: 'claude-sonnet-4-5-20250929',\n cwd,\n permissionMode,\n settingSources: ['local'],\n mcpServers: this.mcpServers\n };\n\n const response = query({\n prompt,\n options: { ...baseOptions, ...mergedOverrides },\n });\n const results: any[] = [];\n for await (const message of response) {\n // Emit raw SDK event first\n this.eventHandler?.(this.adapter.createRawSDKEvent(message));\n\n // Then emit transformed event\n const transformed = this.adapter.transform(message);\n if (transformed) {\n if (transformed.type !== 'token') {\n this.logger.debug('Execution event', { type: transformed.type });\n }\n this.eventHandler?.(transformed);\n }\n\n results.push(message);\n }\n return { results };\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { WorkflowDefinition } from './workflow-types.js';
|
|
2
|
-
import { PostHogAPIClient } from './posthog-api.js';
|
|
3
|
-
export declare class WorkflowRegistry {
|
|
4
|
-
private workflowsById;
|
|
5
|
-
private apiClient?;
|
|
6
|
-
constructor(apiClient?: PostHogAPIClient, staticDefinitions?: WorkflowDefinition[]);
|
|
7
|
-
loadWorkflows(): Promise<void>;
|
|
8
|
-
getWorkflow(id: string): WorkflowDefinition | undefined;
|
|
9
|
-
listWorkflows(): WorkflowDefinition[];
|
|
10
|
-
}
|
|
11
|
-
//# sourceMappingURL=workflow-registry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-registry.d.ts","sourceRoot":"","sources":["../../src/workflow-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,SAAS,CAAC,CAAmB;gBAEzB,SAAS,CAAC,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,EAAE,kBAAkB,EAAE;IAO5E,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAOpC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAIvD,aAAa,IAAI,kBAAkB,EAAE;CAGtC"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
class WorkflowRegistry {
|
|
2
|
-
workflowsById = new Map();
|
|
3
|
-
apiClient;
|
|
4
|
-
constructor(apiClient, staticDefinitions) {
|
|
5
|
-
this.apiClient = apiClient;
|
|
6
|
-
if (staticDefinitions) {
|
|
7
|
-
for (const w of staticDefinitions)
|
|
8
|
-
this.workflowsById.set(w.id, w);
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
async loadWorkflows() {
|
|
12
|
-
if (this.apiClient) {
|
|
13
|
-
const workflows = await this.apiClient.listWorkflows();
|
|
14
|
-
for (const w of workflows)
|
|
15
|
-
this.workflowsById.set(w.id, w);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
getWorkflow(id) {
|
|
19
|
-
return this.workflowsById.get(id);
|
|
20
|
-
}
|
|
21
|
-
listWorkflows() {
|
|
22
|
-
return Array.from(this.workflowsById.values());
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export { WorkflowRegistry };
|
|
27
|
-
//# sourceMappingURL=workflow-registry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-registry.js","sources":["../../src/workflow-registry.ts"],"sourcesContent":["import type { WorkflowDefinition } from './workflow-types.js';\nimport { PostHogAPIClient } from './posthog-api.js';\n\nexport class WorkflowRegistry {\n private workflowsById: Map<string, WorkflowDefinition> = new Map();\n private apiClient?: PostHogAPIClient;\n\n constructor(apiClient?: PostHogAPIClient, staticDefinitions?: WorkflowDefinition[]) {\n this.apiClient = apiClient;\n if (staticDefinitions) {\n for (const w of staticDefinitions) this.workflowsById.set(w.id, w);\n }\n }\n\n async loadWorkflows(): Promise<void> {\n if (this.apiClient) {\n const workflows = await this.apiClient.listWorkflows();\n for (const w of workflows) this.workflowsById.set(w.id, w);\n }\n }\n\n getWorkflow(id: string): WorkflowDefinition | undefined {\n return this.workflowsById.get(id);\n }\n\n listWorkflows(): WorkflowDefinition[] {\n return Array.from(this.workflowsById.values());\n }\n}\n\n"],"names":[],"mappings":"MAGa,gBAAgB,CAAA;AACnB,IAAA,aAAa,GAAoC,IAAI,GAAG,EAAE;AAC1D,IAAA,SAAS;IAEjB,WAAA,CAAY,SAA4B,EAAE,iBAAwC,EAAA;AAChF,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;QAC1B,IAAI,iBAAiB,EAAE;YACrB,KAAK,MAAM,CAAC,IAAI,iBAAiB;gBAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpE;IACF;AAEA,IAAA,MAAM,aAAa,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE;YACtD,KAAK,MAAM,CAAC,IAAI,SAAS;gBAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5D;IACF;AAEA,IAAA,WAAW,CAAC,EAAU,EAAA;QACpB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;IACnC;IAEA,aAAa,GAAA;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;IAChD;AACD;;;;"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import type { PermissionMode, AgentEvent } from './types.js';
|
|
2
|
-
export type AgentType = 'planning' | 'execution' | 'review' | 'testing';
|
|
3
|
-
export interface AgentDefinition {
|
|
4
|
-
id: string;
|
|
5
|
-
name: string;
|
|
6
|
-
agent_type: AgentType;
|
|
7
|
-
description?: string;
|
|
8
|
-
config?: Record<string, any>;
|
|
9
|
-
}
|
|
10
|
-
export interface WorkflowStage {
|
|
11
|
-
id: string;
|
|
12
|
-
key: string;
|
|
13
|
-
name: string;
|
|
14
|
-
position: number;
|
|
15
|
-
agent_name?: string | null;
|
|
16
|
-
is_manual_only?: boolean;
|
|
17
|
-
color?: string;
|
|
18
|
-
}
|
|
19
|
-
export interface WorkflowDefinition {
|
|
20
|
-
id: string;
|
|
21
|
-
name: string;
|
|
22
|
-
description?: string;
|
|
23
|
-
stages: WorkflowStage[];
|
|
24
|
-
}
|
|
25
|
-
export interface StageOverrideOptions {
|
|
26
|
-
permissionMode?: PermissionMode;
|
|
27
|
-
createPlanningBranch?: boolean;
|
|
28
|
-
createImplementationBranch?: boolean;
|
|
29
|
-
openPullRequest?: boolean;
|
|
30
|
-
queryOverrides?: Record<string, any>;
|
|
31
|
-
}
|
|
32
|
-
export interface WorkflowStageExecutionResult {
|
|
33
|
-
plan?: string;
|
|
34
|
-
results?: any[];
|
|
35
|
-
}
|
|
36
|
-
export interface WorkflowExecutionOptions {
|
|
37
|
-
repositoryPath?: string;
|
|
38
|
-
permissionMode?: PermissionMode;
|
|
39
|
-
autoProgress?: boolean;
|
|
40
|
-
resumeFromCurrentStage?: boolean;
|
|
41
|
-
stageOverrides?: Record<string, StageOverrideOptions>;
|
|
42
|
-
onEvent?: (event: AgentEvent) => void;
|
|
43
|
-
queryOverrides?: Record<string, any>;
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=workflow-types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-types.d.ts","sourceRoot":"","sources":["../../src/workflow-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAExE,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACtD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACtC"}
|
package/src/agent-registry.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import type { AgentDefinition, AgentType } from './workflow-types.js';
|
|
2
|
-
|
|
3
|
-
export class AgentRegistry {
|
|
4
|
-
private agentsByName: Map<string, AgentDefinition> = new Map();
|
|
5
|
-
|
|
6
|
-
constructor(definitions?: AgentDefinition[]) {
|
|
7
|
-
if (definitions) {
|
|
8
|
-
for (const def of definitions) this.register(def);
|
|
9
|
-
} else {
|
|
10
|
-
for (const def of AgentRegistry.getDefaultAgents()) this.register(def);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
static getDefaultAgents(): AgentDefinition[] {
|
|
15
|
-
return [
|
|
16
|
-
{
|
|
17
|
-
id: 'planning',
|
|
18
|
-
name: 'planning',
|
|
19
|
-
agent_type: 'planning',
|
|
20
|
-
description: 'Analyze repo and produce implementation plan',
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
id: 'code_generation',
|
|
24
|
-
name: 'code_generation',
|
|
25
|
-
agent_type: 'execution',
|
|
26
|
-
description: 'Implements code changes using Claude SDK',
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
id: 'review',
|
|
30
|
-
name: 'review',
|
|
31
|
-
agent_type: 'review',
|
|
32
|
-
description: 'Reviews changes and suggests fixes',
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
id: 'testing',
|
|
36
|
-
name: 'testing',
|
|
37
|
-
agent_type: 'testing',
|
|
38
|
-
description: 'Runs tests and reports results',
|
|
39
|
-
},
|
|
40
|
-
];
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
register(def: AgentDefinition): void {
|
|
44
|
-
this.agentsByName.set(def.name, def);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
getAgent(name: string): AgentDefinition | undefined {
|
|
48
|
-
return this.agentsByName.get(name);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
listAgents(): AgentDefinition[] {
|
|
52
|
-
return Array.from(this.agentsByName.values());
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
exportForPostHog(): { id: string; name: string; agent_type: AgentType; description?: string }[] {
|
|
56
|
-
return this.listAgents().map(({ id, name, agent_type, description }) => ({ id, name, agent_type, description }));
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
package/src/stage-executor.ts
DELETED
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
2
|
-
import { Logger } from './utils/logger.js';
|
|
3
|
-
import { ClaudeAdapter } from './adapters/claude/claude-adapter.js';
|
|
4
|
-
import { AgentRegistry } from './agent-registry.js';
|
|
5
|
-
import type { AgentEvent, Task, McpServerConfig } from './types.js';
|
|
6
|
-
import type { WorkflowStage, WorkflowStageExecutionResult, WorkflowExecutionOptions } from './workflow-types.js';
|
|
7
|
-
import { PLANNING_SYSTEM_PROMPT } from './agents/planning.js';
|
|
8
|
-
import { EXECUTION_SYSTEM_PROMPT } from './agents/execution.js';
|
|
9
|
-
import { PromptBuilder } from './prompt-builder.js';
|
|
10
|
-
|
|
11
|
-
export class StageExecutor {
|
|
12
|
-
private registry: AgentRegistry;
|
|
13
|
-
private logger: Logger;
|
|
14
|
-
private adapter: ClaudeAdapter;
|
|
15
|
-
private promptBuilder: PromptBuilder;
|
|
16
|
-
private eventHandler?: (event: AgentEvent) => void;
|
|
17
|
-
private mcpServers?: Record<string, McpServerConfig>;
|
|
18
|
-
|
|
19
|
-
constructor(
|
|
20
|
-
registry: AgentRegistry,
|
|
21
|
-
logger: Logger,
|
|
22
|
-
promptBuilder?: PromptBuilder,
|
|
23
|
-
eventHandler?: (event: AgentEvent) => void,
|
|
24
|
-
mcpServers?: Record<string, McpServerConfig>,
|
|
25
|
-
) {
|
|
26
|
-
this.registry = registry;
|
|
27
|
-
this.logger = logger.child('StageExecutor');
|
|
28
|
-
this.adapter = new ClaudeAdapter();
|
|
29
|
-
this.promptBuilder = promptBuilder || new PromptBuilder({
|
|
30
|
-
getTaskFiles: async () => [],
|
|
31
|
-
generatePlanTemplate: async () => '',
|
|
32
|
-
logger,
|
|
33
|
-
});
|
|
34
|
-
this.eventHandler = eventHandler;
|
|
35
|
-
this.mcpServers = mcpServers;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
setEventHandler(handler?: (event: AgentEvent) => void): void {
|
|
39
|
-
this.eventHandler = handler;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
async execute(task: Task, stage: WorkflowStage, options: WorkflowExecutionOptions): Promise<WorkflowStageExecutionResult> {
|
|
43
|
-
const isManual = stage.is_manual_only === true;
|
|
44
|
-
if (isManual) {
|
|
45
|
-
this.logger.info('Manual stage detected; skipping agent execution', { stage: stage.key });
|
|
46
|
-
return { results: [] };
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const inferredAgent = stage.key.toLowerCase().includes('plan') ? 'planning_basic' : 'code_generation';
|
|
50
|
-
const agentName = stage.agent_name || inferredAgent;
|
|
51
|
-
const agent = this.registry.getAgent(agentName);
|
|
52
|
-
if (!agent) {
|
|
53
|
-
throw new Error(`Unknown agent '${agentName}' for stage '${stage.key}'`);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const permissionMode = (options.permissionMode as any) || 'acceptEdits';
|
|
57
|
-
const cwd = options.repositoryPath || process.cwd();
|
|
58
|
-
|
|
59
|
-
switch (agent.agent_type) {
|
|
60
|
-
case 'planning':
|
|
61
|
-
return this.runPlanning(task, cwd, options, stage.key);
|
|
62
|
-
case 'execution':
|
|
63
|
-
return this.runExecution(task, cwd, permissionMode, options, stage.key);
|
|
64
|
-
case 'review': // TODO: Implement review
|
|
65
|
-
case 'testing': // TODO: Implement testing
|
|
66
|
-
default:
|
|
67
|
-
// throw new Error(`Unsupported agent type: ${agent.agent_type}`);
|
|
68
|
-
console.warn(`Unsupported agent type: ${agent.agent_type}`);
|
|
69
|
-
return { results: [] };
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
private async runPlanning(task: Task, cwd: string, options: WorkflowExecutionOptions, stageKey: string): Promise<WorkflowStageExecutionResult> {
|
|
74
|
-
const contextPrompt = await this.promptBuilder.buildPlanningPrompt(task, cwd);
|
|
75
|
-
let prompt = PLANNING_SYSTEM_PROMPT + '\n\n' + contextPrompt;
|
|
76
|
-
|
|
77
|
-
const stageOverrides = options.stageOverrides?.[stageKey] || options.stageOverrides?.['plan'];
|
|
78
|
-
const mergedOverrides = {
|
|
79
|
-
...(options.queryOverrides || {}),
|
|
80
|
-
...(stageOverrides?.queryOverrides || {}),
|
|
81
|
-
} as Record<string, any>;
|
|
82
|
-
|
|
83
|
-
const baseOptions: Record<string, any> = {
|
|
84
|
-
model: 'claude-sonnet-4-5-20250929',
|
|
85
|
-
cwd,
|
|
86
|
-
permissionMode: 'plan',
|
|
87
|
-
settingSources: ['local'],
|
|
88
|
-
mcpServers: this.mcpServers
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
const response = query({
|
|
92
|
-
prompt,
|
|
93
|
-
options: { ...baseOptions, ...mergedOverrides },
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
let plan = '';
|
|
97
|
-
for await (const message of response) {
|
|
98
|
-
// Emit raw SDK event first
|
|
99
|
-
this.eventHandler?.(this.adapter.createRawSDKEvent(message));
|
|
100
|
-
|
|
101
|
-
// Then emit transformed event
|
|
102
|
-
const transformed = this.adapter.transform(message);
|
|
103
|
-
if (transformed) {
|
|
104
|
-
if (transformed.type !== 'token') {
|
|
105
|
-
this.logger.debug('Planning event', { type: transformed.type });
|
|
106
|
-
}
|
|
107
|
-
this.eventHandler?.(transformed);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
if (message.type === 'assistant' && message.message?.content) {
|
|
111
|
-
for (const c of message.message.content) {
|
|
112
|
-
if (c.type === 'text' && c.text) plan += c.text + '\n';
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return { plan: plan.trim() };
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
private async runExecution(task: Task, cwd: string, permissionMode: WorkflowExecutionOptions['permissionMode'], options: WorkflowExecutionOptions, stageKey: string): Promise<WorkflowStageExecutionResult> {
|
|
121
|
-
const contextPrompt = await this.promptBuilder.buildExecutionPrompt(task, cwd);
|
|
122
|
-
let prompt = EXECUTION_SYSTEM_PROMPT + '\n\n' + contextPrompt;
|
|
123
|
-
|
|
124
|
-
const stageOverrides = options.stageOverrides?.[stageKey];
|
|
125
|
-
const mergedOverrides = {
|
|
126
|
-
...(options.queryOverrides || {}),
|
|
127
|
-
...(stageOverrides?.queryOverrides || {}),
|
|
128
|
-
} as Record<string, any>;
|
|
129
|
-
|
|
130
|
-
const baseOptions: Record<string, any> = {
|
|
131
|
-
model: 'claude-sonnet-4-5-20250929',
|
|
132
|
-
cwd,
|
|
133
|
-
permissionMode,
|
|
134
|
-
settingSources: ['local'],
|
|
135
|
-
mcpServers: this.mcpServers
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
const response = query({
|
|
139
|
-
prompt,
|
|
140
|
-
options: { ...baseOptions, ...mergedOverrides },
|
|
141
|
-
});
|
|
142
|
-
const results: any[] = [];
|
|
143
|
-
for await (const message of response) {
|
|
144
|
-
// Emit raw SDK event first
|
|
145
|
-
this.eventHandler?.(this.adapter.createRawSDKEvent(message));
|
|
146
|
-
|
|
147
|
-
// Then emit transformed event
|
|
148
|
-
const transformed = this.adapter.transform(message);
|
|
149
|
-
if (transformed) {
|
|
150
|
-
if (transformed.type !== 'token') {
|
|
151
|
-
this.logger.debug('Execution event', { type: transformed.type });
|
|
152
|
-
}
|
|
153
|
-
this.eventHandler?.(transformed);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
results.push(message);
|
|
157
|
-
}
|
|
158
|
-
return { results };
|
|
159
|
-
}
|
|
160
|
-
}
|