MCPcopy Create free account
hub / github.com/WJX20/claude-code / convertSDKMessage

Function convertSDKMessage

src/remote/sdkMessageAdapter.ts:169–282  ·  view source on GitHub ↗
(
  msg: SDKMessage,
  opts?: ConvertOptions,
)

Source from the content-addressed store, hash-verified

167 * Convert an SDKMessage to REPL message format
168 */
169export function convertSDKMessage(
170 msg: SDKMessage,
171 opts?: ConvertOptions,
172): ConvertedMessage {
173 switch (msg.type) {
174 case 'assistant':
175 return { type: 'message', message: convertAssistantMessage(msg as SDKAssistantMessage) }
176
177 case 'user': {
178 const userMsg = msg as SDKUserMessage
179 const content = userMsg.message?.content
180 // Tool result messages from the remote server need to be converted so
181 // they render and collapse like local tool results. Detect via content
182 // shape (tool_result blocks) — parent_tool_use_id is NOT reliable: the
183 // agent-side normalizeMessage() hardcodes it to null for top-level
184 // tool results, so it can't distinguish tool results from prompt echoes.
185 const isToolResult =
186 Array.isArray(content) && content.some(b => b.type === 'tool_result')
187 if (opts?.convertToolResults && isToolResult) {
188 return {
189 type: 'message',
190 message: createUserMessage({
191 content,
192 toolUseResult: userMsg.tool_use_result,
193 uuid: userMsg.uuid,
194 timestamp: userMsg.timestamp,
195 }),
196 }
197 }
198 // When converting historical events, user-typed messages need to be
199 // rendered (they weren't added locally by the REPL). Skip tool_results
200 // here — already handled above.
201 if (opts?.convertUserTextMessages && !isToolResult) {
202 if (typeof content === 'string' || Array.isArray(content)) {
203 return {
204 type: 'message',
205 message: createUserMessage({
206 content,
207 toolUseResult: userMsg.tool_use_result,
208 uuid: userMsg.uuid,
209 timestamp: userMsg.timestamp,
210 }),
211 }
212 }
213 }
214 // User-typed messages (string content) are already added locally by REPL.
215 // In CCR mode, all user messages are ignored (tool results handled differently).
216 return { type: 'ignored' }
217 }
218
219 case 'stream_event':
220 return { type: 'stream_event', event: convertStreamEvent(msg as SDKPartialAssistantMessage) }
221
222 case 'result':
223 // Only show result messages for errors. Success results are noise
224 // in multi-turn sessions (isLoading=false is sufficient signal).
225 if ((msg as SDKResultMessage).subtype !== 'success') {
226 return { type: 'message', message: convertResultMessage(msg as SDKResultMessage) }

Callers 4

pageToMessagesFunction · 0.85
useRemoteSessionFunction · 0.85
useSSHSessionFunction · 0.85
useDirectConnectFunction · 0.85

Calls 9

convertAssistantMessageFunction · 0.85
createUserMessageFunction · 0.85
convertStreamEventFunction · 0.85
convertResultMessageFunction · 0.85
convertInitMessageFunction · 0.85
convertStatusMessageFunction · 0.85
logForDebuggingFunction · 0.85

Tested by

no test coverage detected