63 lines
1.5 KiB
TypeScript
63 lines
1.5 KiB
TypeScript
/**
|
|
* Tool extraction utilities for parsing tool calls and results from JSONL content blocks.
|
|
*/
|
|
|
|
import type { ContentBlock, ToolCall, ToolResult } from '../types';
|
|
|
|
/**
|
|
* Extract tool calls from content blocks.
|
|
*/
|
|
export function extractToolCalls(content: ContentBlock[] | string): ToolCall[] {
|
|
if (typeof content === 'string') {
|
|
return [];
|
|
}
|
|
|
|
const toolCalls: ToolCall[] = [];
|
|
|
|
for (const block of content) {
|
|
if (block.type === 'tool_use' && block.id && block.name) {
|
|
const input = block.input ?? {};
|
|
const isTask = block.name === 'Task';
|
|
|
|
const toolCall: ToolCall = {
|
|
id: block.id,
|
|
name: block.name,
|
|
input,
|
|
isTask,
|
|
};
|
|
|
|
// Extract Task-specific info
|
|
if (isTask) {
|
|
toolCall.taskDescription = input.description as string | undefined;
|
|
toolCall.taskSubagentType = input.subagent_type as string | undefined;
|
|
}
|
|
|
|
toolCalls.push(toolCall);
|
|
}
|
|
}
|
|
|
|
return toolCalls;
|
|
}
|
|
|
|
/**
|
|
* Extract tool results from content blocks.
|
|
*/
|
|
export function extractToolResults(content: ContentBlock[] | string): ToolResult[] {
|
|
if (typeof content === 'string') {
|
|
return [];
|
|
}
|
|
|
|
const toolResults: ToolResult[] = [];
|
|
|
|
for (const block of content) {
|
|
if (block.type === 'tool_result' && block.tool_use_id) {
|
|
toolResults.push({
|
|
toolUseId: block.tool_use_id,
|
|
content: block.content ?? '',
|
|
isError: block.is_error ?? false,
|
|
});
|
|
}
|
|
}
|
|
|
|
return toolResults;
|
|
}
|