File size: 2,620 Bytes
0b9dc2e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import type { ToolCallBlock, ToolResultBlock } from '@agentscope-ai/agentscope/message';
import type { ReactNode } from 'react';

import { BashRenderer } from './BashRenderer';
import {
	defaultGetDisplayName,
	defaultRenderCallArgs,
	defaultRenderConfirmBody,
	defaultRenderGroup,
	defaultRenderResult,
} from './DefaultRenderer';
import { EditRenderer } from './EditRenderer';
import { GlobRenderer } from './GlobRenderer';
import { GrepRenderer } from './GrepRenderer';
import { ReadRenderer } from './ReadRenderer';
import { TaskCreateRenderer } from './TaskCreateRenderer';
import type { TFunction, ToolCallWithResult, ToolRenderer } from './types';
import { WriteRenderer } from './WriteRenderer';

const renderers: Record<string, ToolRenderer> = {
	Bash: BashRenderer,
	Read: ReadRenderer,
	Write: WriteRenderer,
	Edit: EditRenderer,
	Glob: GlobRenderer,
	Grep: GrepRenderer,
	TaskCreate: TaskCreateRenderer,
};

function getRenderer(toolName: string): ToolRenderer {
	return renderers[toolName] ?? {};
}

export function getDisplayName(call: ToolCallBlock, t: TFunction): string {
	const r = getRenderer(call.name);
	return r.getDisplayName?.(call, t) ?? defaultGetDisplayName(call);
}

export function renderCallArgs(call: ToolCallBlock, t: TFunction): ReactNode {
	const r = getRenderer(call.name);
	return r.renderCallArgs?.(call, t) ?? defaultRenderCallArgs(call);
}

export function renderResult(

	call: ToolCallBlock,

	result: ToolResultBlock,

	t: TFunction,

): ReactNode {
	const r = getRenderer(call.name);
	return r.renderResult?.(call, result, t) ?? defaultRenderResult(call, result, t);
}

export function renderConfirmBody(call: ToolCallBlock, t: TFunction): ReactNode {
	const r = getRenderer(call.name);
	return r.renderConfirmBody?.(call, t) ?? defaultRenderConfirmBody(call);
}

/**

 * Render a group of consecutive tool calls of the same name.

 *

 * - If the tool's renderer defines `renderGroup`, delegate to it.

 * - Otherwise fall back to `defaultRenderGroup`, wired with this registry's

 *   resolvers so per-tool `getDisplayName` / `renderCallArgs` / `renderResult`

 *   still apply.

 */
export function renderToolGroup(

	toolName: string,

	calls: ToolCallWithResult[],

	t: TFunction,

): ReactNode {
	const r = getRenderer(toolName);
	if (r.renderGroup) {
		return r.renderGroup(calls, t);
	}
	return defaultRenderGroup(calls, t, {
		getDisplayName: (call) => getDisplayName(call, t),
		renderCallArgs: (call) => renderCallArgs(call, t),
		renderResult: (call, result) => renderResult(call, result, t),
	});
}