@truefoundry/trueforge-ui 0.3.0-rc.0 → 0.3.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +14 -6
  3. package/dist/AgentCodeSnippets-NZOFJE57.js +74 -0
  4. package/dist/AgentCodeSnippets-NZOFJE57.js.map +1 -0
  5. package/dist/AgentMetricChart-JPU3MFQ2.js +15 -0
  6. package/dist/AgentOverview-EEBHJC32.js +167 -0
  7. package/dist/AgentOverview-EEBHJC32.js.map +1 -0
  8. package/dist/AgentSessionEventTimeline-26Z6IB3B.js +79 -0
  9. package/dist/AgentSessionEventTimeline-26Z6IB3B.js.map +1 -0
  10. package/dist/AgentSessionEventTimelineChart-CGCU7WBK.js +504 -0
  11. package/dist/AgentSessionEventTimelineChart-CGCU7WBK.js.map +1 -0
  12. package/dist/AgentSessions-3MPDZASK.js +275 -0
  13. package/dist/AgentSessions-3MPDZASK.js.map +1 -0
  14. package/dist/{ConnectorSettings-FXQ5B7TN.js → ConnectorSettings-MXFRWWR6.js} +8 -6
  15. package/dist/{ConnectorSettings-FXQ5B7TN.js.map → ConnectorSettings-MXFRWWR6.js.map} +1 -1
  16. package/dist/{DockLayout-LBNQJZNF.js → DockLayout-LM4AFMFY.js} +11 -10
  17. package/dist/{DockLayout-LBNQJZNF.js.map → DockLayout-LM4AFMFY.js.map} +1 -1
  18. package/dist/DrawerLayout-JR3O6RRB.js +184 -0
  19. package/dist/DrawerLayout-JR3O6RRB.js.map +1 -0
  20. package/dist/{ModelSettings-4L4LOQJA.js → ModelSettings-G7IFNC2Y.js} +8 -6
  21. package/dist/{ModelSettings-4L4LOQJA.js.map → ModelSettings-G7IFNC2Y.js.map} +1 -1
  22. package/dist/OpenUiFenceBlock-2TV5TQ6P.js +9 -0
  23. package/dist/OpenUiFenceBlock-2TV5TQ6P.js.map +1 -0
  24. package/dist/{SandboxSettings-Z4ZG6ZX4.js → SandboxSettings-NXAANMAX.js} +8 -6
  25. package/dist/{SandboxSettings-Z4ZG6ZX4.js.map → SandboxSettings-NXAANMAX.js.map} +1 -1
  26. package/dist/SchedulesPage-KKLUDO6B.js +15 -0
  27. package/dist/SchedulesPage-KKLUDO6B.js.map +1 -0
  28. package/dist/{SettingsBuilder-WF7ZWKQW.js → SettingsBuilder-L34IQ56S.js} +26 -22
  29. package/dist/SettingsBuilder-L34IQ56S.js.map +1 -0
  30. package/dist/{ShellRouteSync-T4WLY57Q.js → ShellRouteSync-CEBETGEJ.js} +95 -22
  31. package/dist/ShellRouteSync-CEBETGEJ.js.map +1 -0
  32. package/dist/SidebarLayout-A2HJPPHS.js +308 -0
  33. package/dist/SidebarLayout-A2HJPPHS.js.map +1 -0
  34. package/dist/{SkillSettings-3EPPC3IT.js → SkillSettings-FGGMSUNO.js} +8 -6
  35. package/dist/{SkillSettings-3EPPC3IT.js.map → SkillSettings-FGGMSUNO.js.map} +1 -1
  36. package/dist/{TrueForgeUIWithRouter-NZ4FGPE4.js → TrueForgeUIWithRouter-MZVJWJMB.js} +14 -10
  37. package/dist/{TrueForgeUIWithRouter-NZ4FGPE4.js.map → TrueForgeUIWithRouter-MZVJWJMB.js.map} +1 -1
  38. package/dist/{WidgetLayout-3QZ357FL.js → WidgetLayout-6QM45OQQ.js} +17 -13
  39. package/dist/WidgetLayout-6QM45OQQ.js.map +1 -0
  40. package/dist/chunk-2XPPBEYF.js +74 -0
  41. package/dist/chunk-2XPPBEYF.js.map +1 -0
  42. package/dist/chunk-6O6FWUDW.js +1376 -0
  43. package/dist/chunk-6O6FWUDW.js.map +1 -0
  44. package/dist/chunk-7Z2C2K7F.js +578 -0
  45. package/dist/chunk-7Z2C2K7F.js.map +1 -0
  46. package/dist/{chunk-WREC7D54.js → chunk-CYHJDKFB.js} +115 -32
  47. package/dist/chunk-CYHJDKFB.js.map +1 -0
  48. package/dist/chunk-DJUFS2BW.js +27 -0
  49. package/dist/chunk-DJUFS2BW.js.map +1 -0
  50. package/dist/chunk-DMMZSZTN.js +252 -0
  51. package/dist/chunk-DMMZSZTN.js.map +1 -0
  52. package/dist/chunk-FJW36PD7.js +180 -0
  53. package/dist/chunk-FJW36PD7.js.map +1 -0
  54. package/dist/chunk-M62XY4NC.js +555 -0
  55. package/dist/chunk-M62XY4NC.js.map +1 -0
  56. package/dist/{chunk-B52K63AW.js → chunk-MPNSO7E6.js} +2 -2
  57. package/dist/{chunk-CFLVPV5M.js → chunk-QC42MLAK.js} +7 -2
  58. package/dist/chunk-QC42MLAK.js.map +1 -0
  59. package/dist/chunk-RDXBMTP5.js +32 -0
  60. package/dist/chunk-RDXBMTP5.js.map +1 -0
  61. package/dist/chunk-SFZNIO6U.js +18 -0
  62. package/dist/chunk-SFZNIO6U.js.map +1 -0
  63. package/dist/chunk-U7KURWW3.js +840 -0
  64. package/dist/chunk-U7KURWW3.js.map +1 -0
  65. package/dist/chunk-WVE3F724.js +200 -0
  66. package/dist/chunk-WVE3F724.js.map +1 -0
  67. package/dist/{chunk-FJ5RSSMA.js → chunk-XAU7QFG3.js} +178 -36
  68. package/dist/chunk-XAU7QFG3.js.map +1 -0
  69. package/dist/chunk-Y6S4OVVQ.js +16 -0
  70. package/dist/chunk-Y6S4OVVQ.js.map +1 -0
  71. package/dist/chunk-ZKNUMH2M.js +119 -0
  72. package/dist/chunk-ZKNUMH2M.js.map +1 -0
  73. package/dist/chunk-ZTMKFZQ3.js +13214 -0
  74. package/dist/chunk-ZTMKFZQ3.js.map +1 -0
  75. package/dist/{createTrueFoundryServer-B72bU-J7.d.ts → createTrueFoundryServer-CmZnBh_l.d.ts} +15 -4
  76. package/dist/index.d.ts +1002 -22
  77. package/dist/index.js +689 -67
  78. package/dist/index.js.map +1 -1
  79. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +552 -8
  80. package/dist/plugins/trueforge-agent-server-adapter/index.js +503 -188
  81. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  82. package/dist/styles.css +1 -1
  83. package/package.json +8 -7
  84. package/dist/DrawerLayout-Q6UK4VMI.js +0 -159
  85. package/dist/DrawerLayout-Q6UK4VMI.js.map +0 -1
  86. package/dist/OpenUiFenceBlock-6UIIAVBX.js +0 -9
  87. package/dist/SettingsBuilder-WF7ZWKQW.js.map +0 -1
  88. package/dist/ShellRouteSync-T4WLY57Q.js.map +0 -1
  89. package/dist/SidebarLayout-3WZ3CVON.js +0 -256
  90. package/dist/SidebarLayout-3WZ3CVON.js.map +0 -1
  91. package/dist/WidgetLayout-3QZ357FL.js.map +0 -1
  92. package/dist/chunk-36KOSC2J.js +0 -567
  93. package/dist/chunk-36KOSC2J.js.map +0 -1
  94. package/dist/chunk-3S6KHO7H.js +0 -2121
  95. package/dist/chunk-3S6KHO7H.js.map +0 -1
  96. package/dist/chunk-7L63OK3O.js +0 -91
  97. package/dist/chunk-7L63OK3O.js.map +0 -1
  98. package/dist/chunk-CFLVPV5M.js.map +0 -1
  99. package/dist/chunk-FJ5RSSMA.js.map +0 -1
  100. package/dist/chunk-OSV3HI5M.js +0 -6891
  101. package/dist/chunk-OSV3HI5M.js.map +0 -1
  102. package/dist/chunk-WQULF5AT.js +0 -460
  103. package/dist/chunk-WQULF5AT.js.map +0 -1
  104. package/dist/chunk-WREC7D54.js.map +0 -1
  105. package/dist/chunk-YIWUG6MC.js +0 -101
  106. package/dist/chunk-YIWUG6MC.js.map +0 -1
  107. package/dist/chunk-ZXOADNF3.js +0 -75
  108. package/dist/chunk-ZXOADNF3.js.map +0 -1
  109. /package/dist/{OpenUiFenceBlock-6UIIAVBX.js.map → AgentMetricChart-JPU3MFQ2.js.map} +0 -0
  110. /package/dist/{chunk-B52K63AW.js.map → chunk-MPNSO7E6.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/containers/AgentStepsContainer.tsx","../src/containers/AskUserContainer.tsx","../src/utils/computeAgentStepsSplit.ts","../src/containers/AssistantTextContainer.tsx","../src/hooks/useThrottledMarkdownText.ts","../src/containers/ReasoningContainer.tsx","../src/containers/ToolApprovalContainer.tsx","../src/utils/toolCallParsing.ts","../src/containers/ToolCallContentBlockContainer.tsx","../src/containers/ToolCallContainer.tsx","../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/CustomActionContainer.tsx","../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 { parseMcpToolArgs } from '@/utils/toolCallParsing.js';\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 argsText?: string;\n options: ToolApprovalOption[];\n onSelectOption: (optionId: string, reason?: string) => void;\n};\n\nexport function ToolApprovalContainer({\n toolName = '',\n argsText,\n options,\n onSelectOption,\n}: ToolApprovalContainerProps) {\n const ToolApprovalBar = useSlot('ToolApprovalBar');\n const { mcpServer, innerToolName } = parseMcpToolArgs(argsText);\n const displayToolName = innerToolName && mcpServer ? `${innerToolName} (${mcpServer})` : toolName;\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={displayToolName}\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","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 { 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 argsText={part.argsText}\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","'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\nimport { useOptionalCustomActionRenderers } from '../server/CustomActionRenderersContext.js';\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 =\n { kind: 'mcp' } | { kind: 'custom'; toolName: string } | { 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 const customActionRenderers = useOptionalCustomActionRenderers();\n\n if (mcpPending) {\n return { kind: 'mcp' };\n }\n\n const firstPending = toolResponsesPending[0];\n if (firstPending != null) {\n const toolName = firstPending.toolName;\n if (toolName != null && customActionRenderers?.[toolName] != null) {\n return { kind: 'custom', toolName };\n }\n return { kind: 'ask-user' };\n }\n\n return { kind: 'compose' };\n}\n","'use client';\n\nimport { useThreadIsRunning } from '@assistant-ui/core/react';\nimport { useTrueFoundryToolResponses } from '@truefoundry/assistant-ui-runtime';\nimport { useCallback } from 'react';\n\nimport { useOptionalCustomActionRenderers } from '../server/CustomActionRenderersContext.js';\n\n/** Host custom-action UI for a pending client-side tool response. */\nexport function CustomActionContainer() {\n const renderers = useOptionalCustomActionRenderers();\n const { pending, respond } = useTrueFoundryToolResponses();\n const isRunning = useThreadIsRunning();\n const item = pending[0];\n\n const onSubmit = useCallback(\n (content: string) => {\n if (item == null) return;\n const trimmed = content.trim();\n if (!trimmed) return;\n respond({ toolCallId: item.toolCallId, content: trimmed });\n },\n [item, respond],\n );\n\n if (item == null || item.toolName == null) return null;\n const Renderer = renderers?.[item.toolName];\n if (Renderer == null) return null;\n\n return <Renderer args={item.args ?? {}} disabled={isRunning} onSubmit={onSubmit} />;\n}\n","'use client';\n\nimport { useThreadIsRunning } from '@assistant-ui/core/react';\nimport { useTrueFoundryMcpAuth } from '@truefoundry/assistant-ui-runtime';\n\nimport { useDraftCatalog } from '@/atoms/draft/DraftCatalogProvider.js';\nimport { useMCPAuth } from '@/hooks/useMcpAuth.js';\nimport { useOptionalCatalogServer } from '@/server/ServerContext.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\n\ntype McpAuthPromptProps = {\n servers: NonNullable<ReturnType<typeof useTrueFoundryMcpAuth>['pending']>['mcpServers'];\n onContinue: () => void;\n readOnly: boolean;\n};\n\nfunction CatalogMcpAuthPrompt({ servers, onContinue, readOnly }: McpAuthPromptProps) {\n const McpAuthPrompt = useSlot('McpAuthPrompt');\n const { handleAuthorize } = useMCPAuth();\n const { refreshConnectors } = useDraftCatalog();\n\n const handleConnect = (serverId: string) => {\n void handleAuthorize(serverId, isSuccess => {\n if (isSuccess) {\n void refreshConnectors();\n }\n });\n };\n\n return <McpAuthPrompt servers={servers} onConnect={handleConnect} onContinue={onContinue} readOnly={readOnly} />;\n}\n\nexport function McpAuthContainer() {\n const McpAuthPrompt = useSlot('McpAuthPrompt');\n const { pending, resume } = useTrueFoundryMcpAuth();\n const isRunning = useThreadIsRunning();\n const catalog = useOptionalCatalogServer();\n\n if (!pending) return null;\n\n if (catalog) {\n return <CatalogMcpAuthPrompt servers={pending.mcpServers} onContinue={() => void resume()} readOnly={isRunning} />;\n }\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 { CustomActionContainer } from './CustomActionContainer.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 === 'custom') {\n return <CustomActionContainer />;\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 &amp; 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 { useCallback, 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-md px-2 py-1.5 text-sm font-medium text-failure-bg outline-none transition-colors hover:bg-failure-bg/12 hover:text-failure-bg focus:bg-failure-bg/12 focus:text-failure-bg data-[highlighted]:bg-failure-bg/12 data-[highlighted]:text-failure-bg';\n\nfunction ThreadListItemDeleteMenu() {\n const compact = useCompactLayout();\n const isMobile = useIsMobile();\n const [sheetOpen, setSheetOpen] = useState(false);\n const [portalContainer, setPortalContainer] = useState<HTMLElement>();\n const useSheet = isMobile || compact;\n const setTriggerElement = useCallback((element: HTMLButtonElement | null) => {\n const themeRoot = element?.closest('.aui-theme-root');\n setPortalContainer(themeRoot instanceof HTMLElement ? themeRoot : undefined);\n }, []);\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 ref={setTriggerElement}\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 portalProps={{ container: portalContainer }}\n align=\"end\"\n sideOffset={4}\n className=\"font-sans-flex 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","display","jsx","useState","useMemo","useCallback","useCallback","useEffect","useRef","useState","jsx","useState","useRef","useCallback","useEffect","useState","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","useAuiState","useTrueFoundryToolResponses","useThreadIsRunning","useTrueFoundryToolResponses","useCallback","jsx","useTrueFoundryToolResponses","useThreadIsRunning","useCallback","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","useCallback","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","useCallback","useAui","useAuiState","useMemo","useRef","useEffect"]}
@@ -1,91 +0,0 @@
1
- import {
2
- NamedAgentHeaderLabel,
3
- ShellActions
4
- } from "./chunk-ZXOADNF3.js";
5
- import {
6
- Thread,
7
- ThreadListContainer
8
- } from "./chunk-3S6KHO7H.js";
9
- import {
10
- useAui
11
- } from "./chunk-M6MHLVSO.js";
12
- import {
13
- useSlot
14
- } from "./chunk-OSV3HI5M.js";
15
- import {
16
- Icon,
17
- Spinner,
18
- auiButtonClass
19
- } from "./chunk-FJ5RSSMA.js";
20
- import {
21
- useOptionalShellMode
22
- } from "./chunk-WQULF5AT.js";
23
- import {
24
- cn
25
- } from "./chunk-36KOSC2J.js";
26
-
27
- // src/layouts/StackChatPanel.tsx
28
- import { lazy, Suspense, useEffect, useState } from "react";
29
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
30
- var TruefoundrySettingsBuilder = lazy(() => import("./SettingsBuilder-WF7ZWKQW.js"));
31
- function StackChatPanel({ className, threadHeaderEnd }) {
32
- const [view, setView] = useState("thread");
33
- const aui = useAui();
34
- const shell = useOptionalShellMode();
35
- const ClearChatButton = useSlot("ClearChatButton");
36
- const SaveAgentButton = useSlot("SaveAgentButton");
37
- const SelectAgentEmptyState = useSlot("SelectAgentEmptyState");
38
- const isIdle = shell?.mode.status === "idle";
39
- const settingsOpen = shell?.settingsOpen === true;
40
- useEffect(() => {
41
- if (isIdle) return;
42
- void Promise.resolve(aui.threads().switchToNewThread()).catch(() => void 0);
43
- }, [aui, isIdle]);
44
- return /* @__PURE__ */ jsxs("div", { className: cn("flex h-full min-h-0 flex-col", className), children: [
45
- settingsOpen ? /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsx(
46
- Suspense,
47
- {
48
- fallback: /* @__PURE__ */ jsxs(
49
- "div",
50
- {
51
- className: "flex h-full items-center justify-center",
52
- role: "status",
53
- "aria-live": "polite",
54
- "aria-busy": "true",
55
- children: [
56
- /* @__PURE__ */ jsx(Spinner, { size: 28, className: "text-text-primary" }),
57
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Loading" })
58
- ]
59
- }
60
- ),
61
- children: /* @__PURE__ */ jsx(TruefoundrySettingsBuilder, {})
62
- }
63
- ) }) : view === "list" ? /* @__PURE__ */ jsx(ThreadListContainer, { onThreadOpen: () => setView("thread") }) : /* @__PURE__ */ jsxs(Fragment, { children: [
64
- /* @__PURE__ */ jsxs("header", { className: "flex shrink-0 items-center gap-1 border-b border-border px-2 py-1.5", children: [
65
- /* @__PURE__ */ jsx(
66
- "button",
67
- {
68
- type: "button",
69
- "aria-label": "Sessions",
70
- title: "Sessions",
71
- className: auiButtonClass({ variant: "ghost", size: "icon" }),
72
- onClick: () => setView("list"),
73
- children: /* @__PURE__ */ jsx(Icon, { name: "clock-rotate-left" })
74
- }
75
- ),
76
- /* @__PURE__ */ jsx(NamedAgentHeaderLabel, {}),
77
- /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1" }),
78
- /* @__PURE__ */ jsx(ClearChatButton, {}),
79
- /* @__PURE__ */ jsx(SaveAgentButton, {}),
80
- threadHeaderEnd
81
- ] }),
82
- /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1", children: isIdle ? /* @__PURE__ */ jsx(SelectAgentEmptyState, {}) : /* @__PURE__ */ jsx(Thread, {}) })
83
- ] }),
84
- /* @__PURE__ */ jsx("footer", { className: "flex shrink-0 justify-end border-t border-border px-2 py-1.5", children: /* @__PURE__ */ jsx(ShellActions, {}, "shell-actions") })
85
- ] });
86
- }
87
-
88
- export {
89
- StackChatPanel
90
- };
91
- //# sourceMappingURL=chunk-7L63OK3O.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/layouts/StackChatPanel.tsx"],"sourcesContent":["'use client';\n\nimport { lazy, Suspense, useEffect, useState, type ReactNode } from 'react';\n\nimport { useAui } from '../assistant-ui.js';\nimport { NamedAgentHeaderLabel } from '../atoms/NamedAgentHeaderLabel.js';\nimport { ShellActions } from '../atoms/ShellActions.js';\nimport { auiButtonClass } from '../atoms/lib/buttonClasses.js';\nimport { cn } from '../atoms/lib/cn.js';\nimport { Spinner } from '../atoms/primitives/Spinner.js';\nimport { Thread } from '../containers/Thread.js';\nimport { ThreadListContainer } from '../containers/ThreadListContainer.js';\nimport { Icon } from '../icons/Icon.js';\nimport { useOptionalShellMode } from '../server/ShellModeContext.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nconst TruefoundrySettingsBuilder = lazy(() => import('../containers/SettingsBuilder/index.js'));\n\nexport type StackChatPanelProps = {\n className?: string;\n /** Extra actions in the thread header (e.g. close for widget). */\n threadHeaderEnd?: ReactNode;\n};\n\n/**\n * List XOR thread stack used by `dock` and `widget` layouts.\n * Starts on a new chat; history icon opens the session list; New / select opens the thread.\n */\nexport function StackChatPanel({ className, threadHeaderEnd }: StackChatPanelProps) {\n const [view, setView] = useState<'list' | 'thread'>('thread');\n const aui = useAui();\n const shell = useOptionalShellMode();\n const ClearChatButton = useSlot('ClearChatButton');\n const SaveAgentButton = useSlot('SaveAgentButton');\n const SelectAgentEmptyState = useSlot('SelectAgentEmptyState');\n const isIdle = shell?.mode.status === 'idle';\n const settingsOpen = shell?.settingsOpen === true;\n\n useEffect(() => {\n if (isIdle) return;\n void Promise.resolve(aui.threads().switchToNewThread()).catch(() => undefined);\n }, [aui, isIdle]);\n\n return (\n <div className={cn('flex h-full min-h-0 flex-col', className)}>\n {settingsOpen ? (\n <div className=\"min-h-0 flex-1\">\n <Suspense\n fallback={\n <div\n className=\"flex h-full items-center justify-center\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n >\n <Spinner size={28} className=\"text-text-primary\" />\n <span className=\"sr-only\">Loading</span>\n </div>\n }\n >\n <TruefoundrySettingsBuilder />\n </Suspense>\n </div>\n ) : view === 'list' ? (\n <ThreadListContainer onThreadOpen={() => setView('thread')} />\n ) : (\n <>\n <header className=\"flex shrink-0 items-center gap-1 border-b border-border px-2 py-1.5\">\n <button\n type=\"button\"\n aria-label=\"Sessions\"\n title=\"Sessions\"\n className={auiButtonClass({ variant: 'ghost', size: 'icon' })}\n onClick={() => setView('list')}\n >\n <Icon name=\"clock-rotate-left\" />\n </button>\n <NamedAgentHeaderLabel />\n <span className=\"min-w-0 flex-1\" />\n <ClearChatButton />\n <SaveAgentButton />\n {threadHeaderEnd}\n </header>\n <div className=\"min-h-0 flex-1\">{isIdle ? <SelectAgentEmptyState /> : <Thread />}</div>\n </>\n )}\n {/* Stable mount: only ShellActions needs to survive Settings / list / thread; host end chrome stays in the thread header. */}\n <footer className=\"flex shrink-0 justify-end border-t border-border px-2 py-1.5\">\n <ShellActions key=\"shell-actions\" />\n </footer>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,MAAM,UAAU,WAAW,gBAAgC;AA+CtD,SAiBN,UAXQ,KANF;AAjCd,IAAM,6BAA6B,KAAK,MAAM,OAAO,+BAAwC,CAAC;AAYvF,SAAS,eAAe,EAAE,WAAW,gBAAgB,GAAwB;AAClF,QAAM,CAAC,MAAM,OAAO,IAAI,SAA4B,QAAQ;AAC5D,QAAM,MAAM,OAAO;AACnB,QAAM,QAAQ,qBAAqB;AACnC,QAAM,kBAAkB,QAAQ,iBAAiB;AACjD,QAAM,kBAAkB,QAAQ,iBAAiB;AACjD,QAAM,wBAAwB,QAAQ,uBAAuB;AAC7D,QAAM,SAAS,OAAO,KAAK,WAAW;AACtC,QAAM,eAAe,OAAO,iBAAiB;AAE7C,YAAU,MAAM;AACd,QAAI,OAAQ;AACZ,SAAK,QAAQ,QAAQ,IAAI,QAAQ,EAAE,kBAAkB,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,EAC/E,GAAG,CAAC,KAAK,MAAM,CAAC;AAEhB,SACE,qBAAC,SAAI,WAAW,GAAG,gCAAgC,SAAS,GACzD;AAAA,mBACC,oBAAC,SAAI,WAAU,kBACb;AAAA,MAAC;AAAA;AAAA,QACC,UACE;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,aAAU;AAAA,YACV,aAAU;AAAA,YAEV;AAAA,kCAAC,WAAQ,MAAM,IAAI,WAAU,qBAAoB;AAAA,cACjD,oBAAC,UAAK,WAAU,WAAU,qBAAO;AAAA;AAAA;AAAA,QACnC;AAAA,QAGF,8BAAC,8BAA2B;AAAA;AAAA,IAC9B,GACF,IACE,SAAS,SACX,oBAAC,uBAAoB,cAAc,MAAM,QAAQ,QAAQ,GAAG,IAE5D,iCACE;AAAA,2BAAC,YAAO,WAAU,uEAChB;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,OAAM;AAAA,YACN,WAAW,eAAe,EAAE,SAAS,SAAS,MAAM,OAAO,CAAC;AAAA,YAC5D,SAAS,MAAM,QAAQ,MAAM;AAAA,YAE7B,8BAAC,QAAK,MAAK,qBAAoB;AAAA;AAAA,QACjC;AAAA,QACA,oBAAC,yBAAsB;AAAA,QACvB,oBAAC,UAAK,WAAU,kBAAiB;AAAA,QACjC,oBAAC,mBAAgB;AAAA,QACjB,oBAAC,mBAAgB;AAAA,QAChB;AAAA,SACH;AAAA,MACA,oBAAC,SAAI,WAAU,kBAAkB,mBAAS,oBAAC,yBAAsB,IAAK,oBAAC,UAAO,GAAG;AAAA,OACnF;AAAA,IAGF,oBAAC,YAAO,WAAU,gEAChB,8BAAC,kBAAiB,eAAgB,GACpC;AAAA,KACF;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server/createTrueFoundryServer.ts"],"sourcesContent":["import type {\n AgentBuilderCapabilitiesResponse,\n AgentBuilderServer,\n AgentChatServer,\n AgentLibraryEntry,\n AgentSkill,\n AgentSpec,\n CatalogServer,\n ConnectorState,\n ModelSelection,\n SaveAgentRequest,\n SaveAgentResult,\n SearchAgentsParams,\n} from './types.js';\n\nexport type CreateTrueFoundryServerOptions<\n TSpec extends AgentSpec = AgentSpec,\n TModel extends ModelSelection = ModelSelection,\n TSkill extends AgentSkill = AgentSkill,\n TMcp extends ConnectorState = ConnectorState,\n TAgent extends AgentLibraryEntry = AgentLibraryEntry,\n TSave extends SaveAgentResult = SaveAgentResult,\n TCatalog extends CatalogServer = CatalogServer,\n TCapabilities extends AgentBuilderCapabilitiesResponse = AgentBuilderCapabilitiesResponse,\n> = {\n /** Chat port — e.g. from `@truefoundry/agent-server-adapter`. */\n chatServer: AgentChatServer<TSpec>;\n getCapabilities: () => Promise<TCapabilities>;\n getModels: () => Promise<TModel[]>;\n getSkills: () => Promise<TSkill[]>;\n getMcp: () => Promise<TMcp[]>;\n searchAgents: (req?: SearchAgentsParams) => Promise<TAgent[]>;\n saveAgent: (req: SaveAgentRequest<TSpec>) => Promise<TSave>;\n deleteAgent?: (req: { agentName: string }) => Promise<void>;\n /** Settings catalog (models + connectors). Optional. */\n catalog?: TCatalog;\n};\n\nexport type TrueFoundryServer<\n TSpec extends AgentSpec = AgentSpec,\n TModel extends ModelSelection = ModelSelection,\n TSkill extends AgentSkill = AgentSkill,\n TMcp extends ConnectorState = ConnectorState,\n TAgent extends AgentLibraryEntry = AgentLibraryEntry,\n TSave extends SaveAgentResult = SaveAgentResult,\n TCatalog extends CatalogServer = CatalogServer,\n TCapabilities extends AgentBuilderCapabilitiesResponse = AgentBuilderCapabilitiesResponse,\n> = AgentChatServer<TSpec> &\n AgentBuilderServer<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCapabilities> & {\n catalog?: TCatalog;\n };\n\n/**\n * Composes an `AgentChatServer` with host-provided builder catalog callbacks\n * and an optional settings `catalog`.\n * Gateway wiring lives in the host (or `@truefoundry/agent-server-adapter`).\n */\nexport function createTrueFoundryServer<\n TSpec extends AgentSpec = AgentSpec,\n TModel extends ModelSelection = ModelSelection,\n TSkill extends AgentSkill = AgentSkill,\n TMcp extends ConnectorState = ConnectorState,\n TAgent extends AgentLibraryEntry = AgentLibraryEntry,\n TSave extends SaveAgentResult = SaveAgentResult,\n TCatalog extends CatalogServer = CatalogServer,\n TCapabilities extends AgentBuilderCapabilitiesResponse = AgentBuilderCapabilitiesResponse,\n>(\n opts: CreateTrueFoundryServerOptions<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCatalog, TCapabilities>,\n): TrueFoundryServer<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCatalog, TCapabilities> {\n const builder: AgentBuilderServer<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCapabilities> = {\n getCapabilities: opts.getCapabilities,\n getModels: opts.getModels,\n getSkills: opts.getSkills,\n getMcp: opts.getMcp,\n searchAgents: opts.searchAgents,\n saveAgent: opts.saveAgent,\n deleteAgent: async req => {\n if (opts.deleteAgent) {\n await opts.deleteAgent(req);\n return;\n }\n throw new Error('deleteAgent is host-owned. Pass deleteAgent to createTrueFoundryServer.');\n },\n };\n\n const server: TrueFoundryServer<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCatalog, TCapabilities> = {\n ...opts.chatServer,\n ...builder,\n ...(opts.catalog != null ? { catalog: opts.catalog } : {}),\n };\n return server;\n}\n"],"mappings":";AAyDO,SAAS,wBAUd,MACwF;AACxF,QAAM,UAAyF;AAAA,IAC7F,iBAAiB,KAAK;AAAA,IACtB,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK;AAAA,IAChB,QAAQ,KAAK;AAAA,IACb,cAAc,KAAK;AAAA,IACnB,WAAW,KAAK;AAAA,IAChB,aAAa,OAAM,QAAO;AACxB,UAAI,KAAK,aAAa;AACpB,cAAM,KAAK,YAAY,GAAG;AAC1B;AAAA,MACF;AACA,YAAM,IAAI,MAAM,yEAAyE;AAAA,IAC3F;AAAA,EACF;AAEA,QAAM,SAAiG;AAAA,IACrG,GAAG,KAAK;AAAA,IACR,GAAG;AAAA,IACH,GAAI,KAAK,WAAW,OAAO,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,EAC1D;AACA,SAAO;AACT;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/icons/Icon.tsx","../src/icons/IconRegistry.tsx","../src/atoms/primitives/Spinner.tsx","../src/atoms/lib/buttonClasses.ts","../src/utils/getErrorMessage.ts","../src/atoms/lib/CompactLayoutContext.tsx","../src/atoms/draft/DraftCatalogProvider.tsx"],"sourcesContent":["import { createElement, isValidElement, useContext, type CSSProperties, type ReactNode } from 'react';\n\nimport { cn } from '../atoms/lib/cn.js';\nimport { ThemeContext } from '../theme/ThemeProvider.js';\nimport type { IconComponent, IconEntry, IconProps as ThemeIconProps } from '../theme/types.js';\nimport { lookupIcon, resolveIconName } from './IconRegistry.js';\n\nexport type IconProps = ThemeIconProps & {\n name: string | readonly string[];\n};\n\ntype IconRenderProps = {\n className?: string;\n style?: CSSProperties;\n size?: string | number;\n width?: string | number;\n height?: string | number;\n role?: string;\n} & Pick<IconProps, 'aria-hidden' | 'aria-label' | 'data-testid'>;\n\nfunction isComponent(entry: IconEntry): entry is IconComponent {\n if (typeof entry === 'function') return true;\n // Lucide (and other) icons are forwardRef objects, not functions\n return (\n typeof entry === 'object' &&\n entry !== null &&\n !isValidElement(entry) &&\n !Array.isArray(entry) &&\n '$$typeof' in entry\n );\n}\n\nfunction renderEntry(entry: IconEntry, props: IconRenderProps): ReactNode {\n if (isComponent(entry)) {\n const { size, className, style, ...aria } = props;\n return createElement(entry, {\n className: cn('inline-block shrink-0', className),\n style,\n size,\n width: size,\n height: size,\n 'aria-hidden': aria['aria-label'] ? undefined : (aria['aria-hidden'] ?? true),\n 'aria-label': aria['aria-label'],\n ...(aria['data-testid'] === undefined ? {} : { 'data-testid': aria['data-testid'] }),\n role: aria['aria-label'] ? 'img' : undefined,\n });\n }\n return entry;\n}\n\nexport function Icon({ name, className, style, size = '1em', ...aria }: IconProps) {\n const themeIcons = useContext(ThemeContext)?.icons;\n const resolved = resolveIconName(name);\n const entry = lookupIcon(resolved, themeIcons);\n if (!entry) return null;\n return <>{renderEntry(entry, { className, style, size, ...aria })}</>;\n}\n\nexport function useIcon(name: string | readonly string[]): IconEntry | undefined {\n const themeIcons = useContext(ThemeContext)?.icons;\n return lookupIcon(resolveIconName(name), themeIcons);\n}\n","import {\n Archive,\n ArrowDown,\n ArrowLeft,\n ArrowUp,\n BookOpen,\n Bot,\n Box,\n Brain,\n Check,\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n CircleAlert,\n CircleCheck,\n CircleX,\n Clock,\n Code2,\n Copy,\n Cpu,\n Download,\n Ellipsis,\n ExternalLink,\n File,\n Github,\n History,\n Info,\n Lightbulb,\n ListChecks,\n ListFilter,\n ListOrdered,\n Loader2,\n Lock,\n LogOut,\n Maximize2,\n Menu,\n Minimize2,\n Moon,\n PanelLeftClose,\n PanelLeftOpen,\n Paperclip,\n Pencil,\n Play,\n Plug,\n Plus,\n RotateCw,\n Save,\n Search,\n Settings,\n Sparkle,\n SquarePen,\n Sun,\n Terminal,\n Trash2,\n TriangleAlert,\n Wrench,\n X,\n} from 'lucide-react';\nimport type { SVGProps } from 'react';\n\nimport type { IconEntry, IconMap } from '../theme/types.js';\n\n/** Lucide `broom` (https://lucide.dev/icons/broom) — not in lucide-react 0.x. */\nfunction Broom({ size = 24, ...props }: SVGProps<SVGSVGElement> & { size?: string | number }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M13.5 10.5 22 2\" />\n <path d=\"M14.734 13.841a2 2 0 00-.314-2.42L12.58 9.58a2 2 0 00-2.421-.314l-7.657 4.461A1 1 0 002.3 15.3l6.403 6.403a1 1 0 001.571-.204z\" />\n <path d=\"m5 18 2-2\" />\n <path d=\"m7.699 10.7 5.602 5.601\" />\n </svg>\n );\n}\n\nconst registry = new Map<string, IconEntry>();\n\nexport function registerIcon(name: string, icon: IconEntry): void {\n registry.set(name, icon);\n}\n\nexport function registerIcons(icons: IconMap): void {\n for (const [name, icon] of Object.entries(icons)) {\n registry.set(name, icon);\n }\n}\n\nexport function getIcon(name: string): IconEntry | undefined {\n return registry.get(name);\n}\n\nexport function resolveIconName(icon: string | readonly string[]): string {\n if (typeof icon === 'string') return icon;\n // e.g. [\"far\", \"clone\"] → \"clone\"\n return icon[icon.length - 1] ?? '';\n}\n\nconst defaults: Record<string, IconEntry> = {\n paperclip: Paperclip,\n 'arrow-up': ArrowUp,\n 'arrow-down': ArrowDown,\n 'arrow-left': ArrowLeft,\n xmark: X,\n check: Check,\n pencil: Pencil,\n play: Play,\n 'square-pen': SquarePen,\n 'rotate-right': RotateCw,\n broom: Broom,\n ellipsis: Ellipsis,\n trash: Trash2,\n 'box-archive': Archive,\n 'clock-rotate-left': History,\n 'circle-exclamation': CircleAlert,\n info: Info,\n 'triangle-exclamation': TriangleAlert,\n 'chevron-down': ChevronDown,\n 'chevron-left': ChevronLeft,\n 'chevron-right': ChevronRight,\n loader: Loader2,\n file: File,\n clone: Copy,\n copy: Copy,\n bars: Menu,\n 'panel-left-close': PanelLeftClose,\n 'panel-left-open': PanelLeftOpen,\n plus: Plus,\n sun: Sun,\n moon: Moon,\n settings: Settings,\n 'log-out': LogOut,\n search: Search,\n clock: Clock,\n 'circle-check': CircleCheck,\n 'circle-xmark': CircleX,\n 'oauth-success': CircleCheck,\n 'oauth-error': CircleX,\n 'oauth-loading': Loader2,\n 'welcome-sparkle': Sparkle,\n robot: Bot,\n 'book-open': BookOpen,\n funnel: ListFilter,\n plug: Plug,\n 'list-check': ListChecks,\n lock: Lock,\n lightbulb: Lightbulb,\n wrench: Wrench,\n cpu: Cpu,\n cube: Box,\n 'list-ol': ListOrdered,\n download: Download,\n save: Save,\n brain: Brain,\n terminal: Terminal,\n code: Code2,\n expand: Maximize2,\n 'expand-alt': Maximize2,\n compress: Minimize2,\n 'external-link': ExternalLink,\n github: Github,\n};\n\nfor (const [name, icon] of Object.entries(defaults)) {\n registry.set(name, icon);\n}\n\n/** Merge host `theme.icons` over the registry for a single lookup (does not mutate). */\nexport function lookupIcon(name: string, themeIcons?: IconMap): IconEntry | undefined {\n if (themeIcons && name in themeIcons) {\n return themeIcons[name];\n }\n return registry.get(name);\n}\n","import React from 'react';\n\nimport { cn } from '../lib/cn.js';\n\nexport type SpinnerProps = React.SVGProps<SVGSVGElement> & {\n size?: number;\n};\n\nexport function Spinner({ size = 16, className, ...props }: SpinnerProps) {\n const r = (size / 2) * 0.75;\n const cx = size / 2;\n const circumference = 2 * Math.PI * r;\n\n return (\n <svg\n role=\"status\"\n aria-label=\"Loading\"\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n fill=\"none\"\n className={cn('animate-spin', className)}\n {...props}\n >\n <circle\n cx={cx}\n cy={cx}\n r={r}\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeDasharray={`${circumference * 0.75} ${circumference * 0.25}`}\n opacity={0.8}\n />\n </svg>\n );\n}\n","import { cn } from './cn.js';\n\nexport type AuiButtonVariant = 'default' | 'secondary' | 'ghost' | 'destructive' | 'outline';\nexport type AuiButtonSize = 'default' | 'sm' | 'lg' | 'icon';\n\nconst variantClasses: Record<AuiButtonVariant, string> = {\n default: 'bg-primary-button-bg text-primary-button-text shadow hover:bg-primary-button-hover',\n secondary:\n 'border border-input-border bg-secondary-button-bg text-secondary-button-text shadow-sm hover:bg-secondary-button-hover',\n ghost: 'bg-ghost-button-bg text-ghost-button-text hover:bg-ghost-button-hover',\n destructive: 'bg-failure-bg text-failure-text shadow-sm hover:bg-failure-bg/90',\n outline:\n 'border border-input-border bg-secondary-button-bg text-secondary-button-text shadow-sm hover:bg-secondary-button-hover',\n};\n\nconst sizeClasses: Record<AuiButtonSize, string> = {\n default: 'h-9 px-4 py-2 text-sm',\n sm: 'h-8 rounded-md px-2 text-xs',\n lg: 'h-10 rounded-md px-8 text-base',\n icon: 'h-8 w-8',\n};\n\nconst baseClasses =\n 'inline-flex cursor-pointer items-center justify-center gap-1 whitespace-nowrap rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-focus-ring disabled:cursor-not-allowed disabled:opacity-50';\n\n/** Shared Button / native `<button>` className helper (SDK utilities are layered). */\nexport function auiButtonClass({\n variant = 'default',\n size = 'default',\n className,\n}: {\n variant?: AuiButtonVariant;\n size?: AuiButtonSize;\n className?: string;\n} = {}): string {\n return cn(baseClasses, variantClasses[variant], sizeClasses[size], className);\n}\n","function isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object';\n}\n\nfunction readNonEmptyString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() !== '' ? value : undefined;\n}\n\nconst LITERAL_ESCAPE_PATTERN = /\\\\(?:[nrtbfv0'\"\\\\]|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{2})/; // literal escape sequences like \\n, \\t, \\b, \\f, \\v, \\uXXXX, \\xHH\nconst REAL_CONTROL_PATTERN = /[\\n\\t\\b\\f\\v]/; // real control characters like \\n, \\t, \\b, \\f, \\v\n\nfunction decodeLiteralEscapes(text: string): string {\n let out = '';\n for (let i = 0; i < text.length; i += 1) {\n const char = text[i];\n if (char !== '\\\\' || i + 1 >= text.length) {\n out += char;\n continue;\n }\n\n const next = text[i + 1];\n switch (next) {\n case 'n':\n out += '\\n';\n i += 1;\n break;\n case 't':\n out += '\\t';\n i += 1;\n break;\n case 'r':\n out += '\\r';\n i += 1;\n break;\n case 'b':\n out += '\\b';\n i += 1;\n break;\n case 'f':\n out += '\\f';\n i += 1;\n break;\n case 'v':\n out += '\\v';\n i += 1;\n break;\n case '0':\n out += '\\0';\n i += 1;\n break;\n case '\\\\':\n out += '\\\\';\n i += 1;\n break;\n case '\"':\n out += '\"';\n i += 1;\n break;\n case \"'\":\n out += \"'\";\n i += 1;\n break;\n case 'u': {\n const hex = text.slice(i + 2, i + 6);\n if (/^[0-9a-fA-F]{4}$/.test(hex)) {\n out += String.fromCharCode(Number.parseInt(hex, 16));\n i += 5;\n } else {\n out += char;\n }\n break;\n }\n case 'x': {\n const hex = text.slice(i + 2, i + 4);\n if (/^[0-9a-fA-F]{2}$/.test(hex)) {\n out += String.fromCharCode(Number.parseInt(hex, 16));\n i += 3;\n } else {\n out += char;\n }\n break;\n }\n default:\n out += char;\n break;\n }\n }\n return out;\n}\n\n// Decodes JSON/C-style escape sequences (e.g., \\n, \\t) in error messages, preserving real control characters and normalizing line endings.\nexport function decodeErrorMessageEscapes(text: string): string {\n const normalized = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n if (REAL_CONTROL_PATTERN.test(normalized) || !LITERAL_ESCAPE_PATTERN.test(normalized)) {\n // If the string contains real control characters or no literal escape sequences, return the normalized string.\n return normalized;\n }\n // else decode the literal escape sequences and normalize line endings\n return decodeLiteralEscapes(normalized).replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n}\n\n/**\n * Reads a display string from API-shaped errors: `message`, then nested\n * `error.message`. When neither exists, stringifies the value.\n */\nfunction messageFromErrorShaped(value: unknown): string | undefined {\n if (!isRecord(value)) return undefined;\n const direct = readNonEmptyString(value.message);\n if (direct != null) return direct;\n if (isRecord(value.error)) {\n return readNonEmptyString(value.error.message);\n }\n return undefined;\n}\n\nfunction stringifyError(error: unknown): string {\n if (typeof error === 'string') return error;\n if (isRecord(error)) {\n try {\n return JSON.stringify(error);\n } catch {\n return Object.prototype.toString.call(error);\n }\n }\n return String(error);\n}\n\n/**\n * User-facing error text. Prefers HTTP body `{ error: { message } }` when\n * present (e.g. TrueForgeError), then `error.message` / `error.error.message`,\n * then `fallback`, then a string form of the value.\n *\n * Escape sequences (`\\n`, `\\t`, `\\r`, `\\uXXXX`, …) are decoded for display when\n * still present as literal text.\n */\nexport function getErrorMessage(error: unknown, fallback?: string): string {\n if (typeof error === 'string') {\n const trimmed = error.trim();\n if (trimmed !== '') return decodeErrorMessageEscapes(error);\n return fallback != null ? decodeErrorMessageEscapes(fallback) : decodeErrorMessageEscapes(error);\n }\n\n if (isRecord(error) && 'body' in error) {\n const fromBody = messageFromErrorShaped(error.body);\n if (fromBody != null) return decodeErrorMessageEscapes(fromBody);\n if (error.body != null) {\n if (typeof error.body === 'string') {\n const trimmed = error.body.trim();\n if (trimmed !== '') return decodeErrorMessageEscapes(error.body);\n } else {\n return stringifyError(error.body);\n }\n }\n }\n\n const fromShape = messageFromErrorShaped(error);\n if (fromShape != null) return decodeErrorMessageEscapes(fromShape);\n\n if (fallback != null) return decodeErrorMessageEscapes(fallback);\n return stringifyError(error);\n}\n","'use client';\n\nimport { createContext, useContext, type ReactNode } from 'react';\n\nconst CompactLayoutContext = createContext(false);\n\nexport function CompactLayoutProvider({ children }: { children: ReactNode }) {\n return <CompactLayoutContext.Provider value>{children}</CompactLayoutContext.Provider>;\n}\n\nexport function useCompactLayout() {\n return useContext(CompactLayoutContext);\n}\n","'use client';\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode } from 'react';\n\nimport { useOptionalServer } from '../../server/ServerContext.js';\nimport type { AgentSkill, AgentUIServer, ConnectorState, ModelSelection } from '../../server/types.js';\nimport { getErrorMessage } from '../../utils/getErrorMessage.js';\n\ntype DraftCatalogValue = {\n models: ModelSelection[];\n skills: AgentSkill[];\n connectors: ConnectorState[];\n loaded: boolean;\n loading: boolean;\n error: string | null;\n /** Kick off catalog fetch (idempotent). Call when a picker opens. */\n ensureLoaded: () => void;\n /** Reload all collections after settings mutate catalog-backed configuration. */\n refresh: () => void;\n /** Refresh connector auth state without reloading unrelated catalogs. */\n refreshConnectors: () => Promise<void>;\n};\n\ntype DraftCatalogContextValue = DraftCatalogValue & {\n server: AgentUIServer | null;\n};\n\nconst DraftCatalogContext = createContext<DraftCatalogContextValue | null>(null);\n\nconst IDLE_ENSURE = () => undefined;\nconst IDLE_REFRESH = async () => undefined;\n\nexport function DraftCatalogProvider({ children }: { children: ReactNode }) {\n const server = useOptionalServer();\n const existing = useContext(DraftCatalogContext);\n if (existing?.server === server) {\n return children;\n }\n return <DraftCatalogStore server={server}>{children}</DraftCatalogStore>;\n}\n\nfunction DraftCatalogStore({ server, children }: { server: AgentUIServer | null; children: ReactNode }) {\n const [requestEpoch, setRequestEpoch] = useState<number | null>(null);\n const [models, setModels] = useState<ModelSelection[]>([]);\n const [skills, setSkills] = useState<AgentSkill[]>([]);\n const [connectors, setConnectors] = useState<ConnectorState[]>([]);\n const [completedEpoch, setCompletedEpoch] = useState<number | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const ensureLoaded = useCallback(() => {\n setRequestEpoch(current => current ?? 0);\n }, []);\n\n const refresh = useCallback(() => {\n setRequestEpoch(current => (current ?? -1) + 1);\n }, []);\n\n const refreshConnectors = useCallback(async () => {\n if (!server) return;\n setLoading(true);\n setError(null);\n try {\n const nextConnectors = await server.getMcp();\n setConnectors(nextConnectors);\n } catch (reason: unknown) {\n setError(getErrorMessage(reason, 'Failed to load connectors.'));\n } finally {\n setLoading(false);\n }\n }, [server]);\n\n useEffect(() => {\n if (requestEpoch === null || !server) return;\n let cancelled = false;\n setLoading(true);\n setError(null);\n // Settle each list alone so one failing picker does not blank the others.\n void Promise.allSettled([server.getModels(), server.getSkills(), server.getMcp()])\n .then(([modelsResult, skillsResult, mcpResult]) => {\n if (cancelled) return;\n const errors: string[] = [];\n if (modelsResult.status === 'fulfilled') {\n setModels(modelsResult.value);\n } else {\n errors.push(getErrorMessage(modelsResult.reason, 'Failed to load models.'));\n }\n if (skillsResult.status === 'fulfilled') {\n setSkills(skillsResult.value);\n } else {\n errors.push(getErrorMessage(skillsResult.reason, 'Failed to load skills.'));\n }\n if (mcpResult.status === 'fulfilled') {\n setConnectors(mcpResult.value);\n } else {\n errors.push(getErrorMessage(mcpResult.reason, 'Failed to load connectors.'));\n }\n setError(errors[0] ?? null);\n })\n .finally(() => {\n if (!cancelled) {\n setCompletedEpoch(requestEpoch);\n setLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [requestEpoch, server]);\n\n const loaded = requestEpoch !== null && completedEpoch === requestEpoch;\n const value = useMemo(\n () => ({ server, models, skills, connectors, loaded, loading, error, ensureLoaded, refresh, refreshConnectors }),\n [server, models, skills, connectors, loaded, loading, error, ensureLoaded, refresh, refreshConnectors],\n );\n\n return <DraftCatalogContext.Provider value={value}>{children}</DraftCatalogContext.Provider>;\n}\n\nexport function useDraftCatalog(): DraftCatalogValue {\n const ctx = useContext(DraftCatalogContext);\n if (ctx == null) {\n return {\n models: [],\n skills: [],\n connectors: [],\n loaded: false,\n loading: false,\n error: null,\n ensureLoaded: IDLE_ENSURE,\n refresh: IDLE_ENSURE,\n refreshConnectors: IDLE_REFRESH,\n };\n }\n return ctx;\n}\n"],"mappings":"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","names":["jsx","jsx","useContext","jsx","createContext","useContext","jsx","createContext","useContext"]}