@truefoundry/trueforge-ui 0.2.3 → 0.3.0-rc.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 +43 -0
- package/README.md +41 -17
- package/dist/{ConnectorSettings-ODC3LVHN.js → ConnectorSettings-FXQ5B7TN.js} +5 -5
- package/dist/{DockLayout-2RWDSUKE.js → DockLayout-LBNQJZNF.js} +9 -9
- package/dist/{DrawerLayout-CZLJYMIN.js → DrawerLayout-Q6UK4VMI.js} +9 -9
- package/dist/{ModelSettings-CKQ5CVAC.js → ModelSettings-4L4LOQJA.js} +5 -5
- package/dist/OpenUiFenceBlock-6UIIAVBX.js +9 -0
- package/dist/{SandboxSettings-HSCPYUOC.js → SandboxSettings-Z4ZG6ZX4.js} +5 -5
- package/dist/{SettingsBuilder-MYWRFXRI.js → SettingsBuilder-WF7ZWKQW.js} +7 -7
- package/dist/{SidebarLayout-WVY54TGZ.js → SidebarLayout-3WZ3CVON.js} +31 -14
- package/dist/SidebarLayout-3WZ3CVON.js.map +1 -0
- package/dist/{SkillSettings-ECH6SHZ7.js → SkillSettings-3EPPC3IT.js} +5 -5
- package/dist/{TrueForgeUIWithRouter-RKZ2E7PV.js → TrueForgeUIWithRouter-NZ4FGPE4.js} +7 -7
- package/dist/{WidgetLayout-NWWB2SXI.js → WidgetLayout-3QZ357FL.js} +10 -10
- package/dist/{WidgetLayout-NWWB2SXI.js.map → WidgetLayout-3QZ357FL.js.map} +1 -1
- package/dist/chunk-36KOSC2J.js +567 -0
- package/dist/chunk-36KOSC2J.js.map +1 -0
- package/dist/{chunk-HVSUPYX2.js → chunk-3S6KHO7H.js} +311 -238
- package/dist/chunk-3S6KHO7H.js.map +1 -0
- package/dist/{chunk-TCAVLWYL.js → chunk-7L63OK3O.js} +7 -7
- package/dist/{chunk-JRRCAKEP.js → chunk-B52K63AW.js} +2 -2
- package/dist/{chunk-FXCYLEFB.js → chunk-BSIPI3KV.js} +18 -2
- package/dist/chunk-BSIPI3KV.js.map +1 -0
- package/dist/{chunk-IFLE7OMM.js → chunk-FJ5RSSMA.js} +4 -4
- package/dist/{chunk-IFLE7OMM.js.map → chunk-FJ5RSSMA.js.map} +1 -1
- package/dist/{chunk-XRTTKGKN.js → chunk-OSV3HI5M.js} +746 -680
- package/dist/chunk-OSV3HI5M.js.map +1 -0
- package/dist/{chunk-KFUBFJR5.js → chunk-WREC7D54.js} +13 -11
- package/dist/chunk-WREC7D54.js.map +1 -0
- package/dist/{chunk-OZTNBS6V.js → chunk-ZXOADNF3.js} +4 -4
- package/dist/index.d.ts +179 -121
- package/dist/index.js +17 -9
- package/dist/index.js.map +1 -1
- package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +1 -5
- package/dist/plugins/trueforge-agent-server-adapter/index.js +3 -0
- package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +6 -6
- package/dist/OpenUiFenceBlock-3EFPY4JW.js +0 -9
- package/dist/SidebarLayout-WVY54TGZ.js.map +0 -1
- package/dist/chunk-72LC2M3R.js +0 -567
- package/dist/chunk-72LC2M3R.js.map +0 -1
- package/dist/chunk-FXCYLEFB.js.map +0 -1
- package/dist/chunk-HVSUPYX2.js.map +0 -1
- package/dist/chunk-KFUBFJR5.js.map +0 -1
- package/dist/chunk-XRTTKGKN.js.map +0 -1
- /package/dist/{ConnectorSettings-ODC3LVHN.js.map → ConnectorSettings-FXQ5B7TN.js.map} +0 -0
- /package/dist/{DockLayout-2RWDSUKE.js.map → DockLayout-LBNQJZNF.js.map} +0 -0
- /package/dist/{DrawerLayout-CZLJYMIN.js.map → DrawerLayout-Q6UK4VMI.js.map} +0 -0
- /package/dist/{ModelSettings-CKQ5CVAC.js.map → ModelSettings-4L4LOQJA.js.map} +0 -0
- /package/dist/{OpenUiFenceBlock-3EFPY4JW.js.map → OpenUiFenceBlock-6UIIAVBX.js.map} +0 -0
- /package/dist/{SandboxSettings-HSCPYUOC.js.map → SandboxSettings-Z4ZG6ZX4.js.map} +0 -0
- /package/dist/{SettingsBuilder-MYWRFXRI.js.map → SettingsBuilder-WF7ZWKQW.js.map} +0 -0
- /package/dist/{SkillSettings-ECH6SHZ7.js.map → SkillSettings-3EPPC3IT.js.map} +0 -0
- /package/dist/{TrueForgeUIWithRouter-RKZ2E7PV.js.map → TrueForgeUIWithRouter-NZ4FGPE4.js.map} +0 -0
- /package/dist/{chunk-TCAVLWYL.js.map → chunk-7L63OK3O.js.map} +0 -0
- /package/dist/{chunk-JRRCAKEP.js.map → chunk-B52K63AW.js.map} +0 -0
- /package/dist/{chunk-OZTNBS6V.js.map → chunk-ZXOADNF3.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/useComposerBusyState.ts"],"sourcesContent":["'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"],"mappings":";AAEA,SAAS,0BAA0B;AACnC,SAAS,eAAe,eAAe,aAAa,YAAY,WAAW,gBAAgC;AAW3G,IAAM,sBAAsB,cAAwC,IAAI;AAQxE,IAAM,uBAAuB,oBAAI,IAAgB;AAE1C,SAAS,4BAAkC;AAChD,aAAW,YAAY,sBAAsB;AAC3C,aAAS;AAAA,EACX;AACF;AAEA,SAAS,4BAA+C;AACtD,QAAM,YAAY,mBAAmB;AACrC,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AAEtD,YAAU,MAAM;AACd,QAAI,CAAC,WAAW;AACd,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEd,YAAU,MAAM;AACd,UAAM,kBAAkB,MAAM;AAC5B,sBAAgB,KAAK;AAAA,IACvB;AACA,yBAAqB,IAAI,eAAe;AACxC,WAAO,MAAM;AACX,2BAAqB,OAAO,eAAe;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,SAAS,aAAa;AAE5B,QAAM,YAAY,YAAY,MAAM;AAClC,oBAAgB,KAAK;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,QAAM,OAAO,YAAY,CAAC,WAAuC;AAC/D,oBAAgB,IAAI;AACpB,QAAI;AACF,YAAM,SAAS,OAAO;AACtB,UAAI,UAAU,QAAQ,OAAO,OAAO,SAAS,YAAY;AACvD,aAAK,OAAO,MAAM,MAAM;AACtB,0BAAgB,KAAK;AAAA,QACvB,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AACN,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,QAAQ,WAAW,cAAc,MAAM,UAAU;AAC5D;AAEO,SAAS,qBAAqB,EAAE,SAAS,GAA4B;AAC1E,QAAM,QAAQ,0BAA0B;AACxC,SAAO,cAAc,oBAAoB,UAAU,EAAE,MAAM,GAAG,QAAQ;AACxE;AAUO,SAAS,uBAA0C;AACxD,QAAM,QAAQ,WAAW,mBAAmB;AAC5C,MAAI,SAAS,MAAM;AACjB,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACjF;AACA,SAAO;AACT;","names":[]}
|
|
@@ -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/useComposerPauseView.ts","../src/containers/McpAuthContainer.tsx","../src/containers/ComposerContainer.tsx","../src/containers/HistoryLoaderContainer.tsx","../src/containers/ResumeUnavailableContainer.tsx","../src/containers/UserEditComposerContainer.tsx","../src/containers/UserMessageContainer.tsx","../src/containers/ThreadContainer.tsx","../src/hooks/useSyncSessionTitle.ts","../src/utils/isNewChatView.ts","../src/containers/Thread.tsx","../src/containers/ThreadListContainer.tsx","../src/atoms/AgentHistoryFilterButton.tsx","../src/atoms/primitives/DropdownMenu.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState, type PropsWithChildren, type ReactNode } from 'react';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nexport interface AgentStepsContainerProps {\n toolCount: number;\n thinkingCount: number;\n hasFinal: boolean;\n}\n\n/**\n * Container for \"Agent steps\" section — groups reasoning, intermediate text, and tools\n * in a collapsible accordion that auto-collapses once final answer is confirmed.\n */\nexport function AgentStepsContainer({\n children,\n toolCount,\n thinkingCount,\n hasFinal,\n}: PropsWithChildren<AgentStepsContainerProps>) {\n const AgentStepsCard = useSlot('AgentStepsCard');\n\n const [expanded, setExpanded] = useState(true);\n const collapsedByFinal = useRef(false);\n\n // Auto-collapse once when hasFinal becomes true (matches AgentTimeline behavior)\n useEffect(() => {\n if (hasFinal && !collapsedByFinal.current) {\n collapsedByFinal.current = true;\n setExpanded(false);\n }\n }, [hasFinal]);\n\n return (\n <AgentStepsCard\n toolCount={toolCount}\n thinkingCount={thinkingCount}\n expanded={expanded}\n onToggle={() => setExpanded(prev => !prev)}\n >\n {children as ReactNode}\n </AgentStepsCard>\n );\n}\n","'use client';\n\nimport { useThreadIsRunning } from '@assistant-ui/core/react';\nimport { useTrueFoundryToolResponses } from '@truefoundry/assistant-ui-runtime';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n ASK_USER_CUSTOM_OPTION,\n type AskUserAnswerDraft,\n type Question,\n} from '../atoms/adapters/AskUserPromptAdapter.js';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nconst EMPTY_ANSWER: AskUserAnswerDraft = { radioValue: '', custom: '' };\n\nexport function AskUserContainer() {\n const AskUserPrompt = useSlot('AskUserPrompt');\n const { pending, respond } = useTrueFoundryToolResponses();\n const isRunning = useThreadIsRunning();\n const item = pending[0];\n\n const questions = useMemo<Question[]>(\n () =>\n item == null\n ? []\n : [\n {\n id: item.toolCallId,\n question: item.question ?? 'Answer required',\n options: item.options ?? [],\n },\n ],\n [item],\n );\n const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0);\n const [answers, setAnswers] = useState<Record<string, AskUserAnswerDraft>>({});\n\n useEffect(() => {\n setCurrentQuestionIndex(0);\n setAnswers({});\n }, [item?.toolCallId]);\n\n const safeIndex = Math.min(currentQuestionIndex, Math.max(questions.length - 1, 0));\n const currentQuestion = questions[safeIndex];\n const currentAnswer = currentQuestion == null ? EMPTY_ANSWER : (answers[currentQuestion.id] ?? EMPTY_ANSWER);\n const getResponseForQuestion = useCallback(\n (questionId: string) => {\n const answer = answers[questionId] ?? EMPTY_ANSWER;\n return answer.radioValue === ASK_USER_CUSTOM_OPTION ? answer.custom.trim() : answer.radioValue.trim();\n },\n [answers],\n );\n const allQuestionsAnswered = useMemo(\n () => questions.every(question => getResponseForQuestion(question.id)),\n [getResponseForQuestion, questions],\n );\n const selectedResponse =\n currentAnswer.radioValue === ASK_USER_CUSTOM_OPTION ? currentAnswer.custom.trim() : currentAnswer.radioValue.trim();\n const isSubmitDisabled = isRunning || currentQuestion == null || selectedResponse.length === 0;\n const isSubmitAllDisabled = isSubmitDisabled || !allQuestionsAnswered;\n\n const onCurrentAnswerChange = useCallback((questionId: string, update: Partial<AskUserAnswerDraft>) => {\n setAnswers(previous => ({\n ...previous,\n [questionId]: {\n ...(previous[questionId] ?? EMPTY_ANSWER),\n ...update,\n },\n }));\n }, []);\n\n const onSubmit = useCallback(() => {\n if (item == null || !allQuestionsAnswered) return;\n const content = getResponseForQuestion(item.toolCallId);\n if (!content) return;\n respond({ toolCallId: item.toolCallId, content });\n }, [allQuestionsAnswered, getResponseForQuestion, item, respond]);\n\n if (item == null || currentQuestion == null) return null;\n\n return (\n <AskUserPrompt\n questions={questions}\n readOnly={isRunning}\n currentQuestion={currentQuestion}\n currentQuestionIndex={safeIndex}\n currentAnswer={currentAnswer}\n totalQuestions={questions.length}\n isMultiQuestion={questions.length > 1}\n isLastQuestion={safeIndex === questions.length - 1}\n allQuestionsAnswered={allQuestionsAnswered}\n isSubmitDisabled={isSubmitDisabled}\n isSubmitAllDisabled={isSubmitAllDisabled}\n onCurrentQuestionIndexChange={setCurrentQuestionIndex}\n onCurrentAnswerChange={onCurrentAnswerChange}\n onSubmit={onSubmit}\n />\n );\n}\n","import type { PartState } from '@assistant-ui/core/react';\n\nexport type AgentStepPart = {\n type: PartState['type'];\n text?: string;\n};\n\nexport interface AgentStepsSplitResult {\n cutIndex: number;\n hasFinal: boolean;\n toolCount: number;\n thinkingCount: number;\n}\n\nexport function computeAgentStepsSplit(parts: readonly AgentStepPart[], isRunning: boolean): AgentStepsSplitResult {\n const finalTexts: Array<{ index: number; content: string }> = [];\n let cutIdx = parts.length;\n\n for (let i = parts.length - 1; i >= 0; i--) {\n const part = parts[i];\n if (!part) continue;\n\n if (part.type === 'text') {\n const text = part.text ?? '';\n const trimmed = text.trim();\n\n if (trimmed) {\n finalTexts.unshift({ index: i, content: text });\n cutIdx = i;\n } else {\n cutIdx = i;\n }\n } else {\n break;\n }\n }\n\n const trailingChars = finalTexts.reduce((sum, t) => sum + t.content.length, 0);\n\n // Only apply the 500-char holdback when there are actual agent steps (tool calls or\n // reasoning) before the text. For pure-text responses the text is always the final\n // answer and must stream directly, not be hidden inside the \"Agent steps\" accordion.\n const hasAgentStepsBeforeCut = parts.slice(0, cutIdx).some(p => p.type === 'tool-call' || p.type === 'reasoning');\n\n const finalConfirmed = finalTexts.length > 0 && (!isRunning || trailingChars >= 500 || !hasAgentStepsBeforeCut);\n\n const actualCutIndex = finalConfirmed ? cutIdx : parts.length;\n\n let toolCount = 0;\n let thinkingCount = 0;\n for (let i = 0; i < actualCutIndex; i++) {\n const part = parts[i];\n if (!part) continue;\n\n if (part.type === 'tool-call') {\n toolCount++;\n } else if (part.type === 'reasoning') {\n thinkingCount++;\n }\n }\n\n return {\n cutIndex: actualCutIndex,\n hasFinal: finalConfirmed,\n toolCount,\n thinkingCount,\n };\n}\n","'use client';\n\nimport {\n useAuiState,\n useSmooth,\n type MessagePartState,\n type ReasoningMessagePart,\n type TextMessagePart,\n} from '@assistant-ui/react';\nimport { useTrueFoundryDownloadSandboxFile } from '@truefoundry/assistant-ui-runtime';\nimport { useCallback, useMemo, useRef } from 'react';\n\nimport { MARKDOWN_SMOOTH_BACKLOG_CHARS, useThrottledMarkdownText } from '../hooks/useThrottledMarkdownText.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport { useToasterOptional } from './ToasterContainer.js';\n\nfunction filenameFromPath(path: string): string {\n return path.split('/').pop() || 'download';\n}\n\nfunction triggerBrowserDownload(blob: Blob, filename: string) {\n if (typeof document === 'undefined') return;\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n\nexport function AssistantTextContainer() {\n const Markdown = useSlot('Markdown');\n const toaster = useToasterOptional();\n const downloadSandboxFile = useTrueFoundryDownloadSandboxFile();\n // The download closure changes as the turn streams; a ref keeps onDownloadArtifact stable so\n // OpenUI does not remount.\n const downloadRef = useRef({ downloadSandboxFile, toaster });\n downloadRef.current = { downloadSandboxFile, toaster };\n const partState = useAuiState(s => s.part as MessagePartState & (TextMessagePart | ReasoningMessagePart));\n\n // Preserve the typewriter effect while it keeps pace. If its visible prefix falls too far\n // behind the raw stream, latch this part into bounded latest-prefix snapshots instead of\n // animating an ever-growing queue. We intentionally do not re-enable useSmooth for this part:\n // its private cursor still points at the old prefix and could visibly rewind the message.\n const pacedModeRef = useRef(false);\n const smoothedPart = useSmooth(\n partState,\n pacedModeRef.current\n ? false\n : {\n drainMs: 150,\n maxCharIntervalMs: 4,\n maxCharsPerFrame: 128,\n minCommitMs: 48,\n },\n );\n\n const networkComplete = partState.status?.type !== 'running';\n const smoothLag = partState.text.length - smoothedPart.text.length;\n if (!pacedModeRef.current && !networkComplete && smoothLag >= MARKDOWN_SMOOTH_BACKLOG_CHARS) {\n pacedModeRef.current = true;\n }\n const usePacedMode = pacedModeRef.current;\n\n const pacedText = useThrottledMarkdownText(partState.text, {\n enabled: usePacedMode,\n isComplete: networkComplete,\n });\n\n const text = usePacedMode ? pacedText : smoothedPart.text;\n // true while network stream is active OR while reveal/paced commit is still catching up\n const isStreaming = usePacedMode\n ? !networkComplete || text !== partState.text\n : smoothedPart.status?.type === 'running';\n\n const handleDownloadArtifact = useCallback(async (path: string) => {\n const { downloadSandboxFile, toaster } = downloadRef.current;\n try {\n triggerBrowserDownload(await downloadSandboxFile(path), filenameFromPath(path));\n } catch (error) {\n if (toaster != null) {\n toaster.showError(error);\n } else {\n console.error('Failed to download sandbox artifact', error);\n }\n }\n }, []);\n\n // Skip markdown re-parse when a raw SSE tick did not advance the committed display text.\n return useMemo(\n () => <Markdown content={text} isStreaming={isStreaming} onDownloadArtifact={handleDownloadArtifact} />,\n [Markdown, text, isStreaming, handleDownloadArtifact],\n );\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\n\n/**\n * Maximum tolerated gap between the raw stream and the typewriter reveal.\n * Beyond this point, animating every queued character delays the response noticeably, so the\n * container switches to paced snapshots of the latest raw prefix.\n */\nexport const MARKDOWN_SMOOTH_BACKLOG_CHARS = 4 * 1024;\n\n/**\n * Limits catch-up rendering to roughly 10 updates per second: frequent enough to keep streamed\n * text responsive, while leaving enough main-thread time for full-document Markdown parsing and\n * syntax highlighting to finish before the next snapshot.\n */\nexport const LARGE_MARKDOWN_THROTTLE_MS = 100;\n\n/**\n * Provides bounded latest-prefix snapshots after the typewriter reveal falls too far behind.\n *\n * Enabling the hook immediately catches up to the current raw prefix, then coalesces subsequent\n * stream updates to one commit per `throttleMs`. Completion always bypasses the timer so the final\n * document is exact. While disabled, the hook mirrors `text` and stays ready for a monotonic\n * transition into catch-up mode.\n */\nexport function useThrottledMarkdownText(\n text: string,\n {\n isComplete,\n enabled,\n throttleMs = LARGE_MARKDOWN_THROTTLE_MS,\n }: { isComplete: boolean; enabled: boolean; throttleMs?: number },\n): string {\n const [committed, setCommitted] = useState(text);\n const lastCommittedRef = useRef(text);\n const lastCommitAtRef = useRef(Date.now());\n const pendingRef = useRef(text);\n const wasEnabledRef = useRef(enabled);\n\n useEffect(() => {\n pendingRef.current = text;\n\n const commit = (value: string) => {\n // A stale timer must never replace a newer visible prefix with an older one.\n if (value.length < lastCommittedRef.current.length && value !== lastCommittedRef.current) {\n return;\n }\n lastCommittedRef.current = value;\n lastCommitAtRef.current = Date.now();\n setCommitted(value);\n };\n\n if (!enabled) {\n wasEnabledRef.current = false;\n lastCommittedRef.current = text;\n lastCommitAtRef.current = Date.now();\n setCommitted(text);\n return;\n }\n\n // Clear the accumulated reveal backlog once; only future growth is throttled.\n if (!wasEnabledRef.current) {\n wasEnabledRef.current = true;\n commit(text);\n return;\n }\n\n if (lastCommittedRef.current === text) return;\n\n if (isComplete) {\n commit(text);\n return;\n }\n\n const elapsed = Date.now() - lastCommitAtRef.current;\n if (elapsed >= throttleMs) {\n commit(text);\n return;\n }\n\n const id = setTimeout(() => {\n commit(pendingRef.current);\n }, throttleMs - elapsed);\n return () => clearTimeout(id);\n }, [text, isComplete, enabled, throttleMs]);\n\n return enabled ? committed : text;\n}\n","'use client';\n\nimport { useAuiState } from '@assistant-ui/react';\nimport { useCallback, useRef, useState } from 'react';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport type { ThreadGroupPart } from './ToolGroupContainer.js';\n\nexport function ReasoningContainer({ group }: { group: ThreadGroupPart }) {\n const ReasoningCard = useSlot('ReasoningCard');\n\n const content = useAuiState(s =>\n group.indices\n .map(i => s.message.parts[i])\n .filter((p): p is NonNullable<typeof p> => p != null && p.type === 'reasoning')\n .map(p => (p as { text?: string }).text ?? '')\n .join(''),\n );\n\n const streaming = useAuiState(s => {\n if (s.message.status?.type !== 'running') return false;\n const lastIndex = s.message.parts.length - 1;\n if (lastIndex < 0) return false;\n if (s.message.parts[lastIndex]?.type !== 'reasoning') return false;\n const lastGroupIndex = group.indices[group.indices.length - 1];\n return lastGroupIndex !== undefined && lastIndex >= group.indices[0]! && lastIndex <= lastGroupIndex;\n });\n\n const [expanded, setExpanded] = useState(streaming);\n const [prevStreaming, setPrevStreaming] = useState(streaming);\n const [isMultiLine, setIsMultiLine] = useState(false);\n const observerRef = useRef<ResizeObserver | null>(null);\n if (streaming !== prevStreaming) {\n setPrevStreaming(streaming);\n if (streaming) setExpanded(true);\n }\n\n const contentRef = useCallback(\n (node: HTMLDivElement | null) => {\n observerRef.current?.disconnect();\n observerRef.current = null;\n if (node == null || streaming) return;\n\n const check = () => {\n const lineHeight = Number.parseFloat(getComputedStyle(node).lineHeight) || 24;\n setIsMultiLine(node.scrollHeight > lineHeight * 1.5);\n };\n\n check();\n observerRef.current = new ResizeObserver(check);\n observerRef.current.observe(node);\n },\n [streaming],\n );\n const reasoningTimeText = null;\n const previewText = content.replace(/\\s+/g, ' ').trim();\n const isShortText = !streaming && content.length > 0 && !isMultiLine;\n const headingText = 'Reasoning';\n\n return (\n <ReasoningCard\n content={content}\n isStreaming={streaming}\n expanded={expanded}\n isMultiLine={isMultiLine}\n reasoningTimeText={reasoningTimeText}\n previewText={previewText}\n headingText={headingText}\n contentRef={isShortText ? contentRef : undefined}\n onToggle={() => setExpanded(prev => !prev)}\n />\n );\n}\n","'use client';\n\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { ApprovalOption } from '../atoms/ToolApprovalBar.js';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nexport type ToolApprovalOption = {\n id: string;\n label: string;\n isAllow: boolean;\n grants?: readonly string[];\n confirm?: {\n title?: string;\n description?: string;\n };\n};\n\ntype ToolApprovalContainerProps = {\n toolName?: string;\n options: ToolApprovalOption[];\n onSelectOption: (optionId: string, reason?: string) => void;\n};\n\nexport function ToolApprovalContainer({ toolName = '', options, onSelectOption }: ToolApprovalContainerProps) {\n const ToolApprovalBar = useSlot('ToolApprovalBar');\n const [selectedDenyOptionId, setSelectedDenyOptionId] = useState<string | null>(null);\n const [denialReason, setDenialReason] = useState('');\n const [showReasonError, setShowReasonError] = useState(false);\n const approveOptions = useMemo<ApprovalOption[]>(\n () =>\n options\n .filter(option => option.isAllow)\n .map((option, index) => ({\n ...option,\n variant: index === 0 ? 'primary' : 'secondary',\n requiresReason: false,\n })),\n [options],\n );\n const denyOptions = useMemo<ApprovalOption[]>(\n () =>\n options\n .filter(option => !option.isAllow)\n .map(option => ({\n ...option,\n variant: 'secondary',\n requiresReason: option.confirm != null,\n })),\n [options],\n );\n const selectedDenyOption = denyOptions.find(option => option.id === selectedDenyOptionId);\n\n const onDenyOptionChange = useCallback((optionId: string | null) => {\n setSelectedDenyOptionId(optionId);\n setDenialReason('');\n setShowReasonError(false);\n }, []);\n const onDenialReasonChange = useCallback((reason: string) => {\n setDenialReason(reason);\n setShowReasonError(false);\n }, []);\n const onReasonSubmit = useCallback(() => {\n const reason = denialReason.trim();\n if (!reason) {\n setShowReasonError(true);\n return;\n }\n if (selectedDenyOptionId) {\n onSelectOption(selectedDenyOptionId, reason);\n onDenyOptionChange(null);\n }\n }, [denialReason, onDenyOptionChange, onSelectOption, selectedDenyOptionId]);\n\n return (\n <ToolApprovalBar\n toolName={toolName}\n approveOptions={approveOptions.length > 0 ? approveOptions : undefined}\n denyOptions={denyOptions.length > 0 ? denyOptions : undefined}\n selectedDenyOption={selectedDenyOption}\n denialReason={denialReason}\n showReasonError={showReasonError}\n onSelect={onSelectOption}\n onDenyOptionChange={onDenyOptionChange}\n onDenialReasonChange={onDenialReasonChange}\n onReasonSubmit={onReasonSubmit}\n />\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { ToolCallContentBlockProps } from '../atoms/ToolCallContentBlock.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nexport function ToolCallContentBlockContainer(props: ToolCallContentBlockProps) {\n const ToolCallContentBlock = useSlot('ToolCallContentBlock');\n const { isJson, onContentHeightChange: notifyContentHeightChange, resizable } = props;\n const [fullscreen, setFullscreen] = useState(false);\n const [contentHeightRem, setContentHeightRem] = useState<number>();\n const observerRef = useRef<ResizeObserver | null>(null);\n const contentNodeRef = useRef<HTMLDivElement | null>(null);\n const hasMeasuredRef = useRef(false);\n\n const contentRef = useCallback(\n (node: HTMLDivElement | null) => {\n observerRef.current?.disconnect();\n observerRef.current = null;\n contentNodeRef.current = node;\n hasMeasuredRef.current = false;\n if (node == null) return;\n\n setContentHeightRem(undefined);\n if (!resizable) return;\n\n const updateHeight = () => {\n if (!hasMeasuredRef.current && isJson !== false) return;\n const renderedHeight = node.getBoundingClientRect().height;\n const height = hasMeasuredRef.current && renderedHeight > 0 ? renderedHeight : node.scrollHeight;\n hasMeasuredRef.current = true;\n setContentHeightRem(height / 16);\n };\n updateHeight();\n observerRef.current = new ResizeObserver(updateHeight);\n observerRef.current.observe(node);\n },\n [isJson, resizable],\n );\n\n const onContentHeightChange = useCallback(\n (height: number) => {\n const node = contentNodeRef.current;\n if (node == null) return;\n const renderedHeight = node.getBoundingClientRect().height;\n hasMeasuredRef.current = true;\n setContentHeightRem((renderedHeight > 0 ? renderedHeight : Math.max(height, node.scrollHeight)) / 16);\n notifyContentHeightChange?.(height);\n },\n [notifyContentHeightChange],\n );\n\n useEffect(\n () => () => {\n observerRef.current?.disconnect();\n },\n [],\n );\n\n return (\n <ToolCallContentBlock\n {...props}\n fullscreen={fullscreen}\n onFullscreenChange={setFullscreen}\n contentHeightRem={contentHeightRem}\n contentRef={contentRef}\n onContentHeightChange={onContentHeightChange}\n />\n );\n}\n","'use client';\n\nimport {\n MessagePartPrimitive,\n MessagePrimitive,\n useToolCallElapsed,\n type ToolApprovalResponse,\n type ToolCallMessagePartComponent,\n type ToolCallMessagePartProps,\n} from '@assistant-ui/react';\nimport { useTrueFoundryRespondToToolApproval } from '@truefoundry/assistant-ui-runtime';\nimport { useState } from 'react';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport {\n ASK_USER_TOOL_NAME,\n MCP_META_TOOLS,\n SANDBOX_TOOL_NAMES,\n SUB_AGENT_TOOL_NAME,\n buildApprovalOptions,\n formatDuration,\n getAskUserAnswerResult,\n getJsonDisplayValue,\n getToolResultContent,\n hasPendingAskUserResponse,\n hasPendingToolApproval,\n mcpDisplayName,\n parseAskUserQuestionArgs,\n parseMcpToolArgs,\n parseSandboxArgs,\n parseSandboxResult,\n resolveSubAgentMeta,\n toStatus,\n} from '../utils/toolCallParsing.js';\nimport { AssistantTextContainer } from './AssistantTextContainer.js';\nimport { NestedApprovalBridgeContext, useNestedApprovalBridge } from './nestedApprovalBridge.js';\nimport { SandboxToolCallContainer } from './SandboxToolCallContainer.js';\nimport { ToolApprovalContainer } from './ToolApprovalContainer.js';\nimport { ToolCallContentBlockContainer } from './ToolCallContentBlockContainer.js';\n\nfunction NestedSubAgentAssistantMessage() {\n const AssistantMessageBubble = useSlot('AssistantMessageBubble');\n\n return (\n <div className=\"mb-3 min-w-0\">\n <MessagePrimitive.Root data-role=\"assistant\">\n <AssistantMessageBubble>\n <MessagePrimitive.Parts\n components={{\n Text: AssistantTextContainer,\n Reasoning: AssistantTextContainer,\n tools: { Fallback: ToolCallContainer },\n }}\n />\n </AssistantMessageBubble>\n </MessagePrimitive.Root>\n </div>\n );\n}\n\nfunction ToolApprovalSlot({ part }: { part: ToolCallMessagePartProps }) {\n const isNestedReadonly = useNestedApprovalBridge();\n const respondToNestedApproval = useTrueFoundryRespondToToolApproval();\n\n const respond = (response: ToolApprovalResponse) => {\n if (!isNestedReadonly) {\n part.respondToApproval(response);\n return;\n }\n // Readonly nested thread: use this part's approval id, not the outer\n // create_sub_agent tool (which usually has no approval of its own).\n if (part.approval == null) return;\n\n let approved: boolean | undefined;\n let optionId: string | undefined;\n if ('approved' in response) {\n approved = response.approved;\n } else if ('optionId' in response) {\n const option = buildApprovalOptions(part.approval.options).find(o => o.id === response.optionId);\n if (option == null) return;\n approved = option.isAllow;\n optionId = response.optionId;\n }\n if (approved === undefined) return;\n\n respondToNestedApproval({\n approvalId: part.approval.id,\n approved,\n ...(optionId != null && optionId !== '__allow' && optionId !== '__deny' ? { optionId } : {}),\n ...('reason' in response && response.reason != null ? { reason: response.reason } : {}),\n });\n };\n\n const onSelectOption = (optionId: string, reason?: string) => {\n if (optionId === '__allow') return respond({ approved: true });\n if (optionId === '__deny') return respond({ approved: false, reason });\n return respond({ optionId, reason });\n };\n\n return (\n <ToolApprovalContainer\n toolName={part.toolName}\n options={\n buildApprovalOptions(part.approval?.options) as import('./ToolApprovalContainer.js').ToolApprovalOption[]\n }\n onSelectOption={onSelectOption}\n />\n );\n}\n\nfunction RequestResponseSlots({\n request,\n response,\n}: {\n request: { value: string; isJson: boolean };\n response: { data: string; isJson: boolean };\n}) {\n return {\n requestSlot: request.value ? (\n <ToolCallContentBlockContainer\n title=\"Request\"\n content={request.value}\n isJson={request.isJson}\n maxHeight=\"10.5rem\"\n />\n ) : response.data ? (\n <ToolCallContentBlockContainer title=\"Request\" content=\"{}\" isJson maxHeight=\"10.5rem\" />\n ) : undefined,\n responseSlot: response.data ? (\n <ToolCallContentBlockContainer title=\"Response\" content={response.data} isJson={response.isJson} resizable />\n ) : undefined,\n };\n}\n\nexport const ToolCallContainer: ToolCallMessagePartComponent = part => {\n const ToolCallCard = useSlot('ToolCallCard');\n const SubAgentCard = useSlot('SubAgentCard');\n const AskUserPrompt = useSlot('AskUserPrompt');\n const elapsedMs = useToolCallElapsed();\n const isRequiresAction = part.status?.type === 'requires-action';\n const isSubAgent = part.toolName === SUB_AGENT_TOOL_NAME;\n const isSandbox = SANDBOX_TOOL_NAMES.has(part.toolName);\n const [expanded, setExpanded] = useState(isRequiresAction);\n const [prevRequiresAction, setPrevRequiresAction] = useState(isRequiresAction);\n if (isRequiresAction !== prevRequiresAction) {\n setPrevRequiresAction(isRequiresAction);\n if (isRequiresAction) setExpanded(true);\n }\n\n const showApproval = isRequiresAction && hasPendingToolApproval(part.approval);\n\n const durationText = elapsedMs === undefined ? undefined : formatDuration(elapsedMs);\n const status = toStatus(part.status?.type);\n const onToggle = () => setExpanded(prev => !prev);\n\n if (part.toolName === ASK_USER_TOOL_NAME) {\n if (hasPendingAskUserResponse(part)) {\n return null;\n }\n const answer = getAskUserAnswerResult(part.result);\n if (answer == null) {\n return null;\n }\n const { question, options = [] } = parseAskUserQuestionArgs(part.argsText);\n const isCustom = options.length > 0 && !options.includes(answer);\n return (\n <AskUserPrompt\n questions={[]}\n answeredQuestions={[\n {\n id: part.toolCallId,\n question: question ?? 'Question',\n options,\n answer,\n isCustom,\n },\n ]}\n onSubmit={() => {}}\n readOnly\n />\n );\n }\n\n if (isSubAgent) {\n const { agentName, instruction, stepCount } = resolveSubAgentMeta(part);\n\n return (\n <div data-slot=\"tool-call-card\" data-variant=\"sub-agent\" className=\"w-full\">\n <SubAgentCard\n status={status}\n expanded={expanded}\n onToggle={onToggle}\n durationText={durationText}\n agentName={agentName}\n instruction={instruction}\n stepCount={stepCount}\n >\n <NestedApprovalBridgeContext.Provider value={true}>\n <MessagePartPrimitive.Messages\n components={{\n AssistantMessage: NestedSubAgentAssistantMessage,\n UserMessage: () => null,\n }}\n />\n </NestedApprovalBridgeContext.Provider>\n </SubAgentCard>\n </div>\n );\n }\n\n const resultString =\n part.result === undefined\n ? undefined\n : typeof part.result === 'string'\n ? part.result\n : JSON.stringify(part.result, null, 2);\n\n if (isSandbox) {\n const { command, intent, argsJson } = parseSandboxArgs(part.argsText);\n const { exitCode, resultText, resultJson } = parseSandboxResult(resultString);\n return (\n <SandboxToolCallContainer\n name={part.toolName}\n intent={intent}\n status={status}\n expanded={expanded}\n onToggle={onToggle}\n durationText={durationText}\n command={command}\n exitCode={exitCode}\n argsJson={argsJson}\n resultText={resultText}\n resultJson={resultJson}\n />\n );\n }\n\n if (MCP_META_TOOLS.has(part.toolName)) {\n const { mcpServer, innerToolName, input } = parseMcpToolArgs(part.argsText);\n const argsDisplay = getJsonDisplayValue(part.argsText);\n const resultDisplay = getToolResultContent(part.result);\n\n if (part.toolName === 'list_tools' && mcpServer) {\n const slots = RequestResponseSlots({\n request: argsDisplay,\n response: resultDisplay,\n });\n return (\n <ToolCallCard\n toolName={`Listing tools · ${mcpServer}`}\n icon=\"mcp-server\"\n expanded={expanded}\n onToggle={onToggle}\n awaiting={status === 'running'}\n awaitingText={durationText ?? 'Awaiting Response…'}\n showResponseLine={status !== 'running' && !!resultDisplay.data}\n mcpServerName={mcpServer}\n {...slots}\n />\n );\n }\n\n const inputDisplay = input !== undefined ? getJsonDisplayValue(JSON.stringify(input, null, 2)) : argsDisplay;\n const slots = RequestResponseSlots({\n request: inputDisplay,\n response: resultDisplay,\n });\n\n return (\n <ToolCallCard\n toolName={mcpDisplayName(part.toolName, mcpServer, innerToolName)}\n icon=\"mcp-server\"\n expanded={expanded}\n onToggle={onToggle}\n awaiting={status === 'running'}\n awaitingText={durationText ?? 'Awaiting Response…'}\n showResponseLine={status !== 'running' && resultDisplay.data !== undefined}\n mcpServerName={mcpServer}\n {...slots}\n approvalSlot={showApproval ? <ToolApprovalSlot part={part} /> : undefined}\n />\n );\n }\n\n const argsDisplay = getJsonDisplayValue(part.argsText);\n const resultDisplay = getToolResultContent(part.result);\n const slots = RequestResponseSlots({\n request: argsDisplay,\n response: resultDisplay,\n });\n\n return (\n <ToolCallCard\n toolName={part.toolName}\n expanded={expanded}\n onToggle={onToggle}\n awaiting={status === 'running'}\n awaitingText={durationText ?? 'Awaiting Response…'}\n showResponseLine={status !== 'running' && resultDisplay.data !== undefined}\n {...slots}\n approvalSlot={showApproval ? <ToolApprovalSlot part={part} /> : undefined}\n />\n );\n};\n","import type { ToolApprovalOption as AuiToolApprovalOption, ToolCallMessagePartProps } from '@assistant-ui/react';\nimport { parse as parsePartialJson } from 'partial-json';\n\nimport type { ToolCallStatus } from '../atoms/ToolCallCard.js';\n\nexport type ApprovalOptionView = {\n id: string;\n label: string;\n isAllow: boolean;\n grants?: unknown;\n confirm?: Record<string, unknown>;\n};\n\nexport const SUB_AGENT_TOOL_NAME = 'create_sub_agent';\nexport const ASK_USER_TOOL_NAME = 'ask_user_question';\n\n/** Tool names that should be rendered as a sandbox execution card. */\nexport const SANDBOX_TOOL_NAMES = new Set(['exec', 'sandbox_exec']);\n\n/** MCP meta-tools that wrap actual tool calls. */\nexport const MCP_META_TOOLS = new Set(['call_tool', 'list_tools', 'get_tool_info']);\n\nconst APPROVAL_OPTION_DEFAULT_LABELS: Record<string, string> = {\n 'allow-once': 'Allow',\n 'allow-always': 'Always allow',\n 'reject-once': 'Deny',\n 'reject-always': 'Always deny',\n};\n\nconst isAllowKind = (kind: string) => kind === 'allow-once' || kind === 'allow-always';\n\ntype JsonParseResult = { success: true; value: unknown; isPartial: boolean } | { success: false };\n\nfunction parseJsonIncrementally(content: string): JsonParseResult {\n try {\n return { success: true, value: JSON.parse(content), isPartial: false };\n } catch {\n const trimmed = content.trim();\n if (trimmed[0] !== '{' && trimmed[0] !== '[') return { success: false };\n\n try {\n return { success: true, value: parsePartialJson(content), isPartial: true };\n } catch {\n return { success: false };\n }\n }\n}\n\nfunction isUnknownRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function parseAskUserQuestionArgs(argsText: string | undefined): {\n question?: string;\n options?: string[];\n} {\n if (!argsText) return {};\n try {\n const parsed: unknown = JSON.parse(argsText);\n if (parsed == null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return {};\n }\n const record = parsed as Record<string, unknown>;\n const question = typeof record.question === 'string' ? record.question : undefined;\n const options = Array.isArray(record.options)\n ? record.options.filter((item): item is string => typeof item === 'string')\n : undefined;\n return { question, options };\n } catch {\n return {};\n }\n}\n\nexport function getAskUserAnswerResult(result: unknown): string | undefined {\n if (result === undefined || result === null) return undefined;\n if (typeof result === 'string') {\n const trimmed = result.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n if (typeof result === 'object' && 'content' in result) {\n const content = (result as { content?: unknown }).content;\n if (typeof content === 'string' && content.trim()) {\n return content.trim();\n }\n }\n return undefined;\n}\n\nexport function hasPendingAskUserResponse(part: Pick<ToolCallMessagePartProps, 'interrupt' | 'result'>): boolean {\n return part.interrupt != null && part.result === undefined;\n}\n\nexport function hasPendingToolApproval(\n approval: { approved?: boolean; resolution?: 'cancelled' | 'expired' } | undefined,\n) {\n return approval != null && approval.approved === undefined && approval.resolution === undefined;\n}\n\nexport function buildApprovalOptions(options: readonly AuiToolApprovalOption[] | undefined): ApprovalOptionView[] {\n const declared = options?.filter(o => Object.hasOwn(APPROVAL_OPTION_DEFAULT_LABELS, o.kind));\n if (declared && declared.length > 0) {\n const allow = declared.filter(o => isAllowKind(o.kind));\n const reject = declared.filter(o => !isAllowKind(o.kind));\n const mapped: ApprovalOptionView[] = [...allow, ...reject].map(o => ({\n id: o.id,\n label: o.label ?? APPROVAL_OPTION_DEFAULT_LABELS[o.kind] ?? o.id,\n isAllow: isAllowKind(o.kind),\n grants: o.grants,\n confirm: o.confirm != null ? (typeof o.confirm === 'object' ? o.confirm : {}) : undefined,\n }));\n if (reject.length === 0) {\n mapped.push({ id: '__deny', label: 'Deny', isAllow: false, confirm: {} });\n }\n return mapped;\n }\n return [\n { id: '__allow', label: 'Allow', isAllow: true },\n { id: '__deny', label: 'Deny', isAllow: false, confirm: {} },\n ];\n}\n\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return '<1s';\n const seconds = ms / 1000;\n if (seconds < 10) return `${(Math.floor(seconds * 10) / 10).toFixed(1)}s`;\n if (seconds < 60) return `${Math.floor(seconds)}s`;\n return `${Math.floor(seconds / 60)}m ${Math.floor(seconds % 60)}s`;\n}\n\nexport function toStatus(statusType: string | undefined): ToolCallStatus {\n if (statusType === 'complete') return 'success';\n if (statusType === 'incomplete') return 'error';\n return 'running';\n}\n\nexport function parseSandboxArgs(argsText: string | undefined): {\n command?: string;\n intent?: string;\n argsJson?: string;\n} {\n if (!argsText) return {};\n const parsed = parseJsonIncrementally(argsText);\n if (!parsed.success || !isUnknownRecord(parsed.value)) return { argsJson: argsText };\n\n return {\n command: typeof parsed.value.command === 'string' ? parsed.value.command : undefined,\n intent: typeof parsed.value.intent === 'string' ? parsed.value.intent : undefined,\n argsJson: parsed.isPartial ? argsText : JSON.stringify(parsed.value, null, 2),\n };\n}\n\nexport function parseSandboxResult(result: string | undefined): {\n exitCode?: number | null;\n resultText?: string;\n resultJson?: string;\n} {\n if (result === undefined) return {};\n const parsed = parseJsonIncrementally(result);\n if (!parsed.success || !isUnknownRecord(parsed.value)) return { resultText: result };\n\n const response = isUnknownRecord(parsed.value.response) ? parsed.value.response : undefined;\n const exitCode = typeof response?.exitCode === 'number' ? response.exitCode : null;\n const resultText = typeof response?.result === 'string' ? response.result : undefined;\n return {\n exitCode,\n resultText,\n resultJson: parsed.isPartial ? result : JSON.stringify(parsed.value, null, 2),\n };\n}\n\nexport function parseMcpToolArgs(argsText: string | undefined): {\n mcpServer?: string;\n innerToolName?: string;\n input?: unknown;\n} {\n if (!argsText) return {};\n try {\n const parsed = JSON.parse(argsText) as {\n mcp_server?: string;\n tool_name?: string;\n input?: unknown;\n };\n return {\n mcpServer: parsed.mcp_server,\n innerToolName: parsed.tool_name,\n input: parsed.input,\n };\n } catch {\n return {};\n }\n}\n\nexport function getJsonDisplayValue(content: string | undefined): {\n value: string;\n isJson: boolean;\n} {\n if (!content?.trim()) return { value: '', isJson: false };\n const trimmed = content.trim();\n if (trimmed[0] !== '{' && trimmed[0] !== '[') {\n return { value: content, isJson: false };\n }\n try {\n const parsed: unknown = JSON.parse(content);\n return { value: JSON.stringify(parsed, null, 2), isJson: true };\n } catch {\n return { value: content, isJson: false };\n }\n}\n\nexport function getToolResultContent(content: unknown): {\n data: string;\n isJson: boolean;\n} {\n try {\n if (!content) return { isJson: false, data: '' };\n\n const parsedResult = typeof content === 'string' && content.trim().startsWith('{') ? JSON.parse(content) : content;\n\n if (\n typeof parsedResult === 'object' &&\n parsedResult != null &&\n Array.isArray((parsedResult as { content?: unknown }).content)\n ) {\n const text = (parsedResult as { content: Array<{ text?: unknown }> }).content[0]?.text || '';\n const display = getJsonDisplayValue(typeof text === 'string' ? text : JSON.stringify(text));\n return { data: display.value, isJson: display.isJson };\n }\n const display = getJsonDisplayValue(typeof parsedResult === 'string' ? parsedResult : JSON.stringify(parsedResult));\n return { data: display.value, isJson: display.isJson };\n } catch {\n return { data: String(content), isJson: false };\n }\n}\n\nexport function resolveSubAgentMeta(part: ToolCallMessagePartProps): {\n agentName: string;\n instruction: string;\n stepCount: number;\n} {\n const artifactSubAgent = (\n part as {\n artifact?: {\n subAgents?: Array<{\n title?: string;\n agentInfo?: { name?: string; input?: string };\n }>;\n };\n }\n ).artifact?.subAgents?.[0];\n const firstNested = part.messages?.[0];\n const subAgent = (\n firstNested?.metadata?.custom as { subAgent?: { title?: string; name?: string; input?: string } } | undefined\n )?.subAgent;\n return {\n agentName:\n subAgent?.title ??\n subAgent?.name ??\n artifactSubAgent?.title ??\n artifactSubAgent?.agentInfo?.name ??\n part.toolName,\n instruction: subAgent?.input ?? artifactSubAgent?.agentInfo?.input ?? '',\n stepCount: part.messages?.length ?? 0,\n };\n}\n\nexport function mcpDisplayName(\n toolName: string,\n mcpServer: string | undefined,\n innerToolName: string | undefined,\n): string {\n if (toolName === 'call_tool' && innerToolName) {\n return mcpServer ? `call_tool: ${innerToolName} (${mcpServer})` : `call_tool: ${innerToolName}`;\n }\n if (toolName === 'get_tool_info' && innerToolName && mcpServer) {\n return `get_tool_info: ${innerToolName} (${mcpServer})`;\n }\n return toolName;\n}\n","'use client';\n\nimport { createContext, useContext } from 'react';\n\n/**\n * Sub-agent tool calls render inside a read-only nested thread\n * (`MessagePartPrimitive.Messages`), so `part.respondToApproval` throws.\n * When this flag is set, `ToolApprovalSlot` routes Allow/Deny through\n * `useTrueFoundryRespondToToolApproval()` using the *nested* tool's\n * approval id (not the outer `create_sub_agent` part).\n */\nexport const NestedApprovalBridgeContext = createContext(false);\n\nexport function useNestedApprovalBridge(): boolean {\n return useContext(NestedApprovalBridgeContext);\n}\n","'use client';\n\nimport { useMemo, useState } from 'react';\n\nimport type { SandboxToolCallCardProps } from '../atoms/SandboxToolCallCard.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nexport function SandboxToolCallContainer(\n props: Omit<SandboxToolCallCardProps, 'viewMode' | 'hasContent' | 'onViewModeChange'>,\n) {\n const SandboxToolCallCard = useSlot('SandboxToolCallCard');\n const [viewMode, setViewMode] = useState<'terminal' | 'code'>('terminal');\n const hasContent = useMemo(() => {\n if (viewMode === 'code') return Boolean(props.argsJson || props.resultJson);\n return Boolean(props.command || props.resultText || props.resultJson);\n }, [props.argsJson, props.command, props.resultJson, props.resultText, viewMode]);\n\n return <SandboxToolCallCard {...props} viewMode={viewMode} hasContent={hasContent} onViewModeChange={setViewMode} />;\n}\n","'use client';\n\nimport { useActionBarCopy, useMessageError, useThreadIsRunning, type PartState } from '@assistant-ui/core/react';\nimport { MessagePrimitive, useAuiState, type EnrichedPartState, type GroupByContext } from '@assistant-ui/react';\nimport { useTrueFoundryResumeUnavailable } from '@truefoundry/assistant-ui-runtime';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport { computeAgentStepsSplit } from '../utils/computeAgentStepsSplit.js';\nimport { AgentStepsContainer } from './AgentStepsContainer.js';\nimport { AssistantTextContainer } from './AssistantTextContainer.js';\nimport { MessageImageContainer } from './MessageImageContainer.js';\nimport { ReasoningContainer } from './ReasoningContainer.js';\nimport { ToolCallContainer } from './ToolCallContainer.js';\nimport type { ThreadGroupPart } from './ToolGroupContainer.js';\n\n/**\n * Dispatches a leaf message part to its renderer. \"data\" parts (generative\n * UI) are out of scope for this SDK entirely.\n */\nfunction AssistantLeafPartContainer({ part }: { part: EnrichedPartState }) {\n switch (part.type) {\n case 'text':\n case 'reasoning':\n return <AssistantTextContainer />;\n case 'image':\n return <MessageImageContainer />;\n case 'tool-call':\n return <ToolCallContainer {...part} />;\n default:\n return null;\n }\n}\n\nexport function AssistantMessageContainer() {\n const AssistantMessageBubble = useSlot('AssistantMessageBubble');\n const MessageActionBar = useSlot('MessageActionBar');\n const MessageErrorBanner = useSlot('MessageErrorBanner');\n const MessageIndicator = useSlot('MessageIndicator');\n const isThreadRunning = useThreadIsRunning();\n const resumeUnavailable = useTrueFoundryResumeUnavailable();\n const error = useMessageError();\n const createdAt = useAuiState(s => s.message.createdAt);\n const isMessageRunning = useAuiState(s => s.message.status?.type === 'running');\n const { copy, isCopied } = useActionBarCopy({\n copyToClipboard: text => navigator.clipboard.writeText(text),\n });\n\n const parts = useAuiState(s => s.message.parts);\n\n const { cutIndex, hasFinal, toolCount, thinkingCount } = computeAgentStepsSplit(parts, isMessageRunning);\n\n const groupBy = (part: PartState, _context: GroupByContext): readonly `group-${string}`[] | null => {\n const index = parts.findIndex(p => p === part);\n if (index === -1) return null;\n\n if (part.type === 'text' && index >= cutIndex) {\n return null;\n }\n\n if (index < cutIndex) {\n if (part.type === 'reasoning') {\n return ['group-agentSteps', 'group-reasoning'];\n }\n return ['group-agentSteps'];\n }\n\n return null;\n };\n\n return (\n <MessagePrimitive.Root data-role=\"assistant\">\n <AssistantMessageBubble\n error={error !== undefined ? <MessageErrorBanner message={String(error)} /> : undefined}\n actionBar={\n !isThreadRunning ? <MessageActionBar isCopied={isCopied} onCopy={copy} createdAt={createdAt} /> : undefined\n }\n >\n <MessagePrimitive.GroupedParts groupBy={groupBy}>\n {({ part, children }) => {\n switch (part.type) {\n case 'group-agentSteps':\n return (\n <AgentStepsContainer toolCount={toolCount} thinkingCount={thinkingCount} hasFinal={hasFinal}>\n {children}\n </AgentStepsContainer>\n );\n case 'group-reasoning':\n return <ReasoningContainer group={part as ThreadGroupPart} />;\n case 'text': {\n const index = parts.findIndex(p => p === part);\n // Intermediate text inside Agent steps: muted + indented vs final answer\n if (index >= 0 && index < cutIndex) {\n return (\n <div className=\"mb-2 ml-[1.75rem] text-xs text-text-secondary [&_.markdown-body]:text-inherit\">\n <AssistantTextContainer />\n </div>\n );\n }\n return <AssistantTextContainer />;\n }\n case 'reasoning':\n case 'tool-call':\n case 'image':\n case 'data':\n return <AssistantLeafPartContainer part={part} />;\n case 'indicator':\n return resumeUnavailable ? null : <MessageIndicator />;\n default:\n return null;\n }\n }}\n </MessagePrimitive.GroupedParts>\n </AssistantMessageBubble>\n </MessagePrimitive.Root>\n );\n}\n","'use client';\n\nimport { useAuiState } from '@assistant-ui/react';\n\nimport { USER_MESSAGE_ATTACHMENT_PREVIEW_REM } from '../constants/attachments.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nexport function MessageImageContainer() {\n const AttachmentCard = useSlot('AttachmentCard');\n const AttachmentPreviewDialog = useSlot('AttachmentPreviewDialog');\n const image = useAuiState(s => (s.part.type === 'image' ? s.part.image : ''));\n const filename = useAuiState(s => (s.part.type === 'image' ? s.part.filename : undefined));\n\n if (!image) {\n return null;\n }\n\n const card = (\n <AttachmentCard\n name={filename ?? 'image'}\n previewSrc={image}\n isImage\n size=\"preview\"\n previewRem={USER_MESSAGE_ATTACHMENT_PREVIEW_REM}\n />\n );\n\n return (\n <AttachmentPreviewDialog previewSrc={image}>\n <div className=\"aui-message-image\">{card}</div>\n </AttachmentPreviewDialog>\n );\n}\n","'use client';\n\nimport { ComposerPrimitive, MessagePrimitive, useAui, useAuiState } from '@assistant-ui/react';\n\nimport { USER_MESSAGE_ATTACHMENT_PREVIEW_REM } from '../constants/attachments.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport { isImageAttachment, useAttachmentPreviewSrc } from './useAttachmentPreviewSrc.js';\n\nfunction ComposerAttachmentItem() {\n const AttachmentPreviewDialog = useSlot('AttachmentPreviewDialog');\n const AttachmentCard = useSlot('AttachmentCard');\n const aui = useAui();\n const name = useAuiState(s => s.attachment.name);\n const contentType = useAuiState(s => s.attachment.contentType);\n const type = useAuiState(s => s.attachment.type);\n const isImage = isImageAttachment(type, contentType);\n const previewSrc = useAttachmentPreviewSrc();\n\n return (\n <AttachmentPreviewDialog previewSrc={previewSrc}>\n <AttachmentCard\n name={name}\n contentType={contentType}\n previewSrc={previewSrc}\n isImage={isImage}\n size=\"chip\"\n onRemove={() => void aui.attachment().remove()}\n />\n </AttachmentPreviewDialog>\n );\n}\n\nfunction MessageAttachmentItem() {\n const AttachmentPreviewDialog = useSlot('AttachmentPreviewDialog');\n const AttachmentCard = useSlot('AttachmentCard');\n const name = useAuiState(s => s.attachment.name);\n const contentType = useAuiState(s => s.attachment.contentType);\n const type = useAuiState(s => s.attachment.type);\n const isImage = isImageAttachment(type, contentType);\n const previewSrc = useAttachmentPreviewSrc();\n\n const card = (\n <AttachmentCard\n name={name}\n contentType={contentType}\n previewSrc={previewSrc}\n isImage={isImage}\n size={isImage ? 'preview' : 'chip'}\n previewRem={USER_MESSAGE_ATTACHMENT_PREVIEW_REM}\n />\n );\n\n if (isImage && previewSrc) {\n return <AttachmentPreviewDialog previewSrc={previewSrc}>{card}</AttachmentPreviewDialog>;\n }\n\n return card;\n}\n\nexport function ComposerAttachmentsContainer() {\n return (\n <div className=\"aui-composer-attachments flex w-full flex-row flex-wrap items-center gap-2 empty:hidden\">\n <ComposerPrimitive.Attachments>{() => <ComposerAttachmentItem />}</ComposerPrimitive.Attachments>\n </div>\n );\n}\n\nexport function MessageAttachmentsContainer() {\n return (\n <div className=\"aui-user-message-attachments-end col-span-full col-start-1 row-start-1 flex w-full flex-row justify-end gap-2\">\n <MessagePrimitive.Attachments>{() => <MessageAttachmentItem />}</MessagePrimitive.Attachments>\n </div>\n );\n}\n\nexport function ComposerAttachmentPickerContainer() {\n const AttachmentPickerButton = useSlot('AttachmentPickerButton');\n return (\n <ComposerPrimitive.AddAttachment asChild>\n <AttachmentPickerButton />\n </ComposerPrimitive.AddAttachment>\n );\n}\n","'use client';\n\nimport { useAuiState } from '@assistant-ui/react';\nimport { useEffect, useState } from 'react';\n\nexport function isImageAttachment(type: string, contentType?: string): boolean {\n return type === 'image' || (contentType?.startsWith('image/') ?? false);\n}\n\nfunction useFileObjectUrl(file: File | undefined): string | undefined {\n const [src, setSrc] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n if (!file) {\n setSrc(undefined);\n return;\n }\n const objectUrl = URL.createObjectURL(file);\n setSrc(objectUrl);\n return () => URL.revokeObjectURL(objectUrl);\n }, [file]);\n\n return src;\n}\n\n/** Preview URL for staged composer files (object URL) or sent message attachments (data URI). */\nexport function useAttachmentPreviewSrc(): string | undefined {\n const type = useAuiState(s => s.attachment.type);\n const contentType = useAuiState(s => s.attachment.contentType);\n const file = useAuiState(s => ('file' in s.attachment ? s.attachment.file : undefined));\n const contentSrc = useAuiState(s => {\n if (!isImageAttachment(s.attachment.type, s.attachment.contentType)) return undefined;\n const imagePart = s.attachment.content?.find(part => part.type === 'image');\n if (imagePart?.type === 'image' && imagePart.image) return imagePart.image;\n return undefined;\n });\n\n const image = isImageAttachment(type, contentType);\n const fileSrc = useFileObjectUrl(image ? file : undefined);\n if (!image) return undefined;\n return fileSrc ?? contentSrc;\n}\n","'use client';\n\nimport { useAuiState } from '@assistant-ui/react';\nimport { useTrueFoundryToolResponses } from '@truefoundry/assistant-ui-runtime';\n\nexport type ThreadPauseState = {\n thread: {\n messages: readonly {\n role: string;\n status?: { type: string };\n metadata?: { custom?: unknown };\n }[];\n };\n};\n\n/** Returns true when the latest assistant message is paused for MCP authorization. */\nexport function threadHasPendingMcpAuth(s: ThreadPauseState): boolean {\n const messages = s.thread.messages;\n const last = messages[messages.length - 1];\n if (last?.role !== 'assistant') return false;\n if (last.status?.type !== 'requires-action') return false;\n return (last.metadata?.custom as { pendingMcpAuth?: boolean } | undefined)?.pendingMcpAuth === true;\n}\n\nexport type ComposerPauseView = { kind: 'mcp' } | { kind: 'ask-user' } | { kind: 'compose' };\n\n/** Shared composer pause detection for default and custom composer containers. */\nexport function useComposerPauseView(): ComposerPauseView {\n const mcpPending = useAuiState(threadHasPendingMcpAuth);\n const { pending: toolResponsesPending } = useTrueFoundryToolResponses();\n\n if (mcpPending) {\n return { kind: 'mcp' };\n }\n if (toolResponsesPending.length > 0) {\n return { kind: 'ask-user' };\n }\n return { kind: 'compose' };\n}\n","'use client';\n\nimport { useThreadIsRunning } from '@assistant-ui/core/react';\nimport { useTrueFoundryMcpAuth } from '@truefoundry/assistant-ui-runtime';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nexport function McpAuthContainer() {\n const McpAuthPrompt = useSlot('McpAuthPrompt');\n const { pending, resume } = useTrueFoundryMcpAuth();\n const isRunning = useThreadIsRunning();\n\n if (!pending) return null;\n\n const handleConnect = (serverId: string) => {\n const server = pending.mcpServers.find(s => s.id === serverId);\n if (server?.authUrl) {\n window.open(server.authUrl, '_blank', 'noopener,noreferrer');\n }\n };\n\n return (\n <McpAuthPrompt\n servers={pending.mcpServers}\n onConnect={handleConnect}\n onContinue={() => void resume()}\n readOnly={isRunning}\n />\n );\n}\n","'use client';\n\nimport { ComposerPrimitive, useAui, useAuiState } from '@assistant-ui/react';\nimport { useTrueFoundryAgentSpec, useTrueFoundryCancel } from '@truefoundry/assistant-ui-runtime';\nimport { useRef } from 'react';\n\nimport { DraftCatalogProvider } from '../atoms/draft/DraftCatalogProvider.js';\nimport { useComposerBusyState } from '../hooks/useComposerBusyState.js';\nimport { useComposerPauseView } from '../hooks/useComposerPauseView.js';\nimport { useOptionalShellMode } from '../server/ShellModeContext.js';\nimport { SlotsProvider, useSlot, useSlotIsDefault } from '../theme/SlotsProvider.js';\nimport { AskUserContainer } from './AskUserContainer.js';\nimport { ComposerAttachmentsContainer } from './AttachmentsContainer.js';\nimport { McpAuthContainer } from './McpAuthContainer.js';\n\nexport type ComposerContainerProps = {\n placeholder?: string;\n};\n\nfunction ComposerBody({ placeholder }: { placeholder: string }) {\n const ComposerShell = useSlot('ComposerShell');\n const aui = useAui();\n const shell = useOptionalShellMode();\n const hasText = useAuiState(s => s.composer.text.trim().length > 0);\n const { agentSpec } = useTrueFoundryAgentSpec();\n // Named (immutable) agents use a server-side model; only draft/mutable composers pick one here.\n const requiresModel = shell == null || (shell.mode.status === 'active' && shell.mode.isMutable);\n const hasModel = Boolean(agentSpec?.model?.name?.trim());\n const { isBusy, send, resetBusy } = useComposerBusyState();\n const cancel = useTrueFoundryCancel();\n const fileInputRef = useRef<HTMLInputElement>(null);\n const canSubmit = !isBusy && hasText && (!requiresModel || hasModel);\n const submit = () => {\n if (!canSubmit) return;\n send(() => aui.composer().send());\n };\n\n return (\n <>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n hidden\n onChange={event => {\n const files = event.target.files;\n if (files) {\n for (const file of files) {\n void aui.composer().addAttachment(file);\n }\n }\n event.target.value = '';\n }}\n />\n <ComposerPrimitive.AttachmentDropzone\n disabled={isBusy}\n data-slot=\"aui_composer-attachment-dropzone\"\n className=\"w-full rounded-[var(--composer-radius,1.5rem)] transition-[box-shadow] data-[dragging=true]:ring-focus-ring/20 data-[dragging=true]:ring-3\"\n >\n <ComposerPrimitive.Root\n data-slot=\"aui_composer-root\"\n className=\"w-full\"\n onSubmit={event => {\n // Suppresses the primitive's own send so submits route through the busy-state wrapper.\n event.preventDefault();\n submit();\n }}\n >\n <ComposerShell\n attachments={<ComposerAttachmentsContainer />}\n input={\n <ComposerPrimitive.Input\n data-slot=\"aui_composer-input\"\n placeholder={placeholder}\n disabled={isBusy}\n submitMode=\"enter\"\n aria-label=\"Message input\"\n className=\"text-text-primary placeholder:text-text-secondary/80 max-h-[10lh] min-h-10 w-full resize-none overflow-y-auto rounded-lg border-none bg-transparent px-1 py-1 text-base leading-normal shadow-none outline-none disabled:cursor-not-allowed\"\n />\n }\n disabled={isBusy}\n canSubmit={canSubmit}\n isRunning={isBusy}\n onSubmit={submit}\n onCancel={() => {\n resetBusy();\n void cancel();\n }}\n onAttach={() => fileInputRef.current?.click()}\n />\n </ComposerPrimitive.Root>\n </ComposerPrimitive.AttachmentDropzone>\n </>\n );\n}\n\nexport function ComposerContainer({\n placeholder = 'Ask anything... (Shift+Enter for new line)',\n}: ComposerContainerProps) {\n const pauseView = useComposerPauseView();\n const shell = useOptionalShellMode();\n const parentLeftSection = useSlot('ComposerLeftSection');\n const parentRightSection = useSlot('ComposerRightSection');\n const usesDefaultLeftSection = useSlotIsDefault('ComposerLeftSection');\n const usesDefaultRightSection = useSlotIsDefault('ComposerRightSection');\n const DraftComposerLeftSection = useSlot('DraftComposerLeftSection');\n const DraftComposerRightSection = useSlot('DraftComposerRightSection');\n const canMutateSpec = shell?.mode.status === 'active' && shell.mode.isMutable;\n\n if (pauseView.kind === 'mcp') {\n return <McpAuthContainer />;\n }\n if (pauseView.kind === 'ask-user') {\n return <AskUserContainer />;\n }\n\n if (canMutateSpec) {\n return (\n <DraftCatalogProvider>\n <SlotsProvider\n overrides={{\n ComposerLeftSection: usesDefaultLeftSection ? DraftComposerLeftSection : parentLeftSection,\n ComposerRightSection: usesDefaultRightSection ? DraftComposerRightSection : parentRightSection,\n }}\n >\n <ComposerBody placeholder={placeholder} />\n </SlotsProvider>\n </DraftCatalogProvider>\n );\n }\n\n return <ComposerBody placeholder={placeholder} />;\n}\n","'use client';\n\nimport { useTrueFoundryHistoryPagination } from '@truefoundry/assistant-ui-runtime';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\n\n/** How close to the viewport top (px) before the next older page is fetched. */\nconst TOP_THRESHOLD_PX = 200;\n\nconst VIEWPORT_SELECTOR = '[data-slot=\"aui_thread-viewport\"]';\n\n/**\n * Renders `HistoryLoader` at the top of the message list and fetches\n * the next older history page when the user scrolls near it. Scroll position\n * is preserved across the prepend so the list doesn't jump.\n *\n * Must be rendered inside `ThreadViewportShell` (it locates the scroll root\n * via the `aui_thread-viewport` data-slot on its nearest scrollable ancestor).\n */\nexport function HistoryLoaderContainer() {\n const HistoryLoader = useSlot('HistoryLoader');\n const { hasOlderHistory, isLoadingOlderHistory, loadOlderHistory } = useTrueFoundryHistoryPagination();\n\n const [sentinel, setSentinel] = useState<HTMLDivElement | null>(null);\n const inflightRef = useRef(false);\n\n const maybeLoadOlder = useCallback(async () => {\n if (inflightRef.current) return;\n inflightRef.current = true;\n\n const viewport = sentinel?.closest<HTMLElement>(VIEWPORT_SELECTOR) ?? null;\n const prevScrollHeight = viewport?.scrollHeight ?? 0;\n const prevScrollTop = viewport?.scrollTop ?? 0;\n\n try {\n await loadOlderHistory();\n // Wait for React to commit the prepended messages, then restore the\n // user's anchor so the list doesn't jump to the oldest message.\n requestAnimationFrame(() => {\n if (viewport == null) return;\n const delta = viewport.scrollHeight - prevScrollHeight;\n if (delta > 0) {\n viewport.scrollTo({ top: prevScrollTop + delta, behavior: 'instant' });\n }\n });\n } catch {\n // Runtime surfaces the error via onError; the sentinel stays retryable.\n } finally {\n inflightRef.current = false;\n }\n }, [sentinel, loadOlderHistory]);\n\n useEffect(() => {\n if (sentinel == null || !hasOlderHistory) return;\n\n const viewport = sentinel.closest<HTMLElement>(VIEWPORT_SELECTOR);\n const observer = new IntersectionObserver(\n entries => {\n if (entries.some(entry => entry.isIntersecting)) {\n void maybeLoadOlder();\n }\n },\n { root: viewport, rootMargin: `${TOP_THRESHOLD_PX}px 0px 0px 0px` },\n );\n observer.observe(sentinel);\n return () => observer.disconnect();\n }, [sentinel, hasOlderHistory, maybeLoadOlder]);\n\n if (!hasOlderHistory) return null;\n\n return <HistoryLoader ref={setSentinel} isLoading={isLoadingOlderHistory} />;\n}\n","'use client';\n\nimport { useTrueFoundryResumeUnavailable } from '@truefoundry/assistant-ui-runtime';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nexport function ResumeUnavailableContainer() {\n const ResumeUnavailable = useSlot('ResumeUnavailable');\n const resumeUnavailable = useTrueFoundryResumeUnavailable();\n\n if (!resumeUnavailable) return null;\n\n return <ResumeUnavailable />;\n}\n","'use client';\n\nimport { useComposerCancel, useComposerSend, useThreadIsRunning } from '@assistant-ui/core/react';\nimport { ComposerPrimitive, MessagePrimitive, useAuiState } from '@assistant-ui/react';\n\nimport { Button } from '../atoms/primitives/Button.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport { MessageAttachmentsContainer } from './AttachmentsContainer.js';\n\nfunction ReadOnlyMessageAttachments() {\n const hasAttachments = useAuiState(s => (s.message.attachments?.length ?? 0) > 0);\n if (!hasAttachments) {\n return null;\n }\n return (\n <div className=\"pointer-events-none mb-2 opacity-90\">\n <MessageAttachmentsContainer />\n </div>\n );\n}\n\nexport function UserEditComposerContainer() {\n const UserMessageEdit = useSlot('UserMessageEdit');\n const MessageTimestamp = useSlot('MessageTimestamp');\n const isRunning = useThreadIsRunning();\n const createdAt = useAuiState(s => s.message.createdAt);\n const { cancel, disabled: cancelDisabled } = useComposerCancel();\n const { disabled: sendDisabled } = useComposerSend();\n\n return (\n <MessagePrimitive.Root data-role=\"user\">\n <ComposerPrimitive.Root\n data-slot=\"aui_user-edit-composer-root\"\n className=\"fade-in slide-in-from-bottom-1 animate-in flex w-full justify-end px-2 duration-150\"\n >\n <UserMessageEdit\n timestamp={<MessageTimestamp createdAt={createdAt} />}\n attachments={<ReadOnlyMessageAttachments />}\n input={\n <div className=\"mt-1 rounded border border-border bg-secondary-bg p-2 text-text-primary\">\n <ComposerPrimitive.Input\n data-slot=\"aui_user-edit-input\"\n disabled={isRunning}\n submitMode=\"enter\"\n aria-label=\"Edit message\"\n className=\"max-h-32 min-h-10 w-full resize-none border-none bg-transparent p-0 text-base leading-[1.34] outline-none focus:shadow-none\"\n />\n </div>\n }\n footer={\n <div className=\"flex items-center justify-end gap-2\">\n <Button variant=\"secondary\" type=\"button\" disabled={cancelDisabled} onClick={cancel}>\n Cancel\n </Button>\n <ComposerPrimitive.Send asChild>\n <Button type=\"submit\" disabled={sendDisabled || isRunning}>\n Save & Rerun\n </Button>\n </ComposerPrimitive.Send>\n </div>\n }\n />\n </ComposerPrimitive.Root>\n </MessagePrimitive.Root>\n );\n}\n","'use client';\n\nimport { useActionBarCopy, useActionBarEdit, useThreadIsRunning } from '@assistant-ui/core/react';\nimport { MessagePrimitive, useAui, useAuiState } from '@assistant-ui/react';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport { MessageAttachmentsContainer } from './AttachmentsContainer.js';\n\nexport function UserMessageContainer() {\n const UserMessageBubble = useSlot('UserMessageBubble');\n const UserMessageActionBar = useSlot('UserMessageActionBar');\n const isRunning = useThreadIsRunning();\n const aui = useAui();\n const createdAt = useAuiState(s => s.message.createdAt);\n const text = useAuiState(s =>\n s.message.content\n .filter((part): part is { type: 'text'; text: string } => part.type === 'text')\n .map(part => part.text)\n .join('\\n'),\n );\n const { edit, disabled: editDisabled } = useActionBarEdit();\n const { copy, isCopied } = useActionBarCopy({\n copyToClipboard: value => navigator.clipboard.writeText(value),\n });\n\n return (\n <MessagePrimitive.Root data-role=\"user\">\n <UserMessageBubble\n text={text}\n attachments={<MessageAttachmentsContainer />}\n editAction={\n !isRunning ? (\n <UserMessageActionBar\n isCopied={isCopied}\n editDisabled={editDisabled}\n createdAt={createdAt}\n onCopy={copy}\n onEdit={edit}\n onRetry={() => {\n aui.message().composer().beginEdit();\n aui.message().composer().send({ startRun: true });\n }}\n />\n ) : undefined\n }\n />\n </MessagePrimitive.Root>\n );\n}\n","'use client';\n\nimport { ThreadPrimitive, useAuiState } from '@assistant-ui/react';\nimport { useEffect, type ReactNode } from 'react';\nimport { preloadMarkdownOpenUI } from '../atoms/Markdown.js';\nimport { ComposerBusyProvider } from '../hooks/useComposerBusyState.js';\nimport { useSyncSessionTitle } from '../hooks/useSyncSessionTitle.js';\nimport { useOptionalShellMode } from '../server/ShellModeContext.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport { isNewChatView } from '../utils/isNewChatView.js';\nimport { AssistantMessageContainer } from './AssistantMessageContainer.js';\nimport { HistoryLoaderContainer } from './HistoryLoaderContainer.js';\nimport { ResumeUnavailableContainer } from './ResumeUnavailableContainer.js';\nimport { UserEditComposerContainer } from './UserEditComposerContainer.js';\nimport { UserMessageContainer } from './UserMessageContainer.js';\n\nexport { isNewChatView } from '../utils/isNewChatView.js';\n\n/** Mount-only lift. Keyed by message.id via ThreadPrimitive.Messages — not content (streaming). */\nfunction AnimatedMessageShell({ children }: { children: ReactNode }) {\n return <div className=\"animate-in fade-in slide-in-from-bottom-1 fill-mode-both duration-200\">{children}</div>;\n}\n\nfunction ThreadMessage({ isEditing }: { isEditing: boolean }) {\n const role = useAuiState(s => s.message.role);\n if (role === 'user') {\n if (isEditing) {\n return <UserEditComposerContainer />;\n }\n return <UserMessageContainer />;\n }\n return <AssistantMessageContainer />;\n}\n\nexport type ThreadContainerProps = {\n /** Composer for the empty-welcome and docked bottom areas. `<Thread />` passes `<ComposerContainer />`. */\n composer?: ReactNode;\n};\n\nexport function ThreadContainer({ composer }: ThreadContainerProps) {\n useEffect(() => {\n void preloadMarkdownOpenUI();\n }, []);\n useSyncSessionTitle();\n\n const shell = useOptionalShellMode();\n const WelcomeScreen = useSlot('WelcomeScreen');\n const MessageListSkeleton = useSlot('MessageListSkeleton');\n const ScrollToBottomButton = useSlot('ScrollToBottomButton');\n const MessageGroup = useSlot('MessageGroup');\n const ThreadComposerAreaShell = useSlot('ThreadComposerAreaShell');\n const ThreadRootShell = useSlot('ThreadRootShell');\n const ThreadViewportShell = useSlot('ThreadViewportShell');\n\n const isEmpty = useAuiState(isNewChatView);\n const isLoading = useAuiState(s => s.thread.isLoading);\n const welcomeHeading = shell?.mode.status === 'active' ? shell.mode.agentName : undefined;\n\n return (\n <ComposerBusyProvider>\n <ThreadPrimitive.Root asChild>\n <ThreadRootShell>\n <ThreadPrimitive.Viewport asChild autoScroll>\n <ThreadViewportShell isEmpty={isEmpty}>\n {isEmpty && <WelcomeScreen heading={welcomeHeading} />}\n {isEmpty && !isLoading && composer}\n {isLoading ? (\n <MessageListSkeleton />\n ) : (\n !isEmpty && (\n <>\n <HistoryLoaderContainer />\n <MessageGroup>\n <ThreadPrimitive.Messages>\n {({ message }) => (\n <AnimatedMessageShell>\n <ThreadMessage isEditing={message.role === 'user' && message.composer.isEditing} />\n </AnimatedMessageShell>\n )}\n </ThreadPrimitive.Messages>\n <ResumeUnavailableContainer />\n </MessageGroup>\n </>\n )\n )}\n </ThreadViewportShell>\n </ThreadPrimitive.Viewport>\n\n {!isLoading && !isEmpty && (\n <ThreadComposerAreaShell isEmpty={isEmpty}>\n <ThreadPrimitive.ScrollToBottom asChild>\n <ScrollToBottomButton />\n </ThreadPrimitive.ScrollToBottom>\n {composer}\n </ThreadComposerAreaShell>\n )}\n </ThreadRootShell>\n </ThreadPrimitive.Root>\n </ComposerBusyProvider>\n );\n}\n","'use client';\n\nimport { useThreadIsRunning } from '@assistant-ui/core/react';\nimport { useEffect, useRef } from 'react';\n\nimport { useAui, useAuiState } from '../assistant-ui.js';\nimport { useOptionalServer } from '../server/ServerContext.js';\n\n/**\n * After a turn ends, read `session.title` from GET /sessions/{id} and rename the\n * thread-list row. Initialize only stores `remoteId`, so first chats stay\n * \"New Chat\" until this runs.\n */\nexport function useSyncSessionTitle(): void {\n const server = useOptionalServer();\n const aui = useAui();\n const remoteId = useAuiState(s => s.threadListItem.remoteId);\n const title = useAuiState(s => s.threadListItem.title);\n const isRunning = useThreadIsRunning();\n const wasRunningRef = useRef(false);\n const syncedRemoteIdRef = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n syncedRemoteIdRef.current = undefined;\n }, [remoteId]);\n\n useEffect(() => {\n const finishedTurn = wasRunningRef.current && !isRunning;\n wasRunningRef.current = isRunning;\n\n if (!finishedTurn || server == null || remoteId == null) {\n return;\n }\n if (syncedRemoteIdRef.current === remoteId) {\n return;\n }\n // History rows already carry a title; only fill blank / \"new\" local rows.\n if (title != null && title.trim() !== '') {\n syncedRemoteIdRef.current = remoteId;\n return;\n }\n\n let cancelled = false;\n void server\n .getSession({ sessionId: remoteId })\n .then(session => {\n if (cancelled) return;\n const nextTitle = typeof session.title === 'string' ? session.title.trim() : '';\n if (nextTitle.length === 0) return;\n syncedRemoteIdRef.current = remoteId;\n return aui.threadListItem().rename(nextTitle);\n })\n .catch(() => undefined);\n\n return () => {\n cancelled = true;\n };\n }, [aui, isRunning, remoteId, server, title]);\n}\n","import type { AssistantState } from '@assistant-ui/react';\n\n// Startup exposes a loading placeholder thread; treat it as a new chat so the\n// composer mounts centered. Loads after startup keep the docked layout.\n//\n// `remoteId == null` keeps welcome off during first-turn edit/retry: the\n// runtime briefly rewinds to an empty snapshot before applying pendingUser,\n// and messages.length===0 alone would flash the welcome screen.\nexport type NewChatViewState = {\n thread: Pick<AssistantState['thread'], 'messages' | 'isLoading'>;\n threads: Pick<AssistantState['threads'], 'isLoading'>;\n threadListItem: Pick<AssistantState['threadListItem'], 'remoteId'>;\n};\n\nexport const isNewChatView = (s: NewChatViewState) =>\n s.thread.messages.length === 0 && (!s.thread.isLoading || s.threads.isLoading) && s.threadListItem.remoteId == null;\n","'use client';\n\nimport { ComposerContainer } from './ComposerContainer.js';\nimport { ThreadContainer } from './ThreadContainer.js';\n\n/** The full assembled thread view: message list + composer. */\nexport function Thread() {\n return <ThreadContainer composer={<ComposerContainer />} />;\n}\n","'use client';\n\nimport {\n ThreadListItemByIndexProvider,\n ThreadListItemMorePrimitive,\n ThreadListItemPrimitive,\n ThreadListPrimitive,\n useAui,\n useAuiState,\n} from '@assistant-ui/react';\nimport { useEffect, useMemo, useRef, useState, type ReactNode, type Ref } from 'react';\n\nimport { AgentHistoryFilterButton } from '../atoms/AgentHistoryFilterButton.js';\nimport { auiButtonClass } from '../atoms/lib/buttonClasses.js';\nimport { cn } from '../atoms/lib/cn.js';\nimport { useCompactLayout } from '../atoms/lib/CompactLayoutContext.js';\nimport {\n canReuseMutableShell,\n readThreadAgentName,\n threadListIndicesByRecency,\n threadListItemIsMutable,\n} from '../atoms/lib/threadListMeta.js';\nimport { useIsMobile } from '../atoms/lib/useIsMobile.js';\nimport { BottomSheet } from '../atoms/primitives/BottomSheet.js';\nimport { Icon } from '../icons/Icon.js';\nimport { useOptionalServer } from '../server/ServerContext.js';\nimport { useOptionalShellMode } from '../server/ShellModeContext.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\n\n/**\n * Simplified relative to the reference: renders threads in a single flat list\n * rather than grouping them by Today/Yesterday/Earlier.\n *\n * Delete uses assistant-ui ThreadListItemPrimitive.Delete / ThreadListItemMorePrimitive\n * (adapter.delete → server.deleteSession). Mobile/compact keeps a BottomSheet chrome.\n */\nexport type ThreadListContainerProps = {\n /** Called after New chat or selecting a row — used by stack/drawer chrome. */\n onThreadOpen?: () => void;\n};\n\nconst deleteItemClass =\n 'flex w-full cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none text-failure-bg hover:bg-ghost-button-hover hover:text-failure-bg focus:bg-ghost-button-hover focus:text-failure-bg data-[highlighted]:bg-ghost-button-hover data-[highlighted]:text-failure-bg';\n\nfunction ThreadListItemDeleteMenu() {\n const compact = useCompactLayout();\n const isMobile = useIsMobile();\n const [sheetOpen, setSheetOpen] = useState(false);\n const useSheet = isMobile || compact;\n\n const moreButtonClass = auiButtonClass({\n variant: 'ghost',\n size: 'icon',\n className: 'size-7 shrink-0 text-text-secondary hover:bg-transparent hover:text-text-primary',\n });\n\n if (useSheet) {\n return (\n <>\n <button\n type=\"button\"\n aria-label=\"Session actions\"\n title=\"Session actions\"\n aria-haspopup=\"dialog\"\n aria-expanded={sheetOpen}\n className={moreButtonClass}\n onClick={() => setSheetOpen(true)}\n >\n <Icon name=\"ellipsis\" className=\"size-3.5\" />\n </button>\n {sheetOpen ? (\n <BottomSheet open onOpenChange={setSheetOpen} aria-label=\"Session actions\">\n <div className=\"flex flex-col gap-1 p-2\" role=\"menu\">\n <ThreadListItemPrimitive.Delete className={deleteItemClass} onClick={() => setSheetOpen(false)}>\n <Icon name=\"trash\" className=\"size-3.5\" />\n Delete\n </ThreadListItemPrimitive.Delete>\n </div>\n </BottomSheet>\n ) : null}\n </>\n );\n }\n\n return (\n <ThreadListItemMorePrimitive.Root sharedFocusGroup>\n <ThreadListItemMorePrimitive.Trigger\n aria-label=\"Session actions\"\n title=\"Session actions\"\n className={moreButtonClass}\n >\n <Icon name=\"ellipsis\" className=\"size-3.5\" />\n </ThreadListItemMorePrimitive.Trigger>\n <ThreadListItemMorePrimitive.Content\n align=\"end\"\n sideOffset={4}\n className=\"z-50 min-w-[8rem] rounded-md border border-border bg-card-bg p-1 text-text-primary shadow-md\"\n >\n <ThreadListItemPrimitive.Delete asChild>\n <ThreadListItemMorePrimitive.Item className={deleteItemClass}>\n <Icon name=\"trash\" className=\"size-3.5\" />\n Delete\n </ThreadListItemMorePrimitive.Item>\n </ThreadListItemPrimitive.Delete>\n </ThreadListItemMorePrimitive.Content>\n </ThreadListItemMorePrimitive.Root>\n );\n}\n\nfunction ThreadListItemRow({\n onThreadOpen,\n canDeleteSession,\n}: {\n onThreadOpen?: () => void;\n canDeleteSession: boolean;\n}) {\n const aui = useAui();\n const shell = useOptionalShellMode();\n const ThreadListRow = useSlot('ThreadListRow');\n const id = useAuiState(s => s.threadListItem.id);\n const remoteId = useAuiState(s => s.threadListItem.remoteId);\n const title = useAuiState(s => s.threadListItem.title);\n const lastMessageAt = useAuiState(s => s.threadListItem.lastMessageAt);\n const custom = useAuiState(s => s.threadListItem.custom);\n const mainThreadId = useAuiState(s => s.threads.mainThreadId);\n const agentName = readThreadAgentName(custom);\n const showDelete = canDeleteSession && remoteId != null;\n\n return (\n <ThreadListItemPrimitive.Root className=\"min-w-0\">\n <ThreadListRow\n title={title ?? 'New Chat'}\n active={id === mainThreadId}\n agentName={agentName}\n lastMessageAt={lastMessageAt}\n onSelect={() => {\n onThreadOpen?.();\n shell?.setSettingsOpen(false);\n\n // Prefer custom.isMutable (session wire); agentName-only is a legacy fallback.\n const sessionMutable = threadListItemIsMutable(custom);\n const sameImmutable =\n !sessionMutable &&\n shell?.mode.status === 'active' &&\n !shell.mode.isMutable &&\n (agentName == null\n ? shell.mode.agentName == null && shell.mode.agentId == null\n : shell.mode.agentName === agentName || shell.mode.agentId === agentName);\n const sameMutable = canReuseMutableShell({\n sessionMutable,\n shellMutable: shell?.mode.status === 'active' && shell.mode.isMutable,\n ...(shell?.mode.status === 'active' && shell.mode.isMutable\n ? { shellAgentName: shell.mode.agentName, shellAgentId: shell.mode.agentId }\n : {}),\n remoteId,\n pendingSessionId: shell?.pendingSessionId,\n });\n\n if ((sameImmutable || sameMutable) && remoteId != null) {\n void Promise.resolve(aui.threads().switchToThread(id)).catch(() => undefined);\n return;\n }\n if (remoteId != null) {\n shell?.openHistorySession({\n sessionId: remoteId,\n isMutable: sessionMutable,\n ...(agentName != null ? { agentName } : {}),\n });\n return;\n }\n void Promise.resolve(aui.threads().switchToThread(id)).catch(() => undefined);\n }}\n actions={showDelete ? <ThreadListItemDeleteMenu /> : undefined}\n />\n </ThreadListItemPrimitive.Root>\n );\n}\n\nfunction useThreadListIndicesByRecency(): number[] {\n const threadIds = useAuiState(s => s.threads.threadIds);\n const threadItems = useAuiState(s => s.threads.threadItems);\n\n return useMemo(() => threadListIndicesByRecency({ threadIds, threadItems }), [threadIds, threadItems]);\n}\n\nfunction ThreadListItemsByRecency({\n onThreadOpen,\n canDeleteSession,\n}: {\n onThreadOpen?: () => void;\n canDeleteSession: boolean;\n}) {\n // Newest-first: remount/switchToThread can append the active session to threadIds.\n const indices = useThreadListIndicesByRecency();\n const threadIds = useAuiState(s => s.threads.threadIds);\n\n return (\n <>\n {indices.map(index => {\n const key = threadIds[index] ?? String(index);\n return (\n <ThreadListItemByIndexProvider key={key} index={index} archived={false}>\n <ThreadListItemRow onThreadOpen={onThreadOpen} canDeleteSession={canDeleteSession} />\n </ThreadListItemByIndexProvider>\n );\n })}\n </>\n );\n}\n\nconst THREAD_LIST_VIEWPORT_SLOT = 'aui_thread-list-viewport';\n/** How close to the bottom (px) before the next sessions page is fetched. */\nconst LOAD_MORE_BOTTOM_PX = 80;\n\nfunction ChatHistorySection({ children, viewportRef }: { children: ReactNode; viewportRef: Ref<HTMLDivElement> }) {\n const [expanded, setExpanded] = useState(true);\n const shell = useOptionalShellMode();\n const showFilter = shell?.isLibraryEnabled === true;\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div className=\"flex shrink-0 items-center gap-1 px-1 py-1\">\n <button\n type=\"button\"\n aria-expanded={expanded}\n className=\"flex min-w-0 flex-1 items-center gap-1 rounded-md px-1.5 py-1 text-left text-sm font-medium text-text-secondary hover:bg-ghost-button-hover hover:text-text-primary\"\n onClick={() => setExpanded(v => !v)}\n >\n <span className=\"truncate\">Chat History</span>\n <Icon\n name=\"chevron-down\"\n className={cn('size-3.5 shrink-0 transition-transform', !expanded && '-rotate-90')}\n />\n </button>\n {showFilter ? <AgentHistoryFilterButton /> : null}\n </div>\n {expanded ? (\n <div\n ref={viewportRef}\n data-slot={THREAD_LIST_VIEWPORT_SLOT}\n className=\"flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto\"\n >\n {children}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function ThreadListContainer({ onThreadOpen }: ThreadListContainerProps = {}) {\n const aui = useAui();\n const server = useOptionalServer();\n const isLoading = useAuiState(s => s.threads.isLoading);\n const isLoadingMore = useAuiState(s => s.threads.isLoadingMore);\n const hasMore = useAuiState(s => s.threads.hasMore);\n const threadIds = useAuiState(s => s.threads.threadIds);\n const shell = useOptionalShellMode();\n\n const ThreadListShell = useSlot('ThreadListShell');\n const ThreadListNewButton = useSlot('ThreadListNewButton');\n const AgentsLibraryButton = useSlot('AgentsLibraryButton');\n const ThreadListRowSkeleton = useSlot('ThreadListRowSkeleton');\n const ThreadListEmptyState = useSlot('ThreadListEmptyState');\n\n const viewportRef = useRef<HTMLDivElement>(null);\n const hasMoreRef = useRef(hasMore);\n const auiRef = useRef(aui);\n hasMoreRef.current = hasMore;\n auiRef.current = aui;\n\n const showNewChat = shell?.isNewChatEnabled !== false;\n const isIdle = shell?.mode.status === 'idle';\n const canDeleteSession = typeof server?.deleteSession === 'function';\n\n // Fill an underflowing viewport; once it scrolls, paginate only near the bottom.\n // Re-measure after commit (threadIds / hasMore) instead of rAF-chaining, which\n // raced layout and could drain every remaining listSessions page.\n // The runtime owns request deduplication, so Strict Mode remounts can recheck safely.\n useEffect(() => {\n if (isIdle || isLoading || isLoadingMore) return;\n const viewport = viewportRef.current;\n if (!viewport) return;\n\n let cancelled = false;\n\n const tryLoadMore = () => {\n if (cancelled || !hasMoreRef.current) return;\n if (viewport.clientHeight <= 0) return;\n\n const remaining = viewport.scrollHeight - viewport.scrollTop - viewport.clientHeight;\n if (viewport.scrollHeight > viewport.clientHeight && remaining > LOAD_MORE_BOTTOM_PX) return;\n\n void auiRef.current.threads().loadMore();\n };\n\n viewport.addEventListener('scroll', tryLoadMore, { passive: true });\n const resizeObserver = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(() => tryLoadMore());\n if (resizeObserver) {\n resizeObserver.observe(viewport);\n } else {\n window.addEventListener('resize', tryLoadMore);\n }\n tryLoadMore();\n\n return () => {\n cancelled = true;\n viewport.removeEventListener('scroll', tryLoadMore);\n resizeObserver?.disconnect();\n if (!resizeObserver) {\n window.removeEventListener('resize', tryLoadMore);\n }\n };\n }, [hasMore, isIdle, isLoading, isLoadingMore, threadIds.length]);\n\n const handleNewChat = () => {\n onThreadOpen?.();\n if (shell?.isComposerEnabled) {\n shell.openDraft();\n return;\n }\n shell?.setSettingsOpen(false);\n void Promise.resolve(aui.threads().switchToNewThread()).catch(() => undefined);\n };\n\n let listBody: ReactNode;\n if (isIdle) {\n listBody = <ThreadListEmptyState />;\n } else if (isLoading) {\n listBody = <ThreadListRowSkeleton />;\n } else if (threadIds.length === 0) {\n listBody = <ThreadListEmptyState />;\n } else {\n listBody = (\n <ThreadListPrimitive.Root className=\"flex min-h-0 flex-col gap-0.5\">\n <ThreadListItemsByRecency onThreadOpen={onThreadOpen} canDeleteSession={canDeleteSession} />\n </ThreadListPrimitive.Root>\n );\n }\n\n return (\n <ThreadListShell\n header={\n <div className=\"flex flex-col gap-1\">\n {showNewChat ? <ThreadListNewButton onClick={handleNewChat} /> : null}\n <AgentsLibraryButton\n onSelectAgent={() => {\n onThreadOpen?.();\n }}\n />\n </div>\n }\n >\n <ChatHistorySection viewportRef={viewportRef}>\n {listBody}\n {!isIdle && hasMore ? <div className=\"h-4 shrink-0\" aria-hidden /> : null}\n </ChatHistorySection>\n </ThreadListShell>\n );\n}\n","'use client';\n\nimport { useEffect, useId, useLayoutEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { Icon } from '../icons/Icon.js';\nimport { useOptionalServer } from '../server/ServerContext.js';\nimport { libraryAgentId, useOptionalShellMode } from '../server/ShellModeContext.js';\nimport { auiButtonClass } from './lib/buttonClasses.js';\nimport { cn } from './lib/cn.js';\nimport { useCompactLayout } from './lib/CompactLayoutContext.js';\nimport { useIsMobile } from './lib/useIsMobile.js';\nimport { useSearchAgentsList } from './lib/useSearchAgentsList.js';\nimport { BottomSheet } from './primitives/BottomSheet.js';\nimport { DropdownMenuItem } from './primitives/DropdownMenu.js';\nimport SearchInput from './primitives/SearchInput.js';\n\n/** Keep portaled chrome under ThemeProvider so preset/custom CSS vars still apply. */\nfunction themePortalRoot(from: HTMLElement | null): HTMLElement {\n return from?.closest('.aui-theme-root') ?? document.body;\n}\n\n/**\n * Funnel popover for filtering chat history by agent id.\n * Desktop: fixed menu to the right of the funnel. Mobile/compact: bottom sheet.\n */\nexport function AgentHistoryFilterButton() {\n const shell = useOptionalShellMode();\n const server = useOptionalServer();\n const isMobile = useIsMobile();\n const compact = useCompactLayout();\n const useSheet = isMobile || compact;\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [menuPos, setMenuPos] = useState<{ top: number; left: number } | null>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const menuId = useId();\n\n const enabled = shell?.isLibraryEnabled === true && server != null;\n const selected = shell?.historyAgentFilter ?? null;\n\n useEffect(() => {\n if (!open) setQuery('');\n }, [open]);\n\n const { agents, isInitialLoading, isSearching, loadingMore, hasMore, listRef, sentinelRef } = useSearchAgentsList({\n enabled: open && enabled,\n query,\n });\n\n // Desktop only: anchor to the right of the funnel; portal escapes sidebar overflow.\n useLayoutEffect(() => {\n if (!open || useSheet) {\n setMenuPos(null);\n return;\n }\n const update = () => {\n const rect = buttonRef.current?.getBoundingClientRect();\n if (!rect) return;\n setMenuPos({ top: rect.top, left: rect.right + 4 });\n };\n update();\n window.addEventListener('resize', update);\n window.addEventListener('scroll', update, true);\n return () => {\n window.removeEventListener('resize', update);\n window.removeEventListener('scroll', update, true);\n };\n }, [open, useSheet]);\n\n useEffect(() => {\n if (!open || useSheet) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (buttonRef.current?.contains(target) || menuRef.current?.contains(target)) return;\n setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open, useSheet]);\n\n if (!enabled) return null;\n\n const pick = (agentId: string | null) => {\n shell?.setHistoryAgentFilter(agentId);\n setOpen(false);\n };\n\n const filterBody = (\n <>\n <div className=\"p-1\" onMouseDown={e => e.stopPropagation()}>\n <SearchInput query={query} setQuery={setQuery} placeholder=\"Search agents\" />\n {isSearching ? (\n <p className=\"text-text-secondary px-1 pt-1 text-[11px]\" role=\"status\">\n Searching…\n </p>\n ) : null}\n </div>\n <div\n ref={listRef}\n className={cn('mt-1 overflow-y-auto', useSheet ? 'min-h-0 flex-1 px-1 pb-2' : 'min-h-48 max-h-64')}\n >\n {query.trim() === '' ? (\n <DropdownMenuItem\n className={cn(\n 'justify-between',\n selected == null && 'bg-dropdown-selected-item-bg text-dropdown-selected-item-text',\n )}\n onClick={() => pick(null)}\n >\n All chats\n {selected == null ? <Icon name=\"check\" className=\"size-3.5 shrink-0\" /> : null}\n </DropdownMenuItem>\n ) : null}\n {isInitialLoading ? (\n <p className=\"px-2 py-3 text-center text-xs text-text-secondary\">Loading…</p>\n ) : agents.length === 0 ? (\n <p className=\"text-text-secondary px-2 py-6 text-center text-xs\" role=\"status\">\n {query.trim() ? `No agents match \"${query.trim()}\".` : 'No agents yet.'}\n </p>\n ) : (\n <>\n {agents.map(agent => {\n const id = libraryAgentId(agent);\n const active = selected === id;\n return (\n <DropdownMenuItem\n key={id}\n className={cn(\n 'justify-between gap-2 text-left',\n active && 'bg-dropdown-selected-item-bg text-dropdown-selected-item-text',\n )}\n onClick={() => pick(id)}\n >\n <span className=\"min-w-0 truncate\">{agent.name}</span>\n {active ? <Icon name=\"check\" className=\"size-3.5 shrink-0\" /> : null}\n </DropdownMenuItem>\n );\n })}\n {hasMore ? (\n <div ref={sentinelRef} className=\"flex h-6 shrink-0 items-center justify-center\" aria-hidden>\n {loadingMore ? (\n <span className=\"text-text-secondary text-[11px]\" role=\"status\">\n Loading more…\n </span>\n ) : null}\n </div>\n ) : null}\n </>\n )}\n </div>\n </>\n );\n\n return (\n <div className=\"relative shrink-0\">\n <button\n ref={buttonRef}\n type=\"button\"\n aria-label={selected != null ? `Filter chat history by agent (${selected})` : 'Filter chat history by agent'}\n aria-haspopup={useSheet ? 'dialog' : 'menu'}\n aria-expanded={open}\n aria-controls={open ? menuId : undefined}\n title=\"Filter by agent\"\n className={auiButtonClass({\n variant: 'ghost',\n size: 'icon',\n className: cn(\n 'relative size-7 shrink-0 text-text-secondary hover:bg-ghost-button-hover hover:text-ghost-button-text',\n selected != null && 'text-text-primary',\n ),\n })}\n onClick={() => setOpen(v => !v)}\n >\n <Icon name=\"funnel\" className=\"size-3.5\" />\n {selected != null ? (\n <span\n className=\"bg-primary-button-bg absolute top-1 right-1 size-1.5 rounded-full\"\n aria-hidden\n data-testid=\"history-filter-active-dot\"\n />\n ) : null}\n </button>\n {useSheet && open ? (\n <BottomSheet open onOpenChange={setOpen} id={menuId} aria-label=\"Filter agents\">\n <div className=\"flex min-h-0 flex-1 flex-col p-2\" role=\"menu\">\n {filterBody}\n </div>\n </BottomSheet>\n ) : null}\n {!useSheet && open && menuPos != null\n ? createPortal(\n <div\n ref={menuRef}\n id={menuId}\n role=\"menu\"\n aria-label=\"Filter agents\"\n style={{ top: menuPos.top, left: menuPos.left }}\n className=\"font-sans-flex fixed z-50 w-56 rounded-md border border-border bg-card-bg p-1 text-text-primary shadow-md\"\n >\n {filterBody}\n </div>,\n themePortalRoot(buttonRef.current),\n )\n : null}\n </div>\n );\n}\n","import React, { useEffect, useId, useRef, useState } from 'react';\n\nimport { cn } from '../lib/cn.js';\n\nexport type DropdownMenuProps = {\n trigger: React.ReactNode;\n children: React.ReactNode;\n align?: 'start' | 'end';\n className?: string;\n};\n\nexport function DropdownMenu({ trigger, children, align = 'end', className }: DropdownMenuProps) {\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const menuId = useId();\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n const first = menuRef.current?.querySelector<HTMLElement>('[role=\"menuitem\"]:not([disabled])');\n first?.focus();\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setOpen(false);\n const triggerBtn = containerRef.current?.querySelector<HTMLElement>(\"[aria-haspopup='menu']\");\n triggerBtn?.focus();\n return;\n }\n\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp' && e.key !== 'Home' && e.key !== 'End') {\n return;\n }\n\n const items = Array.from(\n menuRef.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not([disabled])') ?? [],\n );\n if (items.length === 0) return;\n\n e.preventDefault();\n const currentIndex = items.indexOf(document.activeElement as HTMLElement);\n let nextIndex = currentIndex;\n if (e.key === 'ArrowDown') nextIndex = (currentIndex + 1) % items.length;\n else if (e.key === 'ArrowUp') nextIndex = (currentIndex - 1 + items.length) % items.length;\n else if (e.key === 'Home') nextIndex = 0;\n else if (e.key === 'End') nextIndex = items.length - 1;\n items[nextIndex]?.focus();\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open]);\n\n const triggerEl = React.isValidElement(trigger)\n ? React.cloneElement(trigger as React.ReactElement<Record<string, unknown>>, {\n 'aria-haspopup': 'menu',\n 'aria-expanded': open,\n 'aria-controls': open ? menuId : undefined,\n onKeyDown: (e: React.KeyboardEvent) => {\n const existing = (trigger as React.ReactElement<{ onKeyDown?: (ev: React.KeyboardEvent) => void }>).props\n .onKeyDown;\n existing?.(e);\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setOpen(true);\n }\n },\n })\n : trigger;\n\n return (\n <div ref={containerRef} className=\"relative inline-flex\">\n <div onClick={() => setOpen(v => !v)}>{triggerEl}</div>\n {open && (\n <div\n ref={menuRef}\n id={menuId}\n role=\"menu\"\n className={cn(\n 'absolute top-full z-50 mt-1 min-w-[8rem] rounded-md border border-border bg-card-bg p-1',\n 'text-text-primary shadow-md',\n align === 'end' ? 'right-0' : 'left-0',\n className,\n )}\n onClick={() => setOpen(false)}\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n\nexport type DropdownMenuItemProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nexport function DropdownMenuItem({ className, ...props }: DropdownMenuItemProps) {\n return (\n <button\n role=\"menuitem\"\n type=\"button\"\n className={cn(\n 'flex w-full cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none',\n 'transition-colors hover:bg-ghost-button-hover',\n 'focus:bg-dropdown-selected-item-bg focus:text-dropdown-selected-item-text',\n 'aria-selected:bg-dropdown-selected-item-bg aria-selected:text-dropdown-selected-item-text',\n 'disabled:pointer-events-none disabled:opacity-50',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport type DropdownMenuSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport function DropdownMenuSeparator({ className, ...props }: DropdownMenuSeparatorProps) {\n return <div role=\"separator\" className={cn('-mx-1 my-1 h-px bg-border', className)} {...props} />;\n}\n"],"mappings":"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","names":["useEffect","useState","jsx","useState","useEffect","useAuiState","useCallback","useMemo","useRef","useEffect","useRef","useState","jsx","useRef","useAuiState","useCallback","downloadSandboxFile","toaster","useMemo","useAuiState","useCallback","useRef","useState","jsx","useAuiState","useState","useRef","useCallback","useCallback","useMemo","useState","jsx","useState","useMemo","useCallback","useCallback","useEffect","useRef","useState","jsx","useState","useRef","useCallback","useEffect","useState","display","useMemo","useState","jsx","useState","useMemo","jsx","useState","argsDisplay","resultDisplay","slots","useThreadIsRunning","MessagePrimitive","useAuiState","useAuiState","jsx","useAuiState","jsx","useThreadIsRunning","useAuiState","MessagePrimitive","MessagePrimitive","useAui","useAuiState","useAuiState","useEffect","useState","jsx","useAui","useAuiState","MessagePrimitive","useAuiState","useTrueFoundryToolResponses","useThreadIsRunning","jsx","useThreadIsRunning","ComposerPrimitive","useAui","useAuiState","useRef","jsx","useAui","useAuiState","useRef","ComposerPrimitive","useCallback","useEffect","useRef","useState","jsx","useState","useRef","useCallback","useEffect","useTrueFoundryResumeUnavailable","jsx","useTrueFoundryResumeUnavailable","useThreadIsRunning","ComposerPrimitive","MessagePrimitive","useAuiState","jsx","jsxs","useAuiState","useThreadIsRunning","MessagePrimitive","ComposerPrimitive","useActionBarCopy","useThreadIsRunning","MessagePrimitive","useAui","useAuiState","jsx","useThreadIsRunning","useAui","useAuiState","useActionBarCopy","MessagePrimitive","useAuiState","useEffect","useThreadIsRunning","useEffect","useRef","useThreadIsRunning","useRef","useEffect","Fragment","jsx","jsxs","useAuiState","useEffect","jsx","useAui","useAuiState","useEffect","useMemo","useRef","useState","useEffect","useId","useRef","useState","useEffect","useRef","useState","jsx","jsxs","jsx","Fragment","jsx","jsxs","useState","useRef","useId","useEffect","Fragment","jsx","jsxs","useState","useAui","useAuiState","useMemo","useRef","useEffect"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/containers/TrueFoundryChatProvider.tsx","../src/containers/TrueForgeUIShell.tsx","../src/atoms/draft/DraftSpecPreferenceBridge.tsx","../src/routing/RemoteIdRouteBridge.tsx","../src/containers/useResolvedServer.ts"],"sourcesContent":["'use client';\n\nimport { AssistantRuntimeProvider } from '@assistant-ui/react';\nimport {\n trueFoundryAttachmentAdapter,\n useTrueFoundryAgentRuntime,\n type TrueFoundryAgentConfig,\n type UseTrueFoundryAgentRuntimeOptions,\n} from '@truefoundry/assistant-ui-runtime';\nimport { useCallback, useMemo, type ReactNode } from 'react';\n\nimport { notifyComposerBusyFailure } from '../hooks/useComposerBusyState.js';\nimport type { AgentUIServer } from '../server/types.js';\nimport { ToasterProvider, useToaster } from './ToasterContainer.js';\n\ntype RuntimeAdapters = NonNullable<UseTrueFoundryAgentRuntimeOptions['adapters']>;\n\nexport type TrueFoundryChatProviderProps = {\n server: AgentUIServer;\n initialSessionId?: string;\n adapters?: RuntimeAdapters;\n onError?: (error: unknown) => void;\n children: ReactNode;\n /** Discriminated agent source. Prefer over legacy `agentName`. */\n agent?: TrueFoundryAgentConfig;\n /** Legacy named-agent shorthand. Prefer `agent: { mode: \"named\", agentName }`. */\n agentName?: string;\n /** Forwarded to `listSessions({ agentId })` for history filtering. */\n listSessionsAgentId?: string;\n};\n\nfunction ChatRuntimeScope({\n server,\n agent,\n agentName,\n listSessionsAgentId,\n initialSessionId,\n adapters,\n onError,\n children,\n}: {\n server: AgentUIServer;\n agent?: TrueFoundryAgentConfig;\n agentName?: string;\n listSessionsAgentId?: string;\n initialSessionId?: string;\n adapters?: RuntimeAdapters;\n onError?: (error: unknown) => void;\n children: ReactNode;\n}) {\n const { showError } = useToaster();\n const reportError = onError ?? showError;\n // composer().send() is void and swallows onNew rejections; clear optimistic\n // busy when the runtime reports a pre-stream failure (e.g. createSession).\n const resolvedOnError = useCallback(\n (error: unknown) => {\n notifyComposerBusyFailure();\n reportError(error);\n },\n [reportError],\n );\n\n const runtime = useTrueFoundryAgentRuntime({\n server: server as never,\n agent,\n agentName,\n listSessionsAgentId,\n initialSessionId,\n onError: resolvedOnError,\n adapters: {\n ...adapters,\n attachments: adapters?.attachments ?? trueFoundryAttachmentAdapter,\n },\n });\n\n return <AssistantRuntimeProvider runtime={runtime as never}>{children}</AssistantRuntimeProvider>;\n}\n\n/**\n * Chat shell: wires `useTrueFoundryAgentRuntime` from `server` and provides\n * assistant-ui + error toasts.\n */\nexport function TrueFoundryChatProvider(props: TrueFoundryChatProviderProps) {\n const { server, initialSessionId, adapters, onError, children, agent, agentName, listSessionsAgentId } = props;\n\n const stableServer = useMemo(() => server, [server]);\n\n return (\n <ToasterProvider>\n <ChatRuntimeScope\n server={stableServer}\n agent={agent}\n agentName={agentName}\n listSessionsAgentId={listSessionsAgentId}\n initialSessionId={initialSessionId}\n adapters={adapters}\n onError={onError}\n >\n {children}\n </ChatRuntimeScope>\n </ToasterProvider>\n );\n}\n","'use client';\n\nimport type { TrueFoundryAgentConfig, UseTrueFoundryAgentRuntimeOptions } from '@truefoundry/assistant-ui-runtime';\nimport { lazy, Suspense, useCallback, useMemo, useState, type ReactNode } from 'react';\n\nimport { DraftCatalogProvider } from '../atoms/draft/DraftCatalogProvider.js';\nimport { DraftSpecPreferenceBridge } from '../atoms/draft/DraftSpecPreferenceBridge.js';\nimport { cn } from '../atoms/lib/cn.js';\nimport { Spinner } from '../atoms/primitives/Spinner.js';\nimport { RemoteIdRouteBridge } from '../routing/RemoteIdRouteBridge.js';\nimport type { ResolvedRoutes, RoutesConfig } from '../routing/types.js';\nimport { ServerProvider } from '../server/ServerContext.js';\nimport { DEFAULT_AGENT_CONFIG, ShellModeProvider, useShellMode, type AgentConfig } from '../server/ShellModeContext.js';\nimport type { TrueForgeServerConfig } from '../server/TrueForgeServerConfig.js';\nimport { SlotsProvider, type SlotOverrides } from '../theme/SlotsProvider.js';\nimport type { LayoutProp, ThemeConfig } from '../theme/types.js';\nimport { getErrorMessage } from '../utils/getErrorMessage.js';\nimport { TrueFoundryChatProvider, type TrueFoundryChatProviderProps } from './TrueFoundryChatProvider.js';\nimport { useResolvedServer } from './useResolvedServer.js';\n\nconst SidebarLayout = lazy(() => import('../layouts/SidebarLayout.js').then(m => ({ default: m.SidebarLayout })));\nconst DrawerLayout = lazy(() => import('../layouts/DrawerLayout.js').then(m => ({ default: m.DrawerLayout })));\nconst DockLayout = lazy(() => import('../layouts/DockLayout.js').then(m => ({ default: m.DockLayout })));\nconst WidgetLayout = lazy(() => import('../layouts/WidgetLayout.js').then(m => ({ default: m.WidgetLayout })));\nconst ShellRouteSync = lazy(() => import('../routing/ShellRouteSync.js').then(m => ({ default: m.ShellRouteSync })));\n\nexport type ChatLayout = 'sidebar' | 'drawer' | 'dock' | 'widget';\n\ntype RuntimeAdapters = NonNullable<UseTrueFoundryAgentRuntimeOptions['adapters']>;\n\nexport type TrueForgeUIProps = {\n server: TrueForgeServerConfig;\n /** Built-in layout string or a custom layout component. Defaults to `\"sidebar\"`. */\n layout?: LayoutProp;\n overrides?: SlotOverrides;\n theme?: ThemeConfig;\n className?: string;\n initialSessionId?: string;\n adapters?: RuntimeAdapters;\n onError?: (error: unknown) => void;\n /**\n * Agent / library / composer shell mode.\n * Defaults to `{ mode: \"AgentLibraryWithComposer\" }`.\n */\n agentConfig?: AgentConfig;\n /** Open settings on first paint only (host boot with no models configured). */\n initialSettingsOpen?: boolean;\n /**\n * Sync shell navigation to the browser URL via react-router (opt-in).\n * Requires `react-router-dom` in the host. Leave off for dock/widget embeds\n * and hosts that own their own router. Defaults to `false`.\n */\n withRouter?: boolean;\n /** URL path customization; only honored when `withRouter`. */\n routes?: RoutesConfig;\n};\n\nexport type TrueForgeUIShellProps = Omit<TrueForgeUIProps, 'withRouter'> & { resolvedRoutes?: ResolvedRoutes };\n\nfunction LayoutFallback({ className }: { className?: string }) {\n return (\n <div\n className={className}\n style={{\n height: '100%',\n minHeight: '12rem',\n background:\n 'linear-gradient(90deg, color-mix(in oklab, var(--secondary-bg) 55%, transparent) 25%, color-mix(in oklab, var(--secondary-bg) 25%, transparent) 50%, color-mix(in oklab, var(--secondary-bg) 55%, transparent) 75%)',\n backgroundSize: '200% 100%',\n animation: 'tfy-aui-pulse 1.2s ease-in-out infinite',\n }}\n aria-hidden\n />\n );\n}\n\n/** Shown while `type: \"truefoundry\"` resolves the agent UI server. */\nexport function ServerInitLoader({ className }: { className?: string }) {\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n className={cn(\n 'flex h-full min-h-48 w-full flex-1 items-center justify-center bg-primary-bg text-text-secondary',\n className,\n )}\n >\n <Spinner size={28} className=\"text-text-primary\" />\n <span className=\"sr-only\">Loading</span>\n </div>\n );\n}\n\nfunction ServerInitError({ error, className }: { error: unknown; className?: string }) {\n const message = getErrorMessage(error, 'Failed to initialize server');\n return (\n <div\n role=\"alert\"\n className={cn(\n 'flex h-full min-h-48 items-center justify-center bg-primary-bg px-6 text-center text-sm text-failure-bg',\n className,\n )}\n >\n {message}\n </div>\n );\n}\n\nfunction isBuiltInLayout(layout: LayoutProp): layout is ChatLayout {\n return layout === 'sidebar' || layout === 'drawer' || layout === 'dock' || layout === 'widget';\n}\n\nfunction BuiltInLayoutView({ layout, className }: { layout: ChatLayout; className?: string }) {\n switch (layout) {\n case 'sidebar':\n return <SidebarLayout className={className} />;\n case 'drawer':\n return <DrawerLayout className={className} />;\n case 'dock':\n return <DockLayout className={className} />;\n case 'widget':\n return <WidgetLayout className={className} />;\n }\n}\n\nfunction LayoutChildren({ layout, className }: { layout: LayoutProp; className?: string }) {\n if (isBuiltInLayout(layout)) {\n return (\n <Suspense fallback={<LayoutFallback className={className} />}>\n <BuiltInLayoutView layout={layout} className={className} />\n </Suspense>\n );\n }\n const HostLayout = layout;\n return <HostLayout className={className} />;\n}\n\nfunction ChatProviderFromShell({\n children,\n initialSessionId: hostInitialSessionId,\n onRemoteIdChange,\n ...providerRest\n}: {\n children: ReactNode;\n /** When routing, reports the active thread's remote id up to `ShellRouteSync`. */\n onRemoteIdChange?: (id: string | undefined) => void;\n} & Omit<TrueFoundryChatProviderProps, 'agent' | 'agentName' | 'listSessionsAgentId' | 'children'>) {\n const { mode, runtimeKey, listSessionsAgentId, pendingSessionId } = useShellMode();\n\n // Freeze draft seed for the life of this runtimeKey so bindMutableAgent (identity /\n // instructions on shell) does not push a new defaultAgentSpec into the runtime.\n const draftDefaultAgentSpec = useMemo(() => {\n if (mode.status === 'active' && mode.isMutable) {\n return mode.agentSpec ?? { model: { name: 'openai-main/gpt-4.1' } };\n }\n return { model: { name: 'openai-main/gpt-4.1' } };\n // runtimeKey is the remount boundary for mutable chats.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- intentionally keyed on runtimeKey only\n }, [runtimeKey]);\n\n const agent: TrueFoundryAgentConfig = useMemo(() => {\n // idle uses a placeholder draft so layout chrome (useAui) still mounts;\n // layouts render an empty CTA instead of the thread.\n if (mode.status === 'idle') {\n return {\n mode: 'draft',\n defaultAgentSpec: { model: { name: 'openai-main/gpt-4.1' } },\n };\n }\n // Runtime still uses named|draft; shell mutability maps onto that adapter.\n if (!mode.isMutable) {\n const agentName = mode.agentName ?? mode.agentId ?? pendingSessionId;\n if (agentName == null) {\n // Active immutable without identity should not happen; keep chrome mounted.\n return {\n mode: 'draft',\n defaultAgentSpec: { model: { name: 'openai-main/gpt-4.1' } },\n };\n }\n return { mode: 'named', agentName };\n }\n return {\n mode: 'draft',\n defaultAgentSpec: draftDefaultAgentSpec,\n };\n }, [mode, draftDefaultAgentSpec, pendingSessionId]);\n\n return (\n <TrueFoundryChatProvider\n key={runtimeKey}\n {...providerRest}\n agent={agent}\n listSessionsAgentId={listSessionsAgentId}\n initialSessionId={pendingSessionId ?? hostInitialSessionId}\n >\n <DraftCatalogProvider>\n <DraftSpecPreferenceBridge />\n {onRemoteIdChange != null ? <RemoteIdRouteBridge onRemoteIdChange={onRemoteIdChange} /> : null}\n {children}\n </DraftCatalogProvider>\n </TrueFoundryChatProvider>\n );\n}\n\n/** Internal shell. `resolvedRoutes` present iff mounted under `TrueForgeUIWithRouter`. */\nexport function TrueForgeUIShell(props: TrueForgeUIShellProps) {\n const {\n layout = 'sidebar',\n overrides,\n theme,\n className,\n agentConfig = DEFAULT_AGENT_CONFIG,\n initialSettingsOpen = false,\n server: serverConfig,\n onError,\n resolvedRoutes,\n routes: _routes,\n ...providerRest\n } = props;\n\n const resolved = useResolvedServer(serverConfig, onError);\n const [activeRemoteId, setActiveRemoteId] = useState<string | undefined>(undefined);\n const handleRemoteIdChange = useCallback((id: string | undefined) => setActiveRemoteId(id), []);\n\n if (resolved.status === 'loading') {\n return (\n <SlotsProvider overrides={overrides} theme={theme}>\n <ServerInitLoader className={className} />\n </SlotsProvider>\n );\n }\n\n if (resolved.status === 'error') {\n return (\n <SlotsProvider overrides={overrides} theme={theme}>\n <ServerInitError error={resolved.error} className={className} />\n </SlotsProvider>\n );\n }\n\n const server = resolved.server;\n const layoutTree = <LayoutChildren layout={layout} className={className} />;\n\n return (\n <SlotsProvider overrides={overrides} theme={theme}>\n <ServerProvider server={server}>\n <ShellModeProvider agentConfig={agentConfig} initialSettingsOpen={initialSettingsOpen}>\n {resolvedRoutes != null ? (\n <Suspense fallback={null}>\n <ShellRouteSync\n routes={resolvedRoutes}\n activeRemoteId={activeRemoteId}\n initialSettingsOpen={initialSettingsOpen}\n />\n </Suspense>\n ) : null}\n <ChatProviderFromShell\n server={server}\n onError={onError}\n onRemoteIdChange={resolvedRoutes != null ? handleRemoteIdChange : undefined}\n {...providerRest}\n >\n {layoutTree}\n </ChatProviderFromShell>\n </ShellModeProvider>\n </ServerProvider>\n </SlotsProvider>\n );\n}\n","'use client';\n\nimport { useTrueFoundryAgentSpec, useTrueFoundryUpdateAgentSpec } from '@truefoundry/assistant-ui-runtime';\nimport { useEffect } from 'react';\n\nimport { withCapabilitiesSandbox } from '../../server/draftSpecPreferences.js';\nimport { useServerCapabilities } from '../../server/ServerContext.js';\nimport { useShellMode } from '../../server/ShellModeContext.js';\nimport type { AgentSkill, AgentSpec, ConnectorState, ModelSelection } from '../../server/types.js';\nimport { useDraftCatalog } from './DraftCatalogProvider.js';\nimport { modelPatchWithReasoningEffort } from './reasoningEffort.js';\n\nfunction mountName(mount: object): string | null {\n const name = Reflect.get(mount, 'name');\n return typeof name === 'string' ? name : null;\n}\n\nfunction filterMounts<T extends object>(mounts: T[] | undefined, availableNames: Set<string>): T[] | undefined {\n if (mounts === undefined) return undefined;\n const filtered = mounts.filter(mount => {\n const name = mountName(mount);\n return name !== null && availableNames.has(name);\n });\n return filtered.length === mounts.length ? mounts : filtered;\n}\n\nexport function reconcileDraftSpecPreferences({\n agentSpec,\n models,\n skills,\n connectors,\n skillsEnabled,\n}: {\n agentSpec: AgentSpec;\n models: ModelSelection[];\n skills: AgentSkill[];\n connectors: ConnectorState[];\n skillsEnabled: boolean | undefined;\n}): Partial<AgentSpec> {\n const update: Partial<AgentSpec> = {};\n const selectedModel = agentSpec.model.name.trim();\n if (!models.some(model => model.name === selectedModel)) {\n const fallback = models[0];\n if (fallback !== undefined) {\n update.model = modelPatchWithReasoningEffort(\n fallback.name,\n agentSpec.model.params,\n fallback.properties.reasoningEfforts,\n );\n }\n }\n\n const nextMcpServers = filterMounts(agentSpec.mcpServers, new Set(connectors.map(connector => connector.name)));\n if (nextMcpServers !== agentSpec.mcpServers) {\n update.mcpServers = nextMcpServers;\n }\n\n if (skillsEnabled === false) {\n // Only clear when there is something to clear — a fresh `[]` each call would\n // fail reference equality and loop `updateAgentSpec` forever.\n if (agentSpec.skills !== undefined && agentSpec.skills.length > 0) {\n update.skills = [];\n }\n } else {\n const nextSkills = filterMounts(agentSpec.skills, new Set(skills.map(skill => skill.name)));\n if (nextSkills !== agentSpec.skills) {\n update.skills = nextSkills;\n }\n }\n\n return update;\n}\n\nexport function reconcileDraftSandbox({\n agentSpec,\n sandboxEnabled,\n}: {\n agentSpec: AgentSpec;\n sandboxEnabled: boolean | null | undefined;\n}): Partial<AgentSpec> {\n const nextSpec = withCapabilitiesSandbox(agentSpec, sandboxEnabled);\n return nextSpec === agentSpec ? {} : { config: nextSpec.config };\n}\n\n/**\n * Mirrors plain-draft composer choices into the shell seed and removes catalog\n * entries that disappeared since those choices were stored.\n */\nexport function DraftSpecPreferenceBridge() {\n const { mode, pendingSessionId, rememberDraftSpec } = useShellMode();\n const { agentSpec } = useTrueFoundryAgentSpec();\n const updateAgentSpec = useTrueFoundryUpdateAgentSpec();\n const capabilities = useServerCapabilities();\n const sandboxEnabled = capabilities?.sandbox.enabled;\n const { models, skills, connectors, loaded, error, ensureLoaded } = useDraftCatalog();\n const isPlainDraft = mode.status === 'active' && mode.isMutable && mode.agentId == null && pendingSessionId == null;\n\n useEffect(() => {\n if (isPlainDraft) ensureLoaded();\n }, [ensureLoaded, isPlainDraft]);\n\n useEffect(() => {\n if (isPlainDraft && agentSpec != null) {\n rememberDraftSpec(agentSpec);\n }\n }, [agentSpec, isPlainDraft, rememberDraftSpec]);\n\n useEffect(() => {\n if (!isPlainDraft || agentSpec == null || updateAgentSpec == null) return;\n const update = reconcileDraftSandbox({ agentSpec, sandboxEnabled });\n if (Object.keys(update).length > 0) {\n updateAgentSpec(update);\n }\n }, [agentSpec, isPlainDraft, sandboxEnabled, updateAgentSpec]);\n\n useEffect(() => {\n if (!isPlainDraft || agentSpec == null || updateAgentSpec == null || !loaded || error != null) return;\n\n const update = reconcileDraftSpecPreferences({\n agentSpec,\n models,\n skills,\n connectors,\n skillsEnabled: capabilities?.skill.enabled,\n });\n if (Object.keys(update).length > 0) {\n updateAgentSpec(update);\n }\n }, [\n agentSpec,\n capabilities?.skill.enabled,\n connectors,\n error,\n isPlainDraft,\n loaded,\n models,\n skills,\n updateAgentSpec,\n ]);\n\n return null;\n}\n","'use client';\n\nimport { useEffect } from 'react';\n\nimport { useAuiState } from '../assistant-ui.js';\n\n/**\n * Observes the active thread's remote id (assigned once a fresh chat persists)\n * and lifts it to the parent so `ShellRouteSync` can mirror it to `/sessions/:id`.\n * Lives inside the chat runtime, so it remounts with `runtimeKey`; reporting is\n * idempotent, so that is harmless. Carries no react-router dependency.\n */\nexport function RemoteIdRouteBridge({ onRemoteIdChange }: { onRemoteIdChange: (id: string | undefined) => void }) {\n const remoteId = useAuiState(s => s.threadListItem.remoteId);\n useEffect(() => {\n onRemoteIdChange(remoteId ?? undefined);\n }, [remoteId, onRemoteIdChange]);\n return null;\n}\n","'use client';\n\nimport { createTrueFoundryAgentUIServer } from '@truefoundry/assistant-ui-runtime/plugins/truefoundry-agent-server-adapter';\nimport { useEffect, useState } from 'react';\n\nimport type { TrueForgeBuiltInServerConfig, TrueForgeServerConfig } from '../server/TrueForgeServerConfig.js';\nimport type { AgentBuilderCapabilitiesResponse, AgentUIServer, CatalogServer } from '../server/types.js';\n\nexport type ResolvedServerState =\n | { status: 'loading'; server: null; error: null }\n | { status: 'ready'; server: AgentUIServer; error: null }\n | { status: 'error'; server: null; error: unknown };\n\n/** Fallback when an older runtime adapter omits `getCapabilities`. */\nconst DEFAULT_CAPABILITIES = {\n data: {\n sandbox: { enabled: true },\n skill: { enabled: true },\n settings: { enabled: true },\n },\n} satisfies AgentBuilderCapabilitiesResponse;\n\nfunction isBuiltInConfig(config: TrueForgeServerConfig): config is TrueForgeBuiltInServerConfig {\n return (\n typeof config === 'object' &&\n config !== null &&\n 'type' in config &&\n (config.type === 'truefoundry' || config.type === 'trueforge')\n );\n}\n\nfunction hasGetCapabilities(\n server: object,\n): server is { getCapabilities: () => Promise<AgentBuilderCapabilitiesResponse> } {\n return typeof Reflect.get(server, 'getCapabilities') === 'function';\n}\n\n/**\n * Attach optional catalog and ensure `getCapabilities` exists on the composed port.\n */\nfunction toAgentUIServer(server: object, catalog: CatalogServer | undefined): AgentUIServer {\n const getCapabilities = hasGetCapabilities(server)\n ? () => server.getCapabilities()\n : async () => DEFAULT_CAPABILITIES;\n const withCapabilities = { ...server, getCapabilities };\n const withCatalog = catalog != null ? { ...withCapabilities, catalog } : withCapabilities;\n if (!isAgentUIServer(withCatalog)) {\n throw new Error('TrueForgeUI: runtime adapter returned an incomplete AgentUIServer');\n }\n return withCatalog;\n}\n\nfunction isAgentUIServer(value: object): value is AgentUIServer {\n return (\n typeof Reflect.get(value, 'createSession') === 'function' &&\n typeof Reflect.get(value, 'listSessions') === 'function' &&\n typeof Reflect.get(value, 'getSession') === 'function' &&\n typeof Reflect.get(value, 'updateSession') === 'function' &&\n typeof Reflect.get(value, 'createTurn') === 'function' &&\n typeof Reflect.get(value, 'cancelSession') === 'function' &&\n typeof Reflect.get(value, 'listTurns') === 'function' &&\n typeof Reflect.get(value, 'getTurn') === 'function' &&\n typeof Reflect.get(value, 'listEvents') === 'function' &&\n typeof Reflect.get(value, 'getCapabilities') === 'function' &&\n typeof Reflect.get(value, 'getModels') === 'function' &&\n typeof Reflect.get(value, 'getSkills') === 'function' &&\n typeof Reflect.get(value, 'getMcp') === 'function' &&\n typeof Reflect.get(value, 'searchAgents') === 'function' &&\n typeof Reflect.get(value, 'saveAgent') === 'function'\n );\n}\n\n/**\n * Resolves a {@link TrueForgeServerConfig} to an {@link AgentUIServer}.\n * - `AgentUIServer` — sync passthrough\n * - `truefoundry` — async via `createTrueFoundryAgentUIServer`\n * - `trueforge` — via dynamic import of the Harness plugin adapter\n */\nexport function useResolvedServer(\n config: TrueForgeServerConfig,\n onError?: (error: unknown) => void,\n): ResolvedServerState {\n const builtIn = isBuiltInConfig(config) ? config : null;\n const directServer: AgentUIServer | null = isBuiltInConfig(config) ? null : config;\n const type = builtIn?.type;\n const apiKey = builtIn?.type === 'truefoundry' ? builtIn.apiKey : '';\n const controlPlaneURL = builtIn?.type === 'truefoundry' ? builtIn.controlPlaneURL : '';\n const gatewayPlaneURL = builtIn?.type === 'truefoundry' ? (builtIn.gatewayPlaneURL ?? '') : '';\n const trueforgeBaseUrl = builtIn?.type === 'trueforge' ? (builtIn.baseUrl ?? '') : '';\n const trueforgeToken = builtIn?.type === 'trueforge' ? (builtIn.token ?? '') : '';\n const trueforgeFetch = builtIn?.type === 'trueforge' ? builtIn.fetch : undefined;\n const catalog = builtIn?.catalog;\n\n const [state, setState] = useState<ResolvedServerState>(() => {\n if (directServer) {\n return { status: 'ready', server: directServer, error: null };\n }\n return { status: 'loading', server: null, error: null };\n });\n\n useEffect(() => {\n if (directServer) {\n setState({ status: 'ready', server: directServer, error: null });\n return;\n }\n\n let cancelled = false;\n setState({ status: 'loading', server: null, error: null });\n\n const resolve = async (): Promise<AgentUIServer> => {\n if (type === 'trueforge') {\n const { createTrueForgeAgentUIServer } = await import('../plugins/trueforge-agent-server-adapter/index.js');\n return createTrueForgeAgentUIServer({\n ...(trueforgeBaseUrl ? { baseUrl: trueforgeBaseUrl } : {}),\n ...(trueforgeToken ? { token: trueforgeToken } : {}),\n ...(trueforgeFetch !== undefined ? { fetch: trueforgeFetch } : {}),\n ...(catalog != null ? { catalog } : {}),\n });\n }\n\n const runtimeServer = await createTrueFoundryAgentUIServer({\n apiKey,\n cpURL: controlPlaneURL,\n ...(gatewayPlaneURL ? { gatewayURL: gatewayPlaneURL } : {}),\n });\n // TrueFoundry adapter may omit catalog; attach host-supplied catalog here.\n return toAgentUIServer(runtimeServer, catalog);\n };\n\n void resolve()\n .then(server => {\n if (cancelled) return;\n try {\n // trueforge factory already includes catalog; still normalize capabilities.\n setState({\n status: 'ready',\n server: type === 'trueforge' ? toAgentUIServer(server, undefined) : server,\n error: null,\n });\n } catch (error: unknown) {\n onError?.(error);\n setState({ status: 'error', server: null, error });\n }\n })\n .catch((error: unknown) => {\n if (cancelled) return;\n onError?.(error);\n setState({ status: 'error', server: null, error });\n });\n\n return () => {\n cancelled = true;\n };\n }, [\n type,\n directServer,\n apiKey,\n controlPlaneURL,\n gatewayPlaneURL,\n trueforgeBaseUrl,\n trueforgeToken,\n trueforgeFetch,\n catalog,\n onError,\n ]);\n\n return state;\n}\n"],"mappings":"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","names":["useCallback","useMemo","useState","useEffect","useEffect","useEffect","jsx","useMemo","useState","useCallback"]}
|