@reforma/components 0.4.1 → 0.5.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 (119) 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/chat/ComposerBanner/ComposerBanner.d.ts +6 -1
  6. package/dist/chat/ComposerBanner/ComposerBanner.d.ts.map +1 -1
  7. package/dist/chat/ComposerBanner/ComposerBanner.js +60 -40
  8. package/dist/chat/ComposerBanner/ComposerBanner.js.map +1 -1
  9. package/dist/chat/ComposerBanner/ComposerBanner.module.css +1 -1
  10. package/dist/chat/ComposerBanner/ComposerBanner.module.css.js +13 -9
  11. package/dist/chat/ComposerBanner/ComposerBanner.module.css.js.map +1 -1
  12. package/dist/chat/Conversation/ConversationPendingLoader.d.ts.map +1 -1
  13. package/dist/chat/Conversation/ConversationPendingLoader.js +1 -1
  14. package/dist/chat/Conversation/ConversationPendingLoader.js.map +1 -1
  15. package/dist/chat/Message/normalize/normalizeMessageParts.d.ts +1 -1
  16. package/dist/chat/Message/normalize/normalizeMessageParts.d.ts.map +1 -1
  17. package/dist/chat/Message/normalize/normalizeMessageParts.js +1 -1
  18. package/dist/chat/Message/normalize/normalizeMessageParts.js.map +1 -1
  19. package/dist/chat/Message/parts/MessagePart.d.ts.map +1 -1
  20. package/dist/chat/Message/parts/MessagePart.js +1 -1
  21. package/dist/chat/Message/parts/MessagePart.js.map +1 -1
  22. package/dist/chat/Message/parts/backgroundResultPart.js +1 -1
  23. package/dist/chat/Message/parts/backgroundResultPart.js.map +1 -1
  24. package/dist/chat/Message/parts/collectMessageSources.d.ts +1 -1
  25. package/dist/chat/Message/parts/collectMessageSources.d.ts.map +1 -1
  26. package/dist/chat/Message/parts/collectMessageSources.js +1 -1
  27. package/dist/chat/Message/parts/collectMessageSources.js.map +1 -1
  28. package/dist/chat/Message/parts/contextCompactionPart.js +1 -1
  29. package/dist/chat/Message/parts/contextCompactionPart.js.map +1 -1
  30. package/dist/chat/Message/segments/analyzeGroupedSegment.js +5 -5
  31. package/dist/chat/Message/segments/analyzeGroupedSegment.js.map +1 -1
  32. package/dist/chat/Message/segments/recentStreamingPhaseToolGroups.js +1 -1
  33. package/dist/chat/Message/segments/recentStreamingPhaseToolGroups.js.map +1 -1
  34. package/dist/chat/Message/turn/workedCollapse.js +1 -1
  35. package/dist/chat/Message/turn/workedCollapse.js.map +1 -1
  36. package/dist/chat/Tool/Tool.js +1 -1
  37. package/dist/chat/Tool/Tool.js.map +1 -1
  38. package/dist/chat/Tool/agent/AgentTool.d.ts.map +1 -1
  39. package/dist/chat/Tool/agent/AgentTool.js +73 -73
  40. package/dist/chat/Tool/agent/AgentTool.js.map +1 -1
  41. package/dist/chat/Tool/bash/BashTool.d.ts.map +1 -1
  42. package/dist/chat/Tool/bash/BashTool.js +1 -1
  43. package/dist/chat/Tool/bash/BashTool.js.map +1 -1
  44. package/dist/chat/Tool/create-directory/CreateDirectoryTool.js +1 -1
  45. package/dist/chat/Tool/create-directory/CreateDirectoryTool.js.map +1 -1
  46. package/dist/chat/Tool/default/Default.d.ts.map +1 -1
  47. package/dist/chat/Tool/default/Default.js +1 -1
  48. package/dist/chat/Tool/default/Default.js.map +1 -1
  49. package/dist/chat/Tool/dev-server/DevServerRestartTool.js +1 -1
  50. package/dist/chat/Tool/dev-server/DevServerRestartTool.js.map +1 -1
  51. package/dist/chat/Tool/dev-server/DevServerStatusTool.js +1 -1
  52. package/dist/chat/Tool/dev-server/DevServerStatusTool.js.map +1 -1
  53. package/dist/chat/Tool/edit/EditTool.js +1 -1
  54. package/dist/chat/Tool/edit/EditTool.js.map +1 -1
  55. package/dist/chat/Tool/fetch/FetchTool.js +1 -1
  56. package/dist/chat/Tool/fetch/FetchTool.js.map +1 -1
  57. package/dist/chat/Tool/fileChangesFromToolParts.js +1 -1
  58. package/dist/chat/Tool/fileChangesFromToolParts.js.map +1 -1
  59. package/dist/chat/Tool/get-background-result/GetBackgroundResultTool.js +1 -1
  60. package/dist/chat/Tool/get-background-result/GetBackgroundResultTool.js.map +1 -1
  61. package/dist/chat/Tool/get-errors/GetErrorsTool.js +1 -1
  62. package/dist/chat/Tool/get-errors/GetErrorsTool.js.map +1 -1
  63. package/dist/chat/Tool/glob/GlobTool.js +1 -1
  64. package/dist/chat/Tool/glob/GlobTool.js.map +1 -1
  65. package/dist/chat/Tool/grep/GrepTool.js +1 -1
  66. package/dist/chat/Tool/grep/GrepTool.js.map +1 -1
  67. package/dist/chat/Tool/helpers.d.ts +1 -1
  68. package/dist/chat/Tool/helpers.d.ts.map +1 -1
  69. package/dist/chat/Tool/helpers.js +1 -1
  70. package/dist/chat/Tool/helpers.js.map +1 -1
  71. package/dist/chat/Tool/image-asset/ImageAssetTool.js +1 -1
  72. package/dist/chat/Tool/image-asset/ImageAssetTool.js.map +1 -1
  73. package/dist/chat/Tool/install-dependencies/InstallDependenciesTool.js +1 -1
  74. package/dist/chat/Tool/install-dependencies/InstallDependenciesTool.js.map +1 -1
  75. package/dist/chat/Tool/install-plugin/InstallPlugin.js +1 -1
  76. package/dist/chat/Tool/install-plugin/InstallPlugin.js.map +1 -1
  77. package/dist/chat/Tool/integration-card/IntegrationActionCard.d.ts +3 -1
  78. package/dist/chat/Tool/integration-card/IntegrationActionCard.d.ts.map +1 -1
  79. package/dist/chat/Tool/integration-card/IntegrationActionCard.js +88 -82
  80. package/dist/chat/Tool/integration-card/IntegrationActionCard.js.map +1 -1
  81. package/dist/chat/Tool/list-directory/normalizeListDirectoryTools.js +1 -1
  82. package/dist/chat/Tool/list-directory/normalizeListDirectoryTools.js.map +1 -1
  83. package/dist/chat/Tool/mcp-tools/CallDynamicTool.js +1 -1
  84. package/dist/chat/Tool/mcp-tools/CallDynamicTool.js.map +1 -1
  85. package/dist/chat/Tool/mcp-tools/GetDynamicToolsTool.js +1 -1
  86. package/dist/chat/Tool/mcp-tools/GetDynamicToolsTool.js.map +1 -1
  87. package/dist/chat/Tool/mcp-tools/GetMcpResourcesTool.js +1 -1
  88. package/dist/chat/Tool/mcp-tools/GetMcpResourcesTool.js.map +1 -1
  89. package/dist/chat/Tool/mcp-tools/McpAuth.js +1 -1
  90. package/dist/chat/Tool/mcp-tools/McpAuth.js.map +1 -1
  91. package/dist/chat/Tool/memory/MemoryTool.js +1 -1
  92. package/dist/chat/Tool/memory/MemoryTool.js.map +1 -1
  93. package/dist/chat/Tool/move-file/MoveFileTool.js +1 -1
  94. package/dist/chat/Tool/move-file/MoveFileTool.js.map +1 -1
  95. package/dist/chat/Tool/plan/CreatePlanTool.js +1 -1
  96. package/dist/chat/Tool/plan/CreatePlanTool.js.map +1 -1
  97. package/dist/chat/Tool/preamble/PreambleTool.js +1 -1
  98. package/dist/chat/Tool/preamble/PreambleTool.js.map +1 -1
  99. package/dist/chat/Tool/project-build/BuildTool.js +1 -1
  100. package/dist/chat/Tool/project-build/BuildTool.js.map +1 -1
  101. package/dist/chat/Tool/project-env/ProjectEnvTool.js +1 -1
  102. package/dist/chat/Tool/project-env/ProjectEnvTool.js.map +1 -1
  103. package/dist/chat/Tool/read/normalizeReadTools.js +1 -1
  104. package/dist/chat/Tool/read/normalizeReadTools.js.map +1 -1
  105. package/dist/chat/Tool/read-lints/ReadLintsTool.js +1 -1
  106. package/dist/chat/Tool/read-lints/ReadLintsTool.js.map +1 -1
  107. package/dist/chat/Tool/remove-file/RemoveFileTool.js +1 -1
  108. package/dist/chat/Tool/remove-file/RemoveFileTool.js.map +1 -1
  109. package/dist/chat/Tool/scaffold-project/ScaffoldProjectTool.js +1 -1
  110. package/dist/chat/Tool/scaffold-project/ScaffoldProjectTool.js.map +1 -1
  111. package/dist/chat/Tool/screenshot/CaptureScreenshotTool.js +3 -3
  112. package/dist/chat/Tool/screenshot/CaptureScreenshotTool.js.map +1 -1
  113. package/dist/chat/Tool/skill/SkillTool.js +1 -1
  114. package/dist/chat/Tool/skill/SkillTool.js.map +1 -1
  115. package/dist/chat/Tool/waiting/WaitingTool.js +1 -1
  116. package/dist/chat/Tool/waiting/WaitingTool.js.map +1 -1
  117. package/dist/chat/Tool/web-search/WebSearchTool.js +1 -1
  118. package/dist/chat/Tool/web-search/WebSearchTool.js.map +1 -1
  119. package/package.json +4 -4
@@ -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":"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"}
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 ToolSummaryBadges,\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 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":"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"}
@@ -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";
@@ -1 +1 @@
1
- {"version":3,"file":"DevServerStatusTool.js","sources":["../../../../src/chat/Tool/dev-server/DevServerStatusTool.tsx"],"sourcesContent":["import { Desktop } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Show } from '../../../Show';\nimport { Badge } from '../../../Tag';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\nimport badgeStyles from '../shell/ToolSummaryBadge.module.css';\nimport { devServerHealthBadgeColor, devServerHealthLabel } from './devServerHealth';\n\nimport type { DevServerStatusToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nfunction parseOutput(output: unknown): DevServerStatusToolOutput | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n return output;\n}\n\n/** DevServerStatus: project status badge on the row; errors stay in the footer. */\nexport function DevServerStatusTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'DevServerStatus') {\n return null;\n }\n\n const output = part.state === 'output-available' ? parseOutput(part.output) : undefined;\n const failure = getToolFailureRowState(part);\n const label = devServerHealthLabel(output);\n const logicalError = output?.error;\n const hasError = Boolean(failure.useFailureLabel || logicalError);\n\n return (\n <ToolShell data-slot=\"dev-server-status-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip ?? logicalError }\n title=\"Project status\"\n titleInProgress=\"Project status\"\n icon={ <Desktop 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":["parseOutput","output","DevServerStatusTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","label","devServerHealthLabel","logicalError","hasError","ToolShell","_jsx","ToolShellHeader","Desktop","Show","status","Badge","devServerHealthBadgeColor","badgeStyles","ToolShellFooter","Text"],"mappings":";;;;;;;;;;AAUA,SAASA,EAAYC,GAAQ;AAC3B,MAAI,EAAAA,KAAU,QAAQ,OAAOA,KAAW;AAGxC,WAAOA;AACT;AAGO,SAASC,EAAoB;AAAA,EAClC,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMF,IAASE,EAAK,UAAU,qBAAqBH,EAAYG,EAAK,MAAM,IAAI,QACxEG,IAAUC,EAAuBJ,CAAI,GACrCK,IAAQC,EAAqBR,CAAM,GACnCS,IAAeT,GAAQ,OACvBU,IAAW,GAAQL,EAAQ,mBAAmBI;AACpD,2BAA0BE,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOX,EAAK;AAAA,MACZ,cAAcG,EAAQ,WAAWI;AAAA,MACjC,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,wBAAwBK,GAAS;AAAA,QAC/B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,4BAA4BC,GAAM;AAAA,QAChC,MAAMR;AAAA,QACN,UAAU,CAAAS,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,MAAMN,KAAgB,CAACJ,EAAQ;AAAA,MAC/B,4BAA4Be,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUZ;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBG,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMV,EAAQ;AAAA,MACd,4BAA4Be,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUhB,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
1
+ {"version":3,"file":"DevServerStatusTool.js","sources":["../../../../src/chat/Tool/dev-server/DevServerStatusTool.tsx"],"sourcesContent":["import { Desktop } 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 } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\nimport badgeStyles from '../shell/ToolSummaryBadge.module.css';\nimport { devServerHealthBadgeColor, devServerHealthLabel } from './devServerHealth';\n\nimport type { DevServerStatusToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nfunction parseOutput(output: unknown): DevServerStatusToolOutput | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n return output;\n}\n\n/** DevServerStatus: project status badge on the row; errors stay in the footer. */\nexport function DevServerStatusTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'DevServerStatus') {\n return null;\n }\n\n const output = part.state === 'output-available' ? parseOutput(part.output) : undefined;\n const failure = getToolFailureRowState(part);\n const label = devServerHealthLabel(output);\n const logicalError = output?.error;\n const hasError = Boolean(failure.useFailureLabel || logicalError);\n\n return (\n <ToolShell data-slot=\"dev-server-status-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip ?? logicalError }\n title=\"Project status\"\n titleInProgress=\"Project status\"\n icon={ <Desktop 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":["parseOutput","output","DevServerStatusTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","label","devServerHealthLabel","logicalError","hasError","ToolShell","_jsx","ToolShellHeader","Desktop","Show","status","Badge","devServerHealthBadgeColor","badgeStyles","ToolShellFooter","Text"],"mappings":";;;;;;;;;;AAUA,SAASA,EAAYC,GAAQ;AAC3B,MAAI,EAAAA,KAAU,QAAQ,OAAOA,KAAW;AAGxC,WAAOA;AACT;AAGO,SAASC,EAAoB;AAAA,EAClC,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMF,IAASE,EAAK,UAAU,qBAAqBH,EAAYG,EAAK,MAAM,IAAI,QACxEG,IAAUC,EAAuBJ,CAAI,GACrCK,IAAQC,EAAqBR,CAAM,GACnCS,IAAeT,GAAQ,OACvBU,IAAW,GAAQL,EAAQ,mBAAmBI;AACpD,2BAA0BE,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOX,EAAK;AAAA,MACZ,cAAcG,EAAQ,WAAWI;AAAA,MACjC,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,wBAAwBK,GAAS;AAAA,QAC/B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,4BAA4BC,GAAM;AAAA,QAChC,MAAMR;AAAA,QACN,UAAU,CAAAS,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,MAAMN,KAAgB,CAACJ,EAAQ;AAAA,MAC/B,4BAA4Be,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUZ;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBG,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMV,EAAQ;AAAA,MACd,4BAA4Be,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUhB,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
@@ -1,6 +1,6 @@
1
1
  import { EditSquare as I, EditPen as L } from "@reforma/icons/14";
2
2
  import { getLanguageFromPath as N } from "@reforma/lib";
3
- import { getToolName as D } from "ai";
3
+ import { getToolName as D } from "@reforma/types";
4
4
  import { useMemo as c, memo as H } from "react";
5
5
  import { CodeHighlighter as W } from "../../../CodeHighlighter/CodeHighlighter.js";
6
6
  import { transformerNotationDiff as q } from "../../../CodeHighlighter/transformers/transformerNotation.js";
@@ -1 +1 @@
1
- {"version":3,"file":"EditTool.js","sources":["../../../../src/chat/Tool/edit/EditTool.tsx"],"sourcesContent":["import { EditPen, EditSquare } from '@reforma/icons/14';\nimport { getLanguageFromPath } from '@reforma/lib';\nimport { getToolName } from 'ai';\nimport { memo, useMemo } from 'react';\n\nimport { CodeHighlighter } from '../../../CodeHighlighter';\nimport { transformerNotationDiff } from '../../../CodeHighlighter/transformers';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport {\n Approval,\n ApprovalButtons,\n ApprovalRequest,\n} from '../../Approval';\nimport { useChatHandlers } from '../../ChatContext';\nimport { Chip, chipItemFromPath } from '../../Chip';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport {\n ToolLineCounts,\n ToolShell,\n ToolShellContent,\n ToolShellFooter,\n ToolShellHeader,\n} from '../shell';\nimport styles from './EditTool.module.css';\nimport { editToolCodeForHighlighter, editToolLineCounts, writeToolLineCounts } from './formatEditDiff';\nimport { parseEditWriteToolInput } from './parseEditWriteInput';\n\nimport type { EditPlanToolInput, EditPlanToolOutput, EditToolOutput, WriteToolOutput } from '@reforma/types/sandbox';\nimport type { ToolUIPart } from 'ai';\nimport type { ToolRendererProps } from '../types';\n\nconst diffTransformers = [transformerNotationDiff()];\n\nconst PLAN_DIFF_PATH = 'plan.oui';\n\nfunction planChipLabel(input: unknown, output: unknown): string {\n for (const source of [output, input]) {\n if (source == null || typeof source !== 'object' || !('name' in source)) {\n continue;\n }\n\n const name = (source as EditPlanToolInput | EditPlanToolOutput).name?.trim();\n\n if (name) {\n return name;\n }\n }\n\n return 'Plan';\n}\n\ntype DiffBodyProps = {\n toolType: 'tool-Write' | 'tool-Edit';\n partState: string;\n path: string;\n output: unknown;\n oldString: string;\n newString: string;\n};\n\n/** Shiki body — parent wraps with {@link ToolShellContent} so this mounts only when expanded. */\nconst EditToolDiffHighlighter = memo(({\n toolType,\n partState,\n path,\n output,\n oldString,\n newString,\n}: DiffBodyProps) => {\n const language = useMemo(() => getLanguageFromPath(path), [path]);\n\n const code = useMemo(\n () => editToolCodeForHighlighter(toolType, partState, output, oldString, newString),\n [toolType, partState, output, oldString, newString]\n );\n\n return (\n <CodeHighlighter\n className={ styles.editToolShikiContainer }\n language={ language }\n code={ code }\n dedent\n transformers={ diffTransformers }\n stickToBottom={ isToolInvocationInProgress(partState) }\n />\n );\n});\n\nfunction editToolCanExpandDiff(state: string): boolean {\n return (\n state === 'input-streaming'\n || state === 'input-available'\n || state === 'approval-requested'\n || state === 'output-available'\n );\n}\n\n/** `tool-Write` (full file) and `tool-Edit` (replace / diff): compact shell with optional diff body. */\nexport function EditTool(props: ToolRendererProps) {\n const part = props.part as ToolUIPart & { type: 'tool-Write' | 'tool-Edit' | 'tool-EditPlan' };\n const { onToolApprovalResponse, onOpenPath, onOpenPlan } = useChatHandlers(props);\n const toolName = getToolName(part);\n const isWrite = toolName === 'Write';\n const isPlan = toolName === 'EditPlan';\n const parsedInput = useMemo(() => parseEditWriteToolInput(part.input), [part.input]);\n const path = isPlan ? PLAN_DIFF_PATH : parsedInput.path;\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n // Row stays visible from tool-input-start (`input` may be undefined until path parses).\n const canExpandDiff = Boolean(path)\n && editToolCanExpandDiff(state)\n && (!isPlan || parsedInput.edits.length > 0);\n const isApplied = state === 'output-available';\n\n const counts = useMemo(() => {\n if (!isApplied || !path) {\n return null;\n }\n\n return isWrite\n ? writeToolLineCounts(part.output as WriteToolOutput)\n : editToolLineCounts(part.output as EditToolOutput);\n }, [isApplied, isWrite, path, part.output]);\n\n const approval = part.approval;\n\n const actionLabel = isWrite ? 'Write' : isPlan ? 'Edit plan' : 'Edit';\n const progressLabel = isWrite ? 'Writing' : isPlan ? 'Editing plan' : 'Editing';\n\n const planName = isPlan ? planChipLabel(part.input, part.output) : 'Plan';\n const chipItem = isPlan\n ? { label: planName, icon: 'nav' }\n : chipItemFromPath(parsedInput.path);\n\n return (\n <ToolShell\n collapsible={ canExpandDiff }\n data-slot=\"edit-tool\"\n >\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title={ actionLabel }\n titleInProgress={ progressLabel }\n icon={ isWrite ? <EditSquare aria-hidden /> : <EditPen aria-hidden /> }\n >\n <Show when={ chipItem }>\n { item => (\n <Chip\n aria-label={ isPlan ? planName : 'File path' }\n item={ item }\n onAction={ isPlan\n ? (onOpenPlan ? () => onOpenPlan() : undefined)\n : onOpenPath }\n />\n ) }\n </Show>\n\n {counts\n ? (\n <ToolLineCounts added={ counts.added } removed={ counts.removed } />\n )\n : null}\n </ToolShellHeader>\n\n {canExpandDiff\n ? (\n <ToolShellContent className={ styles.content }>\n <EditToolDiffHighlighter\n toolType={ isWrite ? 'tool-Write' : 'tool-Edit' }\n partState={ state }\n path={ path }\n output={ part.output }\n oldString={ parsedInput.oldString }\n newString={ parsedInput.newString }\n />\n </ToolShellContent>\n )\n : null}\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\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>This tool needs your approval before writing the file</Text>\n <ApprovalButtons />\n </ApprovalRequest>\n </Approval>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["diffTransformers","transformerNotationDiff","PLAN_DIFF_PATH","planChipLabel","input","output","source","name","EditToolDiffHighlighter","toolType","partState","path","oldString","newString","language","useMemo","getLanguageFromPath","code","editToolCodeForHighlighter","CodeHighlighter","styles","isToolInvocationInProgress","editToolCanExpandDiff","state","EditTool","props","part","onToolApprovalResponse","onOpenPath","onOpenPlan","useChatHandlers","toolName","getToolName","isWrite","isPlan","parsedInput","parseEditWriteToolInput","failure","getToolFailureRowState","canExpandDiff","isApplied","counts","writeToolLineCounts","editToolLineCounts","approval","actionLabel","progressLabel","planName","chipItem","chipItemFromPath","ToolShell","_jsxs","ToolShellHeader","_jsx","EditSquare","EditPen","Show","item","Chip","ToolLineCounts","ToolShellContent","ToolShellFooter","Text","Approval","ApprovalRequest","ApprovalButtons"],"mappings":"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"}
1
+ {"version":3,"file":"EditTool.js","sources":["../../../../src/chat/Tool/edit/EditTool.tsx"],"sourcesContent":["import { EditPen, EditSquare } from '@reforma/icons/14';\nimport { getLanguageFromPath } from '@reforma/lib';\nimport { getToolName } from '@reforma/types';\nimport { memo, useMemo } from 'react';\n\nimport { CodeHighlighter } from '../../../CodeHighlighter';\nimport { transformerNotationDiff } from '../../../CodeHighlighter/transformers';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport {\n Approval,\n ApprovalButtons,\n ApprovalRequest,\n} from '../../Approval';\nimport { useChatHandlers } from '../../ChatContext';\nimport { Chip, chipItemFromPath } from '../../Chip';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport {\n ToolLineCounts,\n ToolShell,\n ToolShellContent,\n ToolShellFooter,\n ToolShellHeader,\n} from '../shell';\nimport styles from './EditTool.module.css';\nimport { editToolCodeForHighlighter, editToolLineCounts, writeToolLineCounts } from './formatEditDiff';\nimport { parseEditWriteToolInput } from './parseEditWriteInput';\n\nimport type { EditPlanToolInput, EditPlanToolOutput, EditToolOutput, WriteToolOutput } from '@reforma/types/sandbox';\nimport type { ToolUIPart } from 'ai';\nimport type { ToolRendererProps } from '../types';\n\nconst diffTransformers = [transformerNotationDiff()];\n\nconst PLAN_DIFF_PATH = 'plan.oui';\n\nfunction planChipLabel(input: unknown, output: unknown): string {\n for (const source of [output, input]) {\n if (source == null || typeof source !== 'object' || !('name' in source)) {\n continue;\n }\n\n const name = (source as EditPlanToolInput | EditPlanToolOutput).name?.trim();\n\n if (name) {\n return name;\n }\n }\n\n return 'Plan';\n}\n\ntype DiffBodyProps = {\n toolType: 'tool-Write' | 'tool-Edit';\n partState: string;\n path: string;\n output: unknown;\n oldString: string;\n newString: string;\n};\n\n/** Shiki body — parent wraps with {@link ToolShellContent} so this mounts only when expanded. */\nconst EditToolDiffHighlighter = memo(({\n toolType,\n partState,\n path,\n output,\n oldString,\n newString,\n}: DiffBodyProps) => {\n const language = useMemo(() => getLanguageFromPath(path), [path]);\n\n const code = useMemo(\n () => editToolCodeForHighlighter(toolType, partState, output, oldString, newString),\n [toolType, partState, output, oldString, newString]\n );\n\n return (\n <CodeHighlighter\n className={ styles.editToolShikiContainer }\n language={ language }\n code={ code }\n dedent\n transformers={ diffTransformers }\n stickToBottom={ isToolInvocationInProgress(partState) }\n />\n );\n});\n\nfunction editToolCanExpandDiff(state: string): boolean {\n return (\n state === 'input-streaming'\n || state === 'input-available'\n || state === 'approval-requested'\n || state === 'output-available'\n );\n}\n\n/** `tool-Write` (full file) and `tool-Edit` (replace / diff): compact shell with optional diff body. */\nexport function EditTool(props: ToolRendererProps) {\n const part = props.part as ToolUIPart & { type: 'tool-Write' | 'tool-Edit' | 'tool-EditPlan' };\n const { onToolApprovalResponse, onOpenPath, onOpenPlan } = useChatHandlers(props);\n const toolName = getToolName(part);\n const isWrite = toolName === 'Write';\n const isPlan = toolName === 'EditPlan';\n const parsedInput = useMemo(() => parseEditWriteToolInput(part.input), [part.input]);\n const path = isPlan ? PLAN_DIFF_PATH : parsedInput.path;\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n // Row stays visible from tool-input-start (`input` may be undefined until path parses).\n const canExpandDiff = Boolean(path)\n && editToolCanExpandDiff(state)\n && (!isPlan || parsedInput.edits.length > 0);\n const isApplied = state === 'output-available';\n\n const counts = useMemo(() => {\n if (!isApplied || !path) {\n return null;\n }\n\n return isWrite\n ? writeToolLineCounts(part.output as WriteToolOutput)\n : editToolLineCounts(part.output as EditToolOutput);\n }, [isApplied, isWrite, path, part.output]);\n\n const approval = part.approval;\n\n const actionLabel = isWrite ? 'Write' : isPlan ? 'Edit plan' : 'Edit';\n const progressLabel = isWrite ? 'Writing' : isPlan ? 'Editing plan' : 'Editing';\n\n const planName = isPlan ? planChipLabel(part.input, part.output) : 'Plan';\n const chipItem = isPlan\n ? { label: planName, icon: 'nav' }\n : chipItemFromPath(parsedInput.path);\n\n return (\n <ToolShell\n collapsible={ canExpandDiff }\n data-slot=\"edit-tool\"\n >\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title={ actionLabel }\n titleInProgress={ progressLabel }\n icon={ isWrite ? <EditSquare aria-hidden /> : <EditPen aria-hidden /> }\n >\n <Show when={ chipItem }>\n { item => (\n <Chip\n aria-label={ isPlan ? planName : 'File path' }\n item={ item }\n onAction={ isPlan\n ? (onOpenPlan ? () => onOpenPlan() : undefined)\n : onOpenPath }\n />\n ) }\n </Show>\n\n {counts\n ? (\n <ToolLineCounts added={ counts.added } removed={ counts.removed } />\n )\n : null}\n </ToolShellHeader>\n\n {canExpandDiff\n ? (\n <ToolShellContent className={ styles.content }>\n <EditToolDiffHighlighter\n toolType={ isWrite ? 'tool-Write' : 'tool-Edit' }\n partState={ state }\n path={ path }\n output={ part.output }\n oldString={ parsedInput.oldString }\n newString={ parsedInput.newString }\n />\n </ToolShellContent>\n )\n : null}\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\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>This tool needs your approval before writing the file</Text>\n <ApprovalButtons />\n </ApprovalRequest>\n </Approval>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["diffTransformers","transformerNotationDiff","PLAN_DIFF_PATH","planChipLabel","input","output","source","name","EditToolDiffHighlighter","toolType","partState","path","oldString","newString","language","useMemo","getLanguageFromPath","code","editToolCodeForHighlighter","CodeHighlighter","styles","isToolInvocationInProgress","editToolCanExpandDiff","state","EditTool","props","part","onToolApprovalResponse","onOpenPath","onOpenPlan","useChatHandlers","toolName","getToolName","isWrite","isPlan","parsedInput","parseEditWriteToolInput","failure","getToolFailureRowState","canExpandDiff","isApplied","counts","writeToolLineCounts","editToolLineCounts","approval","actionLabel","progressLabel","planName","chipItem","chipItemFromPath","ToolShell","_jsxs","ToolShellHeader","_jsx","EditSquare","EditPen","Show","item","Chip","ToolLineCounts","ToolShellContent","ToolShellFooter","Text","Approval","ApprovalRequest","ApprovalButtons"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Globe as g } from "@reforma/icons/14";
2
2
  import { isHttpUrl as T } from "@reforma/lib";
3
- import { isToolUIPart as b, getToolName as x } from "ai";
3
+ import { isToolUIPart as b, getToolName as x } from "@reforma/types";
4
4
  import { Show as s } from "../../../Show/Show.js";
5
5
  import { TagGroup as F } from "../../../Tag/TagGroup.js";
6
6
  import { Text as S } from "../../../Text/Text.js";
@@ -1 +1 @@
1
- {"version":3,"file":"FetchTool.js","sources":["../../../../src/chat/Tool/fetch/FetchTool.tsx"],"sourcesContent":["import { Globe } from '@reforma/icons/14';\nimport { isHttpUrl } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Show } from '../../../Show';\nimport { TagGroup } from '../../../Tag';\nimport { Text } from '../../../Text';\nimport { MessageText } from '../../Message/streamdown/MessageText';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n ToolShell,\n ToolShellContent,\n ToolShellFooter,\n ToolShellHeader,\n} from '../shell';\nimport badgeStyles from '../shell/ToolSummaryBadge.module.css';\nimport {\n fetchContentFromOutput,\n fetchDisplayUrl,\n fetchErrorFromOutput,\n fetchHttpStatusTitle,\n fetchUrlBadgeLabel,\n} from './parseFetchTool';\n\nimport type { ToolRendererProps } from '../types';\n\n/** Fetch: URL badge (link when http(s)) + expandable page body. */\nexport function FetchTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'Fetch') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const done = part.state === 'output-available';\n const logicalError = done ? fetchErrorFromOutput(part.output) : undefined;\n const httpTitle = fetchHttpStatusTitle(logicalError);\n const failed = failure.useFailureLabel || (Boolean(logicalError) && !httpTitle);\n const content = (!failed && !httpTitle && done) ? fetchContentFromOutput(part.output) : undefined;\n const canExpand = Boolean(content);\n const url = fetchDisplayUrl(part.input, part.output, done);\n const linkable = isHttpUrl(url);\n const title = failed ? 'Fetch failed' : httpTitle ?? 'Fetched page';\n\n const urlBadge = url\n ? (\n <TagGroup\n color=\"secondary\"\n size=\"xs\"\n aria-label=\"URL\"\n className={ badgeStyles.badge }\n items={ [{\n id: url,\n label: fetchUrlBadgeLabel(url),\n textValue: url,\n tooltip: url,\n className: badgeStyles.tag,\n ...(linkable\n ? { href: url, target: '_blank', rel: 'noreferrer' }\n : {}),\n }] }\n />\n )\n : null;\n\n return (\n <ToolShell\n collapsible={ canExpand }\n data-slot=\"fetch-tool\"\n >\n <ToolShellHeader\n state={ part.state }\n statusDetail={ httpTitle ? undefined : (failure.tooltip ?? logicalError) }\n title={ title }\n titleInProgress=\"Fetching page\"\n icon={ <Globe aria-hidden /> }\n >\n {urlBadge}\n </ToolShellHeader>\n\n <Show when={ content }>\n { body => (\n <ToolShellContent>\n <MessageText mode=\"static\">{body}</MessageText>\n </ToolShellContent>\n ) }\n </Show>\n\n <Show when={ !httpTitle && (logicalError ?? failure.problemText) }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{logicalError ?? failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["FetchTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","done","logicalError","fetchErrorFromOutput","httpTitle","fetchHttpStatusTitle","failed","content","fetchContentFromOutput","canExpand","url","fetchDisplayUrl","linkable","isHttpUrl","title","urlBadge","_jsx","TagGroup","badgeStyles","fetchUrlBadgeLabel","ToolShell","ToolShellHeader","Globe","Show","body","ToolShellContent","MessageText","ToolShellFooter","Text"],"mappings":";;;;;;;;;;;;AAaO,SAASA,EAAU;AAAA,EACxB,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAUC,EAAuBJ,CAAI,GACrCK,IAAOL,EAAK,UAAU,oBACtBM,IAAeD,IAAOE,EAAqBP,EAAK,MAAM,IAAI,QAC1DQ,IAAYC,EAAqBH,CAAY,GAC7CI,IAASP,EAAQ,mBAAmB,EAAQG,KAAiB,CAACE,GAC9DG,IAAU,CAACD,KAAU,CAACF,KAAaH,IAAOO,EAAuBZ,EAAK,MAAM,IAAI,QAChFa,IAAY,EAAQF,GACpBG,IAAMC,EAAgBf,EAAK,OAAOA,EAAK,QAAQK,CAAI,GACnDW,IAAWC,EAAUH,CAAG,GACxBI,IAAQR,IAAS,iBAAiBF,KAAa,gBAC/CW,IAAWL,IAAmBM,gBAAAA,EAAKC,GAAU;AAAA,IACjD,OAAO;AAAA,IACP,MAAM;AAAA,IACN,cAAc;AAAA,IACd,WAAWC,EAAY;AAAA,IACvB,OAAO,CAAC;AAAA,MACN,IAAIR;AAAA,MACJ,OAAOS,EAAmBT,CAAG;AAAA,MAC7B,WAAWA;AAAA,MACX,SAASA;AAAA,MACT,WAAWQ,EAAY;AAAA,MACvB,GAAIN,IAAW;AAAA,QACb,MAAMF;AAAA,QACN,QAAQ;AAAA,QACR,KAAK;AAAA,MAAA,IACH,CAAA;AAAA,IAAC,CACN;AAAA,EAAA,CACF,IAAI;AACL,2BAA0BU,GAAW;AAAA,IACnC,aAAaX;AAAA,IACb,aAAa;AAAA,IACb,UAAU,CAAcO,gBAAAA,EAAKK,GAAiB;AAAA,MAC5C,OAAOzB,EAAK;AAAA,MACZ,cAAcQ,IAAY,SAAYL,EAAQ,WAAWG;AAAA,MACzD,OAAAY;AAAA,MACA,iBAAiB;AAAA,MACjB,wBAAwBQ,GAAO;AAAA,QAC7B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,UAAUP;AAAA,IAAA,CACX,GAAgBC,gBAAAA,EAAKO,GAAM;AAAA,MAC1B,MAAMhB;AAAA,MACN,UAAU,CAAAiB,MAAqBR,gBAAAA,EAAKS,GAAkB;AAAA,QACpD,4BAA4BC,GAAa;AAAA,UACvC,MAAM;AAAA,UACN,UAAUF;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBR,gBAAAA,EAAKO,GAAM;AAAA,MAC1B,MAAM,CAACnB,MAAcF,KAAgBH,EAAQ;AAAA,MAC7C,4BAA4B4B,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAU1B,KAAgBH,EAAQ;AAAA,QAAA,CACnC;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
1
+ {"version":3,"file":"FetchTool.js","sources":["../../../../src/chat/Tool/fetch/FetchTool.tsx"],"sourcesContent":["import { Globe } from '@reforma/icons/14';\nimport { isHttpUrl } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Show } from '../../../Show';\nimport { TagGroup } from '../../../Tag';\nimport { Text } from '../../../Text';\nimport { MessageText } from '../../Message/streamdown/MessageText';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n ToolShell,\n ToolShellContent,\n ToolShellFooter,\n ToolShellHeader,\n} from '../shell';\nimport badgeStyles from '../shell/ToolSummaryBadge.module.css';\nimport {\n fetchContentFromOutput,\n fetchDisplayUrl,\n fetchErrorFromOutput,\n fetchHttpStatusTitle,\n fetchUrlBadgeLabel,\n} from './parseFetchTool';\n\nimport type { ToolRendererProps } from '../types';\n\n/** Fetch: URL badge (link when http(s)) + expandable page body. */\nexport function FetchTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'Fetch') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const done = part.state === 'output-available';\n const logicalError = done ? fetchErrorFromOutput(part.output) : undefined;\n const httpTitle = fetchHttpStatusTitle(logicalError);\n const failed = failure.useFailureLabel || (Boolean(logicalError) && !httpTitle);\n const content = (!failed && !httpTitle && done) ? fetchContentFromOutput(part.output) : undefined;\n const canExpand = Boolean(content);\n const url = fetchDisplayUrl(part.input, part.output, done);\n const linkable = isHttpUrl(url);\n const title = failed ? 'Fetch failed' : httpTitle ?? 'Fetched page';\n\n const urlBadge = url\n ? (\n <TagGroup\n color=\"secondary\"\n size=\"xs\"\n aria-label=\"URL\"\n className={ badgeStyles.badge }\n items={ [{\n id: url,\n label: fetchUrlBadgeLabel(url),\n textValue: url,\n tooltip: url,\n className: badgeStyles.tag,\n ...(linkable\n ? { href: url, target: '_blank', rel: 'noreferrer' }\n : {}),\n }] }\n />\n )\n : null;\n\n return (\n <ToolShell\n collapsible={ canExpand }\n data-slot=\"fetch-tool\"\n >\n <ToolShellHeader\n state={ part.state }\n statusDetail={ httpTitle ? undefined : (failure.tooltip ?? logicalError) }\n title={ title }\n titleInProgress=\"Fetching page\"\n icon={ <Globe aria-hidden /> }\n >\n {urlBadge}\n </ToolShellHeader>\n\n <Show when={ content }>\n { body => (\n <ToolShellContent>\n <MessageText mode=\"static\">{body}</MessageText>\n </ToolShellContent>\n ) }\n </Show>\n\n <Show when={ !httpTitle && (logicalError ?? failure.problemText) }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{logicalError ?? failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["FetchTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","done","logicalError","fetchErrorFromOutput","httpTitle","fetchHttpStatusTitle","failed","content","fetchContentFromOutput","canExpand","url","fetchDisplayUrl","linkable","isHttpUrl","title","urlBadge","_jsx","TagGroup","badgeStyles","fetchUrlBadgeLabel","ToolShell","ToolShellHeader","Globe","Show","body","ToolShellContent","MessageText","ToolShellFooter","Text"],"mappings":";;;;;;;;;;;;AAaO,SAASA,EAAU;AAAA,EACxB,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAUC,EAAuBJ,CAAI,GACrCK,IAAOL,EAAK,UAAU,oBACtBM,IAAeD,IAAOE,EAAqBP,EAAK,MAAM,IAAI,QAC1DQ,IAAYC,EAAqBH,CAAY,GAC7CI,IAASP,EAAQ,mBAAmB,EAAQG,KAAiB,CAACE,GAC9DG,IAAU,CAACD,KAAU,CAACF,KAAaH,IAAOO,EAAuBZ,EAAK,MAAM,IAAI,QAChFa,IAAY,EAAQF,GACpBG,IAAMC,EAAgBf,EAAK,OAAOA,EAAK,QAAQK,CAAI,GACnDW,IAAWC,EAAUH,CAAG,GACxBI,IAAQR,IAAS,iBAAiBF,KAAa,gBAC/CW,IAAWL,IAAmBM,gBAAAA,EAAKC,GAAU;AAAA,IACjD,OAAO;AAAA,IACP,MAAM;AAAA,IACN,cAAc;AAAA,IACd,WAAWC,EAAY;AAAA,IACvB,OAAO,CAAC;AAAA,MACN,IAAIR;AAAA,MACJ,OAAOS,EAAmBT,CAAG;AAAA,MAC7B,WAAWA;AAAA,MACX,SAASA;AAAA,MACT,WAAWQ,EAAY;AAAA,MACvB,GAAIN,IAAW;AAAA,QACb,MAAMF;AAAA,QACN,QAAQ;AAAA,QACR,KAAK;AAAA,MAAA,IACH,CAAA;AAAA,IAAC,CACN;AAAA,EAAA,CACF,IAAI;AACL,2BAA0BU,GAAW;AAAA,IACnC,aAAaX;AAAA,IACb,aAAa;AAAA,IACb,UAAU,CAAcO,gBAAAA,EAAKK,GAAiB;AAAA,MAC5C,OAAOzB,EAAK;AAAA,MACZ,cAAcQ,IAAY,SAAYL,EAAQ,WAAWG;AAAA,MACzD,OAAAY;AAAA,MACA,iBAAiB;AAAA,MACjB,wBAAwBQ,GAAO;AAAA,QAC7B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,UAAUP;AAAA,IAAA,CACX,GAAgBC,gBAAAA,EAAKO,GAAM;AAAA,MAC1B,MAAMhB;AAAA,MACN,UAAU,CAAAiB,MAAqBR,gBAAAA,EAAKS,GAAkB;AAAA,QACpD,4BAA4BC,GAAa;AAAA,UACvC,MAAM;AAAA,UACN,UAAUF;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBR,gBAAAA,EAAKO,GAAM;AAAA,MAC1B,MAAM,CAACnB,MAAcF,KAAgBH,EAAQ;AAAA,MAC7C,4BAA4B4B,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAU1B,KAAgBH,EAAQ;AAAA,QAAA,CACnC;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
@@ -1,4 +1,4 @@
1
- import { isToolUIPart as l, getToolName as h } from "ai";
1
+ import { isToolUIPart as l, getToolName as h } from "@reforma/types";
2
2
  import { toolPathKey as a, lineCountsFromEditingToolPart as f, lineCountsByPathFromEditingToolPart as m } from "./helpers.js";
3
3
  function s(u, n) {
4
4
  if (u == null || typeof u != "object")
@@ -1 +1 @@
1
- {"version":3,"file":"fileChangesFromToolParts.js","sources":["../../../src/chat/Tool/fileChangesFromToolParts.ts"],"sourcesContent":["import { getToolName, isToolUIPart } from 'ai';\n\nimport {\n lineCountsByPathFromEditingToolPart,\n lineCountsFromEditingToolPart,\n toolPathKey,\n type EditingToolPart,\n} from './helpers';\n\nimport type { ReformaGitCommitFileChange, ReformaUIMessagePart } from '@reforma/types/sandbox';\n\nfunction readPath(obj: unknown, key: string): string {\n if (obj == null || typeof obj !== 'object') {\n return '';\n }\n\n const v = (obj as Record<string, unknown>)[key];\n\n return typeof v === 'string' ? v : '';\n}\n\n/** Completed file-tool parts → atomic git-style events (no dedup). */\nexport function fileChangesFromToolParts(parts: readonly ReformaUIMessagePart[]): ReformaGitCommitFileChange[] {\n const changes: ReformaGitCommitFileChange[] = [];\n\n for (const part of parts) {\n if (!isToolUIPart(part) || part.state !== 'output-available') {\n continue;\n }\n\n const toolPart = part as EditingToolPart;\n const toolName = getToolName(toolPart);\n\n if (toolName === 'Edit') {\n const path = toolPathKey(readPath(part.output, 'path') || readPath(part.input, 'path'));\n\n if (!path) {\n continue;\n }\n\n const lines = lineCountsFromEditingToolPart(toolPart);\n\n changes.push({ path, status: 'M', additions: lines.added, deletions: lines.removed });\n\n continue;\n }\n\n if (toolName === 'Write') {\n const path = toolPathKey(readPath(part.input, 'path'));\n\n if (!path) {\n continue;\n }\n\n const lines = lineCountsFromEditingToolPart(toolPart);\n const created = (part.output as { created?: boolean } | undefined)?.created === true;\n\n changes.push({\n path,\n status: created ? 'A' : 'M',\n additions: lines.added,\n deletions: lines.removed,\n });\n\n continue;\n }\n\n if (toolName === 'MoveFile') {\n if ((part.output as { moved?: boolean } | undefined)?.moved === false) {\n continue;\n }\n\n const from = toolPathKey(readPath(part.input, 'from_path'));\n const to = toolPathKey(readPath(part.input, 'to_path'));\n\n if (!from || !to) {\n continue;\n }\n\n changes.push({ path: to, previousPath: from, status: 'R100' });\n\n continue;\n }\n\n if (toolName === 'RemoveFile') {\n const results = (part.output as { results?: unknown } | undefined)?.results;\n\n if (!Array.isArray(results)) {\n continue;\n }\n\n const linesByPath = lineCountsByPathFromEditingToolPart(toolPart);\n\n for (const item of results) {\n if (item == null || typeof item !== 'object' || (item as { removed?: boolean }).removed !== true) {\n continue;\n }\n\n const path = toolPathKey(readPath(item, 'path'));\n\n if (!path) {\n continue;\n }\n\n const removeLines = linesByPath.get(path) ?? { added: 0, removed: 0 };\n\n changes.push({\n path,\n status: 'D',\n additions: removeLines.added,\n deletions: removeLines.removed,\n });\n }\n }\n }\n\n return changes;\n}\n"],"names":["readPath","obj","key","v","fileChangesFromToolParts","parts","changes","part","isToolUIPart","toolPart","toolName","getToolName","path","toolPathKey","lines","lineCountsFromEditingToolPart","created","from","to","results","linesByPath","lineCountsByPathFromEditingToolPart","item","removeLines"],"mappings":";;AAEA,SAASA,EAASC,GAAKC,GAAK;AAC1B,MAAID,KAAO,QAAQ,OAAOA,KAAQ;AAChC,WAAO;AAET,QAAME,IAAIF,EAAIC,CAAG;AACjB,SAAO,OAAOC,KAAM,WAAWA,IAAI;AACrC;AAGO,SAASC,EAAyBC,GAAO;AAC9C,QAAMC,IAAU,CAAA;AAChB,aAAWC,KAAQF,GAAO;AACxB,QAAI,CAACG,EAAaD,CAAI,KAAKA,EAAK,UAAU;AACxC;AAEF,UAAME,IAAWF,GACXG,IAAWC,EAAYF,CAAQ;AACrC,QAAIC,MAAa,QAAQ;AACvB,YAAME,IAAOC,EAAYb,EAASO,EAAK,QAAQ,MAAM,KAAKP,EAASO,EAAK,OAAO,MAAM,CAAC;AACtF,UAAI,CAACK;AACH;AAEF,YAAME,IAAQC,EAA8BN,CAAQ;AACpD,MAAAH,EAAQ,KAAK;AAAA,QACX,MAAAM;AAAA,QACA,QAAQ;AAAA,QACR,WAAWE,EAAM;AAAA,QACjB,WAAWA,EAAM;AAAA,MAAA,CAClB;AACD;AAAA,IACF;AACA,QAAIJ,MAAa,SAAS;AACxB,YAAME,IAAOC,EAAYb,EAASO,EAAK,OAAO,MAAM,CAAC;AACrD,UAAI,CAACK;AACH;AAEF,YAAME,IAAQC,EAA8BN,CAAQ,GAC9CO,IAAUT,EAAK,QAAQ,YAAY;AACzC,MAAAD,EAAQ,KAAK;AAAA,QACX,MAAAM;AAAA,QACA,QAAQI,IAAU,MAAM;AAAA,QACxB,WAAWF,EAAM;AAAA,QACjB,WAAWA,EAAM;AAAA,MAAA,CAClB;AACD;AAAA,IACF;AACA,QAAIJ,MAAa,YAAY;AAC3B,UAAIH,EAAK,QAAQ,UAAU;AACzB;AAEF,YAAMU,IAAOJ,EAAYb,EAASO,EAAK,OAAO,WAAW,CAAC,GACpDW,IAAKL,EAAYb,EAASO,EAAK,OAAO,SAAS,CAAC;AACtD,UAAI,CAACU,KAAQ,CAACC;AACZ;AAEF,MAAAZ,EAAQ,KAAK;AAAA,QACX,MAAMY;AAAA,QACN,cAAcD;AAAA,QACd,QAAQ;AAAA,MAAA,CACT;AACD;AAAA,IACF;AACA,QAAIP,MAAa,cAAc;AAC7B,YAAMS,IAAUZ,EAAK,QAAQ;AAC7B,UAAI,CAAC,MAAM,QAAQY,CAAO;AACxB;AAEF,YAAMC,IAAcC,EAAoCZ,CAAQ;AAChE,iBAAWa,KAAQH,GAAS;AAC1B,YAAIG,KAAQ,QAAQ,OAAOA,KAAS,YAAYA,EAAK,YAAY;AAC/D;AAEF,cAAMV,IAAOC,EAAYb,EAASsB,GAAM,MAAM,CAAC;AAC/C,YAAI,CAACV;AACH;AAEF,cAAMW,IAAcH,EAAY,IAAIR,CAAI,KAAK;AAAA,UAC3C,OAAO;AAAA,UACP,SAAS;AAAA,QAAA;AAEX,QAAAN,EAAQ,KAAK;AAAA,UACX,MAAAM;AAAA,UACA,QAAQ;AAAA,UACR,WAAWW,EAAY;AAAA,UACvB,WAAWA,EAAY;AAAA,QAAA,CACxB;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,SAAOjB;AACT;"}
1
+ {"version":3,"file":"fileChangesFromToolParts.js","sources":["../../../src/chat/Tool/fileChangesFromToolParts.ts"],"sourcesContent":["import { getToolName, isToolUIPart } from '@reforma/types';\n\nimport {\n lineCountsByPathFromEditingToolPart,\n lineCountsFromEditingToolPart,\n toolPathKey,\n type EditingToolPart,\n} from './helpers';\n\nimport type { ReformaGitCommitFileChange, ReformaUIMessagePart } from '@reforma/types/sandbox';\n\nfunction readPath(obj: unknown, key: string): string {\n if (obj == null || typeof obj !== 'object') {\n return '';\n }\n\n const v = (obj as Record<string, unknown>)[key];\n\n return typeof v === 'string' ? v : '';\n}\n\n/** Completed file-tool parts → atomic git-style events (no dedup). */\nexport function fileChangesFromToolParts(parts: readonly ReformaUIMessagePart[]): ReformaGitCommitFileChange[] {\n const changes: ReformaGitCommitFileChange[] = [];\n\n for (const part of parts) {\n if (!isToolUIPart(part) || part.state !== 'output-available') {\n continue;\n }\n\n const toolPart = part as EditingToolPart;\n const toolName = getToolName(toolPart);\n\n if (toolName === 'Edit') {\n const path = toolPathKey(readPath(part.output, 'path') || readPath(part.input, 'path'));\n\n if (!path) {\n continue;\n }\n\n const lines = lineCountsFromEditingToolPart(toolPart);\n\n changes.push({ path, status: 'M', additions: lines.added, deletions: lines.removed });\n\n continue;\n }\n\n if (toolName === 'Write') {\n const path = toolPathKey(readPath(part.input, 'path'));\n\n if (!path) {\n continue;\n }\n\n const lines = lineCountsFromEditingToolPart(toolPart);\n const created = (part.output as { created?: boolean } | undefined)?.created === true;\n\n changes.push({\n path,\n status: created ? 'A' : 'M',\n additions: lines.added,\n deletions: lines.removed,\n });\n\n continue;\n }\n\n if (toolName === 'MoveFile') {\n if ((part.output as { moved?: boolean } | undefined)?.moved === false) {\n continue;\n }\n\n const from = toolPathKey(readPath(part.input, 'from_path'));\n const to = toolPathKey(readPath(part.input, 'to_path'));\n\n if (!from || !to) {\n continue;\n }\n\n changes.push({ path: to, previousPath: from, status: 'R100' });\n\n continue;\n }\n\n if (toolName === 'RemoveFile') {\n const results = (part.output as { results?: unknown } | undefined)?.results;\n\n if (!Array.isArray(results)) {\n continue;\n }\n\n const linesByPath = lineCountsByPathFromEditingToolPart(toolPart);\n\n for (const item of results) {\n if (item == null || typeof item !== 'object' || (item as { removed?: boolean }).removed !== true) {\n continue;\n }\n\n const path = toolPathKey(readPath(item, 'path'));\n\n if (!path) {\n continue;\n }\n\n const removeLines = linesByPath.get(path) ?? { added: 0, removed: 0 };\n\n changes.push({\n path,\n status: 'D',\n additions: removeLines.added,\n deletions: removeLines.removed,\n });\n }\n }\n }\n\n return changes;\n}\n"],"names":["readPath","obj","key","v","fileChangesFromToolParts","parts","changes","part","isToolUIPart","toolPart","toolName","getToolName","path","toolPathKey","lines","lineCountsFromEditingToolPart","created","from","to","results","linesByPath","lineCountsByPathFromEditingToolPart","item","removeLines"],"mappings":";;AAEA,SAASA,EAASC,GAAKC,GAAK;AAC1B,MAAID,KAAO,QAAQ,OAAOA,KAAQ;AAChC,WAAO;AAET,QAAME,IAAIF,EAAIC,CAAG;AACjB,SAAO,OAAOC,KAAM,WAAWA,IAAI;AACrC;AAGO,SAASC,EAAyBC,GAAO;AAC9C,QAAMC,IAAU,CAAA;AAChB,aAAWC,KAAQF,GAAO;AACxB,QAAI,CAACG,EAAaD,CAAI,KAAKA,EAAK,UAAU;AACxC;AAEF,UAAME,IAAWF,GACXG,IAAWC,EAAYF,CAAQ;AACrC,QAAIC,MAAa,QAAQ;AACvB,YAAME,IAAOC,EAAYb,EAASO,EAAK,QAAQ,MAAM,KAAKP,EAASO,EAAK,OAAO,MAAM,CAAC;AACtF,UAAI,CAACK;AACH;AAEF,YAAME,IAAQC,EAA8BN,CAAQ;AACpD,MAAAH,EAAQ,KAAK;AAAA,QACX,MAAAM;AAAA,QACA,QAAQ;AAAA,QACR,WAAWE,EAAM;AAAA,QACjB,WAAWA,EAAM;AAAA,MAAA,CAClB;AACD;AAAA,IACF;AACA,QAAIJ,MAAa,SAAS;AACxB,YAAME,IAAOC,EAAYb,EAASO,EAAK,OAAO,MAAM,CAAC;AACrD,UAAI,CAACK;AACH;AAEF,YAAME,IAAQC,EAA8BN,CAAQ,GAC9CO,IAAUT,EAAK,QAAQ,YAAY;AACzC,MAAAD,EAAQ,KAAK;AAAA,QACX,MAAAM;AAAA,QACA,QAAQI,IAAU,MAAM;AAAA,QACxB,WAAWF,EAAM;AAAA,QACjB,WAAWA,EAAM;AAAA,MAAA,CAClB;AACD;AAAA,IACF;AACA,QAAIJ,MAAa,YAAY;AAC3B,UAAIH,EAAK,QAAQ,UAAU;AACzB;AAEF,YAAMU,IAAOJ,EAAYb,EAASO,EAAK,OAAO,WAAW,CAAC,GACpDW,IAAKL,EAAYb,EAASO,EAAK,OAAO,SAAS,CAAC;AACtD,UAAI,CAACU,KAAQ,CAACC;AACZ;AAEF,MAAAZ,EAAQ,KAAK;AAAA,QACX,MAAMY;AAAA,QACN,cAAcD;AAAA,QACd,QAAQ;AAAA,MAAA,CACT;AACD;AAAA,IACF;AACA,QAAIP,MAAa,cAAc;AAC7B,YAAMS,IAAUZ,EAAK,QAAQ;AAC7B,UAAI,CAAC,MAAM,QAAQY,CAAO;AACxB;AAEF,YAAMC,IAAcC,EAAoCZ,CAAQ;AAChE,iBAAWa,KAAQH,GAAS;AAC1B,YAAIG,KAAQ,QAAQ,OAAOA,KAAS,YAAYA,EAAK,YAAY;AAC/D;AAEF,cAAMV,IAAOC,EAAYb,EAASsB,GAAM,MAAM,CAAC;AAC/C,YAAI,CAACV;AACH;AAEF,cAAMW,IAAcH,EAAY,IAAIR,CAAI,KAAK;AAAA,UAC3C,OAAO;AAAA,UACP,SAAS;AAAA,QAAA;AAEX,QAAAN,EAAQ,KAAK;AAAA,UACX,MAAAM;AAAA,UACA,QAAQ;AAAA,UACR,WAAWW,EAAY;AAAA,UACvB,WAAWA,EAAY;AAAA,QAAA,CACxB;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,SAAOjB;AACT;"}
@@ -1,4 +1,4 @@
1
- import { isToolUIPart as n, getToolName as u } from "ai";
1
+ import { isToolUIPart as n, getToolName as u } from "@reforma/types";
2
2
  import { Text as s } from "../../../Text/Text.js";
3
3
  import { jsx as i } from "react/jsx-runtime";
4
4
  function d({
@@ -1 +1 @@
1
- {"version":3,"file":"GetBackgroundResultTool.js","sources":["../../../../src/chat/Tool/get-background-result/GetBackgroundResultTool.tsx"],"sourcesContent":["import { getToolName, isToolUIPart } from 'ai';\n\nimport { Text } from '../../../Text';\n\nimport type { ToolRendererProps } from '../types';\n\n/** Status note when a background bash job reports back — prose, not a tool shell. */\nexport function GetBackgroundResultTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'GetBackgroundResult') {\n return null;\n }\n\n const count = Array.isArray(part.output) ? part.output.length : 0;\n const done = part.state === 'output-available' || part.state === 'output-error';\n const title = count > 1\n ? `${ count } background tasks finished`\n : done\n ? 'Background task finished'\n : 'Background task';\n\n return (\n <Text color=\"secondary\">{ title }</Text>\n );\n}\n"],"names":["GetBackgroundResultTool","part","isToolUIPart","getToolName","count","done","title","Text"],"mappings":";;;AAIO,SAASA,EAAwB;AAAA,EACtC,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAQ,MAAM,QAAQH,EAAK,MAAM,IAAIA,EAAK,OAAO,SAAS,GAC1DI,IAAOJ,EAAK,UAAU,sBAAsBA,EAAK,UAAU,gBAC3DK,IAAQF,IAAQ,IAAI,GAAGA,CAAK,+BAA+BC,IAAO,6BAA6B;AACrG,2BAAyBE,GAAM;AAAA,IAC7B,OAAO;AAAA,IACP,UAAUD;AAAA,EAAA,CACX;AACH;"}
1
+ {"version":3,"file":"GetBackgroundResultTool.js","sources":["../../../../src/chat/Tool/get-background-result/GetBackgroundResultTool.tsx"],"sourcesContent":["import { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Text } from '../../../Text';\n\nimport type { ToolRendererProps } from '../types';\n\n/** Status note when a background bash job reports back — prose, not a tool shell. */\nexport function GetBackgroundResultTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'GetBackgroundResult') {\n return null;\n }\n\n const count = Array.isArray(part.output) ? part.output.length : 0;\n const done = part.state === 'output-available' || part.state === 'output-error';\n const title = count > 1\n ? `${ count } background tasks finished`\n : done\n ? 'Background task finished'\n : 'Background task';\n\n return (\n <Text color=\"secondary\">{ title }</Text>\n );\n}\n"],"names":["GetBackgroundResultTool","part","isToolUIPart","getToolName","count","done","title","Text"],"mappings":";;;AAIO,SAASA,EAAwB;AAAA,EACtC,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAQ,MAAM,QAAQH,EAAK,MAAM,IAAIA,EAAK,OAAO,SAAS,GAC1DI,IAAOJ,EAAK,UAAU,sBAAsBA,EAAK,UAAU,gBAC3DK,IAAQF,IAAQ,IAAI,GAAGA,CAAK,+BAA+BC,IAAO,6BAA6B;AACrG,2BAAyBE,GAAM;AAAA,IAC7B,OAAO;AAAA,IACP,UAAUD;AAAA,EAAA,CACX;AACH;"}
@@ -1,5 +1,5 @@
1
1
  import { Done as m, AttentionTriangle as E } from "@reforma/icons/14";
2
- import { isToolUIPart as d, getToolName as g } from "ai";
2
+ import { isToolUIPart as d, getToolName as g } from "@reforma/types";
3
3
  import { getToolFailureRowState as h, isToolInvocationInProgress as T } from "../helpers.js";
4
4
  import { ToolShell as y, ToolShellHeader as A } from "../shell/ToolShell.js";
5
5
  import { jsx as e } from "react/jsx-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"GetErrorsTool.js","sources":["../../../../src/chat/Tool/get-errors/GetErrorsTool.tsx"],"sourcesContent":["import { AttentionTriangle, Done } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport { ToolShell, ToolShellHeader } from '../shell';\n\nimport type { ToolRendererProps } from '../types';\n\nexport const GET_ERRORS_TOOL_NAME = 'devtools__get_errors';\n\nexport function isGetErrorsToolName(name: string): boolean {\n return name === GET_ERRORS_TOOL_NAME;\n}\n\ntype GetErrorsConfigError = {\n name: string;\n message: string;\n stack: string | null;\n};\n\ntype GetErrorsRuntimeError = {\n type: string;\n errorName: string;\n message: string;\n};\n\ntype GetErrorsSessionError = {\n url: string;\n buildError: string | null;\n runtimeErrors: GetErrorsRuntimeError[];\n};\n\ntype GetErrorsPayload = {\n configErrors?: GetErrorsConfigError[];\n sessionErrors?: GetErrorsSessionError[];\n};\n\ntype McpTextContent = { type: 'text'; text: string };\n\n/** Next.js `get_errors` MCP tool result (`content[].text` is markdown or JSON `GetErrorsPayload`). */\ntype GetErrorsToolOutput = {\n content: McpTextContent[];\n isError: boolean;\n};\n\ntype GetErrorsOutput = GetErrorsToolOutput | GetErrorsPayload | string;\n\nconst SESSION_ERROR_COUNT_PATTERN = /\\*\\*(\\d+) error\\(s\\) found\\*\\*/gi;\n\nfunction isGetErrorsPayload(value: object): value is GetErrorsPayload {\n return 'configErrors' in value || 'sessionErrors' in value;\n}\n\nfunction isGetErrorsMarkdown(text: string): boolean {\n return /^#\\s+(Found errors in|No errors)/m.test(text)\n || /^##\\s+Configuration Errors/m.test(text);\n}\n\nfunction parsePayloadText(text: string): GetErrorsPayload | null {\n try {\n const parsed: object = JSON.parse(text);\n\n return isGetErrorsPayload(parsed) ? parsed : null;\n }\n catch {\n return null;\n }\n}\n\nfunction countErrorsFromMarkdown(text: string): number | null {\n if (!isGetErrorsMarkdown(text)) {\n return null;\n }\n\n let count = 0;\n\n for (const match of text.matchAll(SESSION_ERROR_COUNT_PATTERN)) {\n count += Number.parseInt(match[1] ?? '0', 10);\n }\n\n if (count > 0) {\n return count;\n }\n\n const errorHeaders = text.match(/^#### Error \\d+/gm);\n\n if (errorHeaders && errorHeaders.length > 0) {\n return errorHeaders.length;\n }\n\n return 0;\n}\n\nfunction countErrorsFromPayload(payload: GetErrorsPayload): number {\n let count = 0;\n\n if (Array.isArray(payload.configErrors)) {\n count += payload.configErrors.length;\n }\n\n if (Array.isArray(payload.sessionErrors)) {\n for (const session of payload.sessionErrors) {\n if (session?.buildError != null) {\n count += 1;\n }\n\n if (Array.isArray(session?.runtimeErrors)) {\n count += session.runtimeErrors.length;\n }\n }\n }\n\n return count;\n}\n\nfunction parseGetErrorsPayload(output: GetErrorsOutput | undefined): GetErrorsPayload | null {\n if (output == null) {\n return null;\n }\n\n if (typeof output === 'string') {\n return parsePayloadText(output);\n }\n\n if (isGetErrorsPayload(output)) {\n return output;\n }\n\n for (const item of output.content) {\n if (item.type !== 'text') {\n continue;\n }\n\n const payload = parsePayloadText(item.text);\n\n if (payload) {\n return payload;\n }\n }\n\n return null;\n}\n\nfunction countErrorsFromText(text: string): number | null {\n const payload = parsePayloadText(text);\n\n if (payload) {\n return countErrorsFromPayload(payload);\n }\n\n return countErrorsFromMarkdown(text);\n}\n\n/** Count errors from JSON or Next.js markdown `get_errors` output. */\nexport function countGetErrorsFromOutput(output: GetErrorsOutput | undefined): number {\n if (output == null) {\n return 0;\n }\n\n if (typeof output === 'string') {\n return countErrorsFromText(output) ?? 0;\n }\n\n const payload = parseGetErrorsPayload(output);\n\n if (payload) {\n return countErrorsFromPayload(payload);\n }\n\n if (isGetErrorsPayload(output)) {\n return countErrorsFromPayload(output);\n }\n\n for (const item of output.content) {\n if (item.type !== 'text') {\n continue;\n }\n\n const count = countErrorsFromText(item.text);\n\n if (count != null) {\n return count;\n }\n }\n\n return 0;\n}\n\nfunction getErrorsTitle(state: string, output: GetErrorsOutput | undefined, useFailureLabel: boolean): {\n title?: string;\n titleInProgress?: string;\n} {\n if (useFailureLabel) {\n return { title: 'Runtime check failed' };\n }\n\n if (isToolInvocationInProgress(state)) {\n return { titleInProgress: 'Checking runtime errors' };\n }\n\n if (state === 'output-available') {\n const count = countGetErrorsFromOutput(output);\n\n if (count === 0) {\n return { title: 'Checked runtime errors' };\n }\n\n const noun = count === 1 ? 'error' : 'errors';\n\n return { title: `Found ${ count } ${ noun }` };\n }\n\n return { titleInProgress: 'Checking runtime errors' };\n}\n\n/** Next.js devtools get_errors: compact label only (no error details). */\nexport function GetErrorsTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part)) {\n return null;\n }\n\n if (!isGetErrorsToolName(getToolName(part))) {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const output = part.state === 'output-available'\n ? part.output as GetErrorsOutput | undefined\n : undefined;\n const { title, titleInProgress } = getErrorsTitle(part.state, output, failure.useFailureLabel);\n const clean = part.state === 'output-available'\n && !failure.useFailureLabel\n && countGetErrorsFromOutput(output) === 0;\n\n return (\n <ToolShell data-slot=\"get-errors-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title={ title }\n titleInProgress={ titleInProgress }\n icon={ clean ? <Done aria-hidden /> : <AttentionTriangle aria-hidden /> }\n />\n </ToolShell>\n );\n}\n"],"names":["GET_ERRORS_TOOL_NAME","isGetErrorsToolName","name","SESSION_ERROR_COUNT_PATTERN","isGetErrorsPayload","value","isGetErrorsMarkdown","text","parsePayloadText","parsed","countErrorsFromMarkdown","count","match","errorHeaders","countErrorsFromPayload","payload","session","parseGetErrorsPayload","output","item","countErrorsFromText","countGetErrorsFromOutput","getErrorsTitle","state","useFailureLabel","isToolInvocationInProgress","GetErrorsTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","title","titleInProgress","clean","ToolShell","ToolShellHeader","_jsx","Done","AttentionTriangle"],"mappings":"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"}
1
+ {"version":3,"file":"GetErrorsTool.js","sources":["../../../../src/chat/Tool/get-errors/GetErrorsTool.tsx"],"sourcesContent":["import { AttentionTriangle, Done } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport { ToolShell, ToolShellHeader } from '../shell';\n\nimport type { ToolRendererProps } from '../types';\n\nexport const GET_ERRORS_TOOL_NAME = 'devtools__get_errors';\n\nexport function isGetErrorsToolName(name: string): boolean {\n return name === GET_ERRORS_TOOL_NAME;\n}\n\ntype GetErrorsConfigError = {\n name: string;\n message: string;\n stack: string | null;\n};\n\ntype GetErrorsRuntimeError = {\n type: string;\n errorName: string;\n message: string;\n};\n\ntype GetErrorsSessionError = {\n url: string;\n buildError: string | null;\n runtimeErrors: GetErrorsRuntimeError[];\n};\n\ntype GetErrorsPayload = {\n configErrors?: GetErrorsConfigError[];\n sessionErrors?: GetErrorsSessionError[];\n};\n\ntype McpTextContent = { type: 'text'; text: string };\n\n/** Next.js `get_errors` MCP tool result (`content[].text` is markdown or JSON `GetErrorsPayload`). */\ntype GetErrorsToolOutput = {\n content: McpTextContent[];\n isError: boolean;\n};\n\ntype GetErrorsOutput = GetErrorsToolOutput | GetErrorsPayload | string;\n\nconst SESSION_ERROR_COUNT_PATTERN = /\\*\\*(\\d+) error\\(s\\) found\\*\\*/gi;\n\nfunction isGetErrorsPayload(value: object): value is GetErrorsPayload {\n return 'configErrors' in value || 'sessionErrors' in value;\n}\n\nfunction isGetErrorsMarkdown(text: string): boolean {\n return /^#\\s+(Found errors in|No errors)/m.test(text)\n || /^##\\s+Configuration Errors/m.test(text);\n}\n\nfunction parsePayloadText(text: string): GetErrorsPayload | null {\n try {\n const parsed: object = JSON.parse(text);\n\n return isGetErrorsPayload(parsed) ? parsed : null;\n }\n catch {\n return null;\n }\n}\n\nfunction countErrorsFromMarkdown(text: string): number | null {\n if (!isGetErrorsMarkdown(text)) {\n return null;\n }\n\n let count = 0;\n\n for (const match of text.matchAll(SESSION_ERROR_COUNT_PATTERN)) {\n count += Number.parseInt(match[1] ?? '0', 10);\n }\n\n if (count > 0) {\n return count;\n }\n\n const errorHeaders = text.match(/^#### Error \\d+/gm);\n\n if (errorHeaders && errorHeaders.length > 0) {\n return errorHeaders.length;\n }\n\n return 0;\n}\n\nfunction countErrorsFromPayload(payload: GetErrorsPayload): number {\n let count = 0;\n\n if (Array.isArray(payload.configErrors)) {\n count += payload.configErrors.length;\n }\n\n if (Array.isArray(payload.sessionErrors)) {\n for (const session of payload.sessionErrors) {\n if (session?.buildError != null) {\n count += 1;\n }\n\n if (Array.isArray(session?.runtimeErrors)) {\n count += session.runtimeErrors.length;\n }\n }\n }\n\n return count;\n}\n\nfunction parseGetErrorsPayload(output: GetErrorsOutput | undefined): GetErrorsPayload | null {\n if (output == null) {\n return null;\n }\n\n if (typeof output === 'string') {\n return parsePayloadText(output);\n }\n\n if (isGetErrorsPayload(output)) {\n return output;\n }\n\n for (const item of output.content) {\n if (item.type !== 'text') {\n continue;\n }\n\n const payload = parsePayloadText(item.text);\n\n if (payload) {\n return payload;\n }\n }\n\n return null;\n}\n\nfunction countErrorsFromText(text: string): number | null {\n const payload = parsePayloadText(text);\n\n if (payload) {\n return countErrorsFromPayload(payload);\n }\n\n return countErrorsFromMarkdown(text);\n}\n\n/** Count errors from JSON or Next.js markdown `get_errors` output. */\nexport function countGetErrorsFromOutput(output: GetErrorsOutput | undefined): number {\n if (output == null) {\n return 0;\n }\n\n if (typeof output === 'string') {\n return countErrorsFromText(output) ?? 0;\n }\n\n const payload = parseGetErrorsPayload(output);\n\n if (payload) {\n return countErrorsFromPayload(payload);\n }\n\n if (isGetErrorsPayload(output)) {\n return countErrorsFromPayload(output);\n }\n\n for (const item of output.content) {\n if (item.type !== 'text') {\n continue;\n }\n\n const count = countErrorsFromText(item.text);\n\n if (count != null) {\n return count;\n }\n }\n\n return 0;\n}\n\nfunction getErrorsTitle(state: string, output: GetErrorsOutput | undefined, useFailureLabel: boolean): {\n title?: string;\n titleInProgress?: string;\n} {\n if (useFailureLabel) {\n return { title: 'Runtime check failed' };\n }\n\n if (isToolInvocationInProgress(state)) {\n return { titleInProgress: 'Checking runtime errors' };\n }\n\n if (state === 'output-available') {\n const count = countGetErrorsFromOutput(output);\n\n if (count === 0) {\n return { title: 'Checked runtime errors' };\n }\n\n const noun = count === 1 ? 'error' : 'errors';\n\n return { title: `Found ${ count } ${ noun }` };\n }\n\n return { titleInProgress: 'Checking runtime errors' };\n}\n\n/** Next.js devtools get_errors: compact label only (no error details). */\nexport function GetErrorsTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part)) {\n return null;\n }\n\n if (!isGetErrorsToolName(getToolName(part))) {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const output = part.state === 'output-available'\n ? part.output as GetErrorsOutput | undefined\n : undefined;\n const { title, titleInProgress } = getErrorsTitle(part.state, output, failure.useFailureLabel);\n const clean = part.state === 'output-available'\n && !failure.useFailureLabel\n && countGetErrorsFromOutput(output) === 0;\n\n return (\n <ToolShell data-slot=\"get-errors-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title={ title }\n titleInProgress={ titleInProgress }\n icon={ clean ? <Done aria-hidden /> : <AttentionTriangle aria-hidden /> }\n />\n </ToolShell>\n );\n}\n"],"names":["GET_ERRORS_TOOL_NAME","isGetErrorsToolName","name","SESSION_ERROR_COUNT_PATTERN","isGetErrorsPayload","value","isGetErrorsMarkdown","text","parsePayloadText","parsed","countErrorsFromMarkdown","count","match","errorHeaders","countErrorsFromPayload","payload","session","parseGetErrorsPayload","output","item","countErrorsFromText","countGetErrorsFromOutput","getErrorsTitle","state","useFailureLabel","isToolInvocationInProgress","GetErrorsTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","title","titleInProgress","clean","ToolShell","ToolShellHeader","_jsx","Done","AttentionTriangle"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Search as f } from "@reforma/icons/14";
2
2
  import { plural as m } from "@reforma/lib";
3
- import { isToolUIPart as c, getToolName as h } from "ai";
3
+ import { isToolUIPart as c, getToolName as h } from "@reforma/types";
4
4
  import { Show as n } from "../../../Show/Show.js";
5
5
  import { Text as d } from "../../../Text/Text.js";
6
6
  import { getToolFailureRowState as p } from "../helpers.js";