@reforma/components 0.4.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/RichInput/RichInput.d.ts +1 -1
  2. package/dist/RichInput/RichInput.d.ts.map +1 -1
  3. package/dist/RichInput/RichInput.js +126 -123
  4. package/dist/RichInput/RichInput.js.map +1 -1
  5. package/dist/SortableList/SortableList.d.ts +9 -3
  6. package/dist/SortableList/SortableList.d.ts.map +1 -1
  7. package/dist/SortableList/SortableList.js +178 -163
  8. package/dist/SortableList/SortableList.js.map +1 -1
  9. package/dist/chat/ComposerBanner/ComposerBanner.d.ts +6 -1
  10. package/dist/chat/ComposerBanner/ComposerBanner.d.ts.map +1 -1
  11. package/dist/chat/ComposerBanner/ComposerBanner.js +60 -40
  12. package/dist/chat/ComposerBanner/ComposerBanner.js.map +1 -1
  13. package/dist/chat/ComposerBanner/ComposerBanner.module.css +1 -1
  14. package/dist/chat/ComposerBanner/ComposerBanner.module.css.js +13 -9
  15. package/dist/chat/ComposerBanner/ComposerBanner.module.css.js.map +1 -1
  16. package/dist/chat/Conversation/ConversationPendingLoader.d.ts.map +1 -1
  17. package/dist/chat/Conversation/ConversationPendingLoader.js +1 -1
  18. package/dist/chat/Conversation/ConversationPendingLoader.js.map +1 -1
  19. package/dist/chat/Message/normalize/normalizeMessageParts.d.ts +1 -1
  20. package/dist/chat/Message/normalize/normalizeMessageParts.d.ts.map +1 -1
  21. package/dist/chat/Message/normalize/normalizeMessageParts.js +1 -1
  22. package/dist/chat/Message/normalize/normalizeMessageParts.js.map +1 -1
  23. package/dist/chat/Message/parts/MessagePart.d.ts.map +1 -1
  24. package/dist/chat/Message/parts/MessagePart.js +1 -1
  25. package/dist/chat/Message/parts/MessagePart.js.map +1 -1
  26. package/dist/chat/Message/parts/backgroundResultPart.js +1 -1
  27. package/dist/chat/Message/parts/backgroundResultPart.js.map +1 -1
  28. package/dist/chat/Message/parts/collectMessageSources.d.ts +1 -1
  29. package/dist/chat/Message/parts/collectMessageSources.d.ts.map +1 -1
  30. package/dist/chat/Message/parts/collectMessageSources.js +1 -1
  31. package/dist/chat/Message/parts/collectMessageSources.js.map +1 -1
  32. package/dist/chat/Message/parts/contextCompactionPart.js +1 -1
  33. package/dist/chat/Message/parts/contextCompactionPart.js.map +1 -1
  34. package/dist/chat/Message/segments/analyzeGroupedSegment.js +5 -5
  35. package/dist/chat/Message/segments/analyzeGroupedSegment.js.map +1 -1
  36. package/dist/chat/Message/segments/recentStreamingPhaseToolGroups.js +1 -1
  37. package/dist/chat/Message/segments/recentStreamingPhaseToolGroups.js.map +1 -1
  38. package/dist/chat/Message/turn/workedCollapse.js +1 -1
  39. package/dist/chat/Message/turn/workedCollapse.js.map +1 -1
  40. package/dist/chat/Tool/Tool.js +1 -1
  41. package/dist/chat/Tool/Tool.js.map +1 -1
  42. package/dist/chat/Tool/agent/AgentTool.d.ts.map +1 -1
  43. package/dist/chat/Tool/agent/AgentTool.js +73 -73
  44. package/dist/chat/Tool/agent/AgentTool.js.map +1 -1
  45. package/dist/chat/Tool/bash/BashTool.d.ts.map +1 -1
  46. package/dist/chat/Tool/bash/BashTool.js +42 -48
  47. package/dist/chat/Tool/bash/BashTool.js.map +1 -1
  48. package/dist/chat/Tool/bash/BashTool.module.css +1 -1
  49. package/dist/chat/Tool/bash/BashTool.module.css.js +6 -8
  50. package/dist/chat/Tool/bash/BashTool.module.css.js.map +1 -1
  51. package/dist/chat/Tool/create-directory/CreateDirectoryTool.js +1 -1
  52. package/dist/chat/Tool/create-directory/CreateDirectoryTool.js.map +1 -1
  53. package/dist/chat/Tool/default/Default.d.ts.map +1 -1
  54. package/dist/chat/Tool/default/Default.js +1 -1
  55. package/dist/chat/Tool/default/Default.js.map +1 -1
  56. package/dist/chat/Tool/dev-server/DevServerRestartTool.js +1 -1
  57. package/dist/chat/Tool/dev-server/DevServerRestartTool.js.map +1 -1
  58. package/dist/chat/Tool/dev-server/DevServerStatusTool.js +1 -1
  59. package/dist/chat/Tool/dev-server/DevServerStatusTool.js.map +1 -1
  60. package/dist/chat/Tool/edit/EditTool.js +1 -1
  61. package/dist/chat/Tool/edit/EditTool.js.map +1 -1
  62. package/dist/chat/Tool/fetch/FetchTool.js +1 -1
  63. package/dist/chat/Tool/fetch/FetchTool.js.map +1 -1
  64. package/dist/chat/Tool/fileChangesFromToolParts.js +1 -1
  65. package/dist/chat/Tool/fileChangesFromToolParts.js.map +1 -1
  66. package/dist/chat/Tool/get-background-result/GetBackgroundResultTool.js +1 -1
  67. package/dist/chat/Tool/get-background-result/GetBackgroundResultTool.js.map +1 -1
  68. package/dist/chat/Tool/get-errors/GetErrorsTool.js +1 -1
  69. package/dist/chat/Tool/get-errors/GetErrorsTool.js.map +1 -1
  70. package/dist/chat/Tool/glob/GlobTool.js +1 -1
  71. package/dist/chat/Tool/glob/GlobTool.js.map +1 -1
  72. package/dist/chat/Tool/grep/GrepTool.js +1 -1
  73. package/dist/chat/Tool/grep/GrepTool.js.map +1 -1
  74. package/dist/chat/Tool/helpers.d.ts +1 -1
  75. package/dist/chat/Tool/helpers.d.ts.map +1 -1
  76. package/dist/chat/Tool/helpers.js +1 -1
  77. package/dist/chat/Tool/helpers.js.map +1 -1
  78. package/dist/chat/Tool/image-asset/ImageAssetTool.js +1 -1
  79. package/dist/chat/Tool/image-asset/ImageAssetTool.js.map +1 -1
  80. package/dist/chat/Tool/install-dependencies/InstallDependenciesTool.js +1 -1
  81. package/dist/chat/Tool/install-dependencies/InstallDependenciesTool.js.map +1 -1
  82. package/dist/chat/Tool/install-plugin/InstallPlugin.js +1 -1
  83. package/dist/chat/Tool/install-plugin/InstallPlugin.js.map +1 -1
  84. package/dist/chat/Tool/integration-card/IntegrationActionCard.d.ts +3 -1
  85. package/dist/chat/Tool/integration-card/IntegrationActionCard.d.ts.map +1 -1
  86. package/dist/chat/Tool/integration-card/IntegrationActionCard.js +88 -82
  87. package/dist/chat/Tool/integration-card/IntegrationActionCard.js.map +1 -1
  88. package/dist/chat/Tool/list-directory/normalizeListDirectoryTools.js +1 -1
  89. package/dist/chat/Tool/list-directory/normalizeListDirectoryTools.js.map +1 -1
  90. package/dist/chat/Tool/mcp-tools/CallDynamicTool.js +1 -1
  91. package/dist/chat/Tool/mcp-tools/CallDynamicTool.js.map +1 -1
  92. package/dist/chat/Tool/mcp-tools/GetDynamicToolsTool.js +1 -1
  93. package/dist/chat/Tool/mcp-tools/GetDynamicToolsTool.js.map +1 -1
  94. package/dist/chat/Tool/mcp-tools/GetMcpResourcesTool.js +1 -1
  95. package/dist/chat/Tool/mcp-tools/GetMcpResourcesTool.js.map +1 -1
  96. package/dist/chat/Tool/mcp-tools/McpAuth.js +1 -1
  97. package/dist/chat/Tool/mcp-tools/McpAuth.js.map +1 -1
  98. package/dist/chat/Tool/memory/MemoryTool.js +1 -1
  99. package/dist/chat/Tool/memory/MemoryTool.js.map +1 -1
  100. package/dist/chat/Tool/move-file/MoveFileTool.js +1 -1
  101. package/dist/chat/Tool/move-file/MoveFileTool.js.map +1 -1
  102. package/dist/chat/Tool/plan/CreatePlanTool.js +1 -1
  103. package/dist/chat/Tool/plan/CreatePlanTool.js.map +1 -1
  104. package/dist/chat/Tool/preamble/PreambleTool.js +1 -1
  105. package/dist/chat/Tool/preamble/PreambleTool.js.map +1 -1
  106. package/dist/chat/Tool/project-build/BuildTool.js +1 -1
  107. package/dist/chat/Tool/project-build/BuildTool.js.map +1 -1
  108. package/dist/chat/Tool/project-env/ProjectEnvTool.js +1 -1
  109. package/dist/chat/Tool/project-env/ProjectEnvTool.js.map +1 -1
  110. package/dist/chat/Tool/read/normalizeReadTools.js +1 -1
  111. package/dist/chat/Tool/read/normalizeReadTools.js.map +1 -1
  112. package/dist/chat/Tool/read-lints/ReadLintsTool.js +1 -1
  113. package/dist/chat/Tool/read-lints/ReadLintsTool.js.map +1 -1
  114. package/dist/chat/Tool/remove-file/RemoveFileTool.js +1 -1
  115. package/dist/chat/Tool/remove-file/RemoveFileTool.js.map +1 -1
  116. package/dist/chat/Tool/scaffold-project/ScaffoldProjectTool.js +1 -1
  117. package/dist/chat/Tool/scaffold-project/ScaffoldProjectTool.js.map +1 -1
  118. package/dist/chat/Tool/screenshot/CaptureScreenshotTool.js +3 -3
  119. package/dist/chat/Tool/screenshot/CaptureScreenshotTool.js.map +1 -1
  120. package/dist/chat/Tool/skill/SkillTool.js +1 -1
  121. package/dist/chat/Tool/skill/SkillTool.js.map +1 -1
  122. package/dist/chat/Tool/waiting/WaitingTool.js +1 -1
  123. package/dist/chat/Tool/waiting/WaitingTool.js.map +1 -1
  124. package/dist/chat/Tool/web-search/WebSearchTool.js +1 -1
  125. package/dist/chat/Tool/web-search/WebSearchTool.js.map +1 -1
  126. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"AgentTool.js","sources":["../../../../src/chat/Tool/agent/AgentTool.tsx"],"sourcesContent":["import { Message } from '@reforma/icons/14';\nimport { ProgressLoader } from '@reforma/icons/assets';\nimport { basename, humanizeString, plural } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from 'ai';\nimport { observer } from 'mobx-react-lite';\n\nimport { Box } from '../../../Box';\nimport { Pressable } from '../../../Pressable';\nimport { Shimmer } from '../../../Shimmer';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { useChat } from '../../ChatContext';\nimport { useMessageTurn } from '../../Message/turn/messageTurnContext';\nimport { getToolFailureRowState, TOOL_INTERRUPTED_MESSAGE } from '../helpers';\nimport { ToolShellCard } from '../shell';\nimport { useToolProgress } from '../shell/toolProgress';\nimport shellStyles from '../shell/ToolShellCard.module.css';\nimport styles from './AgentTool.module.css';\n\nimport type { AgentToolInput, AgentToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\n/** User-facing labels for known subagent ids (fallback: capitalized id). */\nconst SUBAGENT_LABELS: Record<string, string> = {\n research: 'Explore',\n shell: 'Shell',\n verify: 'Verify',\n plan: 'Plan',\n};\n\nconst SUBAGENT_LIVE: Record<string, string> = {\n research: 'Exploring',\n shell: 'Running',\n verify: 'Verifying',\n plan: 'Planning',\n};\n\nfunction agentErrorFromOutput(output: unknown): string | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n const error = (output as AgentToolOutput).error;\n\n return (typeof error === 'string' && error.trim().length > 0) ? error.trim() : undefined;\n}\n\nfunction agentNameFromPart(part: { input?: unknown; output?: unknown }): string | undefined {\n for (const source of [part.output, part.input]) {\n if (source == null || typeof source !== 'object') {\n continue;\n }\n\n const name = (source as AgentToolInput | AgentToolOutput).name;\n\n if (typeof name === 'string' && name.trim().length > 0) {\n return name.trim();\n }\n }\n\n return undefined;\n}\n\nfunction subagentLabel(name: string | undefined): string {\n const id = name?.trim() || 'research';\n const mapped = SUBAGENT_LABELS[id];\n\n if (mapped) {\n return mapped;\n }\n\n return id.charAt(0).toUpperCase() + id.slice(1);\n}\n\nfunction agentPhaseCopy(name: string | undefined): { live: string; done: string } {\n const id = name?.trim() || 'research';\n const label = subagentLabel(name);\n\n return {\n live: SUBAGENT_LIVE[id] ?? `Running ${ label }`,\n done: `Ran ${ label } agent`,\n };\n}\n\nfunction fieldString(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const trimmed = value.trim();\n\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction fileLabel(input: Record<string, unknown>): string | undefined {\n const path = fieldString(input.path);\n\n if (path) {\n return basename(path);\n }\n\n if (!Array.isArray(input.paths)) {\n return undefined;\n }\n\n const files = input.paths.filter((item): item is string => typeof item === 'string' && item.trim().length > 0);\n\n if (files.length === 1) {\n return basename(files[0]);\n }\n\n if (files.length > 1) {\n return plural(files.length, 'file', 'files');\n }\n\n return undefined;\n}\n\nfunction fileActivity(verb: string, fallback: string) {\n return (input: Record<string, unknown>) => `${ verb } ${ fileLabel(input) ?? fallback }`;\n}\n\nconst TOOL_ACTIVITY: Record<string, (input: Record<string, unknown>) => string | undefined> = {\n Read: fileActivity('Reading', 'file'),\n Write: fileActivity('Writing', 'file'),\n Edit: fileActivity('Editing', 'file'),\n ListDirectory: fileActivity('Listing', 'files'),\n CreateDirectory: fileActivity('Creating', 'folder'),\n MoveFile: fileActivity('Moving', 'file'),\n RemoveFile: fileActivity('Removing', 'file'),\n Grep: input => `Grepping ${ fieldString(input.pattern) ?? 'code' }`,\n Glob: input => `Finding ${ fieldString(input.glob) ?? 'files' }`,\n GetBackgroundResult: () => 'Background task',\n Bash: (input) => {\n const command = fieldString(input.command);\n\n return command ? `Running ${ command }` : 'Running command';\n },\n Fetch: input => `Fetching ${ fieldString(input.url) ?? 'page' }`,\n Skill: input => `Loading ${ fieldString(input.name) ?? 'skill' }`,\n GetMcpResources: (input) => {\n const uri = fieldString(input.uri);\n\n if (uri) {\n const tail = uri.replace(/\\/+$/, '').split('/').pop()?.trim();\n\n return `Reading ${ tail || uri }`;\n }\n\n return 'Listing MCP resources';\n },\n Preamble: input => fieldString(input.content),\n ReadLints: () => 'Checking lints',\n PageScreenshot: () => 'Capturing screenshot',\n CheckPage: () => 'Checking pages',\n DevServerStatus: () => 'Checking project',\n ImportAsset: () => 'Importing asset',\n CreatePlan: () => 'Creating plan',\n EditPlan: () => 'Editing plan',\n ReadPlan: () => 'Reading plan',\n};\n\n/** One composer strip: who is running, and the child thread Show opens. */\nexport function subagentComposerCopy(\n part: { input?: unknown; output?: unknown },\n patch: Record<string, unknown> | undefined\n): { text: string; label: string; childThreadId?: string; waiting: boolean } {\n const name = agentNameFromPart(part);\n const label = subagentLabel(name);\n const waiting = patch?.needsUser === true;\n const childThreadId = fieldString((part.output as AgentToolOutput | undefined)?.childThreadId)\n ?? fieldString(patch?.childThreadId);\n const text = waiting\n ? `${ label } · Waiting for you`\n : `${ label } Agent working`;\n\n return { text, label, childThreadId, waiting };\n}\n\n/** Live subtitle for a tool — same copy for Agent rows and the compact rail task. */\nexport function subagentActivityLabel(patch: Record<string, unknown> | undefined): string | undefined {\n if (!patch) {\n return undefined;\n }\n\n if (patch.type === 'text') {\n return 'Finishing reply';\n }\n\n if (patch.type === 'reasoning') {\n return 'Thinking…';\n }\n\n const toolName = fieldString(patch.toolName);\n\n if (!toolName) {\n return undefined;\n }\n\n const rawInput = patch.input;\n const input = (rawInput != null && typeof rawInput === 'object' && !Array.isArray(rawInput))\n ? rawInput as Record<string, unknown>\n : {};\n\n return TOOL_ACTIVITY[toolName]?.(input)\n ?? `Using ${ fieldString(patch.title) ?? humanizeString(toolName) }`;\n}\n\n/** Live/waiting subtitle. Done rows stay quiet — no empty \"Completed\". */\nexport function agentStatusLine(input: {\n live: boolean;\n failed: boolean;\n stalled?: boolean;\n needsUser?: boolean;\n activity?: string;\n}): string | undefined {\n if (input.failed || input.stalled) {\n return undefined;\n }\n\n if (input.needsUser) {\n return 'Waiting for you';\n }\n\n if (!input.live) {\n return undefined;\n }\n\n return input.activity ?? 'Starting…';\n}\n\n/** Subagent card. Running: loader, shimmer title, gray activity. Finished: same frame, quiet title. */\nfunction AgentCard({\n title,\n activity,\n errorText,\n running,\n stalled,\n onOpen,\n}: {\n title: string;\n activity?: string;\n errorText?: string;\n running: boolean;\n stalled: boolean;\n onOpen?: () => void;\n}) {\n const heading = stalled ? TOOL_INTERRUPTED_MESSAGE : title;\n const copy = (\n <Box align=\"center\" direction=\"row\" fullWidth gap=\"md\" padding=\"md\">\n <Show\n when={ running }\n fallback={ <Message aria-hidden /> }\n >\n <ProgressLoader aria-hidden size={ 14 } />\n </Show>\n <Box gap=\"xxs\" grow>\n <Show\n when={ running }\n fallback={ (\n <Text className={ styles.title } color={ stalled ? 'danger' : undefined }>\n { heading }\n </Text>\n ) }\n >\n <Shimmer as=\"span\" className={ styles.title } duration={ 1 }>\n { heading }\n </Shimmer>\n </Show>\n <Show when={ running ? activity : undefined }>\n { line => (\n <Text color=\"secondary\" truncate variant=\"sm\">\n { line }\n </Text>\n ) }\n </Show>\n <Show when={ errorText }>\n { line => (\n <Text color=\"danger\" variant=\"xs\">{ line }</Text>\n ) }\n </Show>\n </Box>\n </Box>\n );\n\n return (\n <ToolShellCard\n aria-busy={ running || undefined }\n className={ shellStyles.tool }\n collapsible={ false }\n data-slot=\"agent-tool\"\n >\n <Show\n when={ onOpen }\n fallback={ copy }\n >\n { open => (\n <Pressable\n aria-label={ activity ? `${ heading }. ${ activity }` : heading }\n className={ styles.hit }\n onPress={ open }\n >\n { copy }\n </Pressable>\n ) }\n </Show>\n </ToolShellCard>\n );\n}\n\n/** Agent subagent card. Opens the child thread. */\nexport const AgentTool = observer(({ part }: ToolRendererProps) => {\n const turn = useMessageTurn();\n const { onOpenSubagent } = useChat();\n const patch = turn?.getToolMeta?.(part.toolCallId)?.patch;\n const needsUser = patch?.needsUser === true;\n const { live, stalled } = useToolProgress(part.state, needsUser);\n\n if (!isToolUIPart(part) || getToolName(part) !== 'Agent') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const logicalError = part.state === 'output-available'\n ? agentErrorFromOutput(part.output)\n : undefined;\n const failed = failure.useFailureLabel || Boolean(logicalError);\n const agentName = agentNameFromPart(part);\n const label = subagentLabel(agentName);\n const phase = agentPhaseCopy(agentName);\n const activity = subagentActivityLabel(patch);\n const statusLine = agentStatusLine({\n live,\n failed,\n stalled,\n needsUser,\n activity,\n });\n const childThreadId = fieldString((part.output as AgentToolOutput | undefined)?.childThreadId)\n ?? fieldString(patch?.childThreadId);\n const canOpen = Boolean(childThreadId && onOpenSubagent && !failed);\n const errorText = logicalError ?? failure.problemText ?? failure.tooltip;\n const openChild = canOpen\n ? () => onOpenSubagent?.(childThreadId!, label)\n : undefined;\n\n return (\n <AgentCard\n activity={ statusLine }\n errorText={ errorText }\n onOpen={ openChild }\n running={ live && !failed && !stalled }\n stalled={ stalled }\n title={ live && !failed && !stalled ? phase.live : phase.done }\n />\n );\n});\n"],"names":["SUBAGENT_LABELS","SUBAGENT_LIVE","agentErrorFromOutput","output","error","agentNameFromPart","part","source","name","subagentLabel","id","mapped","agentPhaseCopy","label","fieldString","value","trimmed","fileLabel","input","path","basename","files","item","plural","fileActivity","verb","fallback","TOOL_ACTIVITY","command","uri","subagentComposerCopy","patch","waiting","childThreadId","subagentActivityLabel","toolName","rawInput","humanizeString","agentStatusLine","AgentCard","title","activity","errorText","running","stalled","onOpen","heading","TOOL_INTERRUPTED_MESSAGE","copy","Box","_jsx","Show","Message","ProgressLoader","_jsxs","Text","styles","Shimmer","line","ToolShellCard","shellStyles","open","Pressable","AgentTool","observer","turn","useMessageTurn","onOpenSubagent","useChat","needsUser","live","useToolProgress","isToolUIPart","getToolName","failure","getToolFailureRowState","logicalError","failed","agentName","phase","statusLine","canOpen"],"mappings":"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"}
1
+ {"version":3,"file":"AgentTool.js","sources":["../../../../src/chat/Tool/agent/AgentTool.tsx"],"sourcesContent":["import { Message } from '@reforma/icons/14';\nimport { ProgressLoader } from '@reforma/icons/assets';\nimport { basename, humanizeString, plural } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from '@reforma/types';\nimport { observer } from 'mobx-react-lite';\n\nimport { Box } from '../../../Box';\nimport { Pressable } from '../../../Pressable';\nimport { Shimmer } from '../../../Shimmer';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { useChat } from '../../ChatContext';\nimport { useMessageTurn } from '../../Message/turn/messageTurnContext';\nimport { getToolFailureRowState, TOOL_INTERRUPTED_MESSAGE } from '../helpers';\nimport { ToolShellCard } from '../shell';\nimport { useToolProgress } from '../shell/toolProgress';\nimport shellStyles from '../shell/ToolShellCard.module.css';\nimport styles from './AgentTool.module.css';\n\nimport type { AgentToolInput, AgentToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\n/** User-facing labels for known subagent ids (fallback: capitalized id). */\nconst SUBAGENT_LABELS: Record<string, string> = {\n research: 'Explore',\n shell: 'Shell',\n verify: 'Verify',\n plan: 'Plan',\n};\n\nconst SUBAGENT_LIVE: Record<string, string> = {\n research: 'Exploring',\n shell: 'Running',\n verify: 'Verifying',\n plan: 'Planning',\n};\n\nfunction agentErrorFromOutput(output: unknown): string | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n const error = (output as AgentToolOutput).error;\n\n return (typeof error === 'string' && error.trim().length > 0) ? error.trim() : undefined;\n}\n\nfunction agentNameFromPart(part: { input?: unknown; output?: unknown }): string | undefined {\n for (const source of [part.output, part.input]) {\n if (source == null || typeof source !== 'object') {\n continue;\n }\n\n const name = (source as AgentToolInput | AgentToolOutput).name;\n\n if (typeof name === 'string' && name.trim().length > 0) {\n return name.trim();\n }\n }\n\n return undefined;\n}\n\nfunction subagentLabel(name: string | undefined): string {\n const id = name?.trim() || 'research';\n const mapped = SUBAGENT_LABELS[id];\n\n if (mapped) {\n return mapped;\n }\n\n return id.charAt(0).toUpperCase() + id.slice(1);\n}\n\nfunction agentPhaseCopy(name: string | undefined, background: boolean): { live: string; done: string } {\n const id = name?.trim() || 'research';\n const label = subagentLabel(name);\n\n return {\n live: SUBAGENT_LIVE[id] ?? `Running ${ label }`,\n done: background ? `Started ${ label } agent in background` : `Ran ${ label } agent`,\n };\n}\n\nfunction fieldString(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const trimmed = value.trim();\n\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction fileLabel(input: Record<string, unknown>): string | undefined {\n const path = fieldString(input.path);\n\n if (path) {\n return basename(path);\n }\n\n if (!Array.isArray(input.paths)) {\n return undefined;\n }\n\n const files = input.paths.filter((item): item is string => typeof item === 'string' && item.trim().length > 0);\n\n if (files.length === 1) {\n return basename(files[0]);\n }\n\n if (files.length > 1) {\n return plural(files.length, 'file', 'files');\n }\n\n return undefined;\n}\n\nfunction fileActivity(verb: string, fallback: string) {\n return (input: Record<string, unknown>) => `${ verb } ${ fileLabel(input) ?? fallback }`;\n}\n\nconst TOOL_ACTIVITY: Record<string, (input: Record<string, unknown>) => string | undefined> = {\n Read: fileActivity('Reading', 'file'),\n Write: fileActivity('Writing', 'file'),\n Edit: fileActivity('Editing', 'file'),\n ListDirectory: fileActivity('Listing', 'files'),\n CreateDirectory: fileActivity('Creating', 'folder'),\n MoveFile: fileActivity('Moving', 'file'),\n RemoveFile: fileActivity('Removing', 'file'),\n Grep: input => `Grepping ${ fieldString(input.pattern) ?? 'code' }`,\n Glob: input => `Finding ${ fieldString(input.glob) ?? 'files' }`,\n GetBackgroundResult: () => 'Background task',\n Bash: (input) => {\n const command = fieldString(input.command);\n\n return command ? `Running ${ command }` : 'Running command';\n },\n Fetch: input => `Fetching ${ fieldString(input.url) ?? 'page' }`,\n Skill: input => `Loading ${ fieldString(input.name) ?? 'skill' }`,\n GetMcpResources: (input) => {\n const uri = fieldString(input.uri);\n\n if (uri) {\n const tail = uri.replace(/\\/+$/, '').split('/').pop()?.trim();\n\n return `Reading ${ tail || uri }`;\n }\n\n return 'Listing MCP resources';\n },\n Preamble: input => fieldString(input.content),\n ReadLints: () => 'Checking lints',\n PageScreenshot: () => 'Capturing screenshot',\n CheckPage: () => 'Checking pages',\n DevServerStatus: () => 'Checking project',\n ImportAsset: () => 'Importing asset',\n CreatePlan: () => 'Creating plan',\n EditPlan: () => 'Editing plan',\n ReadPlan: () => 'Reading plan',\n};\n\n/** One composer strip: who is running, and the child thread Show opens. */\nexport function subagentComposerCopy(\n part: { input?: unknown; output?: unknown },\n patch: Record<string, unknown> | undefined\n): { text: string; label: string; childThreadId?: string; waiting: boolean } {\n const name = agentNameFromPart(part);\n const label = subagentLabel(name);\n const waiting = patch?.needsUser === true;\n const childThreadId = fieldString((part.output as AgentToolOutput | undefined)?.childThreadId)\n ?? fieldString(patch?.childThreadId);\n const text = waiting\n ? `${ label } · Waiting for you`\n : `${ label } Agent working`;\n\n return { text, label, childThreadId, waiting };\n}\n\n/** Live subtitle for a tool — same copy for Agent rows and the compact rail task. */\nexport function subagentActivityLabel(patch: Record<string, unknown> | undefined): string | undefined {\n if (!patch) {\n return undefined;\n }\n\n if (patch.type === 'text') {\n return 'Finishing reply';\n }\n\n if (patch.type === 'reasoning') {\n return 'Thinking…';\n }\n\n const toolName = fieldString(patch.toolName);\n\n if (!toolName) {\n return undefined;\n }\n\n const rawInput = patch.input;\n const input = (rawInput != null && typeof rawInput === 'object' && !Array.isArray(rawInput))\n ? rawInput as Record<string, unknown>\n : {};\n\n return TOOL_ACTIVITY[toolName]?.(input)\n ?? `Using ${ fieldString(patch.title) ?? humanizeString(toolName) }`;\n}\n\n/** Live/waiting subtitle. Done rows stay quiet — no empty \"Completed\". */\nexport function agentStatusLine(input: {\n live: boolean;\n failed: boolean;\n stalled?: boolean;\n needsUser?: boolean;\n activity?: string;\n}): string | undefined {\n if (input.failed || input.stalled) {\n return undefined;\n }\n\n if (input.needsUser) {\n return 'Waiting for you';\n }\n\n if (!input.live) {\n return undefined;\n }\n\n return input.activity ?? 'Starting…';\n}\n\n/** Subagent card. Running: loader, shimmer title, gray activity. Finished: same frame, quiet title. */\nfunction AgentCard({\n title,\n activity,\n errorText,\n running,\n stalled,\n onOpen,\n}: {\n title: string;\n activity?: string;\n errorText?: string;\n running: boolean;\n stalled: boolean;\n onOpen?: () => void;\n}) {\n const heading = stalled ? TOOL_INTERRUPTED_MESSAGE : title;\n const copy = (\n <Box align=\"center\" direction=\"row\" fullWidth gap=\"md\" padding=\"md\">\n <Show\n when={ running }\n fallback={ <Message aria-hidden /> }\n >\n <ProgressLoader aria-hidden size={ 14 } />\n </Show>\n <Box gap=\"xxs\" grow>\n <Show\n when={ running }\n fallback={ (\n <Text className={ styles.title } color={ stalled ? 'danger' : undefined }>\n { heading }\n </Text>\n ) }\n >\n <Shimmer as=\"span\" className={ styles.title } duration={ 1 }>\n { heading }\n </Shimmer>\n </Show>\n <Show when={ running ? activity : undefined }>\n { line => (\n <Text color=\"secondary\" truncate variant=\"sm\">\n { line }\n </Text>\n ) }\n </Show>\n <Show when={ errorText }>\n { line => (\n <Text color=\"danger\" variant=\"xs\">{ line }</Text>\n ) }\n </Show>\n </Box>\n </Box>\n );\n\n return (\n <ToolShellCard\n aria-busy={ running || undefined }\n className={ shellStyles.tool }\n collapsible={ false }\n data-slot=\"agent-tool\"\n >\n <Show\n when={ onOpen }\n fallback={ copy }\n >\n { open => (\n <Pressable\n aria-label={ activity ? `${ heading }. ${ activity }` : heading }\n className={ styles.hit }\n onPress={ open }\n >\n { copy }\n </Pressable>\n ) }\n </Show>\n </ToolShellCard>\n );\n}\n\n/** Agent subagent card. Opens the child thread. */\nexport const AgentTool = observer(({ part }: ToolRendererProps) => {\n const turn = useMessageTurn();\n const { onOpenSubagent } = useChat();\n const patch = turn?.getToolMeta?.(part.toolCallId)?.patch;\n const needsUser = patch?.needsUser === true;\n const { live, stalled } = useToolProgress(part.state, needsUser);\n\n if (!isToolUIPart(part) || getToolName(part) !== 'Agent') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const logicalError = part.state === 'output-available'\n ? agentErrorFromOutput(part.output)\n : undefined;\n const failed = failure.useFailureLabel || Boolean(logicalError);\n const agentName = agentNameFromPart(part);\n const label = subagentLabel(agentName);\n const background = part.state === 'output-available' && Boolean((part.output as AgentToolOutput | undefined)?.jobId);\n const phase = agentPhaseCopy(agentName, background);\n const activity = subagentActivityLabel(patch);\n const statusLine = agentStatusLine({\n live,\n failed,\n stalled,\n needsUser,\n activity,\n });\n const childThreadId = fieldString((part.output as AgentToolOutput | undefined)?.childThreadId)\n ?? fieldString(patch?.childThreadId);\n const canOpen = Boolean(childThreadId && onOpenSubagent && !failed);\n const errorText = logicalError ?? failure.problemText ?? failure.tooltip;\n const openChild = canOpen\n ? () => onOpenSubagent?.(childThreadId!, label)\n : undefined;\n\n return (\n <AgentCard\n activity={ statusLine }\n errorText={ errorText }\n onOpen={ openChild }\n running={ live && !failed && !stalled }\n stalled={ stalled }\n title={ live && !failed && !stalled ? phase.live : phase.done }\n />\n );\n});\n"],"names":["SUBAGENT_LABELS","SUBAGENT_LIVE","agentErrorFromOutput","output","error","agentNameFromPart","part","source","name","subagentLabel","id","mapped","agentPhaseCopy","background","label","fieldString","value","trimmed","fileLabel","input","path","basename","files","item","plural","fileActivity","verb","fallback","TOOL_ACTIVITY","command","uri","subagentComposerCopy","patch","waiting","childThreadId","subagentActivityLabel","toolName","rawInput","humanizeString","agentStatusLine","AgentCard","title","activity","errorText","running","stalled","onOpen","heading","TOOL_INTERRUPTED_MESSAGE","copy","Box","_jsx","Show","Message","ProgressLoader","_jsxs","Text","styles","Shimmer","line","ToolShellCard","shellStyles","open","Pressable","AgentTool","observer","turn","useMessageTurn","onOpenSubagent","useChat","needsUser","live","useToolProgress","isToolUIPart","getToolName","failure","getToolFailureRowState","logicalError","failed","agentName","phase","statusLine","canOpen"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"BashTool.d.ts","sourceRoot":"","sources":["../../../../src/chat/Tool/bash/BashTool.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAqKlD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,sCAkFhD"}
1
+ {"version":3,"file":"BashTool.d.ts","sourceRoot":"","sources":["../../../../src/chat/Tool/bash/BashTool.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAqKlD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,sCAyEhD"}
@@ -1,16 +1,15 @@
1
- import { Completed as k, Oclock as x, Terminal as y } from "@reforma/icons/14";
2
- import { isStaticToolUIPart as S, getToolName as w } from "ai";
3
- import { useMemo as l } from "react";
4
- import { Show as T } from "../../../Show/Show.js";
5
- import { TerminalContent as C } from "../../../Terminal/Terminal.js";
1
+ import { Completed as b, Oclock as k, Terminal as y } from "@reforma/icons/14";
2
+ import { isStaticToolUIPart as w, getToolName as C } from "@reforma/types";
3
+ import { useMemo as u } from "react";
4
+ import { Show as h } from "../../../Show/Show.js";
5
+ import { TerminalContent as S } from "../../../Terminal/Terminal.js";
6
6
  import { Text as O } from "../../../Text/Text.js";
7
7
  import { Approval as R, ApprovalRequest as j, ApprovalButtons as A } from "../../Approval/Approval.js";
8
8
  import { getToolFailureRowState as P, isToolInvocationInProgress as $ } from "../helpers.js";
9
9
  import { ToolShell as F, ToolShellHeader as I, ToolShellContent as N, ToolShellFooter as q } from "../shell/ToolShell.js";
10
- import { ToolSummaryBadges as D } from "../shell/ToolSummaryBadge.js";
11
- import u from "./BashTool.module.css.js";
12
- import { jsxs as B, jsx as s } from "react/jsx-runtime";
13
- function H(t) {
10
+ import g from "./BashTool.module.css.js";
11
+ import { jsxs as T, jsx as s } from "react/jsx-runtime";
12
+ function D(t) {
14
13
  const r = t?.input;
15
14
  if (r == null || typeof r != "object")
16
15
  return {
@@ -27,7 +26,7 @@ function H(t) {
27
26
  background: o.background === !0
28
27
  };
29
28
  }
30
- function L(t) {
29
+ function H(t) {
31
30
  if (!t)
32
31
  return {
33
32
  stdout: "",
@@ -48,28 +47,28 @@ function L(t) {
48
47
  signal: c
49
48
  };
50
49
  }
51
- function m(t) {
50
+ function l(t) {
52
51
  return t.command === "" && (t.background || t.id != null);
53
52
  }
54
- function M(t) {
55
- return t.background || m(t);
53
+ function L(t) {
54
+ return t.background || l(t);
56
55
  }
57
- function _(t, r) {
58
- return m(t) && r.status !== "running";
56
+ function M(t, r) {
57
+ return l(t) && r.status !== "running";
59
58
  }
60
- function z(t, r) {
61
- return m(t) ? r.status === "running" ? "Background task" : "Background task finished" : t.description !== "" ? t.description : t.command !== "" ? t.command : "Bash";
59
+ function _(t, r) {
60
+ return l(t) ? r.status === "running" ? "Background task" : "Background task finished" : t.description !== "" ? t.description : t.command !== "" ? t.command : "Bash";
62
61
  }
63
- function b(t) {
62
+ function B(t) {
64
63
  const r = [];
65
64
  return typeof t.exitCode == "number" && r.push(`exit ${t.exitCode}`), t.signal && r.push(`signal ${t.signal}`), r.length === 0 && t.status && t.status !== "running" && r.push(t.status), r.join(`
66
65
  `);
67
66
  }
68
- const E = "\x1B[32m$\x1B[0m";
69
- function U(t) {
67
+ const z = "\x1B[32m$\x1B[0m";
68
+ function E(t) {
70
69
  return t.split("\x1B").join("");
71
70
  }
72
- function W(t) {
71
+ function U(t) {
73
72
  const {
74
73
  stdout: r = "",
75
74
  stderr: o = ""
@@ -79,58 +78,53 @@ function W(t) {
79
78
  `) && (n += `
80
79
  `), n += `\x1B[31m${o}\x1B[0m`), n;
81
80
  }
82
- function G(t, r) {
83
- const o = W(r), e = [t.command === "" ? b(r) : "", o].filter((i) => i !== "").join(`
81
+ function W(t, r) {
82
+ const o = U(r), e = [t.command === "" ? B(r) : "", o].filter((i) => i !== "").join(`
84
83
  `);
85
- return t.command === "" ? e : `${E} ${U(t.command)}
84
+ return t.command === "" ? e : `${z} ${E(t.command)}
86
85
  ` + e;
87
86
  }
88
- function st(t) {
87
+ function rt(t) {
89
88
  const {
90
89
  onToolApprovalResponse: r
91
- } = t, o = S(t.part) && w(t.part) === "Bash" ? t.part : null, n = l(() => H(o), [o]), e = l(() => L(o), [o]), a = l(() => G(n, e), [n, e]);
90
+ } = t, o = w(t.part) && C(t.part) === "Bash" ? t.part : null, n = u(() => D(o), [o]), e = u(() => H(o), [o]), a = u(() => W(n, e), [n, e]);
92
91
  if (!o)
93
92
  return null;
94
- const i = o.state, c = P(o), d = o.approval, f = $(i, !0), v = !!(e.stdout || e.stderr || b(e)), p = n.command !== "" || v, g = _(n, e), h = M(n) && !g;
95
- return /* @__PURE__ */ B(F, {
96
- collapsible: p,
93
+ const i = o.state, c = P(o), d = o.approval, m = $(i, !0), v = !!(e.stdout || e.stderr || B(e)), f = n.command !== "" || v, p = M(n, e), x = L(n) && !p;
94
+ return /* @__PURE__ */ T(F, {
95
+ collapsible: f,
97
96
  "data-slot": "bash-tool",
98
97
  children: [/* @__PURE__ */ s(I, {
99
98
  state: i,
100
99
  statusDetail: c.tooltip,
101
- title: z(n, e),
100
+ title: _(n, e),
102
101
  truncateTitle: !0,
103
- icon: g ? /* @__PURE__ */ s(k, {
102
+ icon: p ? /* @__PURE__ */ s(b, {
104
103
  "aria-hidden": !0
105
- }) : h ? /* @__PURE__ */ s(x, {
104
+ }) : x ? /* @__PURE__ */ s(k, {
106
105
  "aria-hidden": !0
107
106
  }) : /* @__PURE__ */ s(y, {
108
107
  "aria-hidden": !0
109
- }),
110
- beforeTitle: h ? /* @__PURE__ */ s(D, {
111
- className: u.badge,
112
- labels: ["background"],
113
- "aria-label": "Background"
114
- }) : void 0
115
- }), /* @__PURE__ */ s(T, {
116
- when: p,
108
+ })
109
+ }), /* @__PURE__ */ s(h, {
110
+ when: f,
117
111
  children: /* @__PURE__ */ s(N, {
118
- className: u.content,
119
- children: /* @__PURE__ */ s(C, {
120
- autoScroll: f,
121
- isStreaming: f,
112
+ className: g.content,
113
+ children: /* @__PURE__ */ s(S, {
114
+ autoScroll: m,
115
+ isStreaming: m,
122
116
  output: a,
123
- className: u.terminalPanel
117
+ className: g.terminalPanel
124
118
  })
125
119
  })
126
- }), /* @__PURE__ */ s(T, {
120
+ }), /* @__PURE__ */ s(h, {
127
121
  when: i === "approval-requested",
128
122
  children: /* @__PURE__ */ s(q, {
129
123
  children: /* @__PURE__ */ s(R, {
130
124
  approval: d,
131
125
  state: i,
132
126
  onToolApprovalResponse: r,
133
- children: /* @__PURE__ */ B(j, {
127
+ children: /* @__PURE__ */ T(j, {
134
128
  children: [/* @__PURE__ */ s(O, {
135
129
  children: "Confirm you want to run this command"
136
130
  }), /* @__PURE__ */ s(A, {})]
@@ -141,6 +135,6 @@ function st(t) {
141
135
  });
142
136
  }
143
137
  export {
144
- st as BashTool
138
+ rt as BashTool
145
139
  };
146
140
  //# sourceMappingURL=BashTool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BashTool.js","sources":["../../../../src/chat/Tool/bash/BashTool.tsx"],"sourcesContent":["import { Completed, Oclock, Terminal } from '@reforma/icons/14';\nimport { getToolName, isStaticToolUIPart, type ToolUIPart } from 'ai';\nimport { useMemo } from 'react';\n\nimport { Show } from '../../../Show';\nimport { TerminalContent } from '../../../Terminal';\nimport { Text } from '../../../Text';\nimport {\n Approval,\n ApprovalButtons,\n ApprovalRequest,\n} from '../../Approval';\nimport {\n getToolFailureRowState,\n isToolInvocationInProgress,\n} from '../helpers';\nimport {\n ToolShell,\n ToolShellContent,\n ToolShellFooter,\n ToolShellHeader,\n ToolSummaryBadges,\n} from '../shell';\nimport styles from './BashTool.module.css';\n\nimport type { ToolRendererProps } from '../types';\n\ntype ParsedBashInput = {\n command: string;\n description: string;\n cwd?: string;\n id?: string;\n background: boolean;\n};\n\nfunction parseBashInput(part: ToolUIPart | null): ParsedBashInput {\n const input = part?.input;\n\n if (input == null || typeof input !== 'object') {\n return {\n command: '',\n description: '',\n background: false,\n };\n }\n\n const o = input as Record<string, unknown>;\n const command = typeof o.command === 'string' ? o.command : '';\n const description = typeof o.description === 'string' ? o.description.trim() : '';\n const cwd = typeof o.cwd === 'string' ? o.cwd.trim() : undefined;\n const id = typeof o.id === 'string' ? o.id.trim() : '';\n\n return {\n command,\n description,\n cwd: cwd !== '' ? cwd : undefined,\n id: id !== '' ? id : undefined,\n background: o.background === true,\n };\n}\n\ntype ParsedBashOutput = {\n stdout?: string;\n stderr?: string;\n status?: string;\n exitCode?: number;\n signal?: string;\n};\n\nfunction parseBashOutput(part: ToolUIPart | null): ParsedBashOutput {\n if (!part) {\n return {\n stdout: '',\n stderr: '',\n };\n }\n\n const isError = part.state === 'output-error';\n const output = (part.output ?? '') as ParsedBashOutput | string;\n\n if (typeof output === 'string') {\n return {\n stdout: output,\n stderr: isError ? part.errorText : '',\n };\n }\n\n const record = output as Record<string, unknown>;\n const stdout = typeof record.stdout === 'string' ? record.stdout : undefined;\n const stderr = typeof record.stderr === 'string' ? record.stderr : undefined;\n const status = typeof record.status === 'string' ? record.status : undefined;\n const signal = typeof record.signal === 'string' ? record.signal : undefined;\n const exitCode = typeof record.exitCode === 'number' ? record.exitCode : undefined;\n\n return {\n stdout,\n stderr,\n status,\n exitCode,\n signal,\n };\n}\n\n/** A poll or finished job: id, no command. The launch itself still has a command. */\nfunction isBackgroundResult(input: ParsedBashInput): boolean {\n return input.command === '' && (input.background || input.id != null);\n}\n\nfunction isBackgroundBash(input: ParsedBashInput): boolean {\n return input.background || isBackgroundResult(input);\n}\n\n/** Poll that already left the running state. Still-running work keeps the clock and badge. */\nfunction isFinishedBackgroundResult(input: ParsedBashInput, output: ParsedBashOutput): boolean {\n return isBackgroundResult(input) && output.status !== 'running';\n}\n\nfunction bashTitle(input: ParsedBashInput, output: ParsedBashOutput): string {\n if (isBackgroundResult(input)) {\n return output.status === 'running' ? 'Background task' : 'Background task finished';\n }\n\n if (input.description !== '') {\n return input.description;\n }\n\n if (input.command !== '') {\n return input.command;\n }\n\n return 'Bash';\n}\n\nfunction backgroundResultNote(output: ParsedBashOutput): string {\n const lines: string[] = [];\n\n if (typeof output.exitCode === 'number') {\n lines.push(`exit ${ output.exitCode }`);\n }\n\n if (output.signal) {\n lines.push(`signal ${ output.signal }`);\n }\n\n if (lines.length === 0 && output.status && output.status !== 'running') {\n lines.push(output.status);\n }\n\n return lines.join('\\n');\n}\n\n/** Green `$` */\nconst BASH_PROMPT_DOLLAR = '\\x1b[32m$\\x1b[0m';\n\n/** Avoid breaking the ANSI stream if the command string ever contained escape bytes. */\nfunction sanitizeCommandForTerminalPrompt(command: string): string {\n return command.split('\\u001b').join('');\n}\n\n/** stdout + stderr (stderr wrapped in ANSI red). */\nfunction bashOutputForTerminal(parsed: ParsedBashOutput): string {\n const { stdout = '', stderr = '' } = parsed;\n let s = stdout;\n\n if (stderr) {\n if (s !== '' && !s.endsWith('\\n')) {\n s += '\\n';\n }\n\n s += `\\x1b[31m${ stderr }\\x1b[0m`;\n }\n\n return s;\n}\n\n/** `$ command` when there is one, then stdout/stderr. A result poll has no command. */\nfunction printToTerminal(input: ParsedBashInput, output: ParsedBashOutput): string {\n const body = bashOutputForTerminal(output);\n const note = input.command === '' ? backgroundResultNote(output) : '';\n const outputText = [note, body].filter(part => part !== '').join('\\n');\n\n if (input.command === '') {\n return outputText;\n }\n\n const line = `${ BASH_PROMPT_DOLLAR } ${ sanitizeCommandForTerminalPrompt(input.command) }\\n`;\n\n return line + outputText;\n}\n\nexport function BashTool(props: ToolRendererProps) {\n const { onToolApprovalResponse } = props;\n\n const part = (isStaticToolUIPart(props.part) && getToolName(props.part) === 'Bash')\n ? props.part\n : null;\n\n const parsedInput = useMemo(() => parseBashInput(part), [part]);\n const parsedOutput = useMemo(() => parseBashOutput(part), [part]);\n\n const printOutput = useMemo(\n () => printToTerminal(parsedInput, parsedOutput),\n [parsedInput, parsedOutput]\n );\n\n if (!part) {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const approval = part.approval;\n const live = isToolInvocationInProgress(state, true);\n\n const hasOutput = Boolean(parsedOutput.stdout || parsedOutput.stderr || backgroundResultNote(parsedOutput));\n const showTerminal = parsedInput.command !== '' || hasOutput;\n const finished = isFinishedBackgroundResult(parsedInput, parsedOutput);\n const background = isBackgroundBash(parsedInput) && !finished;\n\n return (\n <ToolShell\n collapsible={ showTerminal }\n data-slot=\"bash-tool\"\n >\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title={ bashTitle(parsedInput, parsedOutput) }\n truncateTitle\n icon={ finished\n ? <Completed aria-hidden />\n : background\n ? <Oclock aria-hidden />\n : <Terminal aria-hidden /> }\n beforeTitle={ background\n ? (\n <ToolSummaryBadges\n className={ styles.badge }\n labels={ ['background'] }\n aria-label=\"Background\"\n />\n )\n : undefined }\n />\n\n <Show when={ showTerminal }>\n <ToolShellContent className={ styles.content }>\n <TerminalContent\n autoScroll={ live }\n isStreaming={ live }\n output={ printOutput }\n className={ styles.terminalPanel }\n />\n </ToolShellContent>\n </Show>\n\n <Show when={ state === 'approval-requested' }>\n <ToolShellFooter>\n <Approval\n approval={ approval }\n state={ state }\n onToolApprovalResponse={ onToolApprovalResponse }\n >\n <ApprovalRequest>\n <Text>Confirm you want to run this command</Text>\n <ApprovalButtons />\n </ApprovalRequest>\n </Approval>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["parseBashInput","part","input","command","description","cwd","id","parseBashOutput","isError","output","record","stdout","stderr","status","signal","exitCode","isBackgroundResult","isBackgroundBash","isFinishedBackgroundResult","bashTitle","backgroundResultNote","lines","BASH_PROMPT_DOLLAR","sanitizeCommandForTerminalPrompt","bashOutputForTerminal","parsed","s","printToTerminal","body","outputText","BashTool","props","onToolApprovalResponse","isStaticToolUIPart","getToolName","parsedInput","useMemo","parsedOutput","printOutput","state","failure","getToolFailureRowState","approval","live","isToolInvocationInProgress","hasOutput","showTerminal","finished","background","ToolShell","_jsx","ToolShellHeader","Completed","Oclock","Terminal","ToolSummaryBadges","styles","Show","ToolShellContent","TerminalContent","ToolShellFooter","Approval","ApprovalRequest","Text","ApprovalButtons"],"mappings":";;;;;;;;;;;;AAWA,SAASA,EAAeC,GAAM;AAC5B,QAAMC,IAAQD,GAAM;AACpB,MAAIC,KAAS,QAAQ,OAAOA,KAAU;AACpC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,aAAa;AAAA,MACb,YAAY;AAAA,IAAA;AAGhB,QAAM,IAAIA,GACJC,IAAU,OAAO,EAAE,WAAY,WAAW,EAAE,UAAU,IACtDC,IAAc,OAAO,EAAE,eAAgB,WAAW,EAAE,YAAY,SAAS,IACzEC,IAAM,OAAO,EAAE,OAAQ,WAAW,EAAE,IAAI,SAAS,QACjDC,IAAK,OAAO,EAAE,MAAO,WAAW,EAAE,GAAG,SAAS;AACpD,SAAO;AAAA,IACL,SAAAH;AAAA,IACA,aAAAC;AAAA,IACA,KAAKC,MAAQ,KAAKA,IAAM;AAAA,IACxB,IAAIC,MAAO,KAAKA,IAAK;AAAA,IACrB,YAAY,EAAE,eAAe;AAAA,EAAA;AAEjC;AACA,SAASC,EAAgBN,GAAM;AAC7B,MAAI,CAACA;AACH,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,IAAA;AAGZ,QAAMO,IAAUP,EAAK,UAAU,gBACzBQ,IAASR,EAAK,UAAU;AAC9B,MAAI,OAAOQ,KAAW;AACpB,WAAO;AAAA,MACL,QAAQA;AAAA,MACR,QAAQD,IAAUP,EAAK,YAAY;AAAA,IAAA;AAGvC,QAAMS,IAASD,GACTE,IAAS,OAAOD,EAAO,UAAW,WAAWA,EAAO,SAAS,QAC7DE,IAAS,OAAOF,EAAO,UAAW,WAAWA,EAAO,SAAS,QAC7DG,IAAS,OAAOH,EAAO,UAAW,WAAWA,EAAO,SAAS,QAC7DI,IAAS,OAAOJ,EAAO,UAAW,WAAWA,EAAO,SAAS,QAC7DK,IAAW,OAAOL,EAAO,YAAa,WAAWA,EAAO,WAAW;AACzE,SAAO;AAAA,IACL,QAAAC;AAAA,IACA,QAAAC;AAAA,IACA,QAAAC;AAAA,IACA,UAAAE;AAAA,IACA,QAAAD;AAAA,EAAA;AAEJ;AAGA,SAASE,EAAmBd,GAAO;AACjC,SAAOA,EAAM,YAAY,OAAOA,EAAM,cAAcA,EAAM,MAAM;AAClE;AACA,SAASe,EAAiBf,GAAO;AAC/B,SAAOA,EAAM,cAAcc,EAAmBd,CAAK;AACrD;AAGA,SAASgB,EAA2BhB,GAAOO,GAAQ;AACjD,SAAOO,EAAmBd,CAAK,KAAKO,EAAO,WAAW;AACxD;AACA,SAASU,EAAUjB,GAAOO,GAAQ;AAChC,SAAIO,EAAmBd,CAAK,IACnBO,EAAO,WAAW,YAAY,oBAAoB,6BAEvDP,EAAM,gBAAgB,KACjBA,EAAM,cAEXA,EAAM,YAAY,KACbA,EAAM,UAER;AACT;AACA,SAASkB,EAAqBX,GAAQ;AACpC,QAAMY,IAAQ,CAAA;AACd,SAAI,OAAOZ,EAAO,YAAa,YAC7BY,EAAM,KAAK,QAAQZ,EAAO,QAAQ,EAAE,GAElCA,EAAO,UACTY,EAAM,KAAK,UAAUZ,EAAO,MAAM,EAAE,GAElCY,EAAM,WAAW,KAAKZ,EAAO,UAAUA,EAAO,WAAW,aAC3DY,EAAM,KAAKZ,EAAO,MAAM,GAEnBY,EAAM,KAAK;AAAA,CAAI;AACxB;AAGA,MAAMC,IAAqB;AAG3B,SAASC,EAAiCpB,GAAS;AACjD,SAAOA,EAAQ,MAAM,MAAQ,EAAE,KAAK,EAAE;AACxC;AAGA,SAASqB,EAAsBC,GAAQ;AACrC,QAAM;AAAA,IACJ,QAAAd,IAAS;AAAA,IACT,QAAAC,IAAS;AAAA,EAAA,IACPa;AACJ,MAAIC,IAAIf;AACR,SAAIC,MACEc,MAAM,MAAM,CAACA,EAAE,SAAS;AAAA,CAAI,MAC9BA,KAAK;AAAA,IAEPA,KAAK,WAAWd,CAAM,YAEjBc;AACT;AAGA,SAASC,EAAgBzB,GAAOO,GAAQ;AACtC,QAAMmB,IAAOJ,EAAsBf,CAAM,GAEnCoB,IAAa,CADN3B,EAAM,YAAY,KAAKkB,EAAqBX,CAAM,IAAI,IACzCmB,CAAI,EAAE,OAAO,CAAA3B,MAAQA,MAAS,EAAE,EAAE,KAAK;AAAA,CAAI;AACrE,SAAIC,EAAM,YAAY,KACb2B,IAEI,GAAGP,CAAkB,IAAIC,EAAiCrB,EAAM,OAAO,CAAC;AAAA,IACvE2B;AAChB;AACO,SAASC,GAASC,GAAO;AAC9B,QAAM;AAAA,IACJ,wBAAAC;AAAA,EAAA,IACED,GACE9B,IAAOgC,EAAmBF,EAAM,IAAI,KAAKG,EAAYH,EAAM,IAAI,MAAM,SAASA,EAAM,OAAO,MAC3FI,IAAcC,EAAQ,MAAMpC,EAAeC,CAAI,GAAG,CAACA,CAAI,CAAC,GACxDoC,IAAeD,EAAQ,MAAM7B,EAAgBN,CAAI,GAAG,CAACA,CAAI,CAAC,GAC1DqC,IAAcF,EAAQ,MAAMT,EAAgBQ,GAAaE,CAAY,GAAG,CAACF,GAAaE,CAAY,CAAC;AACzG,MAAI,CAACpC;AACH,WAAO;AAET,QAAMsC,IAAQtC,EAAK,OACbuC,IAAUC,EAAuBxC,CAAI,GACrCyC,IAAWzC,EAAK,UAChB0C,IAAOC,EAA2BL,GAAO,EAAI,GAC7CM,IAAY,GAAQR,EAAa,UAAUA,EAAa,UAAUjB,EAAqBiB,CAAY,IACnGS,IAAeX,EAAY,YAAY,MAAMU,GAC7CE,IAAW7B,EAA2BiB,GAAaE,CAAY,GAC/DW,IAAa/B,EAAiBkB,CAAW,KAAK,CAACY;AACrD,2BAA0BE,GAAW;AAAA,IACnC,aAAaH;AAAA,IACb,aAAa;AAAA,IACb,UAAU,CAAcI,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAAZ;AAAA,MACA,cAAcC,EAAQ;AAAA,MACtB,OAAOrB,EAAUgB,GAAaE,CAAY;AAAA,MAC1C,eAAe;AAAA,MACf,MAAMU,IAAwBG,gBAAAA,EAAKE,GAAW;AAAA,QAC5C,eAAe;AAAA,MAAA,CAChB,IAAIJ,IAA0BE,gBAAAA,EAAKG,GAAQ;AAAA,QAC1C,eAAe;AAAA,MAAA,CAChB,IAAiBH,gBAAAA,EAAKI,GAAU;AAAA,QAC/B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,aAAaN,IAA0BE,gBAAAA,EAAKK,GAAmB;AAAA,QAC7D,WAAWC,EAAO;AAAA,QAClB,QAAQ,CAAC,YAAY;AAAA,QACrB,cAAc;AAAA,MAAA,CACf,IAAI;AAAA,IAAA,CACN,GAAgBN,gBAAAA,EAAKO,GAAM;AAAA,MAC1B,MAAMX;AAAA,MACN,4BAA4BY,GAAkB;AAAA,QAC5C,WAAWF,EAAO;AAAA,QAClB,4BAA4BG,GAAiB;AAAA,UAC3C,YAAYhB;AAAA,UACZ,aAAaA;AAAA,UACb,QAAQL;AAAA,UACR,WAAWkB,EAAO;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBN,gBAAAA,EAAKO,GAAM;AAAA,MAC1B,MAAMlB,MAAU;AAAA,MAChB,4BAA4BqB,GAAiB;AAAA,QAC3C,4BAA4BC,GAAU;AAAA,UACpC,UAAAnB;AAAA,UACA,OAAAH;AAAA,UACA,wBAAAP;AAAA,UACA,4BAA6B8B,GAAiB;AAAA,YAC5C,UAAU,CAAcZ,gBAAAA,EAAKa,GAAM;AAAA,cACjC,UAAU;AAAA,YAAA,CACX,GAAgBb,gBAAAA,EAAKc,GAAiB,EAAE,CAAC;AAAA,UAAA,CAC3C;AAAA,QAAA,CACF;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
1
+ {"version":3,"file":"BashTool.js","sources":["../../../../src/chat/Tool/bash/BashTool.tsx"],"sourcesContent":["import { Completed, Oclock, Terminal } from '@reforma/icons/14';\nimport { getToolName, isStaticToolUIPart } from '@reforma/types';\nimport { useMemo } from 'react';\n\nimport { Show } from '../../../Show';\nimport { TerminalContent } from '../../../Terminal';\nimport { Text } from '../../../Text';\nimport {\n Approval,\n ApprovalButtons,\n ApprovalRequest,\n} from '../../Approval';\nimport {\n getToolFailureRowState,\n isToolInvocationInProgress,\n} from '../helpers';\nimport {\n ToolShell,\n ToolShellContent,\n ToolShellFooter,\n ToolShellHeader,\n} from '../shell';\nimport styles from './BashTool.module.css';\n\nimport type { ToolUIPart } from 'ai';\nimport type { ToolRendererProps } from '../types';\n\ntype ParsedBashInput = {\n command: string;\n description: string;\n cwd?: string;\n id?: string;\n background: boolean;\n};\n\nfunction parseBashInput(part: ToolUIPart | null): ParsedBashInput {\n const input = part?.input;\n\n if (input == null || typeof input !== 'object') {\n return {\n command: '',\n description: '',\n background: false,\n };\n }\n\n const o = input as Record<string, unknown>;\n const command = typeof o.command === 'string' ? o.command : '';\n const description = typeof o.description === 'string' ? o.description.trim() : '';\n const cwd = typeof o.cwd === 'string' ? o.cwd.trim() : undefined;\n const id = typeof o.id === 'string' ? o.id.trim() : '';\n\n return {\n command,\n description,\n cwd: cwd !== '' ? cwd : undefined,\n id: id !== '' ? id : undefined,\n background: o.background === true,\n };\n}\n\ntype ParsedBashOutput = {\n stdout?: string;\n stderr?: string;\n status?: string;\n exitCode?: number;\n signal?: string;\n};\n\nfunction parseBashOutput(part: ToolUIPart | null): ParsedBashOutput {\n if (!part) {\n return {\n stdout: '',\n stderr: '',\n };\n }\n\n const isError = part.state === 'output-error';\n const output = (part.output ?? '') as ParsedBashOutput | string;\n\n if (typeof output === 'string') {\n return {\n stdout: output,\n stderr: isError ? part.errorText : '',\n };\n }\n\n const record = output as Record<string, unknown>;\n const stdout = typeof record.stdout === 'string' ? record.stdout : undefined;\n const stderr = typeof record.stderr === 'string' ? record.stderr : undefined;\n const status = typeof record.status === 'string' ? record.status : undefined;\n const signal = typeof record.signal === 'string' ? record.signal : undefined;\n const exitCode = typeof record.exitCode === 'number' ? record.exitCode : undefined;\n\n return {\n stdout,\n stderr,\n status,\n exitCode,\n signal,\n };\n}\n\n/** A poll or finished job: id, no command. The launch itself still has a command. */\nfunction isBackgroundResult(input: ParsedBashInput): boolean {\n return input.command === '' && (input.background || input.id != null);\n}\n\nfunction isBackgroundBash(input: ParsedBashInput): boolean {\n return input.background || isBackgroundResult(input);\n}\n\n/** Poll that already left the running state. Still-running work keeps the clock and badge. */\nfunction isFinishedBackgroundResult(input: ParsedBashInput, output: ParsedBashOutput): boolean {\n return isBackgroundResult(input) && output.status !== 'running';\n}\n\nfunction bashTitle(input: ParsedBashInput, output: ParsedBashOutput): string {\n if (isBackgroundResult(input)) {\n return output.status === 'running' ? 'Background task' : 'Background task finished';\n }\n\n if (input.description !== '') {\n return input.description;\n }\n\n if (input.command !== '') {\n return input.command;\n }\n\n return 'Bash';\n}\n\nfunction backgroundResultNote(output: ParsedBashOutput): string {\n const lines: string[] = [];\n\n if (typeof output.exitCode === 'number') {\n lines.push(`exit ${ output.exitCode }`);\n }\n\n if (output.signal) {\n lines.push(`signal ${ output.signal }`);\n }\n\n if (lines.length === 0 && output.status && output.status !== 'running') {\n lines.push(output.status);\n }\n\n return lines.join('\\n');\n}\n\n/** Green `$` */\nconst BASH_PROMPT_DOLLAR = '\\x1b[32m$\\x1b[0m';\n\n/** Avoid breaking the ANSI stream if the command string ever contained escape bytes. */\nfunction sanitizeCommandForTerminalPrompt(command: string): string {\n return command.split('\\u001b').join('');\n}\n\n/** stdout + stderr (stderr wrapped in ANSI red). */\nfunction bashOutputForTerminal(parsed: ParsedBashOutput): string {\n const { stdout = '', stderr = '' } = parsed;\n let s = stdout;\n\n if (stderr) {\n if (s !== '' && !s.endsWith('\\n')) {\n s += '\\n';\n }\n\n s += `\\x1b[31m${ stderr }\\x1b[0m`;\n }\n\n return s;\n}\n\n/** `$ command` when there is one, then stdout/stderr. A result poll has no command. */\nfunction printToTerminal(input: ParsedBashInput, output: ParsedBashOutput): string {\n const body = bashOutputForTerminal(output);\n const note = input.command === '' ? backgroundResultNote(output) : '';\n const outputText = [note, body].filter(part => part !== '').join('\\n');\n\n if (input.command === '') {\n return outputText;\n }\n\n const line = `${ BASH_PROMPT_DOLLAR } ${ sanitizeCommandForTerminalPrompt(input.command) }\\n`;\n\n return line + outputText;\n}\n\nexport function BashTool(props: ToolRendererProps) {\n const { onToolApprovalResponse } = props;\n\n const part = (isStaticToolUIPart(props.part) && getToolName(props.part) === 'Bash')\n ? props.part\n : null;\n\n const parsedInput = useMemo(() => parseBashInput(part), [part]);\n const parsedOutput = useMemo(() => parseBashOutput(part), [part]);\n\n const printOutput = useMemo(\n () => printToTerminal(parsedInput, parsedOutput),\n [parsedInput, parsedOutput]\n );\n\n if (!part) {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const approval = part.approval;\n const live = isToolInvocationInProgress(state, true);\n\n const hasOutput = Boolean(parsedOutput.stdout || parsedOutput.stderr || backgroundResultNote(parsedOutput));\n const showTerminal = parsedInput.command !== '' || hasOutput;\n const finished = isFinishedBackgroundResult(parsedInput, parsedOutput);\n const background = isBackgroundBash(parsedInput) && !finished;\n\n return (\n <ToolShell\n collapsible={ showTerminal }\n data-slot=\"bash-tool\"\n >\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title={ bashTitle(parsedInput, parsedOutput) }\n truncateTitle\n icon={ finished\n ? <Completed aria-hidden />\n : background\n ? <Oclock aria-hidden />\n : <Terminal aria-hidden /> }\n />\n\n <Show when={ showTerminal }>\n <ToolShellContent className={ styles.content }>\n <TerminalContent\n autoScroll={ live }\n isStreaming={ live }\n output={ printOutput }\n className={ styles.terminalPanel }\n />\n </ToolShellContent>\n </Show>\n\n <Show when={ state === 'approval-requested' }>\n <ToolShellFooter>\n <Approval\n approval={ approval }\n state={ state }\n onToolApprovalResponse={ onToolApprovalResponse }\n >\n <ApprovalRequest>\n <Text>Confirm you want to run this command</Text>\n <ApprovalButtons />\n </ApprovalRequest>\n </Approval>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["parseBashInput","part","input","command","description","cwd","id","parseBashOutput","isError","output","record","stdout","stderr","status","signal","exitCode","isBackgroundResult","isBackgroundBash","isFinishedBackgroundResult","bashTitle","backgroundResultNote","lines","BASH_PROMPT_DOLLAR","sanitizeCommandForTerminalPrompt","bashOutputForTerminal","parsed","s","printToTerminal","body","outputText","BashTool","props","onToolApprovalResponse","isStaticToolUIPart","getToolName","parsedInput","useMemo","parsedOutput","printOutput","state","failure","getToolFailureRowState","approval","live","isToolInvocationInProgress","hasOutput","showTerminal","finished","background","ToolShell","_jsx","ToolShellHeader","Completed","Oclock","Terminal","Show","ToolShellContent","styles","TerminalContent","ToolShellFooter","Approval","ApprovalRequest","Text","ApprovalButtons"],"mappings":";;;;;;;;;;;AAWA,SAASA,EAAeC,GAAM;AAC5B,QAAMC,IAAQD,GAAM;AACpB,MAAIC,KAAS,QAAQ,OAAOA,KAAU;AACpC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,aAAa;AAAA,MACb,YAAY;AAAA,IAAA;AAGhB,QAAM,IAAIA,GACJC,IAAU,OAAO,EAAE,WAAY,WAAW,EAAE,UAAU,IACtDC,IAAc,OAAO,EAAE,eAAgB,WAAW,EAAE,YAAY,SAAS,IACzEC,IAAM,OAAO,EAAE,OAAQ,WAAW,EAAE,IAAI,SAAS,QACjDC,IAAK,OAAO,EAAE,MAAO,WAAW,EAAE,GAAG,SAAS;AACpD,SAAO;AAAA,IACL,SAAAH;AAAA,IACA,aAAAC;AAAA,IACA,KAAKC,MAAQ,KAAKA,IAAM;AAAA,IACxB,IAAIC,MAAO,KAAKA,IAAK;AAAA,IACrB,YAAY,EAAE,eAAe;AAAA,EAAA;AAEjC;AACA,SAASC,EAAgBN,GAAM;AAC7B,MAAI,CAACA;AACH,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,IAAA;AAGZ,QAAMO,IAAUP,EAAK,UAAU,gBACzBQ,IAASR,EAAK,UAAU;AAC9B,MAAI,OAAOQ,KAAW;AACpB,WAAO;AAAA,MACL,QAAQA;AAAA,MACR,QAAQD,IAAUP,EAAK,YAAY;AAAA,IAAA;AAGvC,QAAMS,IAASD,GACTE,IAAS,OAAOD,EAAO,UAAW,WAAWA,EAAO,SAAS,QAC7DE,IAAS,OAAOF,EAAO,UAAW,WAAWA,EAAO,SAAS,QAC7DG,IAAS,OAAOH,EAAO,UAAW,WAAWA,EAAO,SAAS,QAC7DI,IAAS,OAAOJ,EAAO,UAAW,WAAWA,EAAO,SAAS,QAC7DK,IAAW,OAAOL,EAAO,YAAa,WAAWA,EAAO,WAAW;AACzE,SAAO;AAAA,IACL,QAAAC;AAAA,IACA,QAAAC;AAAA,IACA,QAAAC;AAAA,IACA,UAAAE;AAAA,IACA,QAAAD;AAAA,EAAA;AAEJ;AAGA,SAASE,EAAmBd,GAAO;AACjC,SAAOA,EAAM,YAAY,OAAOA,EAAM,cAAcA,EAAM,MAAM;AAClE;AACA,SAASe,EAAiBf,GAAO;AAC/B,SAAOA,EAAM,cAAcc,EAAmBd,CAAK;AACrD;AAGA,SAASgB,EAA2BhB,GAAOO,GAAQ;AACjD,SAAOO,EAAmBd,CAAK,KAAKO,EAAO,WAAW;AACxD;AACA,SAASU,EAAUjB,GAAOO,GAAQ;AAChC,SAAIO,EAAmBd,CAAK,IACnBO,EAAO,WAAW,YAAY,oBAAoB,6BAEvDP,EAAM,gBAAgB,KACjBA,EAAM,cAEXA,EAAM,YAAY,KACbA,EAAM,UAER;AACT;AACA,SAASkB,EAAqBX,GAAQ;AACpC,QAAMY,IAAQ,CAAA;AACd,SAAI,OAAOZ,EAAO,YAAa,YAC7BY,EAAM,KAAK,QAAQZ,EAAO,QAAQ,EAAE,GAElCA,EAAO,UACTY,EAAM,KAAK,UAAUZ,EAAO,MAAM,EAAE,GAElCY,EAAM,WAAW,KAAKZ,EAAO,UAAUA,EAAO,WAAW,aAC3DY,EAAM,KAAKZ,EAAO,MAAM,GAEnBY,EAAM,KAAK;AAAA,CAAI;AACxB;AAGA,MAAMC,IAAqB;AAG3B,SAASC,EAAiCpB,GAAS;AACjD,SAAOA,EAAQ,MAAM,MAAQ,EAAE,KAAK,EAAE;AACxC;AAGA,SAASqB,EAAsBC,GAAQ;AACrC,QAAM;AAAA,IACJ,QAAAd,IAAS;AAAA,IACT,QAAAC,IAAS;AAAA,EAAA,IACPa;AACJ,MAAIC,IAAIf;AACR,SAAIC,MACEc,MAAM,MAAM,CAACA,EAAE,SAAS;AAAA,CAAI,MAC9BA,KAAK;AAAA,IAEPA,KAAK,WAAWd,CAAM,YAEjBc;AACT;AAGA,SAASC,EAAgBzB,GAAOO,GAAQ;AACtC,QAAMmB,IAAOJ,EAAsBf,CAAM,GAEnCoB,IAAa,CADN3B,EAAM,YAAY,KAAKkB,EAAqBX,CAAM,IAAI,IACzCmB,CAAI,EAAE,OAAO,CAAA3B,MAAQA,MAAS,EAAE,EAAE,KAAK;AAAA,CAAI;AACrE,SAAIC,EAAM,YAAY,KACb2B,IAEI,GAAGP,CAAkB,IAAIC,EAAiCrB,EAAM,OAAO,CAAC;AAAA,IACvE2B;AAChB;AACO,SAASC,GAASC,GAAO;AAC9B,QAAM;AAAA,IACJ,wBAAAC;AAAA,EAAA,IACED,GACE9B,IAAOgC,EAAmBF,EAAM,IAAI,KAAKG,EAAYH,EAAM,IAAI,MAAM,SAASA,EAAM,OAAO,MAC3FI,IAAcC,EAAQ,MAAMpC,EAAeC,CAAI,GAAG,CAACA,CAAI,CAAC,GACxDoC,IAAeD,EAAQ,MAAM7B,EAAgBN,CAAI,GAAG,CAACA,CAAI,CAAC,GAC1DqC,IAAcF,EAAQ,MAAMT,EAAgBQ,GAAaE,CAAY,GAAG,CAACF,GAAaE,CAAY,CAAC;AACzG,MAAI,CAACpC;AACH,WAAO;AAET,QAAMsC,IAAQtC,EAAK,OACbuC,IAAUC,EAAuBxC,CAAI,GACrCyC,IAAWzC,EAAK,UAChB0C,IAAOC,EAA2BL,GAAO,EAAI,GAC7CM,IAAY,GAAQR,EAAa,UAAUA,EAAa,UAAUjB,EAAqBiB,CAAY,IACnGS,IAAeX,EAAY,YAAY,MAAMU,GAC7CE,IAAW7B,EAA2BiB,GAAaE,CAAY,GAC/DW,IAAa/B,EAAiBkB,CAAW,KAAK,CAACY;AACrD,2BAA0BE,GAAW;AAAA,IACnC,aAAaH;AAAA,IACb,aAAa;AAAA,IACb,UAAU,CAAcI,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAAZ;AAAA,MACA,cAAcC,EAAQ;AAAA,MACtB,OAAOrB,EAAUgB,GAAaE,CAAY;AAAA,MAC1C,eAAe;AAAA,MACf,MAAMU,IAAwBG,gBAAAA,EAAKE,GAAW;AAAA,QAC5C,eAAe;AAAA,MAAA,CAChB,IAAIJ,IAA0BE,gBAAAA,EAAKG,GAAQ;AAAA,QAC1C,eAAe;AAAA,MAAA,CAChB,IAAiBH,gBAAAA,EAAKI,GAAU;AAAA,QAC/B,eAAe;AAAA,MAAA,CAChB;AAAA,IAAA,CACF,GAAgBJ,gBAAAA,EAAKK,GAAM;AAAA,MAC1B,MAAMT;AAAA,MACN,4BAA4BU,GAAkB;AAAA,QAC5C,WAAWC,EAAO;AAAA,QAClB,4BAA4BC,GAAiB;AAAA,UAC3C,YAAYf;AAAA,UACZ,aAAaA;AAAA,UACb,QAAQL;AAAA,UACR,WAAWmB,EAAO;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBP,gBAAAA,EAAKK,GAAM;AAAA,MAC1B,MAAMhB,MAAU;AAAA,MAChB,4BAA4BoB,GAAiB;AAAA,QAC3C,4BAA4BC,GAAU;AAAA,UACpC,UAAAlB;AAAA,UACA,OAAAH;AAAA,UACA,wBAAAP;AAAA,UACA,4BAA6B6B,GAAiB;AAAA,YAC5C,UAAU,CAAcX,gBAAAA,EAAKY,GAAM;AAAA,cACjC,UAAU;AAAA,YAAA,CACX,GAAgBZ,gBAAAA,EAAKa,GAAiB,EAAE,CAAC;AAAA,UAAA,CAC3C;AAAA,QAAA,CACF;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
@@ -1 +1 @@
1
- .BashTool_badge_s9MHpv{flex-shrink:0}.BashTool_content_jQUS2j{padding:0}.BashTool_terminalPanel_bCKi82{--terminal-max-body-height: none}
1
+ .BashTool_content_jQUS2j{padding:0}.BashTool_terminalPanel_bCKi82{--terminal-max-body-height: none}
@@ -1,12 +1,10 @@
1
- const n = "BashTool_badge_s9MHpv", t = "BashTool_content_jQUS2j", e = "BashTool_terminalPanel_bCKi82", a = {
2
- badge: n,
3
- content: t,
4
- terminalPanel: e
1
+ const n = "BashTool_content_jQUS2j", t = "BashTool_terminalPanel_bCKi82", e = {
2
+ content: n,
3
+ terminalPanel: t
5
4
  };
6
5
  export {
7
- n as badge,
8
- t as content,
9
- a as default,
10
- e as terminalPanel
6
+ n as content,
7
+ e as default,
8
+ t as terminalPanel
11
9
  };
12
10
  //# sourceMappingURL=BashTool.module.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BashTool.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
1
+ {"version":3,"file":"BashTool.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,5 +1,5 @@
1
1
  import { Folder as n } from "@reforma/icons/14";
2
- import { isToolUIPart as c, getToolName as d } from "ai";
2
+ import { isToolUIPart as c, getToolName as d } from "@reforma/types";
3
3
  import { Show as t } from "../../../Show/Show.js";
4
4
  import { Text as h } from "../../../Text/Text.js";
5
5
  import { Chip as p } from "../../Chip/Chip.js";
@@ -1 +1 @@
1
- {"version":3,"file":"CreateDirectoryTool.js","sources":["../../../../src/chat/Tool/create-directory/CreateDirectoryTool.tsx"],"sourcesContent":["import { Folder } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { Chip, chipItemFromPath } from '../../Chip';\nimport { getToolFailureRowState } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\nimport { parseCreateDirectoryInput } from './parseCreateDirectoryInput';\n\nimport type { ToolRendererProps } from '../types';\n\n/** CreateDirectory: label + folder path chip. Errors/denials: label + tooltip. */\nexport function CreateDirectoryTool({ part, onOpenPath }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'CreateDirectory') {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n\n const item = chipItemFromPath(parseCreateDirectoryInput(part.input).path);\n\n return (\n <ToolShell data-slot=\"create-directory-tool\">\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title=\"Created folder\"\n titleInProgress=\"Creating folder\"\n icon={ <Folder aria-hidden /> }\n >\n <Show when={ item }>\n { folder => (\n <Chip\n aria-label=\"Directory created\"\n item={ { ...folder, type: 'folder' } }\n onAction={ onOpenPath }\n />\n ) }\n </Show>\n </ToolShellHeader>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["CreateDirectoryTool","part","onOpenPath","isToolUIPart","getToolName","state","failure","getToolFailureRowState","item","chipItemFromPath","parseCreateDirectoryInput","ToolShell","_jsx","ToolShellHeader","Folder","Show","folder","Chip","ToolShellFooter","Text"],"mappings":";;;;;;;;;;AAUO,SAASA,EAAoB;AAAA,EAClC,MAAAC;AAAA,EACA,YAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaF,CAAI,KAAKG,EAAYH,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMI,IAAQJ,EAAK,OACbK,IAAUC,EAAuBN,CAAI,GACrCO,IAAOC,EAAiBC,EAA0BT,EAAK,KAAK,EAAE,IAAI;AACxE,2BAA0BU,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAAR;AAAA,MACA,cAAcC,EAAQ;AAAA,MACtB,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,wBAAwBQ,GAAQ;AAAA,QAC9B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,4BAA4BC,GAAM;AAAA,QAChC,MAAMP;AAAA,QACN,UAAU,CAAAQ,MAAuBJ,gBAAAA,EAAKK,GAAM;AAAA,UAC1C,cAAc;AAAA,UACd,MAAM;AAAA,YACJ,GAAGD;AAAA,YACH,MAAM;AAAA,UAAA;AAAA,UAER,UAAUd;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBU,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMT,EAAQ;AAAA,MACd,4BAA4BY,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUb,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
1
+ {"version":3,"file":"CreateDirectoryTool.js","sources":["../../../../src/chat/Tool/create-directory/CreateDirectoryTool.tsx"],"sourcesContent":["import { Folder } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { Chip, chipItemFromPath } from '../../Chip';\nimport { getToolFailureRowState } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\nimport { parseCreateDirectoryInput } from './parseCreateDirectoryInput';\n\nimport type { ToolRendererProps } from '../types';\n\n/** CreateDirectory: label + folder path chip. Errors/denials: label + tooltip. */\nexport function CreateDirectoryTool({ part, onOpenPath }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'CreateDirectory') {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n\n const item = chipItemFromPath(parseCreateDirectoryInput(part.input).path);\n\n return (\n <ToolShell data-slot=\"create-directory-tool\">\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title=\"Created folder\"\n titleInProgress=\"Creating folder\"\n icon={ <Folder aria-hidden /> }\n >\n <Show when={ item }>\n { folder => (\n <Chip\n aria-label=\"Directory created\"\n item={ { ...folder, type: 'folder' } }\n onAction={ onOpenPath }\n />\n ) }\n </Show>\n </ToolShellHeader>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["CreateDirectoryTool","part","onOpenPath","isToolUIPart","getToolName","state","failure","getToolFailureRowState","item","chipItemFromPath","parseCreateDirectoryInput","ToolShell","_jsx","ToolShellHeader","Folder","Show","folder","Chip","ToolShellFooter","Text"],"mappings":";;;;;;;;;;AAUO,SAASA,EAAoB;AAAA,EAClC,MAAAC;AAAA,EACA,YAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaF,CAAI,KAAKG,EAAYH,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMI,IAAQJ,EAAK,OACbK,IAAUC,EAAuBN,CAAI,GACrCO,IAAOC,EAAiBC,EAA0BT,EAAK,KAAK,EAAE,IAAI;AACxE,2BAA0BU,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAAR;AAAA,MACA,cAAcC,EAAQ;AAAA,MACtB,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,wBAAwBQ,GAAQ;AAAA,QAC9B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,4BAA4BC,GAAM;AAAA,QAChC,MAAMP;AAAA,QACN,UAAU,CAAAQ,MAAuBJ,gBAAAA,EAAKK,GAAM;AAAA,UAC1C,cAAc;AAAA,UACd,MAAM;AAAA,YACJ,GAAGD;AAAA,YACH,MAAM;AAAA,UAAA;AAAA,UAER,UAAUd;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBU,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMT,EAAQ;AAAA,MACd,4BAA4BY,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUb,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Default.d.ts","sourceRoot":"","sources":["../../../../src/chat/Tool/default/Default.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAIlD,MAAM,MAAM,yBAAyB,GAAG;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,SAAS,CAAC;CAC3B,CAAC;AA6GF,MAAM,MAAM,qBAAqB,GACzB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,oBAAoB,CAAA;CAAE,CAAC;AA+FrD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,OAAO,GAAG,qBAAqB,EAAE,CA2DjF;AA+DD,gDAAgD;AAChD,wBAAgB,WAAW,CAAC,EACxB,IAAI,EACJ,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,WAAW,GACd,EAAE,iBAAiB,GAAG,yBAAyB,sCAiG/C"}
1
+ {"version":3,"file":"Default.d.ts","sourceRoot":"","sources":["../../../../src/chat/Tool/default/Default.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAIlD,MAAM,MAAM,yBAAyB,GAAG;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,SAAS,CAAC;CAC3B,CAAC;AA6GF,MAAM,MAAM,qBAAqB,GACzB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,oBAAoB,CAAA;CAAE,CAAC;AA+FrD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,OAAO,GAAG,qBAAqB,EAAE,CA2DjF;AA+DD,gDAAgD;AAChD,wBAAgB,WAAW,CAAC,EACxB,IAAI,EACJ,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,WAAW,GACd,EAAE,iBAAiB,GAAG,yBAAyB,sCAiG/C"}
@@ -1,6 +1,6 @@
1
1
  import { Tool as $ } from "@reforma/icons/14";
2
2
  import { humanizeString as b } from "@reforma/lib";
3
- import { isToolUIPart as k, getToolName as w } from "ai";
3
+ import { isToolUIPart as k, getToolName as w } from "@reforma/types";
4
4
  import { CodeHighlighter as F } from "../../../CodeHighlighter/CodeHighlighter.js";
5
5
  import { For as A } from "../../../For/For.js";
6
6
  import { Show as N } from "../../../Show/Show.js";
@@ -1 +1 @@
1
- {"version":3,"file":"Default.js","sources":["../../../../src/chat/Tool/default/Default.tsx"],"sourcesContent":["import { Tool as ToolIcon } from '@reforma/icons/14';\nimport { humanizeString } from '@reforma/lib';\nimport { getToolName, isToolUIPart, type DynamicToolUIPart, type ToolUIPart } from 'ai';\n\nimport { CodeHighlighter } from '../../../CodeHighlighter';\nimport { For } from '../../../For';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport {\n Approval,\n ApprovalButtons,\n ApprovalRequest,\n} from '../../Approval';\nimport { MessagePart } from '../../Message/parts/MessagePart';\nimport { callToolResultContentBlocks, getToolFailureRowState, isCallToolContentBlock, normalizeErrorString } from '../helpers';\nimport {\n ToolShell,\n ToolShellContent,\n ToolShellFooter,\n ToolShellHeader,\n} from '../shell';\nimport defaultStyles from './Default.module.css';\n\nimport type { ReactNode } from 'react';\nimport type { ReformaUIMessagePart } from '../../Message/types';\nimport type { ToolRendererProps } from '../types';\n\ntype DefaultToolPart = ToolUIPart | DynamicToolUIPart;\n\nexport type DefaultToolDisplayOptions = {\n titleOverride?: string;\n inputOverride?: unknown;\n leadingIcon?: ReactNode;\n};\n\n/** Header label from tool name or explicit `part.title`. */\nfunction toolHeaderTitle(part: DefaultToolPart): string | undefined {\n if (!isToolUIPart(part)) {\n return 'tool';\n }\n\n if (part.title != null) {\n return part.title;\n }\n\n const raw = getToolName(part);\n\n return humanizeString(raw);\n}\n\nfunction toolResult(part: DefaultToolPart): unknown | undefined {\n if (!isToolUIPart(part)) {\n return undefined;\n }\n\n if (part.state === 'output-available') {\n return part.output;\n }\n\n if (part.state === 'output-error' || part.state === 'output-denied') {\n return { error: normalizeErrorString(part.errorText) };\n }\n\n return undefined;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n}\n\n/** Nested objects/arrays stringify; primitives render as plain text. */\nfunction formatInputValueDisplay(value: unknown): string {\n if (value === null) {\n return 'null';\n }\n\n if (value === undefined) {\n return '';\n }\n\n if (typeof value === 'object') {\n try {\n return JSON.stringify(value);\n }\n catch {\n return String(value);\n }\n }\n\n return String(value);\n}\n\n/** Heuristic: raw HTML snippet → fenced block so Streamdown renders it as a code block, not unsafe HTML. */\nfunction looksLikeHtmlString(s: string): boolean {\n const t = s.trim();\n\n return t.length >= 2 && t.startsWith('<') && t.includes('>');\n}\n\n/**\n * True when a tool wrapped prose in `content` / `parts` as a string we should render as markdown text,\n * not re-stringify as JSON. Heuristic only — avoids fencing obvious markdown as a JSON code block.\n */\nfunction isLikelyMarkdownString(value: unknown): value is string {\n if (typeof value !== 'string') {\n return false;\n }\n\n const t = value.trim();\n\n if (t.length === 0) {\n return false;\n }\n\n // YAML frontmatter (often followed by markdown body)\n if (t.startsWith('---')) {\n return true;\n }\n\n // ATX headings (# … ## …)\n if (t.startsWith('#')) {\n return true;\n }\n\n // Blockquote\n if (t.startsWith('>')) {\n return true;\n }\n\n // Unordered / ordered list lines\n if (/^[-*+]\\s/.test(t) || /^\\d+\\.\\s/.test(t)) {\n return true;\n }\n\n // Document-level fenced code\n if (t.startsWith('```')) {\n return true;\n }\n\n return false;\n}\n\nexport type ToolOutputDisplayItem\n = | { kind: 'code'; language: string; code: string }\n | { kind: 'part'; part: ReformaUIMessagePart };\n\nfunction mcpMediaDataUrl(block: Record<string, unknown>): string | null {\n const data = block.data;\n const mimeType = block.mimeType;\n\n if (typeof data !== 'string' || data.length === 0 || typeof mimeType !== 'string' || mimeType.length === 0) {\n return null;\n }\n\n return `data:${ mimeType };base64,${ data }`;\n}\n\nfunction filePartFromMcpAudioBlock(block: unknown): ReformaUIMessagePart | null {\n if (!isPlainObject(block) || block.type !== 'audio') {\n return null;\n }\n\n const url = mcpMediaDataUrl(block);\n\n if (url == null) {\n return null;\n }\n\n const ext = String(block.mimeType).split('/')[1]?.split('+')[0] ?? 'bin';\n\n return {\n type: 'file',\n mediaType: String(block.mimeType),\n url,\n filename: `audio.${ ext }`,\n };\n}\n\n/** MCP content blocks: text/JSON/HTML sniff; images as markdown `![]()` (Streamdown); audio as a file part. */\nfunction displayItemsFromContentBlocks(blocks: unknown[]): ToolOutputDisplayItem[] {\n const items: ToolOutputDisplayItem[] = [];\n\n for (const block of blocks) {\n if (isPlainObject(block) && block.type === 'text' && typeof block.text === 'string') {\n items.push(...toolOutputToDisplayItems(block.text));\n continue;\n }\n\n if (isPlainObject(block) && block.type === 'image') {\n const dataUrl = mcpMediaDataUrl(block);\n\n if (dataUrl != null) {\n const markdown = `![](${ dataUrl })`;\n const last = items[items.length - 1];\n\n if (last?.kind === 'part' && last.part.type === 'text') {\n last.part = { type: 'text', text: `${ last.part.text }\\n\\n${ markdown }` };\n }\n else {\n items.push({ kind: 'part', part: { type: 'text', text: markdown } });\n }\n\n continue;\n }\n }\n\n const audioPart = filePartFromMcpAudioBlock(block);\n\n if (audioPart != null) {\n items.push({ kind: 'part', part: audioPart });\n continue;\n }\n\n items.push({ kind: 'part', part: block as ReformaUIMessagePart });\n }\n\n return items;\n}\n\nfunction displayItemsFromCallToolResult(output: Record<string, unknown>): ToolOutputDisplayItem[] | undefined {\n const blocks = callToolResultContentBlocks(output);\n\n if (blocks === undefined) {\n return undefined;\n }\n\n const fromContent = displayItemsFromContentBlocks(blocks);\n\n if (fromContent.length > 0) {\n return fromContent;\n }\n\n if (output.structuredContent != null) {\n return toolOutputToDisplayItems(output.structuredContent);\n }\n\n return [];\n}\n\n/**\n * Normalizes arbitrary tool output into renderable items.\n * Structured JSON/HTML uses {@link CodeHighlighter} directly so tool shells do not depend on\n * Streamdown fenced-code parsing inside nested layouts.\n * @internal\n */\nexport function toolOutputToDisplayItems(output: unknown): ToolOutputDisplayItem[] {\n if (output == null) {\n return [];\n }\n\n if (typeof output === 'string') {\n const trimmed = output.trim();\n\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n try {\n return toolOutputToDisplayItems(JSON.parse(trimmed));\n }\n catch {\n return [{ kind: 'code', language: 'json', code: trimmed }];\n }\n }\n\n if (looksLikeHtmlString(trimmed)) {\n return [{ kind: 'code', language: 'html', code: trimmed }];\n }\n\n return [{ kind: 'part', part: { type: 'text', text: output } }];\n }\n\n if (isPlainObject(output)) {\n const fromEnvelope = displayItemsFromCallToolResult(output);\n\n if (fromEnvelope !== undefined) {\n return fromEnvelope;\n }\n\n const content = output.parts ?? output.content;\n\n if (isLikelyMarkdownString(content)) {\n return [{ kind: 'part', part: { type: 'text', text: content } }];\n }\n\n try {\n return [{ kind: 'code', language: 'json', code: JSON.stringify(output, null, 2) }];\n }\n catch {\n return [{ kind: 'part', part: { type: 'text', text: String(output) } }];\n }\n }\n\n if (Array.isArray(output)) {\n if (output.length > 0 && output.every(isCallToolContentBlock)) {\n return displayItemsFromContentBlocks(output);\n }\n\n try {\n return [{ kind: 'code', language: 'json', code: JSON.stringify(output, null, 2) }];\n }\n catch {\n return [{ kind: 'part', part: { type: 'text', text: String(output) } }];\n }\n }\n\n return [{ kind: 'part', part: { type: 'text', text: String(output) } }];\n}\n\nfunction getInputEntries(input: unknown): [string, unknown][] | null {\n if (isPlainObject(input)) {\n return Object.entries(input);\n }\n\n if (Array.isArray(input)) {\n return input.map((v, i) => [String(i), v]);\n }\n\n return null;\n}\n\n/** Single-row tool input when there is no structured KV list (same typography as {@link formatInputValueDisplay}). */\nfunction stringifyToolInputFallback(input: unknown): string {\n if (input === undefined) {\n return '';\n }\n\n if (typeof input === 'string') {\n return input;\n }\n\n try {\n return JSON.stringify(input, null, 2);\n }\n catch {\n return String(input);\n }\n}\n\nfunction DefaultToolInput({\n input,\n entries,\n}: {\n input: unknown;\n entries: [string, unknown][] | null;\n}) {\n if (entries != null && entries.length > 0) {\n return (\n <div className={ defaultStyles.inputKv } data-slot=\"tool-input\">\n <For each={ entries }>\n { ([key, value]) => (\n <div key={ key } className={ defaultStyles.kvRow }>\n <span className={ defaultStyles.kvKey }>{`${ humanizeString(key) }:`}</span>\n <span className={ defaultStyles.kvValue }>{formatInputValueDisplay(value)}</span>\n </div>\n ) }\n </For>\n </div>\n );\n }\n\n return (\n <div className={ defaultStyles.inputKv } data-slot=\"tool-input\">\n <div className={ defaultStyles.kvRow }>\n <span className={ defaultStyles.kvValue }>{stringifyToolInputFallback(input)}</span>\n </div>\n </div>\n );\n}\n\n/** Generic fallback renderer for tool parts. */\nexport function DefaultTool({\n part,\n onToolApprovalResponse,\n titleOverride,\n inputOverride,\n leadingIcon,\n}: ToolRendererProps & DefaultToolDisplayOptions) {\n if (!isToolUIPart(part)) {\n return null;\n }\n\n const toolName = getToolName(part);\n const title = titleOverride ?? toolHeaderTitle(part);\n const result = toolResult(part);\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const isOutputAvailable = state === 'output-available';\n\n const toolOutputItems = (isOutputAvailable && result != null)\n ? toolOutputToDisplayItems(result)\n : null;\n\n const displayInput = inputOverride !== undefined ? inputOverride : part.input;\n const toolInputView = displayInput !== undefined\n ? { input: displayInput, entries: getInputEntries(displayInput) }\n : null;\n\n const hasInput = toolInputView != null && (toolInputView.entries == null || toolInputView.entries.length > 0);\n const hasOutput = toolOutputItems != null && toolOutputItems.length > 0;\n const hasBody = hasInput || hasOutput;\n const headerTitle = title || toolName;\n\n return (\n <ToolShell\n collapsible={ hasBody }\n data-slot=\"default-tool\"\n >\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title={ headerTitle }\n icon={ leadingIcon ?? <ToolIcon aria-hidden /> }\n />\n\n <Show when={ hasBody }>\n <ToolShellContent>\n {hasInput && toolInputView != null && (\n <DefaultToolInput\n input={ toolInputView.input }\n entries={ toolInputView.entries }\n />\n )}\n\n {hasOutput && toolOutputItems != null && (\n <div\n className={ defaultStyles.output }\n data-slot=\"tool-output\"\n >\n <For each={ toolOutputItems }>\n { (item, index) => (\n item.kind === 'code'\n ? (\n <div key={ index } data-streamdown=\"code-block\">\n <CodeHighlighter\n data-streamdown=\"code-block-body\"\n className={ `language-${ item.language }` }\n language={ item.language }\n code={ item.code }\n />\n </div>\n )\n : (\n <MessagePart\n key={ index }\n part={ item.part }\n partKey={ `tool-output-${ index }` }\n isStreaming={ false }\n />\n )\n ) }\n </For>\n </div>\n )}\n </ToolShellContent>\n </Show>\n\n <Show when={ state === 'approval-requested' }>\n <ToolShellFooter>\n <Approval\n approval={ part.approval }\n state={ state }\n onToolApprovalResponse={ onToolApprovalResponse }\n >\n <ApprovalRequest>\n <Text>This tool needs your approval before execution</Text>\n <ApprovalButtons />\n </ApprovalRequest>\n </Approval>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["toolHeaderTitle","part","isToolUIPart","raw","getToolName","humanizeString","toolResult","normalizeErrorString","isPlainObject","value","formatInputValueDisplay","looksLikeHtmlString","s","t","isLikelyMarkdownString","mcpMediaDataUrl","block","data","mimeType","filePartFromMcpAudioBlock","url","ext","displayItemsFromContentBlocks","blocks","items","toolOutputToDisplayItems","dataUrl","markdown","last","audioPart","displayItemsFromCallToolResult","output","callToolResultContentBlocks","fromContent","trimmed","fromEnvelope","content","isCallToolContentBlock","getInputEntries","input","v","i","stringifyToolInputFallback","DefaultToolInput","entries","defaultStyles","For","key","_jsx","DefaultTool","onToolApprovalResponse","titleOverride","inputOverride","leadingIcon","toolName","title","result","state","failure","getToolFailureRowState","toolOutputItems","displayInput","toolInputView","hasInput","hasOutput","hasBody","headerTitle","ToolShell","ToolShellHeader","ToolIcon","Show","ToolShellContent","item","index","CodeHighlighter","MessagePart","ToolShellFooter","Approval","ApprovalRequest","Text","ApprovalButtons"],"mappings":"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"}
1
+ {"version":3,"file":"Default.js","sources":["../../../../src/chat/Tool/default/Default.tsx"],"sourcesContent":["import { Tool as ToolIcon } from '@reforma/icons/14';\nimport { humanizeString } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { CodeHighlighter } from '../../../CodeHighlighter';\nimport { For } from '../../../For';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport {\n Approval,\n ApprovalButtons,\n ApprovalRequest,\n} from '../../Approval';\nimport { MessagePart } from '../../Message/parts/MessagePart';\nimport { callToolResultContentBlocks, getToolFailureRowState, isCallToolContentBlock, normalizeErrorString } from '../helpers';\nimport {\n ToolShell,\n ToolShellContent,\n ToolShellFooter,\n ToolShellHeader,\n} from '../shell';\nimport defaultStyles from './Default.module.css';\n\nimport type { DynamicToolUIPart, ToolUIPart } from 'ai';\nimport type { ReactNode } from 'react';\nimport type { ReformaUIMessagePart } from '../../Message/types';\nimport type { ToolRendererProps } from '../types';\n\ntype DefaultToolPart = ToolUIPart | DynamicToolUIPart;\n\nexport type DefaultToolDisplayOptions = {\n titleOverride?: string;\n inputOverride?: unknown;\n leadingIcon?: ReactNode;\n};\n\n/** Header label from tool name or explicit `part.title`. */\nfunction toolHeaderTitle(part: DefaultToolPart): string | undefined {\n if (!isToolUIPart(part)) {\n return 'tool';\n }\n\n if (part.title != null) {\n return part.title;\n }\n\n const raw = getToolName(part);\n\n return humanizeString(raw);\n}\n\nfunction toolResult(part: DefaultToolPart): unknown | undefined {\n if (!isToolUIPart(part)) {\n return undefined;\n }\n\n if (part.state === 'output-available') {\n return part.output;\n }\n\n if (part.state === 'output-error' || part.state === 'output-denied') {\n return { error: normalizeErrorString(part.errorText) };\n }\n\n return undefined;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n}\n\n/** Nested objects/arrays stringify; primitives render as plain text. */\nfunction formatInputValueDisplay(value: unknown): string {\n if (value === null) {\n return 'null';\n }\n\n if (value === undefined) {\n return '';\n }\n\n if (typeof value === 'object') {\n try {\n return JSON.stringify(value);\n }\n catch {\n return String(value);\n }\n }\n\n return String(value);\n}\n\n/** Heuristic: raw HTML snippet → fenced block so Streamdown renders it as a code block, not unsafe HTML. */\nfunction looksLikeHtmlString(s: string): boolean {\n const t = s.trim();\n\n return t.length >= 2 && t.startsWith('<') && t.includes('>');\n}\n\n/**\n * True when a tool wrapped prose in `content` / `parts` as a string we should render as markdown text,\n * not re-stringify as JSON. Heuristic only — avoids fencing obvious markdown as a JSON code block.\n */\nfunction isLikelyMarkdownString(value: unknown): value is string {\n if (typeof value !== 'string') {\n return false;\n }\n\n const t = value.trim();\n\n if (t.length === 0) {\n return false;\n }\n\n // YAML frontmatter (often followed by markdown body)\n if (t.startsWith('---')) {\n return true;\n }\n\n // ATX headings (# … ## …)\n if (t.startsWith('#')) {\n return true;\n }\n\n // Blockquote\n if (t.startsWith('>')) {\n return true;\n }\n\n // Unordered / ordered list lines\n if (/^[-*+]\\s/.test(t) || /^\\d+\\.\\s/.test(t)) {\n return true;\n }\n\n // Document-level fenced code\n if (t.startsWith('```')) {\n return true;\n }\n\n return false;\n}\n\nexport type ToolOutputDisplayItem\n = | { kind: 'code'; language: string; code: string }\n | { kind: 'part'; part: ReformaUIMessagePart };\n\nfunction mcpMediaDataUrl(block: Record<string, unknown>): string | null {\n const data = block.data;\n const mimeType = block.mimeType;\n\n if (typeof data !== 'string' || data.length === 0 || typeof mimeType !== 'string' || mimeType.length === 0) {\n return null;\n }\n\n return `data:${ mimeType };base64,${ data }`;\n}\n\nfunction filePartFromMcpAudioBlock(block: unknown): ReformaUIMessagePart | null {\n if (!isPlainObject(block) || block.type !== 'audio') {\n return null;\n }\n\n const url = mcpMediaDataUrl(block);\n\n if (url == null) {\n return null;\n }\n\n const ext = String(block.mimeType).split('/')[1]?.split('+')[0] ?? 'bin';\n\n return {\n type: 'file',\n mediaType: String(block.mimeType),\n url,\n filename: `audio.${ ext }`,\n };\n}\n\n/** MCP content blocks: text/JSON/HTML sniff; images as markdown `![]()` (Streamdown); audio as a file part. */\nfunction displayItemsFromContentBlocks(blocks: unknown[]): ToolOutputDisplayItem[] {\n const items: ToolOutputDisplayItem[] = [];\n\n for (const block of blocks) {\n if (isPlainObject(block) && block.type === 'text' && typeof block.text === 'string') {\n items.push(...toolOutputToDisplayItems(block.text));\n continue;\n }\n\n if (isPlainObject(block) && block.type === 'image') {\n const dataUrl = mcpMediaDataUrl(block);\n\n if (dataUrl != null) {\n const markdown = `![](${ dataUrl })`;\n const last = items[items.length - 1];\n\n if (last?.kind === 'part' && last.part.type === 'text') {\n last.part = { type: 'text', text: `${ last.part.text }\\n\\n${ markdown }` };\n }\n else {\n items.push({ kind: 'part', part: { type: 'text', text: markdown } });\n }\n\n continue;\n }\n }\n\n const audioPart = filePartFromMcpAudioBlock(block);\n\n if (audioPart != null) {\n items.push({ kind: 'part', part: audioPart });\n continue;\n }\n\n items.push({ kind: 'part', part: block as ReformaUIMessagePart });\n }\n\n return items;\n}\n\nfunction displayItemsFromCallToolResult(output: Record<string, unknown>): ToolOutputDisplayItem[] | undefined {\n const blocks = callToolResultContentBlocks(output);\n\n if (blocks === undefined) {\n return undefined;\n }\n\n const fromContent = displayItemsFromContentBlocks(blocks);\n\n if (fromContent.length > 0) {\n return fromContent;\n }\n\n if (output.structuredContent != null) {\n return toolOutputToDisplayItems(output.structuredContent);\n }\n\n return [];\n}\n\n/**\n * Normalizes arbitrary tool output into renderable items.\n * Structured JSON/HTML uses {@link CodeHighlighter} directly so tool shells do not depend on\n * Streamdown fenced-code parsing inside nested layouts.\n * @internal\n */\nexport function toolOutputToDisplayItems(output: unknown): ToolOutputDisplayItem[] {\n if (output == null) {\n return [];\n }\n\n if (typeof output === 'string') {\n const trimmed = output.trim();\n\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n try {\n return toolOutputToDisplayItems(JSON.parse(trimmed));\n }\n catch {\n return [{ kind: 'code', language: 'json', code: trimmed }];\n }\n }\n\n if (looksLikeHtmlString(trimmed)) {\n return [{ kind: 'code', language: 'html', code: trimmed }];\n }\n\n return [{ kind: 'part', part: { type: 'text', text: output } }];\n }\n\n if (isPlainObject(output)) {\n const fromEnvelope = displayItemsFromCallToolResult(output);\n\n if (fromEnvelope !== undefined) {\n return fromEnvelope;\n }\n\n const content = output.parts ?? output.content;\n\n if (isLikelyMarkdownString(content)) {\n return [{ kind: 'part', part: { type: 'text', text: content } }];\n }\n\n try {\n return [{ kind: 'code', language: 'json', code: JSON.stringify(output, null, 2) }];\n }\n catch {\n return [{ kind: 'part', part: { type: 'text', text: String(output) } }];\n }\n }\n\n if (Array.isArray(output)) {\n if (output.length > 0 && output.every(isCallToolContentBlock)) {\n return displayItemsFromContentBlocks(output);\n }\n\n try {\n return [{ kind: 'code', language: 'json', code: JSON.stringify(output, null, 2) }];\n }\n catch {\n return [{ kind: 'part', part: { type: 'text', text: String(output) } }];\n }\n }\n\n return [{ kind: 'part', part: { type: 'text', text: String(output) } }];\n}\n\nfunction getInputEntries(input: unknown): [string, unknown][] | null {\n if (isPlainObject(input)) {\n return Object.entries(input);\n }\n\n if (Array.isArray(input)) {\n return input.map((v, i) => [String(i), v]);\n }\n\n return null;\n}\n\n/** Single-row tool input when there is no structured KV list (same typography as {@link formatInputValueDisplay}). */\nfunction stringifyToolInputFallback(input: unknown): string {\n if (input === undefined) {\n return '';\n }\n\n if (typeof input === 'string') {\n return input;\n }\n\n try {\n return JSON.stringify(input, null, 2);\n }\n catch {\n return String(input);\n }\n}\n\nfunction DefaultToolInput({\n input,\n entries,\n}: {\n input: unknown;\n entries: [string, unknown][] | null;\n}) {\n if (entries != null && entries.length > 0) {\n return (\n <div className={ defaultStyles.inputKv } data-slot=\"tool-input\">\n <For each={ entries }>\n { ([key, value]) => (\n <div key={ key } className={ defaultStyles.kvRow }>\n <span className={ defaultStyles.kvKey }>{`${ humanizeString(key) }:`}</span>\n <span className={ defaultStyles.kvValue }>{formatInputValueDisplay(value)}</span>\n </div>\n ) }\n </For>\n </div>\n );\n }\n\n return (\n <div className={ defaultStyles.inputKv } data-slot=\"tool-input\">\n <div className={ defaultStyles.kvRow }>\n <span className={ defaultStyles.kvValue }>{stringifyToolInputFallback(input)}</span>\n </div>\n </div>\n );\n}\n\n/** Generic fallback renderer for tool parts. */\nexport function DefaultTool({\n part,\n onToolApprovalResponse,\n titleOverride,\n inputOverride,\n leadingIcon,\n}: ToolRendererProps & DefaultToolDisplayOptions) {\n if (!isToolUIPart(part)) {\n return null;\n }\n\n const toolName = getToolName(part);\n const title = titleOverride ?? toolHeaderTitle(part);\n const result = toolResult(part);\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const isOutputAvailable = state === 'output-available';\n\n const toolOutputItems = (isOutputAvailable && result != null)\n ? toolOutputToDisplayItems(result)\n : null;\n\n const displayInput = inputOverride !== undefined ? inputOverride : part.input;\n const toolInputView = displayInput !== undefined\n ? { input: displayInput, entries: getInputEntries(displayInput) }\n : null;\n\n const hasInput = toolInputView != null && (toolInputView.entries == null || toolInputView.entries.length > 0);\n const hasOutput = toolOutputItems != null && toolOutputItems.length > 0;\n const hasBody = hasInput || hasOutput;\n const headerTitle = title || toolName;\n\n return (\n <ToolShell\n collapsible={ hasBody }\n data-slot=\"default-tool\"\n >\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title={ headerTitle }\n icon={ leadingIcon ?? <ToolIcon aria-hidden /> }\n />\n\n <Show when={ hasBody }>\n <ToolShellContent>\n {hasInput && toolInputView != null && (\n <DefaultToolInput\n input={ toolInputView.input }\n entries={ toolInputView.entries }\n />\n )}\n\n {hasOutput && toolOutputItems != null && (\n <div\n className={ defaultStyles.output }\n data-slot=\"tool-output\"\n >\n <For each={ toolOutputItems }>\n { (item, index) => (\n item.kind === 'code'\n ? (\n <div key={ index } data-streamdown=\"code-block\">\n <CodeHighlighter\n data-streamdown=\"code-block-body\"\n className={ `language-${ item.language }` }\n language={ item.language }\n code={ item.code }\n />\n </div>\n )\n : (\n <MessagePart\n key={ index }\n part={ item.part }\n partKey={ `tool-output-${ index }` }\n isStreaming={ false }\n />\n )\n ) }\n </For>\n </div>\n )}\n </ToolShellContent>\n </Show>\n\n <Show when={ state === 'approval-requested' }>\n <ToolShellFooter>\n <Approval\n approval={ part.approval }\n state={ state }\n onToolApprovalResponse={ onToolApprovalResponse }\n >\n <ApprovalRequest>\n <Text>This tool needs your approval before execution</Text>\n <ApprovalButtons />\n </ApprovalRequest>\n </Approval>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["toolHeaderTitle","part","isToolUIPart","raw","getToolName","humanizeString","toolResult","normalizeErrorString","isPlainObject","value","formatInputValueDisplay","looksLikeHtmlString","s","t","isLikelyMarkdownString","mcpMediaDataUrl","block","data","mimeType","filePartFromMcpAudioBlock","url","ext","displayItemsFromContentBlocks","blocks","items","toolOutputToDisplayItems","dataUrl","markdown","last","audioPart","displayItemsFromCallToolResult","output","callToolResultContentBlocks","fromContent","trimmed","fromEnvelope","content","isCallToolContentBlock","getInputEntries","input","v","i","stringifyToolInputFallback","DefaultToolInput","entries","defaultStyles","For","key","_jsx","DefaultTool","onToolApprovalResponse","titleOverride","inputOverride","leadingIcon","toolName","title","result","state","failure","getToolFailureRowState","toolOutputItems","displayInput","toolInputView","hasInput","hasOutput","hasBody","headerTitle","ToolShell","ToolShellHeader","ToolIcon","Show","ToolShellContent","item","index","CodeHighlighter","MessagePart","ToolShellFooter","Approval","ApprovalRequest","Text","ApprovalButtons"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Refresh as g } from "@reforma/icons/14";
2
- import { isToolUIPart as h, getToolName as m } from "ai";
2
+ import { isToolUIPart as h, getToolName as m } from "@reforma/types";
3
3
  import { Show as i } from "../../../Show/Show.js";
4
4
  import { Badge as b } from "../../../Tag/Badge.js";
5
5
  import { Text as s } from "../../../Text/Text.js";
@@ -1 +1 @@
1
- {"version":3,"file":"DevServerRestartTool.js","sources":["../../../../src/chat/Tool/dev-server/DevServerRestartTool.tsx"],"sourcesContent":["import { Refresh } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Show } from '../../../Show';\nimport { Badge } from '../../../Tag';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\nimport badgeStyles from '../shell/ToolSummaryBadge.module.css';\nimport { devServerHealthBadgeColor, devServerHealthLabel } from './devServerHealth';\n\nimport type { DevServerRestartToolInput, DevServerRestartToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nconst labels = {\n inProgress: 'Restarting dev server',\n pending: 'Restart dev server',\n background: 'Restarting in background',\n success: 'Dev server restarted',\n failed: 'Dev server restart failed',\n} as const;\n\nfunction healthProbe(output: unknown): { running?: boolean; status?: number } | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n const raw = output as DevServerRestartToolOutput;\n\n if (typeof raw.running !== 'boolean') {\n return undefined;\n }\n\n return {\n running: raw.running,\n status: raw.httpStatus,\n };\n}\n\nfunction outputError(output: unknown): string | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n const error = (output as DevServerRestartToolOutput).error;\n\n if (typeof error === 'string' && error.length > 0) {\n return error;\n }\n\n return undefined;\n}\n\nfunction devServerRestartTitle(\n state: string,\n input: unknown,\n output: unknown,\n useFailureLabel: boolean\n): string {\n if (useFailureLabel || outputError(output)) {\n return labels.failed;\n }\n\n if (isToolInvocationInProgress(state)) {\n return labels.pending;\n }\n\n if (\n (input != null && typeof input === 'object' && (input as DevServerRestartToolInput).background === true)\n || (output != null && typeof output === 'object' && (output as DevServerRestartToolOutput).status === 'running')\n ) {\n return labels.background;\n }\n\n if (state === 'output-available') {\n return labels.success;\n }\n\n return labels.pending;\n}\n\n/** DevServerRestart: restart row plus the same health badge DevServerStatus shows. */\nexport function DevServerRestartTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'DevServerRestart') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const logicalError = part.state === 'output-available' ? outputError(part.output) : undefined;\n const title = devServerRestartTitle(part.state, part.input, part.output, failure.useFailureLabel);\n const label = part.state === 'output-available'\n ? devServerHealthLabel(healthProbe(part.output))\n : undefined;\n const hasError = Boolean(failure.useFailureLabel || logicalError);\n\n return (\n <ToolShell data-slot=\"dev-server-restart-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip ?? logicalError }\n title={ title }\n titleInProgress={ labels.inProgress }\n icon={ <Refresh aria-hidden /> }\n >\n <Show when={ label }>\n { status => (\n <Badge\n color={ devServerHealthBadgeColor(status, hasError) }\n size=\"xs\"\n aria-label=\"Status\"\n className={ badgeStyles.badge }\n tagClassName={ badgeStyles.tag }\n >\n {status}\n </Badge>\n ) }\n </Show>\n </ToolShellHeader>\n\n <Show when={ logicalError && !failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{logicalError}</Text>\n </ToolShellFooter>\n </Show>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["labels","healthProbe","output","raw","outputError","error","devServerRestartTitle","state","input","useFailureLabel","isToolInvocationInProgress","DevServerRestartTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","logicalError","title","label","devServerHealthLabel","hasError","ToolShell","_jsx","ToolShellHeader","Refresh","Show","status","Badge","devServerHealthBadgeColor","badgeStyles","ToolShellFooter","Text"],"mappings":";;;;;;;;;;AAUA,MAAMA,IAAS;AAAA,EACb,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,QAAQ;AACV;AACA,SAASC,EAAYC,GAAQ;AAC3B,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACtC;AAEF,QAAMC,IAAMD;AACZ,MAAI,OAAOC,EAAI,WAAY;AAG3B,WAAO;AAAA,MACL,SAASA,EAAI;AAAA,MACb,QAAQA,EAAI;AAAA,IAAA;AAEhB;AACA,SAASC,EAAYF,GAAQ;AAC3B,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACtC;AAEF,QAAMG,IAAQH,EAAO;AACrB,MAAI,OAAOG,KAAU,YAAYA,EAAM,SAAS;AAC9C,WAAOA;AAGX;AACA,SAASC,EAAsBC,GAAOC,GAAON,GAAQO,GAAiB;AACpE,SAAIA,KAAmBL,EAAYF,CAAM,IAChCF,EAAO,SAEZU,EAA2BH,CAAK,IAC3BP,EAAO,UAEZQ,KAAS,QAAQ,OAAOA,KAAU,YAAYA,EAAM,eAAe,MAAQN,KAAU,QAAQ,OAAOA,KAAW,YAAYA,EAAO,WAAW,YACxIF,EAAO,aAEZO,MAAU,qBACLP,EAAO,UAETA,EAAO;AAChB;AAGO,SAASW,EAAqB;AAAA,EACnC,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAUC,EAAuBJ,CAAI,GACrCK,IAAeL,EAAK,UAAU,qBAAqBR,EAAYQ,EAAK,MAAM,IAAI,QAC9EM,IAAQZ,EAAsBM,EAAK,OAAOA,EAAK,OAAOA,EAAK,QAAQG,EAAQ,eAAe,GAC1FI,IAAQP,EAAK,UAAU,qBAAqBQ,EAAqBnB,EAAYW,EAAK,MAAM,CAAC,IAAI,QAC7FS,IAAW,GAAQN,EAAQ,mBAAmBE;AACpD,2BAA0BK,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOZ,EAAK;AAAA,MACZ,cAAcG,EAAQ,WAAWE;AAAA,MACjC,OAAAC;AAAA,MACA,iBAAiBlB,EAAO;AAAA,MACxB,wBAAwByB,GAAS;AAAA,QAC/B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,4BAA4BC,GAAM;AAAA,QAChC,MAAMP;AAAA,QACN,UAAU,CAAAQ,MAAuBJ,gBAAAA,EAAKK,GAAO;AAAA,UAC3C,OAAOC,EAA0BF,GAAQN,CAAQ;AAAA,UACjD,MAAM;AAAA,UACN,cAAc;AAAA,UACd,WAAWS,EAAY;AAAA,UACvB,cAAcA,EAAY;AAAA,UAC1B,UAAUH;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBJ,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMT,KAAgB,CAACF,EAAQ;AAAA,MAC/B,4BAA4BgB,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUf;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBM,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMX,EAAQ;AAAA,MACd,4BAA4BgB,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUjB,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
1
+ {"version":3,"file":"DevServerRestartTool.js","sources":["../../../../src/chat/Tool/dev-server/DevServerRestartTool.tsx"],"sourcesContent":["import { Refresh } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Show } from '../../../Show';\nimport { Badge } from '../../../Tag';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\nimport badgeStyles from '../shell/ToolSummaryBadge.module.css';\nimport { devServerHealthBadgeColor, devServerHealthLabel } from './devServerHealth';\n\nimport type { DevServerRestartToolInput, DevServerRestartToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nconst labels = {\n inProgress: 'Restarting dev server',\n pending: 'Restart dev server',\n background: 'Restarting in background',\n success: 'Dev server restarted',\n failed: 'Dev server restart failed',\n} as const;\n\nfunction healthProbe(output: unknown): { running?: boolean; status?: number } | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n const raw = output as DevServerRestartToolOutput;\n\n if (typeof raw.running !== 'boolean') {\n return undefined;\n }\n\n return {\n running: raw.running,\n status: raw.httpStatus,\n };\n}\n\nfunction outputError(output: unknown): string | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n const error = (output as DevServerRestartToolOutput).error;\n\n if (typeof error === 'string' && error.length > 0) {\n return error;\n }\n\n return undefined;\n}\n\nfunction devServerRestartTitle(\n state: string,\n input: unknown,\n output: unknown,\n useFailureLabel: boolean\n): string {\n if (useFailureLabel || outputError(output)) {\n return labels.failed;\n }\n\n if (isToolInvocationInProgress(state)) {\n return labels.pending;\n }\n\n if (\n (input != null && typeof input === 'object' && (input as DevServerRestartToolInput).background === true)\n || (output != null && typeof output === 'object' && (output as DevServerRestartToolOutput).status === 'running')\n ) {\n return labels.background;\n }\n\n if (state === 'output-available') {\n return labels.success;\n }\n\n return labels.pending;\n}\n\n/** DevServerRestart: restart row plus the same health badge DevServerStatus shows. */\nexport function DevServerRestartTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'DevServerRestart') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const logicalError = part.state === 'output-available' ? outputError(part.output) : undefined;\n const title = devServerRestartTitle(part.state, part.input, part.output, failure.useFailureLabel);\n const label = part.state === 'output-available'\n ? devServerHealthLabel(healthProbe(part.output))\n : undefined;\n const hasError = Boolean(failure.useFailureLabel || logicalError);\n\n return (\n <ToolShell data-slot=\"dev-server-restart-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip ?? logicalError }\n title={ title }\n titleInProgress={ labels.inProgress }\n icon={ <Refresh aria-hidden /> }\n >\n <Show when={ label }>\n { status => (\n <Badge\n color={ devServerHealthBadgeColor(status, hasError) }\n size=\"xs\"\n aria-label=\"Status\"\n className={ badgeStyles.badge }\n tagClassName={ badgeStyles.tag }\n >\n {status}\n </Badge>\n ) }\n </Show>\n </ToolShellHeader>\n\n <Show when={ logicalError && !failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{logicalError}</Text>\n </ToolShellFooter>\n </Show>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["labels","healthProbe","output","raw","outputError","error","devServerRestartTitle","state","input","useFailureLabel","isToolInvocationInProgress","DevServerRestartTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","logicalError","title","label","devServerHealthLabel","hasError","ToolShell","_jsx","ToolShellHeader","Refresh","Show","status","Badge","devServerHealthBadgeColor","badgeStyles","ToolShellFooter","Text"],"mappings":";;;;;;;;;;AAUA,MAAMA,IAAS;AAAA,EACb,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,QAAQ;AACV;AACA,SAASC,EAAYC,GAAQ;AAC3B,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACtC;AAEF,QAAMC,IAAMD;AACZ,MAAI,OAAOC,EAAI,WAAY;AAG3B,WAAO;AAAA,MACL,SAASA,EAAI;AAAA,MACb,QAAQA,EAAI;AAAA,IAAA;AAEhB;AACA,SAASC,EAAYF,GAAQ;AAC3B,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACtC;AAEF,QAAMG,IAAQH,EAAO;AACrB,MAAI,OAAOG,KAAU,YAAYA,EAAM,SAAS;AAC9C,WAAOA;AAGX;AACA,SAASC,EAAsBC,GAAOC,GAAON,GAAQO,GAAiB;AACpE,SAAIA,KAAmBL,EAAYF,CAAM,IAChCF,EAAO,SAEZU,EAA2BH,CAAK,IAC3BP,EAAO,UAEZQ,KAAS,QAAQ,OAAOA,KAAU,YAAYA,EAAM,eAAe,MAAQN,KAAU,QAAQ,OAAOA,KAAW,YAAYA,EAAO,WAAW,YACxIF,EAAO,aAEZO,MAAU,qBACLP,EAAO,UAETA,EAAO;AAChB;AAGO,SAASW,EAAqB;AAAA,EACnC,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAUC,EAAuBJ,CAAI,GACrCK,IAAeL,EAAK,UAAU,qBAAqBR,EAAYQ,EAAK,MAAM,IAAI,QAC9EM,IAAQZ,EAAsBM,EAAK,OAAOA,EAAK,OAAOA,EAAK,QAAQG,EAAQ,eAAe,GAC1FI,IAAQP,EAAK,UAAU,qBAAqBQ,EAAqBnB,EAAYW,EAAK,MAAM,CAAC,IAAI,QAC7FS,IAAW,GAAQN,EAAQ,mBAAmBE;AACpD,2BAA0BK,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOZ,EAAK;AAAA,MACZ,cAAcG,EAAQ,WAAWE;AAAA,MACjC,OAAAC;AAAA,MACA,iBAAiBlB,EAAO;AAAA,MACxB,wBAAwByB,GAAS;AAAA,QAC/B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,4BAA4BC,GAAM;AAAA,QAChC,MAAMP;AAAA,QACN,UAAU,CAAAQ,MAAuBJ,gBAAAA,EAAKK,GAAO;AAAA,UAC3C,OAAOC,EAA0BF,GAAQN,CAAQ;AAAA,UACjD,MAAM;AAAA,UACN,cAAc;AAAA,UACd,WAAWS,EAAY;AAAA,UACvB,cAAcA,EAAY;AAAA,UAC1B,UAAUH;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBJ,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMT,KAAgB,CAACF,EAAQ;AAAA,MAC/B,4BAA4BgB,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUf;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBM,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMX,EAAQ;AAAA,MACd,4BAA4BgB,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUjB,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
@@ -1,5 +1,5 @@
1
1
  import { Desktop as u } from "@reforma/icons/14";
2
- import { isToolUIPart as h, getToolName as f } from "ai";
2
+ import { isToolUIPart as h, getToolName as f } from "@reforma/types";
3
3
  import { Show as l } from "../../../Show/Show.js";
4
4
  import { Badge as p } from "../../../Tag/Badge.js";
5
5
  import { Text as s } from "../../../Text/Text.js";