@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.
Files changed (77) hide show
  1. package/README.md +26 -65
  2. package/dist/index.d.ts +2 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/src/adapters/types.d.ts +1 -1
  5. package/dist/src/agent.d.ts +5 -13
  6. package/dist/src/agent.d.ts.map +1 -1
  7. package/dist/src/agent.js +300 -187
  8. package/dist/src/agent.js.map +1 -1
  9. package/dist/src/agents/execution.d.ts +1 -1
  10. package/dist/src/agents/execution.js +2 -2
  11. package/dist/src/agents/execution.js.map +1 -1
  12. package/dist/src/agents/research.d.ts +2 -0
  13. package/dist/src/agents/research.d.ts.map +1 -0
  14. package/dist/src/agents/research.js +105 -0
  15. package/dist/src/agents/research.js.map +1 -0
  16. package/dist/src/file-manager.d.ts +19 -0
  17. package/dist/src/file-manager.d.ts.map +1 -1
  18. package/dist/src/file-manager.js +39 -0
  19. package/dist/src/file-manager.js.map +1 -1
  20. package/dist/src/git-manager.d.ts +4 -0
  21. package/dist/src/git-manager.d.ts.map +1 -1
  22. package/dist/src/git-manager.js +42 -1
  23. package/dist/src/git-manager.js.map +1 -1
  24. package/dist/src/posthog-api.d.ts +0 -8
  25. package/dist/src/posthog-api.d.ts.map +1 -1
  26. package/dist/src/posthog-api.js +0 -32
  27. package/dist/src/posthog-api.js.map +1 -1
  28. package/dist/src/prompt-builder.d.ts +1 -0
  29. package/dist/src/prompt-builder.d.ts.map +1 -1
  30. package/dist/src/prompt-builder.js +40 -0
  31. package/dist/src/prompt-builder.js.map +1 -1
  32. package/dist/src/structured-extraction.d.ts +22 -0
  33. package/dist/src/structured-extraction.d.ts.map +1 -0
  34. package/dist/src/structured-extraction.js +136 -0
  35. package/dist/src/structured-extraction.js.map +1 -0
  36. package/dist/src/task-progress-reporter.d.ts +0 -6
  37. package/dist/src/task-progress-reporter.d.ts.map +1 -1
  38. package/dist/src/task-progress-reporter.js +2 -26
  39. package/dist/src/task-progress-reporter.js.map +1 -1
  40. package/dist/src/template-manager.d.ts.map +1 -1
  41. package/dist/src/template-manager.js +26 -4
  42. package/dist/src/template-manager.js.map +1 -1
  43. package/dist/src/types.d.ts +7 -4
  44. package/dist/src/types.d.ts.map +1 -1
  45. package/dist/src/types.js +0 -1
  46. package/dist/src/types.js.map +1 -1
  47. package/package.json +5 -5
  48. package/src/adapters/types.ts +1 -1
  49. package/src/agent.ts +326 -195
  50. package/src/agents/execution.ts +2 -2
  51. package/src/agents/research.ts +103 -0
  52. package/src/file-manager.ts +64 -0
  53. package/src/git-manager.ts +53 -1
  54. package/src/posthog-api.ts +0 -40
  55. package/src/prompt-builder.ts +53 -0
  56. package/src/structured-extraction.ts +167 -0
  57. package/src/task-progress-reporter.ts +2 -34
  58. package/src/template-manager.ts +35 -5
  59. package/src/types.ts +8 -7
  60. package/dist/src/agent-registry.d.ts +0 -16
  61. package/dist/src/agent-registry.d.ts.map +0 -1
  62. package/dist/src/agent-registry.js +0 -56
  63. package/dist/src/agent-registry.js.map +0 -1
  64. package/dist/src/stage-executor.d.ts +0 -19
  65. package/dist/src/stage-executor.d.ts.map +0 -1
  66. package/dist/src/stage-executor.js +0 -135
  67. package/dist/src/stage-executor.js.map +0 -1
  68. package/dist/src/workflow-registry.d.ts +0 -11
  69. package/dist/src/workflow-registry.d.ts.map +0 -1
  70. package/dist/src/workflow-registry.js +0 -27
  71. package/dist/src/workflow-registry.js.map +0 -1
  72. package/dist/src/workflow-types.d.ts +0 -45
  73. package/dist/src/workflow-types.d.ts.map +0 -1
  74. package/src/agent-registry.ts +0 -59
  75. package/src/stage-executor.ts +0 -160
  76. package/src/workflow-registry.ts +0 -30
  77. 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"}
@@ -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
-
@@ -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
- }