- {group.messages.map((msg) => {
- return (
-
- );
- })}
- {renderTokenUsage({
- messages: group.messages,
- turnUsageMessages,
- })}
- {group.type === "assistant" &&
- renderAssistantActions(
- group.messages,
- isAssistantMessageGroupStreaming(
- group.messages,
- streamingMessages,
- ),
- group.id === latestAssistantGroupId,
- )}
-
- );
- } else if (group.type === "assistant:clarification") {
- const message = group.messages[0];
- if (message && hasContent(message)) {
+ if (group.type === "human" || group.type === "assistant") {
return (
-
-
+
+ {group.messages.map((msg) => {
+ const item = (
+
+ );
+
+ if (
+ group.type !== "assistant" ||
+ !enableSidecarActions ||
+ msg.type !== "ai"
+ ) {
+ return
{item}
;
+ }
+
+ return (
+
+ handleAssistantTextSelection(
+ event,
+ msg,
+ groupIndex + 1,
+ )
+ }
+ >
+ {item}
+
+ );
+ })}
+ {renderTokenUsage({
+ messages: group.messages,
+ turnUsageMessages,
+ })}
+ {group.type === "assistant" &&
+ renderAssistantActions(
+ group.messages,
+ isAssistantMessageGroupStreaming(
+ group.messages,
+ streamingMessages,
+ ),
+ group.id === latestAssistantGroupId,
+ )}
+
+ );
+ } else if (group.type === "assistant:clarification") {
+ const message = group.messages[0];
+ if (message && hasContent(message)) {
+ return (
+
+
+ {renderTokenUsage({
+ messages: group.messages,
+ turnUsageMessages,
+ })}
+
+ );
+ }
+ return null;
+ } else if (group.type === "assistant:present-files") {
+ const files: string[] = [];
+ for (const message of group.messages) {
+ if (hasPresentFiles(message)) {
+ const presentFiles = extractPresentFilesFromMessage(message);
+ files.push(...presentFiles);
+ }
+ }
+ return (
+
+ {group.messages[0] && hasContent(group.messages[0]) && (
+
+ )}
+
{renderTokenUsage({
messages: group.messages,
turnUsageMessages,
})}
);
- }
- return null;
- } else if (group.type === "assistant:present-files") {
- const files: string[] = [];
- for (const message of group.messages) {
- if (hasPresentFiles(message)) {
- const presentFiles = extractPresentFilesFromMessage(message);
- files.push(...presentFiles);
- }
- }
- return (
-
- {group.messages[0] && hasContent(group.messages[0]) && (
-
- )}
-
- {renderTokenUsage({
- messages: group.messages,
- turnUsageMessages,
- })}
-
- );
- } else if (group.type === "assistant:subagent") {
- const tasks = new Set
();
- for (const message of group.messages) {
- if (message.type === "ai") {
- for (const toolCall of message.tool_calls ?? []) {
- if (toolCall.name === "task") {
- const taskId = toolCall.id;
- if (!taskId) {
- continue;
+ } else if (group.type === "assistant:subagent") {
+ const tasks = new Set();
+ for (const message of group.messages) {
+ if (message.type === "ai") {
+ for (const toolCall of message.tool_calls ?? []) {
+ if (toolCall.name === "task") {
+ const taskId = toolCall.id;
+ if (!taskId) {
+ continue;
+ }
+ const status = derivePendingSubtaskStatus(
+ taskId,
+ group.messages,
+ groupIsLoading,
+ );
+ const task: Subtask = {
+ id: taskId,
+ subagent_type: toolCall.args.subagent_type,
+ description: toolCall.args.description,
+ prompt: toolCall.args.prompt,
+ status,
+ ...(status === "failed"
+ ? { error: t.subtasks.failed }
+ : {}),
+ };
+ updateSubtask(task);
+ tasks.add(task);
}
- const status = derivePendingSubtaskStatus(
- taskId,
- group.messages,
- groupIsLoading,
+ }
+ } else if (message.type === "tool") {
+ const taskId = message.tool_call_id;
+ if (taskId) {
+ const parsed = parseSubtaskResult(
+ extractTextFromMessage(message),
+ message.additional_kwargs,
);
- const task: Subtask = {
- id: taskId,
- subagent_type: toolCall.args.subagent_type,
- description: toolCall.args.description,
- prompt: toolCall.args.prompt,
- status,
- ...(status === "failed"
- ? { error: t.subtasks.failed }
- : {}),
- };
- updateSubtask(task);
- tasks.add(task);
+ updateSubtask({ id: taskId, ...parsed });
}
}
- } else if (message.type === "tool") {
- const taskId = message.tool_call_id;
- if (taskId) {
- const parsed = parseSubtaskResult(
- extractTextFromMessage(message),
- message.additional_kwargs,
+ }
+
+ const results: React.ReactNode[] = [];
+ const subagentDebugMessageIds: string[] = [];
+ if (tasks.size > 0) {
+ results.push(
+
+ {t.subtasks.executing(tasks.size)}
+
,
+ );
+ }
+ for (const message of group.messages.filter(
+ (message) => message.type === "ai",
+ )) {
+ if (hasReasoning(message)) {
+ results.push(
+ step.messageId === message.id,
+ )}
+ showTokenDebugSummaries={
+ tokenUsageInlineMode === "step_debug"
+ }
+ />,
+ );
+ } else if (message.id) {
+ subagentDebugMessageIds.push(message.id);
+ }
+ const taskIds = message.tool_calls?.flatMap((toolCall) =>
+ toolCall.name === "task" && toolCall.id ? [toolCall.id] : [],
+ );
+ for (const taskId of taskIds ?? []) {
+ results.push(
+ ,
);
- updateSubtask({ id: taskId, ...parsed });
}
}
- }
-
- const results: React.ReactNode[] = [];
- const subagentDebugMessageIds: string[] = [];
- if (tasks.size > 0) {
- results.push(
+ return (
- {t.subtasks.executing(tasks.size)}
-
,
+ {results}
+ {renderTokenUsage({
+ messages: group.messages,
+ turnUsageMessages,
+ debugMessageIds: subagentDebugMessageIds,
+ })}
+
);
}
- for (const message of group.messages.filter(
- (message) => message.type === "ai",
- )) {
- if (hasReasoning(message)) {
- results.push(
-