@posthog/agent 1.20.0 → 1.22.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 (57) hide show
  1. package/dist/claude-cli/cli.js +2251 -1888
  2. package/dist/src/adapters/claude/claude-adapter.d.ts +1 -1
  3. package/dist/src/adapters/claude/claude-adapter.d.ts.map +1 -1
  4. package/dist/src/adapters/claude/claude-adapter.js +141 -133
  5. package/dist/src/adapters/claude/claude-adapter.js.map +1 -1
  6. package/dist/src/adapters/types.d.ts +3 -3
  7. package/dist/src/adapters/types.d.ts.map +1 -1
  8. package/dist/src/agent.d.ts +1 -1
  9. package/dist/src/agent.d.ts.map +1 -1
  10. package/dist/src/agent.js +9 -8
  11. package/dist/src/agent.js.map +1 -1
  12. package/dist/src/file-manager.d.ts +10 -0
  13. package/dist/src/file-manager.d.ts.map +1 -1
  14. package/dist/src/file-manager.js +49 -10
  15. package/dist/src/file-manager.js.map +1 -1
  16. package/dist/src/git-manager.d.ts +1 -0
  17. package/dist/src/git-manager.d.ts.map +1 -1
  18. package/dist/src/git-manager.js +10 -3
  19. package/dist/src/git-manager.js.map +1 -1
  20. package/dist/src/posthog-api.d.ts +2 -1
  21. package/dist/src/posthog-api.d.ts.map +1 -1
  22. package/dist/src/posthog-api.js +11 -0
  23. package/dist/src/posthog-api.js.map +1 -1
  24. package/dist/src/task-progress-reporter.d.ts +12 -4
  25. package/dist/src/task-progress-reporter.d.ts.map +1 -1
  26. package/dist/src/task-progress-reporter.js +282 -117
  27. package/dist/src/task-progress-reporter.js.map +1 -1
  28. package/dist/src/types.d.ts +17 -1
  29. package/dist/src/types.d.ts.map +1 -1
  30. package/dist/src/types.js.map +1 -1
  31. package/dist/src/workflow/config.d.ts.map +1 -1
  32. package/dist/src/workflow/config.js +11 -0
  33. package/dist/src/workflow/config.js.map +1 -1
  34. package/dist/src/workflow/steps/build.js +3 -3
  35. package/dist/src/workflow/steps/build.js.map +1 -1
  36. package/dist/src/workflow/steps/finalize.d.ts +3 -0
  37. package/dist/src/workflow/steps/finalize.d.ts.map +1 -0
  38. package/dist/src/workflow/steps/finalize.js +182 -0
  39. package/dist/src/workflow/steps/finalize.js.map +1 -0
  40. package/dist/src/workflow/steps/plan.js +3 -3
  41. package/dist/src/workflow/steps/plan.js.map +1 -1
  42. package/dist/src/workflow/steps/research.js +3 -3
  43. package/dist/src/workflow/steps/research.js.map +1 -1
  44. package/package.json +2 -2
  45. package/src/adapters/claude/claude-adapter.ts +56 -46
  46. package/src/adapters/types.ts +3 -3
  47. package/src/agent.ts +17 -8
  48. package/src/file-manager.ts +59 -6
  49. package/src/git-manager.ts +11 -3
  50. package/src/posthog-api.ts +33 -1
  51. package/src/task-progress-reporter.ts +310 -138
  52. package/src/types.ts +20 -1
  53. package/src/workflow/config.ts +11 -0
  54. package/src/workflow/steps/build.ts +3 -3
  55. package/src/workflow/steps/finalize.ts +216 -0
  56. package/src/workflow/steps/plan.ts +3 -3
  57. package/src/workflow/steps/research.ts +3 -3
@@ -9,7 +9,7 @@ export declare class ClaudeAdapter implements ProviderAdapter {
9
9
  readonly name = "claude";
10
10
  private toolMapper;
11
11
  createRawSDKEvent(sdkMessage: any): AgentEvent;
12
- transform(sdkMessage: SDKMessage): AgentEvent | null;
12
+ transform(sdkMessage: SDKMessage): AgentEvent[];
13
13
  createStatusEvent(phase: string, additionalData?: any): StatusEvent;
14
14
  createArtifactEvent(kind: string, content: any): ArtifactEvent;
15
15
  private extractUserContent;
@@ -1 +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,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7E,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,WAAW;IASnE,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,aAAa;IAS9D,OAAO,CAAC,kBAAkB;IAkC1B,OAAO,CAAC,iBAAiB;CAoB1B"}
1
+ {"version":3,"file":"claude-adapter.d.ts","sourceRoot":"","sources":["../../../../src/adapters/claude/claude-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7E,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,EAAE;IAqP/C,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,GAAG,GAAG,WAAW;IASnE,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,aAAa;IAS9D,OAAO,CAAC,kBAAkB;IAkC1B,OAAO,CAAC,iBAAiB;CAoB1B"}
@@ -16,103 +16,104 @@ class ClaudeAdapter {
16
16
  }
17
17
  transform(sdkMessage) {
18
18
  const baseEvent = { ts: Date.now() };
19
- // Handle stream events
20
19
  if (sdkMessage.type === 'stream_event') {
21
20
  const event = sdkMessage.event;
22
21
  switch (event.type) {
23
22
  case 'message_start':
24
- return {
25
- ...baseEvent,
26
- type: 'message_start',
27
- messageId: event.message?.id,
28
- model: event.message?.model
29
- };
23
+ return [{
24
+ ...baseEvent,
25
+ type: 'message_start',
26
+ messageId: event.message?.id,
27
+ model: event.message?.model
28
+ }];
30
29
  case 'content_block_start':
31
30
  const contentBlock = event.content_block;
32
31
  if (!contentBlock)
33
- return null;
34
- return {
35
- ...baseEvent,
36
- type: 'content_block_start',
37
- index: event.index,
38
- contentType: contentBlock.type,
39
- toolName: contentBlock.type === 'tool_use' ? contentBlock.name : undefined,
40
- toolId: contentBlock.type === 'tool_use' ? contentBlock.id : undefined
41
- };
32
+ return [];
33
+ return [{
34
+ ...baseEvent,
35
+ type: 'content_block_start',
36
+ index: event.index,
37
+ contentType: contentBlock.type,
38
+ toolName: contentBlock.type === 'tool_use' ? contentBlock.name : undefined,
39
+ toolId: contentBlock.type === 'tool_use' ? contentBlock.id : undefined
40
+ }];
42
41
  case 'content_block_delta':
43
42
  const delta = event.delta;
44
43
  if (!delta)
45
- return null;
44
+ return [];
46
45
  if (delta.type === 'text_delta') {
47
- return {
48
- ...baseEvent,
49
- type: 'token',
50
- content: delta.text,
51
- contentType: 'text'
52
- };
46
+ return [{
47
+ ...baseEvent,
48
+ type: 'token',
49
+ content: delta.text,
50
+ contentType: 'text'
51
+ }];
53
52
  }
54
53
  else if (delta.type === 'input_json_delta') {
55
- return {
56
- ...baseEvent,
57
- type: 'token',
58
- content: delta.partial_json,
59
- contentType: 'tool_input'
60
- };
54
+ return [{
55
+ ...baseEvent,
56
+ type: 'token',
57
+ content: delta.partial_json,
58
+ contentType: 'tool_input'
59
+ }];
61
60
  }
62
61
  else if (delta.type === 'thinking_delta') {
63
- return {
64
- ...baseEvent,
65
- type: 'token',
66
- content: delta.thinking,
67
- contentType: 'thinking'
68
- };
62
+ return [{
63
+ ...baseEvent,
64
+ type: 'token',
65
+ content: delta.thinking,
66
+ contentType: 'thinking'
67
+ }];
69
68
  }
70
- return null;
69
+ return [];
71
70
  case 'content_block_stop':
72
- return {
73
- ...baseEvent,
74
- type: 'content_block_stop',
75
- index: event.index
76
- };
71
+ return [{
72
+ ...baseEvent,
73
+ type: 'content_block_stop',
74
+ index: event.index
75
+ }];
77
76
  case 'message_delta':
78
- return {
79
- ...baseEvent,
80
- type: 'message_delta',
81
- stopReason: event.delta?.stop_reason,
82
- stopSequence: event.delta?.stop_sequence,
83
- usage: event.usage ? {
84
- outputTokens: event.usage.output_tokens
85
- } : undefined
86
- };
77
+ return [{
78
+ ...baseEvent,
79
+ type: 'message_delta',
80
+ stopReason: event.delta?.stop_reason,
81
+ stopSequence: event.delta?.stop_sequence,
82
+ usage: event.usage ? {
83
+ outputTokens: event.usage.output_tokens
84
+ } : undefined
85
+ }];
87
86
  case 'message_stop':
88
- return {
89
- ...baseEvent,
90
- type: 'message_stop'
91
- };
87
+ return [{
88
+ ...baseEvent,
89
+ type: 'message_stop'
90
+ }];
92
91
  case 'ping':
93
92
  // Ignore ping events
94
- return null;
93
+ return [];
95
94
  case 'error':
96
- return {
97
- ...baseEvent,
98
- type: 'error',
99
- message: event.error?.message || 'Unknown error',
100
- error: event.error,
101
- errorType: event.error?.type || 'stream_error',
102
- context: event.error ? {
103
- type: event.error.type,
104
- code: event.error.code,
105
- } : undefined,
106
- sdkError: event.error
107
- };
95
+ return [{
96
+ ...baseEvent,
97
+ type: 'error',
98
+ message: event.error?.message || 'Unknown error',
99
+ error: event.error,
100
+ errorType: event.error?.type || 'stream_error',
101
+ context: event.error ? {
102
+ type: event.error.type,
103
+ code: event.error.code,
104
+ } : undefined,
105
+ sdkError: event.error
106
+ }];
108
107
  default:
109
- return null;
108
+ return [];
110
109
  }
111
110
  }
112
111
  // Handle assistant messages (full message, not streaming)
113
112
  if (sdkMessage.type === 'assistant') {
114
113
  const message = sdkMessage.message;
114
+ const events = [];
115
115
  // Extract tool calls from content blocks
116
+ // A single assistant message can contain multiple tool_use blocks
116
117
  if (message.content && Array.isArray(message.content)) {
117
118
  for (const block of message.content) {
118
119
  if (block.type === 'tool_use') {
@@ -125,28 +126,32 @@ class ClaudeAdapter {
125
126
  args: block.input || {},
126
127
  parentToolUseId: sdkMessage.parent_tool_use_id
127
128
  };
128
- // Enrich with tool metadata
129
- return this.toolMapper.enrichToolCall(toolCallEvent);
129
+ // Enrich with tool metadata and add to events array
130
+ events.push(this.toolMapper.enrichToolCall(toolCallEvent));
130
131
  }
131
132
  }
132
133
  }
134
+ // If we found tool calls, return them
135
+ if (events.length > 0) {
136
+ return events;
137
+ }
133
138
  // If no tool calls, emit status event
134
- return {
135
- ...baseEvent,
136
- type: 'status',
137
- phase: 'assistant_message',
138
- messageId: message.id,
139
- model: message.model
140
- };
139
+ return [{
140
+ ...baseEvent,
141
+ type: 'status',
142
+ phase: 'assistant_message',
143
+ messageId: message.id,
144
+ model: message.model
145
+ }];
141
146
  }
142
147
  // Handle user messages
143
148
  if (sdkMessage.type === 'user') {
144
149
  const message = sdkMessage.message;
145
- // Check for tool results in content blocks
150
+ const events = [];
151
+ // Check for tool results in content blocks, A single user message can contain multiple tool_result blocks
146
152
  if (message?.content && Array.isArray(message.content)) {
147
153
  for (const block of message.content) {
148
154
  if (block.type === 'tool_result') {
149
- // Create tool_result event and enrich with metadata
150
155
  const toolResultEvent = {
151
156
  ...baseEvent,
152
157
  type: 'tool_result',
@@ -156,82 +161,85 @@ class ClaudeAdapter {
156
161
  isError: block.is_error,
157
162
  parentToolUseId: sdkMessage.parent_tool_use_id
158
163
  };
159
- // Enrich with tool metadata
160
- return this.toolMapper.enrichToolResult(toolResultEvent);
164
+ events.push(this.toolMapper.enrichToolResult(toolResultEvent));
161
165
  }
162
166
  }
163
167
  }
168
+ // If we found tool results, return them
169
+ if (events.length > 0) {
170
+ return events;
171
+ }
164
172
  // Otherwise extract text content
165
173
  const textContent = this.extractUserContent(message?.content);
166
174
  if (!textContent) {
167
- return null;
175
+ return [];
168
176
  }
169
- return {
170
- ...baseEvent,
171
- type: 'user_message',
172
- content: textContent,
173
- isSynthetic: sdkMessage.isSynthetic
174
- };
177
+ return [{
178
+ ...baseEvent,
179
+ type: 'user_message',
180
+ content: textContent,
181
+ isSynthetic: sdkMessage.isSynthetic
182
+ }];
175
183
  }
176
184
  // Handle result messages
177
185
  if (sdkMessage.type === 'result') {
178
186
  if (sdkMessage.subtype === 'success') {
179
- return {
180
- ...baseEvent,
181
- type: 'done',
182
- result: sdkMessage.result,
183
- durationMs: sdkMessage.duration_ms,
184
- durationApiMs: sdkMessage.duration_api_ms,
185
- numTurns: sdkMessage.num_turns,
186
- totalCostUsd: sdkMessage.total_cost_usd,
187
- usage: sdkMessage.usage,
188
- modelUsage: sdkMessage.modelUsage,
189
- permissionDenials: sdkMessage.permission_denials
190
- };
187
+ return [{
188
+ ...baseEvent,
189
+ type: 'done',
190
+ result: sdkMessage.result,
191
+ durationMs: sdkMessage.duration_ms,
192
+ durationApiMs: sdkMessage.duration_api_ms,
193
+ numTurns: sdkMessage.num_turns,
194
+ totalCostUsd: sdkMessage.total_cost_usd,
195
+ usage: sdkMessage.usage,
196
+ modelUsage: sdkMessage.modelUsage,
197
+ permissionDenials: sdkMessage.permission_denials
198
+ }];
191
199
  }
192
200
  else {
193
- return {
194
- ...baseEvent,
195
- type: 'error',
196
- message: `Execution failed: ${sdkMessage.subtype}`,
197
- error: { subtype: sdkMessage.subtype },
198
- errorType: sdkMessage.subtype || 'result_error',
199
- context: {
200
- subtype: sdkMessage.subtype,
201
- duration_ms: sdkMessage.duration_ms,
202
- num_turns: sdkMessage.num_turns
203
- },
204
- sdkError: sdkMessage
205
- };
201
+ return [{
202
+ ...baseEvent,
203
+ type: 'error',
204
+ message: `Execution failed: ${sdkMessage.subtype}`,
205
+ error: { subtype: sdkMessage.subtype },
206
+ errorType: sdkMessage.subtype || 'result_error',
207
+ context: {
208
+ subtype: sdkMessage.subtype,
209
+ duration_ms: sdkMessage.duration_ms,
210
+ num_turns: sdkMessage.num_turns
211
+ },
212
+ sdkError: sdkMessage
213
+ }];
206
214
  }
207
215
  }
208
216
  // Handle system messages
209
217
  if (sdkMessage.type === 'system') {
210
218
  if (sdkMessage.subtype === 'init') {
211
- return {
212
- ...baseEvent,
213
- type: 'init',
214
- model: sdkMessage.model,
215
- tools: sdkMessage.tools,
216
- permissionMode: sdkMessage.permissionMode,
217
- cwd: sdkMessage.cwd,
218
- apiKeySource: sdkMessage.apiKeySource,
219
- agents: sdkMessage.agents,
220
- slashCommands: sdkMessage.slash_commands,
221
- outputStyle: sdkMessage.output_style,
222
- mcpServers: sdkMessage.mcp_servers
223
- };
219
+ return [{
220
+ ...baseEvent,
221
+ type: 'init',
222
+ model: sdkMessage.model,
223
+ tools: sdkMessage.tools,
224
+ permissionMode: sdkMessage.permissionMode,
225
+ cwd: sdkMessage.cwd,
226
+ apiKeySource: sdkMessage.apiKeySource,
227
+ agents: sdkMessage.agents,
228
+ slashCommands: sdkMessage.slash_commands,
229
+ outputStyle: sdkMessage.output_style,
230
+ mcpServers: sdkMessage.mcp_servers
231
+ }];
224
232
  }
225
233
  else if (sdkMessage.subtype === 'compact_boundary') {
226
- return {
227
- ...baseEvent,
228
- type: 'compact_boundary',
229
- trigger: sdkMessage.compact_metadata.trigger,
230
- preTokens: sdkMessage.compact_metadata.pre_tokens
231
- };
234
+ return [{
235
+ ...baseEvent,
236
+ type: 'compact_boundary',
237
+ trigger: sdkMessage.compact_metadata.trigger,
238
+ preTokens: sdkMessage.compact_metadata.pre_tokens
239
+ }];
232
240
  }
233
241
  }
234
- return null;
242
+ return [];
235
243
  }
236
244
  createStatusEvent(phase, additionalData) {
237
245
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"claude-adapter.js","sources":["../../../../src/adapters/claude/claude-adapter.ts"],"sourcesContent":["import type { AgentEvent, ArtifactEvent, StatusEvent } 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): StatusEvent {\n return {\n type: 'status',\n ts: Date.now(),\n phase,\n ...additionalData\n };\n }\n\n createArtifactEvent(kind: string, content: any): ArtifactEvent {\n return {\n type: 'artifact',\n ts: Date.now(),\n kind,\n content\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":";;AAKA;;;AAGG;MACU,aAAa,CAAA;IACf,IAAI,GAAG,QAAQ;AAChB,IAAA,UAAU,GAAG,IAAI,gBAAgB,EAAE;AAC3C,IAAA,iBAAiB,CAAC,UAAe,EAAA;QAC/B,OAAO;AACL,YAAA,IAAI,EAAE,eAAe;AACrB,YAAA,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd;SACD;IACH;AAEA,IAAA,SAAS,CAAC,UAAsB,EAAA;QAC9B,MAAM,SAAS,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;;AAGpC,QAAA,IAAI,UAAU,CAAC,IAAI,KAAK,cAAc,EAAE;AACtC,YAAA,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK;AAE9B,YAAA,QAAQ,KAAK,CAAC,IAAI;AAChB,gBAAA,KAAK,eAAe;oBAClB,OAAO;AACL,wBAAA,GAAG,SAAS;AACZ,wBAAA,IAAI,EAAE,eAAe;AACrB,wBAAA,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE;AAC5B,wBAAA,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE;qBACvB;AAEH,gBAAA,KAAK,qBAAqB;AACxB,oBAAA,MAAM,YAAY,GAAG,KAAK,CAAC,aAAa;AACxC,oBAAA,IAAI,CAAC,YAAY;AAAE,wBAAA,OAAO,IAAI;oBAE9B,OAAO;AACL,wBAAA,GAAG,SAAS;AACZ,wBAAA,IAAI,EAAE,qBAAqB;wBAC3B,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,WAAW,EAAE,YAAY,CAAC,IAAwC;AAClE,wBAAA,QAAQ,EAAE,YAAY,CAAC,IAAI,KAAK,UAAU,GAAG,YAAY,CAAC,IAAI,GAAG,SAAS;AAC1E,wBAAA,MAAM,EAAE,YAAY,CAAC,IAAI,KAAK,UAAU,GAAG,YAAY,CAAC,EAAE,GAAG;qBAC9D;AAEH,gBAAA,KAAK,qBAAqB;AACxB,oBAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK;AACzB,oBAAA,IAAI,CAAC,KAAK;AAAE,wBAAA,OAAO,IAAI;AAEvB,oBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE;wBAC/B,OAAO;AACL,4BAAA,GAAG,SAAS;AACZ,4BAAA,IAAI,EAAE,OAAO;4BACb,OAAO,EAAE,KAAK,CAAC,IAAI;AACnB,4BAAA,WAAW,EAAE;yBACd;oBACH;AAAO,yBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE;wBAC5C,OAAO;AACL,4BAAA,GAAG,SAAS;AACZ,4BAAA,IAAI,EAAE,OAAO;4BACb,OAAO,EAAE,KAAK,CAAC,YAAY;AAC3B,4BAAA,WAAW,EAAE;yBACd;oBACH;AAAO,yBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE;wBAC1C,OAAO;AACL,4BAAA,GAAG,SAAS;AACZ,4BAAA,IAAI,EAAE,OAAO;4BACb,OAAO,EAAE,KAAK,CAAC,QAAQ;AACvB,4BAAA,WAAW,EAAE;yBACd;oBACH;AACA,oBAAA,OAAO,IAAI;AAEb,gBAAA,KAAK,oBAAoB;oBACvB,OAAO;AACL,wBAAA,GAAG,SAAS;AACZ,wBAAA,IAAI,EAAE,oBAAoB;wBAC1B,KAAK,EAAE,KAAK,CAAC;qBACd;AAEH,gBAAA,KAAK,eAAe;oBAClB,OAAO;AACL,wBAAA,GAAG,SAAS;AACZ,wBAAA,IAAI,EAAE,eAAe;AACrB,wBAAA,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,WAAW;AACpC,wBAAA,YAAY,EAAE,KAAK,CAAC,KAAK,EAAE,aAAa;AACxC,wBAAA,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG;AACnB,4BAAA,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC;yBAC3B,GAAG;qBACL;AAEH,gBAAA,KAAK,cAAc;oBACjB,OAAO;AACL,wBAAA,GAAG,SAAS;AACZ,wBAAA,IAAI,EAAE;qBACP;AAEH,gBAAA,KAAK,MAAM;;AAET,oBAAA,OAAO,IAAI;AAEb,gBAAA,KAAK,OAAO;oBACV,OAAO;AACL,wBAAA,GAAG,SAAS;AACZ,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe;wBAChD,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,wBAAA,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,IAAI,cAAc;AAC9C,wBAAA,OAAO,EAAE,KAAK,CAAC,KAAK,GAAG;AACrB,4BAAA,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;AACtB,4BAAA,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;yBACvB,GAAG,SAAS;wBACb,QAAQ,EAAE,KAAK,CAAC;qBACjB;AAEH,gBAAA;AACE,oBAAA,OAAO,IAAI;;QAEjB;;AAGA,QAAA,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE;AACnC,YAAA,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO;;AAGlC,YAAA,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AACrD,gBAAA,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE;AACnC,oBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE;;AAE7B,wBAAA,MAAM,aAAa,GAAG;AACpB,4BAAA,GAAG,SAAS;AACZ,4BAAA,IAAI,EAAE,WAAoB;4BAC1B,QAAQ,EAAE,KAAK,CAAC,IAAI;4BACpB,MAAM,EAAE,KAAK,CAAC,EAAE;AAChB,4BAAA,IAAI,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;4BACvB,eAAe,EAAE,UAAU,CAAC;yBAC7B;;wBAED,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,aAAa,CAAC;oBACtD;gBACF;YACF;;YAGA,OAAO;AACL,gBAAA,GAAG,SAAS;AACZ,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAE,mBAAmB;gBAC1B,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,KAAK,EAAE,OAAO,CAAC;aAChB;QACH;;AAGA,QAAA,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE;AAC9B,YAAA,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO;;AAGlC,YAAA,IAAI,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AACtD,gBAAA,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE;AACnC,oBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE;;AAEhC,wBAAA,MAAM,eAAe,GAAG;AACtB,4BAAA,GAAG,SAAS;AACZ,4BAAA,IAAI,EAAE,aAAsB;AAC5B,4BAAA,QAAQ,EAAE,KAAK,CAAC,SAAS,IAAI,SAAS;AACtC,4BAAA,MAAM,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;4BAC/B,MAAM,EAAE,KAAK,CAAC,OAAO;4BACrB,OAAO,EAAE,KAAK,CAAC,QAAQ;4BACvB,eAAe,EAAE,UAAU,CAAC;yBAC7B;;wBAED,OAAO,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,eAAe,CAAC;oBAC1D;gBACF;YACF;;YAGA,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC;YAC7D,IAAI,CAAC,WAAW,EAAE;AAChB,gBAAA,OAAO,IAAI;YACb;YACA,OAAO;AACL,gBAAA,GAAG,SAAS;AACZ,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,OAAO,EAAE,WAAW;gBACpB,WAAW,EAAE,UAAU,CAAC;aACzB;QACH;;AAGA,QAAA,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE;AAChC,YAAA,IAAI,UAAU,CAAC,OAAO,KAAK,SAAS,EAAE;gBACpC,OAAO;AACL,oBAAA,GAAG,SAAS;AACZ,oBAAA,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,UAAU,EAAE,UAAU,CAAC,WAAW;oBAClC,aAAa,EAAE,UAAU,CAAC,eAAe;oBACzC,QAAQ,EAAE,UAAU,CAAC,SAAS;oBAC9B,YAAY,EAAE,UAAU,CAAC,cAAc;oBACvC,KAAK,EAAE,UAAU,CAAC,KAAK;oBACvB,UAAU,EAAE,UAAU,CAAC,UAAU;oBACjC,iBAAiB,EAAE,UAAU,CAAC;iBAC/B;YACH;iBAAO;gBACL,OAAO;AACL,oBAAA,GAAG,SAAS;AACZ,oBAAA,IAAI,EAAE,OAAO;AACb,oBAAA,OAAO,EAAE,CAAA,kBAAA,EAAqB,UAAU,CAAC,OAAO,CAAA,CAAE;AAClD,oBAAA,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE;AACtC,oBAAA,SAAS,EAAE,UAAU,CAAC,OAAO,IAAI,cAAc;AAC/C,oBAAA,OAAO,EAAE;wBACP,OAAO,EAAE,UAAU,CAAC,OAAO;wBAC3B,WAAW,EAAE,UAAU,CAAC,WAAW;wBACnC,SAAS,EAAE,UAAU,CAAC;AACvB,qBAAA;AACD,oBAAA,QAAQ,EAAE;iBACX;YACH;QACF;;AAGA,QAAA,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE;AAChC,YAAA,IAAI,UAAU,CAAC,OAAO,KAAK,MAAM,EAAE;gBACjC,OAAO;AACL,oBAAA,GAAG,SAAS;AACZ,oBAAA,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,UAAU,CAAC,KAAK;oBACvB,KAAK,EAAE,UAAU,CAAC,KAAK;oBACvB,cAAc,EAAE,UAAU,CAAC,cAAc;oBACzC,GAAG,EAAE,UAAU,CAAC,GAAG;oBACnB,YAAY,EAAE,UAAU,CAAC,YAAY;oBACrC,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,aAAa,EAAE,UAAU,CAAC,cAAc;oBACxC,WAAW,EAAE,UAAU,CAAC,YAAY;oBACpC,UAAU,EAAE,UAAU,CAAC;iBACxB;YACH;AAAO,iBAAA,IAAI,UAAU,CAAC,OAAO,KAAK,kBAAkB,EAAE;gBACpD,OAAO;AACL,oBAAA,GAAG,SAAS;AACZ,oBAAA,IAAI,EAAE,kBAAkB;AACxB,oBAAA,OAAO,EAAE,UAAU,CAAC,gBAAgB,CAAC,OAAO;AAC5C,oBAAA,SAAS,EAAE,UAAU,CAAC,gBAAgB,CAAC;iBACxC;YACH;QACF;AAEA,QAAA,OAAO,IAAI;IACb;IAEA,iBAAiB,CAAC,KAAa,EAAE,cAAoB,EAAA;QACnD,OAAO;AACL,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,KAAK;AACL,YAAA,GAAG;SACJ;IACH;IAEA,mBAAmB,CAAC,IAAY,EAAE,OAAY,EAAA;QAC5C,OAAO;AACL,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,IAAI;YACJ;SACD;IACH;AAEQ,IAAA,kBAAkB,CAAC,OAAgB,EAAA;QACzC,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC/B,YAAA,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE;AAC9B,YAAA,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI;QAC5C;AAEA,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAC1B,MAAM,KAAK,GAAa,EAAE;AAC1B,YAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;gBAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;gBAChD,IAAI,SAAS,EAAE;AACb,oBAAA,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;gBACvB;AAAO,qBAAA,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;oBAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAgC,CAAC;oBAC1E,IAAI,SAAS,EAAE;AACb,wBAAA,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;oBACvB;gBACF;YACF;YACA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;AACpC,YAAA,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI;QACtC;AAEA,QAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC/B,YAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,OAAkC,CAAC;QACnE;AAEA,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,iBAAiB,CAAC,KAA8B,EAAA;AACtD,QAAA,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC;AACvF,QAAA,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE;YAC/B,IAAI,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE;gBAClC,MAAM,OAAO,GAAI,KAAK,CAAC,GAAG,CAAY,CAAC,IAAI,EAAE;AAC7C,gBAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AACtB,oBAAA,OAAO,OAAO;gBAChB;YACF;QACF;QAEA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YACxC,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;YAChD,IAAI,SAAS,EAAE;AACb,gBAAA,OAAO,SAAS;YAClB;QACF;AAEA,QAAA,OAAO,IAAI;IACb;AACD;;;;"}
1
+ {"version":3,"file":"claude-adapter.js","sources":["../../../../src/adapters/claude/claude-adapter.ts"],"sourcesContent":["import type { AgentEvent, ArtifactEvent, StatusEvent } 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[] {\n const baseEvent = { ts: Date.now() };\n\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 [];\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 [];\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 [];\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 [];\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 [];\n }\n }\n\n // Handle assistant messages (full message, not streaming)\n if (sdkMessage.type === 'assistant') {\n const message = sdkMessage.message;\n const events: AgentEvent[] = [];\n\n // Extract tool calls from content blocks\n // A single assistant message can contain multiple tool_use 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 and add to events array\n events.push(this.toolMapper.enrichToolCall(toolCallEvent));\n }\n }\n }\n\n // If we found tool calls, return them\n if (events.length > 0) {\n return events;\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 const events: AgentEvent[] = [];\n\n // Check for tool results in content blocks, A single user message can contain multiple tool_result blocks\n if (message?.content && Array.isArray(message.content)) { \n for (const block of message.content) {\n if (block.type === 'tool_result') {\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 events.push(this.toolMapper.enrichToolResult(toolResultEvent));\n }\n }\n }\n\n // If we found tool results, return them\n if (events.length > 0) {\n return events;\n }\n\n // Otherwise extract text content\n const textContent = this.extractUserContent(message?.content);\n if (!textContent) {\n return [];\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 [];\n }\n \n createStatusEvent(phase: string, additionalData?: any): StatusEvent {\n return {\n type: 'status',\n ts: Date.now(),\n phase,\n ...additionalData\n };\n }\n\n createArtifactEvent(kind: string, content: any): ArtifactEvent {\n return {\n type: 'artifact',\n ts: Date.now(),\n kind,\n content\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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"}
@@ -10,10 +10,10 @@ export interface ProviderAdapter {
10
10
  /** Provider name (e.g., 'claude', 'gemini') */
11
11
  name: string;
12
12
  /**
13
- * Transform a provider-specific SDK message into an AgentEvent.
14
- * Returns null if the message should be ignored.
13
+ * Transform a provider-specific SDK message into one or more AgentEvents.
14
+ * Returns an array of events (can be empty if the message should be ignored).
15
15
  */
16
- transform(sdkMessage: unknown): AgentEvent | null;
16
+ transform(sdkMessage: unknown): AgentEvent[];
17
17
  /**
18
18
  * Create a standardized status event.
19
19
  * Used for task phase transitions and other status updates.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE1E;;;;;;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,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,aAAa,CAAC;IAE/D;;;OAGG;IACH,iBAAiB,CAAC,UAAU,EAAE,GAAG,GAAG,UAAU,CAAC;CAChD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE1E;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,SAAS,CAAC,UAAU,EAAE,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7C;;;OAGG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,GAAG,GAAG,WAAW,CAAC;IAEpE;;;OAGG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,aAAa,CAAC;IAE/D;;;OAGG;IACH,iBAAiB,CAAC,UAAU,EAAE,GAAG,GAAG,UAAU,CAAC;CAChD"}
@@ -47,7 +47,7 @@ export declare class Agent {
47
47
  commitPlan(taskId: string, taskTitle: string): Promise<string>;
48
48
  createImplementationBranch(taskId: string, planningBranchName?: string): Promise<string>;
49
49
  commitImplementation(taskId: string, taskTitle: string, planSummary?: string): Promise<string>;
50
- createPullRequest(taskId: string, branchName: string, taskTitle: string, taskDescription: string): Promise<string>;
50
+ createPullRequest(taskId: string, branchName: string, taskTitle: string, taskDescription: string, customBody?: string): Promise<string>;
51
51
  attachPullRequestToTask(taskId: string, prUrl: string, branchName?: string): Promise<void>;
52
52
  updateTaskBranch(taskId: string, branchName: string): Promise<void>;
53
53
  cancelTask(taskId: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/src/agent.js CHANGED
@@ -187,10 +187,9 @@ class Agent {
187
187
  this.logger.debug('Received message in direct run', message);
188
188
  // Emit raw SDK event
189
189
  this.emitEvent(this.adapter.createRawSDKEvent(message));
190
- // Emit transformed event
191
- const transformedEvent = this.adapter.transform(message);
192
- if (transformedEvent) {
193
- this.emitEvent(transformedEvent);
190
+ const transformedEvents = this.adapter.transform(message);
191
+ for (const event of transformedEvents) {
192
+ this.emitEvent(event);
194
193
  }
195
194
  results.push(message);
196
195
  }
@@ -263,10 +262,9 @@ class Agent {
263
262
  this.logger.debug('Implementation committed', { taskId, commitHash });
264
263
  return commitHash;
265
264
  }
266
- async createPullRequest(taskId, branchName, taskTitle, taskDescription) {
265
+ async createPullRequest(taskId, branchName, taskTitle, taskDescription, customBody) {
267
266
  this.logger.info('Creating pull request', { taskId, branchName, taskTitle });
268
- // Build PR body
269
- const prBody = `## Task Details
267
+ const defaultBody = `## Task Details
270
268
  **Task ID**: ${taskId}
271
269
  **Description**: ${taskDescription}
272
270
 
@@ -274,6 +272,7 @@ class Agent {
274
272
  This PR implements the changes described in the task.
275
273
 
276
274
  Generated by PostHog Agent`;
275
+ const prBody = customBody || defaultBody;
277
276
  const prUrl = await this.gitManager.createPullRequest(branchName, taskTitle, prBody);
278
277
  this.logger.info('Pull request created', { taskId, prUrl });
279
278
  return prUrl;
@@ -375,7 +374,9 @@ Generated by PostHog Agent`;
375
374
  return;
376
375
  }
377
376
  const branchName = await this.gitManager.getCurrentBranch();
378
- const prUrl = await this.createPullRequest(task.id, branchName, task.title, task.description ?? '');
377
+ const finalizeResult = stepResults['finalize'];
378
+ const prBody = finalizeResult?.prBody;
379
+ const prUrl = await this.createPullRequest(task.id, branchName, task.title, task.description ?? '', prBody);
379
380
  this.emitEvent(this.adapter.createStatusEvent('pr_created', { prUrl }));
380
381
  try {
381
382
  await this.attachPullRequestToTask(task.id, prUrl, branchName);