@athenaintel/react 0.53.1 → 0.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -1
- package/dist/agent-runtime/src/call-recap.cjs +2 -3
- package/dist/agent-runtime/src/call-recap.cjs.map +1 -1
- package/dist/agent-runtime/src/call-recap.d.ts +1 -2
- package/dist/agent-runtime/src/call-recap.js +1 -2
- package/dist/agent-runtime/src/call-recap.js.map +1 -1
- package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs +7 -3
- package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -1
- package/dist/agent-runtime/src/deep-agent-transport-recipe.d.ts +10 -2
- package/dist/agent-runtime/src/deep-agent-transport-recipe.js +8 -4
- package/dist/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -1
- package/dist/agent-runtime/src/dictation-session.d.ts +158 -0
- package/dist/agent-runtime/src/edit-command.cjs +15 -3
- package/dist/agent-runtime/src/edit-command.cjs.map +1 -1
- package/dist/agent-runtime/src/edit-command.d.ts +8 -0
- package/dist/agent-runtime/src/edit-command.js +15 -3
- package/dist/agent-runtime/src/edit-command.js.map +1 -1
- package/dist/agent-runtime/src/generated/runconfig-contract.cjs +10 -0
- package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
- package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +25 -1
- package/dist/agent-runtime/src/generated/runconfig-contract.js +10 -0
- package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
- package/dist/agent-runtime/src/history-pages.cjs +279 -0
- package/dist/agent-runtime/src/history-pages.cjs.map +1 -0
- package/dist/agent-runtime/src/history-pages.d.ts +252 -0
- package/dist/agent-runtime/src/history-pages.js +279 -0
- package/dist/agent-runtime/src/history-pages.js.map +1 -0
- package/dist/agent-runtime/src/index.d.ts +8 -7
- package/dist/agent-runtime/src/message-window.cjs +111 -7
- package/dist/agent-runtime/src/message-window.cjs.map +1 -1
- package/dist/agent-runtime/src/message-window.d.ts +66 -6
- package/dist/agent-runtime/src/message-window.js +112 -8
- package/dist/agent-runtime/src/message-window.js.map +1 -1
- package/dist/agent-runtime/src/offline-status.cjs.map +1 -1
- package/dist/agent-runtime/src/offline-status.d.ts +64 -2
- package/dist/agent-runtime/src/offline-status.js.map +1 -1
- package/dist/agent-runtime/src/runtime.d.ts +4 -3
- package/dist/agent-runtime/src/subagent-transcripts.cjs +23 -1
- package/dist/agent-runtime/src/subagent-transcripts.cjs.map +1 -1
- package/dist/agent-runtime/src/subagent-transcripts.js +25 -3
- package/dist/agent-runtime/src/subagent-transcripts.js.map +1 -1
- package/dist/agent-runtime/src/subagents.cjs +112 -0
- package/dist/agent-runtime/src/subagents.cjs.map +1 -1
- package/dist/agent-runtime/src/subagents.d.ts +103 -0
- package/dist/agent-runtime/src/subagents.js +113 -1
- package/dist/agent-runtime/src/subagents.js.map +1 -1
- package/dist/agent-runtime/src/thread-handoff-protocol.d.ts +37 -9
- package/dist/agent-runtime/src/thread-handoff.d.ts +1 -1
- package/dist/agent-runtime/src/tool-metadata.cjs +8 -0
- package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
- package/dist/agent-runtime/src/tool-metadata.js +8 -0
- package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-thread.cjs +22 -2
- package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-thread.d.ts +9 -1
- package/dist/agent-runtime/src/use-deep-agent-thread.js +23 -3
- package/dist/agent-runtime/src/use-deep-agent-thread.js.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs +106 -25
- package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-window-sync.d.ts +41 -6
- package/dist/agent-runtime/src/use-deep-agent-window-sync.js +109 -28
- package/dist/agent-runtime/src/use-deep-agent-window-sync.js.map +1 -1
- package/dist/agent-runtime/src/use-thread-handoff-flow.d.ts +5 -9
- package/dist/agent-runtime/src/voice-presentation.cjs +34 -0
- package/dist/agent-runtime/src/voice-presentation.cjs.map +1 -1
- package/dist/agent-runtime/src/voice-presentation.d.ts +35 -0
- package/dist/agent-runtime/src/voice-presentation.js +34 -0
- package/dist/agent-runtime/src/voice-presentation.js.map +1 -1
- package/dist/assets/AthenaAssetEmbed.cjs +4 -2
- package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
- package/dist/assets/AthenaAssetEmbed.d.ts +17 -8
- package/dist/assets/AthenaAssetEmbed.js +4 -2
- package/dist/assets/AthenaAssetEmbed.js.map +1 -1
- package/dist/assets/use-asset-embed.cjs.map +1 -1
- package/dist/assets/use-asset-embed.d.ts +7 -5
- package/dist/assets/use-asset-embed.js.map +1 -1
- package/dist/auth/account-identity.cjs +69 -0
- package/dist/auth/account-identity.cjs.map +1 -0
- package/dist/auth/account-identity.d.ts +57 -0
- package/dist/auth/account-identity.js +69 -0
- package/dist/auth/account-identity.js.map +1 -0
- package/dist/chat/AthenaChat.cjs +1 -1
- package/dist/chat/AthenaChat.cjs.map +1 -1
- package/dist/chat/AthenaChat.js +1 -1
- package/dist/chat/AthenaChat.js.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingCard.cjs +51 -43
- package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingCard.js +51 -43
- package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +9 -4
- package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingTranscript.js +9 -4
- package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.cjs +7 -4
- package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.d.ts +10 -1
- package/dist/chat/super-grouping/activity-timeline.js +7 -4
- package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
- package/dist/chat/super-grouping/earlier-steps-button.cjs +50 -0
- package/dist/chat/super-grouping/earlier-steps-button.cjs.map +1 -0
- package/dist/chat/super-grouping/earlier-steps-button.d.ts +11 -0
- package/dist/chat/super-grouping/earlier-steps-button.js +50 -0
- package/dist/chat/super-grouping/earlier-steps-button.js.map +1 -0
- package/dist/chat/super-grouping/toolkit-map.cjs +1 -0
- package/dist/chat/super-grouping/toolkit-map.cjs.map +1 -1
- package/dist/chat/super-grouping/toolkit-map.js +1 -0
- package/dist/chat/super-grouping/toolkit-map.js.map +1 -1
- package/dist/chat/super-grouping/use-turn-steps.cjs +28 -0
- package/dist/chat/super-grouping/use-turn-steps.cjs.map +1 -0
- package/dist/chat/super-grouping/use-turn-steps.d.ts +23 -0
- package/dist/chat/super-grouping/use-turn-steps.js +28 -0
- package/dist/chat/super-grouping/use-turn-steps.js.map +1 -0
- package/dist/chat/use-statewire-approval-request.cjs +5 -5
- package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
- package/dist/chat/use-statewire-approval-request.d.ts +7 -0
- package/dist/chat/use-statewire-approval-request.js +5 -5
- package/dist/chat/use-statewire-approval-request.js.map +1 -1
- package/dist/chat-ui/mentions/use-account-workspace-id.cjs +18 -58
- package/dist/chat-ui/mentions/use-account-workspace-id.cjs.map +1 -1
- package/dist/chat-ui/mentions/use-account-workspace-id.js +18 -58
- package/dist/chat-ui/mentions/use-account-workspace-id.js.map +1 -1
- package/dist/chat-ui/messages/voice-delegation-card.cjs +93 -25
- package/dist/chat-ui/messages/voice-delegation-card.cjs.map +1 -1
- package/dist/chat-ui/messages/voice-delegation-card.d.ts +16 -7
- package/dist/chat-ui/messages/voice-delegation-card.js +95 -27
- package/dist/chat-ui/messages/voice-delegation-card.js.map +1 -1
- package/dist/chat-ui/statewire.cjs +6 -0
- package/dist/chat-ui/statewire.cjs.map +1 -1
- package/dist/chat-ui/statewire.d.ts +3 -1
- package/dist/chat-ui/statewire.js +7 -1
- package/dist/chat-ui/statewire.js.map +1 -1
- package/dist/chat-ui/thread/handoff-cursor.cjs +2 -2
- package/dist/chat-ui/thread/handoff-cursor.cjs.map +1 -1
- package/dist/chat-ui/thread/handoff-cursor.js +3 -3
- package/dist/chat-ui/thread/handoff-cursor.js.map +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.cjs +4 -0
- package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
- package/dist/chat-ui/thread/statewire-history-edge.d.ts +11 -1
- package/dist/chat-ui/thread/statewire-history-edge.js +5 -1
- package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
- package/dist/collab/client.cjs +134 -7
- package/dist/collab/client.cjs.map +1 -1
- package/dist/collab/client.d.ts +44 -0
- package/dist/collab/client.js +134 -7
- package/dist/collab/client.js.map +1 -1
- package/dist/collab/index.d.ts +1 -1
- package/dist/composer/QuoteContext.cjs +3 -3
- package/dist/composer/QuoteContext.cjs.map +1 -1
- package/dist/composer/QuoteContext.js +3 -3
- package/dist/composer/QuoteContext.js.map +1 -1
- package/dist/keryx-http/src/initial-sync.cjs +121 -0
- package/dist/keryx-http/src/initial-sync.cjs.map +1 -0
- package/dist/keryx-http/src/initial-sync.d.ts +77 -0
- package/dist/keryx-http/src/initial-sync.js +104 -0
- package/dist/keryx-http/src/initial-sync.js.map +1 -0
- package/dist/keryx-http/src/unconfirmed-update-attributions.cjs +8 -0
- package/dist/keryx-http/src/unconfirmed-update-attributions.cjs.map +1 -1
- package/dist/keryx-http/src/unconfirmed-update-attributions.d.ts +6 -0
- package/dist/keryx-http/src/unconfirmed-update-attributions.js +8 -0
- package/dist/keryx-http/src/unconfirmed-update-attributions.js.map +1 -1
- package/dist/provider/AthenaProvider.cjs +11 -3
- package/dist/provider/AthenaProvider.cjs.map +1 -1
- package/dist/provider/AthenaProvider.js +12 -4
- package/dist/provider/AthenaProvider.js.map +1 -1
- package/dist/provider/statewire-window-context.cjs +6 -0
- package/dist/provider/statewire-window-context.cjs.map +1 -1
- package/dist/provider/statewire-window-context.d.ts +10 -1
- package/dist/provider/statewire-window-context.js +6 -0
- package/dist/provider/statewire-window-context.js.map +1 -1
- package/dist/react/package.json.cjs +1 -1
- package/dist/react/package.json.js +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.cjs +2 -0
- package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.d.ts +7 -1
- package/dist/runtime/useAthenaStatewireRuntime.js +2 -0
- package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/threads/api.cjs +1 -2
- package/dist/threads/api.cjs.map +1 -1
- package/dist/threads/api.d.ts +3 -2
- package/dist/threads/api.js +1 -2
- package/dist/threads/api.js.map +1 -1
- package/dist/threads/sessions-query.cjs +2 -0
- package/dist/threads/sessions-query.cjs.map +1 -1
- package/dist/threads/sessions-query.js +2 -0
- package/dist/threads/sessions-query.js.map +1 -1
- package/dist/threads/statewire-thread-list.cjs +5 -7
- package/dist/threads/statewire-thread-list.cjs.map +1 -1
- package/dist/threads/statewire-thread-list.js +7 -9
- package/dist/threads/statewire-thread-list.js.map +1 -1
- package/dist/tools/subagent-task-tool-ui.cjs +15 -5
- package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
- package/dist/tools/subagent-task-tool-ui.d.ts +5 -4
- package/dist/tools/subagent-task-tool-ui.js +16 -6
- package/dist/tools/subagent-task-tool-ui.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SuperGroupingCard.js","sources":["../../../src/chat/super-grouping/SuperGroupingCard.tsx"],"sourcesContent":["'use client';\n\nimport type {\n AssistantState,\n ReasoningMessagePartComponent,\n TextMessagePartComponent,\n ThreadAssistantMessagePart,\n ToolCallMessagePart,\n ToolCallMessagePartComponent,\n ToolCallMessagePartProps,\n} from '@assistant-ui/react';\nimport { MessagePrimitive, useAuiState } from '@assistant-ui/react';\nimport { ChevronRight } from 'lucide-react';\nimport { type ComponentType, memo, type ReactNode, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { cn } from '../../lib/utils';\nimport { isSdkInlineTool } from '../../tools/inline-tools';\nimport { ToolFallback } from '../../tools/tool-fallback';\nimport { collectAssetTitles } from '../../tools/tool-summary';\nimport {\n type ActivityItem,\n type ActivityPhase,\n buildActivityTimeline,\n countActivityTools,\n excludeFinalTextFromGroups,\n excludePartsFromGroups,\n getActivitySummary,\n getFinalTextParts,\n resolveActivityPhase,\n} from './activity-timeline';\nimport { CollapsibleGroup, type CollapsibleGroupProps, SuperGroupingProvider } from './CollapsibleGroup';\nimport { GroupedMessageParts } from './GroupedMessageParts';\nimport { createToolBasedGroupingFunction, type GroupingFunction, isGroupedToolCallPart } from './grouping-function';\nimport { ToolTimeline } from './ToolTimeline';\nimport { type TimelineStep, toTimelineStep } from './timeline-step';\nimport { defaultGetToolGroupKey, type GetToolGroupKey } from './toolkit-map';\nimport { ToolPartPlacementProvider } from './tool-part-placement';\nimport { useEarlierStepsUnloaded } from './use-earlier-steps-unloaded';\n\nconst DEFAULT_MAX_VISIBLE_STEPS = 3;\nconst MAX_REMEMBERED_EXPANSIONS = 200;\nconst EMPTY_TIMELINE: ActivityItem[] = [];\nconst EMPTY_CONTENT: readonly ThreadAssistantMessagePart[] = [];\nconst NO_STEP_ROW_TOOLS = (): boolean => false;\n\n/**\n * Whether `next` differs from `previous` only in the words of its last part, a text or reasoning\n * part that is still being written: same length, every earlier part the identical object, and the\n * last parts of the same kind.\n */\nfunction onlyLastPartGrew({\n previous,\n next,\n}: {\n previous: readonly ThreadAssistantMessagePart[];\n next: readonly ThreadAssistantMessagePart[];\n}): boolean {\n if (previous === next) return true;\n if (previous.length === 0 || previous.length !== next.length) return false;\n const lastIndex = next.length - 1;\n const kind = next[lastIndex]?.type;\n if ((kind !== 'text' && kind !== 'reasoning') || previous[lastIndex]?.type !== kind) return false;\n for (let index = 0; index < lastIndex; index += 1) {\n if (previous[index] !== next[index]) return false;\n }\n return true;\n}\n\n/**\n * The card's read of its message's content: the content itself, except that while the message is\n * generating it keeps the previous array when only the last text or reasoning part grew. The card\n * builds its steps from tool calls, their results and reasoning steps, never from those words (the\n * answer renders below it, `SuperGroupingFinalText`), and the turn being generated changes its last\n * part on every streamed token; earlier parts keep their objects across a token (the runtime's\n * conversion cache), so the card re-renders when a step changes, not per token. Any other change,\n * and the run ending, hand over the current content.\n */\nfunction createActivityContentSelector(): (\n state: AssistantState,\n) => readonly ThreadAssistantMessagePart[] {\n let last: readonly ThreadAssistantMessagePart[] = EMPTY_CONTENT;\n return (state) => {\n const message = state.message;\n const content = message.role === 'assistant' ? message.content : EMPTY_CONTENT;\n if (message.status?.type === 'running' && onlyLastPartGrew({ previous: last, next: content })) {\n return last;\n }\n last = content;\n return content;\n };\n}\nconst RUNNING_STATUS = { type: 'running' } as const;\nconst COMPLETE_STATUS = { type: 'complete' } as const;\n\n// ─── Disclosure memory ─────────────────────────────────────────────────\n\n/**\n * Session-local memory of which cards the user opened, keyed by the host's\n * expansion key (the message id by default; the Chrome extension keys by\n * thread + position so a streaming message keeps its choice when it receives\n * its stable id). Bounded so a long session cannot grow it without limit.\n */\nconst rememberedExpansions = new Map<string, boolean>();\n\nfunction rememberExpansion(key: string, expanded: boolean): void {\n rememberedExpansions.delete(key);\n rememberedExpansions.set(key, expanded);\n while (rememberedExpansions.size > MAX_REMEMBERED_EXPANSIONS) {\n const oldestKey = rememberedExpansions.keys().next().value;\n if (oldestKey === undefined) break;\n rememberedExpansions.delete(oldestKey);\n }\n}\n\nexport function resetRememberedExpansionsForTests(): void {\n rememberedExpansions.clear();\n}\n\n/**\n * The details disclosure: remembered per expansion key, and — when the host\n * opts in — opened once when the turn starts waiting on the person, so the\n * approval controls inside the details are visible without a click.\n */\nexport function useActivityExpansion({\n expansionKey,\n phase,\n expandWhileWaiting = false,\n}: {\n expansionKey: string;\n phase: ActivityPhase;\n expandWhileWaiting?: boolean;\n}) {\n const [userExpanded, setUserExpanded] = useState<boolean | undefined>(() =>\n rememberedExpansions.get(expansionKey),\n );\n const [waitingAutoExpanded, setWaitingAutoExpanded] = useState(false);\n const previousRef = useRef({ expansionKey, phase });\n\n useEffect(() => {\n setUserExpanded(rememberedExpansions.get(expansionKey));\n setWaitingAutoExpanded(false);\n }, [expansionKey]);\n\n useEffect(() => {\n const previous = previousRef.current;\n if (expandWhileWaiting && previous.expansionKey === expansionKey) {\n if (previous.phase !== 'waiting' && phase === 'waiting') {\n setWaitingAutoExpanded(true);\n } else if (previous.phase === 'waiting' && phase !== 'waiting') {\n setWaitingAutoExpanded(false);\n }\n }\n previousRef.current = { expansionKey, phase };\n }, [expansionKey, phase, expandWhileWaiting]);\n\n const expanded = waitingAutoExpanded || (userExpanded ?? (expandWhileWaiting && phase === 'waiting'));\n const toggleExpanded = () => {\n const next = !expanded;\n setWaitingAutoExpanded(false);\n rememberExpansion(expansionKey, next);\n setUserExpanded(next);\n };\n\n return { expanded, toggleExpanded };\n}\n\n// ─── Card ──────────────────────────────────────────────────────────────\n\nexport interface SuperGroupingCardProps {\n /** Tool UIs to render inside the details panel, by tool name (registered tool UIs still apply). */\n toolUIs?: Record<string, ToolCallMessagePartComponent>;\n /** Fallback for tools without a UI; the SDK's `ToolFallback` by default. */\n ToolFallback?: ComponentType<ToolCallMessagePartProps>;\n /** Text renderer for the details panel. */\n TextComponent: TextMessagePartComponent;\n /** Reasoning renderer for the details panel. */\n ReasoningComponent?: ReasoningMessagePartComponent;\n /** Per-toolkit block inside the details panel; the SDK's `CollapsibleGroup` by default. */\n GroupComponent?: ComponentType<CollapsibleGroupProps>;\n /** Toolkit lookup driving the per-toolkit sub-grouping; the SDK's static map by default. */\n getToolGroupKey?: GetToolGroupKey;\n /** A complete grouping function, when the host builds its own (overrides `getToolGroupKey`). */\n groupingFunction?: GroupingFunction;\n /** Tools whose unresolved call means the turn is waiting on the person (see `buildActivityTimeline`). */\n waitingTools?: ReadonlySet<string>;\n /**\n * Calls the run is parked on, by tool-call id: each one still without its\n * real result reads as waiting (see `buildActivityTimeline`). Keep the set's\n * identity stable while its ids are unchanged.\n */\n waitingToolCallIds?: ReadonlySet<string>;\n /** Tools whose result is a relayed application payload (see `buildActivityTimeline`). */\n passThroughTools?: ReadonlySet<string>;\n /**\n * Tools whose card renders below the header, outside both disclosures, and\n * stays mounted (an editable email draft, a UI test report). `isSdkInlineTool`\n * by default: the registry's `inline` flag plus the SDK's own report cards.\n * The call itself comes second, for a host whose choice depends on what the\n * call did (Olympus keeps an `eval` there only when it dispatched subagents).\n * The card renders it under `useToolPartPlacement()` `'inline'`.\n */\n isInlineTool?: (toolName: string, part: ToolCallMessagePart) => boolean;\n /**\n * Tools whose card is their own step's row in the step list, drawn in place\n * of the status line (Olympus's one-line code runs) and kept out of the\n * details. The card renders it under `useToolPartPlacement()` `'step'`, kept\n * mounted while the step list is (the turn is live, or `mountDetails`); a\n * call that is inline too renders in both places. None by default.\n */\n isStepRowTool?: (toolName: string) => boolean;\n /**\n * Host assertion that the turn is waiting on the person. The SDK derives waiting\n * from `requires-action` and waiting tools itself; no in-repo host passes this.\n */\n waitingForInput?: boolean;\n /** Names tools the shared registry has no entry for (Olympus's tool catalog). */\n resolveToolDisplayName?: (toolName: string) => string | undefined;\n /** Key the disclosure choice is remembered under; the message id by default. */\n expansionKey?: string;\n /** Open the details once when the turn starts waiting on the person. */\n expandWhileWaiting?: boolean;\n /**\n * Keep the details panel mounted (hidden) while collapsed, so a host that\n * needs to find content inside it (a deep link into the run's steps) can.\n */\n mountDetails?: boolean;\n /** Latest steps shown when expanded; unresolved parallel calls always remain visible. */\n maxVisibleSteps?: number;\n /** Extra segments after the collapsed summary (\"1m 23s\", \"12.4k tokens\"), joined with \" · \". */\n summaryDetails?: readonly string[];\n /** Header controls beside the title (a stop button while running, a changes button once done). */\n renderHeaderActions?: (context: {\n phase: ActivityPhase;\n messageContent: readonly ThreadAssistantMessagePart[];\n }) => ReactNode;\n /**\n * Inline on the header row, right of the status, while the turn is running\n * (an elapsed counter). Not rendered while the turn waits on the person.\n */\n renderRunningMeta?: (context: { phase: ActivityPhase }) => ReactNode;\n /** The host's icon for a step's tool, shown on its status row (see `ToolTimeline`). */\n renderStepIcon?: (step: TimelineStep) => ReactNode;\n /** Show the favicons of the sites a finished step's result lists. */\n showSourceFavicons?: boolean;\n className?: string;\n classNames?: {\n root?: string;\n details?: string;\n /** The flex column the run's parts render in; override its gap here. */\n detailsParts?: string;\n /** The flex column the inline tool calls render in, below the header; override its gap here. */\n inlineTools?: string;\n };\n}\n\n/**\n * The collapsed view (previously called the conversational view) of an\n * assistant turn: a compact current action, an expandable tool timeline, and\n * the original interactive tool UIs behind a separate details disclosure. The\n * answer itself renders below the card (`SuperGroupingFinalText`). Shared by\n * the SDK's `AthenaChat`, Olympus, and the Chrome extension, which supply\n * their own text/tool renderers and the host-specific controls through the\n * slots.\n *\n * The details panel stays mounted (visually hidden) while the turn is live so\n * the tool UIs inside run their effects — an asset-streaming card's follow\n * mode must not wait for \"Show details\". A host can take a call out of the\n * details to render its tool UI in the open (`isInlineTool`) or as its step's\n * row (`isStepRowTool`); the tool UI reads which (`useToolPartPlacement`).\n *\n * Selector discipline: raw reads only (`message.status`, `message.id`, and the\n * content through `createActivityContentSelector`, which hands back the\n * message's own array or the previous one, never a new array); every\n * derivation runs in `useMemo` — a selector that returned a fresh array would\n * tear through `useSyncExternalStore`.\n */\nexport const SuperGroupingCard = memo(function SuperGroupingCard({\n toolUIs,\n ToolFallback: ToolFallbackComponent = ToolFallback,\n TextComponent,\n ReasoningComponent,\n GroupComponent = CollapsibleGroup,\n getToolGroupKey = defaultGetToolGroupKey,\n groupingFunction,\n waitingTools,\n waitingToolCallIds,\n passThroughTools,\n isInlineTool = isSdkInlineTool,\n isStepRowTool = NO_STEP_ROW_TOOLS,\n waitingForInput = false,\n resolveToolDisplayName,\n expansionKey: expansionKeyProp,\n expandWhileWaiting = false,\n mountDetails = false,\n maxVisibleSteps = DEFAULT_MAX_VISIBLE_STEPS,\n summaryDetails,\n renderStepIcon,\n showSourceFavicons,\n renderHeaderActions,\n renderRunningMeta,\n className,\n classNames,\n}: SuperGroupingCardProps) {\n const messageId = useAuiState((s) => s.message.id);\n const earlierStepsUnloaded = useEarlierStepsUnloaded();\n const [selectActivityContent] = useState(createActivityContentSelector);\n const messageContent = useAuiState(selectActivityContent);\n const messageStatus = useAuiState((s) => s.message.status);\n\n const timeline = useMemo(() => {\n const items = buildActivityTimeline(messageContent, messageStatus, {\n waitingTools,\n waitingToolCallIds,\n passThroughTools,\n });\n return items.length > 0 ? items : EMPTY_TIMELINE;\n }, [messageContent, messageStatus, waitingTools, waitingToolCallIds, passThroughTools]);\n const phase = useMemo(\n () => resolveActivityPhase(messageStatus, timeline, { waitingForInput }),\n [messageStatus, timeline, waitingForInput],\n );\n const toolCount = countActivityTools(timeline);\n\n const { expanded, toggleExpanded } = useActivityExpansion({\n expansionKey: expansionKeyProp ?? messageId,\n phase,\n expandWhileWaiting,\n });\n const generatedId = useId().replace(/[^A-Za-z0-9_-]/g, '');\n const detailsPanelId = `aui-sg-details-${generatedId}`;\n const statusId = `aui-sg-status-${generatedId}`;\n const { expanded: detailsExpanded, toggleExpanded: toggleDetails } = useActivityExpansion({\n expansionKey: `${expansionKeyProp ?? messageId}:details`,\n phase,\n expandWhileWaiting,\n });\n const assetTitles = useMemo(() => collectAssetTitles(messageContent), [messageContent]);\n const steps = useMemo(\n () =>\n timeline.map((item, index) =>\n toTimelineStep({ item, index, resolveToolDisplayName, assetTitles, withSourceUrls: showSourceFavicons }),\n ),\n [timeline, resolveToolDisplayName, assetTitles, showSourceFavicons],\n );\n\n // The calls rendered outside the details: inline below the header, and as\n // their own step's row (by tool-call id, a tool step's id).\n const { inlineParts, stepRowParts } = useMemo(() => {\n const inline: { index: number; key: string }[] = [];\n const stepRows = new Map<string, number>();\n messageContent.forEach((part, index) => {\n if (part.type !== 'tool-call') return;\n if (isInlineTool(part.toolName, part)) inline.push({ index, key: part.toolCallId });\n if (isStepRowTool(part.toolName)) stepRows.set(part.toolCallId, index);\n });\n return { inlineParts: inline, stepRowParts: stepRows };\n }, [messageContent, isInlineTool, isStepRowTool]);\n const grouping = useMemo(\n () =>\n excludePartsFromGroups(\n excludeFinalTextFromGroups(groupingFunction ?? createToolBasedGroupingFunction(getToolGroupKey)),\n (part) =>\n isGroupedToolCallPart(part) && (isStepRowTool(part.toolName) || isInlineTool(part.toolName, part)),\n ),\n [groupingFunction, getToolGroupKey, isInlineTool, isStepRowTool],\n );\n const hasDetails = useMemo(() => grouping(messageContent).length > 0, [grouping, messageContent]);\n const isActive = phase === 'running' || phase === 'waiting';\n // The toolkit groups inside keep their tool UIs mounted when the details do.\n const groupingContext = useMemo(\n () => ({ groupingFunction: grouping, mountHidden: isActive || mountDetails }),\n [grouping, isActive, mountDetails],\n );\n const components = useMemo(\n () => ({\n tools: {\n ...(toolUIs ? { by_name: toolUIs } : {}),\n Fallback: ToolFallbackComponent,\n },\n Text: TextComponent,\n ...(ReasoningComponent ? { Reasoning: ReasoningComponent } : {}),\n Group: GroupComponent,\n }),\n [toolUIs, ToolFallbackComponent, TextComponent, ReasoningComponent, GroupComponent],\n );\n\n // A turn whose earlier steps have not loaded says so even when only its\n // answer has: its steps (and prompt) are older than the window.\n const hasActivity = timeline.length > 0 || phase !== 'complete' || earlierStepsUnloaded;\n if (!hasActivity) return null;\n\n // Tool UIs perform live subscriptions and asset-follow effects. Collapsing\n // either disclosure must only hide them while active or targeted by a deep link.\n const detailsMounted = isActive || mountDetails || (expanded && detailsExpanded);\n const activeSteps = steps.filter((step) => step.state === 'running');\n const currentStep = activeSteps.at(-1);\n const latestStatus =\n phase === 'waiting'\n ? 'Waiting for you'\n : phase === 'error'\n ? messageStatus?.type === 'incomplete' && messageStatus.reason === 'cancelled'\n ? 'Run stopped'\n : 'Something went wrong'\n : phase === 'running'\n ? currentStep\n ? [\n currentStep.verb,\n currentStep.chip,\n activeSteps.length > 1 ? `${activeSteps.length} in progress` : null,\n ]\n .filter(Boolean)\n .join(' · ')\n : steps.length > 0\n ? 'Preparing response'\n : 'Thinking'\n : getActivitySummary(timeline, { earlierStepsUnloaded });\n const label = [latestStatus, ...(isActive ? [] : (summaryDetails ?? []))].join(' · ');\n // A step-row call's own card is its step's row.\n const renderStepRow =\n stepRowParts.size > 0\n ? (step: TimelineStep) => {\n const index = step.kind === 'tool' ? stepRowParts.get(step.id) : undefined;\n return index === undefined ? null : (\n <ToolPartPlacementProvider value=\"step\">\n <MessagePrimitive.PartByIndex index={index} components={components} />\n </ToolPartPlacementProvider>\n );\n }\n : undefined;\n\n return (\n <section\n data-slot=\"super-grouping-card\"\n data-phase={phase}\n data-tool-count={toolCount}\n className={cn('my-3 min-w-0', className, classNames?.root)}\n aria-busy={phase === 'running' ? 'true' : 'false'}\n aria-describedby={statusId}\n >\n <ToolTimeline\n steps={steps}\n open={expanded}\n onOpenChange={toggleExpanded}\n label={label}\n phase={phase}\n maxVisibleSteps={maxVisibleSteps}\n keepMounted={isActive || mountDetails}\n actions={renderHeaderActions?.({ phase, messageContent })}\n meta={phase === 'running' ? renderRunningMeta?.({ phase }) : null}\n renderStepIcon={renderStepIcon}\n renderStepRow={renderStepRow}\n showSourceFavicons={showSourceFavicons}\n >\n {hasDetails ? (\n <div className=\"min-w-0 pl-5\">\n <button\n type=\"button\"\n onClick={toggleDetails}\n aria-expanded={detailsExpanded}\n aria-controls={detailsPanelId}\n className=\"flex items-center gap-1.5 rounded py-1 text-xs text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <ChevronRight\n aria-hidden=\"true\"\n className={cn(\n 'size-3 transition-transform motion-reduce:transition-none',\n detailsExpanded && 'rotate-90',\n )}\n />\n {detailsExpanded ? 'Hide tool details' : 'Show tool details'}\n </button>\n {detailsMounted ? (\n <section\n id={detailsPanelId}\n aria-label=\"Run details\"\n hidden={!expanded || !detailsExpanded}\n className={cn(\n 'min-w-0 overflow-hidden border-l border-border/60 py-2 pl-3',\n classNames?.details,\n )}\n >\n <div className={cn('flex flex-col gap-2', classNames?.detailsParts)}>\n <SuperGroupingProvider value={groupingContext}>\n <ToolPartPlacementProvider value={null}>\n <GroupedMessageParts groupingFunction={grouping} components={components} />\n </ToolPartPlacementProvider>\n </SuperGroupingProvider>\n </div>\n </section>\n ) : null}\n </div>\n ) : null}\n </ToolTimeline>\n {inlineParts.length > 0 ? (\n <div\n data-slot=\"super-grouping-inline-tools\"\n className={cn('mt-2 flex min-w-0 flex-col gap-2', classNames?.inlineTools)}\n >\n <ToolPartPlacementProvider value=\"inline\">\n {inlineParts.map(({ index, key }) => (\n <MessagePrimitive.PartByIndex key={key} index={index} components={components} />\n ))}\n </ToolPartPlacementProvider>\n </div>\n ) : null}\n <output id={statusId} aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\">\n {phase === 'waiting' ? 'Waiting for your input' : latestStatus}\n </output>\n </section>\n );\n});\n\n/**\n * The turn's visible answer, rendered below the card: the text after the last\n * tool call (all of it when the turn called no tools) and the words of any\n * spoken voice turn the message holds (`getFinalTextParts`), streaming while\n * the turn is live so the person reads the answer as it arrives.\n *\n * Each part renders through its own `TextComponent`, keyed by its content\n * index, so a part only ever grows at its end: a spoken turn streaming while\n * the run's reply streams after it would otherwise change one joined string in\n * the middle, and a streaming reveal restarts from empty on every word. Only\n * the last part carries the running status (and its caret).\n */\nexport const SuperGroupingFinalText = memo(function SuperGroupingFinalText({\n TextComponent,\n}: {\n TextComponent: TextMessagePartComponent;\n}) {\n const messageContent = useAuiState((s) =>\n s.message.role === 'assistant' ? s.message.content : EMPTY_CONTENT,\n );\n const statusType = useAuiState((s) => s.message.status?.type);\n const parts = useMemo(() => getFinalTextParts(messageContent), [messageContent]);\n\n if (parts.length === 0) return null;\n const running = statusType === 'running' || statusType === 'requires-action';\n return (\n <div data-slot=\"super-grouping-final-text\" className=\"flex min-w-0 flex-col gap-1.5\">\n {parts.map((part, position) => (\n <TextComponent\n key={part.index}\n type=\"text\"\n text={part.text}\n status={running && position === parts.length - 1 ? RUNNING_STATUS : COMPLETE_STATUS}\n />\n ))}\n </div>\n );\n});\n"],"names":["SuperGroupingCard","SuperGroupingFinalText"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SuperGroupingCard.js","sources":["../../../src/chat/super-grouping/SuperGroupingCard.tsx"],"sourcesContent":["'use client';\n\nimport type {\n AssistantState,\n ReasoningMessagePartComponent,\n TextMessagePartComponent,\n ThreadAssistantMessagePart,\n ToolCallMessagePart,\n ToolCallMessagePartComponent,\n ToolCallMessagePartProps,\n} from '@assistant-ui/react';\nimport { MessagePrimitive, useAuiState } from '@assistant-ui/react';\nimport { ChevronRight } from 'lucide-react';\nimport { type ComponentType, memo, type ReactNode, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { cn } from '../../lib/utils';\nimport { isSdkInlineTool } from '../../tools/inline-tools';\nimport { ToolFallback } from '../../tools/tool-fallback';\nimport { collectAssetTitles } from '../../tools/tool-summary';\nimport {\n type ActivityItem,\n type ActivityPhase,\n buildActivityTimeline,\n countActivityTools,\n excludeFinalTextFromGroups,\n excludePartsFromGroups,\n getActivitySummary,\n getFinalTextParts,\n resolveActivityPhase,\n} from './activity-timeline';\nimport { CollapsibleGroup, type CollapsibleGroupProps, SuperGroupingProvider } from './CollapsibleGroup';\nimport { GroupedMessageParts } from './GroupedMessageParts';\nimport { createToolBasedGroupingFunction, type GroupingFunction, isGroupedToolCallPart } from './grouping-function';\nimport { ToolTimeline } from './ToolTimeline';\nimport { type TimelineStep, toTimelineStep } from './timeline-step';\nimport { defaultGetToolGroupKey, type GetToolGroupKey } from './toolkit-map';\nimport { ToolPartPlacementProvider } from './tool-part-placement';\nimport { useEarlierStepsUnloaded } from './use-earlier-steps-unloaded';\nimport { useTurnStepsControl, useTurnStepsMarker } from './use-turn-steps';\n\nconst DEFAULT_MAX_VISIBLE_STEPS = 3;\nconst MAX_REMEMBERED_EXPANSIONS = 200;\nconst EMPTY_TIMELINE: ActivityItem[] = [];\nconst EMPTY_CONTENT: readonly ThreadAssistantMessagePart[] = [];\nconst NO_STEP_ROW_TOOLS = (): boolean => false;\n\n/**\n * Whether `next` differs from `previous` only in the words of its last part, a text or reasoning\n * part that is still being written: same length, every earlier part the identical object, and the\n * last parts of the same kind.\n */\nfunction onlyLastPartGrew({\n previous,\n next,\n}: {\n previous: readonly ThreadAssistantMessagePart[];\n next: readonly ThreadAssistantMessagePart[];\n}): boolean {\n if (previous === next) return true;\n if (previous.length === 0 || previous.length !== next.length) return false;\n const lastIndex = next.length - 1;\n const kind = next[lastIndex]?.type;\n if ((kind !== 'text' && kind !== 'reasoning') || previous[lastIndex]?.type !== kind) return false;\n for (let index = 0; index < lastIndex; index += 1) {\n if (previous[index] !== next[index]) return false;\n }\n return true;\n}\n\n/**\n * The card's read of its message's content: the content itself, except that while the message is\n * generating it keeps the previous array when only the last text or reasoning part grew. The card\n * builds its steps from tool calls, their results and reasoning steps, never from those words (the\n * answer renders below it, `SuperGroupingFinalText`), and the turn being generated changes its last\n * part on every streamed token; earlier parts keep their objects across a token (the runtime's\n * conversion cache), so the card re-renders when a step changes, not per token. Any other change,\n * and the run ending, hand over the current content.\n */\nfunction createActivityContentSelector(): (\n state: AssistantState,\n) => readonly ThreadAssistantMessagePart[] {\n let last: readonly ThreadAssistantMessagePart[] = EMPTY_CONTENT;\n return (state) => {\n const message = state.message;\n const content = message.role === 'assistant' ? message.content : EMPTY_CONTENT;\n if (message.status?.type === 'running' && onlyLastPartGrew({ previous: last, next: content })) {\n return last;\n }\n last = content;\n return content;\n };\n}\nconst RUNNING_STATUS = { type: 'running' } as const;\nconst COMPLETE_STATUS = { type: 'complete' } as const;\n\n// ─── Disclosure memory ─────────────────────────────────────────────────\n\n/**\n * Session-local memory of which cards the user opened, keyed by the host's\n * expansion key (the message id by default; the Chrome extension keys by\n * thread + position so a streaming message keeps its choice when it receives\n * its stable id). Bounded so a long session cannot grow it without limit.\n */\nconst rememberedExpansions = new Map<string, boolean>();\n\nfunction rememberExpansion(key: string, expanded: boolean): void {\n rememberedExpansions.delete(key);\n rememberedExpansions.set(key, expanded);\n while (rememberedExpansions.size > MAX_REMEMBERED_EXPANSIONS) {\n const oldestKey = rememberedExpansions.keys().next().value;\n if (oldestKey === undefined) break;\n rememberedExpansions.delete(oldestKey);\n }\n}\n\nexport function resetRememberedExpansionsForTests(): void {\n rememberedExpansions.clear();\n}\n\n/**\n * The details disclosure: remembered per expansion key, and — when the host\n * opts in — opened once when the turn starts waiting on the person, so the\n * approval controls inside the details are visible without a click.\n */\nexport function useActivityExpansion({\n expansionKey,\n phase,\n expandWhileWaiting = false,\n}: {\n expansionKey: string;\n phase: ActivityPhase;\n expandWhileWaiting?: boolean;\n}) {\n const [userExpanded, setUserExpanded] = useState<boolean | undefined>(() =>\n rememberedExpansions.get(expansionKey),\n );\n const [waitingAutoExpanded, setWaitingAutoExpanded] = useState(false);\n const previousRef = useRef({ expansionKey, phase });\n\n useEffect(() => {\n setUserExpanded(rememberedExpansions.get(expansionKey));\n setWaitingAutoExpanded(false);\n }, [expansionKey]);\n\n useEffect(() => {\n const previous = previousRef.current;\n if (expandWhileWaiting && previous.expansionKey === expansionKey) {\n if (previous.phase !== 'waiting' && phase === 'waiting') {\n setWaitingAutoExpanded(true);\n } else if (previous.phase === 'waiting' && phase !== 'waiting') {\n setWaitingAutoExpanded(false);\n }\n }\n previousRef.current = { expansionKey, phase };\n }, [expansionKey, phase, expandWhileWaiting]);\n\n const expanded = waitingAutoExpanded || (userExpanded ?? (expandWhileWaiting && phase === 'waiting'));\n const toggleExpanded = () => {\n const next = !expanded;\n setWaitingAutoExpanded(false);\n rememberExpansion(expansionKey, next);\n setUserExpanded(next);\n };\n\n return { expanded, toggleExpanded };\n}\n\n// ─── Card ──────────────────────────────────────────────────────────────\n\nexport interface SuperGroupingCardProps {\n /** Tool UIs to render inside the details panel, by tool name (registered tool UIs still apply). */\n toolUIs?: Record<string, ToolCallMessagePartComponent>;\n /** Fallback for tools without a UI; the SDK's `ToolFallback` by default. */\n ToolFallback?: ComponentType<ToolCallMessagePartProps>;\n /** Text renderer for the details panel. */\n TextComponent: TextMessagePartComponent;\n /** Reasoning renderer for the details panel. */\n ReasoningComponent?: ReasoningMessagePartComponent;\n /** Per-toolkit block inside the details panel; the SDK's `CollapsibleGroup` by default. */\n GroupComponent?: ComponentType<CollapsibleGroupProps>;\n /** Toolkit lookup driving the per-toolkit sub-grouping; the SDK's static map by default. */\n getToolGroupKey?: GetToolGroupKey;\n /** A complete grouping function, when the host builds its own (overrides `getToolGroupKey`). */\n groupingFunction?: GroupingFunction;\n /** Tools whose unresolved call means the turn is waiting on the person (see `buildActivityTimeline`). */\n waitingTools?: ReadonlySet<string>;\n /**\n * Calls the run is parked on, by tool-call id: each one still without its\n * real result reads as waiting (see `buildActivityTimeline`). Keep the set's\n * identity stable while its ids are unchanged.\n */\n waitingToolCallIds?: ReadonlySet<string>;\n /** Tools whose result is a relayed application payload (see `buildActivityTimeline`). */\n passThroughTools?: ReadonlySet<string>;\n /**\n * Tools whose card renders below the header, outside both disclosures, and\n * stays mounted (an editable email draft, a UI test report). `isSdkInlineTool`\n * by default: the registry's `inline` flag plus the SDK's own report cards.\n * The call itself comes second, for a host whose choice depends on what the\n * call did (Olympus keeps an `eval` there only when it dispatched subagents).\n * The card renders it under `useToolPartPlacement()` `'inline'`.\n */\n isInlineTool?: (toolName: string, part: ToolCallMessagePart) => boolean;\n /**\n * Tools whose card is their own step's row in the step list, drawn in place\n * of the status line (Olympus's one-line code runs) and kept out of the\n * details. The card renders it under `useToolPartPlacement()` `'step'`, kept\n * mounted while the step list is (the turn is live, or `mountDetails`); a\n * call that is inline too renders in both places. None by default.\n */\n isStepRowTool?: (toolName: string) => boolean;\n /**\n * Host assertion that the turn is waiting on the person. The SDK derives waiting\n * from `requires-action` and waiting tools itself; no in-repo host passes this.\n */\n waitingForInput?: boolean;\n /** Names tools the shared registry has no entry for (Olympus's tool catalog). */\n resolveToolDisplayName?: (toolName: string) => string | undefined;\n /** Key the disclosure choice is remembered under; the message id by default. */\n expansionKey?: string;\n /** Open the details once when the turn starts waiting on the person. */\n expandWhileWaiting?: boolean;\n /**\n * Keep the details panel mounted (hidden) while collapsed, so a host that\n * needs to find content inside it (a deep link into the run's steps) can.\n */\n mountDetails?: boolean;\n /** Latest steps shown when expanded; unresolved parallel calls always remain visible. */\n maxVisibleSteps?: number;\n /** Extra segments after the collapsed summary (\"1m 23s\", \"12.4k tokens\"), joined with \" · \". */\n summaryDetails?: readonly string[];\n /** Header controls beside the title (a stop button while running, a changes button once done). */\n renderHeaderActions?: (context: {\n phase: ActivityPhase;\n messageContent: readonly ThreadAssistantMessagePart[];\n }) => ReactNode;\n /**\n * Inline on the header row, right of the status, while the turn is running\n * (an elapsed counter). Not rendered while the turn waits on the person.\n */\n renderRunningMeta?: (context: { phase: ActivityPhase }) => ReactNode;\n /** The host's icon for a step's tool, shown on its status row (see `ToolTimeline`). */\n renderStepIcon?: (step: TimelineStep) => ReactNode;\n /** Show the favicons of the sites a finished step's result lists. */\n showSourceFavicons?: boolean;\n className?: string;\n classNames?: {\n root?: string;\n details?: string;\n /** The flex column the run's parts render in; override its gap here. */\n detailsParts?: string;\n /** The flex column the inline tool calls render in, below the header; override its gap here. */\n inlineTools?: string;\n };\n}\n\n/**\n * The collapsed view (previously called the conversational view) of an\n * assistant turn: a compact current action, an expandable tool timeline, and\n * the original interactive tool UIs behind a separate details disclosure. The\n * answer itself renders below the card (`SuperGroupingFinalText`). Shared by\n * the SDK's `AthenaChat`, Olympus, and the Chrome extension, which supply\n * their own text/tool renderers and the host-specific controls through the\n * slots.\n *\n * The details panel stays mounted (visually hidden) while the turn is live so\n * the tool UIs inside run their effects — an asset-streaming card's follow\n * mode must not wait for \"Show details\". A host can take a call out of the\n * details to render its tool UI in the open (`isInlineTool`) or as its step's\n * row (`isStepRowTool`); the tool UI reads which (`useToolPartPlacement`).\n *\n * Selector discipline: raw reads only (`message.status`, `message.id`, and the\n * content through `createActivityContentSelector`, which hands back the\n * message's own array or the previous one, never a new array); every\n * derivation runs in `useMemo` — a selector that returned a fresh array would\n * tear through `useSyncExternalStore`.\n */\nexport const SuperGroupingCard = memo(function SuperGroupingCard({\n toolUIs,\n ToolFallback: ToolFallbackComponent = ToolFallback,\n TextComponent,\n ReasoningComponent,\n GroupComponent = CollapsibleGroup,\n getToolGroupKey = defaultGetToolGroupKey,\n groupingFunction,\n waitingTools,\n waitingToolCallIds,\n passThroughTools,\n isInlineTool = isSdkInlineTool,\n isStepRowTool = NO_STEP_ROW_TOOLS,\n waitingForInput = false,\n resolveToolDisplayName,\n expansionKey: expansionKeyProp,\n expandWhileWaiting = false,\n mountDetails = false,\n maxVisibleSteps = DEFAULT_MAX_VISIBLE_STEPS,\n summaryDetails,\n renderStepIcon,\n showSourceFavicons,\n renderHeaderActions,\n renderRunningMeta,\n className,\n classNames,\n}: SuperGroupingCardProps) {\n const messageId = useAuiState((s) => s.message.id);\n const earlierStepsUnloaded = useEarlierStepsUnloaded();\n const stepsMarker = useTurnStepsMarker();\n const TurnStepsControl = useTurnStepsControl();\n const hiddenSteps = stepsMarker\n ? { tools: stepsMarker.hiddenTools, delegations: stepsMarker.hiddenDelegations }\n : undefined;\n const [selectActivityContent] = useState(createActivityContentSelector);\n const messageContent = useAuiState(selectActivityContent);\n const messageStatus = useAuiState((s) => s.message.status);\n\n const timeline = useMemo(() => {\n const items = buildActivityTimeline(messageContent, messageStatus, {\n waitingTools,\n waitingToolCallIds,\n passThroughTools,\n });\n return items.length > 0 ? items : EMPTY_TIMELINE;\n }, [messageContent, messageStatus, waitingTools, waitingToolCallIds, passThroughTools]);\n const phase = useMemo(\n () => resolveActivityPhase(messageStatus, timeline, { waitingForInput }),\n [messageStatus, timeline, waitingForInput],\n );\n const toolCount = countActivityTools(timeline) + (hiddenSteps?.tools ?? 0);\n\n // A turn of older history paged by command changes its message id as its\n // steps load (the first step leads the reply), so it is remembered by the\n // turn: otherwise opening it would fetch its steps and close it again.\n const expansionBase = expansionKeyProp ?? (stepsMarker ? `turn:${stepsMarker.turn}` : messageId);\n const { expanded, toggleExpanded } = useActivityExpansion({\n expansionKey: expansionBase,\n phase,\n expandWhileWaiting,\n });\n const generatedId = useId().replace(/[^A-Za-z0-9_-]/g, '');\n const detailsPanelId = `aui-sg-details-${generatedId}`;\n const statusId = `aui-sg-status-${generatedId}`;\n const { expanded: detailsExpanded, toggleExpanded: toggleDetails } = useActivityExpansion({\n expansionKey: `${expansionBase}:details`,\n phase,\n expandWhileWaiting,\n });\n const assetTitles = useMemo(() => collectAssetTitles(messageContent), [messageContent]);\n const steps = useMemo(\n () =>\n timeline.map((item, index) =>\n toTimelineStep({ item, index, resolveToolDisplayName, assetTitles, withSourceUrls: showSourceFavicons }),\n ),\n [timeline, resolveToolDisplayName, assetTitles, showSourceFavicons],\n );\n\n // The calls rendered outside the details: inline below the header, and as\n // their own step's row (by tool-call id, a tool step's id).\n const { inlineParts, stepRowParts } = useMemo(() => {\n const inline: { index: number; key: string }[] = [];\n const stepRows = new Map<string, number>();\n messageContent.forEach((part, index) => {\n if (part.type !== 'tool-call') return;\n if (isInlineTool(part.toolName, part)) inline.push({ index, key: part.toolCallId });\n if (isStepRowTool(part.toolName)) stepRows.set(part.toolCallId, index);\n });\n return { inlineParts: inline, stepRowParts: stepRows };\n }, [messageContent, isInlineTool, isStepRowTool]);\n const grouping = useMemo(\n () =>\n excludePartsFromGroups(\n excludeFinalTextFromGroups(groupingFunction ?? createToolBasedGroupingFunction(getToolGroupKey)),\n (part) =>\n isGroupedToolCallPart(part) && (isStepRowTool(part.toolName) || isInlineTool(part.toolName, part)),\n ),\n [groupingFunction, getToolGroupKey, isInlineTool, isStepRowTool],\n );\n const hasDetails = useMemo(() => grouping(messageContent).length > 0, [grouping, messageContent]);\n const isActive = phase === 'running' || phase === 'waiting';\n // The toolkit groups inside keep their tool UIs mounted when the details do.\n const groupingContext = useMemo(\n () => ({ groupingFunction: grouping, mountHidden: isActive || mountDetails }),\n [grouping, isActive, mountDetails],\n );\n const components = useMemo(\n () => ({\n tools: {\n ...(toolUIs ? { by_name: toolUIs } : {}),\n Fallback: ToolFallbackComponent,\n },\n Text: TextComponent,\n ...(ReasoningComponent ? { Reasoning: ReasoningComponent } : {}),\n Group: GroupComponent,\n }),\n [toolUIs, ToolFallbackComponent, TextComponent, ReasoningComponent, GroupComponent],\n );\n\n // A turn whose earlier steps have not loaded says so even when only its\n // answer has: its steps (and prompt) are older than the window.\n const hasActivity =\n timeline.length > 0 || phase !== 'complete' || earlierStepsUnloaded || (stepsMarker?.hiddenSteps ?? 0) > 0;\n if (!hasActivity) return null;\n\n // Tool UIs perform live subscriptions and asset-follow effects. Collapsing\n // either disclosure must only hide them while active or targeted by a deep link.\n const detailsMounted = isActive || mountDetails || (expanded && detailsExpanded);\n const activeSteps = steps.filter((step) => step.state === 'running');\n const currentStep = activeSteps.at(-1);\n const latestStatus =\n phase === 'waiting'\n ? 'Waiting for you'\n : phase === 'error'\n ? messageStatus?.type === 'incomplete' && messageStatus.reason === 'cancelled'\n ? 'Run stopped'\n : 'Something went wrong'\n : phase === 'running'\n ? currentStep\n ? [\n currentStep.verb,\n currentStep.chip,\n activeSteps.length > 1 ? `${activeSteps.length} in progress` : null,\n ]\n .filter(Boolean)\n .join(' · ')\n : steps.length > 0\n ? 'Preparing response'\n : 'Thinking'\n : getActivitySummary(timeline, { earlierStepsUnloaded, hiddenSteps });\n const label = [latestStatus, ...(isActive ? [] : (summaryDetails ?? []))].join(' · ');\n // A step-row call's own card is its step's row.\n const renderStepRow =\n stepRowParts.size > 0\n ? (step: TimelineStep) => {\n const index = step.kind === 'tool' ? stepRowParts.get(step.id) : undefined;\n return index === undefined ? null : (\n <ToolPartPlacementProvider value=\"step\">\n <MessagePrimitive.PartByIndex index={index} components={components} />\n </ToolPartPlacementProvider>\n );\n }\n : undefined;\n\n return (\n <section\n data-slot=\"super-grouping-card\"\n data-phase={phase}\n data-tool-count={toolCount}\n className={cn('my-3 min-w-0', className, classNames?.root)}\n aria-busy={phase === 'running' ? 'true' : 'false'}\n aria-describedby={statusId}\n >\n <ToolTimeline\n steps={steps}\n open={expanded}\n onOpenChange={toggleExpanded}\n label={label}\n phase={phase}\n maxVisibleSteps={maxVisibleSteps}\n keepMounted={isActive || mountDetails}\n actions={renderHeaderActions?.({ phase, messageContent })}\n meta={phase === 'running' ? renderRunningMeta?.({ phase }) : null}\n renderStepIcon={renderStepIcon}\n renderStepRow={renderStepRow}\n showSourceFavicons={showSourceFavicons}\n >\n {/* Opening a turn of older history fetches its newest steps (once). */}\n {stepsMarker && stepsMarker.hiddenSteps > 0 && TurnStepsControl ? (\n <div className=\"min-w-0 pl-5\">\n <TurnStepsControl marker={stepsMarker} autoLoad={expanded} />\n </div>\n ) : null}\n {hasDetails ? (\n <div className=\"min-w-0 pl-5\">\n <button\n type=\"button\"\n onClick={toggleDetails}\n aria-expanded={detailsExpanded}\n aria-controls={detailsPanelId}\n className=\"flex items-center gap-1.5 rounded py-1 text-xs text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <ChevronRight\n aria-hidden=\"true\"\n className={cn(\n 'size-3 transition-transform motion-reduce:transition-none',\n detailsExpanded && 'rotate-90',\n )}\n />\n {detailsExpanded ? 'Hide tool details' : 'Show tool details'}\n </button>\n {detailsMounted ? (\n <section\n id={detailsPanelId}\n aria-label=\"Run details\"\n hidden={!expanded || !detailsExpanded}\n className={cn(\n 'min-w-0 overflow-hidden border-l border-border/60 py-2 pl-3',\n classNames?.details,\n )}\n >\n <div className={cn('flex flex-col gap-2', classNames?.detailsParts)}>\n <SuperGroupingProvider value={groupingContext}>\n <ToolPartPlacementProvider value={null}>\n <GroupedMessageParts groupingFunction={grouping} components={components} />\n </ToolPartPlacementProvider>\n </SuperGroupingProvider>\n </div>\n </section>\n ) : null}\n </div>\n ) : null}\n </ToolTimeline>\n {inlineParts.length > 0 ? (\n <div\n data-slot=\"super-grouping-inline-tools\"\n className={cn('mt-2 flex min-w-0 flex-col gap-2', classNames?.inlineTools)}\n >\n <ToolPartPlacementProvider value=\"inline\">\n {inlineParts.map(({ index, key }) => (\n <MessagePrimitive.PartByIndex key={key} index={index} components={components} />\n ))}\n </ToolPartPlacementProvider>\n </div>\n ) : null}\n <output id={statusId} aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\">\n {phase === 'waiting' ? 'Waiting for your input' : latestStatus}\n </output>\n </section>\n );\n});\n\n/**\n * The turn's visible answer, rendered below the card: the text after the last\n * tool call (all of it when the turn called no tools) and the words of any\n * spoken voice turn the message holds (`getFinalTextParts`), streaming while\n * the turn is live so the person reads the answer as it arrives.\n *\n * Each part renders through its own `TextComponent`, keyed by its content\n * index, so a part only ever grows at its end: a spoken turn streaming while\n * the run's reply streams after it would otherwise change one joined string in\n * the middle, and a streaming reveal restarts from empty on every word. Only\n * the last part carries the running status (and its caret).\n */\nexport const SuperGroupingFinalText = memo(function SuperGroupingFinalText({\n TextComponent,\n}: {\n TextComponent: TextMessagePartComponent;\n}) {\n const messageContent = useAuiState((s) =>\n s.message.role === 'assistant' ? s.message.content : EMPTY_CONTENT,\n );\n const statusType = useAuiState((s) => s.message.status?.type);\n const parts = useMemo(() => getFinalTextParts(messageContent), [messageContent]);\n\n if (parts.length === 0) return null;\n const running = statusType === 'running' || statusType === 'requires-action';\n return (\n <div data-slot=\"super-grouping-final-text\" className=\"flex min-w-0 flex-col gap-1.5\">\n {parts.map((part, position) => (\n <TextComponent\n key={part.index}\n type=\"text\"\n text={part.text}\n status={running && position === parts.length - 1 ? RUNNING_STATUS : COMPLETE_STATUS}\n />\n ))}\n </div>\n );\n});\n"],"names":["SuperGroupingCard","SuperGroupingFinalText"],"mappings":";;;;;;;;;;;;;;;;;;AAuCA,MAAM,4BAA4B;AAClC,MAAM,4BAA4B;AAClC,MAAM,iBAAiC,CAAA;AACvC,MAAM,gBAAuD,CAAA;AAC7D,MAAM,oBAAoB,MAAe;AAOzC,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AACF,GAGY;;AACV,MAAI,aAAa,KAAM,QAAO;AAC9B,MAAI,SAAS,WAAW,KAAK,SAAS,WAAW,KAAK,OAAQ,QAAO;AACrE,QAAM,YAAY,KAAK,SAAS;AAChC,QAAM,QAAO,UAAK,SAAS,MAAd,mBAAiB;AAC9B,MAAK,SAAS,UAAU,SAAS,iBAAgB,cAAS,SAAS,MAAlB,mBAAqB,UAAS,KAAM,QAAO;AAC5F,WAAS,QAAQ,GAAG,QAAQ,WAAW,SAAS,GAAG;AACjD,QAAI,SAAS,KAAK,MAAM,KAAK,KAAK,EAAG,QAAO;AAAA,EAC9C;AACA,SAAO;AACT;AAWA,SAAS,gCAEkC;AACzC,MAAI,OAA8C;AAClD,SAAO,CAAC,UAAU;;AAChB,UAAM,UAAU,MAAM;AACtB,UAAM,UAAU,QAAQ,SAAS,cAAc,QAAQ,UAAU;AACjE,UAAI,aAAQ,WAAR,mBAAgB,UAAS,aAAa,iBAAiB,EAAE,UAAU,MAAM,MAAM,QAAA,CAAS,GAAG;AAC7F,aAAO;AAAA,IACT;AACA,WAAO;AACP,WAAO;AAAA,EACT;AACF;AACA,MAAM,iBAAiB,EAAE,MAAM,UAAA;AAC/B,MAAM,kBAAkB,EAAE,MAAM,WAAA;AAUhC,MAAM,2CAA2B,IAAA;AAEjC,SAAS,kBAAkB,KAAa,UAAyB;AAC/D,uBAAqB,OAAO,GAAG;AAC/B,uBAAqB,IAAI,KAAK,QAAQ;AACtC,SAAO,qBAAqB,OAAO,2BAA2B;AAC5D,UAAM,YAAY,qBAAqB,KAAA,EAAO,OAAO;AACrD,QAAI,cAAc,OAAW;AAC7B,yBAAqB,OAAO,SAAS;AAAA,EACvC;AACF;AAEO,SAAS,oCAA0C;AACxD,uBAAqB,MAAA;AACvB;AAOO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA,qBAAqB;AACvB,GAIG;AACD,QAAM,CAAC,cAAc,eAAe,IAAI;AAAA,IAA8B,MACpE,qBAAqB,IAAI,YAAY;AAAA,EAAA;AAEvC,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAS,KAAK;AACpE,QAAM,cAAc,OAAO,EAAE,cAAc,OAAO;AAElD,YAAU,MAAM;AACd,oBAAgB,qBAAqB,IAAI,YAAY,CAAC;AACtD,2BAAuB,KAAK;AAAA,EAC9B,GAAG,CAAC,YAAY,CAAC;AAEjB,YAAU,MAAM;AACd,UAAM,WAAW,YAAY;AAC7B,QAAI,sBAAsB,SAAS,iBAAiB,cAAc;AAChE,UAAI,SAAS,UAAU,aAAa,UAAU,WAAW;AACvD,+BAAuB,IAAI;AAAA,MAC7B,WAAW,SAAS,UAAU,aAAa,UAAU,WAAW;AAC9D,+BAAuB,KAAK;AAAA,MAC9B;AAAA,IACF;AACA,gBAAY,UAAU,EAAE,cAAc,MAAA;AAAA,EACxC,GAAG,CAAC,cAAc,OAAO,kBAAkB,CAAC;AAE5C,QAAM,WAAW,wBAAwB,iBAAiB,sBAAsB,UAAU;AAC1F,QAAM,iBAAiB,MAAM;AAC3B,UAAM,OAAO,CAAC;AACd,2BAAuB,KAAK;AAC5B,sBAAkB,cAAc,IAAI;AACpC,oBAAgB,IAAI;AAAA,EACtB;AAEA,SAAO,EAAE,UAAU,eAAA;AACrB;AAgHO,MAAM,oBAAoB,KAAK,SAASA,mBAAkB;AAAA,EAC/D;AAAA,EACA,cAAc,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB;AAAA,EACA,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,YAAY,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE;AACjD,QAAM,uBAAuB,wBAAA;AAC7B,QAAM,cAAc,mBAAA;AACpB,QAAM,mBAAmB,oBAAA;AACzB,QAAM,cAAc,cAChB,EAAE,OAAO,YAAY,aAAa,aAAa,YAAY,kBAAA,IAC3D;AACJ,QAAM,CAAC,qBAAqB,IAAI,SAAS,6BAA6B;AACtE,QAAM,iBAAiB,YAAY,qBAAqB;AACxD,QAAM,gBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,MAAM;AAEzD,QAAM,WAAW,QAAQ,MAAM;AAC7B,UAAM,QAAQ,sBAAsB,gBAAgB,eAAe;AAAA,MACjE;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AACD,WAAO,MAAM,SAAS,IAAI,QAAQ;AAAA,EACpC,GAAG,CAAC,gBAAgB,eAAe,cAAc,oBAAoB,gBAAgB,CAAC;AACtF,QAAM,QAAQ;AAAA,IACZ,MAAM,qBAAqB,eAAe,UAAU,EAAE,iBAAiB;AAAA,IACvE,CAAC,eAAe,UAAU,eAAe;AAAA,EAAA;AAE3C,QAAM,YAAY,mBAAmB,QAAQ,MAAK,2CAAa,UAAS;AAKxE,QAAM,gBAAgB,qBAAqB,cAAc,QAAQ,YAAY,IAAI,KAAK;AACtF,QAAM,EAAE,UAAU,eAAA,IAAmB,qBAAqB;AAAA,IACxD,cAAc;AAAA,IACd;AAAA,IACA;AAAA,EAAA,CACD;AACD,QAAM,cAAc,MAAA,EAAQ,QAAQ,mBAAmB,EAAE;AACzD,QAAM,iBAAiB,kBAAkB,WAAW;AACpD,QAAM,WAAW,iBAAiB,WAAW;AAC7C,QAAM,EAAE,UAAU,iBAAiB,gBAAgB,cAAA,IAAkB,qBAAqB;AAAA,IACxF,cAAc,GAAG,aAAa;AAAA,IAC9B;AAAA,IACA;AAAA,EAAA,CACD;AACD,QAAM,cAAc,QAAQ,MAAM,mBAAmB,cAAc,GAAG,CAAC,cAAc,CAAC;AACtF,QAAM,QAAQ;AAAA,IACZ,MACE,SAAS;AAAA,MAAI,CAAC,MAAM,UAClB,eAAe,EAAE,MAAM,OAAO,wBAAwB,aAAa,gBAAgB,mBAAA,CAAoB;AAAA,IAAA;AAAA,IAE3G,CAAC,UAAU,wBAAwB,aAAa,kBAAkB;AAAA,EAAA;AAKpE,QAAM,EAAE,aAAa,aAAA,IAAiB,QAAQ,MAAM;AAClD,UAAM,SAA2C,CAAA;AACjD,UAAM,+BAAe,IAAA;AACrB,mBAAe,QAAQ,CAAC,MAAM,UAAU;AACtC,UAAI,KAAK,SAAS,YAAa;AAC/B,UAAI,aAAa,KAAK,UAAU,IAAI,EAAG,QAAO,KAAK,EAAE,OAAO,KAAK,KAAK,WAAA,CAAY;AAClF,UAAI,cAAc,KAAK,QAAQ,YAAY,IAAI,KAAK,YAAY,KAAK;AAAA,IACvE,CAAC;AACD,WAAO,EAAE,aAAa,QAAQ,cAAc,SAAA;AAAA,EAC9C,GAAG,CAAC,gBAAgB,cAAc,aAAa,CAAC;AAChD,QAAM,WAAW;AAAA,IACf,MACE;AAAA,MACE,2BAA2B,oBAAoB,gCAAgC,eAAe,CAAC;AAAA,MAC/F,CAAC,SACC,sBAAsB,IAAI,MAAM,cAAc,KAAK,QAAQ,KAAK,aAAa,KAAK,UAAU,IAAI;AAAA,IAAA;AAAA,IAEtG,CAAC,kBAAkB,iBAAiB,cAAc,aAAa;AAAA,EAAA;AAEjE,QAAM,aAAa,QAAQ,MAAM,SAAS,cAAc,EAAE,SAAS,GAAG,CAAC,UAAU,cAAc,CAAC;AAChG,QAAM,WAAW,UAAU,aAAa,UAAU;AAElD,QAAM,kBAAkB;AAAA,IACtB,OAAO,EAAE,kBAAkB,UAAU,aAAa,YAAY,aAAA;AAAA,IAC9D,CAAC,UAAU,UAAU,YAAY;AAAA,EAAA;AAEnC,QAAM,aAAa;AAAA,IACjB,OAAO;AAAA,MACL,OAAO;AAAA,QACL,GAAI,UAAU,EAAE,SAAS,QAAA,IAAY,CAAA;AAAA,QACrC,UAAU;AAAA,MAAA;AAAA,MAEZ,MAAM;AAAA,MACN,GAAI,qBAAqB,EAAE,WAAW,mBAAA,IAAuB,CAAA;AAAA,MAC7D,OAAO;AAAA,IAAA;AAAA,IAET,CAAC,SAAS,uBAAuB,eAAe,oBAAoB,cAAc;AAAA,EAAA;AAKpF,QAAM,cACJ,SAAS,SAAS,KAAK,UAAU,cAAc,0BAAyB,2CAAa,gBAAe,KAAK;AAC3G,MAAI,CAAC,YAAa,QAAO;AAIzB,QAAM,iBAAiB,YAAY,gBAAiB,YAAY;AAChE,QAAM,cAAc,MAAM,OAAO,CAAC,SAAS,KAAK,UAAU,SAAS;AACnE,QAAM,cAAc,YAAY,GAAG,EAAE;AACrC,QAAM,eACJ,UAAU,YACN,oBACA,UAAU,WACR,+CAAe,UAAS,gBAAgB,cAAc,WAAW,cAC/D,gBACA,yBACF,UAAU,YACR,cACE;AAAA,IACE,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY,SAAS,IAAI,GAAG,YAAY,MAAM,iBAAiB;AAAA,EAAA,EAE9D,OAAO,OAAO,EACd,KAAK,KAAK,IACb,MAAM,SAAS,IACb,uBACA,aACJ,mBAAmB,UAAU,EAAE,sBAAsB,aAAa;AAC5E,QAAM,QAAQ,CAAC,cAAc,GAAI,WAAW,KAAM,kBAAkB,CAAA,CAAI,EAAE,KAAK,KAAK;AAEpF,QAAM,gBACJ,aAAa,OAAO,IAChB,CAAC,SAAuB;AACtB,UAAM,QAAQ,KAAK,SAAS,SAAS,aAAa,IAAI,KAAK,EAAE,IAAI;AACjE,WAAO,UAAU,SAAY,OAC3B,oBAAC,2BAAA,EAA0B,OAAM,QAC/B,UAAA,oBAAC,iBAAiB,aAAjB,EAA6B,OAAc,YAAwB,GACtE;AAAA,EAEJ,IACA;AAEN,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,cAAY;AAAA,MACZ,mBAAiB;AAAA,MACjB,WAAW,GAAG,gBAAgB,WAAW,yCAAY,IAAI;AAAA,MACzD,aAAW,UAAU,YAAY,SAAS;AAAA,MAC1C,oBAAkB;AAAA,MAElB,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,MAAM;AAAA,YACN,cAAc;AAAA,YACd;AAAA,YACA;AAAA,YACA;AAAA,YACA,aAAa,YAAY;AAAA,YACzB,SAAS,2DAAsB,EAAE,OAAO;YACxC,MAAM,UAAU,YAAY,uDAAoB,EAAE,MAAA,KAAW;AAAA,YAC7D;AAAA,YACA;AAAA,YACA;AAAA,YAGC,UAAA;AAAA,cAAA,eAAe,YAAY,cAAc,KAAK,uCAC5C,OAAA,EAAI,WAAU,gBACb,UAAA,oBAAC,oBAAiB,QAAQ,aAAa,UAAU,SAAA,CAAU,GAC7D,IACE;AAAA,cACH,aACC,qBAAC,OAAA,EAAI,WAAU,gBACb,UAAA;AAAA,gBAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,iBAAe;AAAA,oBACf,iBAAe;AAAA,oBACf,WAAU;AAAA,oBAEV,UAAA;AAAA,sBAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,eAAY;AAAA,0BACZ,WAAW;AAAA,4BACT;AAAA,4BACA,mBAAmB;AAAA,0BAAA;AAAA,wBACrB;AAAA,sBAAA;AAAA,sBAED,kBAAkB,sBAAsB;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAE1C,iBACC;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,IAAI;AAAA,oBACJ,cAAW;AAAA,oBACX,QAAQ,CAAC,YAAY,CAAC;AAAA,oBACtB,WAAW;AAAA,sBACT;AAAA,sBACA,yCAAY;AAAA,oBAAA;AAAA,oBAGd,UAAA,oBAAC,SAAI,WAAW,GAAG,uBAAuB,yCAAY,YAAY,GAChE,UAAA,oBAAC,uBAAA,EAAsB,OAAO,iBAC5B,UAAA,oBAAC,2BAAA,EAA0B,OAAO,MAChC,UAAA,oBAAC,qBAAA,EAAoB,kBAAkB,UAAU,WAAA,CAAwB,EAAA,CAC3E,EAAA,CACF,EAAA,CACF;AAAA,kBAAA;AAAA,gBAAA,IAEA;AAAA,cAAA,EAAA,CACN,IACE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAEL,YAAY,SAAS,IACpB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,aAAU;AAAA,YACV,WAAW,GAAG,oCAAoC,yCAAY,WAAW;AAAA,YAEzE,8BAAC,2BAAA,EAA0B,OAAM,UAC9B,UAAA,YAAY,IAAI,CAAC,EAAE,OAAO,UACzB,oBAAC,iBAAiB,aAAjB,EAAuC,OAAc,WAAA,GAAnB,GAA2C,CAC/E,EAAA,CACH;AAAA,UAAA;AAAA,QAAA,IAEA;AAAA,QACJ,oBAAC,UAAA,EAAO,IAAI,UAAU,aAAU,UAAS,eAAY,QAAO,WAAU,WACnE,UAAA,UAAU,YAAY,2BAA2B,aAAA,CACpD;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN,CAAC;AAcM,MAAM,yBAAyB,KAAK,SAASC,wBAAuB;AAAA,EACzE;AACF,GAEG;AACD,QAAM,iBAAiB;AAAA,IAAY,CAAC,MAClC,EAAE,QAAQ,SAAS,cAAc,EAAE,QAAQ,UAAU;AAAA,EAAA;AAEvD,QAAM,aAAa,YAAY,CAAC;;AAAM,mBAAE,QAAQ,WAAV,mBAAkB;AAAA,GAAI;AAC5D,QAAM,QAAQ,QAAQ,MAAM,kBAAkB,cAAc,GAAG,CAAC,cAAc,CAAC;AAE/E,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,UAAU,eAAe,aAAa,eAAe;AAC3D,SACE,oBAAC,OAAA,EAAI,aAAU,6BAA4B,WAAU,iCAClD,UAAA,MAAM,IAAI,CAAC,MAAM,aAChB;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,MAAK;AAAA,MACL,MAAM,KAAK;AAAA,MACX,QAAQ,WAAW,aAAa,MAAM,SAAS,IAAI,iBAAiB;AAAA,IAAA;AAAA,IAH/D,KAAK;AAAA,EAAA,CAKb,GACH;AAEJ,CAAC;"}
|
|
@@ -18,6 +18,7 @@ const ToolTimeline = require("./ToolTimeline.cjs");
|
|
|
18
18
|
const timelineStep = require("./timeline-step.cjs");
|
|
19
19
|
const toolkitMap = require("./toolkit-map.cjs");
|
|
20
20
|
const useEarlierStepsUnloaded = require("./use-earlier-steps-unloaded.cjs");
|
|
21
|
+
const useTurnSteps = require("./use-turn-steps.cjs");
|
|
21
22
|
const turnSegments = require("./turn-segments.cjs");
|
|
22
23
|
const turnTiming = require("./turn-timing.cjs");
|
|
23
24
|
const cnfast = require("cnfast");
|
|
@@ -231,6 +232,8 @@ const SuperGroupingTranscript = require$$0.memo(function SuperGroupingTranscript
|
|
|
231
232
|
}) {
|
|
232
233
|
const messageId = react.useAuiState((s) => s.message.id);
|
|
233
234
|
const earlierStepsUnloaded = useEarlierStepsUnloaded.useEarlierStepsUnloaded();
|
|
235
|
+
const stepsMarker = useTurnSteps.useTurnStepsMarker();
|
|
236
|
+
const TurnStepsControl = useTurnSteps.useTurnStepsControl();
|
|
234
237
|
const messageContent = react.useAuiState(
|
|
235
238
|
(s) => s.message.role === "assistant" ? s.message.content : EMPTY_CONTENT
|
|
236
239
|
);
|
|
@@ -285,13 +288,14 @@ const SuperGroupingTranscript = require$$0.memo(function SuperGroupingTranscript
|
|
|
285
288
|
);
|
|
286
289
|
const statusId = `aui-sg-turn-${require$$0.useId().replace(/[^A-Za-z0-9_-]/g, "")}`;
|
|
287
290
|
const hasText = messageContent.some((part) => part.type === "text" && part.text.trim() !== "");
|
|
288
|
-
const isVisible = timeline.length > 0 || phase === "waiting" || phase === "error" || phase === "running" && !hasText || earlierStepsUnloaded;
|
|
291
|
+
const isVisible = timeline.length > 0 || phase === "waiting" || phase === "error" || phase === "running" && !hasText || earlierStepsUnloaded || ((stepsMarker == null ? void 0 : stepsMarker.hiddenSteps) ?? 0) > 0;
|
|
289
292
|
if (!isVisible) return null;
|
|
290
|
-
const expansionKey = expansionKeyProp ?? messageId;
|
|
291
|
-
const
|
|
293
|
+
const expansionKey = expansionKeyProp ?? (stepsMarker ? `turn:${stepsMarker.turn}` : messageId);
|
|
294
|
+
const hiddenSteps = stepsMarker ? { tools: stepsMarker.hiddenTools, delegations: stepsMarker.hiddenDelegations } : void 0;
|
|
295
|
+
const toolCount = activityTimeline.countActivityTools(timeline) + ((hiddenSteps == null ? void 0 : hiddenSteps.tools) ?? 0);
|
|
292
296
|
const runningStep = [...stepsByPart.values()].filter((step) => step.state === "running").at(-1);
|
|
293
297
|
const cancelled = (messageStatus == null ? void 0 : messageStatus.type) === "incomplete" && messageStatus.reason === "cancelled";
|
|
294
|
-
const activitySummary = activityTimeline.getActivitySummary(timeline, { earlierStepsUnloaded });
|
|
298
|
+
const activitySummary = activityTimeline.getActivitySummary(timeline, { earlierStepsUnloaded, hiddenSteps });
|
|
295
299
|
const announcement = phase === "running" ? (runningStep == null ? void 0 : runningStep.verb) ?? "Working" : phase === "waiting" ? "Waiting for your input" : phase === "error" ? cancelled ? "Run stopped" : "Something went wrong" : activitySummary;
|
|
296
300
|
const actions = renderHeaderActions == null ? void 0 : renderHeaderActions({ phase, messageContent });
|
|
297
301
|
const meta = phase === "running" ? renderRunningMeta == null ? void 0 : renderRunningMeta({ phase }) : null;
|
|
@@ -340,6 +344,7 @@ const SuperGroupingTranscript = require$$0.memo(function SuperGroupingTranscript
|
|
|
340
344
|
]
|
|
341
345
|
}
|
|
342
346
|
),
|
|
347
|
+
stepsMarker && TurnStepsControl ? /* @__PURE__ */ jsxRuntime.jsx(TurnStepsControl, { marker: stepsMarker }) : null,
|
|
343
348
|
segments.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
344
349
|
"div",
|
|
345
350
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SuperGroupingTranscript.cjs","sources":["../../../src/chat/super-grouping/SuperGroupingTranscript.tsx"],"sourcesContent":["'use client';\n\nimport {\n getExternalStoreMessages,\n MessagePrimitive,\n type TextMessagePartComponent,\n type ThreadAssistantMessagePart,\n useAuiState,\n} from '@assistant-ui/react';\nimport { AlertCircle, Check, ChevronRight, Circle, LoaderCircle } from 'lucide-react';\nimport { memo, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { cn } from '../../lib/utils';\nimport { StepText } from '../../tools/step-text';\nimport { isSdkInlineTool } from '../../tools/inline-tools';\nimport { ToolFallback } from '../../tools/tool-fallback';\nimport { collectAssetTitles } from '../../tools/tool-summary';\nimport { readMessageCreatedAt } from '../message-time';\nimport {\n type ActivityPhase,\n buildActivityTimeline,\n countActivityTools,\n excludePartsFromGroups,\n getActivitySummary,\n resolveActivityPhase,\n} from './activity-timeline';\nimport { CollapsibleGroup, SuperGroupingProvider } from './CollapsibleGroup';\nimport { GroupedMessageParts, type GroupedMessagePartsProps } from './GroupedMessageParts';\nimport { createToolBasedGroupingFunction, type GroupingFunction, isGroupedToolCallPart } from './grouping-function';\nimport { type SuperGroupingCardProps, useActivityExpansion } from './SuperGroupingCard';\nimport { ToolTimeline } from './ToolTimeline';\nimport { type TimelineStep, toTimelineStep } from './timeline-step';\nimport { defaultGetToolGroupKey } from './toolkit-map';\nimport { useEarlierStepsUnloaded } from './use-earlier-steps-unloaded';\nimport {\n scopeGroupingToSegment,\n splitTurnSegments,\n summarizeSegment,\n type TurnSegment,\n} from './turn-segments';\nimport {\n firstSeenMs,\n formatWorkDuration,\n observedTurnEndMs,\n readTurnTiming,\n recordObservedTurnEnd,\n type TurnTiming,\n workedDurationMs,\n workingLabel,\n} from './turn-timing';\n\nconst DEFAULT_MAX_VISIBLE_STEPS = 6;\nconst EMPTY_CONTENT: readonly ThreadAssistantMessagePart[] = [];\nconst EMPTY_STEPS: readonly TimelineStep[] = [];\n\nexport interface SuperGroupingTranscriptProps\n extends Pick<\n SuperGroupingCardProps,\n | 'toolUIs'\n | 'ToolFallback'\n | 'TextComponent'\n | 'ReasoningComponent'\n | 'GroupComponent'\n | 'getToolGroupKey'\n | 'groupingFunction'\n | 'isInlineTool'\n | 'waitingTools'\n | 'waitingToolCallIds'\n | 'passThroughTools'\n | 'waitingForInput'\n | 'resolveToolDisplayName'\n | 'expansionKey'\n | 'expandWhileWaiting'\n | 'mountDetails'\n | 'summaryDetails'\n | 'renderHeaderActions'\n | 'renderRunningMeta'\n | 'className'\n > {\n /** Steps an opened segment lists before older ones fold away; unresolved calls always show. */\n maxVisibleSteps?: number;\n classNames?: {\n root?: string;\n header?: string;\n body?: string;\n details?: string;\n /** The flex column a segment's parts render in; override its gap here. */\n detailsParts?: string;\n };\n}\n\n// ─── Turn timing ───────────────────────────────────────────────────────\n\n/**\n * The turn's stamps: the prompt it answers, its joined metadata, and the raw\n * messages behind it. Reads the whole message (the bound raw messages hang off\n * it), so only the small header status subscribes here, never the transcript.\n */\nfunction useTurnTimingSources(): { timing: TurnTiming; clockKey: string } {\n const message = useAuiState((s) => s.message);\n const promptCreatedAt = useAuiState((s) => {\n const previous = s.thread.messages[s.message.index - 1];\n return previous?.role === 'user' ? readMessageCreatedAt(previous.metadata?.custom) : null;\n });\n const promptId = useAuiState((s) => {\n const previous = s.thread.messages[s.message.index - 1];\n return previous?.role === 'user' ? previous.id : '';\n });\n const timing = useMemo(\n () =>\n readTurnTiming({\n promptCreatedAt,\n custom: message.metadata?.custom,\n sourceMessages: getExternalStoreMessages<unknown>(message),\n }),\n [message, promptCreatedAt],\n );\n return { timing, clockKey: `${promptId}:${message.id}` };\n}\n\n/** \"Working for 1m 12s\", re-rendered once a second by itself so the transcript does not. */\nfunction WorkingFor({ startMs, clockKey }: { startMs: number | null; clockKey: string }) {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n const timer = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(timer);\n }, []);\n const anchor = startMs ?? firstSeenMs(clockKey, now);\n return <>{workingLabel(Math.max(0, now - anchor))}</>;\n}\n\n/**\n * The header's words: \"Working for 1m 12s\" while the turn runs, \"Worked for\n * 2m 30s · Used 7 tools\" once done, \"Waiting for you\", or how it ended.\n */\nfunction TurnStatus({\n phase,\n cancelled,\n activitySummary,\n toolCount,\n summaryDetails,\n}: {\n phase: ActivityPhase;\n cancelled: boolean;\n activitySummary: string;\n toolCount: number;\n summaryDetails: readonly string[] | undefined;\n}) {\n const { timing, clockKey } = useTurnTimingSources();\n const [observedEndMs, setObservedEndMs] = useState(() => observedTurnEndMs(clockKey));\n const wasActive = useRef(phase === 'running' || phase === 'waiting');\n useEffect(() => {\n const active = phase === 'running' || phase === 'waiting';\n if (wasActive.current && !active) setObservedEndMs(recordObservedTurnEnd(clockKey));\n wasActive.current = active;\n }, [phase, clockKey]);\n if (phase === 'running') return <WorkingFor startMs={timing.startMs} clockKey={clockKey} />;\n if (phase === 'waiting') return <>Waiting for you</>;\n const workedMs = workedDurationMs(timing, observedEndMs);\n if (phase === 'error') {\n if (!cancelled) return <>Something went wrong</>;\n return <>{workedMs !== null ? `Run stopped after ${formatWorkDuration(workedMs)}` : 'Run stopped'}</>;\n }\n const label = [\n ...(workedMs !== null ? [`Worked for ${formatWorkDuration(workedMs)}`] : []),\n ...(workedMs === null || toolCount > 0 || activitySummary !== 'Reasoning complete' ? [activitySummary] : []),\n ...(summaryDetails ?? []),\n ].join(' · ');\n return <>{label}</>;\n}\n\nfunction TurnGlyph({ phase }: { phase: ActivityPhase }) {\n const className = 'size-3.5 shrink-0';\n if (phase === 'running') {\n return <LoaderCircle aria-hidden=\"true\" className={cn(className, 'motion-safe:animate-spin')} />;\n }\n if (phase === 'waiting') {\n return <Circle aria-hidden=\"true\" className={cn(className, 'text-amber-600 dark:text-amber-400')} />;\n }\n if (phase === 'error') {\n return <AlertCircle aria-hidden=\"true\" className={cn(className, 'text-destructive')} />;\n }\n return <Check aria-hidden=\"true\" className={cn(className, 'opacity-70')} />;\n}\n\n// ─── Segments ──────────────────────────────────────────────────────────\n\nconst ProseSegment = memo(function ProseSegment({\n text,\n TextComponent,\n}: {\n text: string;\n TextComponent: TextMessagePartComponent;\n}) {\n return (\n <div data-slot=\"transcript-prose\" className=\"min-w-0\">\n <TextComponent type=\"text\" text={text} status={{ type: 'complete' }} />\n </div>\n );\n});\n\ninterface ActivitySegmentProps {\n segment: Extract<TurnSegment, { kind: 'activity' }>;\n steps: readonly TimelineStep[];\n turnPhase: ActivityPhase;\n expansionKey: string;\n expandWhileWaiting: boolean;\n mountDetails: boolean;\n maxVisibleSteps: number;\n grouping: GroupingFunction;\n /** This segment's inline tool calls (an editable draft), rendered outside its disclosures. */\n inlineParts: readonly { index: number; key: string }[];\n /** False when every step's UI renders inline, so there is nothing behind \"Show tool details\". */\n hasDetails: boolean;\n components: GroupedMessagePartsProps['components'];\n classNames: SuperGroupingTranscriptProps['classNames'];\n}\n\n/**\n * One collapsed run of work between two of the agent's sentences: the step in\n * progress (or the last one taken) on one line, the segment's steps when\n * opened, and the tool UIs of just this segment behind \"Show tool details\".\n * The tool UIs stay mounted (hidden) while the turn is live so their effects\n * run, as in `SuperGroupingCard`.\n */\nfunction ActivitySegment({\n segment,\n steps,\n turnPhase,\n expansionKey,\n expandWhileWaiting,\n mountDetails,\n maxVisibleSteps,\n grouping,\n inlineParts,\n hasDetails,\n components,\n classNames,\n}: ActivitySegmentProps) {\n const summary = summarizeSegment(steps);\n const phase = summary.phase;\n const { expanded, toggleExpanded } = useActivityExpansion({\n expansionKey: `${expansionKey}:${segment.key}`,\n phase,\n expandWhileWaiting,\n });\n const { expanded: detailsExpanded, toggleExpanded: toggleDetails } = useActivityExpansion({\n expansionKey: `${expansionKey}:${segment.key}:details`,\n phase,\n expandWhileWaiting,\n });\n const indicesKey = segment.partIndices.join(',');\n const scopedGrouping = useMemo(\n () => scopeGroupingToSegment(grouping, indicesKey.split(',').map(Number)),\n [grouping, indicesKey],\n );\n const isTurnActive = turnPhase === 'running' || turnPhase === 'waiting';\n // The toolkit groups inside keep their tool UIs mounted when the details do.\n const groupingContext = useMemo(\n () => ({ groupingFunction: scopedGrouping, mountHidden: isTurnActive || mountDetails }),\n [scopedGrouping, isTurnActive, mountDetails],\n );\n const detailsPanelId = `aui-sg-segment-${useId().replace(/[^A-Za-z0-9_-]/g, '')}`;\n\n const detailsMounted = isTurnActive || mountDetails || (expanded && detailsExpanded);\n const hasToolSteps = steps.some((step) => step.kind === 'tool');\n const meta = [summary.step?.chip, summary.meta].filter(Boolean).join(' · ');\n\n // Parts with no step of their own (an image the agent produced) are content, not work.\n if (steps.length === 0) {\n return (\n <div data-slot=\"transcript-parts\" className={cn('flex min-w-0 flex-col gap-2', classNames?.detailsParts)}>\n <SuperGroupingProvider value={groupingContext}>\n <GroupedMessageParts groupingFunction={scopedGrouping} components={components} />\n </SuperGroupingProvider>\n </div>\n );\n }\n\n return (\n <div data-slot=\"activity-segment\" data-phase={phase} data-segment-key={segment.key} className=\"min-w-0\">\n <ToolTimeline\n steps={steps}\n open={expanded}\n onOpenChange={toggleExpanded}\n label={<StepText text={summary.label} code={summary.step?.code} />}\n labelTitle={summary.step?.detail}\n phase={phase}\n maxVisibleSteps={maxVisibleSteps}\n keepMounted={isTurnActive || mountDetails}\n meta={meta ? <span data-slot=\"activity-segment-meta\">{meta}</span> : null}\n >\n {hasDetails ? (\n <div className=\"min-w-0 pl-5\">\n <button\n type=\"button\"\n onClick={toggleDetails}\n aria-expanded={detailsExpanded}\n aria-controls={detailsPanelId}\n className=\"flex items-center gap-1.5 rounded py-1 text-xs text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <ChevronRight\n aria-hidden=\"true\"\n className={cn(\n 'size-3 transition-transform motion-reduce:transition-none',\n detailsExpanded && 'rotate-90',\n )}\n />\n {detailsExpanded\n ? hasToolSteps\n ? 'Hide tool details'\n : 'Hide thinking'\n : hasToolSteps\n ? 'Show tool details'\n : 'Show thinking'}\n </button>\n {detailsMounted ? (\n <section\n id={detailsPanelId}\n aria-label=\"Step details\"\n hidden={!expanded || !detailsExpanded}\n className={cn(\n 'min-w-0 overflow-hidden border-l border-border/60 py-2 pl-3',\n classNames?.details,\n )}\n >\n <div className={cn('flex flex-col gap-2', classNames?.detailsParts)}>\n <SuperGroupingProvider value={groupingContext}>\n <GroupedMessageParts groupingFunction={scopedGrouping} components={components} />\n </SuperGroupingProvider>\n </div>\n </section>\n ) : null}\n </div>\n ) : null}\n </ToolTimeline>\n {inlineParts.length > 0 ? (\n <div data-slot=\"activity-segment-inline-tools\" className=\"mt-2 flex min-w-0 flex-col gap-2\">\n {inlineParts.map(({ index, key }) => (\n <MessagePrimitive.PartByIndex key={key} index={index} components={components} />\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n\n// ─── Transcript ────────────────────────────────────────────────────────\n\n/**\n * The collapsed view (previously called the conversational view) of an\n * assistant turn as a transcript: a header that says how long the turn has\n * been working (\"Working for 1m 12s\", then \"Worked for 2m 30s\"), then the\n * agent's own sentences in the order it wrote them, each run of work between\n * them folded into one collapsed activity segment that names its step (\"Ran\n * `git log -1`\", \"Read `config.ts`\"). The answer — the text after the last\n * tool call — renders below it through `SuperGroupingFinalText`, exactly as\n * under `SuperGroupingCard`, so no text renders twice.\n *\n * Takes the same renderer and host slots as `SuperGroupingCard`;\n * `renderRunningMeta` and `renderHeaderActions` sit on the header row.\n *\n * Selector discipline: raw reads only (`message`, `message.content`,\n * `message.status`, the previous message's stamp and id); every derivation\n * runs in `useMemo`.\n */\nexport const SuperGroupingTranscript = memo(function SuperGroupingTranscript({\n toolUIs,\n ToolFallback: ToolFallbackComponent = ToolFallback,\n TextComponent,\n ReasoningComponent,\n GroupComponent = CollapsibleGroup,\n getToolGroupKey = defaultGetToolGroupKey,\n groupingFunction,\n isInlineTool = isSdkInlineTool,\n waitingTools,\n waitingToolCallIds,\n passThroughTools,\n waitingForInput = false,\n resolveToolDisplayName,\n expansionKey: expansionKeyProp,\n expandWhileWaiting = false,\n mountDetails = false,\n maxVisibleSteps = DEFAULT_MAX_VISIBLE_STEPS,\n summaryDetails,\n renderHeaderActions,\n renderRunningMeta,\n className,\n classNames,\n}: SuperGroupingTranscriptProps) {\n const messageId = useAuiState((s) => s.message.id);\n const earlierStepsUnloaded = useEarlierStepsUnloaded();\n const messageContent = useAuiState((s) =>\n s.message.role === 'assistant' ? s.message.content : EMPTY_CONTENT,\n );\n const messageStatus = useAuiState((s) => s.message.status);\n\n const timeline = useMemo(\n () =>\n buildActivityTimeline(messageContent, messageStatus, {\n waitingTools,\n waitingToolCallIds,\n passThroughTools,\n }),\n [messageContent, messageStatus, waitingTools, waitingToolCallIds, passThroughTools],\n );\n const phase = useMemo(\n () => resolveActivityPhase(messageStatus, timeline, { waitingForInput }),\n [messageStatus, timeline, waitingForInput],\n );\n const assetTitles = useMemo(() => collectAssetTitles(messageContent), [messageContent]);\n const stepsByPart = useMemo(() => {\n const byPart = new Map<number, TimelineStep>();\n timeline.forEach((item, index) => {\n if (item.partIndex === undefined) return;\n byPart.set(item.partIndex, toTimelineStep({ item, index, resolveToolDisplayName, assetTitles }));\n });\n return byPart;\n }, [timeline, resolveToolDisplayName, assetTitles]);\n const segments = useMemo(() => splitTurnSegments(messageContent), [messageContent]);\n const grouping = useMemo(\n () =>\n excludePartsFromGroups(\n groupingFunction ?? createToolBasedGroupingFunction(getToolGroupKey),\n (part) => isGroupedToolCallPart(part) && isInlineTool(part.toolName, part),\n ),\n [groupingFunction, getToolGroupKey, isInlineTool],\n );\n const inlineKeys = useMemo(() => {\n const keys = new Map<number, string>();\n messageContent.forEach((part, index) => {\n if (part.type === 'tool-call' && isInlineTool(part.toolName, part)) keys.set(index, part.toolCallId);\n });\n return keys;\n }, [messageContent, isInlineTool]);\n const components = useMemo(\n () => ({\n tools: {\n ...(toolUIs ? { by_name: toolUIs } : {}),\n Fallback: ToolFallbackComponent,\n },\n Text: TextComponent,\n ...(ReasoningComponent ? { Reasoning: ReasoningComponent } : {}),\n Group: GroupComponent,\n }),\n [toolUIs, ToolFallbackComponent, TextComponent, ReasoningComponent, GroupComponent],\n );\n const statusId = `aui-sg-turn-${useId().replace(/[^A-Za-z0-9_-]/g, '')}`;\n\n const hasText = messageContent.some((part) => part.type === 'text' && part.text.trim() !== '');\n const isVisible =\n timeline.length > 0 ||\n phase === 'waiting' ||\n phase === 'error' ||\n (phase === 'running' && !hasText) ||\n earlierStepsUnloaded;\n if (!isVisible) return null;\n\n const expansionKey = expansionKeyProp ?? messageId;\n const toolCount = countActivityTools(timeline);\n const runningStep = [...stepsByPart.values()].filter((step) => step.state === 'running').at(-1);\n const cancelled = messageStatus?.type === 'incomplete' && messageStatus.reason === 'cancelled';\n const activitySummary = getActivitySummary(timeline, { earlierStepsUnloaded });\n // The live region speaks what changed, never the ticking clock.\n const announcement =\n phase === 'running'\n ? (runningStep?.verb ?? 'Working')\n : phase === 'waiting'\n ? 'Waiting for your input'\n : phase === 'error'\n ? cancelled\n ? 'Run stopped'\n : 'Something went wrong'\n : activitySummary;\n const actions = renderHeaderActions?.({ phase, messageContent });\n const meta = phase === 'running' ? renderRunningMeta?.({ phase }) : null;\n\n return (\n <section\n data-slot=\"super-grouping-transcript\"\n data-phase={phase}\n data-tool-count={toolCount}\n className={cn('my-3 flex min-w-0 flex-col gap-1', className, classNames?.root)}\n aria-busy={phase === 'running' ? 'true' : 'false'}\n aria-describedby={statusId}\n >\n <div\n data-slot=\"turn-header\"\n className={cn(\n 'flex min-w-0 items-center gap-2 py-1 text-[13px] text-muted-foreground',\n classNames?.header,\n )}\n >\n <TurnGlyph phase={phase} />\n <span\n data-slot=\"turn-status\"\n className={cn(\n 'min-w-0 flex-1 truncate tabular-nums leading-5',\n phase === 'error' && !cancelled && 'text-destructive',\n )}\n >\n <TurnStatus\n phase={phase}\n cancelled={cancelled}\n activitySummary={activitySummary}\n toolCount={toolCount}\n summaryDetails={summaryDetails}\n />\n </span>\n {meta ? (\n <div data-slot=\"turn-meta\" className=\"flex shrink-0 items-center text-xs tabular-nums\">\n {meta}\n </div>\n ) : null}\n {actions ? <div className=\"flex shrink-0 items-center gap-1\">{actions}</div> : null}\n </div>\n {segments.length > 0 ? (\n <div\n data-slot=\"super-grouping-transcript-body\"\n className={cn('flex min-w-0 flex-col gap-1.5', classNames?.body)}\n >\n {segments.map((segment) =>\n segment.kind === 'prose' ? (\n <ProseSegment key={segment.key} text={segment.text} TextComponent={TextComponent} />\n ) : (\n <ActivitySegment\n key={segment.key}\n segment={segment}\n steps={segmentSteps(segment, stepsByPart)}\n turnPhase={phase}\n expansionKey={expansionKey}\n expandWhileWaiting={expandWhileWaiting}\n mountDetails={mountDetails}\n maxVisibleSteps={maxVisibleSteps}\n grouping={grouping}\n inlineParts={segment.partIndices.flatMap((index) => {\n const key = inlineKeys.get(index);\n return key === undefined ? [] : [{ index, key }];\n })}\n hasDetails={segment.partIndices.some(\n (index) => !inlineKeys.has(index) && messageContent[index]?.type !== 'text',\n )}\n components={components}\n classNames={classNames}\n />\n ),\n )}\n </div>\n ) : null}\n <output id={statusId} aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\">\n {announcement}\n </output>\n </section>\n );\n});\n\nfunction segmentSteps(\n segment: Extract<TurnSegment, { kind: 'activity' }>,\n stepsByPart: ReadonlyMap<number, TimelineStep>,\n): readonly TimelineStep[] {\n const steps = segment.partIndices\n .map((index) => stepsByPart.get(index))\n .filter((step): step is TimelineStep => step !== undefined);\n return steps.length > 0 ? steps : EMPTY_STEPS;\n}\n"],"names":["useAuiState","readMessageCreatedAt","useMemo","readTurnTiming","getExternalStoreMessages","useState","useEffect","firstSeenMs","jsx","Fragment","observedTurnEndMs","useRef","recordObservedTurnEnd","workedDurationMs","formatWorkDuration","LoaderCircle","cn","Circle","AlertCircle","Check","memo","ProseSegment","summarizeSegment","useActivityExpansion","scopeGroupingToSegment","useId","SuperGroupingProvider","GroupedMessageParts","jsxs","ToolTimeline","StepText","ChevronRight","MessagePrimitive","SuperGroupingTranscript","ToolFallback","CollapsibleGroup","defaultGetToolGroupKey","groupingFunction","isSdkInlineTool","useEarlierStepsUnloaded","buildActivityTimeline","resolveActivityPhase","collectAssetTitles","toTimelineStep","splitTurnSegments","excludePartsFromGroups","createToolBasedGroupingFunction","isGroupedToolCallPart","countActivityTools","getActivitySummary"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAkDA,MAAM,4BAA4B;AAClC,MAAM,gBAAuD,CAAA;AAC7D,MAAM,cAAuC,CAAA;AA6C7C,SAAS,uBAAiE;AACxE,QAAM,UAAUA,MAAAA,YAAY,CAAC,MAAM,EAAE,OAAO;AAC5C,QAAM,kBAAkBA,kBAAY,CAAC,MAAM;;AACzC,UAAM,WAAW,EAAE,OAAO,SAAS,EAAE,QAAQ,QAAQ,CAAC;AACtD,YAAO,qCAAU,UAAS,SAASC,YAAAA,sBAAqB,cAAS,aAAT,mBAAmB,MAAM,IAAI;AAAA,EACvF,CAAC;AACD,QAAM,WAAWD,kBAAY,CAAC,MAAM;AAClC,UAAM,WAAW,EAAE,OAAO,SAAS,EAAE,QAAQ,QAAQ,CAAC;AACtD,YAAO,qCAAU,UAAS,SAAS,SAAS,KAAK;AAAA,EACnD,CAAC;AACD,QAAM,SAASE,WAAAA;AAAAA,IACb,MAAA;;AACEC,uCAAe;AAAA,QACb;AAAA,QACA,SAAQ,aAAQ,aAAR,mBAAkB;AAAA,QAC1B,gBAAgBC,MAAAA,yBAAkC,OAAO;AAAA,MAAA,CAC1D;AAAA;AAAA,IACH,CAAC,SAAS,eAAe;AAAA,EAAA;AAE3B,SAAO,EAAE,QAAQ,UAAU,GAAG,QAAQ,IAAI,QAAQ,EAAE,GAAA;AACtD;AAGA,SAAS,WAAW,EAAE,SAAS,YAA0D;AACvF,QAAM,CAAC,KAAK,MAAM,IAAIC,WAAAA,SAAS,MAAM,KAAK,KAAK;AAC/CC,aAAAA,UAAU,MAAM;AACd,UAAM,QAAQ,YAAY,MAAM,OAAO,KAAK,IAAA,CAAK,GAAG,GAAI;AACxD,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC,GAAG,CAAA,CAAE;AACL,QAAM,SAAS,WAAWC,uBAAY,UAAU,GAAG;AACnD,SAAOC,+BAAAC,WAAAA,UAAA,EAAG,kCAAa,KAAK,IAAI,GAAG,MAAM,MAAM,CAAC,EAAA,CAAE;AACpD;AAMA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,EAAE,QAAQ,SAAA,IAAa,qBAAA;AAC7B,QAAM,CAAC,eAAe,gBAAgB,IAAIJ,WAAAA,SAAS,MAAMK,WAAAA,kBAAkB,QAAQ,CAAC;AACpF,QAAM,YAAYC,WAAAA,OAAO,UAAU,aAAa,UAAU,SAAS;AACnEL,aAAAA,UAAU,MAAM;AACd,UAAM,SAAS,UAAU,aAAa,UAAU;AAChD,QAAI,UAAU,WAAW,CAAC,OAAQ,kBAAiBM,WAAAA,sBAAsB,QAAQ,CAAC;AAClF,cAAU,UAAU;AAAA,EACtB,GAAG,CAAC,OAAO,QAAQ,CAAC;AACpB,MAAI,UAAU,UAAW,QAAOJ,+BAAC,cAAW,SAAS,OAAO,SAAS,UAAoB;AACzF,MAAI,UAAU,UAAW,QAAOA,2BAAAA,IAAAC,WAAAA,UAAA,EAAE,UAAA,mBAAe;AACjD,QAAM,WAAWI,WAAAA,iBAAiB,QAAQ,aAAa;AACvD,MAAI,UAAU,SAAS;AACrB,QAAI,CAAC,UAAW,QAAOL,2BAAAA,IAAAC,WAAAA,UAAA,EAAE,UAAA,wBAAoB;AAC7C,WAAOD,2BAAAA,IAAAC,WAAAA,UAAA,EAAG,uBAAa,OAAO,qBAAqBK,WAAAA,mBAAmB,QAAQ,CAAC,KAAK,cAAA,CAAc;AAAA,EACpG;AACA,QAAM,QAAQ;AAAA,IACZ,GAAI,aAAa,OAAO,CAAC,cAAcA,WAAAA,mBAAmB,QAAQ,CAAC,EAAE,IAAI,CAAA;AAAA,IACzE,GAAI,aAAa,QAAQ,YAAY,KAAK,oBAAoB,uBAAuB,CAAC,eAAe,IAAI,CAAA;AAAA,IACzG,GAAI,kBAAkB,CAAA;AAAA,EAAC,EACvB,KAAK,KAAK;AACZ,+DAAU,UAAA,MAAA,CAAM;AAClB;AAEA,SAAS,UAAU,EAAE,SAAmC;AACtD,QAAM,YAAY;AAClB,MAAI,UAAU,WAAW;AACvB,WAAON,2BAAAA,IAACO,4BAAa,eAAY,QAAO,WAAWC,UAAG,WAAW,0BAA0B,GAAG;AAAA,EAChG;AACA,MAAI,UAAU,WAAW;AACvB,WAAOR,2BAAAA,IAACS,sBAAO,eAAY,QAAO,WAAWD,UAAG,WAAW,oCAAoC,GAAG;AAAA,EACpG;AACA,MAAI,UAAU,SAAS;AACrB,WAAOR,2BAAAA,IAACU,2BAAY,eAAY,QAAO,WAAWF,UAAG,WAAW,kBAAkB,GAAG;AAAA,EACvF;AACA,SAAOR,2BAAAA,IAACW,qBAAM,eAAY,QAAO,WAAWH,UAAG,WAAW,YAAY,GAAG;AAC3E;AAIA,MAAM,eAAeI,WAAAA,KAAK,SAASC,cAAa;AAAA,EAC9C;AAAA,EACA;AACF,GAGG;AACD,wCACG,OAAA,EAAI,aAAU,oBAAmB,WAAU,WAC1C,UAAAb,2BAAAA,IAAC,eAAA,EAAc,MAAK,QAAO,MAAY,QAAQ,EAAE,MAAM,cAAc,GACvE;AAEJ,CAAC;AA0BD,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;;AACvB,QAAM,UAAUc,aAAAA,iBAAiB,KAAK;AACtC,QAAM,QAAQ,QAAQ;AACtB,QAAM,EAAE,UAAU,eAAA,IAAmBC,uCAAqB;AAAA,IACxD,cAAc,GAAG,YAAY,IAAI,QAAQ,GAAG;AAAA,IAC5C;AAAA,IACA;AAAA,EAAA,CACD;AACD,QAAM,EAAE,UAAU,iBAAiB,gBAAgB,cAAA,IAAkBA,kBAAAA,qBAAqB;AAAA,IACxF,cAAc,GAAG,YAAY,IAAI,QAAQ,GAAG;AAAA,IAC5C;AAAA,IACA;AAAA,EAAA,CACD;AACD,QAAM,aAAa,QAAQ,YAAY,KAAK,GAAG;AAC/C,QAAM,iBAAiBrB,WAAAA;AAAAA,IACrB,MAAMsB,aAAAA,uBAAuB,UAAU,WAAW,MAAM,GAAG,EAAE,IAAI,MAAM,CAAC;AAAA,IACxE,CAAC,UAAU,UAAU;AAAA,EAAA;AAEvB,QAAM,eAAe,cAAc,aAAa,cAAc;AAE9D,QAAM,kBAAkBtB,WAAAA;AAAAA,IACtB,OAAO,EAAE,kBAAkB,gBAAgB,aAAa,gBAAgB,aAAA;AAAA,IACxE,CAAC,gBAAgB,cAAc,YAAY;AAAA,EAAA;AAE7C,QAAM,iBAAiB,kBAAkBuB,WAAAA,MAAA,EAAQ,QAAQ,mBAAmB,EAAE,CAAC;AAE/E,QAAM,iBAAiB,gBAAgB,gBAAiB,YAAY;AACpE,QAAM,eAAe,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM;AAC9D,QAAM,OAAO,EAAC,aAAQ,SAAR,mBAAc,MAAM,QAAQ,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,KAAK;AAG1E,MAAI,MAAM,WAAW,GAAG;AACtB,WACEjB,+BAAC,SAAI,aAAU,oBAAmB,WAAWQ,OAAAA,GAAG,+BAA+B,yCAAY,YAAY,GACrG,yCAACU,iBAAAA,uBAAA,EAAsB,OAAO,iBAC5B,UAAAlB,2BAAAA,IAACmB,oBAAAA,qBAAA,EAAoB,kBAAkB,gBAAgB,YAAwB,GACjF,EAAA,CACF;AAAA,EAEJ;AAEA,SACEC,2BAAAA,KAAC,OAAA,EAAI,aAAU,oBAAmB,cAAY,OAAO,oBAAkB,QAAQ,KAAK,WAAU,WAC5F,UAAA;AAAA,IAAApB,2BAAAA;AAAAA,MAACqB,aAAAA;AAAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAM;AAAA,QACN,cAAc;AAAA,QACd,sCAAQC,mBAAA,EAAS,MAAM,QAAQ,OAAO,OAAM,aAAQ,SAAR,mBAAc,KAAA,CAAM;AAAA,QAChE,aAAY,aAAQ,SAAR,mBAAc;AAAA,QAC1B;AAAA,QACA;AAAA,QACA,aAAa,gBAAgB;AAAA,QAC7B,MAAM,OAAOtB,2BAAAA,IAAC,UAAK,aAAU,yBAAyB,gBAAK,IAAU;AAAA,QAEpE,UAAA,aACDoB,gCAAC,OAAA,EAAI,WAAU,gBACb,UAAA;AAAA,UAAAA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,iBAAe;AAAA,cACf,iBAAe;AAAA,cACf,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAApB,2BAAAA;AAAAA,kBAACuB,YAAAA;AAAAA,kBAAA;AAAA,oBACC,eAAY;AAAA,oBACZ,WAAWf,OAAAA;AAAAA,sBACT;AAAA,sBACA,mBAAmB;AAAA,oBAAA;AAAA,kBACrB;AAAA,gBAAA;AAAA,gBAED,kBACG,eACE,sBACA,kBACF,eACE,sBACA;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAEP,iBACCR,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,cACJ,cAAW;AAAA,cACX,QAAQ,CAAC,YAAY,CAAC;AAAA,cACtB,WAAWQ,OAAAA;AAAAA,gBACT;AAAA,gBACA,yCAAY;AAAA,cAAA;AAAA,cAGd,yCAAC,OAAA,EAAI,WAAWA,OAAAA,GAAG,uBAAuB,yCAAY,YAAY,GAChE,UAAAR,2BAAAA,IAACkB,wCAAA,EAAsB,OAAO,iBAC5B,UAAAlB,+BAACmB,oBAAAA,qBAAA,EAAoB,kBAAkB,gBAAgB,WAAA,CAAwB,GACjF,EAAA,CACF;AAAA,YAAA;AAAA,UAAA,IAEA;AAAA,QAAA,EAAA,CACN,IACI;AAAA,MAAA;AAAA,IAAA;AAAA,IAEL,YAAY,SAAS,IACpBnB,2BAAAA,IAAC,OAAA,EAAI,aAAU,iCAAgC,WAAU,oCACtD,UAAA,YAAY,IAAI,CAAC,EAAE,OAAO,UACzBA,2BAAAA,IAACwB,MAAAA,iBAAiB,aAAjB,EAAuC,OAAc,WAAA,GAAnB,GAA2C,CAC/E,EAAA,CACH,IACE;AAAA,EAAA,GACN;AAEJ;AAqBO,MAAM,0BAA0BZ,WAAAA,KAAK,SAASa,yBAAwB;AAAA,EAC3E;AAAA,EACA,cAAc,wBAAwBC,aAAAA;AAAAA,EACtC;AAAA,EACA;AAAA,EACA,iBAAiBC,iBAAAA;AAAAA,EACjB,kBAAkBC,WAAAA;AAAAA,EAAA,kBAClBC;AAAAA,EACA,eAAeC,YAAAA;AAAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiC;AAC/B,QAAM,YAAYtC,MAAAA,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE;AACjD,QAAM,uBAAuBuC,wBAAAA,wBAAA;AAC7B,QAAM,iBAAiBvC,MAAAA;AAAAA,IAAY,CAAC,MAClC,EAAE,QAAQ,SAAS,cAAc,EAAE,QAAQ,UAAU;AAAA,EAAA;AAEvD,QAAM,gBAAgBA,MAAAA,YAAY,CAAC,MAAM,EAAE,QAAQ,MAAM;AAEzD,QAAM,WAAWE,WAAAA;AAAAA,IACf,MACEsC,iBAAAA,sBAAsB,gBAAgB,eAAe;AAAA,MACnD;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,IACH,CAAC,gBAAgB,eAAe,cAAc,oBAAoB,gBAAgB;AAAA,EAAA;AAEpF,QAAM,QAAQtC,WAAAA;AAAAA,IACZ,MAAMuC,iBAAAA,qBAAqB,eAAe,UAAU,EAAE,iBAAiB;AAAA,IACvE,CAAC,eAAe,UAAU,eAAe;AAAA,EAAA;AAE3C,QAAM,cAAcvC,WAAAA,QAAQ,MAAMwC,YAAAA,mBAAmB,cAAc,GAAG,CAAC,cAAc,CAAC;AACtF,QAAM,cAAcxC,WAAAA,QAAQ,MAAM;AAChC,UAAM,6BAAa,IAAA;AACnB,aAAS,QAAQ,CAAC,MAAM,UAAU;AAChC,UAAI,KAAK,cAAc,OAAW;AAClC,aAAO,IAAI,KAAK,WAAWyC,aAAAA,eAAe,EAAE,MAAM,OAAO,wBAAwB,YAAA,CAAa,CAAC;AAAA,IACjG,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,UAAU,wBAAwB,WAAW,CAAC;AAClD,QAAM,WAAWzC,WAAAA,QAAQ,MAAM0C,aAAAA,kBAAkB,cAAc,GAAG,CAAC,cAAc,CAAC;AAClF,QAAM,WAAW1C,WAAAA;AAAAA,IACf,MACE2C,iBAAAA;AAAAA,MACER,sBAAoBS,iBAAAA,gCAAgC,eAAe;AAAA,MACnE,CAAC,SAASC,iBAAAA,sBAAsB,IAAI,KAAK,aAAa,KAAK,UAAU,IAAI;AAAA,IAAA;AAAA,IAE7E,CAACV,oBAAkB,iBAAiB,YAAY;AAAA,EAAA;AAElD,QAAM,aAAanC,WAAAA,QAAQ,MAAM;AAC/B,UAAM,2BAAW,IAAA;AACjB,mBAAe,QAAQ,CAAC,MAAM,UAAU;AACtC,UAAI,KAAK,SAAS,eAAe,aAAa,KAAK,UAAU,IAAI,EAAG,MAAK,IAAI,OAAO,KAAK,UAAU;AAAA,IACrG,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,gBAAgB,YAAY,CAAC;AACjC,QAAM,aAAaA,WAAAA;AAAAA,IACjB,OAAO;AAAA,MACL,OAAO;AAAA,QACL,GAAI,UAAU,EAAE,SAAS,QAAA,IAAY,CAAA;AAAA,QACrC,UAAU;AAAA,MAAA;AAAA,MAEZ,MAAM;AAAA,MACN,GAAI,qBAAqB,EAAE,WAAW,mBAAA,IAAuB,CAAA;AAAA,MAC7D,OAAO;AAAA,IAAA;AAAA,IAET,CAAC,SAAS,uBAAuB,eAAe,oBAAoB,cAAc;AAAA,EAAA;AAEpF,QAAM,WAAW,eAAeuB,WAAAA,MAAA,EAAQ,QAAQ,mBAAmB,EAAE,CAAC;AAEtE,QAAM,UAAU,eAAe,KAAK,CAAC,SAAS,KAAK,SAAS,UAAU,KAAK,KAAK,KAAA,MAAW,EAAE;AAC7F,QAAM,YACJ,SAAS,SAAS,KAClB,UAAU,aACV,UAAU,WACT,UAAU,aAAa,CAAC,WACzB;AACF,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,eAAe,oBAAoB;AACzC,QAAM,YAAYuB,iBAAAA,mBAAmB,QAAQ;AAC7C,QAAM,cAAc,CAAC,GAAG,YAAY,QAAQ,EAAE,OAAO,CAAC,SAAS,KAAK,UAAU,SAAS,EAAE,GAAG,EAAE;AAC9F,QAAM,aAAY,+CAAe,UAAS,gBAAgB,cAAc,WAAW;AACnF,QAAM,kBAAkBC,iBAAAA,mBAAmB,UAAU,EAAE,sBAAsB;AAE7E,QAAM,eACJ,UAAU,aACL,2CAAa,SAAQ,YACtB,UAAU,YACR,2BACA,UAAU,UACR,YACE,gBACA,yBACF;AACV,QAAM,UAAU,2DAAsB,EAAE,OAAO;AAC/C,QAAM,OAAO,UAAU,YAAY,uDAAoB,EAAE,MAAA,KAAW;AAEpE,SACErB,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,cAAY;AAAA,MACZ,mBAAiB;AAAA,MACjB,WAAWZ,OAAAA,GAAG,oCAAoC,WAAW,yCAAY,IAAI;AAAA,MAC7E,aAAW,UAAU,YAAY,SAAS;AAAA,MAC1C,oBAAkB;AAAA,MAElB,UAAA;AAAA,QAAAY,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,aAAU;AAAA,YACV,WAAWZ,OAAAA;AAAAA,cACT;AAAA,cACA,yCAAY;AAAA,YAAA;AAAA,YAGd,UAAA;AAAA,cAAAR,+BAAC,aAAU,OAAc;AAAA,cACzBA,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,aAAU;AAAA,kBACV,WAAWQ,OAAAA;AAAAA,oBACT;AAAA,oBACA,UAAU,WAAW,CAAC,aAAa;AAAA,kBAAA;AAAA,kBAGrC,UAAAR,2BAAAA;AAAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACF;AAAA,cAAA;AAAA,cAED,sCACE,OAAA,EAAI,aAAU,aAAY,WAAU,mDAClC,gBACH,IACE;AAAA,cACH,UAAUA,2BAAAA,IAAC,OAAA,EAAI,WAAU,oCAAoC,mBAAQ,IAAS;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAEhF,SAAS,SAAS,IACjBA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,aAAU;AAAA,YACV,WAAWQ,OAAAA,GAAG,iCAAiC,yCAAY,IAAI;AAAA,YAE9D,UAAA,SAAS;AAAA,cAAI,CAAC,YACb,QAAQ,SAAS,UACfR,2BAAAA,IAAC,cAAA,EAA+B,MAAM,QAAQ,MAAM,cAAA,GAAjC,QAAQ,GAAuD,IAElFA,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC;AAAA,kBACA,OAAO,aAAa,SAAS,WAAW;AAAA,kBACxC,WAAW;AAAA,kBACX;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,aAAa,QAAQ,YAAY,QAAQ,CAAC,UAAU;AAClD,0BAAM,MAAM,WAAW,IAAI,KAAK;AAChC,2BAAO,QAAQ,SAAY,CAAA,IAAK,CAAC,EAAE,OAAO,KAAK;AAAA,kBACjD,CAAC;AAAA,kBACD,YAAY,QAAQ,YAAY;AAAA,oBAC9B,CAAC,UAAA;;AAAU,8BAAC,WAAW,IAAI,KAAK,OAAK,oBAAe,KAAK,MAApB,mBAAuB,UAAS;AAAA;AAAA,kBAAA;AAAA,kBAEvE;AAAA,kBACA;AAAA,gBAAA;AAAA,gBAjBK,QAAQ;AAAA,cAAA;AAAA,YAkBf;AAAA,UAEJ;AAAA,QAAA,IAEA;AAAA,QACJA,2BAAAA,IAAC,UAAA,EAAO,IAAI,UAAU,aAAU,UAAS,eAAY,QAAO,WAAU,WACnE,UAAA,aAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN,CAAC;AAED,SAAS,aACP,SACA,aACyB;AACzB,QAAM,QAAQ,QAAQ,YACnB,IAAI,CAAC,UAAU,YAAY,IAAI,KAAK,CAAC,EACrC,OAAO,CAAC,SAA+B,SAAS,MAAS;AAC5D,SAAO,MAAM,SAAS,IAAI,QAAQ;AACpC;;"}
|
|
1
|
+
{"version":3,"file":"SuperGroupingTranscript.cjs","sources":["../../../src/chat/super-grouping/SuperGroupingTranscript.tsx"],"sourcesContent":["'use client';\n\nimport {\n getExternalStoreMessages,\n MessagePrimitive,\n type TextMessagePartComponent,\n type ThreadAssistantMessagePart,\n useAuiState,\n} from '@assistant-ui/react';\nimport { AlertCircle, Check, ChevronRight, Circle, LoaderCircle } from 'lucide-react';\nimport { memo, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { cn } from '../../lib/utils';\nimport { StepText } from '../../tools/step-text';\nimport { isSdkInlineTool } from '../../tools/inline-tools';\nimport { ToolFallback } from '../../tools/tool-fallback';\nimport { collectAssetTitles } from '../../tools/tool-summary';\nimport { readMessageCreatedAt } from '../message-time';\nimport {\n type ActivityPhase,\n buildActivityTimeline,\n countActivityTools,\n excludePartsFromGroups,\n getActivitySummary,\n resolveActivityPhase,\n} from './activity-timeline';\nimport { CollapsibleGroup, SuperGroupingProvider } from './CollapsibleGroup';\nimport { GroupedMessageParts, type GroupedMessagePartsProps } from './GroupedMessageParts';\nimport { createToolBasedGroupingFunction, type GroupingFunction, isGroupedToolCallPart } from './grouping-function';\nimport { type SuperGroupingCardProps, useActivityExpansion } from './SuperGroupingCard';\nimport { ToolTimeline } from './ToolTimeline';\nimport { type TimelineStep, toTimelineStep } from './timeline-step';\nimport { defaultGetToolGroupKey } from './toolkit-map';\nimport { useEarlierStepsUnloaded } from './use-earlier-steps-unloaded';\nimport { useTurnStepsControl, useTurnStepsMarker } from './use-turn-steps';\nimport {\n scopeGroupingToSegment,\n splitTurnSegments,\n summarizeSegment,\n type TurnSegment,\n} from './turn-segments';\nimport {\n firstSeenMs,\n formatWorkDuration,\n observedTurnEndMs,\n readTurnTiming,\n recordObservedTurnEnd,\n type TurnTiming,\n workedDurationMs,\n workingLabel,\n} from './turn-timing';\n\nconst DEFAULT_MAX_VISIBLE_STEPS = 6;\nconst EMPTY_CONTENT: readonly ThreadAssistantMessagePart[] = [];\nconst EMPTY_STEPS: readonly TimelineStep[] = [];\n\nexport interface SuperGroupingTranscriptProps\n extends Pick<\n SuperGroupingCardProps,\n | 'toolUIs'\n | 'ToolFallback'\n | 'TextComponent'\n | 'ReasoningComponent'\n | 'GroupComponent'\n | 'getToolGroupKey'\n | 'groupingFunction'\n | 'isInlineTool'\n | 'waitingTools'\n | 'waitingToolCallIds'\n | 'passThroughTools'\n | 'waitingForInput'\n | 'resolveToolDisplayName'\n | 'expansionKey'\n | 'expandWhileWaiting'\n | 'mountDetails'\n | 'summaryDetails'\n | 'renderHeaderActions'\n | 'renderRunningMeta'\n | 'className'\n > {\n /** Steps an opened segment lists before older ones fold away; unresolved calls always show. */\n maxVisibleSteps?: number;\n classNames?: {\n root?: string;\n header?: string;\n body?: string;\n details?: string;\n /** The flex column a segment's parts render in; override its gap here. */\n detailsParts?: string;\n };\n}\n\n// ─── Turn timing ───────────────────────────────────────────────────────\n\n/**\n * The turn's stamps: the prompt it answers, its joined metadata, and the raw\n * messages behind it. Reads the whole message (the bound raw messages hang off\n * it), so only the small header status subscribes here, never the transcript.\n */\nfunction useTurnTimingSources(): { timing: TurnTiming; clockKey: string } {\n const message = useAuiState((s) => s.message);\n const promptCreatedAt = useAuiState((s) => {\n const previous = s.thread.messages[s.message.index - 1];\n return previous?.role === 'user' ? readMessageCreatedAt(previous.metadata?.custom) : null;\n });\n const promptId = useAuiState((s) => {\n const previous = s.thread.messages[s.message.index - 1];\n return previous?.role === 'user' ? previous.id : '';\n });\n const timing = useMemo(\n () =>\n readTurnTiming({\n promptCreatedAt,\n custom: message.metadata?.custom,\n sourceMessages: getExternalStoreMessages<unknown>(message),\n }),\n [message, promptCreatedAt],\n );\n return { timing, clockKey: `${promptId}:${message.id}` };\n}\n\n/** \"Working for 1m 12s\", re-rendered once a second by itself so the transcript does not. */\nfunction WorkingFor({ startMs, clockKey }: { startMs: number | null; clockKey: string }) {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n const timer = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(timer);\n }, []);\n const anchor = startMs ?? firstSeenMs(clockKey, now);\n return <>{workingLabel(Math.max(0, now - anchor))}</>;\n}\n\n/**\n * The header's words: \"Working for 1m 12s\" while the turn runs, \"Worked for\n * 2m 30s · Used 7 tools\" once done, \"Waiting for you\", or how it ended.\n */\nfunction TurnStatus({\n phase,\n cancelled,\n activitySummary,\n toolCount,\n summaryDetails,\n}: {\n phase: ActivityPhase;\n cancelled: boolean;\n activitySummary: string;\n toolCount: number;\n summaryDetails: readonly string[] | undefined;\n}) {\n const { timing, clockKey } = useTurnTimingSources();\n const [observedEndMs, setObservedEndMs] = useState(() => observedTurnEndMs(clockKey));\n const wasActive = useRef(phase === 'running' || phase === 'waiting');\n useEffect(() => {\n const active = phase === 'running' || phase === 'waiting';\n if (wasActive.current && !active) setObservedEndMs(recordObservedTurnEnd(clockKey));\n wasActive.current = active;\n }, [phase, clockKey]);\n if (phase === 'running') return <WorkingFor startMs={timing.startMs} clockKey={clockKey} />;\n if (phase === 'waiting') return <>Waiting for you</>;\n const workedMs = workedDurationMs(timing, observedEndMs);\n if (phase === 'error') {\n if (!cancelled) return <>Something went wrong</>;\n return <>{workedMs !== null ? `Run stopped after ${formatWorkDuration(workedMs)}` : 'Run stopped'}</>;\n }\n const label = [\n ...(workedMs !== null ? [`Worked for ${formatWorkDuration(workedMs)}`] : []),\n ...(workedMs === null || toolCount > 0 || activitySummary !== 'Reasoning complete' ? [activitySummary] : []),\n ...(summaryDetails ?? []),\n ].join(' · ');\n return <>{label}</>;\n}\n\nfunction TurnGlyph({ phase }: { phase: ActivityPhase }) {\n const className = 'size-3.5 shrink-0';\n if (phase === 'running') {\n return <LoaderCircle aria-hidden=\"true\" className={cn(className, 'motion-safe:animate-spin')} />;\n }\n if (phase === 'waiting') {\n return <Circle aria-hidden=\"true\" className={cn(className, 'text-amber-600 dark:text-amber-400')} />;\n }\n if (phase === 'error') {\n return <AlertCircle aria-hidden=\"true\" className={cn(className, 'text-destructive')} />;\n }\n return <Check aria-hidden=\"true\" className={cn(className, 'opacity-70')} />;\n}\n\n// ─── Segments ──────────────────────────────────────────────────────────\n\nconst ProseSegment = memo(function ProseSegment({\n text,\n TextComponent,\n}: {\n text: string;\n TextComponent: TextMessagePartComponent;\n}) {\n return (\n <div data-slot=\"transcript-prose\" className=\"min-w-0\">\n <TextComponent type=\"text\" text={text} status={{ type: 'complete' }} />\n </div>\n );\n});\n\ninterface ActivitySegmentProps {\n segment: Extract<TurnSegment, { kind: 'activity' }>;\n steps: readonly TimelineStep[];\n turnPhase: ActivityPhase;\n expansionKey: string;\n expandWhileWaiting: boolean;\n mountDetails: boolean;\n maxVisibleSteps: number;\n grouping: GroupingFunction;\n /** This segment's inline tool calls (an editable draft), rendered outside its disclosures. */\n inlineParts: readonly { index: number; key: string }[];\n /** False when every step's UI renders inline, so there is nothing behind \"Show tool details\". */\n hasDetails: boolean;\n components: GroupedMessagePartsProps['components'];\n classNames: SuperGroupingTranscriptProps['classNames'];\n}\n\n/**\n * One collapsed run of work between two of the agent's sentences: the step in\n * progress (or the last one taken) on one line, the segment's steps when\n * opened, and the tool UIs of just this segment behind \"Show tool details\".\n * The tool UIs stay mounted (hidden) while the turn is live so their effects\n * run, as in `SuperGroupingCard`.\n */\nfunction ActivitySegment({\n segment,\n steps,\n turnPhase,\n expansionKey,\n expandWhileWaiting,\n mountDetails,\n maxVisibleSteps,\n grouping,\n inlineParts,\n hasDetails,\n components,\n classNames,\n}: ActivitySegmentProps) {\n const summary = summarizeSegment(steps);\n const phase = summary.phase;\n const { expanded, toggleExpanded } = useActivityExpansion({\n expansionKey: `${expansionKey}:${segment.key}`,\n phase,\n expandWhileWaiting,\n });\n const { expanded: detailsExpanded, toggleExpanded: toggleDetails } = useActivityExpansion({\n expansionKey: `${expansionKey}:${segment.key}:details`,\n phase,\n expandWhileWaiting,\n });\n const indicesKey = segment.partIndices.join(',');\n const scopedGrouping = useMemo(\n () => scopeGroupingToSegment(grouping, indicesKey.split(',').map(Number)),\n [grouping, indicesKey],\n );\n const isTurnActive = turnPhase === 'running' || turnPhase === 'waiting';\n // The toolkit groups inside keep their tool UIs mounted when the details do.\n const groupingContext = useMemo(\n () => ({ groupingFunction: scopedGrouping, mountHidden: isTurnActive || mountDetails }),\n [scopedGrouping, isTurnActive, mountDetails],\n );\n const detailsPanelId = `aui-sg-segment-${useId().replace(/[^A-Za-z0-9_-]/g, '')}`;\n\n const detailsMounted = isTurnActive || mountDetails || (expanded && detailsExpanded);\n const hasToolSteps = steps.some((step) => step.kind === 'tool');\n const meta = [summary.step?.chip, summary.meta].filter(Boolean).join(' · ');\n\n // Parts with no step of their own (an image the agent produced) are content, not work.\n if (steps.length === 0) {\n return (\n <div data-slot=\"transcript-parts\" className={cn('flex min-w-0 flex-col gap-2', classNames?.detailsParts)}>\n <SuperGroupingProvider value={groupingContext}>\n <GroupedMessageParts groupingFunction={scopedGrouping} components={components} />\n </SuperGroupingProvider>\n </div>\n );\n }\n\n return (\n <div data-slot=\"activity-segment\" data-phase={phase} data-segment-key={segment.key} className=\"min-w-0\">\n <ToolTimeline\n steps={steps}\n open={expanded}\n onOpenChange={toggleExpanded}\n label={<StepText text={summary.label} code={summary.step?.code} />}\n labelTitle={summary.step?.detail}\n phase={phase}\n maxVisibleSteps={maxVisibleSteps}\n keepMounted={isTurnActive || mountDetails}\n meta={meta ? <span data-slot=\"activity-segment-meta\">{meta}</span> : null}\n >\n {hasDetails ? (\n <div className=\"min-w-0 pl-5\">\n <button\n type=\"button\"\n onClick={toggleDetails}\n aria-expanded={detailsExpanded}\n aria-controls={detailsPanelId}\n className=\"flex items-center gap-1.5 rounded py-1 text-xs text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <ChevronRight\n aria-hidden=\"true\"\n className={cn(\n 'size-3 transition-transform motion-reduce:transition-none',\n detailsExpanded && 'rotate-90',\n )}\n />\n {detailsExpanded\n ? hasToolSteps\n ? 'Hide tool details'\n : 'Hide thinking'\n : hasToolSteps\n ? 'Show tool details'\n : 'Show thinking'}\n </button>\n {detailsMounted ? (\n <section\n id={detailsPanelId}\n aria-label=\"Step details\"\n hidden={!expanded || !detailsExpanded}\n className={cn(\n 'min-w-0 overflow-hidden border-l border-border/60 py-2 pl-3',\n classNames?.details,\n )}\n >\n <div className={cn('flex flex-col gap-2', classNames?.detailsParts)}>\n <SuperGroupingProvider value={groupingContext}>\n <GroupedMessageParts groupingFunction={scopedGrouping} components={components} />\n </SuperGroupingProvider>\n </div>\n </section>\n ) : null}\n </div>\n ) : null}\n </ToolTimeline>\n {inlineParts.length > 0 ? (\n <div data-slot=\"activity-segment-inline-tools\" className=\"mt-2 flex min-w-0 flex-col gap-2\">\n {inlineParts.map(({ index, key }) => (\n <MessagePrimitive.PartByIndex key={key} index={index} components={components} />\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n\n// ─── Transcript ────────────────────────────────────────────────────────\n\n/**\n * The collapsed view (previously called the conversational view) of an\n * assistant turn as a transcript: a header that says how long the turn has\n * been working (\"Working for 1m 12s\", then \"Worked for 2m 30s\"), then the\n * agent's own sentences in the order it wrote them, each run of work between\n * them folded into one collapsed activity segment that names its step (\"Ran\n * `git log -1`\", \"Read `config.ts`\"). The answer — the text after the last\n * tool call — renders below it through `SuperGroupingFinalText`, exactly as\n * under `SuperGroupingCard`, so no text renders twice.\n *\n * Takes the same renderer and host slots as `SuperGroupingCard`;\n * `renderRunningMeta` and `renderHeaderActions` sit on the header row.\n *\n * Selector discipline: raw reads only (`message`, `message.content`,\n * `message.status`, the previous message's stamp and id); every derivation\n * runs in `useMemo`.\n */\nexport const SuperGroupingTranscript = memo(function SuperGroupingTranscript({\n toolUIs,\n ToolFallback: ToolFallbackComponent = ToolFallback,\n TextComponent,\n ReasoningComponent,\n GroupComponent = CollapsibleGroup,\n getToolGroupKey = defaultGetToolGroupKey,\n groupingFunction,\n isInlineTool = isSdkInlineTool,\n waitingTools,\n waitingToolCallIds,\n passThroughTools,\n waitingForInput = false,\n resolveToolDisplayName,\n expansionKey: expansionKeyProp,\n expandWhileWaiting = false,\n mountDetails = false,\n maxVisibleSteps = DEFAULT_MAX_VISIBLE_STEPS,\n summaryDetails,\n renderHeaderActions,\n renderRunningMeta,\n className,\n classNames,\n}: SuperGroupingTranscriptProps) {\n const messageId = useAuiState((s) => s.message.id);\n const earlierStepsUnloaded = useEarlierStepsUnloaded();\n const stepsMarker = useTurnStepsMarker();\n const TurnStepsControl = useTurnStepsControl();\n const messageContent = useAuiState((s) =>\n s.message.role === 'assistant' ? s.message.content : EMPTY_CONTENT,\n );\n const messageStatus = useAuiState((s) => s.message.status);\n\n const timeline = useMemo(\n () =>\n buildActivityTimeline(messageContent, messageStatus, {\n waitingTools,\n waitingToolCallIds,\n passThroughTools,\n }),\n [messageContent, messageStatus, waitingTools, waitingToolCallIds, passThroughTools],\n );\n const phase = useMemo(\n () => resolveActivityPhase(messageStatus, timeline, { waitingForInput }),\n [messageStatus, timeline, waitingForInput],\n );\n const assetTitles = useMemo(() => collectAssetTitles(messageContent), [messageContent]);\n const stepsByPart = useMemo(() => {\n const byPart = new Map<number, TimelineStep>();\n timeline.forEach((item, index) => {\n if (item.partIndex === undefined) return;\n byPart.set(item.partIndex, toTimelineStep({ item, index, resolveToolDisplayName, assetTitles }));\n });\n return byPart;\n }, [timeline, resolveToolDisplayName, assetTitles]);\n const segments = useMemo(() => splitTurnSegments(messageContent), [messageContent]);\n const grouping = useMemo(\n () =>\n excludePartsFromGroups(\n groupingFunction ?? createToolBasedGroupingFunction(getToolGroupKey),\n (part) => isGroupedToolCallPart(part) && isInlineTool(part.toolName, part),\n ),\n [groupingFunction, getToolGroupKey, isInlineTool],\n );\n const inlineKeys = useMemo(() => {\n const keys = new Map<number, string>();\n messageContent.forEach((part, index) => {\n if (part.type === 'tool-call' && isInlineTool(part.toolName, part)) keys.set(index, part.toolCallId);\n });\n return keys;\n }, [messageContent, isInlineTool]);\n const components = useMemo(\n () => ({\n tools: {\n ...(toolUIs ? { by_name: toolUIs } : {}),\n Fallback: ToolFallbackComponent,\n },\n Text: TextComponent,\n ...(ReasoningComponent ? { Reasoning: ReasoningComponent } : {}),\n Group: GroupComponent,\n }),\n [toolUIs, ToolFallbackComponent, TextComponent, ReasoningComponent, GroupComponent],\n );\n const statusId = `aui-sg-turn-${useId().replace(/[^A-Za-z0-9_-]/g, '')}`;\n\n const hasText = messageContent.some((part) => part.type === 'text' && part.text.trim() !== '');\n const isVisible =\n timeline.length > 0 ||\n phase === 'waiting' ||\n phase === 'error' ||\n (phase === 'running' && !hasText) ||\n earlierStepsUnloaded ||\n (stepsMarker?.hiddenSteps ?? 0) > 0;\n if (!isVisible) return null;\n\n // Remembered by the turn for a turn of older history paged by command: its\n // message id changes as its steps load, and a segment opened before must stay open.\n const expansionKey = expansionKeyProp ?? (stepsMarker ? `turn:${stepsMarker.turn}` : messageId);\n const hiddenSteps = stepsMarker\n ? { tools: stepsMarker.hiddenTools, delegations: stepsMarker.hiddenDelegations }\n : undefined;\n const toolCount = countActivityTools(timeline) + (hiddenSteps?.tools ?? 0);\n const runningStep = [...stepsByPart.values()].filter((step) => step.state === 'running').at(-1);\n const cancelled = messageStatus?.type === 'incomplete' && messageStatus.reason === 'cancelled';\n const activitySummary = getActivitySummary(timeline, { earlierStepsUnloaded, hiddenSteps });\n // The live region speaks what changed, never the ticking clock.\n const announcement =\n phase === 'running'\n ? (runningStep?.verb ?? 'Working')\n : phase === 'waiting'\n ? 'Waiting for your input'\n : phase === 'error'\n ? cancelled\n ? 'Run stopped'\n : 'Something went wrong'\n : activitySummary;\n const actions = renderHeaderActions?.({ phase, messageContent });\n const meta = phase === 'running' ? renderRunningMeta?.({ phase }) : null;\n\n return (\n <section\n data-slot=\"super-grouping-transcript\"\n data-phase={phase}\n data-tool-count={toolCount}\n className={cn('my-3 flex min-w-0 flex-col gap-1', className, classNames?.root)}\n aria-busy={phase === 'running' ? 'true' : 'false'}\n aria-describedby={statusId}\n >\n <div\n data-slot=\"turn-header\"\n className={cn(\n 'flex min-w-0 items-center gap-2 py-1 text-[13px] text-muted-foreground',\n classNames?.header,\n )}\n >\n <TurnGlyph phase={phase} />\n <span\n data-slot=\"turn-status\"\n className={cn(\n 'min-w-0 flex-1 truncate tabular-nums leading-5',\n phase === 'error' && !cancelled && 'text-destructive',\n )}\n >\n <TurnStatus\n phase={phase}\n cancelled={cancelled}\n activitySummary={activitySummary}\n toolCount={toolCount}\n summaryDetails={summaryDetails}\n />\n </span>\n {meta ? (\n <div data-slot=\"turn-meta\" className=\"flex shrink-0 items-center text-xs tabular-nums\">\n {meta}\n </div>\n ) : null}\n {actions ? <div className=\"flex shrink-0 items-center gap-1\">{actions}</div> : null}\n </div>\n {stepsMarker && TurnStepsControl ? <TurnStepsControl marker={stepsMarker} /> : null}\n {segments.length > 0 ? (\n <div\n data-slot=\"super-grouping-transcript-body\"\n className={cn('flex min-w-0 flex-col gap-1.5', classNames?.body)}\n >\n {segments.map((segment) =>\n segment.kind === 'prose' ? (\n <ProseSegment key={segment.key} text={segment.text} TextComponent={TextComponent} />\n ) : (\n <ActivitySegment\n key={segment.key}\n segment={segment}\n steps={segmentSteps(segment, stepsByPart)}\n turnPhase={phase}\n expansionKey={expansionKey}\n expandWhileWaiting={expandWhileWaiting}\n mountDetails={mountDetails}\n maxVisibleSteps={maxVisibleSteps}\n grouping={grouping}\n inlineParts={segment.partIndices.flatMap((index) => {\n const key = inlineKeys.get(index);\n return key === undefined ? [] : [{ index, key }];\n })}\n hasDetails={segment.partIndices.some(\n (index) => !inlineKeys.has(index) && messageContent[index]?.type !== 'text',\n )}\n components={components}\n classNames={classNames}\n />\n ),\n )}\n </div>\n ) : null}\n <output id={statusId} aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\">\n {announcement}\n </output>\n </section>\n );\n});\n\nfunction segmentSteps(\n segment: Extract<TurnSegment, { kind: 'activity' }>,\n stepsByPart: ReadonlyMap<number, TimelineStep>,\n): readonly TimelineStep[] {\n const steps = segment.partIndices\n .map((index) => stepsByPart.get(index))\n .filter((step): step is TimelineStep => step !== undefined);\n return steps.length > 0 ? steps : EMPTY_STEPS;\n}\n"],"names":["useAuiState","readMessageCreatedAt","useMemo","readTurnTiming","getExternalStoreMessages","useState","useEffect","firstSeenMs","jsx","Fragment","observedTurnEndMs","useRef","recordObservedTurnEnd","workedDurationMs","formatWorkDuration","LoaderCircle","cn","Circle","AlertCircle","Check","memo","ProseSegment","summarizeSegment","useActivityExpansion","scopeGroupingToSegment","useId","SuperGroupingProvider","GroupedMessageParts","jsxs","ToolTimeline","StepText","ChevronRight","MessagePrimitive","SuperGroupingTranscript","ToolFallback","CollapsibleGroup","defaultGetToolGroupKey","groupingFunction","isSdkInlineTool","useEarlierStepsUnloaded","useTurnStepsMarker","useTurnStepsControl","buildActivityTimeline","resolveActivityPhase","collectAssetTitles","toTimelineStep","splitTurnSegments","excludePartsFromGroups","createToolBasedGroupingFunction","isGroupedToolCallPart","countActivityTools","getActivitySummary"],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ import { ToolTimeline } from "./ToolTimeline.js";
|
|
|
16
16
|
import { toTimelineStep } from "./timeline-step.js";
|
|
17
17
|
import { defaultGetToolGroupKey } from "./toolkit-map.js";
|
|
18
18
|
import { useEarlierStepsUnloaded } from "./use-earlier-steps-unloaded.js";
|
|
19
|
+
import { useTurnStepsMarker, useTurnStepsControl } from "./use-turn-steps.js";
|
|
19
20
|
import { splitTurnSegments, summarizeSegment, scopeGroupingToSegment } from "./turn-segments.js";
|
|
20
21
|
import { observedTurnEndMs, recordObservedTurnEnd, workedDurationMs, formatWorkDuration, readTurnTiming, firstSeenMs, workingLabel } from "./turn-timing.js";
|
|
21
22
|
import { cn } from "cnfast";
|
|
@@ -229,6 +230,8 @@ const SuperGroupingTranscript = memo(function SuperGroupingTranscript2({
|
|
|
229
230
|
}) {
|
|
230
231
|
const messageId = useAuiState((s) => s.message.id);
|
|
231
232
|
const earlierStepsUnloaded = useEarlierStepsUnloaded();
|
|
233
|
+
const stepsMarker = useTurnStepsMarker();
|
|
234
|
+
const TurnStepsControl = useTurnStepsControl();
|
|
232
235
|
const messageContent = useAuiState(
|
|
233
236
|
(s) => s.message.role === "assistant" ? s.message.content : EMPTY_CONTENT
|
|
234
237
|
);
|
|
@@ -283,13 +286,14 @@ const SuperGroupingTranscript = memo(function SuperGroupingTranscript2({
|
|
|
283
286
|
);
|
|
284
287
|
const statusId = `aui-sg-turn-${useId().replace(/[^A-Za-z0-9_-]/g, "")}`;
|
|
285
288
|
const hasText = messageContent.some((part) => part.type === "text" && part.text.trim() !== "");
|
|
286
|
-
const isVisible = timeline.length > 0 || phase === "waiting" || phase === "error" || phase === "running" && !hasText || earlierStepsUnloaded;
|
|
289
|
+
const isVisible = timeline.length > 0 || phase === "waiting" || phase === "error" || phase === "running" && !hasText || earlierStepsUnloaded || ((stepsMarker == null ? void 0 : stepsMarker.hiddenSteps) ?? 0) > 0;
|
|
287
290
|
if (!isVisible) return null;
|
|
288
|
-
const expansionKey = expansionKeyProp ?? messageId;
|
|
289
|
-
const
|
|
291
|
+
const expansionKey = expansionKeyProp ?? (stepsMarker ? `turn:${stepsMarker.turn}` : messageId);
|
|
292
|
+
const hiddenSteps = stepsMarker ? { tools: stepsMarker.hiddenTools, delegations: stepsMarker.hiddenDelegations } : void 0;
|
|
293
|
+
const toolCount = countActivityTools(timeline) + ((hiddenSteps == null ? void 0 : hiddenSteps.tools) ?? 0);
|
|
290
294
|
const runningStep = [...stepsByPart.values()].filter((step) => step.state === "running").at(-1);
|
|
291
295
|
const cancelled = (messageStatus == null ? void 0 : messageStatus.type) === "incomplete" && messageStatus.reason === "cancelled";
|
|
292
|
-
const activitySummary = getActivitySummary(timeline, { earlierStepsUnloaded });
|
|
296
|
+
const activitySummary = getActivitySummary(timeline, { earlierStepsUnloaded, hiddenSteps });
|
|
293
297
|
const announcement = phase === "running" ? (runningStep == null ? void 0 : runningStep.verb) ?? "Working" : phase === "waiting" ? "Waiting for your input" : phase === "error" ? cancelled ? "Run stopped" : "Something went wrong" : activitySummary;
|
|
294
298
|
const actions = renderHeaderActions == null ? void 0 : renderHeaderActions({ phase, messageContent });
|
|
295
299
|
const meta = phase === "running" ? renderRunningMeta == null ? void 0 : renderRunningMeta({ phase }) : null;
|
|
@@ -338,6 +342,7 @@ const SuperGroupingTranscript = memo(function SuperGroupingTranscript2({
|
|
|
338
342
|
]
|
|
339
343
|
}
|
|
340
344
|
),
|
|
345
|
+
stepsMarker && TurnStepsControl ? /* @__PURE__ */ jsx(TurnStepsControl, { marker: stepsMarker }) : null,
|
|
341
346
|
segments.length > 0 ? /* @__PURE__ */ jsx(
|
|
342
347
|
"div",
|
|
343
348
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SuperGroupingTranscript.js","sources":["../../../src/chat/super-grouping/SuperGroupingTranscript.tsx"],"sourcesContent":["'use client';\n\nimport {\n getExternalStoreMessages,\n MessagePrimitive,\n type TextMessagePartComponent,\n type ThreadAssistantMessagePart,\n useAuiState,\n} from '@assistant-ui/react';\nimport { AlertCircle, Check, ChevronRight, Circle, LoaderCircle } from 'lucide-react';\nimport { memo, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { cn } from '../../lib/utils';\nimport { StepText } from '../../tools/step-text';\nimport { isSdkInlineTool } from '../../tools/inline-tools';\nimport { ToolFallback } from '../../tools/tool-fallback';\nimport { collectAssetTitles } from '../../tools/tool-summary';\nimport { readMessageCreatedAt } from '../message-time';\nimport {\n type ActivityPhase,\n buildActivityTimeline,\n countActivityTools,\n excludePartsFromGroups,\n getActivitySummary,\n resolveActivityPhase,\n} from './activity-timeline';\nimport { CollapsibleGroup, SuperGroupingProvider } from './CollapsibleGroup';\nimport { GroupedMessageParts, type GroupedMessagePartsProps } from './GroupedMessageParts';\nimport { createToolBasedGroupingFunction, type GroupingFunction, isGroupedToolCallPart } from './grouping-function';\nimport { type SuperGroupingCardProps, useActivityExpansion } from './SuperGroupingCard';\nimport { ToolTimeline } from './ToolTimeline';\nimport { type TimelineStep, toTimelineStep } from './timeline-step';\nimport { defaultGetToolGroupKey } from './toolkit-map';\nimport { useEarlierStepsUnloaded } from './use-earlier-steps-unloaded';\nimport {\n scopeGroupingToSegment,\n splitTurnSegments,\n summarizeSegment,\n type TurnSegment,\n} from './turn-segments';\nimport {\n firstSeenMs,\n formatWorkDuration,\n observedTurnEndMs,\n readTurnTiming,\n recordObservedTurnEnd,\n type TurnTiming,\n workedDurationMs,\n workingLabel,\n} from './turn-timing';\n\nconst DEFAULT_MAX_VISIBLE_STEPS = 6;\nconst EMPTY_CONTENT: readonly ThreadAssistantMessagePart[] = [];\nconst EMPTY_STEPS: readonly TimelineStep[] = [];\n\nexport interface SuperGroupingTranscriptProps\n extends Pick<\n SuperGroupingCardProps,\n | 'toolUIs'\n | 'ToolFallback'\n | 'TextComponent'\n | 'ReasoningComponent'\n | 'GroupComponent'\n | 'getToolGroupKey'\n | 'groupingFunction'\n | 'isInlineTool'\n | 'waitingTools'\n | 'waitingToolCallIds'\n | 'passThroughTools'\n | 'waitingForInput'\n | 'resolveToolDisplayName'\n | 'expansionKey'\n | 'expandWhileWaiting'\n | 'mountDetails'\n | 'summaryDetails'\n | 'renderHeaderActions'\n | 'renderRunningMeta'\n | 'className'\n > {\n /** Steps an opened segment lists before older ones fold away; unresolved calls always show. */\n maxVisibleSteps?: number;\n classNames?: {\n root?: string;\n header?: string;\n body?: string;\n details?: string;\n /** The flex column a segment's parts render in; override its gap here. */\n detailsParts?: string;\n };\n}\n\n// ─── Turn timing ───────────────────────────────────────────────────────\n\n/**\n * The turn's stamps: the prompt it answers, its joined metadata, and the raw\n * messages behind it. Reads the whole message (the bound raw messages hang off\n * it), so only the small header status subscribes here, never the transcript.\n */\nfunction useTurnTimingSources(): { timing: TurnTiming; clockKey: string } {\n const message = useAuiState((s) => s.message);\n const promptCreatedAt = useAuiState((s) => {\n const previous = s.thread.messages[s.message.index - 1];\n return previous?.role === 'user' ? readMessageCreatedAt(previous.metadata?.custom) : null;\n });\n const promptId = useAuiState((s) => {\n const previous = s.thread.messages[s.message.index - 1];\n return previous?.role === 'user' ? previous.id : '';\n });\n const timing = useMemo(\n () =>\n readTurnTiming({\n promptCreatedAt,\n custom: message.metadata?.custom,\n sourceMessages: getExternalStoreMessages<unknown>(message),\n }),\n [message, promptCreatedAt],\n );\n return { timing, clockKey: `${promptId}:${message.id}` };\n}\n\n/** \"Working for 1m 12s\", re-rendered once a second by itself so the transcript does not. */\nfunction WorkingFor({ startMs, clockKey }: { startMs: number | null; clockKey: string }) {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n const timer = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(timer);\n }, []);\n const anchor = startMs ?? firstSeenMs(clockKey, now);\n return <>{workingLabel(Math.max(0, now - anchor))}</>;\n}\n\n/**\n * The header's words: \"Working for 1m 12s\" while the turn runs, \"Worked for\n * 2m 30s · Used 7 tools\" once done, \"Waiting for you\", or how it ended.\n */\nfunction TurnStatus({\n phase,\n cancelled,\n activitySummary,\n toolCount,\n summaryDetails,\n}: {\n phase: ActivityPhase;\n cancelled: boolean;\n activitySummary: string;\n toolCount: number;\n summaryDetails: readonly string[] | undefined;\n}) {\n const { timing, clockKey } = useTurnTimingSources();\n const [observedEndMs, setObservedEndMs] = useState(() => observedTurnEndMs(clockKey));\n const wasActive = useRef(phase === 'running' || phase === 'waiting');\n useEffect(() => {\n const active = phase === 'running' || phase === 'waiting';\n if (wasActive.current && !active) setObservedEndMs(recordObservedTurnEnd(clockKey));\n wasActive.current = active;\n }, [phase, clockKey]);\n if (phase === 'running') return <WorkingFor startMs={timing.startMs} clockKey={clockKey} />;\n if (phase === 'waiting') return <>Waiting for you</>;\n const workedMs = workedDurationMs(timing, observedEndMs);\n if (phase === 'error') {\n if (!cancelled) return <>Something went wrong</>;\n return <>{workedMs !== null ? `Run stopped after ${formatWorkDuration(workedMs)}` : 'Run stopped'}</>;\n }\n const label = [\n ...(workedMs !== null ? [`Worked for ${formatWorkDuration(workedMs)}`] : []),\n ...(workedMs === null || toolCount > 0 || activitySummary !== 'Reasoning complete' ? [activitySummary] : []),\n ...(summaryDetails ?? []),\n ].join(' · ');\n return <>{label}</>;\n}\n\nfunction TurnGlyph({ phase }: { phase: ActivityPhase }) {\n const className = 'size-3.5 shrink-0';\n if (phase === 'running') {\n return <LoaderCircle aria-hidden=\"true\" className={cn(className, 'motion-safe:animate-spin')} />;\n }\n if (phase === 'waiting') {\n return <Circle aria-hidden=\"true\" className={cn(className, 'text-amber-600 dark:text-amber-400')} />;\n }\n if (phase === 'error') {\n return <AlertCircle aria-hidden=\"true\" className={cn(className, 'text-destructive')} />;\n }\n return <Check aria-hidden=\"true\" className={cn(className, 'opacity-70')} />;\n}\n\n// ─── Segments ──────────────────────────────────────────────────────────\n\nconst ProseSegment = memo(function ProseSegment({\n text,\n TextComponent,\n}: {\n text: string;\n TextComponent: TextMessagePartComponent;\n}) {\n return (\n <div data-slot=\"transcript-prose\" className=\"min-w-0\">\n <TextComponent type=\"text\" text={text} status={{ type: 'complete' }} />\n </div>\n );\n});\n\ninterface ActivitySegmentProps {\n segment: Extract<TurnSegment, { kind: 'activity' }>;\n steps: readonly TimelineStep[];\n turnPhase: ActivityPhase;\n expansionKey: string;\n expandWhileWaiting: boolean;\n mountDetails: boolean;\n maxVisibleSteps: number;\n grouping: GroupingFunction;\n /** This segment's inline tool calls (an editable draft), rendered outside its disclosures. */\n inlineParts: readonly { index: number; key: string }[];\n /** False when every step's UI renders inline, so there is nothing behind \"Show tool details\". */\n hasDetails: boolean;\n components: GroupedMessagePartsProps['components'];\n classNames: SuperGroupingTranscriptProps['classNames'];\n}\n\n/**\n * One collapsed run of work between two of the agent's sentences: the step in\n * progress (or the last one taken) on one line, the segment's steps when\n * opened, and the tool UIs of just this segment behind \"Show tool details\".\n * The tool UIs stay mounted (hidden) while the turn is live so their effects\n * run, as in `SuperGroupingCard`.\n */\nfunction ActivitySegment({\n segment,\n steps,\n turnPhase,\n expansionKey,\n expandWhileWaiting,\n mountDetails,\n maxVisibleSteps,\n grouping,\n inlineParts,\n hasDetails,\n components,\n classNames,\n}: ActivitySegmentProps) {\n const summary = summarizeSegment(steps);\n const phase = summary.phase;\n const { expanded, toggleExpanded } = useActivityExpansion({\n expansionKey: `${expansionKey}:${segment.key}`,\n phase,\n expandWhileWaiting,\n });\n const { expanded: detailsExpanded, toggleExpanded: toggleDetails } = useActivityExpansion({\n expansionKey: `${expansionKey}:${segment.key}:details`,\n phase,\n expandWhileWaiting,\n });\n const indicesKey = segment.partIndices.join(',');\n const scopedGrouping = useMemo(\n () => scopeGroupingToSegment(grouping, indicesKey.split(',').map(Number)),\n [grouping, indicesKey],\n );\n const isTurnActive = turnPhase === 'running' || turnPhase === 'waiting';\n // The toolkit groups inside keep their tool UIs mounted when the details do.\n const groupingContext = useMemo(\n () => ({ groupingFunction: scopedGrouping, mountHidden: isTurnActive || mountDetails }),\n [scopedGrouping, isTurnActive, mountDetails],\n );\n const detailsPanelId = `aui-sg-segment-${useId().replace(/[^A-Za-z0-9_-]/g, '')}`;\n\n const detailsMounted = isTurnActive || mountDetails || (expanded && detailsExpanded);\n const hasToolSteps = steps.some((step) => step.kind === 'tool');\n const meta = [summary.step?.chip, summary.meta].filter(Boolean).join(' · ');\n\n // Parts with no step of their own (an image the agent produced) are content, not work.\n if (steps.length === 0) {\n return (\n <div data-slot=\"transcript-parts\" className={cn('flex min-w-0 flex-col gap-2', classNames?.detailsParts)}>\n <SuperGroupingProvider value={groupingContext}>\n <GroupedMessageParts groupingFunction={scopedGrouping} components={components} />\n </SuperGroupingProvider>\n </div>\n );\n }\n\n return (\n <div data-slot=\"activity-segment\" data-phase={phase} data-segment-key={segment.key} className=\"min-w-0\">\n <ToolTimeline\n steps={steps}\n open={expanded}\n onOpenChange={toggleExpanded}\n label={<StepText text={summary.label} code={summary.step?.code} />}\n labelTitle={summary.step?.detail}\n phase={phase}\n maxVisibleSteps={maxVisibleSteps}\n keepMounted={isTurnActive || mountDetails}\n meta={meta ? <span data-slot=\"activity-segment-meta\">{meta}</span> : null}\n >\n {hasDetails ? (\n <div className=\"min-w-0 pl-5\">\n <button\n type=\"button\"\n onClick={toggleDetails}\n aria-expanded={detailsExpanded}\n aria-controls={detailsPanelId}\n className=\"flex items-center gap-1.5 rounded py-1 text-xs text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <ChevronRight\n aria-hidden=\"true\"\n className={cn(\n 'size-3 transition-transform motion-reduce:transition-none',\n detailsExpanded && 'rotate-90',\n )}\n />\n {detailsExpanded\n ? hasToolSteps\n ? 'Hide tool details'\n : 'Hide thinking'\n : hasToolSteps\n ? 'Show tool details'\n : 'Show thinking'}\n </button>\n {detailsMounted ? (\n <section\n id={detailsPanelId}\n aria-label=\"Step details\"\n hidden={!expanded || !detailsExpanded}\n className={cn(\n 'min-w-0 overflow-hidden border-l border-border/60 py-2 pl-3',\n classNames?.details,\n )}\n >\n <div className={cn('flex flex-col gap-2', classNames?.detailsParts)}>\n <SuperGroupingProvider value={groupingContext}>\n <GroupedMessageParts groupingFunction={scopedGrouping} components={components} />\n </SuperGroupingProvider>\n </div>\n </section>\n ) : null}\n </div>\n ) : null}\n </ToolTimeline>\n {inlineParts.length > 0 ? (\n <div data-slot=\"activity-segment-inline-tools\" className=\"mt-2 flex min-w-0 flex-col gap-2\">\n {inlineParts.map(({ index, key }) => (\n <MessagePrimitive.PartByIndex key={key} index={index} components={components} />\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n\n// ─── Transcript ────────────────────────────────────────────────────────\n\n/**\n * The collapsed view (previously called the conversational view) of an\n * assistant turn as a transcript: a header that says how long the turn has\n * been working (\"Working for 1m 12s\", then \"Worked for 2m 30s\"), then the\n * agent's own sentences in the order it wrote them, each run of work between\n * them folded into one collapsed activity segment that names its step (\"Ran\n * `git log -1`\", \"Read `config.ts`\"). The answer — the text after the last\n * tool call — renders below it through `SuperGroupingFinalText`, exactly as\n * under `SuperGroupingCard`, so no text renders twice.\n *\n * Takes the same renderer and host slots as `SuperGroupingCard`;\n * `renderRunningMeta` and `renderHeaderActions` sit on the header row.\n *\n * Selector discipline: raw reads only (`message`, `message.content`,\n * `message.status`, the previous message's stamp and id); every derivation\n * runs in `useMemo`.\n */\nexport const SuperGroupingTranscript = memo(function SuperGroupingTranscript({\n toolUIs,\n ToolFallback: ToolFallbackComponent = ToolFallback,\n TextComponent,\n ReasoningComponent,\n GroupComponent = CollapsibleGroup,\n getToolGroupKey = defaultGetToolGroupKey,\n groupingFunction,\n isInlineTool = isSdkInlineTool,\n waitingTools,\n waitingToolCallIds,\n passThroughTools,\n waitingForInput = false,\n resolveToolDisplayName,\n expansionKey: expansionKeyProp,\n expandWhileWaiting = false,\n mountDetails = false,\n maxVisibleSteps = DEFAULT_MAX_VISIBLE_STEPS,\n summaryDetails,\n renderHeaderActions,\n renderRunningMeta,\n className,\n classNames,\n}: SuperGroupingTranscriptProps) {\n const messageId = useAuiState((s) => s.message.id);\n const earlierStepsUnloaded = useEarlierStepsUnloaded();\n const messageContent = useAuiState((s) =>\n s.message.role === 'assistant' ? s.message.content : EMPTY_CONTENT,\n );\n const messageStatus = useAuiState((s) => s.message.status);\n\n const timeline = useMemo(\n () =>\n buildActivityTimeline(messageContent, messageStatus, {\n waitingTools,\n waitingToolCallIds,\n passThroughTools,\n }),\n [messageContent, messageStatus, waitingTools, waitingToolCallIds, passThroughTools],\n );\n const phase = useMemo(\n () => resolveActivityPhase(messageStatus, timeline, { waitingForInput }),\n [messageStatus, timeline, waitingForInput],\n );\n const assetTitles = useMemo(() => collectAssetTitles(messageContent), [messageContent]);\n const stepsByPart = useMemo(() => {\n const byPart = new Map<number, TimelineStep>();\n timeline.forEach((item, index) => {\n if (item.partIndex === undefined) return;\n byPart.set(item.partIndex, toTimelineStep({ item, index, resolveToolDisplayName, assetTitles }));\n });\n return byPart;\n }, [timeline, resolveToolDisplayName, assetTitles]);\n const segments = useMemo(() => splitTurnSegments(messageContent), [messageContent]);\n const grouping = useMemo(\n () =>\n excludePartsFromGroups(\n groupingFunction ?? createToolBasedGroupingFunction(getToolGroupKey),\n (part) => isGroupedToolCallPart(part) && isInlineTool(part.toolName, part),\n ),\n [groupingFunction, getToolGroupKey, isInlineTool],\n );\n const inlineKeys = useMemo(() => {\n const keys = new Map<number, string>();\n messageContent.forEach((part, index) => {\n if (part.type === 'tool-call' && isInlineTool(part.toolName, part)) keys.set(index, part.toolCallId);\n });\n return keys;\n }, [messageContent, isInlineTool]);\n const components = useMemo(\n () => ({\n tools: {\n ...(toolUIs ? { by_name: toolUIs } : {}),\n Fallback: ToolFallbackComponent,\n },\n Text: TextComponent,\n ...(ReasoningComponent ? { Reasoning: ReasoningComponent } : {}),\n Group: GroupComponent,\n }),\n [toolUIs, ToolFallbackComponent, TextComponent, ReasoningComponent, GroupComponent],\n );\n const statusId = `aui-sg-turn-${useId().replace(/[^A-Za-z0-9_-]/g, '')}`;\n\n const hasText = messageContent.some((part) => part.type === 'text' && part.text.trim() !== '');\n const isVisible =\n timeline.length > 0 ||\n phase === 'waiting' ||\n phase === 'error' ||\n (phase === 'running' && !hasText) ||\n earlierStepsUnloaded;\n if (!isVisible) return null;\n\n const expansionKey = expansionKeyProp ?? messageId;\n const toolCount = countActivityTools(timeline);\n const runningStep = [...stepsByPart.values()].filter((step) => step.state === 'running').at(-1);\n const cancelled = messageStatus?.type === 'incomplete' && messageStatus.reason === 'cancelled';\n const activitySummary = getActivitySummary(timeline, { earlierStepsUnloaded });\n // The live region speaks what changed, never the ticking clock.\n const announcement =\n phase === 'running'\n ? (runningStep?.verb ?? 'Working')\n : phase === 'waiting'\n ? 'Waiting for your input'\n : phase === 'error'\n ? cancelled\n ? 'Run stopped'\n : 'Something went wrong'\n : activitySummary;\n const actions = renderHeaderActions?.({ phase, messageContent });\n const meta = phase === 'running' ? renderRunningMeta?.({ phase }) : null;\n\n return (\n <section\n data-slot=\"super-grouping-transcript\"\n data-phase={phase}\n data-tool-count={toolCount}\n className={cn('my-3 flex min-w-0 flex-col gap-1', className, classNames?.root)}\n aria-busy={phase === 'running' ? 'true' : 'false'}\n aria-describedby={statusId}\n >\n <div\n data-slot=\"turn-header\"\n className={cn(\n 'flex min-w-0 items-center gap-2 py-1 text-[13px] text-muted-foreground',\n classNames?.header,\n )}\n >\n <TurnGlyph phase={phase} />\n <span\n data-slot=\"turn-status\"\n className={cn(\n 'min-w-0 flex-1 truncate tabular-nums leading-5',\n phase === 'error' && !cancelled && 'text-destructive',\n )}\n >\n <TurnStatus\n phase={phase}\n cancelled={cancelled}\n activitySummary={activitySummary}\n toolCount={toolCount}\n summaryDetails={summaryDetails}\n />\n </span>\n {meta ? (\n <div data-slot=\"turn-meta\" className=\"flex shrink-0 items-center text-xs tabular-nums\">\n {meta}\n </div>\n ) : null}\n {actions ? <div className=\"flex shrink-0 items-center gap-1\">{actions}</div> : null}\n </div>\n {segments.length > 0 ? (\n <div\n data-slot=\"super-grouping-transcript-body\"\n className={cn('flex min-w-0 flex-col gap-1.5', classNames?.body)}\n >\n {segments.map((segment) =>\n segment.kind === 'prose' ? (\n <ProseSegment key={segment.key} text={segment.text} TextComponent={TextComponent} />\n ) : (\n <ActivitySegment\n key={segment.key}\n segment={segment}\n steps={segmentSteps(segment, stepsByPart)}\n turnPhase={phase}\n expansionKey={expansionKey}\n expandWhileWaiting={expandWhileWaiting}\n mountDetails={mountDetails}\n maxVisibleSteps={maxVisibleSteps}\n grouping={grouping}\n inlineParts={segment.partIndices.flatMap((index) => {\n const key = inlineKeys.get(index);\n return key === undefined ? [] : [{ index, key }];\n })}\n hasDetails={segment.partIndices.some(\n (index) => !inlineKeys.has(index) && messageContent[index]?.type !== 'text',\n )}\n components={components}\n classNames={classNames}\n />\n ),\n )}\n </div>\n ) : null}\n <output id={statusId} aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\">\n {announcement}\n </output>\n </section>\n );\n});\n\nfunction segmentSteps(\n segment: Extract<TurnSegment, { kind: 'activity' }>,\n stepsByPart: ReadonlyMap<number, TimelineStep>,\n): readonly TimelineStep[] {\n const steps = segment.partIndices\n .map((index) => stepsByPart.get(index))\n .filter((step): step is TimelineStep => step !== undefined);\n return steps.length > 0 ? steps : EMPTY_STEPS;\n}\n"],"names":["ProseSegment","SuperGroupingTranscript"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SuperGroupingTranscript.js","sources":["../../../src/chat/super-grouping/SuperGroupingTranscript.tsx"],"sourcesContent":["'use client';\n\nimport {\n getExternalStoreMessages,\n MessagePrimitive,\n type TextMessagePartComponent,\n type ThreadAssistantMessagePart,\n useAuiState,\n} from '@assistant-ui/react';\nimport { AlertCircle, Check, ChevronRight, Circle, LoaderCircle } from 'lucide-react';\nimport { memo, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { cn } from '../../lib/utils';\nimport { StepText } from '../../tools/step-text';\nimport { isSdkInlineTool } from '../../tools/inline-tools';\nimport { ToolFallback } from '../../tools/tool-fallback';\nimport { collectAssetTitles } from '../../tools/tool-summary';\nimport { readMessageCreatedAt } from '../message-time';\nimport {\n type ActivityPhase,\n buildActivityTimeline,\n countActivityTools,\n excludePartsFromGroups,\n getActivitySummary,\n resolveActivityPhase,\n} from './activity-timeline';\nimport { CollapsibleGroup, SuperGroupingProvider } from './CollapsibleGroup';\nimport { GroupedMessageParts, type GroupedMessagePartsProps } from './GroupedMessageParts';\nimport { createToolBasedGroupingFunction, type GroupingFunction, isGroupedToolCallPart } from './grouping-function';\nimport { type SuperGroupingCardProps, useActivityExpansion } from './SuperGroupingCard';\nimport { ToolTimeline } from './ToolTimeline';\nimport { type TimelineStep, toTimelineStep } from './timeline-step';\nimport { defaultGetToolGroupKey } from './toolkit-map';\nimport { useEarlierStepsUnloaded } from './use-earlier-steps-unloaded';\nimport { useTurnStepsControl, useTurnStepsMarker } from './use-turn-steps';\nimport {\n scopeGroupingToSegment,\n splitTurnSegments,\n summarizeSegment,\n type TurnSegment,\n} from './turn-segments';\nimport {\n firstSeenMs,\n formatWorkDuration,\n observedTurnEndMs,\n readTurnTiming,\n recordObservedTurnEnd,\n type TurnTiming,\n workedDurationMs,\n workingLabel,\n} from './turn-timing';\n\nconst DEFAULT_MAX_VISIBLE_STEPS = 6;\nconst EMPTY_CONTENT: readonly ThreadAssistantMessagePart[] = [];\nconst EMPTY_STEPS: readonly TimelineStep[] = [];\n\nexport interface SuperGroupingTranscriptProps\n extends Pick<\n SuperGroupingCardProps,\n | 'toolUIs'\n | 'ToolFallback'\n | 'TextComponent'\n | 'ReasoningComponent'\n | 'GroupComponent'\n | 'getToolGroupKey'\n | 'groupingFunction'\n | 'isInlineTool'\n | 'waitingTools'\n | 'waitingToolCallIds'\n | 'passThroughTools'\n | 'waitingForInput'\n | 'resolveToolDisplayName'\n | 'expansionKey'\n | 'expandWhileWaiting'\n | 'mountDetails'\n | 'summaryDetails'\n | 'renderHeaderActions'\n | 'renderRunningMeta'\n | 'className'\n > {\n /** Steps an opened segment lists before older ones fold away; unresolved calls always show. */\n maxVisibleSteps?: number;\n classNames?: {\n root?: string;\n header?: string;\n body?: string;\n details?: string;\n /** The flex column a segment's parts render in; override its gap here. */\n detailsParts?: string;\n };\n}\n\n// ─── Turn timing ───────────────────────────────────────────────────────\n\n/**\n * The turn's stamps: the prompt it answers, its joined metadata, and the raw\n * messages behind it. Reads the whole message (the bound raw messages hang off\n * it), so only the small header status subscribes here, never the transcript.\n */\nfunction useTurnTimingSources(): { timing: TurnTiming; clockKey: string } {\n const message = useAuiState((s) => s.message);\n const promptCreatedAt = useAuiState((s) => {\n const previous = s.thread.messages[s.message.index - 1];\n return previous?.role === 'user' ? readMessageCreatedAt(previous.metadata?.custom) : null;\n });\n const promptId = useAuiState((s) => {\n const previous = s.thread.messages[s.message.index - 1];\n return previous?.role === 'user' ? previous.id : '';\n });\n const timing = useMemo(\n () =>\n readTurnTiming({\n promptCreatedAt,\n custom: message.metadata?.custom,\n sourceMessages: getExternalStoreMessages<unknown>(message),\n }),\n [message, promptCreatedAt],\n );\n return { timing, clockKey: `${promptId}:${message.id}` };\n}\n\n/** \"Working for 1m 12s\", re-rendered once a second by itself so the transcript does not. */\nfunction WorkingFor({ startMs, clockKey }: { startMs: number | null; clockKey: string }) {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n const timer = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(timer);\n }, []);\n const anchor = startMs ?? firstSeenMs(clockKey, now);\n return <>{workingLabel(Math.max(0, now - anchor))}</>;\n}\n\n/**\n * The header's words: \"Working for 1m 12s\" while the turn runs, \"Worked for\n * 2m 30s · Used 7 tools\" once done, \"Waiting for you\", or how it ended.\n */\nfunction TurnStatus({\n phase,\n cancelled,\n activitySummary,\n toolCount,\n summaryDetails,\n}: {\n phase: ActivityPhase;\n cancelled: boolean;\n activitySummary: string;\n toolCount: number;\n summaryDetails: readonly string[] | undefined;\n}) {\n const { timing, clockKey } = useTurnTimingSources();\n const [observedEndMs, setObservedEndMs] = useState(() => observedTurnEndMs(clockKey));\n const wasActive = useRef(phase === 'running' || phase === 'waiting');\n useEffect(() => {\n const active = phase === 'running' || phase === 'waiting';\n if (wasActive.current && !active) setObservedEndMs(recordObservedTurnEnd(clockKey));\n wasActive.current = active;\n }, [phase, clockKey]);\n if (phase === 'running') return <WorkingFor startMs={timing.startMs} clockKey={clockKey} />;\n if (phase === 'waiting') return <>Waiting for you</>;\n const workedMs = workedDurationMs(timing, observedEndMs);\n if (phase === 'error') {\n if (!cancelled) return <>Something went wrong</>;\n return <>{workedMs !== null ? `Run stopped after ${formatWorkDuration(workedMs)}` : 'Run stopped'}</>;\n }\n const label = [\n ...(workedMs !== null ? [`Worked for ${formatWorkDuration(workedMs)}`] : []),\n ...(workedMs === null || toolCount > 0 || activitySummary !== 'Reasoning complete' ? [activitySummary] : []),\n ...(summaryDetails ?? []),\n ].join(' · ');\n return <>{label}</>;\n}\n\nfunction TurnGlyph({ phase }: { phase: ActivityPhase }) {\n const className = 'size-3.5 shrink-0';\n if (phase === 'running') {\n return <LoaderCircle aria-hidden=\"true\" className={cn(className, 'motion-safe:animate-spin')} />;\n }\n if (phase === 'waiting') {\n return <Circle aria-hidden=\"true\" className={cn(className, 'text-amber-600 dark:text-amber-400')} />;\n }\n if (phase === 'error') {\n return <AlertCircle aria-hidden=\"true\" className={cn(className, 'text-destructive')} />;\n }\n return <Check aria-hidden=\"true\" className={cn(className, 'opacity-70')} />;\n}\n\n// ─── Segments ──────────────────────────────────────────────────────────\n\nconst ProseSegment = memo(function ProseSegment({\n text,\n TextComponent,\n}: {\n text: string;\n TextComponent: TextMessagePartComponent;\n}) {\n return (\n <div data-slot=\"transcript-prose\" className=\"min-w-0\">\n <TextComponent type=\"text\" text={text} status={{ type: 'complete' }} />\n </div>\n );\n});\n\ninterface ActivitySegmentProps {\n segment: Extract<TurnSegment, { kind: 'activity' }>;\n steps: readonly TimelineStep[];\n turnPhase: ActivityPhase;\n expansionKey: string;\n expandWhileWaiting: boolean;\n mountDetails: boolean;\n maxVisibleSteps: number;\n grouping: GroupingFunction;\n /** This segment's inline tool calls (an editable draft), rendered outside its disclosures. */\n inlineParts: readonly { index: number; key: string }[];\n /** False when every step's UI renders inline, so there is nothing behind \"Show tool details\". */\n hasDetails: boolean;\n components: GroupedMessagePartsProps['components'];\n classNames: SuperGroupingTranscriptProps['classNames'];\n}\n\n/**\n * One collapsed run of work between two of the agent's sentences: the step in\n * progress (or the last one taken) on one line, the segment's steps when\n * opened, and the tool UIs of just this segment behind \"Show tool details\".\n * The tool UIs stay mounted (hidden) while the turn is live so their effects\n * run, as in `SuperGroupingCard`.\n */\nfunction ActivitySegment({\n segment,\n steps,\n turnPhase,\n expansionKey,\n expandWhileWaiting,\n mountDetails,\n maxVisibleSteps,\n grouping,\n inlineParts,\n hasDetails,\n components,\n classNames,\n}: ActivitySegmentProps) {\n const summary = summarizeSegment(steps);\n const phase = summary.phase;\n const { expanded, toggleExpanded } = useActivityExpansion({\n expansionKey: `${expansionKey}:${segment.key}`,\n phase,\n expandWhileWaiting,\n });\n const { expanded: detailsExpanded, toggleExpanded: toggleDetails } = useActivityExpansion({\n expansionKey: `${expansionKey}:${segment.key}:details`,\n phase,\n expandWhileWaiting,\n });\n const indicesKey = segment.partIndices.join(',');\n const scopedGrouping = useMemo(\n () => scopeGroupingToSegment(grouping, indicesKey.split(',').map(Number)),\n [grouping, indicesKey],\n );\n const isTurnActive = turnPhase === 'running' || turnPhase === 'waiting';\n // The toolkit groups inside keep their tool UIs mounted when the details do.\n const groupingContext = useMemo(\n () => ({ groupingFunction: scopedGrouping, mountHidden: isTurnActive || mountDetails }),\n [scopedGrouping, isTurnActive, mountDetails],\n );\n const detailsPanelId = `aui-sg-segment-${useId().replace(/[^A-Za-z0-9_-]/g, '')}`;\n\n const detailsMounted = isTurnActive || mountDetails || (expanded && detailsExpanded);\n const hasToolSteps = steps.some((step) => step.kind === 'tool');\n const meta = [summary.step?.chip, summary.meta].filter(Boolean).join(' · ');\n\n // Parts with no step of their own (an image the agent produced) are content, not work.\n if (steps.length === 0) {\n return (\n <div data-slot=\"transcript-parts\" className={cn('flex min-w-0 flex-col gap-2', classNames?.detailsParts)}>\n <SuperGroupingProvider value={groupingContext}>\n <GroupedMessageParts groupingFunction={scopedGrouping} components={components} />\n </SuperGroupingProvider>\n </div>\n );\n }\n\n return (\n <div data-slot=\"activity-segment\" data-phase={phase} data-segment-key={segment.key} className=\"min-w-0\">\n <ToolTimeline\n steps={steps}\n open={expanded}\n onOpenChange={toggleExpanded}\n label={<StepText text={summary.label} code={summary.step?.code} />}\n labelTitle={summary.step?.detail}\n phase={phase}\n maxVisibleSteps={maxVisibleSteps}\n keepMounted={isTurnActive || mountDetails}\n meta={meta ? <span data-slot=\"activity-segment-meta\">{meta}</span> : null}\n >\n {hasDetails ? (\n <div className=\"min-w-0 pl-5\">\n <button\n type=\"button\"\n onClick={toggleDetails}\n aria-expanded={detailsExpanded}\n aria-controls={detailsPanelId}\n className=\"flex items-center gap-1.5 rounded py-1 text-xs text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <ChevronRight\n aria-hidden=\"true\"\n className={cn(\n 'size-3 transition-transform motion-reduce:transition-none',\n detailsExpanded && 'rotate-90',\n )}\n />\n {detailsExpanded\n ? hasToolSteps\n ? 'Hide tool details'\n : 'Hide thinking'\n : hasToolSteps\n ? 'Show tool details'\n : 'Show thinking'}\n </button>\n {detailsMounted ? (\n <section\n id={detailsPanelId}\n aria-label=\"Step details\"\n hidden={!expanded || !detailsExpanded}\n className={cn(\n 'min-w-0 overflow-hidden border-l border-border/60 py-2 pl-3',\n classNames?.details,\n )}\n >\n <div className={cn('flex flex-col gap-2', classNames?.detailsParts)}>\n <SuperGroupingProvider value={groupingContext}>\n <GroupedMessageParts groupingFunction={scopedGrouping} components={components} />\n </SuperGroupingProvider>\n </div>\n </section>\n ) : null}\n </div>\n ) : null}\n </ToolTimeline>\n {inlineParts.length > 0 ? (\n <div data-slot=\"activity-segment-inline-tools\" className=\"mt-2 flex min-w-0 flex-col gap-2\">\n {inlineParts.map(({ index, key }) => (\n <MessagePrimitive.PartByIndex key={key} index={index} components={components} />\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n\n// ─── Transcript ────────────────────────────────────────────────────────\n\n/**\n * The collapsed view (previously called the conversational view) of an\n * assistant turn as a transcript: a header that says how long the turn has\n * been working (\"Working for 1m 12s\", then \"Worked for 2m 30s\"), then the\n * agent's own sentences in the order it wrote them, each run of work between\n * them folded into one collapsed activity segment that names its step (\"Ran\n * `git log -1`\", \"Read `config.ts`\"). The answer — the text after the last\n * tool call — renders below it through `SuperGroupingFinalText`, exactly as\n * under `SuperGroupingCard`, so no text renders twice.\n *\n * Takes the same renderer and host slots as `SuperGroupingCard`;\n * `renderRunningMeta` and `renderHeaderActions` sit on the header row.\n *\n * Selector discipline: raw reads only (`message`, `message.content`,\n * `message.status`, the previous message's stamp and id); every derivation\n * runs in `useMemo`.\n */\nexport const SuperGroupingTranscript = memo(function SuperGroupingTranscript({\n toolUIs,\n ToolFallback: ToolFallbackComponent = ToolFallback,\n TextComponent,\n ReasoningComponent,\n GroupComponent = CollapsibleGroup,\n getToolGroupKey = defaultGetToolGroupKey,\n groupingFunction,\n isInlineTool = isSdkInlineTool,\n waitingTools,\n waitingToolCallIds,\n passThroughTools,\n waitingForInput = false,\n resolveToolDisplayName,\n expansionKey: expansionKeyProp,\n expandWhileWaiting = false,\n mountDetails = false,\n maxVisibleSteps = DEFAULT_MAX_VISIBLE_STEPS,\n summaryDetails,\n renderHeaderActions,\n renderRunningMeta,\n className,\n classNames,\n}: SuperGroupingTranscriptProps) {\n const messageId = useAuiState((s) => s.message.id);\n const earlierStepsUnloaded = useEarlierStepsUnloaded();\n const stepsMarker = useTurnStepsMarker();\n const TurnStepsControl = useTurnStepsControl();\n const messageContent = useAuiState((s) =>\n s.message.role === 'assistant' ? s.message.content : EMPTY_CONTENT,\n );\n const messageStatus = useAuiState((s) => s.message.status);\n\n const timeline = useMemo(\n () =>\n buildActivityTimeline(messageContent, messageStatus, {\n waitingTools,\n waitingToolCallIds,\n passThroughTools,\n }),\n [messageContent, messageStatus, waitingTools, waitingToolCallIds, passThroughTools],\n );\n const phase = useMemo(\n () => resolveActivityPhase(messageStatus, timeline, { waitingForInput }),\n [messageStatus, timeline, waitingForInput],\n );\n const assetTitles = useMemo(() => collectAssetTitles(messageContent), [messageContent]);\n const stepsByPart = useMemo(() => {\n const byPart = new Map<number, TimelineStep>();\n timeline.forEach((item, index) => {\n if (item.partIndex === undefined) return;\n byPart.set(item.partIndex, toTimelineStep({ item, index, resolveToolDisplayName, assetTitles }));\n });\n return byPart;\n }, [timeline, resolveToolDisplayName, assetTitles]);\n const segments = useMemo(() => splitTurnSegments(messageContent), [messageContent]);\n const grouping = useMemo(\n () =>\n excludePartsFromGroups(\n groupingFunction ?? createToolBasedGroupingFunction(getToolGroupKey),\n (part) => isGroupedToolCallPart(part) && isInlineTool(part.toolName, part),\n ),\n [groupingFunction, getToolGroupKey, isInlineTool],\n );\n const inlineKeys = useMemo(() => {\n const keys = new Map<number, string>();\n messageContent.forEach((part, index) => {\n if (part.type === 'tool-call' && isInlineTool(part.toolName, part)) keys.set(index, part.toolCallId);\n });\n return keys;\n }, [messageContent, isInlineTool]);\n const components = useMemo(\n () => ({\n tools: {\n ...(toolUIs ? { by_name: toolUIs } : {}),\n Fallback: ToolFallbackComponent,\n },\n Text: TextComponent,\n ...(ReasoningComponent ? { Reasoning: ReasoningComponent } : {}),\n Group: GroupComponent,\n }),\n [toolUIs, ToolFallbackComponent, TextComponent, ReasoningComponent, GroupComponent],\n );\n const statusId = `aui-sg-turn-${useId().replace(/[^A-Za-z0-9_-]/g, '')}`;\n\n const hasText = messageContent.some((part) => part.type === 'text' && part.text.trim() !== '');\n const isVisible =\n timeline.length > 0 ||\n phase === 'waiting' ||\n phase === 'error' ||\n (phase === 'running' && !hasText) ||\n earlierStepsUnloaded ||\n (stepsMarker?.hiddenSteps ?? 0) > 0;\n if (!isVisible) return null;\n\n // Remembered by the turn for a turn of older history paged by command: its\n // message id changes as its steps load, and a segment opened before must stay open.\n const expansionKey = expansionKeyProp ?? (stepsMarker ? `turn:${stepsMarker.turn}` : messageId);\n const hiddenSteps = stepsMarker\n ? { tools: stepsMarker.hiddenTools, delegations: stepsMarker.hiddenDelegations }\n : undefined;\n const toolCount = countActivityTools(timeline) + (hiddenSteps?.tools ?? 0);\n const runningStep = [...stepsByPart.values()].filter((step) => step.state === 'running').at(-1);\n const cancelled = messageStatus?.type === 'incomplete' && messageStatus.reason === 'cancelled';\n const activitySummary = getActivitySummary(timeline, { earlierStepsUnloaded, hiddenSteps });\n // The live region speaks what changed, never the ticking clock.\n const announcement =\n phase === 'running'\n ? (runningStep?.verb ?? 'Working')\n : phase === 'waiting'\n ? 'Waiting for your input'\n : phase === 'error'\n ? cancelled\n ? 'Run stopped'\n : 'Something went wrong'\n : activitySummary;\n const actions = renderHeaderActions?.({ phase, messageContent });\n const meta = phase === 'running' ? renderRunningMeta?.({ phase }) : null;\n\n return (\n <section\n data-slot=\"super-grouping-transcript\"\n data-phase={phase}\n data-tool-count={toolCount}\n className={cn('my-3 flex min-w-0 flex-col gap-1', className, classNames?.root)}\n aria-busy={phase === 'running' ? 'true' : 'false'}\n aria-describedby={statusId}\n >\n <div\n data-slot=\"turn-header\"\n className={cn(\n 'flex min-w-0 items-center gap-2 py-1 text-[13px] text-muted-foreground',\n classNames?.header,\n )}\n >\n <TurnGlyph phase={phase} />\n <span\n data-slot=\"turn-status\"\n className={cn(\n 'min-w-0 flex-1 truncate tabular-nums leading-5',\n phase === 'error' && !cancelled && 'text-destructive',\n )}\n >\n <TurnStatus\n phase={phase}\n cancelled={cancelled}\n activitySummary={activitySummary}\n toolCount={toolCount}\n summaryDetails={summaryDetails}\n />\n </span>\n {meta ? (\n <div data-slot=\"turn-meta\" className=\"flex shrink-0 items-center text-xs tabular-nums\">\n {meta}\n </div>\n ) : null}\n {actions ? <div className=\"flex shrink-0 items-center gap-1\">{actions}</div> : null}\n </div>\n {stepsMarker && TurnStepsControl ? <TurnStepsControl marker={stepsMarker} /> : null}\n {segments.length > 0 ? (\n <div\n data-slot=\"super-grouping-transcript-body\"\n className={cn('flex min-w-0 flex-col gap-1.5', classNames?.body)}\n >\n {segments.map((segment) =>\n segment.kind === 'prose' ? (\n <ProseSegment key={segment.key} text={segment.text} TextComponent={TextComponent} />\n ) : (\n <ActivitySegment\n key={segment.key}\n segment={segment}\n steps={segmentSteps(segment, stepsByPart)}\n turnPhase={phase}\n expansionKey={expansionKey}\n expandWhileWaiting={expandWhileWaiting}\n mountDetails={mountDetails}\n maxVisibleSteps={maxVisibleSteps}\n grouping={grouping}\n inlineParts={segment.partIndices.flatMap((index) => {\n const key = inlineKeys.get(index);\n return key === undefined ? [] : [{ index, key }];\n })}\n hasDetails={segment.partIndices.some(\n (index) => !inlineKeys.has(index) && messageContent[index]?.type !== 'text',\n )}\n components={components}\n classNames={classNames}\n />\n ),\n )}\n </div>\n ) : null}\n <output id={statusId} aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\">\n {announcement}\n </output>\n </section>\n );\n});\n\nfunction segmentSteps(\n segment: Extract<TurnSegment, { kind: 'activity' }>,\n stepsByPart: ReadonlyMap<number, TimelineStep>,\n): readonly TimelineStep[] {\n const steps = segment.partIndices\n .map((index) => stepsByPart.get(index))\n .filter((step): step is TimelineStep => step !== undefined);\n return steps.length > 0 ? steps : EMPTY_STEPS;\n}\n"],"names":["ProseSegment","SuperGroupingTranscript"],"mappings":"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"}
|