| import type { |
| SDKAssistantMessage, |
| SDKCompactBoundaryMessage, |
| SDKMessage, |
| SDKPartialAssistantMessage, |
| SDKResultMessage, |
| SDKStatusMessage, |
| SDKSystemMessage, |
| SDKToolProgressMessage, |
| } from '../entrypoints/agentSdkTypes.js' |
| import type { |
| AssistantMessage, |
| Message, |
| StreamEvent, |
| SystemMessage, |
| } from '../types/message.js' |
| import { logForDebugging } from '../utils/debug.js' |
| import { fromSDKCompactMetadata } from '../utils/messages/mappers.js' |
| import { createUserMessage } from '../utils/messages.js' |
|
|
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| function convertAssistantMessage(msg: SDKAssistantMessage): AssistantMessage { |
| return { |
| type: 'assistant', |
| message: msg.message, |
| uuid: msg.uuid, |
| requestId: undefined, |
| timestamp: new Date().toISOString(), |
| error: msg.error, |
| } |
| } |
|
|
| |
| |
| |
| function convertStreamEvent(msg: SDKPartialAssistantMessage): StreamEvent { |
| return { |
| type: 'stream_event', |
| event: msg.event, |
| } |
| } |
|
|
| |
| |
| |
| function convertResultMessage(msg: SDKResultMessage): SystemMessage { |
| const isError = msg.subtype !== 'success' |
| const content = isError |
| ? msg.errors?.join(', ') || 'Unknown error' |
| : 'Session completed successfully' |
|
|
| return { |
| type: 'system', |
| subtype: 'informational', |
| content, |
| level: isError ? 'warning' : 'info', |
| uuid: msg.uuid, |
| timestamp: new Date().toISOString(), |
| } |
| } |
|
|
| |
| |
| |
| function convertInitMessage(msg: SDKSystemMessage): SystemMessage { |
| return { |
| type: 'system', |
| subtype: 'informational', |
| content: `Remote session initialized (model: ${msg.model})`, |
| level: 'info', |
| uuid: msg.uuid, |
| timestamp: new Date().toISOString(), |
| } |
| } |
|
|
| |
| |
| |
| function convertStatusMessage(msg: SDKStatusMessage): SystemMessage | null { |
| if (!msg.status) { |
| return null |
| } |
|
|
| return { |
| type: 'system', |
| subtype: 'informational', |
| content: |
| msg.status === 'compacting' |
| ? 'Compacting conversation…' |
| : `Status: ${msg.status}`, |
| level: 'info', |
| uuid: msg.uuid, |
| timestamp: new Date().toISOString(), |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| function convertToolProgressMessage( |
| msg: SDKToolProgressMessage, |
| ): SystemMessage { |
| return { |
| type: 'system', |
| subtype: 'informational', |
| content: `Tool ${msg.tool_name} running for ${msg.elapsed_time_seconds}s…`, |
| level: 'info', |
| uuid: msg.uuid, |
| timestamp: new Date().toISOString(), |
| toolUseID: msg.tool_use_id, |
| } |
| } |
|
|
| |
| |
| |
| function convertCompactBoundaryMessage( |
| msg: SDKCompactBoundaryMessage, |
| ): SystemMessage { |
| return { |
| type: 'system', |
| subtype: 'compact_boundary', |
| content: 'Conversation compacted', |
| level: 'info', |
| uuid: msg.uuid, |
| timestamp: new Date().toISOString(), |
| compactMetadata: fromSDKCompactMetadata(msg.compact_metadata), |
| } |
| } |
|
|
| |
| |
| |
| export type ConvertedMessage = |
| | { type: 'message'; message: Message } |
| | { type: 'stream_event'; event: StreamEvent } |
| | { type: 'ignored' } |
|
|
| type ConvertOptions = { |
| |
| |
| |
| |
| convertToolResults?: boolean |
| |
| |
| |
| |
| |
| |
| convertUserTextMessages?: boolean |
| } |
|
|
| |
| |
| |
| export function convertSDKMessage( |
| msg: SDKMessage, |
| opts?: ConvertOptions, |
| ): ConvertedMessage { |
| switch (msg.type) { |
| case 'assistant': |
| return { type: 'message', message: convertAssistantMessage(msg) } |
|
|
| case 'user': { |
| const content = msg.message?.content |
| |
| |
| |
| |
| |
| const isToolResult = |
| Array.isArray(content) && content.some(b => b.type === 'tool_result') |
| if (opts?.convertToolResults && isToolResult) { |
| return { |
| type: 'message', |
| message: createUserMessage({ |
| content, |
| toolUseResult: msg.tool_use_result, |
| uuid: msg.uuid, |
| timestamp: msg.timestamp, |
| }), |
| } |
| } |
| |
| |
| |
| if (opts?.convertUserTextMessages && !isToolResult) { |
| if (typeof content === 'string' || Array.isArray(content)) { |
| return { |
| type: 'message', |
| message: createUserMessage({ |
| content, |
| toolUseResult: msg.tool_use_result, |
| uuid: msg.uuid, |
| timestamp: msg.timestamp, |
| }), |
| } |
| } |
| } |
| |
| |
| return { type: 'ignored' } |
| } |
|
|
| case 'stream_event': |
| return { type: 'stream_event', event: convertStreamEvent(msg) } |
|
|
| case 'result': |
| |
| |
| if (msg.subtype !== 'success') { |
| return { type: 'message', message: convertResultMessage(msg) } |
| } |
| return { type: 'ignored' } |
|
|
| case 'system': |
| if (msg.subtype === 'init') { |
| return { type: 'message', message: convertInitMessage(msg) } |
| } |
| if (msg.subtype === 'status') { |
| const statusMsg = convertStatusMessage(msg) |
| return statusMsg |
| ? { type: 'message', message: statusMsg } |
| : { type: 'ignored' } |
| } |
| if (msg.subtype === 'compact_boundary') { |
| return { |
| type: 'message', |
| message: convertCompactBoundaryMessage(msg), |
| } |
| } |
| |
| logForDebugging( |
| `[sdkMessageAdapter] Ignoring system message subtype: ${msg.subtype}`, |
| ) |
| return { type: 'ignored' } |
|
|
| case 'tool_progress': |
| return { type: 'message', message: convertToolProgressMessage(msg) } |
|
|
| case 'auth_status': |
| |
| logForDebugging('[sdkMessageAdapter] Ignoring auth_status message') |
| return { type: 'ignored' } |
|
|
| case 'tool_use_summary': |
| |
| logForDebugging('[sdkMessageAdapter] Ignoring tool_use_summary message') |
| return { type: 'ignored' } |
|
|
| case 'rate_limit_event': |
| |
| logForDebugging('[sdkMessageAdapter] Ignoring rate_limit_event message') |
| return { type: 'ignored' } |
|
|
| default: { |
| |
| |
| |
| logForDebugging( |
| `[sdkMessageAdapter] Unknown message type: ${(msg as { type: string }).type}`, |
| ) |
| return { type: 'ignored' } |
| } |
| } |
| } |
|
|
| |
| |
| |
| export function isSessionEndMessage(msg: SDKMessage): boolean { |
| return msg.type === 'result' |
| } |
|
|
| |
| |
| |
| export function isSuccessResult(msg: SDKResultMessage): boolean { |
| return msg.subtype === 'success' |
| } |
|
|
| |
| |
| |
| export function getResultText(msg: SDKResultMessage): string | null { |
| if (msg.subtype === 'success') { |
| return msg.result |
| } |
| return null |
| } |
|
|