diff --git a/README.md b/README.md index 32936bd9..37712043 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,8 @@
@@ -18,6 +19,7 @@
- {loading ? 'Loading…' : isAlive ? 'No logs captured.' : 'Team is not running.'} + {loading ? 'Loading…' : 'No logs captured.'}
) : null} {!error && data.lines.length > 0 && filteredText.trim().length === 0 ? ( diff --git a/src/renderer/components/team/CliLogsRichView.tsx b/src/renderer/components/team/CliLogsRichView.tsx index 986a763b..3abd0139 100644 --- a/src/renderer/components/team/CliLogsRichView.tsx +++ b/src/renderer/components/team/CliLogsRichView.tsx @@ -12,10 +12,10 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { DisplayItemList } from '@renderer/components/chat/DisplayItemList'; import { highlightQueryInText } from '@renderer/components/chat/searchHighlightUtils'; import { cn } from '@renderer/lib/utils'; -import { parseStreamJsonToGroups } from '@renderer/utils/streamJsonParser'; +import { groupBySubagent, parseStreamJsonToGroups } from '@renderer/utils/streamJsonParser'; import { Bot, ChevronRight } from 'lucide-react'; -import type { StreamJsonGroup } from '@renderer/utils/streamJsonParser'; +import type { StreamJsonGroup, SubagentSection } from '@renderer/utils/streamJsonParser'; type CliLogsOrder = 'oldest-first' | 'newest-first'; @@ -27,6 +27,8 @@ interface CliLogsRichViewProps { /** Optional local search query override for inline highlighting */ searchQueryOverride?: string; className?: string; + /** Content rendered at the very bottom of the scroll container (e.g. "Show more" button). */ + footer?: React.ReactNode; } /** @@ -149,6 +151,83 @@ const StreamGroup = ({ ); }; +/** + * Collapsible section wrapping all groups from one subagent. + * Collapsed by default. + */ +const SubagentSectionBlock = ({ + section, + isExpanded, + onToggle, + collapsedGroupIds, + onGroupToggle, + expandedItemIds, + onItemClick, + searchQueryOverride, +}: { + section: SubagentSection; + isExpanded: boolean; + onToggle: () => void; + collapsedGroupIds: Set
+ {renderToolInput(current.toolName, current.toolInput)}
+
+ No messages
-Send a message to a member to see activity.
-No messages
+Send a message to a member to see activity.
++ {prepareMessage} +
+ ) : null} + {prepareWarnings.length > 0 ? ( ++ {warning} +
+ ))} ++ Controls how much reasoning Claude invests before responding. Default uses Claude's + standard behavior. +
+{prepareMessage}
- ) : null} - {prepareWarnings.length > 0 ? ( -- {warning} -
- ))} ++ {prepareMessage} +
+ ) : null} + {prepareWarnings.length > 0 ? ( ++ {warning} +
+ ))} +- {renderHighlightedText(option.label, query)} -
-- {renderHighlightedText(option.description ?? '', query)} -
-+ {renderHighlightedText(option.label, query)} +
++ {renderHighlightedText(option.description ?? '', query)} +
+Select a project from the list @@ -137,12 +143,15 @@ export const ProjectPathSelector = ({ ) : null} {projectsError ?
{projectsError}
: null} {!projectsLoading && projects.length === 0 ? ( -No projects found, switch to custom path.
++ No projects found, switch to custom path. +
) : null}+ Unleash Claude's full power — no interruptions asking for permission. Autonomous + mode — all tools execute without confirmation. Be cautious with untrusted code. +
+Manual mode — you'll approve or deny each tool call in real-time.
+
- {m.content}
-
- ) : (
-