@truefoundry/trueforge-ui 0.1.0 → 0.2.1
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/CHANGELOG.md +34 -15
- package/README.md +38 -38
- package/dist/{ConnectorSettings-H37ZFC6Z.js → ConnectorSettings-XEO5ZQO5.js} +8 -6
- package/dist/{ConnectorSettings-H37ZFC6Z.js.map → ConnectorSettings-XEO5ZQO5.js.map} +1 -1
- package/dist/{DockLayout-KEMFRWIR.js → DockLayout-F2KYSY4U.js} +10 -8
- package/dist/{DockLayout-KEMFRWIR.js.map → DockLayout-F2KYSY4U.js.map} +1 -1
- package/dist/{DrawerLayout-ZVWCKEIS.js → DrawerLayout-FJ7XC2FU.js} +12 -9
- package/dist/{DrawerLayout-ZVWCKEIS.js.map → DrawerLayout-FJ7XC2FU.js.map} +1 -1
- package/dist/{ModelSettings-QJMYHCMD.js → ModelSettings-2QB7LE22.js} +8 -6
- package/dist/{ModelSettings-QJMYHCMD.js.map → ModelSettings-2QB7LE22.js.map} +1 -1
- package/dist/OpenUiFenceBlock-3EFPY4JW.js +9 -0
- package/dist/{SandboxSettings-BUBMLW7Q.js → SandboxSettings-QDDIPRBP.js} +8 -6
- package/dist/{SandboxSettings-BUBMLW7Q.js.map → SandboxSettings-QDDIPRBP.js.map} +1 -1
- package/dist/{SettingsBuilder-26XSGIHK.js → SettingsBuilder-4NF3Y7UZ.js} +10 -8
- package/dist/{SettingsBuilder-26XSGIHK.js.map → SettingsBuilder-4NF3Y7UZ.js.map} +1 -1
- package/dist/ShellRouteSync-T4WLY57Q.js +172 -0
- package/dist/ShellRouteSync-T4WLY57Q.js.map +1 -0
- package/dist/{SidebarLayout-F3XFXW7B.js → SidebarLayout-KX6RSJTP.js} +12 -9
- package/dist/{SidebarLayout-F3XFXW7B.js.map → SidebarLayout-KX6RSJTP.js.map} +1 -1
- package/dist/{SkillSettings-IRMGDFRG.js → SkillSettings-5EETEEDI.js} +8 -6
- package/dist/{SkillSettings-IRMGDFRG.js.map → SkillSettings-5EETEEDI.js.map} +1 -1
- package/dist/TrueForgeUIWithRouter-IAQQTD5V.js +30 -0
- package/dist/TrueForgeUIWithRouter-IAQQTD5V.js.map +1 -0
- package/dist/{WidgetLayout-SZMABKIR.js → WidgetLayout-S6EK62TZ.js} +10 -8
- package/dist/{WidgetLayout-SZMABKIR.js.map → WidgetLayout-S6EK62TZ.js.map} +1 -1
- package/dist/chunk-72LC2M3R.js +567 -0
- package/dist/chunk-72LC2M3R.js.map +1 -0
- package/dist/chunk-EKVN6QSO.js +493 -0
- package/dist/chunk-EKVN6QSO.js.map +1 -0
- package/dist/chunk-FXCYLEFB.js +64 -0
- package/dist/chunk-FXCYLEFB.js.map +1 -0
- package/dist/chunk-IFLE7OMM.js +527 -0
- package/dist/chunk-IFLE7OMM.js.map +1 -0
- package/dist/{chunk-HT5HKQXE.js → chunk-JRRCAKEP.js} +2 -2
- package/dist/{chunk-7EEOWDLE.js → chunk-PTYEOSHT.js} +10 -8
- package/dist/{chunk-7EEOWDLE.js.map → chunk-PTYEOSHT.js.map} +1 -1
- package/dist/{chunk-H7DR64W3.js → chunk-UACLSDNL.js} +39 -94
- package/dist/chunk-UACLSDNL.js.map +1 -0
- package/dist/{chunk-QGNLP2EE.js → chunk-UU7C5DQ3.js} +18 -8
- package/dist/chunk-UU7C5DQ3.js.map +1 -0
- package/dist/chunk-WQULF5AT.js +460 -0
- package/dist/chunk-WQULF5AT.js.map +1 -0
- package/dist/{chunk-LRQHHZDX.js → chunk-X6U2Q7X5.js} +7 -5
- package/dist/{chunk-LRQHHZDX.js.map → chunk-X6U2Q7X5.js.map} +1 -1
- package/dist/chunk-YIWUG6MC.js +101 -0
- package/dist/chunk-YIWUG6MC.js.map +1 -0
- package/dist/index.d.ts +57 -9
- package/dist/index.js +41 -428
- package/dist/index.js.map +1 -1
- package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +9 -6
- package/dist/OpenUiFenceBlock-XFBUGPKQ.js +0 -9
- package/dist/chunk-DTF7ZMUJ.js +0 -567
- package/dist/chunk-DTF7ZMUJ.js.map +0 -1
- package/dist/chunk-H7DR64W3.js.map +0 -1
- package/dist/chunk-QGNLP2EE.js.map +0 -1
- package/dist/chunk-XAZ5HJXV.js +0 -862
- package/dist/chunk-XAZ5HJXV.js.map +0 -1
- /package/dist/{OpenUiFenceBlock-XFBUGPKQ.js.map → OpenUiFenceBlock-3EFPY4JW.js.map} +0 -0
- /package/dist/{chunk-HT5HKQXE.js.map → chunk-JRRCAKEP.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/containers/AgentStepsContainer.tsx","../src/containers/AskUserContainer.tsx","../src/utils/computeAgentStepsSplit.ts","../src/containers/AssistantTextContainer.tsx","../src/hooks/useThrottledMarkdownText.ts","../src/containers/ReasoningContainer.tsx","../src/containers/ToolApprovalContainer.tsx","../src/containers/ToolCallContentBlockContainer.tsx","../src/containers/ToolCallContainer.tsx","../src/utils/toolCallParsing.ts","../src/containers/nestedApprovalBridge.ts","../src/containers/SandboxToolCallContainer.tsx","../src/containers/AssistantMessageContainer.tsx","../src/containers/MessageImageContainer.tsx","../src/containers/AttachmentsContainer.tsx","../src/containers/useAttachmentPreviewSrc.ts","../src/hooks/useComposerPauseView.ts","../src/containers/McpAuthContainer.tsx","../src/containers/ComposerContainer.tsx","../src/containers/HistoryLoaderContainer.tsx","../src/containers/ResumeUnavailableContainer.tsx","../src/containers/UserEditComposerContainer.tsx","../src/containers/UserMessageContainer.tsx","../src/containers/ThreadContainer.tsx","../src/hooks/useSyncSessionTitle.ts","../src/utils/isNewChatView.ts","../src/containers/Thread.tsx","../src/containers/ThreadListContainer.tsx","../src/atoms/AgentHistoryFilterButton.tsx","../src/atoms/primitives/DropdownMenu.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState, type PropsWithChildren, type ReactNode } from 'react';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nexport interface AgentStepsContainerProps {\n toolCount: number;\n thinkingCount: number;\n hasFinal: boolean;\n}\n\n/**\n * Container for \"Agent steps\" section — groups reasoning, intermediate text, and tools\n * in a collapsible accordion that auto-collapses once final answer is confirmed.\n */\nexport function AgentStepsContainer({\n children,\n toolCount,\n thinkingCount,\n hasFinal,\n}: PropsWithChildren<AgentStepsContainerProps>) {\n const AgentStepsCard = useSlot('AgentStepsCard');\n\n const [expanded, setExpanded] = useState(true);\n const collapsedByFinal = useRef(false);\n\n // Auto-collapse once when hasFinal becomes true (matches AgentTimeline behavior)\n useEffect(() => {\n if (hasFinal && !collapsedByFinal.current) {\n collapsedByFinal.current = true;\n setExpanded(false);\n }\n }, [hasFinal]);\n\n return (\n <AgentStepsCard\n toolCount={toolCount}\n thinkingCount={thinkingCount}\n expanded={expanded}\n onToggle={() => setExpanded(prev => !prev)}\n >\n {children as ReactNode}\n </AgentStepsCard>\n );\n}\n","'use client';\n\nimport { useThreadIsRunning } from '@assistant-ui/core/react';\nimport { useTrueFoundryToolResponses } from '@truefoundry/assistant-ui-runtime';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n ASK_USER_CUSTOM_OPTION,\n type AskUserAnswerDraft,\n type Question,\n} from '../atoms/adapters/AskUserPromptAdapter.js';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nconst EMPTY_ANSWER: AskUserAnswerDraft = { radioValue: '', custom: '' };\n\nexport function AskUserContainer() {\n const AskUserPrompt = useSlot('AskUserPrompt');\n const { pending, respond } = useTrueFoundryToolResponses();\n const isRunning = useThreadIsRunning();\n const item = pending[0];\n\n const questions = useMemo<Question[]>(\n () =>\n item == null\n ? []\n : [\n {\n id: item.toolCallId,\n question: item.question ?? 'Answer required',\n options: item.options ?? [],\n },\n ],\n [item],\n );\n const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0);\n const [answers, setAnswers] = useState<Record<string, AskUserAnswerDraft>>({});\n\n useEffect(() => {\n setCurrentQuestionIndex(0);\n setAnswers({});\n }, [item?.toolCallId]);\n\n const safeIndex = Math.min(currentQuestionIndex, Math.max(questions.length - 1, 0));\n const currentQuestion = questions[safeIndex];\n const currentAnswer = currentQuestion == null ? EMPTY_ANSWER : (answers[currentQuestion.id] ?? EMPTY_ANSWER);\n const getResponseForQuestion = useCallback(\n (questionId: string) => {\n const answer = answers[questionId] ?? EMPTY_ANSWER;\n return answer.radioValue === ASK_USER_CUSTOM_OPTION ? answer.custom.trim() : answer.radioValue.trim();\n },\n [answers],\n );\n const allQuestionsAnswered = useMemo(\n () => questions.every(question => getResponseForQuestion(question.id)),\n [getResponseForQuestion, questions],\n );\n const selectedResponse =\n currentAnswer.radioValue === ASK_USER_CUSTOM_OPTION ? currentAnswer.custom.trim() : currentAnswer.radioValue.trim();\n const isSubmitDisabled = isRunning || currentQuestion == null || selectedResponse.length === 0;\n const isSubmitAllDisabled = isSubmitDisabled || !allQuestionsAnswered;\n\n const onCurrentAnswerChange = useCallback((questionId: string, update: Partial<AskUserAnswerDraft>) => {\n setAnswers(previous => ({\n ...previous,\n [questionId]: {\n ...(previous[questionId] ?? EMPTY_ANSWER),\n ...update,\n },\n }));\n }, []);\n\n const onSubmit = useCallback(() => {\n if (item == null || !allQuestionsAnswered) return;\n const content = getResponseForQuestion(item.toolCallId);\n if (!content) return;\n respond({ toolCallId: item.toolCallId, content });\n }, [allQuestionsAnswered, getResponseForQuestion, item, respond]);\n\n if (item == null || currentQuestion == null) return null;\n\n return (\n <AskUserPrompt\n questions={questions}\n readOnly={isRunning}\n currentQuestion={currentQuestion}\n currentQuestionIndex={safeIndex}\n currentAnswer={currentAnswer}\n totalQuestions={questions.length}\n isMultiQuestion={questions.length > 1}\n isLastQuestion={safeIndex === questions.length - 1}\n allQuestionsAnswered={allQuestionsAnswered}\n isSubmitDisabled={isSubmitDisabled}\n isSubmitAllDisabled={isSubmitAllDisabled}\n onCurrentQuestionIndexChange={setCurrentQuestionIndex}\n onCurrentAnswerChange={onCurrentAnswerChange}\n onSubmit={onSubmit}\n />\n );\n}\n","import type { PartState } from '@assistant-ui/core/react';\n\nexport type AgentStepPart = {\n type: PartState['type'];\n text?: string;\n};\n\nexport interface AgentStepsSplitResult {\n cutIndex: number;\n hasFinal: boolean;\n toolCount: number;\n thinkingCount: number;\n}\n\nexport function computeAgentStepsSplit(parts: readonly AgentStepPart[], isRunning: boolean): AgentStepsSplitResult {\n const finalTexts: Array<{ index: number; content: string }> = [];\n let cutIdx = parts.length;\n\n for (let i = parts.length - 1; i >= 0; i--) {\n const part = parts[i];\n if (!part) continue;\n\n if (part.type === 'text') {\n const text = part.text ?? '';\n const trimmed = text.trim();\n\n if (trimmed) {\n finalTexts.unshift({ index: i, content: text });\n cutIdx = i;\n } else {\n cutIdx = i;\n }\n } else {\n break;\n }\n }\n\n const trailingChars = finalTexts.reduce((sum, t) => sum + t.content.length, 0);\n\n // Only apply the 500-char holdback when there are actual agent steps (tool calls or\n // reasoning) before the text. For pure-text responses the text is always the final\n // answer and must stream directly, not be hidden inside the \"Agent steps\" accordion.\n const hasAgentStepsBeforeCut = parts.slice(0, cutIdx).some(p => p.type === 'tool-call' || p.type === 'reasoning');\n\n const finalConfirmed = finalTexts.length > 0 && (!isRunning || trailingChars >= 500 || !hasAgentStepsBeforeCut);\n\n const actualCutIndex = finalConfirmed ? cutIdx : parts.length;\n\n let toolCount = 0;\n let thinkingCount = 0;\n for (let i = 0; i < actualCutIndex; i++) {\n const part = parts[i];\n if (!part) continue;\n\n if (part.type === 'tool-call') {\n toolCount++;\n } else if (part.type === 'reasoning') {\n thinkingCount++;\n }\n }\n\n return {\n cutIndex: actualCutIndex,\n hasFinal: finalConfirmed,\n toolCount,\n thinkingCount,\n };\n}\n","'use client';\n\nimport {\n useAuiState,\n useSmooth,\n type MessagePartState,\n type ReasoningMessagePart,\n type TextMessagePart,\n} from '@assistant-ui/react';\nimport { useTrueFoundryDownloadSandboxFile } from '@truefoundry/assistant-ui-runtime';\nimport { useCallback, useMemo, useRef } from 'react';\n\nimport { MARKDOWN_SMOOTH_BACKLOG_CHARS, useThrottledMarkdownText } from '../hooks/useThrottledMarkdownText.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport { useToasterOptional } from './ToasterContainer.js';\n\nfunction filenameFromPath(path: string): string {\n return path.split('/').pop() || 'download';\n}\n\nfunction triggerBrowserDownload(blob: Blob, filename: string) {\n if (typeof document === 'undefined') return;\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n\nexport function AssistantTextContainer() {\n const Markdown = useSlot('Markdown');\n const toaster = useToasterOptional();\n const downloadSandboxFile = useTrueFoundryDownloadSandboxFile();\n // The download closure changes as the turn streams; a ref keeps onDownloadArtifact stable so\n // OpenUI does not remount.\n const downloadRef = useRef({ downloadSandboxFile, toaster });\n downloadRef.current = { downloadSandboxFile, toaster };\n const partState = useAuiState(s => s.part as MessagePartState & (TextMessagePart | ReasoningMessagePart));\n\n // Preserve the typewriter effect while it keeps pace. If its visible prefix falls too far\n // behind the raw stream, latch this part into bounded latest-prefix snapshots instead of\n // animating an ever-growing queue. We intentionally do not re-enable useSmooth for this part:\n // its private cursor still points at the old prefix and could visibly rewind the message.\n const pacedModeRef = useRef(false);\n const smoothedPart = useSmooth(\n partState,\n pacedModeRef.current\n ? false\n : {\n drainMs: 150,\n maxCharIntervalMs: 4,\n maxCharsPerFrame: 128,\n minCommitMs: 48,\n },\n );\n\n const networkComplete = partState.status?.type !== 'running';\n const smoothLag = partState.text.length - smoothedPart.text.length;\n if (!pacedModeRef.current && !networkComplete && smoothLag >= MARKDOWN_SMOOTH_BACKLOG_CHARS) {\n pacedModeRef.current = true;\n }\n const usePacedMode = pacedModeRef.current;\n\n const pacedText = useThrottledMarkdownText(partState.text, {\n enabled: usePacedMode,\n isComplete: networkComplete,\n });\n\n const text = usePacedMode ? pacedText : smoothedPart.text;\n // true while network stream is active OR while reveal/paced commit is still catching up\n const isStreaming = usePacedMode\n ? !networkComplete || text !== partState.text\n : smoothedPart.status?.type === 'running';\n\n const handleDownloadArtifact = useCallback(async (path: string) => {\n const { downloadSandboxFile, toaster } = downloadRef.current;\n try {\n triggerBrowserDownload(await downloadSandboxFile(path), filenameFromPath(path));\n } catch (error) {\n if (toaster != null) {\n toaster.showError(error);\n } else {\n console.error('Failed to download sandbox artifact', error);\n }\n }\n }, []);\n\n // Skip markdown re-parse when a raw SSE tick did not advance the committed display text.\n return useMemo(\n () => <Markdown content={text} isStreaming={isStreaming} onDownloadArtifact={handleDownloadArtifact} />,\n [Markdown, text, isStreaming, handleDownloadArtifact],\n );\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\n\n/**\n * Maximum tolerated gap between the raw stream and the typewriter reveal.\n * Beyond this point, animating every queued character delays the response noticeably, so the\n * container switches to paced snapshots of the latest raw prefix.\n */\nexport const MARKDOWN_SMOOTH_BACKLOG_CHARS = 4 * 1024;\n\n/**\n * Limits catch-up rendering to roughly 10 updates per second: frequent enough to keep streamed\n * text responsive, while leaving enough main-thread time for full-document Markdown parsing and\n * syntax highlighting to finish before the next snapshot.\n */\nexport const LARGE_MARKDOWN_THROTTLE_MS = 100;\n\n/**\n * Provides bounded latest-prefix snapshots after the typewriter reveal falls too far behind.\n *\n * Enabling the hook immediately catches up to the current raw prefix, then coalesces subsequent\n * stream updates to one commit per `throttleMs`. Completion always bypasses the timer so the final\n * document is exact. While disabled, the hook mirrors `text` and stays ready for a monotonic\n * transition into catch-up mode.\n */\nexport function useThrottledMarkdownText(\n text: string,\n {\n isComplete,\n enabled,\n throttleMs = LARGE_MARKDOWN_THROTTLE_MS,\n }: { isComplete: boolean; enabled: boolean; throttleMs?: number },\n): string {\n const [committed, setCommitted] = useState(text);\n const lastCommittedRef = useRef(text);\n const lastCommitAtRef = useRef(Date.now());\n const pendingRef = useRef(text);\n const wasEnabledRef = useRef(enabled);\n\n useEffect(() => {\n pendingRef.current = text;\n\n const commit = (value: string) => {\n // A stale timer must never replace a newer visible prefix with an older one.\n if (value.length < lastCommittedRef.current.length && value !== lastCommittedRef.current) {\n return;\n }\n lastCommittedRef.current = value;\n lastCommitAtRef.current = Date.now();\n setCommitted(value);\n };\n\n if (!enabled) {\n wasEnabledRef.current = false;\n lastCommittedRef.current = text;\n lastCommitAtRef.current = Date.now();\n setCommitted(text);\n return;\n }\n\n // Clear the accumulated reveal backlog once; only future growth is throttled.\n if (!wasEnabledRef.current) {\n wasEnabledRef.current = true;\n commit(text);\n return;\n }\n\n if (lastCommittedRef.current === text) return;\n\n if (isComplete) {\n commit(text);\n return;\n }\n\n const elapsed = Date.now() - lastCommitAtRef.current;\n if (elapsed >= throttleMs) {\n commit(text);\n return;\n }\n\n const id = setTimeout(() => {\n commit(pendingRef.current);\n }, throttleMs - elapsed);\n return () => clearTimeout(id);\n }, [text, isComplete, enabled, throttleMs]);\n\n return enabled ? committed : text;\n}\n","'use client';\n\nimport { useAuiState } from '@assistant-ui/react';\nimport { useCallback, useRef, useState } from 'react';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport type { ThreadGroupPart } from './ToolGroupContainer.js';\n\nexport function ReasoningContainer({ group }: { group: ThreadGroupPart }) {\n const ReasoningCard = useSlot('ReasoningCard');\n\n const content = useAuiState(s =>\n group.indices\n .map(i => s.message.parts[i])\n .filter((p): p is NonNullable<typeof p> => p != null && p.type === 'reasoning')\n .map(p => (p as { text?: string }).text ?? '')\n .join(''),\n );\n\n const streaming = useAuiState(s => {\n if (s.message.status?.type !== 'running') return false;\n const lastIndex = s.message.parts.length - 1;\n if (lastIndex < 0) return false;\n if (s.message.parts[lastIndex]?.type !== 'reasoning') return false;\n const lastGroupIndex = group.indices[group.indices.length - 1];\n return lastGroupIndex !== undefined && lastIndex >= group.indices[0]! && lastIndex <= lastGroupIndex;\n });\n\n const [expanded, setExpanded] = useState(streaming);\n const [prevStreaming, setPrevStreaming] = useState(streaming);\n const [isMultiLine, setIsMultiLine] = useState(false);\n const observerRef = useRef<ResizeObserver | null>(null);\n if (streaming !== prevStreaming) {\n setPrevStreaming(streaming);\n if (streaming) setExpanded(true);\n }\n\n const contentRef = useCallback(\n (node: HTMLDivElement | null) => {\n observerRef.current?.disconnect();\n observerRef.current = null;\n if (node == null || streaming) return;\n\n const check = () => {\n const lineHeight = Number.parseFloat(getComputedStyle(node).lineHeight) || 24;\n setIsMultiLine(node.scrollHeight > lineHeight * 1.5);\n };\n\n check();\n observerRef.current = new ResizeObserver(check);\n observerRef.current.observe(node);\n },\n [streaming],\n );\n const reasoningTimeText = null;\n const previewText = content.replace(/\\s+/g, ' ').trim();\n const isShortText = !streaming && content.length > 0 && !isMultiLine;\n const headingText = 'Reasoning';\n\n return (\n <ReasoningCard\n content={content}\n isStreaming={streaming}\n expanded={expanded}\n isMultiLine={isMultiLine}\n reasoningTimeText={reasoningTimeText}\n previewText={previewText}\n headingText={headingText}\n contentRef={isShortText ? contentRef : undefined}\n onToggle={() => setExpanded(prev => !prev)}\n />\n );\n}\n","'use client';\n\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { ApprovalOption } from '../atoms/ToolApprovalBar.js';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nexport type ToolApprovalOption = {\n id: string;\n label: string;\n isAllow: boolean;\n grants?: readonly string[];\n confirm?: {\n title?: string;\n description?: string;\n };\n};\n\ntype ToolApprovalContainerProps = {\n toolName?: string;\n options: ToolApprovalOption[];\n onSelectOption: (optionId: string, reason?: string) => void;\n};\n\nexport function ToolApprovalContainer({ toolName = '', options, onSelectOption }: ToolApprovalContainerProps) {\n const ToolApprovalBar = useSlot('ToolApprovalBar');\n const [selectedDenyOptionId, setSelectedDenyOptionId] = useState<string | null>(null);\n const [denialReason, setDenialReason] = useState('');\n const [showReasonError, setShowReasonError] = useState(false);\n const approveOptions = useMemo<ApprovalOption[]>(\n () =>\n options\n .filter(option => option.isAllow)\n .map((option, index) => ({\n ...option,\n variant: index === 0 ? 'primary' : 'secondary',\n requiresReason: false,\n })),\n [options],\n );\n const denyOptions = useMemo<ApprovalOption[]>(\n () =>\n options\n .filter(option => !option.isAllow)\n .map(option => ({\n ...option,\n variant: 'secondary',\n requiresReason: option.confirm != null,\n })),\n [options],\n );\n const selectedDenyOption = denyOptions.find(option => option.id === selectedDenyOptionId);\n\n const onDenyOptionChange = useCallback((optionId: string | null) => {\n setSelectedDenyOptionId(optionId);\n setDenialReason('');\n setShowReasonError(false);\n }, []);\n const onDenialReasonChange = useCallback((reason: string) => {\n setDenialReason(reason);\n setShowReasonError(false);\n }, []);\n const onReasonSubmit = useCallback(() => {\n const reason = denialReason.trim();\n if (!reason) {\n setShowReasonError(true);\n return;\n }\n if (selectedDenyOptionId) {\n onSelectOption(selectedDenyOptionId, reason);\n onDenyOptionChange(null);\n }\n }, [denialReason, onDenyOptionChange, onSelectOption, selectedDenyOptionId]);\n\n return (\n <ToolApprovalBar\n toolName={toolName}\n approveOptions={approveOptions.length > 0 ? approveOptions : undefined}\n denyOptions={denyOptions.length > 0 ? denyOptions : undefined}\n selectedDenyOption={selectedDenyOption}\n denialReason={denialReason}\n showReasonError={showReasonError}\n onSelect={onSelectOption}\n onDenyOptionChange={onDenyOptionChange}\n onDenialReasonChange={onDenialReasonChange}\n onReasonSubmit={onReasonSubmit}\n />\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { ToolCallContentBlockProps } from '../atoms/ToolCallContentBlock.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nexport function ToolCallContentBlockContainer(props: ToolCallContentBlockProps) {\n const ToolCallContentBlock = useSlot('ToolCallContentBlock');\n const { isJson, onContentHeightChange: notifyContentHeightChange, resizable } = props;\n const [fullscreen, setFullscreen] = useState(false);\n const [contentHeightRem, setContentHeightRem] = useState<number>();\n const observerRef = useRef<ResizeObserver | null>(null);\n const contentNodeRef = useRef<HTMLDivElement | null>(null);\n const hasMeasuredRef = useRef(false);\n\n const contentRef = useCallback(\n (node: HTMLDivElement | null) => {\n observerRef.current?.disconnect();\n observerRef.current = null;\n contentNodeRef.current = node;\n hasMeasuredRef.current = false;\n if (node == null) return;\n\n setContentHeightRem(undefined);\n if (!resizable) return;\n\n const updateHeight = () => {\n if (!hasMeasuredRef.current && isJson !== false) return;\n const renderedHeight = node.getBoundingClientRect().height;\n const height = hasMeasuredRef.current && renderedHeight > 0 ? renderedHeight : node.scrollHeight;\n hasMeasuredRef.current = true;\n setContentHeightRem(height / 16);\n };\n updateHeight();\n observerRef.current = new ResizeObserver(updateHeight);\n observerRef.current.observe(node);\n },\n [isJson, resizable],\n );\n\n const onContentHeightChange = useCallback(\n (height: number) => {\n const node = contentNodeRef.current;\n if (node == null) return;\n const renderedHeight = node.getBoundingClientRect().height;\n hasMeasuredRef.current = true;\n setContentHeightRem((renderedHeight > 0 ? renderedHeight : Math.max(height, node.scrollHeight)) / 16);\n notifyContentHeightChange?.(height);\n },\n [notifyContentHeightChange],\n );\n\n useEffect(\n () => () => {\n observerRef.current?.disconnect();\n },\n [],\n );\n\n return (\n <ToolCallContentBlock\n {...props}\n fullscreen={fullscreen}\n onFullscreenChange={setFullscreen}\n contentHeightRem={contentHeightRem}\n contentRef={contentRef}\n onContentHeightChange={onContentHeightChange}\n />\n );\n}\n","'use client';\n\nimport {\n MessagePartPrimitive,\n MessagePrimitive,\n useToolCallElapsed,\n type ToolApprovalResponse,\n type ToolCallMessagePartComponent,\n type ToolCallMessagePartProps,\n} from '@assistant-ui/react';\nimport { useTrueFoundryRespondToToolApproval } from '@truefoundry/assistant-ui-runtime';\nimport { useState } from 'react';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport {\n ASK_USER_TOOL_NAME,\n MCP_META_TOOLS,\n SANDBOX_TOOL_NAMES,\n SUB_AGENT_TOOL_NAME,\n buildApprovalOptions,\n formatDuration,\n getAskUserAnswerResult,\n getJsonDisplayValue,\n getToolResultContent,\n hasPendingAskUserResponse,\n hasPendingToolApproval,\n mcpDisplayName,\n parseAskUserQuestionArgs,\n parseMcpToolArgs,\n parseSandboxArgs,\n parseSandboxResult,\n resolveSubAgentMeta,\n toStatus,\n} from '../utils/toolCallParsing.js';\nimport { AssistantTextContainer } from './AssistantTextContainer.js';\nimport { NestedApprovalBridgeContext, useNestedApprovalBridge } from './nestedApprovalBridge.js';\nimport { SandboxToolCallContainer } from './SandboxToolCallContainer.js';\nimport { ToolApprovalContainer } from './ToolApprovalContainer.js';\nimport { ToolCallContentBlockContainer } from './ToolCallContentBlockContainer.js';\n\nfunction NestedSubAgentAssistantMessage() {\n const AssistantMessageBubble = useSlot('AssistantMessageBubble');\n\n return (\n <div className=\"mb-3 min-w-0\">\n <MessagePrimitive.Root data-role=\"assistant\">\n <AssistantMessageBubble>\n <MessagePrimitive.Parts\n components={{\n Text: AssistantTextContainer,\n Reasoning: AssistantTextContainer,\n tools: { Fallback: ToolCallContainer },\n }}\n />\n </AssistantMessageBubble>\n </MessagePrimitive.Root>\n </div>\n );\n}\n\nfunction ToolApprovalSlot({ part }: { part: ToolCallMessagePartProps }) {\n const isNestedReadonly = useNestedApprovalBridge();\n const respondToNestedApproval = useTrueFoundryRespondToToolApproval();\n\n const respond = (response: ToolApprovalResponse) => {\n if (!isNestedReadonly) {\n part.respondToApproval(response);\n return;\n }\n // Readonly nested thread: use this part's approval id, not the outer\n // create_sub_agent tool (which usually has no approval of its own).\n if (part.approval == null) return;\n\n let approved: boolean | undefined;\n let optionId: string | undefined;\n if ('approved' in response) {\n approved = response.approved;\n } else if ('optionId' in response) {\n const option = buildApprovalOptions(part.approval.options).find(o => o.id === response.optionId);\n if (option == null) return;\n approved = option.isAllow;\n optionId = response.optionId;\n }\n if (approved === undefined) return;\n\n respondToNestedApproval({\n approvalId: part.approval.id,\n approved,\n ...(optionId != null && optionId !== '__allow' && optionId !== '__deny' ? { optionId } : {}),\n ...('reason' in response && response.reason != null ? { reason: response.reason } : {}),\n });\n };\n\n const onSelectOption = (optionId: string, reason?: string) => {\n if (optionId === '__allow') return respond({ approved: true });\n if (optionId === '__deny') return respond({ approved: false, reason });\n return respond({ optionId, reason });\n };\n\n return (\n <ToolApprovalContainer\n toolName={part.toolName}\n options={\n buildApprovalOptions(part.approval?.options) as import('./ToolApprovalContainer.js').ToolApprovalOption[]\n }\n onSelectOption={onSelectOption}\n />\n );\n}\n\nfunction RequestResponseSlots({\n request,\n response,\n}: {\n request: { value: string; isJson: boolean };\n response: { data: string; isJson: boolean };\n}) {\n return {\n requestSlot: request.value ? (\n <ToolCallContentBlockContainer\n title=\"Request\"\n content={request.value}\n isJson={request.isJson}\n maxHeight=\"10.5rem\"\n />\n ) : response.data ? (\n <ToolCallContentBlockContainer title=\"Request\" content=\"{}\" isJson maxHeight=\"10.5rem\" />\n ) : undefined,\n responseSlot: response.data ? (\n <ToolCallContentBlockContainer title=\"Response\" content={response.data} isJson={response.isJson} resizable />\n ) : undefined,\n };\n}\n\nexport const ToolCallContainer: ToolCallMessagePartComponent = part => {\n const ToolCallCard = useSlot('ToolCallCard');\n const SubAgentCard = useSlot('SubAgentCard');\n const AskUserPrompt = useSlot('AskUserPrompt');\n const elapsedMs = useToolCallElapsed();\n const isRequiresAction = part.status?.type === 'requires-action';\n const isSubAgent = part.toolName === SUB_AGENT_TOOL_NAME;\n const isSandbox = SANDBOX_TOOL_NAMES.has(part.toolName);\n const [expanded, setExpanded] = useState(isRequiresAction);\n const [prevRequiresAction, setPrevRequiresAction] = useState(isRequiresAction);\n if (isRequiresAction !== prevRequiresAction) {\n setPrevRequiresAction(isRequiresAction);\n if (isRequiresAction) setExpanded(true);\n }\n\n const showApproval = isRequiresAction && hasPendingToolApproval(part.approval);\n\n const durationText = elapsedMs === undefined ? undefined : formatDuration(elapsedMs);\n const status = toStatus(part.status?.type);\n const onToggle = () => setExpanded(prev => !prev);\n\n if (part.toolName === ASK_USER_TOOL_NAME) {\n if (hasPendingAskUserResponse(part)) {\n return null;\n }\n const answer = getAskUserAnswerResult(part.result);\n if (answer == null) {\n return null;\n }\n const { question, options = [] } = parseAskUserQuestionArgs(part.argsText);\n const isCustom = options.length > 0 && !options.includes(answer);\n return (\n <AskUserPrompt\n questions={[]}\n answeredQuestions={[\n {\n id: part.toolCallId,\n question: question ?? 'Question',\n options,\n answer,\n isCustom,\n },\n ]}\n onSubmit={() => {}}\n readOnly\n />\n );\n }\n\n if (isSubAgent) {\n const { agentName, instruction, stepCount } = resolveSubAgentMeta(part);\n\n return (\n <div data-slot=\"tool-call-card\" data-variant=\"sub-agent\" className=\"w-full\">\n <SubAgentCard\n status={status}\n expanded={expanded}\n onToggle={onToggle}\n durationText={durationText}\n agentName={agentName}\n instruction={instruction}\n stepCount={stepCount}\n >\n <NestedApprovalBridgeContext.Provider value={true}>\n <MessagePartPrimitive.Messages\n components={{\n AssistantMessage: NestedSubAgentAssistantMessage,\n UserMessage: () => null,\n }}\n />\n </NestedApprovalBridgeContext.Provider>\n </SubAgentCard>\n </div>\n );\n }\n\n const resultString =\n part.result === undefined\n ? undefined\n : typeof part.result === 'string'\n ? part.result\n : JSON.stringify(part.result, null, 2);\n\n if (isSandbox) {\n const { command, intent, argsJson } = parseSandboxArgs(part.argsText);\n const { exitCode, resultText, resultJson } = parseSandboxResult(resultString);\n return (\n <SandboxToolCallContainer\n name={part.toolName}\n intent={intent}\n status={status}\n expanded={expanded}\n onToggle={onToggle}\n durationText={durationText}\n command={command}\n exitCode={exitCode}\n argsJson={argsJson}\n resultText={resultText}\n resultJson={resultJson}\n />\n );\n }\n\n if (MCP_META_TOOLS.has(part.toolName)) {\n const { mcpServer, innerToolName, input } = parseMcpToolArgs(part.argsText);\n const argsDisplay = getJsonDisplayValue(part.argsText);\n const resultDisplay = getToolResultContent(part.result);\n\n if (part.toolName === 'list_tools' && mcpServer) {\n const slots = RequestResponseSlots({\n request: argsDisplay,\n response: resultDisplay,\n });\n return (\n <ToolCallCard\n toolName={`Listing tools · ${mcpServer}`}\n icon=\"mcp-server\"\n expanded={expanded}\n onToggle={onToggle}\n awaiting={status === 'running'}\n awaitingText={durationText ?? 'Awaiting Response…'}\n showResponseLine={status !== 'running' && !!resultDisplay.data}\n mcpServerName={mcpServer}\n {...slots}\n />\n );\n }\n\n const inputDisplay = input !== undefined ? getJsonDisplayValue(JSON.stringify(input, null, 2)) : argsDisplay;\n const slots = RequestResponseSlots({\n request: inputDisplay,\n response: resultDisplay,\n });\n\n return (\n <ToolCallCard\n toolName={mcpDisplayName(part.toolName, mcpServer, innerToolName)}\n icon=\"mcp-server\"\n expanded={expanded}\n onToggle={onToggle}\n awaiting={status === 'running'}\n awaitingText={durationText ?? 'Awaiting Response…'}\n showResponseLine={status !== 'running' && resultDisplay.data !== undefined}\n mcpServerName={mcpServer}\n {...slots}\n approvalSlot={showApproval ? <ToolApprovalSlot part={part} /> : undefined}\n />\n );\n }\n\n const argsDisplay = getJsonDisplayValue(part.argsText);\n const resultDisplay = getToolResultContent(part.result);\n const slots = RequestResponseSlots({\n request: argsDisplay,\n response: resultDisplay,\n });\n\n return (\n <ToolCallCard\n toolName={part.toolName}\n expanded={expanded}\n onToggle={onToggle}\n awaiting={status === 'running'}\n awaitingText={durationText ?? 'Awaiting Response…'}\n showResponseLine={status !== 'running' && resultDisplay.data !== undefined}\n {...slots}\n approvalSlot={showApproval ? <ToolApprovalSlot part={part} /> : undefined}\n />\n );\n};\n","import type { ToolApprovalOption as AuiToolApprovalOption, ToolCallMessagePartProps } from '@assistant-ui/react';\nimport { parse as parsePartialJson } from 'partial-json';\n\nimport type { ToolCallStatus } from '../atoms/ToolCallCard.js';\n\nexport type ApprovalOptionView = {\n id: string;\n label: string;\n isAllow: boolean;\n grants?: unknown;\n confirm?: Record<string, unknown>;\n};\n\nexport const SUB_AGENT_TOOL_NAME = 'create_sub_agent';\nexport const ASK_USER_TOOL_NAME = 'ask_user_question';\n\n/** Tool names that should be rendered as a sandbox execution card. */\nexport const SANDBOX_TOOL_NAMES = new Set(['exec', 'sandbox_exec']);\n\n/** MCP meta-tools that wrap actual tool calls. */\nexport const MCP_META_TOOLS = new Set(['call_tool', 'list_tools', 'get_tool_info']);\n\nconst APPROVAL_OPTION_DEFAULT_LABELS: Record<string, string> = {\n 'allow-once': 'Allow',\n 'allow-always': 'Always allow',\n 'reject-once': 'Deny',\n 'reject-always': 'Always deny',\n};\n\nconst isAllowKind = (kind: string) => kind === 'allow-once' || kind === 'allow-always';\n\ntype JsonParseResult = { success: true; value: unknown; isPartial: boolean } | { success: false };\n\nfunction parseJsonIncrementally(content: string): JsonParseResult {\n try {\n return { success: true, value: JSON.parse(content), isPartial: false };\n } catch {\n const trimmed = content.trim();\n if (trimmed[0] !== '{' && trimmed[0] !== '[') return { success: false };\n\n try {\n return { success: true, value: parsePartialJson(content), isPartial: true };\n } catch {\n return { success: false };\n }\n }\n}\n\nfunction isUnknownRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function parseAskUserQuestionArgs(argsText: string | undefined): {\n question?: string;\n options?: string[];\n} {\n if (!argsText) return {};\n try {\n const parsed: unknown = JSON.parse(argsText);\n if (parsed == null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return {};\n }\n const record = parsed as Record<string, unknown>;\n const question = typeof record.question === 'string' ? record.question : undefined;\n const options = Array.isArray(record.options)\n ? record.options.filter((item): item is string => typeof item === 'string')\n : undefined;\n return { question, options };\n } catch {\n return {};\n }\n}\n\nexport function getAskUserAnswerResult(result: unknown): string | undefined {\n if (result === undefined || result === null) return undefined;\n if (typeof result === 'string') {\n const trimmed = result.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n if (typeof result === 'object' && 'content' in result) {\n const content = (result as { content?: unknown }).content;\n if (typeof content === 'string' && content.trim()) {\n return content.trim();\n }\n }\n return undefined;\n}\n\nexport function hasPendingAskUserResponse(part: Pick<ToolCallMessagePartProps, 'interrupt' | 'result'>): boolean {\n return part.interrupt != null && part.result === undefined;\n}\n\nexport function hasPendingToolApproval(\n approval: { approved?: boolean; resolution?: 'cancelled' | 'expired' } | undefined,\n) {\n return approval != null && approval.approved === undefined && approval.resolution === undefined;\n}\n\nexport function buildApprovalOptions(options: readonly AuiToolApprovalOption[] | undefined): ApprovalOptionView[] {\n const declared = options?.filter(o => Object.hasOwn(APPROVAL_OPTION_DEFAULT_LABELS, o.kind));\n if (declared && declared.length > 0) {\n const allow = declared.filter(o => isAllowKind(o.kind));\n const reject = declared.filter(o => !isAllowKind(o.kind));\n const mapped: ApprovalOptionView[] = [...allow, ...reject].map(o => ({\n id: o.id,\n label: o.label ?? APPROVAL_OPTION_DEFAULT_LABELS[o.kind] ?? o.id,\n isAllow: isAllowKind(o.kind),\n grants: o.grants,\n confirm: o.confirm != null ? (typeof o.confirm === 'object' ? o.confirm : {}) : undefined,\n }));\n if (reject.length === 0) {\n mapped.push({ id: '__deny', label: 'Deny', isAllow: false, confirm: {} });\n }\n return mapped;\n }\n return [\n { id: '__allow', label: 'Allow', isAllow: true },\n { id: '__deny', label: 'Deny', isAllow: false, confirm: {} },\n ];\n}\n\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return '<1s';\n const seconds = ms / 1000;\n if (seconds < 10) return `${(Math.floor(seconds * 10) / 10).toFixed(1)}s`;\n if (seconds < 60) return `${Math.floor(seconds)}s`;\n return `${Math.floor(seconds / 60)}m ${Math.floor(seconds % 60)}s`;\n}\n\nexport function toStatus(statusType: string | undefined): ToolCallStatus {\n if (statusType === 'complete') return 'success';\n if (statusType === 'incomplete') return 'error';\n return 'running';\n}\n\nexport function parseSandboxArgs(argsText: string | undefined): {\n command?: string;\n intent?: string;\n argsJson?: string;\n} {\n if (!argsText) return {};\n const parsed = parseJsonIncrementally(argsText);\n if (!parsed.success || !isUnknownRecord(parsed.value)) return { argsJson: argsText };\n\n return {\n command: typeof parsed.value.command === 'string' ? parsed.value.command : undefined,\n intent: typeof parsed.value.intent === 'string' ? parsed.value.intent : undefined,\n argsJson: parsed.isPartial ? argsText : JSON.stringify(parsed.value, null, 2),\n };\n}\n\nexport function parseSandboxResult(result: string | undefined): {\n exitCode?: number | null;\n resultText?: string;\n resultJson?: string;\n} {\n if (result === undefined) return {};\n const parsed = parseJsonIncrementally(result);\n if (!parsed.success || !isUnknownRecord(parsed.value)) return { resultText: result };\n\n const response = isUnknownRecord(parsed.value.response) ? parsed.value.response : undefined;\n const exitCode = typeof response?.exitCode === 'number' ? response.exitCode : null;\n const resultText = typeof response?.result === 'string' ? response.result : undefined;\n return {\n exitCode,\n resultText,\n resultJson: parsed.isPartial ? result : JSON.stringify(parsed.value, null, 2),\n };\n}\n\nexport function parseMcpToolArgs(argsText: string | undefined): {\n mcpServer?: string;\n innerToolName?: string;\n input?: unknown;\n} {\n if (!argsText) return {};\n try {\n const parsed = JSON.parse(argsText) as {\n mcp_server?: string;\n tool_name?: string;\n input?: unknown;\n };\n return {\n mcpServer: parsed.mcp_server,\n innerToolName: parsed.tool_name,\n input: parsed.input,\n };\n } catch {\n return {};\n }\n}\n\nexport function getJsonDisplayValue(content: string | undefined): {\n value: string;\n isJson: boolean;\n} {\n if (!content?.trim()) return { value: '', isJson: false };\n const trimmed = content.trim();\n if (trimmed[0] !== '{' && trimmed[0] !== '[') {\n return { value: content, isJson: false };\n }\n try {\n const parsed: unknown = JSON.parse(content);\n return { value: JSON.stringify(parsed, null, 2), isJson: true };\n } catch {\n return { value: content, isJson: false };\n }\n}\n\nexport function getToolResultContent(content: unknown): {\n data: string;\n isJson: boolean;\n} {\n try {\n if (!content) return { isJson: false, data: '' };\n\n const parsedResult = typeof content === 'string' && content.trim().startsWith('{') ? JSON.parse(content) : content;\n\n if (\n typeof parsedResult === 'object' &&\n parsedResult != null &&\n Array.isArray((parsedResult as { content?: unknown }).content)\n ) {\n const text = (parsedResult as { content: Array<{ text?: unknown }> }).content[0]?.text || '';\n const display = getJsonDisplayValue(typeof text === 'string' ? text : JSON.stringify(text));\n return { data: display.value, isJson: display.isJson };\n }\n const display = getJsonDisplayValue(typeof parsedResult === 'string' ? parsedResult : JSON.stringify(parsedResult));\n return { data: display.value, isJson: display.isJson };\n } catch {\n return { data: String(content), isJson: false };\n }\n}\n\nexport function resolveSubAgentMeta(part: ToolCallMessagePartProps): {\n agentName: string;\n instruction: string;\n stepCount: number;\n} {\n const artifactSubAgent = (\n part as {\n artifact?: {\n subAgents?: Array<{\n title?: string;\n agentInfo?: { name?: string; input?: string };\n }>;\n };\n }\n ).artifact?.subAgents?.[0];\n const firstNested = part.messages?.[0];\n const subAgent = (\n firstNested?.metadata?.custom as { subAgent?: { title?: string; name?: string; input?: string } } | undefined\n )?.subAgent;\n return {\n agentName:\n subAgent?.title ??\n subAgent?.name ??\n artifactSubAgent?.title ??\n artifactSubAgent?.agentInfo?.name ??\n part.toolName,\n instruction: subAgent?.input ?? artifactSubAgent?.agentInfo?.input ?? '',\n stepCount: part.messages?.length ?? 0,\n };\n}\n\nexport function mcpDisplayName(\n toolName: string,\n mcpServer: string | undefined,\n innerToolName: string | undefined,\n): string {\n if (toolName === 'call_tool' && innerToolName) {\n return mcpServer ? `call_tool: ${innerToolName} (${mcpServer})` : `call_tool: ${innerToolName}`;\n }\n if (toolName === 'get_tool_info' && innerToolName && mcpServer) {\n return `get_tool_info: ${innerToolName} (${mcpServer})`;\n }\n return toolName;\n}\n","'use client';\n\nimport { createContext, useContext } from 'react';\n\n/**\n * Sub-agent tool calls render inside a read-only nested thread\n * (`MessagePartPrimitive.Messages`), so `part.respondToApproval` throws.\n * When this flag is set, `ToolApprovalSlot` routes Allow/Deny through\n * `useTrueFoundryRespondToToolApproval()` using the *nested* tool's\n * approval id (not the outer `create_sub_agent` part).\n */\nexport const NestedApprovalBridgeContext = createContext(false);\n\nexport function useNestedApprovalBridge(): boolean {\n return useContext(NestedApprovalBridgeContext);\n}\n","'use client';\n\nimport { useMemo, useState } from 'react';\n\nimport type { SandboxToolCallCardProps } from '../atoms/SandboxToolCallCard.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nexport function SandboxToolCallContainer(\n props: Omit<SandboxToolCallCardProps, 'viewMode' | 'hasContent' | 'onViewModeChange'>,\n) {\n const SandboxToolCallCard = useSlot('SandboxToolCallCard');\n const [viewMode, setViewMode] = useState<'terminal' | 'code'>('terminal');\n const hasContent = useMemo(() => {\n if (viewMode === 'code') return Boolean(props.argsJson || props.resultJson);\n return Boolean(props.command || props.resultText || props.resultJson);\n }, [props.argsJson, props.command, props.resultJson, props.resultText, viewMode]);\n\n return <SandboxToolCallCard {...props} viewMode={viewMode} hasContent={hasContent} onViewModeChange={setViewMode} />;\n}\n","'use client';\n\nimport { useActionBarCopy, useMessageError, useThreadIsRunning, type PartState } from '@assistant-ui/core/react';\nimport { MessagePrimitive, useAuiState, type EnrichedPartState, type GroupByContext } from '@assistant-ui/react';\nimport { useTrueFoundryResumeUnavailable } from '@truefoundry/assistant-ui-runtime';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport { computeAgentStepsSplit } from '../utils/computeAgentStepsSplit.js';\nimport { AgentStepsContainer } from './AgentStepsContainer.js';\nimport { AssistantTextContainer } from './AssistantTextContainer.js';\nimport { MessageImageContainer } from './MessageImageContainer.js';\nimport { ReasoningContainer } from './ReasoningContainer.js';\nimport { ToolCallContainer } from './ToolCallContainer.js';\nimport type { ThreadGroupPart } from './ToolGroupContainer.js';\n\n/**\n * Dispatches a leaf message part to its renderer. \"data\" parts (generative\n * UI) are out of scope for this SDK entirely.\n */\nfunction AssistantLeafPartContainer({ part }: { part: EnrichedPartState }) {\n switch (part.type) {\n case 'text':\n case 'reasoning':\n return <AssistantTextContainer />;\n case 'image':\n return <MessageImageContainer />;\n case 'tool-call':\n return <ToolCallContainer {...part} />;\n default:\n return null;\n }\n}\n\nexport function AssistantMessageContainer() {\n const AssistantMessageBubble = useSlot('AssistantMessageBubble');\n const MessageActionBar = useSlot('MessageActionBar');\n const MessageErrorBanner = useSlot('MessageErrorBanner');\n const MessageIndicator = useSlot('MessageIndicator');\n const isThreadRunning = useThreadIsRunning();\n const resumeUnavailable = useTrueFoundryResumeUnavailable();\n const error = useMessageError();\n const createdAt = useAuiState(s => s.message.createdAt);\n const isMessageRunning = useAuiState(s => s.message.status?.type === 'running');\n const { copy, isCopied } = useActionBarCopy({\n copyToClipboard: text => navigator.clipboard.writeText(text),\n });\n\n const parts = useAuiState(s => s.message.parts);\n\n const { cutIndex, hasFinal, toolCount, thinkingCount } = computeAgentStepsSplit(parts, isMessageRunning);\n\n const groupBy = (part: PartState, _context: GroupByContext): readonly `group-${string}`[] | null => {\n const index = parts.findIndex(p => p === part);\n if (index === -1) return null;\n\n if (part.type === 'text' && index >= cutIndex) {\n return null;\n }\n\n if (index < cutIndex) {\n if (part.type === 'reasoning') {\n return ['group-agentSteps', 'group-reasoning'];\n }\n return ['group-agentSteps'];\n }\n\n return null;\n };\n\n return (\n <MessagePrimitive.Root data-role=\"assistant\">\n <AssistantMessageBubble\n error={error !== undefined ? <MessageErrorBanner message={String(error)} /> : undefined}\n actionBar={\n !isThreadRunning ? <MessageActionBar isCopied={isCopied} onCopy={copy} createdAt={createdAt} /> : undefined\n }\n >\n <MessagePrimitive.GroupedParts groupBy={groupBy}>\n {({ part, children }) => {\n switch (part.type) {\n case 'group-agentSteps':\n return (\n <AgentStepsContainer toolCount={toolCount} thinkingCount={thinkingCount} hasFinal={hasFinal}>\n {children}\n </AgentStepsContainer>\n );\n case 'group-reasoning':\n return <ReasoningContainer group={part as ThreadGroupPart} />;\n case 'text': {\n const index = parts.findIndex(p => p === part);\n // Intermediate text inside Agent steps: muted + indented vs final answer\n if (index >= 0 && index < cutIndex) {\n return (\n <div className=\"mb-2 ml-[1.75rem] text-xs text-text-secondary [&_.markdown-body]:text-inherit\">\n <AssistantTextContainer />\n </div>\n );\n }\n return <AssistantTextContainer />;\n }\n case 'reasoning':\n case 'tool-call':\n case 'image':\n case 'data':\n return <AssistantLeafPartContainer part={part} />;\n case 'indicator':\n return resumeUnavailable ? null : <MessageIndicator />;\n default:\n return null;\n }\n }}\n </MessagePrimitive.GroupedParts>\n </AssistantMessageBubble>\n </MessagePrimitive.Root>\n );\n}\n","'use client';\n\nimport { useAuiState } from '@assistant-ui/react';\n\nimport { USER_MESSAGE_ATTACHMENT_PREVIEW_REM } from '../constants/attachments.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nexport function MessageImageContainer() {\n const AttachmentCard = useSlot('AttachmentCard');\n const AttachmentPreviewDialog = useSlot('AttachmentPreviewDialog');\n const image = useAuiState(s => (s.part.type === 'image' ? s.part.image : ''));\n const filename = useAuiState(s => (s.part.type === 'image' ? s.part.filename : undefined));\n\n if (!image) {\n return null;\n }\n\n const card = (\n <AttachmentCard\n name={filename ?? 'image'}\n previewSrc={image}\n isImage\n size=\"preview\"\n previewRem={USER_MESSAGE_ATTACHMENT_PREVIEW_REM}\n />\n );\n\n return (\n <AttachmentPreviewDialog previewSrc={image}>\n <div className=\"aui-message-image\">{card}</div>\n </AttachmentPreviewDialog>\n );\n}\n","'use client';\n\nimport { ComposerPrimitive, MessagePrimitive, useAui, useAuiState } from '@assistant-ui/react';\n\nimport { USER_MESSAGE_ATTACHMENT_PREVIEW_REM } from '../constants/attachments.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport { isImageAttachment, useAttachmentPreviewSrc } from './useAttachmentPreviewSrc.js';\n\nfunction ComposerAttachmentItem() {\n const AttachmentPreviewDialog = useSlot('AttachmentPreviewDialog');\n const AttachmentCard = useSlot('AttachmentCard');\n const aui = useAui();\n const name = useAuiState(s => s.attachment.name);\n const contentType = useAuiState(s => s.attachment.contentType);\n const type = useAuiState(s => s.attachment.type);\n const isImage = isImageAttachment(type, contentType);\n const previewSrc = useAttachmentPreviewSrc();\n\n return (\n <AttachmentPreviewDialog previewSrc={previewSrc}>\n <AttachmentCard\n name={name}\n contentType={contentType}\n previewSrc={previewSrc}\n isImage={isImage}\n size=\"chip\"\n onRemove={() => void aui.attachment().remove()}\n />\n </AttachmentPreviewDialog>\n );\n}\n\nfunction MessageAttachmentItem() {\n const AttachmentPreviewDialog = useSlot('AttachmentPreviewDialog');\n const AttachmentCard = useSlot('AttachmentCard');\n const name = useAuiState(s => s.attachment.name);\n const contentType = useAuiState(s => s.attachment.contentType);\n const type = useAuiState(s => s.attachment.type);\n const isImage = isImageAttachment(type, contentType);\n const previewSrc = useAttachmentPreviewSrc();\n\n const card = (\n <AttachmentCard\n name={name}\n contentType={contentType}\n previewSrc={previewSrc}\n isImage={isImage}\n size={isImage ? 'preview' : 'chip'}\n previewRem={USER_MESSAGE_ATTACHMENT_PREVIEW_REM}\n />\n );\n\n if (isImage && previewSrc) {\n return <AttachmentPreviewDialog previewSrc={previewSrc}>{card}</AttachmentPreviewDialog>;\n }\n\n return card;\n}\n\nexport function ComposerAttachmentsContainer() {\n return (\n <div className=\"aui-composer-attachments flex w-full flex-row flex-wrap items-center gap-2 empty:hidden\">\n <ComposerPrimitive.Attachments>{() => <ComposerAttachmentItem />}</ComposerPrimitive.Attachments>\n </div>\n );\n}\n\nexport function MessageAttachmentsContainer() {\n return (\n <div className=\"aui-user-message-attachments-end col-span-full col-start-1 row-start-1 flex w-full flex-row justify-end gap-2\">\n <MessagePrimitive.Attachments>{() => <MessageAttachmentItem />}</MessagePrimitive.Attachments>\n </div>\n );\n}\n\nexport function ComposerAttachmentPickerContainer() {\n const AttachmentPickerButton = useSlot('AttachmentPickerButton');\n return (\n <ComposerPrimitive.AddAttachment asChild>\n <AttachmentPickerButton />\n </ComposerPrimitive.AddAttachment>\n );\n}\n","'use client';\n\nimport { useAuiState } from '@assistant-ui/react';\nimport { useEffect, useState } from 'react';\n\nexport function isImageAttachment(type: string, contentType?: string): boolean {\n return type === 'image' || (contentType?.startsWith('image/') ?? false);\n}\n\nfunction useFileObjectUrl(file: File | undefined): string | undefined {\n const [src, setSrc] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n if (!file) {\n setSrc(undefined);\n return;\n }\n const objectUrl = URL.createObjectURL(file);\n setSrc(objectUrl);\n return () => URL.revokeObjectURL(objectUrl);\n }, [file]);\n\n return src;\n}\n\n/** Preview URL for staged composer files (object URL) or sent message attachments (data URI). */\nexport function useAttachmentPreviewSrc(): string | undefined {\n const type = useAuiState(s => s.attachment.type);\n const contentType = useAuiState(s => s.attachment.contentType);\n const file = useAuiState(s => ('file' in s.attachment ? s.attachment.file : undefined));\n const contentSrc = useAuiState(s => {\n if (!isImageAttachment(s.attachment.type, s.attachment.contentType)) return undefined;\n const imagePart = s.attachment.content?.find(part => part.type === 'image');\n if (imagePart?.type === 'image' && imagePart.image) return imagePart.image;\n return undefined;\n });\n\n const image = isImageAttachment(type, contentType);\n const fileSrc = useFileObjectUrl(image ? file : undefined);\n if (!image) return undefined;\n return fileSrc ?? contentSrc;\n}\n","'use client';\n\nimport { useAuiState } from '@assistant-ui/react';\nimport { useTrueFoundryToolResponses } from '@truefoundry/assistant-ui-runtime';\n\nexport type ThreadPauseState = {\n thread: {\n messages: readonly {\n role: string;\n status?: { type: string };\n metadata?: { custom?: unknown };\n }[];\n };\n};\n\n/** Returns true when the latest assistant message is paused for MCP authorization. */\nexport function threadHasPendingMcpAuth(s: ThreadPauseState): boolean {\n const messages = s.thread.messages;\n const last = messages[messages.length - 1];\n if (last?.role !== 'assistant') return false;\n if (last.status?.type !== 'requires-action') return false;\n return (last.metadata?.custom as { pendingMcpAuth?: boolean } | undefined)?.pendingMcpAuth === true;\n}\n\nexport type ComposerPauseView = { kind: 'mcp' } | { kind: 'ask-user' } | { kind: 'compose' };\n\n/** Shared composer pause detection for default and custom composer containers. */\nexport function useComposerPauseView(): ComposerPauseView {\n const mcpPending = useAuiState(threadHasPendingMcpAuth);\n const { pending: toolResponsesPending } = useTrueFoundryToolResponses();\n\n if (mcpPending) {\n return { kind: 'mcp' };\n }\n if (toolResponsesPending.length > 0) {\n return { kind: 'ask-user' };\n }\n return { kind: 'compose' };\n}\n","'use client';\n\nimport { useThreadIsRunning } from '@assistant-ui/core/react';\nimport { useTrueFoundryMcpAuth } from '@truefoundry/assistant-ui-runtime';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nexport function McpAuthContainer() {\n const McpAuthPrompt = useSlot('McpAuthPrompt');\n const { pending, resume } = useTrueFoundryMcpAuth();\n const isRunning = useThreadIsRunning();\n\n if (!pending) return null;\n\n const handleConnect = (serverId: string) => {\n const server = pending.mcpServers.find(s => s.id === serverId);\n if (server?.authUrl) {\n window.open(server.authUrl, '_blank', 'noopener,noreferrer');\n }\n };\n\n return (\n <McpAuthPrompt\n servers={pending.mcpServers}\n onConnect={handleConnect}\n onContinue={() => void resume()}\n readOnly={isRunning}\n />\n );\n}\n","'use client';\n\nimport { ComposerPrimitive, useAui, useAuiState } from '@assistant-ui/react';\nimport { useTrueFoundryAgentSpec, useTrueFoundryCancel } from '@truefoundry/assistant-ui-runtime';\nimport { useRef } from 'react';\n\nimport { DraftCatalogProvider } from '../atoms/draft/DraftCatalogProvider.js';\nimport { useComposerBusyState } from '../hooks/useComposerBusyState.js';\nimport { useComposerPauseView } from '../hooks/useComposerPauseView.js';\nimport { useOptionalShellMode } from '../server/ShellModeContext.js';\nimport { SlotsProvider, useSlot, useSlotIsDefault } from '../theme/SlotsProvider.js';\nimport { AskUserContainer } from './AskUserContainer.js';\nimport { ComposerAttachmentsContainer } from './AttachmentsContainer.js';\nimport { McpAuthContainer } from './McpAuthContainer.js';\n\nexport type ComposerContainerProps = {\n placeholder?: string;\n};\n\nfunction ComposerBody({ placeholder }: { placeholder: string }) {\n const ComposerShell = useSlot('ComposerShell');\n const aui = useAui();\n const shell = useOptionalShellMode();\n const hasText = useAuiState(s => s.composer.text.trim().length > 0);\n const { agentSpec } = useTrueFoundryAgentSpec();\n // Named (immutable) agents use a server-side model; only draft/mutable composers pick one here.\n const requiresModel = shell == null || (shell.mode.status === 'active' && shell.mode.isMutable);\n const hasModel = Boolean(agentSpec?.model?.name?.trim());\n const { isBusy, send, resetBusy } = useComposerBusyState();\n const cancel = useTrueFoundryCancel();\n const fileInputRef = useRef<HTMLInputElement>(null);\n const canSubmit = !isBusy && hasText && (!requiresModel || hasModel);\n const submit = () => {\n if (!canSubmit) return;\n send(() => aui.composer().send());\n };\n\n return (\n <>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n hidden\n onChange={event => {\n const files = event.target.files;\n if (files) {\n for (const file of files) {\n void aui.composer().addAttachment(file);\n }\n }\n event.target.value = '';\n }}\n />\n <ComposerPrimitive.AttachmentDropzone\n disabled={isBusy}\n data-slot=\"aui_composer-attachment-dropzone\"\n className=\"w-full rounded-[var(--composer-radius,1.5rem)] transition-[box-shadow] data-[dragging=true]:ring-focus-ring/20 data-[dragging=true]:ring-3\"\n >\n <ComposerPrimitive.Root\n data-slot=\"aui_composer-root\"\n className=\"w-full\"\n onSubmit={event => {\n // Suppresses the primitive's own send so submits route through the busy-state wrapper.\n event.preventDefault();\n submit();\n }}\n >\n <ComposerShell\n attachments={<ComposerAttachmentsContainer />}\n input={\n <ComposerPrimitive.Input\n data-slot=\"aui_composer-input\"\n placeholder={placeholder}\n disabled={isBusy}\n submitMode=\"enter\"\n aria-label=\"Message input\"\n className=\"text-text-primary placeholder:text-text-secondary/80 max-h-[10lh] min-h-10 w-full resize-none overflow-y-auto rounded-lg border-none bg-transparent px-1 py-1 text-base leading-normal shadow-none outline-none disabled:cursor-not-allowed\"\n />\n }\n disabled={isBusy}\n canSubmit={canSubmit}\n isRunning={isBusy}\n onSubmit={submit}\n onCancel={() => {\n resetBusy();\n void cancel();\n }}\n onAttach={() => fileInputRef.current?.click()}\n />\n </ComposerPrimitive.Root>\n </ComposerPrimitive.AttachmentDropzone>\n </>\n );\n}\n\nexport function ComposerContainer({\n placeholder = 'Ask anything... (Shift+Enter for new line)',\n}: ComposerContainerProps) {\n const pauseView = useComposerPauseView();\n const shell = useOptionalShellMode();\n const parentLeftSection = useSlot('ComposerLeftSection');\n const parentRightSection = useSlot('ComposerRightSection');\n const usesDefaultLeftSection = useSlotIsDefault('ComposerLeftSection');\n const usesDefaultRightSection = useSlotIsDefault('ComposerRightSection');\n const DraftComposerLeftSection = useSlot('DraftComposerLeftSection');\n const DraftComposerRightSection = useSlot('DraftComposerRightSection');\n const canMutateSpec = shell?.mode.status === 'active' && shell.mode.isMutable;\n\n if (pauseView.kind === 'mcp') {\n return <McpAuthContainer />;\n }\n if (pauseView.kind === 'ask-user') {\n return <AskUserContainer />;\n }\n\n if (canMutateSpec) {\n return (\n <DraftCatalogProvider>\n <SlotsProvider\n overrides={{\n ComposerLeftSection: usesDefaultLeftSection ? DraftComposerLeftSection : parentLeftSection,\n ComposerRightSection: usesDefaultRightSection ? DraftComposerRightSection : parentRightSection,\n }}\n >\n <ComposerBody placeholder={placeholder} />\n </SlotsProvider>\n </DraftCatalogProvider>\n );\n }\n\n return <ComposerBody placeholder={placeholder} />;\n}\n","'use client';\n\nimport { useTrueFoundryHistoryPagination } from '@truefoundry/assistant-ui-runtime';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\n\n/** How close to the viewport top (px) before the next older page is fetched. */\nconst TOP_THRESHOLD_PX = 200;\n\nconst VIEWPORT_SELECTOR = '[data-slot=\"aui_thread-viewport\"]';\n\n/**\n * Renders `HistoryLoader` at the top of the message list and fetches\n * the next older history page when the user scrolls near it. Scroll position\n * is preserved across the prepend so the list doesn't jump.\n *\n * Must be rendered inside `ThreadViewportShell` (it locates the scroll root\n * via the `aui_thread-viewport` data-slot on its nearest scrollable ancestor).\n */\nexport function HistoryLoaderContainer() {\n const HistoryLoader = useSlot('HistoryLoader');\n const { hasOlderHistory, isLoadingOlderHistory, loadOlderHistory } = useTrueFoundryHistoryPagination();\n\n const [sentinel, setSentinel] = useState<HTMLDivElement | null>(null);\n const inflightRef = useRef(false);\n\n const maybeLoadOlder = useCallback(async () => {\n if (inflightRef.current) return;\n inflightRef.current = true;\n\n const viewport = sentinel?.closest<HTMLElement>(VIEWPORT_SELECTOR) ?? null;\n const prevScrollHeight = viewport?.scrollHeight ?? 0;\n const prevScrollTop = viewport?.scrollTop ?? 0;\n\n try {\n await loadOlderHistory();\n // Wait for React to commit the prepended messages, then restore the\n // user's anchor so the list doesn't jump to the oldest message.\n requestAnimationFrame(() => {\n if (viewport == null) return;\n const delta = viewport.scrollHeight - prevScrollHeight;\n if (delta > 0) {\n viewport.scrollTo({ top: prevScrollTop + delta, behavior: 'instant' });\n }\n });\n } catch {\n // Runtime surfaces the error via onError; the sentinel stays retryable.\n } finally {\n inflightRef.current = false;\n }\n }, [sentinel, loadOlderHistory]);\n\n useEffect(() => {\n if (sentinel == null || !hasOlderHistory) return;\n\n const viewport = sentinel.closest<HTMLElement>(VIEWPORT_SELECTOR);\n const observer = new IntersectionObserver(\n entries => {\n if (entries.some(entry => entry.isIntersecting)) {\n void maybeLoadOlder();\n }\n },\n { root: viewport, rootMargin: `${TOP_THRESHOLD_PX}px 0px 0px 0px` },\n );\n observer.observe(sentinel);\n return () => observer.disconnect();\n }, [sentinel, hasOlderHistory, maybeLoadOlder]);\n\n if (!hasOlderHistory) return null;\n\n return <HistoryLoader ref={setSentinel} isLoading={isLoadingOlderHistory} />;\n}\n","'use client';\n\nimport { useTrueFoundryResumeUnavailable } from '@truefoundry/assistant-ui-runtime';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nexport function ResumeUnavailableContainer() {\n const ResumeUnavailable = useSlot('ResumeUnavailable');\n const resumeUnavailable = useTrueFoundryResumeUnavailable();\n\n if (!resumeUnavailable) return null;\n\n return <ResumeUnavailable />;\n}\n","'use client';\n\nimport { useComposerCancel, useComposerSend, useThreadIsRunning } from '@assistant-ui/core/react';\nimport { ComposerPrimitive, MessagePrimitive, useAuiState } from '@assistant-ui/react';\n\nimport { Button } from '../atoms/primitives/Button.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport { MessageAttachmentsContainer } from './AttachmentsContainer.js';\n\nfunction ReadOnlyMessageAttachments() {\n const hasAttachments = useAuiState(s => (s.message.attachments?.length ?? 0) > 0);\n if (!hasAttachments) {\n return null;\n }\n return (\n <div className=\"pointer-events-none mb-2 opacity-90\">\n <MessageAttachmentsContainer />\n </div>\n );\n}\n\nexport function UserEditComposerContainer() {\n const UserMessageEdit = useSlot('UserMessageEdit');\n const MessageTimestamp = useSlot('MessageTimestamp');\n const isRunning = useThreadIsRunning();\n const createdAt = useAuiState(s => s.message.createdAt);\n const { cancel, disabled: cancelDisabled } = useComposerCancel();\n const { disabled: sendDisabled } = useComposerSend();\n\n return (\n <MessagePrimitive.Root data-role=\"user\">\n <ComposerPrimitive.Root\n data-slot=\"aui_user-edit-composer-root\"\n className=\"fade-in slide-in-from-bottom-1 animate-in flex w-full justify-end px-2 duration-150\"\n >\n <UserMessageEdit\n timestamp={<MessageTimestamp createdAt={createdAt} />}\n attachments={<ReadOnlyMessageAttachments />}\n input={\n <div className=\"mt-1 rounded border border-border bg-secondary-bg p-2 text-text-primary\">\n <ComposerPrimitive.Input\n data-slot=\"aui_user-edit-input\"\n disabled={isRunning}\n submitMode=\"enter\"\n aria-label=\"Edit message\"\n className=\"max-h-32 min-h-10 w-full resize-none border-none bg-transparent p-0 text-base leading-[1.34] outline-none focus:shadow-none\"\n />\n </div>\n }\n footer={\n <div className=\"flex items-center justify-end gap-2\">\n <Button variant=\"secondary\" type=\"button\" disabled={cancelDisabled} onClick={cancel}>\n Cancel\n </Button>\n <ComposerPrimitive.Send asChild>\n <Button type=\"submit\" disabled={sendDisabled || isRunning}>\n Save & Rerun\n </Button>\n </ComposerPrimitive.Send>\n </div>\n }\n />\n </ComposerPrimitive.Root>\n </MessagePrimitive.Root>\n );\n}\n","'use client';\n\nimport { useActionBarCopy, useActionBarEdit, useThreadIsRunning } from '@assistant-ui/core/react';\nimport { MessagePrimitive, useAui, useAuiState } from '@assistant-ui/react';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport { MessageAttachmentsContainer } from './AttachmentsContainer.js';\n\nexport function UserMessageContainer() {\n const UserMessageBubble = useSlot('UserMessageBubble');\n const UserMessageActionBar = useSlot('UserMessageActionBar');\n const isRunning = useThreadIsRunning();\n const aui = useAui();\n const createdAt = useAuiState(s => s.message.createdAt);\n const text = useAuiState(s =>\n s.message.content\n .filter((part): part is { type: 'text'; text: string } => part.type === 'text')\n .map(part => part.text)\n .join('\\n'),\n );\n const { edit, disabled: editDisabled } = useActionBarEdit();\n const { copy, isCopied } = useActionBarCopy({\n copyToClipboard: value => navigator.clipboard.writeText(value),\n });\n\n return (\n <MessagePrimitive.Root data-role=\"user\">\n <UserMessageBubble\n text={text}\n attachments={<MessageAttachmentsContainer />}\n editAction={\n !isRunning ? (\n <UserMessageActionBar\n isCopied={isCopied}\n editDisabled={editDisabled}\n createdAt={createdAt}\n onCopy={copy}\n onEdit={edit}\n onRetry={() => {\n aui.message().composer().beginEdit();\n aui.message().composer().send({ startRun: true });\n }}\n />\n ) : undefined\n }\n />\n </MessagePrimitive.Root>\n );\n}\n","'use client';\n\nimport { ThreadPrimitive, useAuiState } from '@assistant-ui/react';\nimport { useEffect, type ReactNode } from 'react';\nimport { preloadMarkdownOpenUI } from '../atoms/Markdown.js';\nimport { ComposerBusyProvider } from '../hooks/useComposerBusyState.js';\nimport { useSyncSessionTitle } from '../hooks/useSyncSessionTitle.js';\nimport { useOptionalShellMode } from '../server/ShellModeContext.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport { isNewChatView } from '../utils/isNewChatView.js';\nimport { AssistantMessageContainer } from './AssistantMessageContainer.js';\nimport { HistoryLoaderContainer } from './HistoryLoaderContainer.js';\nimport { ResumeUnavailableContainer } from './ResumeUnavailableContainer.js';\nimport { UserEditComposerContainer } from './UserEditComposerContainer.js';\nimport { UserMessageContainer } from './UserMessageContainer.js';\n\nexport { isNewChatView } from '../utils/isNewChatView.js';\n\n/** Mount-only lift. Keyed by message.id via ThreadPrimitive.Messages — not content (streaming). */\nfunction AnimatedMessageShell({ children }: { children: ReactNode }) {\n return <div className=\"animate-in fade-in slide-in-from-bottom-1 fill-mode-both duration-200\">{children}</div>;\n}\n\nfunction ThreadMessage({ isEditing }: { isEditing: boolean }) {\n const role = useAuiState(s => s.message.role);\n if (role === 'user') {\n if (isEditing) {\n return <UserEditComposerContainer />;\n }\n return <UserMessageContainer />;\n }\n return <AssistantMessageContainer />;\n}\n\nexport type ThreadContainerProps = {\n /** Composer for the empty-welcome and docked bottom areas. `<Thread />` passes `<ComposerContainer />`. */\n composer?: ReactNode;\n};\n\nexport function ThreadContainer({ composer }: ThreadContainerProps) {\n useEffect(() => {\n void preloadMarkdownOpenUI();\n }, []);\n useSyncSessionTitle();\n\n const shell = useOptionalShellMode();\n const WelcomeScreen = useSlot('WelcomeScreen');\n const MessageListSkeleton = useSlot('MessageListSkeleton');\n const ScrollToBottomButton = useSlot('ScrollToBottomButton');\n const MessageGroup = useSlot('MessageGroup');\n const ThreadComposerAreaShell = useSlot('ThreadComposerAreaShell');\n const ThreadRootShell = useSlot('ThreadRootShell');\n const ThreadViewportShell = useSlot('ThreadViewportShell');\n\n const isEmpty = useAuiState(isNewChatView);\n const isLoading = useAuiState(s => s.thread.isLoading);\n const welcomeHeading = shell?.mode.status === 'active' ? shell.mode.agentName : undefined;\n\n return (\n <ComposerBusyProvider>\n <ThreadPrimitive.Root asChild>\n <ThreadRootShell>\n <ThreadPrimitive.Viewport asChild autoScroll>\n <ThreadViewportShell isEmpty={isEmpty}>\n {isEmpty && <WelcomeScreen heading={welcomeHeading} />}\n {isEmpty && !isLoading && composer}\n {isLoading ? (\n <MessageListSkeleton />\n ) : (\n !isEmpty && (\n <>\n <HistoryLoaderContainer />\n <MessageGroup>\n <ThreadPrimitive.Messages>\n {({ message }) => (\n <AnimatedMessageShell>\n <ThreadMessage isEditing={message.role === 'user' && message.composer.isEditing} />\n </AnimatedMessageShell>\n )}\n </ThreadPrimitive.Messages>\n <ResumeUnavailableContainer />\n </MessageGroup>\n </>\n )\n )}\n </ThreadViewportShell>\n </ThreadPrimitive.Viewport>\n\n {!isLoading && !isEmpty && (\n <ThreadComposerAreaShell isEmpty={isEmpty}>\n <ThreadPrimitive.ScrollToBottom asChild>\n <ScrollToBottomButton />\n </ThreadPrimitive.ScrollToBottom>\n {composer}\n </ThreadComposerAreaShell>\n )}\n </ThreadRootShell>\n </ThreadPrimitive.Root>\n </ComposerBusyProvider>\n );\n}\n","'use client';\n\nimport { useThreadIsRunning } from '@assistant-ui/core/react';\nimport { useEffect, useRef } from 'react';\n\nimport { useAui, useAuiState } from '../assistant-ui.js';\nimport { useOptionalServer } from '../server/ServerContext.js';\n\n/**\n * After a turn ends, read `session.title` from GET /sessions/{id} and rename the\n * thread-list row. Initialize only stores `remoteId`, so first chats stay\n * \"New Chat\" until this runs.\n */\nexport function useSyncSessionTitle(): void {\n const server = useOptionalServer();\n const aui = useAui();\n const remoteId = useAuiState(s => s.threadListItem.remoteId);\n const title = useAuiState(s => s.threadListItem.title);\n const isRunning = useThreadIsRunning();\n const wasRunningRef = useRef(false);\n const syncedRemoteIdRef = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n syncedRemoteIdRef.current = undefined;\n }, [remoteId]);\n\n useEffect(() => {\n const finishedTurn = wasRunningRef.current && !isRunning;\n wasRunningRef.current = isRunning;\n\n if (!finishedTurn || server == null || remoteId == null) {\n return;\n }\n if (syncedRemoteIdRef.current === remoteId) {\n return;\n }\n // History rows already carry a title; only fill blank / \"new\" local rows.\n if (title != null && title.trim() !== '') {\n syncedRemoteIdRef.current = remoteId;\n return;\n }\n\n let cancelled = false;\n void server\n .getSession({ sessionId: remoteId })\n .then(session => {\n if (cancelled) return;\n const nextTitle = typeof session.title === 'string' ? session.title.trim() : '';\n if (nextTitle.length === 0) return;\n syncedRemoteIdRef.current = remoteId;\n return aui.threadListItem().rename(nextTitle);\n })\n .catch(() => undefined);\n\n return () => {\n cancelled = true;\n };\n }, [aui, isRunning, remoteId, server, title]);\n}\n","import type { AssistantState } from '@assistant-ui/react';\n\n// Startup exposes a loading placeholder thread; treat it as a new chat so the\n// composer mounts centered. Loads after startup keep the docked layout.\n//\n// `remoteId == null` keeps welcome off during first-turn edit/retry: the\n// runtime briefly rewinds to an empty snapshot before applying pendingUser,\n// and messages.length===0 alone would flash the welcome screen.\nexport type NewChatViewState = {\n thread: Pick<AssistantState['thread'], 'messages' | 'isLoading'>;\n threads: Pick<AssistantState['threads'], 'isLoading'>;\n threadListItem: Pick<AssistantState['threadListItem'], 'remoteId'>;\n};\n\nexport const isNewChatView = (s: NewChatViewState) =>\n s.thread.messages.length === 0 && (!s.thread.isLoading || s.threads.isLoading) && s.threadListItem.remoteId == null;\n","'use client';\n\nimport { ComposerContainer } from './ComposerContainer.js';\nimport { ThreadContainer } from './ThreadContainer.js';\n\n/** The full assembled thread view: message list + composer. */\nexport function Thread() {\n return <ThreadContainer composer={<ComposerContainer />} />;\n}\n","'use client';\n\nimport {\n ThreadListItemByIndexProvider,\n ThreadListItemMorePrimitive,\n ThreadListItemPrimitive,\n ThreadListPrimitive,\n useAui,\n useAuiState,\n} from '@assistant-ui/react';\nimport { useEffect, useMemo, useRef, useState, type ReactNode, type Ref } from 'react';\n\nimport { AgentHistoryFilterButton } from '../atoms/AgentHistoryFilterButton.js';\nimport { auiButtonClass } from '../atoms/lib/buttonClasses.js';\nimport { cn } from '../atoms/lib/cn.js';\nimport { useCompactLayout } from '../atoms/lib/CompactLayoutContext.js';\nimport {\n canReuseMutableShell,\n readThreadAgentName,\n threadListIndicesByRecency,\n threadListItemIsMutable,\n} from '../atoms/lib/threadListMeta.js';\nimport { useIsMobile } from '../atoms/lib/useIsMobile.js';\nimport { BottomSheet } from '../atoms/primitives/BottomSheet.js';\nimport { Icon } from '../icons/Icon.js';\nimport { useOptionalServer } from '../server/ServerContext.js';\nimport { useOptionalShellMode } from '../server/ShellModeContext.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\n\n/**\n * Simplified relative to the reference: renders threads in a single flat list\n * rather than grouping them by Today/Yesterday/Earlier.\n *\n * Delete uses assistant-ui ThreadListItemPrimitive.Delete / ThreadListItemMorePrimitive\n * (adapter.delete → server.deleteSession). Mobile/compact keeps a BottomSheet chrome.\n */\nexport type ThreadListContainerProps = {\n /** Called after New chat or selecting a row — used by stack/drawer chrome. */\n onThreadOpen?: () => void;\n};\n\nconst deleteItemClass =\n 'flex w-full cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none text-failure-bg hover:bg-ghost-button-hover hover:text-failure-bg focus:bg-ghost-button-hover focus:text-failure-bg data-[highlighted]:bg-ghost-button-hover data-[highlighted]:text-failure-bg';\n\nfunction ThreadListItemDeleteMenu() {\n const compact = useCompactLayout();\n const isMobile = useIsMobile();\n const [sheetOpen, setSheetOpen] = useState(false);\n const useSheet = isMobile || compact;\n\n const moreButtonClass = auiButtonClass({\n variant: 'ghost',\n size: 'icon',\n className: 'size-7 shrink-0 text-text-secondary hover:bg-transparent hover:text-text-primary',\n });\n\n if (useSheet) {\n return (\n <>\n <button\n type=\"button\"\n aria-label=\"Session actions\"\n title=\"Session actions\"\n aria-haspopup=\"dialog\"\n aria-expanded={sheetOpen}\n className={moreButtonClass}\n onClick={() => setSheetOpen(true)}\n >\n <Icon name=\"ellipsis\" className=\"size-3.5\" />\n </button>\n {sheetOpen ? (\n <BottomSheet open onOpenChange={setSheetOpen} aria-label=\"Session actions\">\n <div className=\"flex flex-col gap-1 p-2\" role=\"menu\">\n <ThreadListItemPrimitive.Delete className={deleteItemClass} onClick={() => setSheetOpen(false)}>\n <Icon name=\"trash\" className=\"size-3.5\" />\n Delete\n </ThreadListItemPrimitive.Delete>\n </div>\n </BottomSheet>\n ) : null}\n </>\n );\n }\n\n return (\n <ThreadListItemMorePrimitive.Root sharedFocusGroup>\n <ThreadListItemMorePrimitive.Trigger\n aria-label=\"Session actions\"\n title=\"Session actions\"\n className={moreButtonClass}\n >\n <Icon name=\"ellipsis\" className=\"size-3.5\" />\n </ThreadListItemMorePrimitive.Trigger>\n <ThreadListItemMorePrimitive.Content\n align=\"end\"\n sideOffset={4}\n className=\"z-50 min-w-[8rem] rounded-md border border-border bg-card-bg p-1 text-text-primary shadow-md\"\n >\n <ThreadListItemPrimitive.Delete asChild>\n <ThreadListItemMorePrimitive.Item className={deleteItemClass}>\n <Icon name=\"trash\" className=\"size-3.5\" />\n Delete\n </ThreadListItemMorePrimitive.Item>\n </ThreadListItemPrimitive.Delete>\n </ThreadListItemMorePrimitive.Content>\n </ThreadListItemMorePrimitive.Root>\n );\n}\n\nfunction ThreadListItemRow({\n onThreadOpen,\n canDeleteSession,\n}: {\n onThreadOpen?: () => void;\n canDeleteSession: boolean;\n}) {\n const aui = useAui();\n const shell = useOptionalShellMode();\n const ThreadListRow = useSlot('ThreadListRow');\n const id = useAuiState(s => s.threadListItem.id);\n const remoteId = useAuiState(s => s.threadListItem.remoteId);\n const title = useAuiState(s => s.threadListItem.title);\n const lastMessageAt = useAuiState(s => s.threadListItem.lastMessageAt);\n const custom = useAuiState(s => s.threadListItem.custom);\n const mainThreadId = useAuiState(s => s.threads.mainThreadId);\n const agentName = readThreadAgentName(custom);\n const showDelete = canDeleteSession && remoteId != null;\n\n return (\n <ThreadListItemPrimitive.Root className=\"min-w-0\">\n <ThreadListRow\n title={title ?? 'New Chat'}\n active={id === mainThreadId}\n agentName={agentName}\n lastMessageAt={lastMessageAt}\n onSelect={() => {\n onThreadOpen?.();\n shell?.setSettingsOpen(false);\n\n // Prefer custom.isMutable (session wire); agentName-only is a legacy fallback.\n const sessionMutable = threadListItemIsMutable(custom);\n const sameImmutable =\n !sessionMutable &&\n shell?.mode.status === 'active' &&\n !shell.mode.isMutable &&\n (agentName == null\n ? shell.mode.agentName == null && shell.mode.agentId == null\n : shell.mode.agentName === agentName || shell.mode.agentId === agentName);\n const sameMutable = canReuseMutableShell({\n sessionMutable,\n shellMutable: shell?.mode.status === 'active' && shell.mode.isMutable,\n ...(shell?.mode.status === 'active' && shell.mode.isMutable\n ? { shellAgentName: shell.mode.agentName, shellAgentId: shell.mode.agentId }\n : {}),\n remoteId,\n pendingSessionId: shell?.pendingSessionId,\n });\n\n if ((sameImmutable || sameMutable) && remoteId != null) {\n void Promise.resolve(aui.threads().switchToThread(id)).catch(() => undefined);\n return;\n }\n if (remoteId != null) {\n shell?.openHistorySession({\n sessionId: remoteId,\n isMutable: sessionMutable,\n ...(agentName != null ? { agentName } : {}),\n });\n return;\n }\n void Promise.resolve(aui.threads().switchToThread(id)).catch(() => undefined);\n }}\n actions={showDelete ? <ThreadListItemDeleteMenu /> : undefined}\n />\n </ThreadListItemPrimitive.Root>\n );\n}\n\nfunction useThreadListIndicesByRecency(): number[] {\n const threadIds = useAuiState(s => s.threads.threadIds);\n const threadItems = useAuiState(s => s.threads.threadItems);\n\n return useMemo(() => threadListIndicesByRecency({ threadIds, threadItems }), [threadIds, threadItems]);\n}\n\nfunction ThreadListItemsByRecency({\n onThreadOpen,\n canDeleteSession,\n}: {\n onThreadOpen?: () => void;\n canDeleteSession: boolean;\n}) {\n // Newest-first: remount/switchToThread can append the active session to threadIds.\n const indices = useThreadListIndicesByRecency();\n const threadIds = useAuiState(s => s.threads.threadIds);\n\n return (\n <>\n {indices.map(index => {\n const key = threadIds[index] ?? String(index);\n return (\n <ThreadListItemByIndexProvider key={key} index={index} archived={false}>\n <ThreadListItemRow onThreadOpen={onThreadOpen} canDeleteSession={canDeleteSession} />\n </ThreadListItemByIndexProvider>\n );\n })}\n </>\n );\n}\n\nconst THREAD_LIST_VIEWPORT_SLOT = 'aui_thread-list-viewport';\n/** How close to the bottom (px) before the next sessions page is fetched. */\nconst LOAD_MORE_BOTTOM_PX = 80;\n\nfunction ChatHistorySection({ children, viewportRef }: { children: ReactNode; viewportRef: Ref<HTMLDivElement> }) {\n const [expanded, setExpanded] = useState(true);\n const shell = useOptionalShellMode();\n const showFilter = shell?.isLibraryEnabled === true;\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div className=\"flex shrink-0 items-center gap-1 px-1 py-1\">\n <button\n type=\"button\"\n aria-expanded={expanded}\n className=\"flex min-w-0 flex-1 items-center gap-1 rounded-md px-1.5 py-1 text-left text-sm font-medium text-text-secondary hover:bg-ghost-button-hover hover:text-text-primary\"\n onClick={() => setExpanded(v => !v)}\n >\n <span className=\"truncate\">Chat History</span>\n <Icon\n name=\"chevron-down\"\n className={cn('size-3.5 shrink-0 transition-transform', !expanded && '-rotate-90')}\n />\n </button>\n {showFilter ? <AgentHistoryFilterButton /> : null}\n </div>\n {expanded ? (\n <div\n ref={viewportRef}\n data-slot={THREAD_LIST_VIEWPORT_SLOT}\n className=\"flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto\"\n >\n {children}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function ThreadListContainer({ onThreadOpen }: ThreadListContainerProps = {}) {\n const aui = useAui();\n const server = useOptionalServer();\n const isLoading = useAuiState(s => s.threads.isLoading);\n const isLoadingMore = useAuiState(s => s.threads.isLoadingMore);\n const hasMore = useAuiState(s => s.threads.hasMore);\n const threadIds = useAuiState(s => s.threads.threadIds);\n const shell = useOptionalShellMode();\n\n const ThreadListShell = useSlot('ThreadListShell');\n const ThreadListNewButton = useSlot('ThreadListNewButton');\n const AgentsLibraryButton = useSlot('AgentsLibraryButton');\n const ThreadListRowSkeleton = useSlot('ThreadListRowSkeleton');\n const ThreadListEmptyState = useSlot('ThreadListEmptyState');\n\n const viewportRef = useRef<HTMLDivElement>(null);\n const hasMoreRef = useRef(hasMore);\n const auiRef = useRef(aui);\n hasMoreRef.current = hasMore;\n auiRef.current = aui;\n\n const showNewChat = shell?.isNewChatEnabled !== false;\n const isIdle = shell?.mode.status === 'idle';\n const canDeleteSession = typeof server?.deleteSession === 'function';\n\n // Fill an underflowing viewport; once it scrolls, paginate only near the bottom.\n // Re-measure after commit (threadIds / hasMore) instead of rAF-chaining, which\n // raced layout and could drain every remaining listSessions page.\n // The runtime owns request deduplication, so Strict Mode remounts can recheck safely.\n useEffect(() => {\n if (isIdle || isLoading || isLoadingMore) return;\n const viewport = viewportRef.current;\n if (!viewport) return;\n\n let cancelled = false;\n\n const tryLoadMore = () => {\n if (cancelled || !hasMoreRef.current) return;\n if (viewport.clientHeight <= 0) return;\n\n const remaining = viewport.scrollHeight - viewport.scrollTop - viewport.clientHeight;\n if (viewport.scrollHeight > viewport.clientHeight && remaining > LOAD_MORE_BOTTOM_PX) return;\n\n void auiRef.current.threads().loadMore();\n };\n\n viewport.addEventListener('scroll', tryLoadMore, { passive: true });\n const resizeObserver = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(() => tryLoadMore());\n if (resizeObserver) {\n resizeObserver.observe(viewport);\n } else {\n window.addEventListener('resize', tryLoadMore);\n }\n tryLoadMore();\n\n return () => {\n cancelled = true;\n viewport.removeEventListener('scroll', tryLoadMore);\n resizeObserver?.disconnect();\n if (!resizeObserver) {\n window.removeEventListener('resize', tryLoadMore);\n }\n };\n }, [hasMore, isIdle, isLoading, isLoadingMore, threadIds.length]);\n\n const handleNewChat = () => {\n onThreadOpen?.();\n if (shell?.isComposerEnabled) {\n shell.openDraft();\n return;\n }\n shell?.setSettingsOpen(false);\n void Promise.resolve(aui.threads().switchToNewThread()).catch(() => undefined);\n };\n\n let listBody: ReactNode;\n if (isIdle) {\n listBody = <ThreadListEmptyState />;\n } else if (isLoading) {\n listBody = <ThreadListRowSkeleton />;\n } else if (threadIds.length === 0) {\n listBody = <ThreadListEmptyState />;\n } else {\n listBody = (\n <ThreadListPrimitive.Root className=\"flex min-h-0 flex-col gap-0.5\">\n <ThreadListItemsByRecency onThreadOpen={onThreadOpen} canDeleteSession={canDeleteSession} />\n </ThreadListPrimitive.Root>\n );\n }\n\n return (\n <ThreadListShell\n header={\n <div className=\"flex flex-col gap-1\">\n {showNewChat ? <ThreadListNewButton onClick={handleNewChat} /> : null}\n <AgentsLibraryButton\n onSelectAgent={() => {\n onThreadOpen?.();\n }}\n />\n </div>\n }\n >\n <ChatHistorySection viewportRef={viewportRef}>\n {listBody}\n {!isIdle && hasMore ? <div className=\"h-4 shrink-0\" aria-hidden /> : null}\n </ChatHistorySection>\n </ThreadListShell>\n );\n}\n","'use client';\n\nimport { useEffect, useId, useLayoutEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { Icon } from '../icons/Icon.js';\nimport { useOptionalServer } from '../server/ServerContext.js';\nimport { libraryAgentId, useOptionalShellMode } from '../server/ShellModeContext.js';\nimport { auiButtonClass } from './lib/buttonClasses.js';\nimport { cn } from './lib/cn.js';\nimport { useCompactLayout } from './lib/CompactLayoutContext.js';\nimport { useIsMobile } from './lib/useIsMobile.js';\nimport { useSearchAgentsList } from './lib/useSearchAgentsList.js';\nimport { BottomSheet } from './primitives/BottomSheet.js';\nimport { DropdownMenuItem } from './primitives/DropdownMenu.js';\nimport SearchInput from './primitives/SearchInput.js';\n\n/** Keep portaled chrome under ThemeProvider so preset/custom CSS vars still apply. */\nfunction themePortalRoot(from: HTMLElement | null): HTMLElement {\n return from?.closest('.aui-theme-root') ?? document.body;\n}\n\n/**\n * Funnel popover for filtering chat history by agent id.\n * Desktop: fixed menu to the right of the funnel. Mobile/compact: bottom sheet.\n */\nexport function AgentHistoryFilterButton() {\n const shell = useOptionalShellMode();\n const server = useOptionalServer();\n const isMobile = useIsMobile();\n const compact = useCompactLayout();\n const useSheet = isMobile || compact;\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [menuPos, setMenuPos] = useState<{ top: number; left: number } | null>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const menuId = useId();\n\n const enabled = shell?.isLibraryEnabled === true && server != null;\n const selected = shell?.historyAgentFilter ?? null;\n\n useEffect(() => {\n if (!open) setQuery('');\n }, [open]);\n\n const { agents, isInitialLoading, isSearching, loadingMore, hasMore, listRef, sentinelRef } = useSearchAgentsList({\n enabled: open && enabled,\n query,\n });\n\n // Desktop only: anchor to the right of the funnel; portal escapes sidebar overflow.\n useLayoutEffect(() => {\n if (!open || useSheet) {\n setMenuPos(null);\n return;\n }\n const update = () => {\n const rect = buttonRef.current?.getBoundingClientRect();\n if (!rect) return;\n setMenuPos({ top: rect.top, left: rect.right + 4 });\n };\n update();\n window.addEventListener('resize', update);\n window.addEventListener('scroll', update, true);\n return () => {\n window.removeEventListener('resize', update);\n window.removeEventListener('scroll', update, true);\n };\n }, [open, useSheet]);\n\n useEffect(() => {\n if (!open || useSheet) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (buttonRef.current?.contains(target) || menuRef.current?.contains(target)) return;\n setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open, useSheet]);\n\n if (!enabled) return null;\n\n const pick = (agentId: string | null) => {\n shell?.setHistoryAgentFilter(agentId);\n setOpen(false);\n };\n\n const filterBody = (\n <>\n <div className=\"p-1\" onMouseDown={e => e.stopPropagation()}>\n <SearchInput query={query} setQuery={setQuery} placeholder=\"Search agents\" />\n {isSearching ? (\n <p className=\"text-text-secondary px-1 pt-1 text-[11px]\" role=\"status\">\n Searching…\n </p>\n ) : null}\n </div>\n <div\n ref={listRef}\n className={cn('mt-1 overflow-y-auto', useSheet ? 'min-h-0 flex-1 px-1 pb-2' : 'min-h-48 max-h-64')}\n >\n {query.trim() === '' ? (\n <DropdownMenuItem\n className={cn(\n 'justify-between',\n selected == null && 'bg-dropdown-selected-item-bg text-dropdown-selected-item-text',\n )}\n onClick={() => pick(null)}\n >\n All chats\n {selected == null ? <Icon name=\"check\" className=\"size-3.5 shrink-0\" /> : null}\n </DropdownMenuItem>\n ) : null}\n {isInitialLoading ? (\n <p className=\"px-2 py-3 text-center text-xs text-text-secondary\">Loading…</p>\n ) : agents.length === 0 ? (\n <p className=\"text-text-secondary px-2 py-6 text-center text-xs\" role=\"status\">\n {query.trim() ? `No agents match \"${query.trim()}\".` : 'No agents yet.'}\n </p>\n ) : (\n <>\n {agents.map(agent => {\n const id = libraryAgentId(agent);\n const active = selected === id;\n return (\n <DropdownMenuItem\n key={id}\n className={cn(\n 'justify-between gap-2 text-left',\n active && 'bg-dropdown-selected-item-bg text-dropdown-selected-item-text',\n )}\n onClick={() => pick(id)}\n >\n <span className=\"min-w-0 truncate\">{agent.name}</span>\n {active ? <Icon name=\"check\" className=\"size-3.5 shrink-0\" /> : null}\n </DropdownMenuItem>\n );\n })}\n {hasMore ? (\n <div ref={sentinelRef} className=\"flex h-6 shrink-0 items-center justify-center\" aria-hidden>\n {loadingMore ? (\n <span className=\"text-text-secondary text-[11px]\" role=\"status\">\n Loading more…\n </span>\n ) : null}\n </div>\n ) : null}\n </>\n )}\n </div>\n </>\n );\n\n return (\n <div className=\"relative shrink-0\">\n <button\n ref={buttonRef}\n type=\"button\"\n aria-label={selected != null ? `Filter chat history by agent (${selected})` : 'Filter chat history by agent'}\n aria-haspopup={useSheet ? 'dialog' : 'menu'}\n aria-expanded={open}\n aria-controls={open ? menuId : undefined}\n title=\"Filter by agent\"\n className={auiButtonClass({\n variant: 'ghost',\n size: 'icon',\n className: cn(\n 'relative size-7 shrink-0 text-text-secondary hover:bg-ghost-button-hover hover:text-ghost-button-text',\n selected != null && 'text-text-primary',\n ),\n })}\n onClick={() => setOpen(v => !v)}\n >\n <Icon name=\"funnel\" className=\"size-3.5\" />\n {selected != null ? (\n <span\n className=\"bg-primary-button-bg absolute top-1 right-1 size-1.5 rounded-full\"\n aria-hidden\n data-testid=\"history-filter-active-dot\"\n />\n ) : null}\n </button>\n {useSheet && open ? (\n <BottomSheet open onOpenChange={setOpen} id={menuId} aria-label=\"Filter agents\">\n <div className=\"flex min-h-0 flex-1 flex-col p-2\" role=\"menu\">\n {filterBody}\n </div>\n </BottomSheet>\n ) : null}\n {!useSheet && open && menuPos != null\n ? createPortal(\n <div\n ref={menuRef}\n id={menuId}\n role=\"menu\"\n aria-label=\"Filter agents\"\n style={{ top: menuPos.top, left: menuPos.left }}\n className=\"font-sans-flex fixed z-50 w-56 rounded-md border border-border bg-card-bg p-1 text-text-primary shadow-md\"\n >\n {filterBody}\n </div>,\n themePortalRoot(buttonRef.current),\n )\n : null}\n </div>\n );\n}\n","import React, { useEffect, useId, useRef, useState } from 'react';\n\nimport { cn } from '../lib/cn.js';\n\nexport type DropdownMenuProps = {\n trigger: React.ReactNode;\n children: React.ReactNode;\n align?: 'start' | 'end';\n className?: string;\n};\n\nexport function DropdownMenu({ trigger, children, align = 'end', className }: DropdownMenuProps) {\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const menuId = useId();\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n const first = menuRef.current?.querySelector<HTMLElement>('[role=\"menuitem\"]:not([disabled])');\n first?.focus();\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setOpen(false);\n const triggerBtn = containerRef.current?.querySelector<HTMLElement>(\"[aria-haspopup='menu']\");\n triggerBtn?.focus();\n return;\n }\n\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp' && e.key !== 'Home' && e.key !== 'End') {\n return;\n }\n\n const items = Array.from(\n menuRef.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not([disabled])') ?? [],\n );\n if (items.length === 0) return;\n\n e.preventDefault();\n const currentIndex = items.indexOf(document.activeElement as HTMLElement);\n let nextIndex = currentIndex;\n if (e.key === 'ArrowDown') nextIndex = (currentIndex + 1) % items.length;\n else if (e.key === 'ArrowUp') nextIndex = (currentIndex - 1 + items.length) % items.length;\n else if (e.key === 'Home') nextIndex = 0;\n else if (e.key === 'End') nextIndex = items.length - 1;\n items[nextIndex]?.focus();\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open]);\n\n const triggerEl = React.isValidElement(trigger)\n ? React.cloneElement(trigger as React.ReactElement<Record<string, unknown>>, {\n 'aria-haspopup': 'menu',\n 'aria-expanded': open,\n 'aria-controls': open ? menuId : undefined,\n onKeyDown: (e: React.KeyboardEvent) => {\n const existing = (trigger as React.ReactElement<{ onKeyDown?: (ev: React.KeyboardEvent) => void }>).props\n .onKeyDown;\n existing?.(e);\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setOpen(true);\n }\n },\n })\n : trigger;\n\n return (\n <div ref={containerRef} className=\"relative inline-flex\">\n <div onClick={() => setOpen(v => !v)}>{triggerEl}</div>\n {open && (\n <div\n ref={menuRef}\n id={menuId}\n role=\"menu\"\n className={cn(\n 'absolute top-full z-50 mt-1 min-w-[8rem] rounded-md border border-border bg-card-bg p-1',\n 'text-text-primary shadow-md',\n align === 'end' ? 'right-0' : 'left-0',\n className,\n )}\n onClick={() => setOpen(false)}\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n\nexport type DropdownMenuItemProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nexport function DropdownMenuItem({ className, ...props }: DropdownMenuItemProps) {\n return (\n <button\n role=\"menuitem\"\n type=\"button\"\n className={cn(\n 'flex w-full cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none',\n 'transition-colors hover:bg-ghost-button-hover',\n 'focus:bg-dropdown-selected-item-bg focus:text-dropdown-selected-item-text',\n 'aria-selected:bg-dropdown-selected-item-bg aria-selected:text-dropdown-selected-item-text',\n 'disabled:pointer-events-none disabled:opacity-50',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport type DropdownMenuSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport function DropdownMenuSeparator({ className, ...props }: DropdownMenuSeparatorProps) {\n return <div role=\"separator\" className={cn('-mx-1 my-1 h-px bg-border', className)} {...props} />;\n}\n"],"mappings":"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","names":["useEffect","useState","jsx","useState","useEffect","useAuiState","useCallback","useMemo","useRef","useEffect","useRef","useState","jsx","useRef","useAuiState","useCallback","downloadSandboxFile","toaster","useMemo","useAuiState","useCallback","useRef","useState","jsx","useAuiState","useState","useRef","useCallback","useCallback","useMemo","useState","jsx","useState","useMemo","useCallback","useCallback","useEffect","useRef","useState","jsx","useState","useRef","useCallback","useEffect","useState","display","useMemo","useState","jsx","useState","useMemo","jsx","useState","argsDisplay","resultDisplay","slots","useThreadIsRunning","MessagePrimitive","useAuiState","useAuiState","jsx","useAuiState","jsx","useThreadIsRunning","useAuiState","MessagePrimitive","MessagePrimitive","useAui","useAuiState","useAuiState","useEffect","useState","jsx","useAui","useAuiState","MessagePrimitive","useAuiState","useTrueFoundryToolResponses","useThreadIsRunning","jsx","useThreadIsRunning","ComposerPrimitive","useAui","useAuiState","useRef","jsx","useAui","useAuiState","useRef","ComposerPrimitive","useCallback","useEffect","useRef","useState","jsx","useState","useRef","useCallback","useEffect","useTrueFoundryResumeUnavailable","jsx","useTrueFoundryResumeUnavailable","useThreadIsRunning","ComposerPrimitive","MessagePrimitive","useAuiState","jsx","jsxs","useAuiState","useThreadIsRunning","MessagePrimitive","ComposerPrimitive","useActionBarCopy","useThreadIsRunning","MessagePrimitive","useAui","useAuiState","jsx","useThreadIsRunning","useAui","useAuiState","useActionBarCopy","MessagePrimitive","useAuiState","useEffect","useThreadIsRunning","useEffect","useRef","useThreadIsRunning","useRef","useEffect","Fragment","jsx","jsxs","useAuiState","useEffect","jsx","useAui","useAuiState","useEffect","useMemo","useRef","useState","useEffect","useId","useRef","useState","useEffect","useRef","useState","jsx","jsxs","jsx","Fragment","jsx","jsxs","useState","useRef","useId","useEffect","Fragment","jsx","jsxs","useState","useAui","useAuiState","useMemo","useRef","useEffect"]}
|
|
@@ -4,18 +4,20 @@ import {
|
|
|
4
4
|
Spinner,
|
|
5
5
|
auiButtonClass,
|
|
6
6
|
getErrorMessage,
|
|
7
|
+
useCompactLayout,
|
|
8
|
+
useDraftCatalog
|
|
9
|
+
} from "./chunk-IFLE7OMM.js";
|
|
10
|
+
import {
|
|
7
11
|
libraryAgentId,
|
|
8
12
|
useCatalogServer,
|
|
9
|
-
useCompactLayout,
|
|
10
|
-
useDraftCatalog,
|
|
11
13
|
useOptionalCatalogServer,
|
|
12
14
|
useOptionalServer,
|
|
13
15
|
useOptionalShellMode,
|
|
14
16
|
useServerCapabilities
|
|
15
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-WQULF5AT.js";
|
|
16
18
|
import {
|
|
17
19
|
OpenUiFenceBlock
|
|
18
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-JRRCAKEP.js";
|
|
19
21
|
import {
|
|
20
22
|
ThemeContext,
|
|
21
23
|
ThemeProvider,
|
|
@@ -23,7 +25,7 @@ import {
|
|
|
23
25
|
useOptionalContentClassNames,
|
|
24
26
|
useOptionalThemeMode,
|
|
25
27
|
useOptionalThemePreset
|
|
26
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-72LC2M3R.js";
|
|
27
29
|
|
|
28
30
|
// src/theme/brand.tsx
|
|
29
31
|
import { useContext } from "react";
|
|
@@ -3335,7 +3337,7 @@ import ReactMarkdown from "react-markdown";
|
|
|
3335
3337
|
import remarkGfm from "remark-gfm";
|
|
3336
3338
|
import { Fragment as Fragment8, jsx as jsx41 } from "react/jsx-runtime";
|
|
3337
3339
|
function preloadMarkdownOpenUI() {
|
|
3338
|
-
return import("./OpenUiFenceBlock-
|
|
3340
|
+
return import("./OpenUiFenceBlock-3EFPY4JW.js");
|
|
3339
3341
|
}
|
|
3340
3342
|
var LARGE_STREAMING_FENCE_CHARS = 8 * 1024;
|
|
3341
3343
|
function getActiveStreamingFenceCode(content) {
|
|
@@ -4298,7 +4300,15 @@ function SaveAgentButtonContent({
|
|
|
4298
4300
|
}
|
|
4299
4301
|
)
|
|
4300
4302
|
] }),
|
|
4301
|
-
error ? /* @__PURE__ */ jsx49(
|
|
4303
|
+
error ? /* @__PURE__ */ jsx49(
|
|
4304
|
+
"p",
|
|
4305
|
+
{
|
|
4306
|
+
ref: errorRef,
|
|
4307
|
+
role: "alert",
|
|
4308
|
+
className: "text-failure-bg mt-3 text-sm wrap-break-word whitespace-pre-wrap tab-4",
|
|
4309
|
+
children: error
|
|
4310
|
+
}
|
|
4311
|
+
) : null
|
|
4302
4312
|
] }),
|
|
4303
4313
|
/* @__PURE__ */ jsxs31("div", { className: "bg-card-bg sticky bottom-0 z-10 flex shrink-0 justify-end gap-2 border-t border-border px-5 py-4", children: [
|
|
4304
4314
|
/* @__PURE__ */ jsx49(
|
|
@@ -6808,4 +6818,4 @@ export {
|
|
|
6808
6818
|
WelcomeScreen,
|
|
6809
6819
|
defaultSlots
|
|
6810
6820
|
};
|
|
6811
|
-
//# sourceMappingURL=chunk-
|
|
6821
|
+
//# sourceMappingURL=chunk-UU7C5DQ3.js.map
|