@truefoundry/trueforge-ui 0.1.0-rc.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +56 -0
- package/dist/{ConnectorSettings-ADACLWQI.js → ConnectorSettings-H37ZFC6Z.js} +35 -12
- package/dist/ConnectorSettings-H37ZFC6Z.js.map +1 -0
- package/dist/{DockLayout-BH5XX2AQ.js → DockLayout-KEMFRWIR.js} +8 -8
- package/dist/{DrawerLayout-O2XZQCG4.js → DrawerLayout-ZVWCKEIS.js} +8 -8
- package/dist/{ModelSettings-LKFJVUYQ.js → ModelSettings-QJMYHCMD.js} +5 -5
- package/dist/OpenUiFenceBlock-XFBUGPKQ.js +9 -0
- package/dist/{SandboxSettings-H5MDAE47.js → SandboxSettings-BUBMLW7Q.js} +159 -65
- package/dist/SandboxSettings-BUBMLW7Q.js.map +1 -0
- package/dist/{SettingsBuilder-3JOLC56Z.js → SettingsBuilder-26XSGIHK.js} +7 -7
- package/dist/{SidebarLayout-G6BGD7EY.js → SidebarLayout-F3XFXW7B.js} +8 -8
- package/dist/{SkillSettings-4VB42CVG.js → SkillSettings-IRMGDFRG.js} +5 -5
- package/dist/{WidgetLayout-ABSXZUSQ.js → WidgetLayout-SZMABKIR.js} +8 -8
- package/dist/{chunk-EFGSH3MO.js → chunk-7EEOWDLE.js} +7 -7
- package/dist/chunk-DTF7ZMUJ.js +567 -0
- package/dist/chunk-DTF7ZMUJ.js.map +1 -0
- package/dist/{chunk-3PTFNAQK.js → chunk-H7DR64W3.js} +46 -31
- package/dist/chunk-H7DR64W3.js.map +1 -0
- package/dist/{chunk-FDBJNXH2.js → chunk-HT5HKQXE.js} +2 -2
- package/dist/{chunk-VJTCFZNM.js → chunk-LRQHHZDX.js} +4 -4
- package/dist/{chunk-Z27F4LBZ.js → chunk-QGNLP2EE.js} +163 -71
- package/dist/chunk-QGNLP2EE.js.map +1 -0
- package/dist/{chunk-U5GBGEGN.js → chunk-XAZ5HJXV.js} +83 -9
- package/dist/chunk-XAZ5HJXV.js.map +1 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.js +112 -17
- package/dist/index.js.map +1 -1
- package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +42 -28
- package/dist/plugins/trueforge-agent-server-adapter/index.js +27 -16
- package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +4 -4
- package/dist/ConnectorSettings-ADACLWQI.js.map +0 -1
- package/dist/OpenUiFenceBlock-A2CWCPOP.js +0 -9
- package/dist/SandboxSettings-H5MDAE47.js.map +0 -1
- package/dist/chunk-3PTFNAQK.js.map +0 -1
- package/dist/chunk-U5GBGEGN.js.map +0 -1
- package/dist/chunk-WMRZSULD.js +0 -567
- package/dist/chunk-WMRZSULD.js.map +0 -1
- package/dist/chunk-Z27F4LBZ.js.map +0 -1
- /package/dist/{DockLayout-BH5XX2AQ.js.map → DockLayout-KEMFRWIR.js.map} +0 -0
- /package/dist/{DrawerLayout-O2XZQCG4.js.map → DrawerLayout-ZVWCKEIS.js.map} +0 -0
- /package/dist/{ModelSettings-LKFJVUYQ.js.map → ModelSettings-QJMYHCMD.js.map} +0 -0
- /package/dist/{OpenUiFenceBlock-A2CWCPOP.js.map → OpenUiFenceBlock-XFBUGPKQ.js.map} +0 -0
- /package/dist/{SettingsBuilder-3JOLC56Z.js.map → SettingsBuilder-26XSGIHK.js.map} +0 -0
- /package/dist/{SidebarLayout-G6BGD7EY.js.map → SidebarLayout-F3XFXW7B.js.map} +0 -0
- /package/dist/{SkillSettings-4VB42CVG.js.map → SkillSettings-IRMGDFRG.js.map} +0 -0
- /package/dist/{WidgetLayout-ABSXZUSQ.js.map → WidgetLayout-SZMABKIR.js.map} +0 -0
- /package/dist/{chunk-EFGSH3MO.js.map → chunk-7EEOWDLE.js.map} +0 -0
- /package/dist/{chunk-FDBJNXH2.js.map → chunk-HT5HKQXE.js.map} +0 -0
- /package/dist/{chunk-VJTCFZNM.js.map → chunk-LRQHHZDX.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
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/useComposerBusyState.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 nestedBridge = useNestedApprovalBridge();\n\n const respond = (response: ToolApprovalResponse) => {\n if (nestedBridge) {\n nestedBridge(response);\n return;\n }\n part.respondToApproval(response);\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 respondToNestedApproval = useTrueFoundryRespondToToolApproval();\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 const bridge = (response: ToolApprovalResponse) => {\n if (part.approval == null) return;\n const approved = 'approved' in response ? response.approved : undefined;\n if (approved === undefined) return;\n respondToNestedApproval({ approvalId: part.approval.id, approved });\n };\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={bridge}>\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 type { ToolApprovalResponse } from '@assistant-ui/react';\nimport { createContext, useContext } from 'react';\n\n/**\n * Sub-agent tool calls render inside a read-only nested thread context\n * (`MessagePartPrimitive.Messages`), so the standard `respondToApproval` prop\n * on their parts doesn't route back to the gateway. `ToolCallContainer` uses\n * this bridge instead when rendering nested calls, translating the response\n * through `useTrueFoundryRespondToToolApproval()` -- mirrors the reference's\n * `nestedToolCallMessageComponents` override.\n */\nexport const NestedApprovalBridgeContext = createContext<((response: ToolApprovalResponse) => void) | null>(null);\n\nexport function useNestedApprovalBridge(): ((response: ToolApprovalResponse) => void) | null {\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 { useThreadIsRunning } from '@assistant-ui/core/react';\nimport { createContext, createElement, useCallback, useContext, useEffect, useState, type ReactNode } from 'react';\n\nexport type ComposerBusyState = {\n /** True while submitting or while the turn stream is active. */\n isBusy: boolean;\n isRunning: boolean;\n isSubmitting: boolean;\n send: (sendFn: () => void | Promise<void>) => void;\n resetBusy: () => void;\n};\n\nconst ComposerBusyContext = createContext<ComposerBusyState | null>(null);\n\n/**\n * `aui.composer().send()` returns void and swallows `onNew` rejections, so the\n * optimistic submitting flag cannot clear via Promise.catch. First-message\n * failures (e.g. createSession) also never flip `useThreadIsRunning()`. Chat\n * runtime `onError` calls this so the Cancel/spinner state does not stick.\n */\nconst busyFailureListeners = new Set<() => void>();\n\nexport function notifyComposerBusyFailure(): void {\n for (const listener of busyFailureListeners) {\n listener();\n }\n}\n\nfunction useComposerBusyStateValue(): ComposerBusyState {\n const isRunning = useThreadIsRunning();\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n useEffect(() => {\n if (!isRunning) {\n setIsSubmitting(false);\n }\n }, [isRunning]);\n\n useEffect(() => {\n const clearSubmitting = () => {\n setIsSubmitting(false);\n };\n busyFailureListeners.add(clearSubmitting);\n return () => {\n busyFailureListeners.delete(clearSubmitting);\n };\n }, []);\n\n const isBusy = isRunning || isSubmitting;\n\n const resetBusy = useCallback(() => {\n setIsSubmitting(false);\n }, []);\n\n const send = useCallback((sendFn: () => void | Promise<void>) => {\n setIsSubmitting(true);\n try {\n const result = sendFn();\n if (result != null && typeof result.then === 'function') {\n void result.catch(() => {\n setIsSubmitting(false);\n });\n }\n } catch {\n setIsSubmitting(false);\n }\n }, []);\n\n return { isBusy, isRunning, isSubmitting, send, resetBusy };\n}\n\nexport function ComposerBusyProvider({ children }: { children: ReactNode }) {\n const value = useComposerBusyStateValue();\n return createElement(ComposerBusyContext.Provider, { value }, children);\n}\n\n/**\n * Optimistic composer busy state shared across the thread. `useThreadIsRunning()`\n * only becomes true once the turn stream starts; this hook flips to busy\n * immediately on submit so the send button shows loading before session setup /\n * turn API work finishes.\n *\n * Must be used within `<ComposerBusyProvider>` (wired by default in `<Thread />`).\n */\nexport function useComposerBusyState(): ComposerBusyState {\n const value = useContext(ComposerBusyContext);\n if (value == null) {\n throw new Error('useComposerBusyState must be used within ComposerBusyProvider');\n }\n return value;\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 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 loadMoreInflightRef = useRef(false);\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 // Scroll-driven pagination only — never auto-chain pages while the sentinel\n // is visible on mount (that drained every listSessions page).\n useEffect(() => {\n if (isIdle) return;\n const viewport = viewportRef.current;\n if (!viewport) return;\n\n let cancelled = false;\n let chainRaf = 0;\n\n const tryLoadMore = () => {\n if (cancelled || !hasMoreRef.current || loadMoreInflightRef.current) return;\n // Require a real scroll so a short first page does not fill-drain the cursor.\n if (viewport.scrollTop <= 0) return;\n const remaining = viewport.scrollHeight - viewport.scrollTop - viewport.clientHeight;\n if (remaining > LOAD_MORE_BOTTOM_PX) return;\n\n loadMoreInflightRef.current = true;\n void Promise.resolve(auiRef.current.threads().loadMore()).finally(() => {\n loadMoreInflightRef.current = false;\n if (cancelled) return;\n // Still glued to the bottom after append → fetch the next page.\n chainRaf = requestAnimationFrame(() => tryLoadMore());\n });\n };\n\n viewport.addEventListener('scroll', tryLoadMore, { passive: true });\n return () => {\n cancelled = true;\n cancelAnimationFrame(chainRaf);\n viewport.removeEventListener('scroll', tryLoadMore);\n };\n }, [isIdle]);\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","useThreadIsRunning","createContext","useCallback","useContext","useEffect","useState","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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/icons/Icon.tsx","../src/icons/IconRegistry.tsx","../src/atoms/primitives/Spinner.tsx","../src/atoms/lib/buttonClasses.ts","../src/server/ServerContext.tsx","../src/server/ShellModeContext.tsx","../src/utils/getErrorMessage.ts","../src/atoms/lib/CompactLayoutContext.tsx","../src/atoms/draft/DraftCatalogProvider.tsx"],"sourcesContent":["import { createElement, isValidElement, useContext, type CSSProperties, type ReactNode } from 'react';\n\nimport { cn } from '../atoms/lib/cn.js';\nimport { ThemeContext } from '../theme/ThemeProvider.js';\nimport type { IconComponent, IconEntry, IconProps as ThemeIconProps } from '../theme/types.js';\nimport { lookupIcon, resolveIconName } from './IconRegistry.js';\n\nexport type IconProps = ThemeIconProps & {\n name: string | readonly string[];\n};\n\ntype IconRenderProps = {\n className?: string;\n style?: CSSProperties;\n size?: string | number;\n width?: string | number;\n height?: string | number;\n role?: string;\n} & Pick<IconProps, 'aria-hidden' | 'aria-label' | 'data-testid'>;\n\nfunction isComponent(entry: IconEntry): entry is IconComponent {\n if (typeof entry === 'function') return true;\n // Lucide (and other) icons are forwardRef objects, not functions\n return (\n typeof entry === 'object' &&\n entry !== null &&\n !isValidElement(entry) &&\n !Array.isArray(entry) &&\n '$$typeof' in entry\n );\n}\n\nfunction renderEntry(entry: IconEntry, props: IconRenderProps): ReactNode {\n if (isComponent(entry)) {\n const { size, className, style, ...aria } = props;\n return createElement(entry, {\n className: cn('inline-block shrink-0', className),\n style,\n size,\n width: size,\n height: size,\n 'aria-hidden': aria['aria-label'] ? undefined : (aria['aria-hidden'] ?? true),\n 'aria-label': aria['aria-label'],\n ...(aria['data-testid'] === undefined ? {} : { 'data-testid': aria['data-testid'] }),\n role: aria['aria-label'] ? 'img' : undefined,\n });\n }\n return entry;\n}\n\nexport function Icon({ name, className, style, size = '1em', ...aria }: IconProps) {\n const themeIcons = useContext(ThemeContext)?.icons;\n const resolved = resolveIconName(name);\n const entry = lookupIcon(resolved, themeIcons);\n if (!entry) return null;\n return <>{renderEntry(entry, { className, style, size, ...aria })}</>;\n}\n\nexport function useIcon(name: string | readonly string[]): IconEntry | undefined {\n const themeIcons = useContext(ThemeContext)?.icons;\n return lookupIcon(resolveIconName(name), themeIcons);\n}\n","import {\n Archive,\n ArrowDown,\n ArrowLeft,\n ArrowUp,\n Bot,\n Box,\n Brain,\n Check,\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n CircleAlert,\n CircleCheck,\n CircleX,\n Clock,\n Code2,\n Copy,\n Cpu,\n Download,\n Ellipsis,\n ExternalLink,\n File,\n Github,\n History,\n Info,\n Lightbulb,\n ListChecks,\n ListFilter,\n ListOrdered,\n Loader2,\n Lock,\n LogOut,\n Maximize2,\n Menu,\n Minimize2,\n Moon,\n PanelLeftClose,\n PanelLeftOpen,\n Paperclip,\n Pencil,\n Play,\n Plug,\n Plus,\n RotateCw,\n Save,\n Search,\n Settings,\n Sparkle,\n SquarePen,\n Sun,\n Terminal,\n Trash2,\n Wrench,\n X,\n} from 'lucide-react';\nimport type { SVGProps } from 'react';\n\nimport type { IconEntry, IconMap } from '../theme/types.js';\n\n/** Lucide `broom` (https://lucide.dev/icons/broom) — not in lucide-react 0.x. */\nfunction Broom({ size = 24, ...props }: SVGProps<SVGSVGElement> & { size?: string | number }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M13.5 10.5 22 2\" />\n <path d=\"M14.734 13.841a2 2 0 00-.314-2.42L12.58 9.58a2 2 0 00-2.421-.314l-7.657 4.461A1 1 0 002.3 15.3l6.403 6.403a1 1 0 001.571-.204z\" />\n <path d=\"m5 18 2-2\" />\n <path d=\"m7.699 10.7 5.602 5.601\" />\n </svg>\n );\n}\n\nconst registry = new Map<string, IconEntry>();\n\nexport function registerIcon(name: string, icon: IconEntry): void {\n registry.set(name, icon);\n}\n\nexport function registerIcons(icons: IconMap): void {\n for (const [name, icon] of Object.entries(icons)) {\n registry.set(name, icon);\n }\n}\n\nexport function getIcon(name: string): IconEntry | undefined {\n return registry.get(name);\n}\n\nexport function resolveIconName(icon: string | readonly string[]): string {\n if (typeof icon === 'string') return icon;\n // e.g. [\"far\", \"clone\"] → \"clone\"\n return icon[icon.length - 1] ?? '';\n}\n\nconst defaults: Record<string, IconEntry> = {\n paperclip: Paperclip,\n 'arrow-up': ArrowUp,\n 'arrow-down': ArrowDown,\n 'arrow-left': ArrowLeft,\n xmark: X,\n check: Check,\n pencil: Pencil,\n play: Play,\n 'square-pen': SquarePen,\n 'rotate-right': RotateCw,\n broom: Broom,\n ellipsis: Ellipsis,\n trash: Trash2,\n 'box-archive': Archive,\n 'clock-rotate-left': History,\n 'circle-exclamation': CircleAlert,\n 'chevron-down': ChevronDown,\n 'chevron-left': ChevronLeft,\n 'chevron-right': ChevronRight,\n loader: Loader2,\n file: File,\n clone: Copy,\n copy: Copy,\n bars: Menu,\n 'panel-left-close': PanelLeftClose,\n 'panel-left-open': PanelLeftOpen,\n plus: Plus,\n sun: Sun,\n moon: Moon,\n settings: Settings,\n 'log-out': LogOut,\n search: Search,\n clock: Clock,\n 'circle-check': CircleCheck,\n 'circle-xmark': CircleX,\n 'oauth-success': CircleCheck,\n 'oauth-error': CircleX,\n 'oauth-loading': Loader2,\n 'welcome-sparkle': Sparkle,\n robot: Bot,\n funnel: ListFilter,\n plug: Plug,\n 'list-check': ListChecks,\n lock: Lock,\n lightbulb: Lightbulb,\n wrench: Wrench,\n cpu: Cpu,\n cube: Box,\n 'list-ol': ListOrdered,\n download: Download,\n save: Save,\n brain: Brain,\n terminal: Terminal,\n code: Code2,\n expand: Maximize2,\n 'expand-alt': Maximize2,\n compress: Minimize2,\n 'external-link': ExternalLink,\n github: Github,\n info: Info,\n};\n\nfor (const [name, icon] of Object.entries(defaults)) {\n registry.set(name, icon);\n}\n\n/** Merge host `theme.icons` over the registry for a single lookup (does not mutate). */\nexport function lookupIcon(name: string, themeIcons?: IconMap): IconEntry | undefined {\n if (themeIcons && name in themeIcons) {\n return themeIcons[name];\n }\n return registry.get(name);\n}\n","import React from 'react';\n\nimport { cn } from '../lib/cn.js';\n\nexport type SpinnerProps = React.SVGProps<SVGSVGElement> & {\n size?: number;\n};\n\nexport function Spinner({ size = 16, className, ...props }: SpinnerProps) {\n const r = (size / 2) * 0.75;\n const cx = size / 2;\n const circumference = 2 * Math.PI * r;\n\n return (\n <svg\n role=\"status\"\n aria-label=\"Loading\"\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n fill=\"none\"\n className={cn('animate-spin', className)}\n {...props}\n >\n <circle\n cx={cx}\n cy={cx}\n r={r}\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeDasharray={`${circumference * 0.75} ${circumference * 0.25}`}\n opacity={0.8}\n />\n </svg>\n );\n}\n","import { cn } from './cn.js';\n\nexport type AuiButtonVariant = 'default' | 'secondary' | 'ghost' | 'destructive' | 'outline';\nexport type AuiButtonSize = 'default' | 'sm' | 'lg' | 'icon';\n\nconst variantClasses: Record<AuiButtonVariant, string> = {\n default: 'bg-primary-button-bg text-primary-button-text shadow hover:bg-primary-button-hover',\n secondary:\n 'border border-input-border bg-secondary-button-bg text-secondary-button-text shadow-sm hover:bg-secondary-button-hover',\n ghost: 'bg-ghost-button-bg text-ghost-button-text hover:bg-ghost-button-hover',\n destructive: 'bg-failure-bg text-failure-text shadow-sm hover:bg-failure-bg/90',\n outline:\n 'border border-input-border bg-secondary-button-bg text-secondary-button-text shadow-sm hover:bg-secondary-button-hover',\n};\n\nconst sizeClasses: Record<AuiButtonSize, string> = {\n default: 'h-9 px-4 py-2 text-sm',\n sm: 'h-8 rounded-md px-3 text-xs',\n lg: 'h-10 rounded-md px-8 text-base',\n icon: 'h-8 w-8',\n};\n\nconst baseClasses =\n 'inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-focus-ring disabled:cursor-not-allowed disabled:opacity-50';\n\n/** Shared Button / native `<button>` className helper (SDK utilities are layered). */\nexport function auiButtonClass({\n variant = 'default',\n size = 'default',\n className,\n}: {\n variant?: AuiButtonVariant;\n size?: AuiButtonSize;\n className?: string;\n} = {}): string {\n return cn(baseClasses, variantClasses[variant], sizeClasses[size], className);\n}\n","'use client';\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\n\nimport type { AgentBuilderCapabilitiesResponse, AgentUIServer, CatalogServer } from './types.js';\n\nconst ServerContext = createContext<AgentUIServer | null>(null);\nconst ServerCapabilitiesContext = createContext<{\n capabilities: AgentBuilderCapabilitiesResponse['data'] | null;\n refresh: () => void;\n} | null>(null);\n\nexport function ServerProvider({ server, children }: { server: AgentUIServer; children: ReactNode }) {\n const [capabilities, setCapabilities] = useState<AgentBuilderCapabilitiesResponse['data'] | null>(null);\n const cancelActiveRequestRef = useRef<(() => void) | null>(null);\n const refreshCapabilities = useCallback(() => {\n cancelActiveRequestRef.current?.();\n let cancelled = false;\n cancelActiveRequestRef.current = () => {\n cancelled = true;\n };\n void server\n .getCapabilities()\n .then(response => {\n if (!cancelled) setCapabilities(response.data);\n })\n .catch(() => {\n // Preserve the last known capabilities when a refresh fails.\n });\n }, [server]);\n\n useEffect(() => {\n setCapabilities(null);\n refreshCapabilities();\n return () => {\n cancelActiveRequestRef.current?.();\n };\n }, [refreshCapabilities]);\n\n const capabilitiesValue = useMemo(\n () => ({ capabilities, refresh: refreshCapabilities }),\n [capabilities, refreshCapabilities],\n );\n\n return (\n <ServerContext.Provider value={server}>\n <ServerCapabilitiesContext.Provider value={capabilitiesValue}>{children}</ServerCapabilitiesContext.Provider>\n </ServerContext.Provider>\n );\n}\n\nexport function useServer(): AgentUIServer {\n const server = useContext(ServerContext);\n if (server == null) {\n throw new Error('useServer must be used within a ServerProvider.');\n }\n return server;\n}\n\nexport function useOptionalServer(): AgentUIServer | null {\n return useContext(ServerContext);\n}\n\nexport function useServerCapabilities(): AgentBuilderCapabilitiesResponse['data'] | null {\n return useContext(ServerCapabilitiesContext)?.capabilities ?? null;\n}\n\nexport function useOptionalRefreshServerCapabilities(): (() => void) | null {\n return useContext(ServerCapabilitiesContext)?.refresh ?? null;\n}\n\nexport function useCatalogServer(): CatalogServer {\n const server = useServer();\n if (server.catalog == null) {\n throw new Error('useCatalogServer requires AgentUIServer.catalog. Pass catalog to createTrueFoundryServer.');\n }\n return server.catalog;\n}\n\nexport function useOptionalCatalogServer(): CatalogServer | null {\n return useOptionalServer()?.catalog ?? null;\n}\n","'use client';\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\n\nimport { useOptionalRefreshServerCapabilities, useServerCapabilities } from './ServerContext.js';\nimport type { AgentLibraryEntry, AgentSpec } from './types.js';\n\n/** Host-facing shell configuration for agent / library / composer chrome. */\nexport type AgentConfig =\n | { mode: 'SingleAgent'; name: string }\n | { mode: 'AgentLibrary' }\n | { mode: 'AgentComposer'; defaultAgentSpec?: AgentSpec }\n | { mode: 'AgentLibraryWithComposer'; defaultAgentSpec?: AgentSpec };\n\nexport const DEFAULT_AGENT_CONFIG: AgentConfig = {\n mode: 'AgentLibraryWithComposer',\n};\n\n/**\n * Active chat binding. Mutability (`isMutable`) decides composer / Save / updateSession —\n * not a parallel draft|named shell type.\n */\nexport type ShellMode =\n | { status: 'idle' }\n | {\n status: 'active';\n isMutable: boolean;\n /** Identity for immutable bind + history filter. */\n agentId?: string;\n /** Display / welcome label (often same as agentId). */\n agentName?: string;\n /** Seed for mutable (draft) runtime. */\n agentSpec?: AgentSpec;\n locked: boolean;\n };\n\n/** Library / New Chat create intent. */\nexport type SelectLibraryAgentRequest = {\n isMutable: boolean;\n agentId?: string;\n agentName?: string;\n agentSpec?: AgentSpec;\n};\n\nexport type SettingsSection = 'models' | 'connectors' | 'skills' | 'sandbox';\n\ntype ShellModeContextValue = {\n mode: ShellMode;\n /** Host agentConfig mode (capabilities source). */\n agentConfigMode: AgentConfig['mode'];\n /** Agents Library chrome. */\n isLibraryEnabled: boolean;\n /** Mutable composer / Save Agent chrome (host capability). */\n isComposerEnabled: boolean;\n /** Sidebar / list New Chat control. */\n isNewChatEnabled: boolean;\n settingsOpen: boolean;\n settingsSection: SettingsSection;\n setSettingsOpen: (open: boolean, section?: SettingsSection) => void;\n /**\n * Bind from the Agents Library (Try = immutable, Edit = mutable + agentSpec).\n * Prefer this over `selectAgent` / `openDraft` when both fields are available.\n */\n selectLibraryAgent: (req: SelectLibraryAgentRequest) => void;\n /**\n * Attach identity + agentSpec to the *current* mutable chat without remounting.\n * Used after `saveAgent` so the same draft session continues as an editable agent.\n */\n bindMutableAgent: (req: { agentId: string; agentName: string; agentSpec: AgentSpec }) => void;\n /** @deprecated Prefer `selectLibraryAgent({ isMutable: false, agentName })`. */\n selectAgent: (agentName: string) => void;\n /** @deprecated Prefer `selectLibraryAgent({ isMutable: true, agentSpec })`. */\n openDraft: () => void;\n /**\n * Open a history session, remounting when mutability/identity changes.\n * Prefer explicit `isMutable` from the session row; when omitted, agentName\n * present → immutable and agentName absent → mutable. Immutable rows may omit\n * `agentName` when the registry agent was deleted.\n */\n openHistorySession: (req: { sessionId: string; agentName?: string; isMutable?: boolean }) => void;\n /** Reset current chat; no-op when idle. */\n clearChat: () => void;\n /** Remount key for the chat runtime when binding changes. */\n runtimeKey: string;\n /**\n * History list filter forwarded as `listSessions({ agentId })`.\n * `null` = All chats. Only meaningful when `isLibraryEnabled`.\n */\n historyAgentFilter: string | null;\n setHistoryAgentFilter: (agentId: string | null) => void;\n /** Effective `listSessionsAgentId` for the runtime (SingleAgent locks to name). */\n listSessionsAgentId: string | undefined;\n /** Session to open after a binding remount (history click across mutability). */\n pendingSessionId: string | undefined;\n /**\n * Bumped when the Agents Library catalog may have changed (e.g. after saveAgent).\n * Library chrome should re-fetch when this changes.\n */\n agentsListEpoch: number;\n invalidateAgentsList: () => void;\n};\n\nconst ShellModeContext = createContext<ShellModeContextValue | null>(null);\n\nconst FALLBACK_MUTABLE_SPEC: AgentSpec = {\n model: { name: 'openai-main/gpt-4.1' },\n};\n\nfunction mutableSeedFromConfig(config: AgentConfig): AgentSpec {\n if (config.mode === 'AgentComposer' || config.mode === 'AgentLibraryWithComposer') {\n return config.defaultAgentSpec ?? FALLBACK_MUTABLE_SPEC;\n }\n return FALLBACK_MUTABLE_SPEC;\n}\n\nfunction initialMode(config: AgentConfig, mutableSeed: AgentSpec): ShellMode {\n switch (config.mode) {\n case 'SingleAgent':\n return {\n status: 'active',\n isMutable: false,\n agentId: config.name,\n agentName: config.name,\n locked: true,\n };\n case 'AgentLibrary':\n return { status: 'idle' };\n case 'AgentComposer':\n case 'AgentLibraryWithComposer':\n return {\n status: 'active',\n isMutable: true,\n agentSpec: mutableSeed,\n locked: false,\n };\n }\n}\n\nfunction libraryAgentId(agent: Pick<AgentLibraryEntry, 'agentId' | 'name'>): string {\n return agent.agentId ?? agent.name;\n}\n\nexport function ShellModeProvider({\n agentConfig = DEFAULT_AGENT_CONFIG,\n initialSettingsOpen = false,\n children,\n}: {\n agentConfig?: AgentConfig;\n /** Open settings on first paint (e.g. host boot with no models). Does not re-open later. */\n initialSettingsOpen?: boolean;\n children: ReactNode;\n}) {\n const capabilities = useServerCapabilities();\n const refreshCapabilities = useOptionalRefreshServerCapabilities();\n const mutableSeedRef = useRef(mutableSeedFromConfig(agentConfig));\n if (\n (agentConfig.mode === 'AgentComposer' || agentConfig.mode === 'AgentLibraryWithComposer') &&\n agentConfig.defaultAgentSpec != null\n ) {\n mutableSeedRef.current = agentConfig.defaultAgentSpec;\n }\n const mutableSeed = mutableSeedRef.current;\n\n const isLibraryEnabled = agentConfig.mode === 'AgentLibrary' || agentConfig.mode === 'AgentLibraryWithComposer';\n const isComposerEnabled = agentConfig.mode === 'AgentComposer' || agentConfig.mode === 'AgentLibraryWithComposer';\n const isNewChatEnabled = agentConfig.mode !== 'AgentLibrary';\n const locked = agentConfig.mode === 'SingleAgent';\n\n const [mode, setMode] = useState<ShellMode>(() => initialMode(agentConfig, mutableSeed));\n const [mutableEpoch, setMutableEpoch] = useState(0);\n const [clearEpoch, setClearEpoch] = useState(0);\n const [agentsListEpoch, setAgentsListEpoch] = useState(0);\n const [settingsOpenState, setSettingsOpenState] = useState(initialSettingsOpen);\n const [settingsSection, setSettingsSection] = useState<SettingsSection>('models');\n const [historyAgentFilter, setHistoryAgentFilter] = useState<string | null>(null);\n const [pendingSessionId, setPendingSessionId] = useState<string | undefined>(undefined);\n const settingsEnabled = capabilities?.settings?.enabled !== false;\n const settingsOpen = settingsEnabled && settingsOpenState;\n const setSettingsOpen = useCallback(\n (open: boolean, section?: SettingsSection) => {\n if (section !== undefined) {\n setSettingsSection(section);\n }\n setSettingsOpenState(settingsEnabled && open);\n },\n [settingsEnabled],\n );\n\n useEffect(() => {\n if (!settingsEnabled) {\n setSettingsOpenState(false);\n }\n }, [settingsEnabled]);\n\n const invalidateAgentsList = useCallback(() => {\n setAgentsListEpoch(n => n + 1);\n }, []);\n\n const lockedAgentName = agentConfig.mode === 'SingleAgent' ? agentConfig.name : '';\n const effectiveMode: ShellMode = useMemo(() => {\n if (!locked) return mode;\n return {\n status: 'active',\n isMutable: false,\n agentId: lockedAgentName,\n agentName: lockedAgentName,\n locked: true,\n };\n }, [locked, lockedAgentName, mode]);\n\n const listSessionsAgentId = useMemo(() => {\n if (locked) return lockedAgentName;\n if (!isLibraryEnabled) return undefined;\n return historyAgentFilter ?? undefined;\n }, [locked, lockedAgentName, isLibraryEnabled, historyAgentFilter]);\n\n const bumpEpoch = useCallback((isMutable: boolean) => {\n if (isMutable) setMutableEpoch(n => n + 1);\n else setClearEpoch(n => n + 1);\n }, []);\n\n const selectLibraryAgent = useCallback(\n (req: SelectLibraryAgentRequest) => {\n if (req.isMutable) {\n if (!isComposerEnabled) return;\n setSettingsOpen(false);\n setPendingSessionId(undefined);\n setMode({\n status: 'active',\n isMutable: true,\n agentId: req.agentId,\n agentName: req.agentName,\n agentSpec: req.agentSpec ?? mutableSeedRef.current,\n locked: false,\n });\n bumpEpoch(true);\n return;\n }\n if (!isLibraryEnabled) return;\n const agentName = req.agentName ?? req.agentId;\n if (agentName == null) return;\n setSettingsOpen(false);\n setPendingSessionId(undefined);\n setMode({\n status: 'active',\n isMutable: false,\n agentId: req.agentId ?? agentName,\n agentName,\n locked: false,\n });\n bumpEpoch(false);\n },\n [isComposerEnabled, isLibraryEnabled, bumpEpoch, setSettingsOpen],\n );\n\n const bindMutableAgent = useCallback(\n (req: { agentId: string; agentName: string; agentSpec: AgentSpec }) => {\n if (!isComposerEnabled) return;\n setMode(prev => {\n if (prev.status !== 'active' || !prev.isMutable) return prev;\n return {\n status: 'active',\n isMutable: true,\n agentId: req.agentId,\n agentName: req.agentName,\n agentSpec: req.agentSpec,\n locked: false,\n };\n });\n },\n [isComposerEnabled],\n );\n\n const selectAgent = useCallback(\n (name: string) => {\n selectLibraryAgent({ isMutable: false, agentId: name, agentName: name });\n },\n [selectLibraryAgent],\n );\n\n const openDraft = useCallback(() => {\n if (!isComposerEnabled) return;\n refreshCapabilities?.();\n selectLibraryAgent({ isMutable: true, agentSpec: mutableSeedRef.current });\n }, [isComposerEnabled, refreshCapabilities, selectLibraryAgent]);\n\n const openHistorySession = useCallback(\n ({\n sessionId,\n agentName,\n isMutable: isMutableOpt,\n }: {\n sessionId: string;\n agentName?: string;\n isMutable?: boolean;\n }) => {\n setSettingsOpen(false);\n setPendingSessionId(sessionId);\n const isMutable = isMutableOpt ?? agentName == null;\n if (isMutable) {\n if (!isComposerEnabled) return;\n setMode({\n status: 'active',\n isMutable: true,\n agentSpec: mutableSeedRef.current,\n locked: false,\n });\n bumpEpoch(true);\n return;\n }\n // Immutable: allow orphaned refs (deleted agent → no agentName).\n if (locked) {\n if (agentName == null || lockedAgentName !== agentName) return;\n } else if (!isLibraryEnabled) {\n return;\n }\n setMode({\n status: 'active',\n isMutable: false,\n locked: false,\n ...(agentName != null ? { agentId: agentName, agentName } : {}),\n });\n bumpEpoch(false);\n },\n [isLibraryEnabled, isComposerEnabled, locked, lockedAgentName, bumpEpoch, setSettingsOpen],\n );\n\n const clearChat = useCallback(() => {\n if (effectiveMode.status === 'idle') return;\n setPendingSessionId(undefined);\n if (effectiveMode.isMutable) {\n // Preserve Edit binding (name + seeded spec); blank drafts fall back to host seed.\n setMode({\n status: 'active',\n isMutable: true,\n agentId: effectiveMode.agentId,\n agentName: effectiveMode.agentName,\n agentSpec: effectiveMode.agentSpec ?? mutableSeedRef.current,\n locked: false,\n });\n bumpEpoch(true);\n return;\n }\n bumpEpoch(false);\n }, [effectiveMode, bumpEpoch]);\n\n // Mutable remounts are driven only by mutableEpoch (library Edit / New Chat / Clear).\n // Agent id and model must not be in the key — saveAgent binds those onto the same draft.\n const runtimeKey = useMemo(() => {\n if (effectiveMode.status === 'idle') return 'idle';\n if (effectiveMode.isMutable) {\n return `mut:${pendingSessionId ?? ''}:${mutableEpoch}`;\n }\n const id = effectiveMode.agentId ?? effectiveMode.agentName ?? '';\n return `immut:${id}:${pendingSessionId ?? ''}:${clearEpoch}`;\n }, [effectiveMode, mutableEpoch, clearEpoch, pendingSessionId]);\n\n const value = useMemo<ShellModeContextValue>(\n () => ({\n mode: effectiveMode,\n agentConfigMode: agentConfig.mode,\n isLibraryEnabled,\n isComposerEnabled,\n isNewChatEnabled,\n settingsOpen,\n settingsSection,\n setSettingsOpen,\n selectLibraryAgent,\n bindMutableAgent,\n selectAgent,\n openDraft,\n openHistorySession,\n clearChat,\n runtimeKey,\n historyAgentFilter,\n setHistoryAgentFilter,\n listSessionsAgentId,\n pendingSessionId,\n agentsListEpoch,\n invalidateAgentsList,\n }),\n [\n effectiveMode,\n agentConfig.mode,\n isLibraryEnabled,\n isComposerEnabled,\n isNewChatEnabled,\n settingsOpen,\n settingsSection,\n setSettingsOpen,\n selectLibraryAgent,\n bindMutableAgent,\n selectAgent,\n openDraft,\n openHistorySession,\n clearChat,\n runtimeKey,\n historyAgentFilter,\n listSessionsAgentId,\n pendingSessionId,\n agentsListEpoch,\n invalidateAgentsList,\n ],\n );\n\n return <ShellModeContext.Provider value={value}>{children}</ShellModeContext.Provider>;\n}\n\nexport function useShellMode(): ShellModeContextValue {\n const ctx = useContext(ShellModeContext);\n if (ctx == null) {\n throw new Error('useShellMode must be used within a ShellModeProvider.');\n }\n return ctx;\n}\n\nexport function useOptionalShellMode(): ShellModeContextValue | null {\n return useContext(ShellModeContext);\n}\n\n/** True when the shell is bound to a mutable (editable) agentSpec. */\nexport function shellIsMutable(mode: ShellMode): boolean {\n return mode.status === 'active' && mode.isMutable;\n}\n\nexport { libraryAgentId };\n","function isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object';\n}\n\nfunction readNonEmptyString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() !== '' ? value : undefined;\n}\n\n/**\n * Reads a display string from API-shaped errors: `message`, then nested\n * `error.message`. When neither exists, stringifies the value.\n */\nfunction messageFromErrorShaped(value: unknown): string | undefined {\n if (!isRecord(value)) return undefined;\n const direct = readNonEmptyString(value.message);\n if (direct != null) return direct;\n if (isRecord(value.error)) {\n return readNonEmptyString(value.error.message);\n }\n return undefined;\n}\n\nfunction stringifyError(error: unknown): string {\n if (typeof error === 'string') return error;\n if (isRecord(error)) {\n try {\n return JSON.stringify(error);\n } catch {\n return Object.prototype.toString.call(error);\n }\n }\n return String(error);\n}\n\n/**\n * User-facing error text. Prefers HTTP body `{ error: { message } }` when\n * present (e.g. TrueForgeError), then `error.message` / `error.error.message`,\n * then `fallback`, then a string form of the value.\n */\nexport function getErrorMessage(error: unknown, fallback?: string): string {\n if (typeof error === 'string') {\n const trimmed = error.trim();\n if (trimmed !== '') return error;\n return fallback ?? error;\n }\n\n if (isRecord(error) && 'body' in error) {\n const fromBody = messageFromErrorShaped(error.body);\n if (fromBody != null) return fromBody;\n if (error.body != null) {\n if (typeof error.body === 'string') {\n const trimmed = error.body.trim();\n if (trimmed !== '') return error.body;\n } else {\n return stringifyError(error.body);\n }\n }\n }\n\n const fromShape = messageFromErrorShaped(error);\n if (fromShape != null) return fromShape;\n\n if (fallback != null) return fallback;\n return stringifyError(error);\n}\n","'use client';\n\nimport { createContext, useContext, type ReactNode } from 'react';\n\nconst CompactLayoutContext = createContext(false);\n\nexport function CompactLayoutProvider({ children }: { children: ReactNode }) {\n return <CompactLayoutContext.Provider value>{children}</CompactLayoutContext.Provider>;\n}\n\nexport function useCompactLayout() {\n return useContext(CompactLayoutContext);\n}\n","'use client';\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode } from 'react';\n\nimport { useOptionalServer } from '../../server/ServerContext.js';\nimport type { AgentSkill, AgentUIServer, ConnectorState, ModelSelection } from '../../server/types.js';\nimport { getErrorMessage } from '../../utils/getErrorMessage.js';\n\ntype DraftCatalogValue = {\n models: ModelSelection[];\n skills: AgentSkill[];\n connectors: ConnectorState[];\n loading: boolean;\n error: string | null;\n /** Kick off catalog fetch (idempotent). Call when a picker opens. */\n ensureLoaded: () => void;\n /** Reload all collections after settings mutate catalog-backed configuration. */\n refresh: () => void;\n /** Refresh connector auth state without reloading unrelated catalogs. */\n refreshConnectors: () => Promise<void>;\n};\n\ntype DraftCatalogContextValue = DraftCatalogValue & {\n server: AgentUIServer | null;\n};\n\nconst DraftCatalogContext = createContext<DraftCatalogContextValue | null>(null);\n\nconst IDLE_ENSURE = () => undefined;\nconst IDLE_REFRESH = async () => undefined;\n\nexport function DraftCatalogProvider({ children }: { children: ReactNode }) {\n const server = useOptionalServer();\n const existing = useContext(DraftCatalogContext);\n if (existing?.server === server) {\n return children;\n }\n return <DraftCatalogStore server={server}>{children}</DraftCatalogStore>;\n}\n\nfunction DraftCatalogStore({ server, children }: { server: AgentUIServer | null; children: ReactNode }) {\n const [requestEpoch, setRequestEpoch] = useState<number | null>(null);\n const [models, setModels] = useState<ModelSelection[]>([]);\n const [skills, setSkills] = useState<AgentSkill[]>([]);\n const [connectors, setConnectors] = useState<ConnectorState[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const ensureLoaded = useCallback(() => {\n setRequestEpoch(current => current ?? 0);\n }, []);\n\n const refresh = useCallback(() => {\n setRequestEpoch(current => (current ?? -1) + 1);\n }, []);\n\n const refreshConnectors = useCallback(async () => {\n if (!server) return;\n setLoading(true);\n setError(null);\n try {\n const nextConnectors = await server.getMcp();\n setConnectors(nextConnectors);\n } catch (reason: unknown) {\n setError(getErrorMessage(reason, 'Failed to load connectors.'));\n } finally {\n setLoading(false);\n }\n }, [server]);\n\n useEffect(() => {\n if (requestEpoch === null || !server) return;\n let cancelled = false;\n setLoading(true);\n setError(null);\n // Settle each list alone so one failing picker does not blank the others.\n void Promise.allSettled([server.getModels(), server.getSkills(), server.getMcp()])\n .then(([modelsResult, skillsResult, mcpResult]) => {\n if (cancelled) return;\n const errors: string[] = [];\n if (modelsResult.status === 'fulfilled') {\n setModels(modelsResult.value);\n } else {\n errors.push(getErrorMessage(modelsResult.reason, 'Failed to load models.'));\n }\n if (skillsResult.status === 'fulfilled') {\n setSkills(skillsResult.value);\n } else {\n errors.push(getErrorMessage(skillsResult.reason, 'Failed to load skills.'));\n }\n if (mcpResult.status === 'fulfilled') {\n setConnectors(mcpResult.value);\n } else {\n errors.push(getErrorMessage(mcpResult.reason, 'Failed to load connectors.'));\n }\n setError(errors[0] ?? null);\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [requestEpoch, server]);\n\n const value = useMemo(\n () => ({ server, models, skills, connectors, loading, error, ensureLoaded, refresh, refreshConnectors }),\n [server, models, skills, connectors, loading, error, ensureLoaded, refresh, refreshConnectors],\n );\n\n return <DraftCatalogContext.Provider value={value}>{children}</DraftCatalogContext.Provider>;\n}\n\nexport function useDraftCatalog(): DraftCatalogValue {\n const ctx = useContext(DraftCatalogContext);\n if (ctx == null) {\n return {\n models: [],\n skills: [],\n connectors: [],\n loading: false,\n error: null,\n ensureLoaded: IDLE_ENSURE,\n refresh: IDLE_ENSURE,\n refreshConnectors: IDLE_REFRESH,\n };\n }\n return ctx;\n}\n"],"mappings":"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","names":["jsx","jsx","useContext","jsx","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","createContext","useRef","useState","useCallback","useEffect","useMemo","useContext","createContext","useContext","jsx","createContext","useCallback","useContext","useEffect","useMemo","useState","jsx","createContext","useContext","useState","useCallback","useEffect","useMemo"]}
|