@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.
Files changed (54) hide show
  1. package/README.md +8 -5
  2. package/dist/index.d.ts +5 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +2 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/src/adapters/claude/claude-adapter.d.ts +17 -0
  7. package/dist/src/adapters/claude/claude-adapter.d.ts.map +1 -0
  8. package/dist/src/{event-transformer.js → adapters/claude/claude-adapter.js} +34 -10
  9. package/dist/src/adapters/claude/claude-adapter.js.map +1 -0
  10. package/dist/src/adapters/claude/tool-mapper.d.ts +19 -0
  11. package/dist/src/adapters/claude/tool-mapper.d.ts.map +1 -0
  12. package/dist/src/adapters/claude/tool-mapper.js +44 -0
  13. package/dist/src/adapters/claude/tool-mapper.js.map +1 -0
  14. package/dist/src/adapters/types.d.ts +28 -0
  15. package/dist/src/adapters/types.d.ts.map +1 -0
  16. package/dist/src/agent.d.ts +1 -1
  17. package/dist/src/agent.d.ts.map +1 -1
  18. package/dist/src/agent.js +61 -44
  19. package/dist/src/agent.js.map +1 -1
  20. package/dist/src/posthog-api.d.ts +16 -57
  21. package/dist/src/posthog-api.d.ts.map +1 -1
  22. package/dist/src/posthog-api.js +38 -38
  23. package/dist/src/posthog-api.js.map +1 -1
  24. package/dist/src/stage-executor.d.ts +1 -1
  25. package/dist/src/stage-executor.d.ts.map +1 -1
  26. package/dist/src/stage-executor.js +7 -7
  27. package/dist/src/stage-executor.js.map +1 -1
  28. package/dist/src/task-progress-reporter.d.ts +2 -7
  29. package/dist/src/task-progress-reporter.d.ts.map +1 -1
  30. package/dist/src/task-progress-reporter.js +37 -55
  31. package/dist/src/task-progress-reporter.js.map +1 -1
  32. package/dist/src/tools/registry.d.ts +25 -0
  33. package/dist/src/tools/registry.d.ts.map +1 -0
  34. package/dist/src/tools/registry.js +120 -0
  35. package/dist/src/tools/registry.js.map +1 -0
  36. package/dist/src/tools/types.d.ts +80 -0
  37. package/dist/src/tools/types.d.ts.map +1 -0
  38. package/dist/src/types.d.ts +65 -15
  39. package/dist/src/types.d.ts.map +1 -1
  40. package/dist/src/types.js.map +1 -1
  41. package/package.json +1 -1
  42. package/src/{event-transformer.ts → adapters/claude/claude-adapter.ts} +40 -16
  43. package/src/adapters/claude/tool-mapper.ts +46 -0
  44. package/src/adapters/types.ts +31 -0
  45. package/src/agent.ts +64 -41
  46. package/src/posthog-api.ts +57 -92
  47. package/src/stage-executor.ts +11 -11
  48. package/src/task-progress-reporter.ts +38 -63
  49. package/src/tools/registry.ts +129 -0
  50. package/src/tools/types.ts +127 -0
  51. package/src/types.ts +73 -20
  52. package/dist/src/event-transformer.d.ts +0 -10
  53. package/dist/src/event-transformer.d.ts.map +0 -1
  54. 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 `TaskProgress` records for easy polling
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 `TaskProgress` model, so UIs can poll for updates without relying on streaming hooks:
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 progress = await agent.getPostHogClient()?.getTaskProgress(taskId);
110
- if (progress?.has_progress) {
111
- renderProgress(progress.status, progress.current_step, progress.completed_steps, progress.total_steps);
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
@@ -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
- class EventTransformer {
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
- // Return first tool_call event found
112
- return {
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
- return {
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 { EventTransformer };
271
- //# sourceMappingURL=event-transformer.js.map
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":";;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;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;;;;"}
@@ -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"}
@@ -9,7 +9,7 @@ export declare class Agent {
9
9
  private fileManager;
10
10
  private gitManager;
11
11
  private templateManager;
12
- private eventTransformer;
12
+ private adapter;
13
13
  private logger;
14
14
  private agentRegistry;
15
15
  private workflowRegistry;
@@ -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
@@ -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 { EventTransformer } from './event-transformer.js';
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
- eventTransformer;
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
- this.eventTransformer = new EventTransformer();
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/stage before execution', { error: e.message });
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.eventTransformer.createStatusEvent('no_next_stage', { stage: finalStageKey }));
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 the beginning
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.updateTaskStage(task.id, targetStage.id);
177
- task.current_stage = targetStage.id;
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.eventTransformer.createStatusEvent('stage_start', { stage: stage.key }));
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.eventTransformer.createStatusEvent('branch_created', { stage: stage.key, branch: planningBranch }));
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.eventTransformer.createStatusEvent('branch_created', { stage: stage.key, branch: implBranch }));
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.eventTransformer.createStatusEvent('commit_made', { stage: stage.key, kind: 'plan' }));
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.eventTransformer.createStatusEvent('branch_created', { stage: stage.key, branch: implBranch }));
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.eventTransformer.createStatusEvent('pr_created', { stage: stage.key, prUrl }));
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.eventTransformer.createStatusEvent('stage_complete', { stage: stage.key }));
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.eventTransformer.createStatusEvent('commit_made', { stage: stage.key, kind: 'implementation' }));
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.eventTransformer.createStatusEvent('pr_created', { stage: stage.key, prUrl }));
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.eventTransformer.createStatusEvent('stage_complete', { stage: stage.key }));
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.progressTask(taskId, { auto: true });
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 task', {
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.eventTransformer.createStatusEvent('no_next_stage', { stage: currentStageKey }));
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.eventTransformer.createRawSDKEvent(message));
335
+ this.emitEvent(this.adapter.createRawSDKEvent(message));
325
336
  // Emit transformed event
326
- const transformedEvent = this.eventTransformer.transform(message);
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
- await this.posthogAPI.attachTaskPullRequest(taskId, prUrl, branchName);
426
- this.logger.debug('PR attached to task', { taskId, prUrl });
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 task branch.');
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.setTaskBranch(taskId, branchName);
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) {