11import type { SDKMessage } from "@anthropic-ai/claude-agent-sdk" ;
22
33import type { AgentRuntimeEvent } from "../../../../shared/agent-runtime/events.js" ;
4- import type { RunActor } from "../../../../shared/agent-runtime/events.js" ;
54import type { ClaudeTraceState } from "./types.js" ;
5+ import {
6+ actorForClaudeHelper ,
7+ actorForClaudeMessage ,
8+ parentToolUseIdFromClaudeMessage ,
9+ rememberClaudeHelper ,
10+ } from "./actors.js" ;
11+ import {
12+ promptFromClaudeAgentInput ,
13+ stringifyClaudeInput ,
14+ stringifyClaudeToolResult ,
15+ textDeltaFromClaudeStreamEvent ,
16+ } from "./content.js" ;
17+
18+ export { getClaudeSessionId , rootClaudeActor } from "./actors.js" ;
619
720export function toClaudeAgentRuntimeEvents (
821 message : SDKMessage ,
@@ -14,7 +27,7 @@ export function toClaudeAgentRuntimeEvents(
1427) : AgentRuntimeEvent [ ] {
1528 const actor = actorForClaudeMessage ( message , trace ) ;
1629 if ( message . type === "stream_event" ) {
17- const text = getTextDelta ( message . event ) ;
30+ const text = textDeltaFromClaudeStreamEvent ( message . event ) ;
1831 return text !== undefined ? [ { type : "text_delta" , content : text , actor } ] : [ ] ;
1932 }
2033
@@ -32,14 +45,14 @@ export function toClaudeAgentRuntimeEvents(
3245 type : "tool_use" ,
3346 id : block . id ,
3447 tool : block . name ,
35- input : stringifyInput ( block . input ) ,
48+ input : stringifyClaudeInput ( block . input ) ,
3649 actor,
3750 providerEventId : message . uuid ,
38- providerParentToolUseId : parentToolUseIdFromMessage ( message ) ?? undefined ,
51+ providerParentToolUseId :
52+ parentToolUseIdFromClaudeMessage ( message ) ?? undefined ,
3953 } ) ;
4054 if ( block . name === "Agent" ) {
41- trace . agentParents [ block . id ] = trace . sessionId ?? null ;
42- trace . agentLabels [ block . id ] = helperLabel ( trace , block . id ) ;
55+ rememberClaudeHelper ( trace , block . id , trace . sessionId ?? null ) ;
4356 events . push ( {
4457 type : "agent_spawned" ,
4558 parentThreadId : trace . sessionId ?? "" ,
@@ -66,7 +79,8 @@ export function toClaudeAgentRuntimeEvents(
6679 isError : block . is_error ,
6780 actor,
6881 providerEventId : message . uuid ,
69- providerParentToolUseId : parentToolUseIdFromMessage ( message ) ?? undefined ,
82+ providerParentToolUseId :
83+ parentToolUseIdFromClaudeMessage ( message ) ?? undefined ,
7084 } ,
7185 ] ;
7286 if (
@@ -80,7 +94,7 @@ export function toClaudeAgentRuntimeEvents(
8094 threadId : block . tool_use_id ,
8195 parentThreadId :
8296 trace . agentParents [ block . tool_use_id ] ?? trace . sessionId ?? null ,
83- result : stringifyToolResult ( block . content ) ,
97+ result : stringifyClaudeToolResult ( block . content ) ,
8498 actor : helperActor ,
8599 } ) ;
86100 }
@@ -98,103 +112,3 @@ export function toClaudeAgentRuntimeEvents(
98112
99113 return [ ] ;
100114}
101-
102- export function rootClaudeActor ( sessionId : string | undefined ) : RunActor {
103- return {
104- threadId : sessionId ?? null ,
105- role : sessionId === undefined ? "unknown" : "root" ,
106- confidence : sessionId === undefined ? "unknown" : "provider" ,
107- label : sessionId === undefined ? "Unknown actor" : "Main" ,
108- } ;
109- }
110-
111- export function getClaudeSessionId ( message : SDKMessage ) : string | undefined {
112- return "session_id" in message && typeof message . session_id === "string"
113- ? message . session_id
114- : undefined ;
115- }
116-
117- function actorForClaudeMessage (
118- message : SDKMessage ,
119- trace : ClaudeTraceState ,
120- ) : RunActor {
121- const sessionId = getClaudeSessionId ( message ) ?? trace . sessionId ;
122- trace . sessionId = trace . sessionId ?? sessionId ;
123- const parentToolUseId = parentToolUseIdFromMessage ( message ) ;
124- if ( parentToolUseId === null ) {
125- return rootClaudeActor ( sessionId ) ;
126- }
127- trace . agentParents [ parentToolUseId ] =
128- trace . agentParents [ parentToolUseId ] ?? sessionId ?? null ;
129- trace . agentLabels [ parentToolUseId ] =
130- trace . agentLabels [ parentToolUseId ] ?? helperLabel ( trace , parentToolUseId ) ;
131- return {
132- threadId : parentToolUseId ,
133- role : "helper" ,
134- parentThreadId : trace . agentParents [ parentToolUseId ] ?? null ,
135- confidence : "derived" ,
136- label : trace . agentLabels [ parentToolUseId ] ,
137- } ;
138- }
139-
140- function actorForClaudeHelper ( trace : ClaudeTraceState , toolUseId : string ) : RunActor {
141- return {
142- threadId : toolUseId ,
143- role : "helper" ,
144- parentThreadId : trace . agentParents [ toolUseId ] ?? trace . sessionId ?? null ,
145- confidence : "derived" ,
146- label : trace . agentLabels [ toolUseId ] ?? helperLabel ( trace , toolUseId ) ,
147- } ;
148- }
149-
150- function stringifyToolResult ( content : unknown ) : string {
151- if ( typeof content === "string" ) return content ;
152- return stringifyInput ( content ) ?? "" ;
153- }
154-
155- function parentToolUseIdFromMessage ( message : SDKMessage ) : string | null {
156- if ( ! ( "parent_tool_use_id" in message ) ) return null ;
157- const value = message . parent_tool_use_id ;
158- return typeof value === "string" && value . length > 0 ? value : null ;
159- }
160-
161- function helperLabel ( trace : ClaudeTraceState , id : string ) : string {
162- const existing = trace . agentLabels [ id ] ;
163- if ( existing !== undefined ) return existing ;
164- const label = `Helper ${ Object . keys ( trace . agentLabels ) . length + 1 } ` ;
165- trace . agentLabels [ id ] = label ;
166- return label ;
167- }
168-
169- function promptFromClaudeAgentInput ( input : unknown ) : string {
170- if ( input !== null && typeof input === "object" ) {
171- const prompt = ( input as { prompt ?: unknown } ) . prompt ;
172- if ( typeof prompt === "string" ) return prompt ;
173- const description = ( input as { description ?: unknown } ) . description ;
174- if ( typeof description === "string" ) return description ;
175- }
176- return "" ;
177- }
178-
179- function getTextDelta ( event : unknown ) : string | undefined {
180- if ( event === null || typeof event !== "object" ) return undefined ;
181- const raw = event as {
182- type ?: unknown ;
183- delta ?: { type ?: unknown ; text ?: unknown } ;
184- } ;
185- return raw . type === "content_block_delta" &&
186- raw . delta ?. type === "text_delta" &&
187- typeof raw . delta . text === "string"
188- ? raw . delta . text
189- : undefined ;
190- }
191-
192- function stringifyInput ( input : unknown ) : string | undefined {
193- if ( input === undefined ) return undefined ;
194- if ( typeof input === "string" ) return input ;
195- try {
196- return JSON . stringify ( input ) ;
197- } catch {
198- return String ( input ) ;
199- }
200- }
0 commit comments