@posthog/agent 1.7.1 → 1.10.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 +8 -5
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/src/adapters/claude/claude-adapter.d.ts +17 -0
- package/dist/src/adapters/claude/claude-adapter.d.ts.map +1 -0
- package/dist/src/{event-transformer.js → adapters/claude/claude-adapter.js} +34 -10
- package/dist/src/adapters/claude/claude-adapter.js.map +1 -0
- package/dist/src/adapters/claude/tool-mapper.d.ts +19 -0
- package/dist/src/adapters/claude/tool-mapper.d.ts.map +1 -0
- package/dist/src/adapters/claude/tool-mapper.js +44 -0
- package/dist/src/adapters/claude/tool-mapper.js.map +1 -0
- package/dist/src/adapters/types.d.ts +28 -0
- package/dist/src/adapters/types.d.ts.map +1 -0
- package/dist/src/agent.d.ts +1 -1
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +61 -44
- package/dist/src/agent.js.map +1 -1
- package/dist/src/posthog-api.d.ts +16 -57
- package/dist/src/posthog-api.d.ts.map +1 -1
- package/dist/src/posthog-api.js +38 -38
- package/dist/src/posthog-api.js.map +1 -1
- package/dist/src/stage-executor.d.ts +1 -1
- package/dist/src/stage-executor.d.ts.map +1 -1
- package/dist/src/stage-executor.js +7 -7
- package/dist/src/stage-executor.js.map +1 -1
- package/dist/src/task-progress-reporter.d.ts +2 -7
- package/dist/src/task-progress-reporter.d.ts.map +1 -1
- package/dist/src/task-progress-reporter.js +37 -55
- package/dist/src/task-progress-reporter.js.map +1 -1
- package/dist/src/tools/registry.d.ts +25 -0
- package/dist/src/tools/registry.d.ts.map +1 -0
- package/dist/src/tools/registry.js +120 -0
- package/dist/src/tools/registry.js.map +1 -0
- package/dist/src/tools/types.d.ts +80 -0
- package/dist/src/tools/types.d.ts.map +1 -0
- package/dist/src/types.d.ts +65 -15
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/package.json +1 -1
- package/src/{event-transformer.ts → adapters/claude/claude-adapter.ts} +40 -16
- package/src/adapters/claude/tool-mapper.ts +46 -0
- package/src/adapters/types.ts +31 -0
- package/src/agent.ts +64 -41
- package/src/posthog-api.ts +57 -92
- package/src/stage-executor.ts +11 -11
- package/src/task-progress-reporter.ts +38 -63
- package/src/tools/registry.ts +129 -0
- package/src/tools/types.ts +127 -0
- package/src/types.ts +73 -20
- package/dist/src/event-transformer.d.ts +0 -10
- package/dist/src/event-transformer.d.ts.map +0 -1
- package/dist/src/event-transformer.js.map +0 -1
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ bun run example
|
|
|
15
15
|
- **PostHog Integration**: Fetches existing tasks from PostHog API
|
|
16
16
|
- **Configurable Workflows**: Execute tasks via PostHog-defined or local workflows
|
|
17
17
|
- **Branch Management**: Automatic branch creation for planning and implementation
|
|
18
|
-
- **Progress Tracking**: Execution status stored in PostHog `
|
|
18
|
+
- **Progress Tracking**: Execution status stored in PostHog `TaskRun` records for easy polling
|
|
19
19
|
|
|
20
20
|
## Usage
|
|
21
21
|
|
|
@@ -96,7 +96,7 @@ your-repo/
|
|
|
96
96
|
|
|
97
97
|
## Progress Updates
|
|
98
98
|
|
|
99
|
-
Progress for each task execution is persisted to PostHog's `
|
|
99
|
+
Progress for each task execution is persisted to PostHog's `TaskRun` model, so UIs can poll for updates without relying on streaming hooks:
|
|
100
100
|
|
|
101
101
|
```typescript
|
|
102
102
|
const agent = new Agent({
|
|
@@ -106,9 +106,12 @@ const agent = new Agent({
|
|
|
106
106
|
});
|
|
107
107
|
|
|
108
108
|
const poller = setInterval(async () => {
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
|
|
109
|
+
const runs = await agent.getPostHogClient()?.listTaskRuns(taskId);
|
|
110
|
+
const latestRun = runs?.sort((a, b) =>
|
|
111
|
+
new Date(b.created_at).getTime() - new Date(a.created_at).getTime()
|
|
112
|
+
)[0];
|
|
113
|
+
if (latestRun) {
|
|
114
|
+
renderProgress(latestRun.status, latestRun.log, latestRun.current_stage);
|
|
112
115
|
}
|
|
113
116
|
}, 3000);
|
|
114
117
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
export { Agent, } from './src/agent.js';
|
|
2
2
|
export { PermissionMode, } from './src/types.js';
|
|
3
|
-
export type { Task, SupportingFile, ExecutionResult, AgentConfig, McpServerConfig, AgentEvent } from './src/types.js';
|
|
3
|
+
export type { Task, TaskRun, SupportingFile, ExecutionResult, AgentConfig, McpServerConfig, AgentEvent } from './src/types.js';
|
|
4
4
|
export type { WorkflowDefinition, WorkflowStage, WorkflowExecutionOptions, AgentDefinition } from './src/workflow-types.js';
|
|
5
5
|
export { Logger, LogLevel, } from './src/utils/logger.js';
|
|
6
6
|
export type { LoggerConfig } from './src/utils/logger.js';
|
|
7
|
+
export type { ProviderAdapter } from './src/adapters/types.js';
|
|
8
|
+
export { ClaudeAdapter } from './src/adapters/claude/claude-adapter.js';
|
|
9
|
+
export type { Tool, ToolCategory, KnownTool, ReadTool, WriteTool, EditTool, GlobTool, NotebookEditTool, BashTool, BashOutputTool, KillShellTool, WebFetchTool, WebSearchTool, GrepTool, TaskTool, TodoWriteTool, ExitPlanModeTool, SlashCommandTool, } from './src/tools/types.js';
|
|
10
|
+
export { ToolRegistry } from './src/tools/registry.js';
|
|
7
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,EACH,KAAK,GACR,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACH,cAAc,GACjB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACR,IAAI,EACJ,cAAc,EACd,eAAe,EACf,WAAW,EACX,eAAe,EACf,UAAU,EACb,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,kBAAkB,EAClB,aAAa,EACb,wBAAwB,EACxB,eAAe,EAChB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACH,MAAM,EACN,QAAQ,GACX,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EACR,YAAY,EACf,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,EACH,KAAK,GACR,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACH,cAAc,GACjB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACR,IAAI,EACJ,OAAO,EACP,cAAc,EACd,eAAe,EACf,WAAW,EACX,eAAe,EACf,UAAU,EACb,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,kBAAkB,EAClB,aAAa,EACb,wBAAwB,EACxB,eAAe,EAChB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACH,MAAM,EACN,QAAQ,GACX,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EACR,YAAY,EACf,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAGxE,YAAY,EACR,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,QAAQ,EACR,cAAc,EACd,aAAa,EACb,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,gBAAgB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { Agent } from './src/agent.js';
|
|
2
2
|
export { PermissionMode } from './src/types.js';
|
|
3
3
|
export { LogLevel, Logger } from './src/utils/logger.js';
|
|
4
|
+
export { ClaudeAdapter } from './src/adapters/claude/claude-adapter.js';
|
|
5
|
+
export { ToolRegistry } from './src/tools/registry.js';
|
|
4
6
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AgentEvent } from '../../types.js';
|
|
2
|
+
import type { SDKMessage } from '@anthropic-ai/claude-agent-sdk';
|
|
3
|
+
import type { ProviderAdapter } from '../types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Claude provider adapter.
|
|
6
|
+
* Transforms Claude SDK messages into our standardized AgentEvent format.
|
|
7
|
+
*/
|
|
8
|
+
export declare class ClaudeAdapter implements ProviderAdapter {
|
|
9
|
+
readonly name = "claude";
|
|
10
|
+
private toolMapper;
|
|
11
|
+
createRawSDKEvent(sdkMessage: any): AgentEvent;
|
|
12
|
+
transform(sdkMessage: SDKMessage): AgentEvent | null;
|
|
13
|
+
createStatusEvent(phase: string, additionalData?: any): import('../../types.js').StatusEvent;
|
|
14
|
+
private extractUserContent;
|
|
15
|
+
private extractFromObject;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=claude-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-adapter.d.ts","sourceRoot":"","sources":["../../../../src/adapters/claude/claude-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD;;;GAGG;AACH,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,UAAU,CAA0B;IAC5C,iBAAiB,CAAC,UAAU,EAAE,GAAG,GAAG,UAAU;IAQ9C,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;IA2OpD,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,GAAG,GAAG,OAAO,gBAAgB,EAAE,WAAW;IAS5F,OAAO,CAAC,kBAAkB;IAkC1B,OAAO,CAAC,iBAAiB;CAoB1B"}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
import { ClaudeToolMapper } from './tool-mapper.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Claude provider adapter.
|
|
5
|
+
* Transforms Claude SDK messages into our standardized AgentEvent format.
|
|
6
|
+
*/
|
|
7
|
+
class ClaudeAdapter {
|
|
8
|
+
name = 'claude';
|
|
9
|
+
toolMapper = new ClaudeToolMapper();
|
|
2
10
|
createRawSDKEvent(sdkMessage) {
|
|
3
11
|
return {
|
|
4
12
|
type: 'raw_sdk_event',
|
|
@@ -108,14 +116,17 @@ class EventTransformer {
|
|
|
108
116
|
if (message.content && Array.isArray(message.content)) {
|
|
109
117
|
for (const block of message.content) {
|
|
110
118
|
if (block.type === 'tool_use') {
|
|
111
|
-
//
|
|
112
|
-
|
|
119
|
+
// Create tool_call event and enrich with metadata
|
|
120
|
+
const toolCallEvent = {
|
|
113
121
|
...baseEvent,
|
|
114
122
|
type: 'tool_call',
|
|
115
123
|
toolName: block.name,
|
|
116
124
|
callId: block.id,
|
|
117
|
-
args: block.input || {}
|
|
125
|
+
args: block.input || {},
|
|
126
|
+
parentToolUseId: sdkMessage.parent_tool_use_id
|
|
118
127
|
};
|
|
128
|
+
// Enrich with tool metadata
|
|
129
|
+
return this.toolMapper.enrichToolCall(toolCallEvent);
|
|
119
130
|
}
|
|
120
131
|
}
|
|
121
132
|
}
|
|
@@ -135,13 +146,18 @@ class EventTransformer {
|
|
|
135
146
|
if (message?.content && Array.isArray(message.content)) {
|
|
136
147
|
for (const block of message.content) {
|
|
137
148
|
if (block.type === 'tool_result') {
|
|
138
|
-
|
|
149
|
+
// Create tool_result event and enrich with metadata
|
|
150
|
+
const toolResultEvent = {
|
|
139
151
|
...baseEvent,
|
|
140
152
|
type: 'tool_result',
|
|
141
153
|
toolName: block.tool_name || 'unknown',
|
|
142
154
|
callId: block.tool_use_id || '',
|
|
143
|
-
result: block.content
|
|
155
|
+
result: block.content,
|
|
156
|
+
isError: block.is_error,
|
|
157
|
+
parentToolUseId: sdkMessage.parent_tool_use_id
|
|
144
158
|
};
|
|
159
|
+
// Enrich with tool metadata
|
|
160
|
+
return this.toolMapper.enrichToolResult(toolResultEvent);
|
|
145
161
|
}
|
|
146
162
|
}
|
|
147
163
|
}
|
|
@@ -163,10 +179,14 @@ class EventTransformer {
|
|
|
163
179
|
return {
|
|
164
180
|
...baseEvent,
|
|
165
181
|
type: 'done',
|
|
182
|
+
result: sdkMessage.result,
|
|
166
183
|
durationMs: sdkMessage.duration_ms,
|
|
184
|
+
durationApiMs: sdkMessage.duration_api_ms,
|
|
167
185
|
numTurns: sdkMessage.num_turns,
|
|
168
186
|
totalCostUsd: sdkMessage.total_cost_usd,
|
|
169
|
-
usage: sdkMessage.usage
|
|
187
|
+
usage: sdkMessage.usage,
|
|
188
|
+
modelUsage: sdkMessage.modelUsage,
|
|
189
|
+
permissionDenials: sdkMessage.permission_denials
|
|
170
190
|
};
|
|
171
191
|
}
|
|
172
192
|
else {
|
|
@@ -195,7 +215,11 @@ class EventTransformer {
|
|
|
195
215
|
tools: sdkMessage.tools,
|
|
196
216
|
permissionMode: sdkMessage.permissionMode,
|
|
197
217
|
cwd: sdkMessage.cwd,
|
|
198
|
-
apiKeySource: sdkMessage.apiKeySource
|
|
218
|
+
apiKeySource: sdkMessage.apiKeySource,
|
|
219
|
+
agents: sdkMessage.agents,
|
|
220
|
+
slashCommands: sdkMessage.slash_commands,
|
|
221
|
+
outputStyle: sdkMessage.output_style,
|
|
222
|
+
mcpServers: sdkMessage.mcp_servers
|
|
199
223
|
};
|
|
200
224
|
}
|
|
201
225
|
else if (sdkMessage.subtype === 'compact_boundary') {
|
|
@@ -267,5 +291,5 @@ class EventTransformer {
|
|
|
267
291
|
}
|
|
268
292
|
}
|
|
269
293
|
|
|
270
|
-
export {
|
|
271
|
-
//# sourceMappingURL=
|
|
294
|
+
export { ClaudeAdapter };
|
|
295
|
+
//# sourceMappingURL=claude-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-adapter.js","sources":["../../../../src/adapters/claude/claude-adapter.ts"],"sourcesContent":["import type { AgentEvent } from '../../types.js';\nimport type { SDKMessage } from '@anthropic-ai/claude-agent-sdk';\nimport type { ProviderAdapter } from '../types.js';\nimport { ClaudeToolMapper } from './tool-mapper.js';\n\n/**\n * Claude provider adapter.\n * Transforms Claude SDK messages into our standardized AgentEvent format.\n */\nexport class ClaudeAdapter implements ProviderAdapter {\n readonly name = 'claude';\n private toolMapper = new ClaudeToolMapper();\n createRawSDKEvent(sdkMessage: any): AgentEvent {\n return {\n type: 'raw_sdk_event',\n ts: Date.now(),\n sdkMessage\n };\n }\n\n transform(sdkMessage: SDKMessage): AgentEvent | null {\n const baseEvent = { ts: Date.now() };\n\n // Handle stream events\n if (sdkMessage.type === 'stream_event') {\n const event = sdkMessage.event;\n\n switch (event.type) {\n case 'message_start':\n return {\n ...baseEvent,\n type: 'message_start',\n messageId: event.message?.id,\n model: event.message?.model\n };\n\n case 'content_block_start':\n const contentBlock = event.content_block;\n if (!contentBlock) return null;\n\n return {\n ...baseEvent,\n type: 'content_block_start',\n index: event.index,\n contentType: contentBlock.type as 'text' | 'tool_use' | 'thinking',\n toolName: contentBlock.type === 'tool_use' ? contentBlock.name : undefined,\n toolId: contentBlock.type === 'tool_use' ? contentBlock.id : undefined\n };\n\n case 'content_block_delta':\n const delta = event.delta;\n if (!delta) return null;\n\n if (delta.type === 'text_delta') {\n return {\n ...baseEvent,\n type: 'token',\n content: delta.text,\n contentType: 'text'\n };\n } else if (delta.type === 'input_json_delta') {\n return {\n ...baseEvent,\n type: 'token',\n content: delta.partial_json,\n contentType: 'tool_input'\n };\n } else if (delta.type === 'thinking_delta') {\n return {\n ...baseEvent,\n type: 'token',\n content: delta.thinking,\n contentType: 'thinking'\n };\n }\n return null;\n\n case 'content_block_stop':\n return {\n ...baseEvent,\n type: 'content_block_stop',\n index: event.index\n };\n\n case 'message_delta':\n return {\n ...baseEvent,\n type: 'message_delta',\n stopReason: event.delta?.stop_reason,\n stopSequence: event.delta?.stop_sequence,\n usage: event.usage ? {\n outputTokens: event.usage.output_tokens\n } : undefined\n };\n\n case 'message_stop':\n return {\n ...baseEvent,\n type: 'message_stop'\n };\n\n case 'ping':\n // Ignore ping events\n return null;\n\n case 'error':\n return {\n ...baseEvent,\n type: 'error',\n message: event.error?.message || 'Unknown error',\n error: event.error,\n errorType: event.error?.type || 'stream_error',\n context: event.error ? {\n type: event.error.type,\n code: event.error.code,\n } : undefined,\n sdkError: event.error\n };\n\n default:\n return null;\n }\n }\n\n // Handle assistant messages (full message, not streaming)\n if (sdkMessage.type === 'assistant') {\n const message = sdkMessage.message;\n\n // Extract tool calls from content blocks\n if (message.content && Array.isArray(message.content)) {\n for (const block of message.content) {\n if (block.type === 'tool_use') {\n // Create tool_call event and enrich with metadata\n const toolCallEvent = {\n ...baseEvent,\n type: 'tool_call' as const,\n toolName: block.name,\n callId: block.id,\n args: block.input || {},\n parentToolUseId: sdkMessage.parent_tool_use_id\n };\n // Enrich with tool metadata\n return this.toolMapper.enrichToolCall(toolCallEvent);\n }\n }\n }\n\n // If no tool calls, emit status event\n return {\n ...baseEvent,\n type: 'status',\n phase: 'assistant_message',\n messageId: message.id,\n model: message.model\n };\n }\n\n // Handle user messages\n if (sdkMessage.type === 'user') {\n const message = sdkMessage.message;\n\n // Check for tool results in content blocks\n if (message?.content && Array.isArray(message.content)) {\n for (const block of message.content) {\n if (block.type === 'tool_result') {\n // Create tool_result event and enrich with metadata\n const toolResultEvent = {\n ...baseEvent,\n type: 'tool_result' as const,\n toolName: block.tool_name || 'unknown',\n callId: block.tool_use_id || '',\n result: block.content,\n isError: block.is_error,\n parentToolUseId: sdkMessage.parent_tool_use_id\n };\n // Enrich with tool metadata\n return this.toolMapper.enrichToolResult(toolResultEvent);\n }\n }\n }\n\n // Otherwise extract text content\n const textContent = this.extractUserContent(message?.content);\n if (!textContent) {\n return null;\n }\n return {\n ...baseEvent,\n type: 'user_message',\n content: textContent,\n isSynthetic: sdkMessage.isSynthetic\n };\n }\n\n // Handle result messages\n if (sdkMessage.type === 'result') {\n if (sdkMessage.subtype === 'success') {\n return {\n ...baseEvent,\n type: 'done',\n result: sdkMessage.result,\n durationMs: sdkMessage.duration_ms,\n durationApiMs: sdkMessage.duration_api_ms,\n numTurns: sdkMessage.num_turns,\n totalCostUsd: sdkMessage.total_cost_usd,\n usage: sdkMessage.usage,\n modelUsage: sdkMessage.modelUsage,\n permissionDenials: sdkMessage.permission_denials\n };\n } else {\n return {\n ...baseEvent,\n type: 'error',\n message: `Execution failed: ${sdkMessage.subtype}`,\n error: { subtype: sdkMessage.subtype },\n errorType: sdkMessage.subtype || 'result_error',\n context: {\n subtype: sdkMessage.subtype,\n duration_ms: sdkMessage.duration_ms,\n num_turns: sdkMessage.num_turns\n },\n sdkError: sdkMessage\n };\n }\n }\n\n // Handle system messages\n if (sdkMessage.type === 'system') {\n if (sdkMessage.subtype === 'init') {\n return {\n ...baseEvent,\n type: 'init',\n model: sdkMessage.model,\n tools: sdkMessage.tools,\n permissionMode: sdkMessage.permissionMode,\n cwd: sdkMessage.cwd,\n apiKeySource: sdkMessage.apiKeySource,\n agents: sdkMessage.agents,\n slashCommands: sdkMessage.slash_commands,\n outputStyle: sdkMessage.output_style,\n mcpServers: sdkMessage.mcp_servers\n };\n } else if (sdkMessage.subtype === 'compact_boundary') {\n return {\n ...baseEvent,\n type: 'compact_boundary',\n trigger: sdkMessage.compact_metadata.trigger,\n preTokens: sdkMessage.compact_metadata.pre_tokens\n };\n }\n }\n\n return null;\n }\n \n createStatusEvent(phase: string, additionalData?: any): import('../../types.js').StatusEvent {\n return {\n type: 'status',\n ts: Date.now(),\n phase,\n ...additionalData\n };\n }\n\n private extractUserContent(content: unknown): string | null {\n if (!content) {\n return null;\n }\n\n if (typeof content === 'string') {\n const trimmed = content.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const block of content) {\n const extracted = this.extractUserContent(block);\n if (extracted) {\n parts.push(extracted);\n } else if (block && typeof block === 'object') {\n const candidate = this.extractFromObject(block as Record<string, unknown>);\n if (candidate) {\n parts.push(candidate);\n }\n }\n }\n const text = parts.join('\\n').trim();\n return text.length > 0 ? text : null;\n }\n\n if (typeof content === 'object') {\n return this.extractFromObject(content as Record<string, unknown>);\n }\n\n return null;\n }\n\n private extractFromObject(value: Record<string, unknown>): string | null {\n const preferredKeys = ['text', 'input_text', 'input', 'markdown', 'content', 'message'];\n for (const key of preferredKeys) {\n if (typeof value[key] === 'string') {\n const trimmed = (value[key] as string).trim();\n if (trimmed.length > 0) {\n return trimmed;\n }\n }\n }\n\n for (const entry of Object.values(value)) {\n const extracted = this.extractUserContent(entry);\n if (extracted) {\n return extracted;\n }\n }\n\n return null;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ToolCallEvent, ToolResultEvent } from '../../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Maps Claude tool names to our tool type system.
|
|
4
|
+
* Enriches tool events with metadata for better UI consumption.
|
|
5
|
+
*/
|
|
6
|
+
export declare class ClaudeToolMapper {
|
|
7
|
+
private registry;
|
|
8
|
+
/**
|
|
9
|
+
* Enrich a tool call event with tool metadata.
|
|
10
|
+
* Looks up the tool definition and adds it to the event.
|
|
11
|
+
*/
|
|
12
|
+
enrichToolCall(event: ToolCallEvent): ToolCallEvent;
|
|
13
|
+
/**
|
|
14
|
+
* Enrich a tool result event with tool metadata.
|
|
15
|
+
* Looks up the tool definition and adds it to the event.
|
|
16
|
+
*/
|
|
17
|
+
enrichToolResult(event: ToolResultEvent): ToolResultEvent;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=tool-mapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-mapper.d.ts","sourceRoot":"","sources":["../../../../src/adapters/claude/tool-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGrE;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAsB;IAEtC;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa;IAcnD;;;OAGG;IACH,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,eAAe;CAa1D"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { ToolRegistry } from '../../tools/registry.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Maps Claude tool names to our tool type system.
|
|
5
|
+
* Enriches tool events with metadata for better UI consumption.
|
|
6
|
+
*/
|
|
7
|
+
class ClaudeToolMapper {
|
|
8
|
+
registry = new ToolRegistry();
|
|
9
|
+
/**
|
|
10
|
+
* Enrich a tool call event with tool metadata.
|
|
11
|
+
* Looks up the tool definition and adds it to the event.
|
|
12
|
+
*/
|
|
13
|
+
enrichToolCall(event) {
|
|
14
|
+
const tool = this.registry.get(event.toolName);
|
|
15
|
+
if (!tool) {
|
|
16
|
+
// Tool not recognized, return as-is
|
|
17
|
+
return event;
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
...event,
|
|
21
|
+
tool,
|
|
22
|
+
category: tool.category,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Enrich a tool result event with tool metadata.
|
|
27
|
+
* Looks up the tool definition and adds it to the event.
|
|
28
|
+
*/
|
|
29
|
+
enrichToolResult(event) {
|
|
30
|
+
const tool = this.registry.get(event.toolName);
|
|
31
|
+
if (!tool) {
|
|
32
|
+
// Tool not recognized, return as-is
|
|
33
|
+
return event;
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
...event,
|
|
37
|
+
tool,
|
|
38
|
+
category: tool.category,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export { ClaudeToolMapper };
|
|
44
|
+
//# sourceMappingURL=tool-mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-mapper.js","sources":["../../../../src/adapters/claude/tool-mapper.ts"],"sourcesContent":["import type { ToolCallEvent, ToolResultEvent } from '../../types.js';\nimport { ToolRegistry } from '../../tools/registry.js';\n\n/**\n * Maps Claude tool names to our tool type system.\n * Enriches tool events with metadata for better UI consumption.\n */\nexport class ClaudeToolMapper {\n private registry = new ToolRegistry();\n\n /**\n * Enrich a tool call event with tool metadata.\n * Looks up the tool definition and adds it to the event.\n */\n enrichToolCall(event: ToolCallEvent): ToolCallEvent {\n const tool = this.registry.get(event.toolName);\n if (!tool) {\n // Tool not recognized, return as-is\n return event;\n }\n\n return {\n ...event,\n tool,\n category: tool.category,\n };\n }\n\n /**\n * Enrich a tool result event with tool metadata.\n * Looks up the tool definition and adds it to the event.\n */\n enrichToolResult(event: ToolResultEvent): ToolResultEvent {\n const tool = this.registry.get(event.toolName);\n if (!tool) {\n // Tool not recognized, return as-is\n return event;\n }\n\n return {\n ...event,\n tool,\n category: tool.category,\n };\n }\n}\n"],"names":[],"mappings":";;AAGA;;;AAGG;MACU,gBAAgB,CAAA;AACnB,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAE;AAErC;;;AAGG;AACH,IAAA,cAAc,CAAC,KAAoB,EAAA;AACjC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC9C,IAAI,CAAC,IAAI,EAAE;;AAET,YAAA,OAAO,KAAK;QACd;QAEA,OAAO;AACL,YAAA,GAAG,KAAK;YACR,IAAI;YACJ,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB;IACH;AAEA;;;AAGG;AACH,IAAA,gBAAgB,CAAC,KAAsB,EAAA;AACrC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC9C,IAAI,CAAC,IAAI,EAAE;;AAET,YAAA,OAAO,KAAK;QACd;QAEA,OAAO;AACL,YAAA,GAAG,KAAK;YACR,IAAI;YACJ,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB;IACH;AACD;;;;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { AgentEvent, StatusEvent } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Provider adapter interface for transforming provider-specific messages
|
|
4
|
+
* into our standardized AgentEvent format.
|
|
5
|
+
*
|
|
6
|
+
* This allows us to support multiple AI providers (Claude, Gemini, OpenAI, etc.)
|
|
7
|
+
* while maintaining a consistent event interface for consumers.
|
|
8
|
+
*/
|
|
9
|
+
export interface ProviderAdapter {
|
|
10
|
+
/** Provider name (e.g., 'claude', 'gemini') */
|
|
11
|
+
name: string;
|
|
12
|
+
/**
|
|
13
|
+
* Transform a provider-specific SDK message into an AgentEvent.
|
|
14
|
+
* Returns null if the message should be ignored.
|
|
15
|
+
*/
|
|
16
|
+
transform(sdkMessage: unknown): AgentEvent | null;
|
|
17
|
+
/**
|
|
18
|
+
* Create a standardized status event.
|
|
19
|
+
* Used for workflow stage transitions and other status updates.
|
|
20
|
+
*/
|
|
21
|
+
createStatusEvent(phase: string, additionalData?: any): StatusEvent;
|
|
22
|
+
/**
|
|
23
|
+
* Create a raw SDK event for debugging purposes.
|
|
24
|
+
* Wraps the original SDK message in a raw_sdk_event.
|
|
25
|
+
*/
|
|
26
|
+
createRawSDKEvent(sdkMessage: any): AgentEvent;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE3D;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,SAAS,CAAC,UAAU,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAAC;IAElD;;;OAGG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,GAAG,GAAG,WAAW,CAAC;IAEpE;;;OAGG;IACH,iBAAiB,CAAC,UAAU,EAAE,GAAG,GAAG,UAAU,CAAC;CAChD"}
|
package/dist/src/agent.d.ts
CHANGED
package/dist/src/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,eAAe,EAAc,WAAW,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAEvG,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/src/agent.js
CHANGED
|
@@ -4,7 +4,7 @@ import { PostHogAPIClient } from './posthog-api.js';
|
|
|
4
4
|
import { PostHogFileManager } from './file-manager.js';
|
|
5
5
|
import { GitManager } from './git-manager.js';
|
|
6
6
|
import { TemplateManager } from './template-manager.js';
|
|
7
|
-
import {
|
|
7
|
+
import { ClaudeAdapter } from './adapters/claude/claude-adapter.js';
|
|
8
8
|
import { Logger } from './utils/logger.js';
|
|
9
9
|
import { AgentRegistry } from './agent-registry.js';
|
|
10
10
|
import { WorkflowRegistry } from './workflow-registry.js';
|
|
@@ -21,7 +21,7 @@ class Agent {
|
|
|
21
21
|
fileManager;
|
|
22
22
|
gitManager;
|
|
23
23
|
templateManager;
|
|
24
|
-
|
|
24
|
+
adapter;
|
|
25
25
|
logger;
|
|
26
26
|
agentRegistry;
|
|
27
27
|
workflowRegistry;
|
|
@@ -56,7 +56,8 @@ class Agent {
|
|
|
56
56
|
};
|
|
57
57
|
this.logger = new Logger({ debug: this.debug, prefix: '[PostHog Agent]' });
|
|
58
58
|
this.taskManager = new TaskManager();
|
|
59
|
-
|
|
59
|
+
// Hardcode Claude adapter for now - extensible for other providers later
|
|
60
|
+
this.adapter = new ClaudeAdapter();
|
|
60
61
|
this.fileManager = new PostHogFileManager(this.workingDirectory, this.logger.child('FileManager'));
|
|
61
62
|
this.gitManager = new GitManager({
|
|
62
63
|
repositoryPath: this.workingDirectory,
|
|
@@ -129,24 +130,29 @@ class Agent {
|
|
|
129
130
|
await this.posthogAPI.updateTask(task.id, { workflow: workflowId });
|
|
130
131
|
task.workflow = workflowId;
|
|
131
132
|
}
|
|
132
|
-
if (!task.current_stage && workflow.stages.length > 0) {
|
|
133
|
-
const firstStage = [...workflow.stages].sort((a, b) => a.position - b.position)[0];
|
|
134
|
-
await this.posthogAPI.updateTaskStage(task.id, firstStage.id);
|
|
135
|
-
task.current_stage = firstStage.id;
|
|
136
|
-
}
|
|
137
133
|
}
|
|
138
134
|
catch (e) {
|
|
139
|
-
this.logger.warn('Failed to sync task workflow
|
|
135
|
+
this.logger.warn('Failed to sync task workflow before execution', { error: e.message });
|
|
140
136
|
}
|
|
141
137
|
}
|
|
142
138
|
const executionId = this.taskManager.generateExecutionId();
|
|
143
139
|
this.logger.info('Starting workflow execution', { taskId: task.id, workflowId, executionId });
|
|
144
140
|
this.taskManager.startExecution(task.id, 'plan_and_build', executionId);
|
|
145
141
|
await this.progressReporter.start(task.id, {
|
|
146
|
-
workflowId,
|
|
147
|
-
workflowRunId: executionId,
|
|
148
142
|
totalSteps: orderedStages.length,
|
|
149
143
|
});
|
|
144
|
+
// Set initial stage on the newly created run
|
|
145
|
+
const firstStage = orderedStages[0];
|
|
146
|
+
if (this.posthogAPI && this.progressReporter.runId && firstStage) {
|
|
147
|
+
try {
|
|
148
|
+
await this.posthogAPI.updateTaskRun(task.id, this.progressReporter.runId, {
|
|
149
|
+
current_stage: firstStage.id
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
catch (e) {
|
|
153
|
+
this.logger.warn('Failed to set initial stage on run', { error: e.message });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
150
156
|
try {
|
|
151
157
|
let startIndex = 0;
|
|
152
158
|
const currentStageId = task.current_stage;
|
|
@@ -156,7 +162,7 @@ class Agent {
|
|
|
156
162
|
const atLastStage = currIdx >= 0 && currIdx === orderedStages.length - 1;
|
|
157
163
|
if (atLastStage) {
|
|
158
164
|
const finalStageKey = orderedStages[currIdx]?.key;
|
|
159
|
-
this.emitEvent(this.
|
|
165
|
+
this.emitEvent(this.adapter.createStatusEvent('no_next_stage', { stage: finalStageKey }));
|
|
160
166
|
await this.progressReporter.noNextStage(finalStageKey);
|
|
161
167
|
await this.progressReporter.complete();
|
|
162
168
|
this.taskManager.completeExecution(executionId, { task, workflow });
|
|
@@ -168,15 +174,18 @@ class Agent {
|
|
|
168
174
|
if (idx >= 0)
|
|
169
175
|
startIndex = idx;
|
|
170
176
|
}
|
|
171
|
-
// Align server-side stage when restarting from
|
|
172
|
-
if (this.posthogAPI) {
|
|
177
|
+
// Align server-side stage when restarting from a different stage
|
|
178
|
+
if (this.posthogAPI && this.progressReporter.runId) {
|
|
173
179
|
const targetStage = orderedStages[startIndex];
|
|
174
180
|
if (targetStage && targetStage.id !== currentStageId) {
|
|
175
181
|
try {
|
|
176
|
-
await this.posthogAPI.
|
|
177
|
-
|
|
182
|
+
await this.posthogAPI.updateTaskRun(task.id, this.progressReporter.runId, {
|
|
183
|
+
current_stage: targetStage.id
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
catch (e) {
|
|
187
|
+
this.logger.warn('Failed to update run stage', { error: e.message });
|
|
178
188
|
}
|
|
179
|
-
catch { }
|
|
180
189
|
}
|
|
181
190
|
}
|
|
182
191
|
for (let i = startIndex; i < orderedStages.length; i++) {
|
|
@@ -202,7 +211,7 @@ class Agent {
|
|
|
202
211
|
}
|
|
203
212
|
}
|
|
204
213
|
async executeStage(task, stage, options = {}) {
|
|
205
|
-
this.emitEvent(this.
|
|
214
|
+
this.emitEvent(this.adapter.createStatusEvent('stage_start', { stage: stage.key }));
|
|
206
215
|
const overrides = options.stageOverrides?.[stage.key];
|
|
207
216
|
const agentName = stage.agent_name || 'code_generation';
|
|
208
217
|
const agentDef = this.agentRegistry.getAgent(agentName);
|
|
@@ -215,20 +224,20 @@ class Agent {
|
|
|
215
224
|
if (isPlanning && shouldCreatePlanningBranch) {
|
|
216
225
|
const planningBranch = await this.createPlanningBranch(task.id);
|
|
217
226
|
await this.updateTaskBranch(task.id, planningBranch);
|
|
218
|
-
this.emitEvent(this.
|
|
227
|
+
this.emitEvent(this.adapter.createStatusEvent('branch_created', { stage: stage.key, branch: planningBranch }));
|
|
219
228
|
await this.progressReporter.branchCreated(stage.key, planningBranch);
|
|
220
229
|
}
|
|
221
230
|
else if (!isPlanning && !isManual && shouldCreateImplBranch) {
|
|
222
231
|
const implBranch = await this.createImplementationBranch(task.id);
|
|
223
232
|
await this.updateTaskBranch(task.id, implBranch);
|
|
224
|
-
this.emitEvent(this.
|
|
233
|
+
this.emitEvent(this.adapter.createStatusEvent('branch_created', { stage: stage.key, branch: implBranch }));
|
|
225
234
|
await this.progressReporter.branchCreated(stage.key, implBranch);
|
|
226
235
|
}
|
|
227
236
|
const result = await this.stageExecutor.execute(task, stage, options);
|
|
228
237
|
if (result.plan) {
|
|
229
238
|
await this.writePlan(task.id, result.plan);
|
|
230
239
|
await this.commitPlan(task.id, task.title);
|
|
231
|
-
this.emitEvent(this.
|
|
240
|
+
this.emitEvent(this.adapter.createStatusEvent('commit_made', { stage: stage.key, kind: 'plan' }));
|
|
232
241
|
await this.progressReporter.commitMade(stage.key, 'plan');
|
|
233
242
|
}
|
|
234
243
|
if (isManual) {
|
|
@@ -242,27 +251,27 @@ class Agent {
|
|
|
242
251
|
const implBranch = await this.createImplementationBranch(task.id);
|
|
243
252
|
await this.updateTaskBranch(task.id, implBranch);
|
|
244
253
|
branchName = implBranch;
|
|
245
|
-
this.emitEvent(this.
|
|
254
|
+
this.emitEvent(this.adapter.createStatusEvent('branch_created', { stage: stage.key, branch: implBranch }));
|
|
246
255
|
await this.progressReporter.branchCreated(stage.key, implBranch);
|
|
247
256
|
}
|
|
248
257
|
try {
|
|
249
258
|
const prUrl = await this.createPullRequest(task.id, branchName, task.title, task.description);
|
|
250
259
|
await this.updateTaskBranch(task.id, branchName);
|
|
251
260
|
await this.attachPullRequestToTask(task.id, prUrl, branchName);
|
|
252
|
-
this.emitEvent(this.
|
|
261
|
+
this.emitEvent(this.adapter.createStatusEvent('pr_created', { stage: stage.key, prUrl }));
|
|
253
262
|
await this.progressReporter.pullRequestCreated(stage.key, prUrl);
|
|
254
263
|
}
|
|
255
264
|
catch { }
|
|
256
265
|
}
|
|
257
266
|
// Do not auto-progress on manual stages
|
|
258
|
-
this.emitEvent(this.
|
|
267
|
+
this.emitEvent(this.adapter.createStatusEvent('stage_complete', { stage: stage.key }));
|
|
259
268
|
return;
|
|
260
269
|
}
|
|
261
270
|
if (result.results) {
|
|
262
271
|
const existingPlan = await this.readPlan(task.id);
|
|
263
272
|
const planSummary = existingPlan ? existingPlan.split('\n')[0] : undefined;
|
|
264
273
|
await this.commitImplementation(task.id, task.title, planSummary);
|
|
265
|
-
this.emitEvent(this.
|
|
274
|
+
this.emitEvent(this.adapter.createStatusEvent('commit_made', { stage: stage.key, kind: 'implementation' }));
|
|
266
275
|
await this.progressReporter.commitMade(stage.key, 'implementation');
|
|
267
276
|
}
|
|
268
277
|
// PR creation on complete stage (or if explicitly requested), regardless of whether edits occurred
|
|
@@ -275,28 +284,30 @@ class Agent {
|
|
|
275
284
|
const prUrl = await this.createPullRequest(task.id, branchName, task.title, task.description);
|
|
276
285
|
await this.updateTaskBranch(task.id, branchName);
|
|
277
286
|
await this.attachPullRequestToTask(task.id, prUrl, branchName);
|
|
278
|
-
this.emitEvent(this.
|
|
287
|
+
this.emitEvent(this.adapter.createStatusEvent('pr_created', { stage: stage.key, prUrl }));
|
|
279
288
|
await this.progressReporter.pullRequestCreated(stage.key, prUrl);
|
|
280
289
|
}
|
|
281
290
|
catch { }
|
|
282
291
|
}
|
|
283
292
|
}
|
|
284
|
-
this.emitEvent(this.
|
|
293
|
+
this.emitEvent(this.adapter.createStatusEvent('stage_complete', { stage: stage.key }));
|
|
285
294
|
}
|
|
286
295
|
async progressToNextStage(taskId, currentStageKey) {
|
|
287
|
-
if (!this.posthogAPI)
|
|
288
|
-
throw new Error('PostHog API not configured. Cannot progress stage.');
|
|
296
|
+
if (!this.posthogAPI || !this.progressReporter.runId) {
|
|
297
|
+
throw new Error('PostHog API not configured or no active run. Cannot progress stage.');
|
|
298
|
+
}
|
|
289
299
|
try {
|
|
290
|
-
await this.posthogAPI.
|
|
300
|
+
await this.posthogAPI.progressTaskRun(taskId, this.progressReporter.runId);
|
|
291
301
|
}
|
|
292
302
|
catch (error) {
|
|
293
303
|
if (error instanceof Error && error.message.includes('No next stage available')) {
|
|
294
|
-
this.logger.warn('No next stage available when attempting to progress
|
|
304
|
+
this.logger.warn('No next stage available when attempting to progress run', {
|
|
295
305
|
taskId,
|
|
306
|
+
runId: this.progressReporter.runId,
|
|
296
307
|
stage: currentStageKey,
|
|
297
308
|
error: error.message,
|
|
298
309
|
});
|
|
299
|
-
this.emitEvent(this.
|
|
310
|
+
this.emitEvent(this.adapter.createStatusEvent('no_next_stage', { stage: currentStageKey }));
|
|
300
311
|
await this.progressReporter.noNextStage(currentStageKey);
|
|
301
312
|
return;
|
|
302
313
|
}
|
|
@@ -321,9 +332,9 @@ class Agent {
|
|
|
321
332
|
for await (const message of response) {
|
|
322
333
|
this.logger.debug('Received message in direct run', message);
|
|
323
334
|
// Emit raw SDK event
|
|
324
|
-
this.emitEvent(this.
|
|
335
|
+
this.emitEvent(this.adapter.createRawSDKEvent(message));
|
|
325
336
|
// Emit transformed event
|
|
326
|
-
const transformedEvent = this.
|
|
337
|
+
const transformedEvent = this.adapter.transform(message);
|
|
327
338
|
if (transformedEvent) {
|
|
328
339
|
this.emitEvent(transformedEvent);
|
|
329
340
|
}
|
|
@@ -416,24 +427,30 @@ Generated by PostHog Agent`;
|
|
|
416
427
|
return prUrl;
|
|
417
428
|
}
|
|
418
429
|
async attachPullRequestToTask(taskId, prUrl, branchName) {
|
|
419
|
-
this.logger.info('Attaching PR to task', { taskId, prUrl, branchName });
|
|
420
|
-
if (!this.posthogAPI) {
|
|
421
|
-
const error = new Error('PostHog API not configured. Cannot attach PR to task.');
|
|
430
|
+
this.logger.info('Attaching PR to task run', { taskId, prUrl, branchName });
|
|
431
|
+
if (!this.posthogAPI || !this.progressReporter.runId) {
|
|
432
|
+
const error = new Error('PostHog API not configured or no active run. Cannot attach PR to task.');
|
|
422
433
|
this.logger.error('PostHog API not configured', error);
|
|
423
434
|
throw error;
|
|
424
435
|
}
|
|
425
|
-
|
|
426
|
-
|
|
436
|
+
const updates = {
|
|
437
|
+
output: { pr_url: prUrl }
|
|
438
|
+
};
|
|
439
|
+
if (branchName) {
|
|
440
|
+
updates.branch = branchName;
|
|
441
|
+
}
|
|
442
|
+
await this.posthogAPI.updateTaskRun(taskId, this.progressReporter.runId, updates);
|
|
443
|
+
this.logger.debug('PR attached to task run', { taskId, runId: this.progressReporter.runId, prUrl });
|
|
427
444
|
}
|
|
428
445
|
async updateTaskBranch(taskId, branchName) {
|
|
429
|
-
this.logger.info('Updating task branch', { taskId, branchName });
|
|
430
|
-
if (!this.posthogAPI) {
|
|
431
|
-
const error = new Error('PostHog API not configured. Cannot update
|
|
446
|
+
this.logger.info('Updating task run branch', { taskId, branchName });
|
|
447
|
+
if (!this.posthogAPI || !this.progressReporter.runId) {
|
|
448
|
+
const error = new Error('PostHog API not configured or no active run. Cannot update branch.');
|
|
432
449
|
this.logger.error('PostHog API not configured', error);
|
|
433
450
|
throw error;
|
|
434
451
|
}
|
|
435
|
-
await this.posthogAPI.
|
|
436
|
-
this.logger.debug('Task branch updated', { taskId, branchName });
|
|
452
|
+
await this.posthogAPI.updateTaskRun(taskId, this.progressReporter.runId, { branch: branchName });
|
|
453
|
+
this.logger.debug('Task run branch updated', { taskId, runId: this.progressReporter.runId, branchName });
|
|
437
454
|
}
|
|
438
455
|
// Execution management
|
|
439
456
|
cancelTask(taskId) {
|