@reforma/components 0.4.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/RichInput/RichInput.d.ts +1 -1
  2. package/dist/RichInput/RichInput.d.ts.map +1 -1
  3. package/dist/RichInput/RichInput.js +126 -123
  4. package/dist/RichInput/RichInput.js.map +1 -1
  5. package/dist/SortableList/SortableList.d.ts +9 -3
  6. package/dist/SortableList/SortableList.d.ts.map +1 -1
  7. package/dist/SortableList/SortableList.js +178 -163
  8. package/dist/SortableList/SortableList.js.map +1 -1
  9. package/dist/chat/ComposerBanner/ComposerBanner.d.ts +6 -1
  10. package/dist/chat/ComposerBanner/ComposerBanner.d.ts.map +1 -1
  11. package/dist/chat/ComposerBanner/ComposerBanner.js +60 -40
  12. package/dist/chat/ComposerBanner/ComposerBanner.js.map +1 -1
  13. package/dist/chat/ComposerBanner/ComposerBanner.module.css +1 -1
  14. package/dist/chat/ComposerBanner/ComposerBanner.module.css.js +13 -9
  15. package/dist/chat/ComposerBanner/ComposerBanner.module.css.js.map +1 -1
  16. package/dist/chat/Conversation/ConversationPendingLoader.d.ts.map +1 -1
  17. package/dist/chat/Conversation/ConversationPendingLoader.js +1 -1
  18. package/dist/chat/Conversation/ConversationPendingLoader.js.map +1 -1
  19. package/dist/chat/Message/normalize/normalizeMessageParts.d.ts +1 -1
  20. package/dist/chat/Message/normalize/normalizeMessageParts.d.ts.map +1 -1
  21. package/dist/chat/Message/normalize/normalizeMessageParts.js +1 -1
  22. package/dist/chat/Message/normalize/normalizeMessageParts.js.map +1 -1
  23. package/dist/chat/Message/parts/MessagePart.d.ts.map +1 -1
  24. package/dist/chat/Message/parts/MessagePart.js +1 -1
  25. package/dist/chat/Message/parts/MessagePart.js.map +1 -1
  26. package/dist/chat/Message/parts/backgroundResultPart.js +1 -1
  27. package/dist/chat/Message/parts/backgroundResultPart.js.map +1 -1
  28. package/dist/chat/Message/parts/collectMessageSources.d.ts +1 -1
  29. package/dist/chat/Message/parts/collectMessageSources.d.ts.map +1 -1
  30. package/dist/chat/Message/parts/collectMessageSources.js +1 -1
  31. package/dist/chat/Message/parts/collectMessageSources.js.map +1 -1
  32. package/dist/chat/Message/parts/contextCompactionPart.js +1 -1
  33. package/dist/chat/Message/parts/contextCompactionPart.js.map +1 -1
  34. package/dist/chat/Message/segments/analyzeGroupedSegment.js +5 -5
  35. package/dist/chat/Message/segments/analyzeGroupedSegment.js.map +1 -1
  36. package/dist/chat/Message/segments/recentStreamingPhaseToolGroups.js +1 -1
  37. package/dist/chat/Message/segments/recentStreamingPhaseToolGroups.js.map +1 -1
  38. package/dist/chat/Message/turn/workedCollapse.js +1 -1
  39. package/dist/chat/Message/turn/workedCollapse.js.map +1 -1
  40. package/dist/chat/Tool/Tool.js +1 -1
  41. package/dist/chat/Tool/Tool.js.map +1 -1
  42. package/dist/chat/Tool/agent/AgentTool.d.ts.map +1 -1
  43. package/dist/chat/Tool/agent/AgentTool.js +73 -73
  44. package/dist/chat/Tool/agent/AgentTool.js.map +1 -1
  45. package/dist/chat/Tool/bash/BashTool.d.ts.map +1 -1
  46. package/dist/chat/Tool/bash/BashTool.js +42 -48
  47. package/dist/chat/Tool/bash/BashTool.js.map +1 -1
  48. package/dist/chat/Tool/bash/BashTool.module.css +1 -1
  49. package/dist/chat/Tool/bash/BashTool.module.css.js +6 -8
  50. package/dist/chat/Tool/bash/BashTool.module.css.js.map +1 -1
  51. package/dist/chat/Tool/create-directory/CreateDirectoryTool.js +1 -1
  52. package/dist/chat/Tool/create-directory/CreateDirectoryTool.js.map +1 -1
  53. package/dist/chat/Tool/default/Default.d.ts.map +1 -1
  54. package/dist/chat/Tool/default/Default.js +1 -1
  55. package/dist/chat/Tool/default/Default.js.map +1 -1
  56. package/dist/chat/Tool/dev-server/DevServerRestartTool.js +1 -1
  57. package/dist/chat/Tool/dev-server/DevServerRestartTool.js.map +1 -1
  58. package/dist/chat/Tool/dev-server/DevServerStatusTool.js +1 -1
  59. package/dist/chat/Tool/dev-server/DevServerStatusTool.js.map +1 -1
  60. package/dist/chat/Tool/edit/EditTool.js +1 -1
  61. package/dist/chat/Tool/edit/EditTool.js.map +1 -1
  62. package/dist/chat/Tool/fetch/FetchTool.js +1 -1
  63. package/dist/chat/Tool/fetch/FetchTool.js.map +1 -1
  64. package/dist/chat/Tool/fileChangesFromToolParts.js +1 -1
  65. package/dist/chat/Tool/fileChangesFromToolParts.js.map +1 -1
  66. package/dist/chat/Tool/get-background-result/GetBackgroundResultTool.js +1 -1
  67. package/dist/chat/Tool/get-background-result/GetBackgroundResultTool.js.map +1 -1
  68. package/dist/chat/Tool/get-errors/GetErrorsTool.js +1 -1
  69. package/dist/chat/Tool/get-errors/GetErrorsTool.js.map +1 -1
  70. package/dist/chat/Tool/glob/GlobTool.js +1 -1
  71. package/dist/chat/Tool/glob/GlobTool.js.map +1 -1
  72. package/dist/chat/Tool/grep/GrepTool.js +1 -1
  73. package/dist/chat/Tool/grep/GrepTool.js.map +1 -1
  74. package/dist/chat/Tool/helpers.d.ts +1 -1
  75. package/dist/chat/Tool/helpers.d.ts.map +1 -1
  76. package/dist/chat/Tool/helpers.js +1 -1
  77. package/dist/chat/Tool/helpers.js.map +1 -1
  78. package/dist/chat/Tool/image-asset/ImageAssetTool.js +1 -1
  79. package/dist/chat/Tool/image-asset/ImageAssetTool.js.map +1 -1
  80. package/dist/chat/Tool/install-dependencies/InstallDependenciesTool.js +1 -1
  81. package/dist/chat/Tool/install-dependencies/InstallDependenciesTool.js.map +1 -1
  82. package/dist/chat/Tool/install-plugin/InstallPlugin.js +1 -1
  83. package/dist/chat/Tool/install-plugin/InstallPlugin.js.map +1 -1
  84. package/dist/chat/Tool/integration-card/IntegrationActionCard.d.ts +3 -1
  85. package/dist/chat/Tool/integration-card/IntegrationActionCard.d.ts.map +1 -1
  86. package/dist/chat/Tool/integration-card/IntegrationActionCard.js +88 -82
  87. package/dist/chat/Tool/integration-card/IntegrationActionCard.js.map +1 -1
  88. package/dist/chat/Tool/list-directory/normalizeListDirectoryTools.js +1 -1
  89. package/dist/chat/Tool/list-directory/normalizeListDirectoryTools.js.map +1 -1
  90. package/dist/chat/Tool/mcp-tools/CallDynamicTool.js +1 -1
  91. package/dist/chat/Tool/mcp-tools/CallDynamicTool.js.map +1 -1
  92. package/dist/chat/Tool/mcp-tools/GetDynamicToolsTool.js +1 -1
  93. package/dist/chat/Tool/mcp-tools/GetDynamicToolsTool.js.map +1 -1
  94. package/dist/chat/Tool/mcp-tools/GetMcpResourcesTool.js +1 -1
  95. package/dist/chat/Tool/mcp-tools/GetMcpResourcesTool.js.map +1 -1
  96. package/dist/chat/Tool/mcp-tools/McpAuth.js +1 -1
  97. package/dist/chat/Tool/mcp-tools/McpAuth.js.map +1 -1
  98. package/dist/chat/Tool/memory/MemoryTool.js +1 -1
  99. package/dist/chat/Tool/memory/MemoryTool.js.map +1 -1
  100. package/dist/chat/Tool/move-file/MoveFileTool.js +1 -1
  101. package/dist/chat/Tool/move-file/MoveFileTool.js.map +1 -1
  102. package/dist/chat/Tool/plan/CreatePlanTool.js +1 -1
  103. package/dist/chat/Tool/plan/CreatePlanTool.js.map +1 -1
  104. package/dist/chat/Tool/preamble/PreambleTool.js +1 -1
  105. package/dist/chat/Tool/preamble/PreambleTool.js.map +1 -1
  106. package/dist/chat/Tool/project-build/BuildTool.js +1 -1
  107. package/dist/chat/Tool/project-build/BuildTool.js.map +1 -1
  108. package/dist/chat/Tool/project-env/ProjectEnvTool.js +1 -1
  109. package/dist/chat/Tool/project-env/ProjectEnvTool.js.map +1 -1
  110. package/dist/chat/Tool/read/normalizeReadTools.js +1 -1
  111. package/dist/chat/Tool/read/normalizeReadTools.js.map +1 -1
  112. package/dist/chat/Tool/read-lints/ReadLintsTool.js +1 -1
  113. package/dist/chat/Tool/read-lints/ReadLintsTool.js.map +1 -1
  114. package/dist/chat/Tool/remove-file/RemoveFileTool.js +1 -1
  115. package/dist/chat/Tool/remove-file/RemoveFileTool.js.map +1 -1
  116. package/dist/chat/Tool/scaffold-project/ScaffoldProjectTool.js +1 -1
  117. package/dist/chat/Tool/scaffold-project/ScaffoldProjectTool.js.map +1 -1
  118. package/dist/chat/Tool/screenshot/CaptureScreenshotTool.js +3 -3
  119. package/dist/chat/Tool/screenshot/CaptureScreenshotTool.js.map +1 -1
  120. package/dist/chat/Tool/skill/SkillTool.js +1 -1
  121. package/dist/chat/Tool/skill/SkillTool.js.map +1 -1
  122. package/dist/chat/Tool/waiting/WaitingTool.js +1 -1
  123. package/dist/chat/Tool/waiting/WaitingTool.js.map +1 -1
  124. package/dist/chat/Tool/web-search/WebSearchTool.js +1 -1
  125. package/dist/chat/Tool/web-search/WebSearchTool.js.map +1 -1
  126. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"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":";;;;;;;;;;;;;;;;;;;AAiBA,MAAMA,IAAmB,CAACC,GAAyB,GAC7CC,IAAiB;AACvB,SAASC,EAAcC,GAAOC,GAAQ;AACpC,aAAWC,KAAU,CAACD,GAAQD,CAAK,GAAG;AACpC,QAAIE,KAAU,QAAQ,OAAOA,KAAW,YAAY,EAAE,UAAUA;AAC9D;AAEF,UAAMC,IAAOD,EAAO,MAAM,KAAA;AAC1B,QAAIC;AACF,aAAOA;AAAA,EAEX;AACA,SAAO;AACT;AAEA,MAAMC,uBAA4C,CAAC;AAAA,EACjD,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,MAAAC;AAAA,EACA,QAAAN;AAAA,EACA,WAAAO;AAAA,EACA,WAAAC;AACF,MAAM;AACJ,QAAMC,IAAWC,EAAQ,MAAMC,EAAoBL,CAAI,GAAG,CAACA,CAAI,CAAC,GAC1DM,IAAOF,EAAQ,MAAMG,EAA2BT,GAAUC,GAAWL,GAAQO,GAAWC,CAAS,GAAG,CAACJ,GAAUC,GAAWL,GAAQO,GAAWC,CAAS,CAAC;AAC7J,2BAAyBM,GAAiB;AAAA,IACxC,WAAWC,EAAO;AAAA,IAClB,UAAAN;AAAA,IACA,MAAAG;AAAA,IACA,QAAQ;AAAA,IACR,cAAcjB;AAAA,IACd,eAAeqB,EAA2BX,CAAS;AAAA,EAAA,CACpD;AACH,CAAC;AACD,SAASY,GAAsBC,GAAO;AACpC,SAAOA,MAAU,qBAAqBA,MAAU,qBAAqBA,MAAU,wBAAwBA,MAAU;AACnH;AAGO,SAASC,GAASC,GAAO;AAC9B,QAAMC,IAAOD,EAAM,MACb;AAAA,IACJ,wBAAAE;AAAA,IACA,YAAAC;AAAA,IACA,YAAAC;AAAA,EAAA,IACEC,EAAgBL,CAAK,GACnBM,IAAWC,EAAYN,CAAI,GAC3BO,IAAUF,MAAa,SACvBG,IAASH,MAAa,YACtBI,IAAcpB,EAAQ,MAAMqB,EAAwBV,EAAK,KAAK,GAAG,CAACA,EAAK,KAAK,CAAC,GAC7Ef,IAAOuB,IAAShC,IAAiBiC,EAAY,MAC7CZ,IAAQG,EAAK,OACbW,IAAUC,EAAuBZ,CAAI,GAErCa,IAAgB,EAAQ5B,KAASW,GAAsBC,CAAK,MAAM,CAACW,KAAUC,EAAY,MAAM,SAAS,IACxGK,IAAYjB,MAAU,oBACtBkB,IAAS1B,EAAQ,MACjB,CAACyB,KAAa,CAAC7B,IACV,OAEFsB,IAAUS,EAAoBhB,EAAK,MAAM,IAAIiB,EAAmBjB,EAAK,MAAM,GACjF,CAACc,GAAWP,GAAStB,GAAMe,EAAK,MAAM,CAAC,GACpCkB,IAAWlB,EAAK,UAChBmB,IAAcZ,IAAU,UAAUC,IAAS,cAAc,QACzDY,IAAgBb,IAAU,YAAYC,IAAS,iBAAiB,WAChEa,IAAWb,IAAS/B,EAAcuB,EAAK,OAAOA,EAAK,MAAM,IAAI,QAC7DsB,IAAWd,IAAS;AAAA,IACxB,OAAOa;AAAA,IACP,MAAM;AAAA,EAAA,IACJE,EAAiBd,EAAY,IAAI;AACrC,2BAA0Be,GAAW;AAAA,IACnC,aAAaX;AAAA,IACb,aAAa;AAAA,IACb,UAAU,CAAcY,gBAAAA,EAAMC,GAAiB;AAAA,MAC7C,OAAA7B;AAAA,MACA,cAAcc,EAAQ;AAAA,MACtB,OAAOQ;AAAA,MACP,iBAAiBC;AAAA,MACjB,MAAMb,IAAuBoB,gBAAAA,EAAKC,GAAY;AAAA,QAC5C,eAAe;AAAA,MAAA,CAChB,IAAiBD,gBAAAA,EAAKE,GAAS;AAAA,QAC9B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,UAAU,CAAcF,gBAAAA,EAAKG,GAAM;AAAA,QACjC,MAAMR;AAAA,QACN,UAAU,CAAAS,MAAqBJ,gBAAAA,EAAKK,GAAM;AAAA,UACxC,cAAcxB,IAASa,IAAW;AAAA,UAClC,MAAAU;AAAA,UACA,UAAUvB,IAASL,IAAa,MAAMA,EAAA,IAAe,SAAYD;AAAA,QAAA,CAClE;AAAA,MAAA,CACF,GAAGa,IAAsBY,gBAAAA,EAAKM,GAAgB;AAAA,QAC7C,OAAOlB,EAAO;AAAA,QACd,SAASA,EAAO;AAAA,MAAA,CACjB,IAAI,IAAI;AAAA,IAAA,CACV,GAAGF,IAA6Bc,gBAAAA,EAAKO,GAAkB;AAAA,MACtD,WAAWxC,EAAO;AAAA,MAClB,4BAA4BZ,IAAyB;AAAA,QACnD,UAAUyB,IAAU,eAAe;AAAA,QACnC,WAAWV;AAAA,QACX,MAAAZ;AAAA,QACA,QAAQe,EAAK;AAAA,QACb,WAAWS,EAAY;AAAA,QACvB,WAAWA,EAAY;AAAA,MAAA,CACxB;AAAA,IAAA,CACF,IAAI,MAAmBkB,gBAAAA,EAAKG,GAAM;AAAA,MACjC,MAAMnB,EAAQ;AAAA,MACd,4BAA4BwB,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUzB,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBgB,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMjC,MAAU;AAAA,MAChB,4BAA4BsC,GAAiB;AAAA,QAC3C,4BAA4BE,GAAU;AAAA,UACpC,UAAAnB;AAAA,UACA,OAAArB;AAAA,UACA,wBAAAI;AAAA,UACA,4BAA6BqC,GAAiB;AAAA,YAC5C,UAAU,CAAcX,gBAAAA,EAAKS,GAAM;AAAA,cACjC,UAAU;AAAA,YAAA,CACX,GAAgBT,gBAAAA,EAAKY,GAAiB,EAAE,CAAC;AAAA,UAAA,CAC3C;AAAA,QAAA,CACF;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
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";
@@ -1 +1 @@
1
- {"version":3,"file":"GlobTool.js","sources":["../../../../src/chat/Tool/glob/GlobTool.tsx"],"sourcesContent":["import { Search } from '@reforma/icons/14';\nimport { plural } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n ToolPathListPopover,\n ToolShell,\n ToolShellFooter,\n ToolShellHeader,\n ToolSummaryBadges,\n} from '../shell';\n\nimport type { ToolRendererProps } from '../types';\n\nfunction globPatternsFromInput(input: unknown): string[] {\n if (input == null || typeof input !== 'object') {\n return [];\n }\n\n const pattern = (input as { pattern?: unknown }).pattern;\n\n if (!Array.isArray(pattern)) {\n return [];\n }\n\n return pattern.filter((p): p is string => typeof p === 'string' && p.length > 0);\n}\n\nfunction globResultsFromOutput(output: unknown): string[] {\n if (output == null || typeof output !== 'object') {\n return [];\n }\n\n const raw = (output as { results?: unknown }).results;\n\n if (!Array.isArray(raw)) {\n return [];\n }\n\n return raw.filter((p): p is string => typeof p === 'string');\n}\n\n/** Glob: pattern in the header. Click the row to list files that were found. */\nexport function GlobTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'Glob') {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const patterns = globPatternsFromInput(part.input);\n const done = state === 'output-available';\n const paths = done && !failure.useFailureLabel\n ? [ ...new Set(globResultsFromOutput(part.output)) ]\n : [];\n const title = done && !failure.useFailureLabel\n ? `Found ${ plural(paths.length, 'file', 'files') }`\n : 'Found files';\n const header = (\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title={ title }\n titleInProgress=\"Finding files\"\n icon={ <Search aria-hidden /> }\n disclosure={ paths.length > 0 }\n >\n <Show when={ patterns.length > 0 }>\n <ToolSummaryBadges labels={ patterns } aria-label=\"Pattern\" />\n </Show>\n </ToolShellHeader>\n );\n\n return (\n <ToolShell data-slot=\"glob-tool\">\n <Show\n when={ paths.length > 0 }\n fallback={ header }\n >\n <ToolPathListPopover\n trigger={ header }\n paths={ paths }\n />\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":["globPatternsFromInput","input","pattern","p","globResultsFromOutput","output","raw","GlobTool","part","isToolUIPart","getToolName","state","failure","getToolFailureRowState","patterns","done","paths","title","plural","header","ToolShellHeader","Search","Show","ToolSummaryBadges","ToolShell","_jsx","ToolPathListPopover","ToolShellFooter","Text"],"mappings":";;;;;;;;;;AAQA,SAASA,EAAsBC,GAAO;AACpC,MAAIA,KAAS,QAAQ,OAAOA,KAAU;AACpC,WAAO,CAAA;AAET,QAAMC,IAAUD,EAAM;AACtB,SAAK,MAAM,QAAQC,CAAO,IAGnBA,EAAQ,OAAO,CAAAC,MAAK,OAAOA,KAAM,YAAYA,EAAE,SAAS,CAAC,IAFvD,CAAA;AAGX;AACA,SAASC,EAAsBC,GAAQ;AACrC,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACtC,WAAO,CAAA;AAET,QAAMC,IAAMD,EAAO;AACnB,SAAK,MAAM,QAAQC,CAAG,IAGfA,EAAI,OAAO,CAAAH,MAAK,OAAOA,KAAM,QAAQ,IAFnC,CAAA;AAGX;AAGO,SAASI,EAAS;AAAA,EACvB,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAQH,EAAK,OACbI,IAAUC,EAAuBL,CAAI,GACrCM,IAAWd,EAAsBQ,EAAK,KAAK,GAC3CO,IAAOJ,MAAU,oBACjBK,IAAQD,KAAQ,CAACH,EAAQ,kBAAkB,CAAC,GAAG,IAAI,IAAIR,EAAsBI,EAAK,MAAM,CAAC,CAAC,IAAI,CAAA,GAC9FS,IAAQF,KAAQ,CAACH,EAAQ,kBAAkB,SAASM,EAAOF,EAAM,QAAQ,QAAQ,OAAO,CAAC,KAAK,eAC9FG,sBAA2BC,GAAiB;AAAA,IAChD,OAAAT;AAAA,IACA,cAAcC,EAAQ;AAAA,IACtB,OAAAK;AAAA,IACA,iBAAiB;AAAA,IACjB,wBAAwBI,GAAQ;AAAA,MAC9B,eAAe;AAAA,IAAA,CAChB;AAAA,IACD,YAAYL,EAAM,SAAS;AAAA,IAC3B,4BAA4BM,GAAM;AAAA,MAChC,MAAMR,EAAS,SAAS;AAAA,MACxB,4BAA4BS,GAAmB;AAAA,QAC7C,QAAQT;AAAA,QACR,cAAc;AAAA,MAAA,CACf;AAAA,IAAA,CACF;AAAA,EAAA,CACF;AACD,2BAA0BU,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKH,GAAM;AAAA,MACjC,MAAMN,EAAM,SAAS;AAAA,MACrB,UAAUG;AAAA,MACV,4BAA4BO,GAAqB;AAAA,QAC/C,SAASP;AAAA,QACT,OAAAH;AAAA,MAAA,CACD;AAAA,IAAA,CACF,GAAgBS,gBAAAA,EAAKH,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":"GlobTool.js","sources":["../../../../src/chat/Tool/glob/GlobTool.tsx"],"sourcesContent":["import { Search } from '@reforma/icons/14';\nimport { plural } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n ToolPathListPopover,\n ToolShell,\n ToolShellFooter,\n ToolShellHeader,\n ToolSummaryBadges,\n} from '../shell';\n\nimport type { ToolRendererProps } from '../types';\n\nfunction globPatternsFromInput(input: unknown): string[] {\n if (input == null || typeof input !== 'object') {\n return [];\n }\n\n const pattern = (input as { pattern?: unknown }).pattern;\n\n if (!Array.isArray(pattern)) {\n return [];\n }\n\n return pattern.filter((p): p is string => typeof p === 'string' && p.length > 0);\n}\n\nfunction globResultsFromOutput(output: unknown): string[] {\n if (output == null || typeof output !== 'object') {\n return [];\n }\n\n const raw = (output as { results?: unknown }).results;\n\n if (!Array.isArray(raw)) {\n return [];\n }\n\n return raw.filter((p): p is string => typeof p === 'string');\n}\n\n/** Glob: pattern in the header. Click the row to list files that were found. */\nexport function GlobTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'Glob') {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const patterns = globPatternsFromInput(part.input);\n const done = state === 'output-available';\n const paths = done && !failure.useFailureLabel\n ? [ ...new Set(globResultsFromOutput(part.output)) ]\n : [];\n const title = done && !failure.useFailureLabel\n ? `Found ${ plural(paths.length, 'file', 'files') }`\n : 'Found files';\n const header = (\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title={ title }\n titleInProgress=\"Finding files\"\n icon={ <Search aria-hidden /> }\n disclosure={ paths.length > 0 }\n >\n <Show when={ patterns.length > 0 }>\n <ToolSummaryBadges labels={ patterns } aria-label=\"Pattern\" />\n </Show>\n </ToolShellHeader>\n );\n\n return (\n <ToolShell data-slot=\"glob-tool\">\n <Show\n when={ paths.length > 0 }\n fallback={ header }\n >\n <ToolPathListPopover\n trigger={ header }\n paths={ paths }\n />\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":["globPatternsFromInput","input","pattern","p","globResultsFromOutput","output","raw","GlobTool","part","isToolUIPart","getToolName","state","failure","getToolFailureRowState","patterns","done","paths","title","plural","header","ToolShellHeader","Search","Show","ToolSummaryBadges","ToolShell","_jsx","ToolPathListPopover","ToolShellFooter","Text"],"mappings":";;;;;;;;;;AAQA,SAASA,EAAsBC,GAAO;AACpC,MAAIA,KAAS,QAAQ,OAAOA,KAAU;AACpC,WAAO,CAAA;AAET,QAAMC,IAAUD,EAAM;AACtB,SAAK,MAAM,QAAQC,CAAO,IAGnBA,EAAQ,OAAO,CAAAC,MAAK,OAAOA,KAAM,YAAYA,EAAE,SAAS,CAAC,IAFvD,CAAA;AAGX;AACA,SAASC,EAAsBC,GAAQ;AACrC,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACtC,WAAO,CAAA;AAET,QAAMC,IAAMD,EAAO;AACnB,SAAK,MAAM,QAAQC,CAAG,IAGfA,EAAI,OAAO,CAAAH,MAAK,OAAOA,KAAM,QAAQ,IAFnC,CAAA;AAGX;AAGO,SAASI,EAAS;AAAA,EACvB,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAQH,EAAK,OACbI,IAAUC,EAAuBL,CAAI,GACrCM,IAAWd,EAAsBQ,EAAK,KAAK,GAC3CO,IAAOJ,MAAU,oBACjBK,IAAQD,KAAQ,CAACH,EAAQ,kBAAkB,CAAC,GAAG,IAAI,IAAIR,EAAsBI,EAAK,MAAM,CAAC,CAAC,IAAI,CAAA,GAC9FS,IAAQF,KAAQ,CAACH,EAAQ,kBAAkB,SAASM,EAAOF,EAAM,QAAQ,QAAQ,OAAO,CAAC,KAAK,eAC9FG,sBAA2BC,GAAiB;AAAA,IAChD,OAAAT;AAAA,IACA,cAAcC,EAAQ;AAAA,IACtB,OAAAK;AAAA,IACA,iBAAiB;AAAA,IACjB,wBAAwBI,GAAQ;AAAA,MAC9B,eAAe;AAAA,IAAA,CAChB;AAAA,IACD,YAAYL,EAAM,SAAS;AAAA,IAC3B,4BAA4BM,GAAM;AAAA,MAChC,MAAMR,EAAS,SAAS;AAAA,MACxB,4BAA4BS,GAAmB;AAAA,QAC7C,QAAQT;AAAA,QACR,cAAc;AAAA,MAAA,CACf;AAAA,IAAA,CACF;AAAA,EAAA,CACF;AACD,2BAA0BU,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKH,GAAM;AAAA,MACjC,MAAMN,EAAM,SAAS;AAAA,MACrB,UAAUG;AAAA,MACV,4BAA4BO,GAAqB;AAAA,QAC/C,SAASP;AAAA,QACT,OAAAH;AAAA,MAAA,CACD;AAAA,IAAA,CACF,GAAgBS,gBAAAA,EAAKH,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 { Search as d } from "@reforma/icons/14";
2
2
  import { plural as m } from "@reforma/lib";
3
- import { isToolUIPart as g, getToolName as y } from "ai";
3
+ import { isToolUIPart as g, getToolName as y } from "@reforma/types";
4
4
  import { Show as l } from "../../../Show/Show.js";
5
5
  import { Text as b } from "../../../Text/Text.js";
6
6
  import { getToolFailureRowState as x } from "../helpers.js";
@@ -1 +1 @@
1
- {"version":3,"file":"GrepTool.js","sources":["../../../../src/chat/Tool/grep/GrepTool.tsx"],"sourcesContent":["import { Search } from '@reforma/icons/14';\nimport { plural } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n ToolPathListPopover,\n ToolShell,\n ToolShellFooter,\n ToolShellHeader,\n ToolSummaryBadges,\n} from '../shell';\nimport styles from './GrepTool.module.css';\n\nimport type { GrepToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\ntype GrepHit = {\n path: string;\n line?: number;\n text?: string;\n};\n\nfunction grepPatternFromInput(input: unknown): string {\n if (input == null || typeof input !== 'object') {\n return '';\n }\n\n const pattern = (input as { pattern?: unknown }).pattern;\n\n return typeof pattern === 'string' ? pattern : '';\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction parseContentLine(raw: string): { line?: number; text: string } {\n const match = /^(\\d+):(.*)$/.exec(raw);\n\n if (!match?.[1]) {\n return { text: raw };\n }\n\n const line = Number.parseInt(match[1], 10);\n\n if (!Number.isFinite(line) || line <= 0) {\n return { text: raw };\n }\n\n return { line, text: match[2] };\n}\n\nfunction fileHits(files: unknown): GrepHit[] {\n if (!Array.isArray(files) || !files.every((file): file is string => typeof file === 'string')) {\n return [];\n }\n\n return [...files].sort().map(path => ({ path }));\n}\n\nfunction contentHits(results: unknown): GrepHit[] {\n if (!isRecord(results)) {\n return [];\n }\n\n const hits: GrepHit[] = [];\n\n for (const path of Object.keys(results).sort()) {\n const lines = results[path];\n\n if (!Array.isArray(lines)) {\n continue;\n }\n\n for (const line of lines) {\n if (typeof line !== 'string' || line.length === 0) {\n continue;\n }\n\n hits.push({ path, ...parseContentLine(line) });\n }\n }\n\n return hits;\n}\n\nfunction countHits(counts: unknown): GrepHit[] {\n if (!isRecord(counts)) {\n return [];\n }\n\n const hits: GrepHit[] = [];\n\n for (const path of Object.keys(counts).sort()) {\n const count = counts[path];\n\n if (typeof count !== 'number' || count <= 0) {\n continue;\n }\n\n hits.push({\n path,\n text: plural(count, 'match', 'matches'),\n });\n }\n\n return hits;\n}\n\nfunction grepHits(output: unknown): GrepHit[] {\n if (!isRecord(output)) {\n return [];\n }\n\n const raw = output as GrepToolOutput;\n\n if (raw.output_mode === 'files_with_matches') {\n return fileHits(raw.files);\n }\n\n if (raw.output_mode === 'count') {\n return countHits(raw.counts);\n }\n\n if (raw.output_mode === 'content') {\n return contentHits(raw.results);\n }\n\n const files = fileHits(raw.files);\n\n if (files.length > 0) {\n return files;\n }\n\n const content = contentHits(raw.results);\n\n if (content.length > 0) {\n return content;\n }\n\n return countHits(raw.counts);\n}\n\nfunction grepFilePaths(output: unknown): string[] {\n return [ ...new Set(grepHits(output).map(hit => hit.path)) ];\n}\n\n/** Grep: pattern in the header. Click the row to list files that matched. */\nexport function GrepTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'Grep') {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const pattern = grepPatternFromInput(part.input);\n const done = state === 'output-available';\n const paths = done && !failure.useFailureLabel ? grepFilePaths(part.output) : [];\n const title = done && !failure.useFailureLabel\n ? `Found in ${ plural(paths.length, 'file', 'files') }`\n : 'Searched';\n const header = (\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title={ title }\n titleInProgress=\"Grepping\"\n icon={ <Search aria-hidden /> }\n disclosure={ paths.length > 0 }\n >\n <Show when={ pattern }>\n <ToolSummaryBadges\n className={ styles.pattern }\n labels={ [pattern] }\n aria-label=\"Pattern\"\n />\n </Show>\n </ToolShellHeader>\n );\n\n return (\n <ToolShell data-slot=\"grep-tool\">\n <Show\n when={ paths.length > 0 }\n fallback={ header }\n >\n <ToolPathListPopover\n trigger={ header }\n paths={ paths }\n />\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":["grepPatternFromInput","input","pattern","isRecord","value","parseContentLine","raw","match","line","fileHits","files","file","path","contentHits","results","hits","lines","countHits","counts","count","plural","grepHits","output","content","grepFilePaths","hit","GrepTool","part","isToolUIPart","getToolName","state","failure","getToolFailureRowState","done","paths","title","header","ToolShellHeader","Search","Show","ToolSummaryBadges","styles","ToolShell","_jsx","ToolPathListPopover","ToolShellFooter","Text"],"mappings":";;;;;;;;;;;AASA,SAASA,EAAqBC,GAAO;AACnC,MAAIA,KAAS,QAAQ,OAAOA,KAAU;AACpC,WAAO;AAET,QAAMC,IAAUD,EAAM;AACtB,SAAO,OAAOC,KAAY,WAAWA,IAAU;AACjD;AACA,SAASC,EAASC,GAAO;AACvB,SAAOA,KAAS,QAAQ,OAAOA,KAAU,YAAY,CAAC,MAAM,QAAQA,CAAK;AAC3E;AACA,SAASC,EAAiBC,GAAK;AAC7B,QAAMC,IAAQ,eAAe,KAAKD,CAAG;AACrC,MAAI,CAACC,IAAQ,CAAC;AACZ,WAAO;AAAA,MACL,MAAMD;AAAA,IAAA;AAGV,QAAME,IAAO,OAAO,SAASD,EAAM,CAAC,GAAG,EAAE;AACzC,SAAI,CAAC,OAAO,SAASC,CAAI,KAAKA,KAAQ,IAC7B;AAAA,IACL,MAAMF;AAAA,EAAA,IAGH;AAAA,IACL,MAAAE;AAAA,IACA,MAAMD,EAAM,CAAC;AAAA,EAAA;AAEjB;AACA,SAASE,EAASC,GAAO;AACvB,SAAI,CAAC,MAAM,QAAQA,CAAK,KAAK,CAACA,EAAM,MAAM,CAAAC,MAAQ,OAAOA,KAAS,QAAQ,IACjE,CAAA,IAEF,CAAC,GAAGD,CAAK,EAAE,KAAA,EAAO,IAAI,CAAAE,OAAS;AAAA,IACpC,MAAAA;AAAA,EAAA,EACA;AACJ;AACA,SAASC,EAAYC,GAAS;AAC5B,MAAI,CAACX,EAASW,CAAO;AACnB,WAAO,CAAA;AAET,QAAMC,IAAO,CAAA;AACb,aAAWH,KAAQ,OAAO,KAAKE,CAAO,EAAE,QAAQ;AAC9C,UAAME,IAAQF,EAAQF,CAAI;AAC1B,QAAK,MAAM,QAAQI,CAAK;AAGxB,iBAAWR,KAAQQ;AACjB,QAAI,OAAOR,KAAS,YAAYA,EAAK,WAAW,KAGhDO,EAAK,KAAK;AAAA,UACR,MAAAH;AAAA,UACA,GAAGP,EAAiBG,CAAI;AAAA,QAAA,CACzB;AAAA,EAEL;AACA,SAAOO;AACT;AACA,SAASE,EAAUC,GAAQ;AACzB,MAAI,CAACf,EAASe,CAAM;AAClB,WAAO,CAAA;AAET,QAAMH,IAAO,CAAA;AACb,aAAWH,KAAQ,OAAO,KAAKM,CAAM,EAAE,QAAQ;AAC7C,UAAMC,IAAQD,EAAON,CAAI;AACzB,IAAI,OAAOO,KAAU,YAAYA,KAAS,KAG1CJ,EAAK,KAAK;AAAA,MACR,MAAAH;AAAA,MACA,MAAMQ,EAAOD,GAAO,SAAS,SAAS;AAAA,IAAA,CACvC;AAAA,EACH;AACA,SAAOJ;AACT;AACA,SAASM,EAASC,GAAQ;AACxB,MAAI,CAACnB,EAASmB,CAAM;AAClB,WAAO,CAAA;AAET,QAAMhB,IAAMgB;AACZ,MAAIhB,EAAI,gBAAgB;AACtB,WAAOG,EAASH,EAAI,KAAK;AAE3B,MAAIA,EAAI,gBAAgB;AACtB,WAAOW,EAAUX,EAAI,MAAM;AAE7B,MAAIA,EAAI,gBAAgB;AACtB,WAAOO,EAAYP,EAAI,OAAO;AAEhC,QAAMI,IAAQD,EAASH,EAAI,KAAK;AAChC,MAAII,EAAM,SAAS;AACjB,WAAOA;AAET,QAAMa,IAAUV,EAAYP,EAAI,OAAO;AACvC,SAAIiB,EAAQ,SAAS,IACZA,IAEFN,EAAUX,EAAI,MAAM;AAC7B;AACA,SAASkB,EAAcF,GAAQ;AAC7B,SAAO,CAAC,GAAG,IAAI,IAAID,EAASC,CAAM,EAAE,IAAI,CAAAG,MAAOA,EAAI,IAAI,CAAC,CAAC;AAC3D;AAGO,SAASC,EAAS;AAAA,EACvB,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAQH,EAAK,OACbI,IAAUC,EAAuBL,CAAI,GACrCzB,IAAUF,EAAqB2B,EAAK,KAAK,GACzCM,IAAOH,MAAU,oBACjBI,IAAQD,KAAQ,CAACF,EAAQ,kBAAkBP,EAAcG,EAAK,MAAM,IAAI,CAAA,GACxEQ,IAAQF,KAAQ,CAACF,EAAQ,kBAAkB,YAAYX,EAAOc,EAAM,QAAQ,QAAQ,OAAO,CAAC,KAAK,YACjGE,sBAA2BC,GAAiB;AAAA,IAChD,OAAAP;AAAA,IACA,cAAcC,EAAQ;AAAA,IACtB,OAAAI;AAAA,IACA,iBAAiB;AAAA,IACjB,wBAAwBG,GAAQ;AAAA,MAC9B,eAAe;AAAA,IAAA,CAChB;AAAA,IACD,YAAYJ,EAAM,SAAS;AAAA,IAC3B,4BAA4BK,GAAM;AAAA,MAChC,MAAMrC;AAAA,MACN,4BAA4BsC,GAAmB;AAAA,QAC7C,WAAWC,EAAO;AAAA,QAClB,QAAQ,CAACvC,CAAO;AAAA,QAChB,cAAc;AAAA,MAAA,CACf;AAAA,IAAA,CACF;AAAA,EAAA,CACF;AACD,2BAA0BwC,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKJ,GAAM;AAAA,MACjC,MAAML,EAAM,SAAS;AAAA,MACrB,UAAUE;AAAA,MACV,4BAA4BQ,GAAqB;AAAA,QAC/C,SAASR;AAAA,QACT,OAAAF;AAAA,MAAA,CACD;AAAA,IAAA,CACF,GAAgBS,gBAAAA,EAAKJ,GAAM;AAAA,MAC1B,MAAMR,EAAQ;AAAA,MACd,4BAA4Bc,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUf,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
1
+ {"version":3,"file":"GrepTool.js","sources":["../../../../src/chat/Tool/grep/GrepTool.tsx"],"sourcesContent":["import { Search } from '@reforma/icons/14';\nimport { plural } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n ToolPathListPopover,\n ToolShell,\n ToolShellFooter,\n ToolShellHeader,\n ToolSummaryBadges,\n} from '../shell';\nimport styles from './GrepTool.module.css';\n\nimport type { GrepToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\ntype GrepHit = {\n path: string;\n line?: number;\n text?: string;\n};\n\nfunction grepPatternFromInput(input: unknown): string {\n if (input == null || typeof input !== 'object') {\n return '';\n }\n\n const pattern = (input as { pattern?: unknown }).pattern;\n\n return typeof pattern === 'string' ? pattern : '';\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction parseContentLine(raw: string): { line?: number; text: string } {\n const match = /^(\\d+):(.*)$/.exec(raw);\n\n if (!match?.[1]) {\n return { text: raw };\n }\n\n const line = Number.parseInt(match[1], 10);\n\n if (!Number.isFinite(line) || line <= 0) {\n return { text: raw };\n }\n\n return { line, text: match[2] };\n}\n\nfunction fileHits(files: unknown): GrepHit[] {\n if (!Array.isArray(files) || !files.every((file): file is string => typeof file === 'string')) {\n return [];\n }\n\n return [...files].sort().map(path => ({ path }));\n}\n\nfunction contentHits(results: unknown): GrepHit[] {\n if (!isRecord(results)) {\n return [];\n }\n\n const hits: GrepHit[] = [];\n\n for (const path of Object.keys(results).sort()) {\n const lines = results[path];\n\n if (!Array.isArray(lines)) {\n continue;\n }\n\n for (const line of lines) {\n if (typeof line !== 'string' || line.length === 0) {\n continue;\n }\n\n hits.push({ path, ...parseContentLine(line) });\n }\n }\n\n return hits;\n}\n\nfunction countHits(counts: unknown): GrepHit[] {\n if (!isRecord(counts)) {\n return [];\n }\n\n const hits: GrepHit[] = [];\n\n for (const path of Object.keys(counts).sort()) {\n const count = counts[path];\n\n if (typeof count !== 'number' || count <= 0) {\n continue;\n }\n\n hits.push({\n path,\n text: plural(count, 'match', 'matches'),\n });\n }\n\n return hits;\n}\n\nfunction grepHits(output: unknown): GrepHit[] {\n if (!isRecord(output)) {\n return [];\n }\n\n const raw = output as GrepToolOutput;\n\n if (raw.output_mode === 'files_with_matches') {\n return fileHits(raw.files);\n }\n\n if (raw.output_mode === 'count') {\n return countHits(raw.counts);\n }\n\n if (raw.output_mode === 'content') {\n return contentHits(raw.results);\n }\n\n const files = fileHits(raw.files);\n\n if (files.length > 0) {\n return files;\n }\n\n const content = contentHits(raw.results);\n\n if (content.length > 0) {\n return content;\n }\n\n return countHits(raw.counts);\n}\n\nfunction grepFilePaths(output: unknown): string[] {\n return [ ...new Set(grepHits(output).map(hit => hit.path)) ];\n}\n\n/** Grep: pattern in the header. Click the row to list files that matched. */\nexport function GrepTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'Grep') {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const pattern = grepPatternFromInput(part.input);\n const done = state === 'output-available';\n const paths = done && !failure.useFailureLabel ? grepFilePaths(part.output) : [];\n const title = done && !failure.useFailureLabel\n ? `Found in ${ plural(paths.length, 'file', 'files') }`\n : 'Searched';\n const header = (\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title={ title }\n titleInProgress=\"Grepping\"\n icon={ <Search aria-hidden /> }\n disclosure={ paths.length > 0 }\n >\n <Show when={ pattern }>\n <ToolSummaryBadges\n className={ styles.pattern }\n labels={ [pattern] }\n aria-label=\"Pattern\"\n />\n </Show>\n </ToolShellHeader>\n );\n\n return (\n <ToolShell data-slot=\"grep-tool\">\n <Show\n when={ paths.length > 0 }\n fallback={ header }\n >\n <ToolPathListPopover\n trigger={ header }\n paths={ paths }\n />\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":["grepPatternFromInput","input","pattern","isRecord","value","parseContentLine","raw","match","line","fileHits","files","file","path","contentHits","results","hits","lines","countHits","counts","count","plural","grepHits","output","content","grepFilePaths","hit","GrepTool","part","isToolUIPart","getToolName","state","failure","getToolFailureRowState","done","paths","title","header","ToolShellHeader","Search","Show","ToolSummaryBadges","styles","ToolShell","_jsx","ToolPathListPopover","ToolShellFooter","Text"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { getToolName } from 'ai';
1
+ import { getToolName } from '@reforma/types';
2
2
  import type { DynamicToolUIPart, ToolUIPart } from 'ai';
3
3
  export type EditingLineCountDelta = {
4
4
  added: number;
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/chat/Tool/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAQjC,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAExD,MAAM,MAAM,qBAAqB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED,mEAAmE;AACnE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAqC9F;AAED,4DAA4D;AAC5D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAQ1E;AAED,wBAAgB,mBAAmB,CAC/B,MAAM,EAAE,qBAAqB,EAC7B,KAAK,EAAE,qBAAqB,GAC7B,IAAI,CAGN;AAED,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAkB/E;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CA8BvE;AAED,uGAAuG;AACvG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAU3F;AAUD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAQ1G;AAED,sHAAsH;AACtH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,SAAS,CAalF;AAmCD,sGAAsG;AACtG,MAAM,MAAM,mBAAmB,GAAG;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,+GAA+G;IAC/G,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,mGAAmG;IACnG,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,iBAAiB,GAAG,mBAAmB,CA0BhG;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAO/D;AAED,2EAA2E;AAC3E,eAAO,MAAM,wBAAwB,gCAAgC,CAAC;AAEtE;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,UAAO,GAAG,OAAO,CAErF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACnC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,OAAO,EACpB,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GACrC,OAAO,CAUT;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;IAAE,KAAK,EAAE,kBAAkB,CAAA;CAAE,CAAC,CAAC;AAExG,iFAAiF;AACjF,wBAAgB,mCAAmC,CAC/C,IAAI,EAAE,eAAe,GACtB,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CA0CpC;AAED,sDAAsD;AACtD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,eAAe,GAAG,qBAAqB,CAQ1F"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/chat/Tool/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAQ7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAExD,MAAM,MAAM,qBAAqB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED,mEAAmE;AACnE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAqC9F;AAED,4DAA4D;AAC5D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAQ1E;AAED,wBAAgB,mBAAmB,CAC/B,MAAM,EAAE,qBAAqB,EAC7B,KAAK,EAAE,qBAAqB,GAC7B,IAAI,CAGN;AAED,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAkB/E;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CA8BvE;AAED,uGAAuG;AACvG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAU3F;AAUD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAQ1G;AAED,sHAAsH;AACtH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,SAAS,CAalF;AAmCD,sGAAsG;AACtG,MAAM,MAAM,mBAAmB,GAAG;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,+GAA+G;IAC/G,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,mGAAmG;IACnG,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,iBAAiB,GAAG,mBAAmB,CA0BhG;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAO/D;AAED,2EAA2E;AAC3E,eAAO,MAAM,wBAAwB,gCAAgC,CAAC;AAEtE;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,UAAO,GAAG,OAAO,CAErF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACnC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,OAAO,EACpB,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GACrC,OAAO,CAUT;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;IAAE,KAAK,EAAE,kBAAkB,CAAA;CAAE,CAAC,CAAC;AAExG,iFAAiF;AACjF,wBAAgB,mCAAmC,CAC/C,IAAI,EAAE,eAAe,GACtB,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CA0CpC;AAED,sDAAsD;AACtD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,eAAe,GAAG,qBAAqB,CAQ1F"}
@@ -1,4 +1,4 @@
1
- import { getToolName as m } from "ai";
1
+ import { getToolName as m } from "@reforma/types";
2
2
  import { editToolLineCounts as v, writeToolLineCounts as y } from "./edit/formatEditDiff.js";
3
3
  import { parseEditWriteToolInput as c } from "./edit/parseEditWriteInput.js";
4
4
  function l(t) {
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../../../src/chat/Tool/helpers.ts"],"sourcesContent":["import { getToolName } from 'ai';\n\nimport { parseCreateDirectoryInput } from './create-directory/parseCreateDirectoryInput';\nimport { editToolLineCounts, writeToolLineCounts } from './edit/formatEditDiff';\nimport { parseEditWriteToolInput } from './edit/parseEditWriteInput';\nimport { parseRemoveFileInput } from './remove-file/parseRemoveFileInput';\n\nimport type { EditToolOutput, WriteToolOutput } from '@reforma/types/sandbox';\nimport type { DynamicToolUIPart, ToolUIPart } from 'ai';\n\nexport type EditingLineCountDelta = { added: number; removed: number };\n\n/** Stable key for matching tool paths (trim, forward slashes, strip a leading `./`). */\nexport function toolPathKey(path: string): string {\n const t = path.trim().replace(/\\\\/g, '/');\n\n if (!t || t === '.') {\n return t;\n }\n\n return t.startsWith('./') ? t.slice(2) : t;\n}\n\n/** Per-file removed line counts from RemoveFile `results` rows. */\nexport function removeFileLineCountsByPath(output: unknown): Map<string, EditingLineCountDelta> {\n const map = new Map<string, EditingLineCountDelta>();\n\n if (output == null || typeof output !== 'object') {\n return map;\n }\n\n const results = (output as { results?: unknown }).results;\n\n if (!Array.isArray(results)) {\n return map;\n }\n\n for (const entry of results) {\n if (entry == null || typeof entry !== 'object') {\n continue;\n }\n\n const row = entry as { path?: unknown; removed?: unknown; lines?: unknown };\n\n if (row.removed !== true || typeof row.lines !== 'number') {\n continue;\n }\n\n const pathRaw = typeof row.path === 'string' ? row.path : '';\n const key = toolPathKey(pathRaw);\n\n if (!key) {\n continue;\n }\n\n const prev = map.get(key) ?? { added: 0, removed: 0 };\n\n map.set(key, { added: prev.added, removed: prev.removed + row.lines });\n }\n\n return map;\n}\n\n/** Total lines removed across RemoveFile `results` rows. */\nexport function removeFileLinesRemoved(output: unknown): number | undefined {\n let total = 0;\n\n for (const delta of removeFileLineCountsByPath(output).values()) {\n total += delta.removed;\n }\n\n return total > 0 ? total : undefined;\n}\n\nexport function mergeLineCountDelta(\n target: EditingLineCountDelta,\n delta: EditingLineCountDelta\n): void {\n target.added += delta.added;\n target.removed += delta.removed;\n}\n\n/** Paths for edit-file dedupe (Edit, Write, RemoveFile, CreateDirectory) */\nexport function pathsFromEditingTool(toolName: string, input: unknown): string[] {\n if (toolName === 'Edit' || toolName === 'Write') {\n const { path } = parseEditWriteToolInput(input);\n\n return path ? [path] : [];\n }\n\n if (toolName === 'RemoveFile') {\n return parseRemoveFileInput(input).filePaths;\n }\n\n if (toolName === 'CreateDirectory') {\n const { path } = parseCreateDirectoryInput(input);\n\n return path ? [path] : [];\n }\n\n return [];\n}\n\nexport function normalizeErrorString(value: unknown): string | undefined {\n if (value == null) {\n return undefined;\n }\n\n if (typeof value === 'string') {\n const t = value.trim();\n\n return t !== '' ? t : undefined;\n }\n\n if (value instanceof Error) {\n const t = value.message.trim();\n\n return t !== '' ? t : undefined;\n }\n\n if (typeof value === 'object') {\n const o = value as Record<string, unknown>;\n\n if (typeof o.message === 'string') {\n const t = o.message.trim();\n\n if (t !== '') {\n return t;\n }\n }\n }\n\n return undefined;\n}\n\n/** User-visible error/denial line for compact tool summaries (`ReadFilesTool`, sandbox info tools). */\nexport function getToolProblemText(part: ToolUIPart | DynamicToolUIPart): string | undefined {\n if (part.state === 'output-error') {\n return normalizeErrorString(part.errorText);\n }\n\n if (part.state === 'output-denied') {\n return part.approval?.reason?.trim() || 'You declined this action';\n }\n\n return undefined;\n}\n\nconst CALL_TOOL_CONTENT_TYPES = new Set([\n 'text',\n 'image',\n 'audio',\n 'resource',\n 'resource_link',\n]);\n\nexport function isCallToolContentBlock(value: unknown): value is Record<string, unknown> & { type: string } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n\n const type = (value as { type?: unknown }).type;\n\n return typeof type === 'string' && CALL_TOOL_CONTENT_TYPES.has(type);\n}\n\n/** MCP `CallToolResult.content` / `parts` — `undefined` if this is not an envelope. Empty array is a valid result. */\nexport function callToolResultContentBlocks(output: unknown): unknown[] | undefined {\n if (output == null || typeof output !== 'object' || Array.isArray(output)) {\n return undefined;\n }\n\n const { parts, content } = output as { parts?: unknown; content?: unknown };\n const blocks = parts ?? content;\n\n if (!Array.isArray(blocks) || !blocks.every(isCallToolContentBlock)) {\n return undefined;\n }\n\n return blocks;\n}\n\n/** MCP `CallToolResult.isError` — tool ran, application failure inside `output`. */\nfunction isCallToolResultError(output: unknown): boolean {\n return callToolResultContentBlocks(output) !== undefined\n && (output as { isError?: unknown }).isError === true;\n}\n\n/** User-facing text from MCP `content[]` / `parts[]` when `isError` is set. */\nfunction callToolResultErrorText(output: unknown): string | undefined {\n const blocks = callToolResultContentBlocks(output);\n\n if (blocks == null) {\n return undefined;\n }\n\n const texts: string[] = [];\n\n for (const item of blocks) {\n const part = item as { type?: unknown; text?: unknown };\n\n if (part.type !== 'text' || typeof part.text !== 'string') {\n continue;\n }\n\n const t = part.text.trim();\n\n if (t !== '') {\n texts.push(t);\n }\n }\n\n return texts.length > 0 ? texts.join('\\n') : undefined;\n}\n\n/** Error/denial row for compact tools: header status icon + tooltip instead of inline danger text. */\nexport type ToolFailureRowState = {\n useFailureLabel: boolean;\n /** Detail for {@link ToolShellHeader} / {@link ToolShellCardHeader} `statusDetail`; error or denial reason. */\n tooltip: string | undefined;\n /** Pass to `ToolShellFooter` — suppressed when `useFailureLabel` (tooltip carries the message). */\n problemText: string | undefined;\n};\n\nexport function getToolFailureRowState(part: ToolUIPart | DynamicToolUIPart): ToolFailureRowState {\n const isOutputError = part.state === 'output-error';\n const isEnvelopeError = part.state === 'output-available' && isCallToolResultError(part.output);\n const isOutputDenied = part.state === 'output-denied';\n const isApprovalDenied = part.state === 'approval-responded' && part.approval?.approved === false;\n const useFailureLabel = isOutputError || isEnvelopeError || isOutputDenied || isApprovalDenied;\n\n let tooltip: string | undefined;\n\n if (isOutputError) {\n tooltip = normalizeErrorString(part.errorText);\n }\n else if (isEnvelopeError) {\n tooltip = callToolResultErrorText(part.output) ?? 'This action failed';\n }\n else if (isOutputDenied || isApprovalDenied) {\n tooltip = part.approval?.reason?.trim() || 'You declined this action';\n }\n\n const problemText = useFailureLabel ? undefined : getToolProblemText(part);\n\n return {\n useFailureLabel,\n tooltip,\n problemText,\n };\n}\n\n/**\n * Terminal AI SDK tool states — invocation finished (success, error, or denial).\n */\nexport function isToolInvocationTerminal(state: string): boolean {\n return (\n state === 'approval-responded'\n || state === 'output-available'\n || state === 'output-error'\n || state === 'output-denied'\n );\n}\n\n/** Default copy when a tool is left non-terminal after the stream ends. */\nexport const TOOL_INTERRUPTED_MESSAGE = 'Tool call was not completed';\n\n/**\n * Tool still running for UI (shimmer / spinner).\n * Non-terminal AI SDK state, and optionally gated on an active stream\n * (`isStreaming` defaults to true so call sites without turn context keep prior behavior).\n */\nexport function isToolInvocationInProgress(state: string, isStreaming = true): boolean {\n return isStreaming && !isToolInvocationTerminal(state);\n}\n\n/**\n * Non-terminal after the run ended — will never finish.\n * Excludes approval wait; pass `awaitingUser` for client tools like AskUserQuestion.\n */\nexport function isToolInvocationStalled(\n state: string,\n isStreaming: boolean,\n options?: { awaitingUser?: boolean }\n): boolean {\n if (options?.awaitingUser || isStreaming || isToolInvocationTerminal(state)) {\n return false;\n }\n\n if (state === 'approval-requested') {\n return false;\n }\n\n return true;\n}\n\nexport type EditingToolPart = Extract<Parameters<typeof getToolName>[0], { state: 'output-available' }>;\n\n/** Map path key → +/− lines for one completed Edit / Write / RemoveFile part. */\nexport function lineCountsByPathFromEditingToolPart(\n part: EditingToolPart\n): Map<string, EditingLineCountDelta> {\n const empty = new Map<string, EditingLineCountDelta>();\n\n const toolName = getToolName(part);\n\n if (toolName === 'Edit') {\n const output = part.output as EditToolOutput;\n\n if (!Array.isArray(output?.hunks)) {\n return empty;\n }\n\n const { path } = parseEditWriteToolInput(part.input);\n const key = toolPathKey(path);\n\n if (!key) {\n return empty;\n }\n\n const counts = editToolLineCounts(output);\n\n return new Map([[key, { added: counts.added, removed: counts.removed }]]);\n }\n\n if (toolName === 'Write') {\n const { path } = parseEditWriteToolInput(part.input);\n const key = toolPathKey(path);\n\n if (!key) {\n return empty;\n }\n\n const counts = writeToolLineCounts(part.output as WriteToolOutput);\n\n return new Map([[key, { added: counts.added, removed: counts.removed ?? 0 }]]);\n }\n\n if (toolName === 'RemoveFile') {\n return removeFileLineCountsByPath(part.output);\n }\n\n return empty;\n}\n\n/** Aggregate +/− lines for Edit, Write, RemoveFile */\nexport function lineCountsFromEditingToolPart(part: EditingToolPart): EditingLineCountDelta {\n const total: EditingLineCountDelta = { added: 0, removed: 0 };\n\n for (const delta of lineCountsByPathFromEditingToolPart(part).values()) {\n mergeLineCountDelta(total, delta);\n }\n\n return total;\n}\n"],"names":["toolPathKey","path","t","removeFileLineCountsByPath","output","map","results","entry","row","pathRaw","key","prev","removeFileLinesRemoved","total","delta","mergeLineCountDelta","target","normalizeErrorString","value","o","getToolProblemText","part","CALL_TOOL_CONTENT_TYPES","isCallToolContentBlock","type","callToolResultContentBlocks","parts","content","blocks","isCallToolResultError","callToolResultErrorText","texts","item","getToolFailureRowState","isOutputError","isEnvelopeError","isOutputDenied","isApprovalDenied","useFailureLabel","tooltip","problemText","isToolInvocationTerminal","state","TOOL_INTERRUPTED_MESSAGE","isToolInvocationInProgress","isStreaming","isToolInvocationStalled","options","lineCountsByPathFromEditingToolPart","empty","toolName","getToolName","parseEditWriteToolInput","counts","editToolLineCounts","writeToolLineCounts","lineCountsFromEditingToolPart"],"mappings":"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"}
1
+ {"version":3,"file":"helpers.js","sources":["../../../src/chat/Tool/helpers.ts"],"sourcesContent":["import { getToolName } from '@reforma/types';\n\nimport { parseCreateDirectoryInput } from './create-directory/parseCreateDirectoryInput';\nimport { editToolLineCounts, writeToolLineCounts } from './edit/formatEditDiff';\nimport { parseEditWriteToolInput } from './edit/parseEditWriteInput';\nimport { parseRemoveFileInput } from './remove-file/parseRemoveFileInput';\n\nimport type { EditToolOutput, WriteToolOutput } from '@reforma/types/sandbox';\nimport type { DynamicToolUIPart, ToolUIPart } from 'ai';\n\nexport type EditingLineCountDelta = { added: number; removed: number };\n\n/** Stable key for matching tool paths (trim, forward slashes, strip a leading `./`). */\nexport function toolPathKey(path: string): string {\n const t = path.trim().replace(/\\\\/g, '/');\n\n if (!t || t === '.') {\n return t;\n }\n\n return t.startsWith('./') ? t.slice(2) : t;\n}\n\n/** Per-file removed line counts from RemoveFile `results` rows. */\nexport function removeFileLineCountsByPath(output: unknown): Map<string, EditingLineCountDelta> {\n const map = new Map<string, EditingLineCountDelta>();\n\n if (output == null || typeof output !== 'object') {\n return map;\n }\n\n const results = (output as { results?: unknown }).results;\n\n if (!Array.isArray(results)) {\n return map;\n }\n\n for (const entry of results) {\n if (entry == null || typeof entry !== 'object') {\n continue;\n }\n\n const row = entry as { path?: unknown; removed?: unknown; lines?: unknown };\n\n if (row.removed !== true || typeof row.lines !== 'number') {\n continue;\n }\n\n const pathRaw = typeof row.path === 'string' ? row.path : '';\n const key = toolPathKey(pathRaw);\n\n if (!key) {\n continue;\n }\n\n const prev = map.get(key) ?? { added: 0, removed: 0 };\n\n map.set(key, { added: prev.added, removed: prev.removed + row.lines });\n }\n\n return map;\n}\n\n/** Total lines removed across RemoveFile `results` rows. */\nexport function removeFileLinesRemoved(output: unknown): number | undefined {\n let total = 0;\n\n for (const delta of removeFileLineCountsByPath(output).values()) {\n total += delta.removed;\n }\n\n return total > 0 ? total : undefined;\n}\n\nexport function mergeLineCountDelta(\n target: EditingLineCountDelta,\n delta: EditingLineCountDelta\n): void {\n target.added += delta.added;\n target.removed += delta.removed;\n}\n\n/** Paths for edit-file dedupe (Edit, Write, RemoveFile, CreateDirectory) */\nexport function pathsFromEditingTool(toolName: string, input: unknown): string[] {\n if (toolName === 'Edit' || toolName === 'Write') {\n const { path } = parseEditWriteToolInput(input);\n\n return path ? [path] : [];\n }\n\n if (toolName === 'RemoveFile') {\n return parseRemoveFileInput(input).filePaths;\n }\n\n if (toolName === 'CreateDirectory') {\n const { path } = parseCreateDirectoryInput(input);\n\n return path ? [path] : [];\n }\n\n return [];\n}\n\nexport function normalizeErrorString(value: unknown): string | undefined {\n if (value == null) {\n return undefined;\n }\n\n if (typeof value === 'string') {\n const t = value.trim();\n\n return t !== '' ? t : undefined;\n }\n\n if (value instanceof Error) {\n const t = value.message.trim();\n\n return t !== '' ? t : undefined;\n }\n\n if (typeof value === 'object') {\n const o = value as Record<string, unknown>;\n\n if (typeof o.message === 'string') {\n const t = o.message.trim();\n\n if (t !== '') {\n return t;\n }\n }\n }\n\n return undefined;\n}\n\n/** User-visible error/denial line for compact tool summaries (`ReadFilesTool`, sandbox info tools). */\nexport function getToolProblemText(part: ToolUIPart | DynamicToolUIPart): string | undefined {\n if (part.state === 'output-error') {\n return normalizeErrorString(part.errorText);\n }\n\n if (part.state === 'output-denied') {\n return part.approval?.reason?.trim() || 'You declined this action';\n }\n\n return undefined;\n}\n\nconst CALL_TOOL_CONTENT_TYPES = new Set([\n 'text',\n 'image',\n 'audio',\n 'resource',\n 'resource_link',\n]);\n\nexport function isCallToolContentBlock(value: unknown): value is Record<string, unknown> & { type: string } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n\n const type = (value as { type?: unknown }).type;\n\n return typeof type === 'string' && CALL_TOOL_CONTENT_TYPES.has(type);\n}\n\n/** MCP `CallToolResult.content` / `parts` — `undefined` if this is not an envelope. Empty array is a valid result. */\nexport function callToolResultContentBlocks(output: unknown): unknown[] | undefined {\n if (output == null || typeof output !== 'object' || Array.isArray(output)) {\n return undefined;\n }\n\n const { parts, content } = output as { parts?: unknown; content?: unknown };\n const blocks = parts ?? content;\n\n if (!Array.isArray(blocks) || !blocks.every(isCallToolContentBlock)) {\n return undefined;\n }\n\n return blocks;\n}\n\n/** MCP `CallToolResult.isError` — tool ran, application failure inside `output`. */\nfunction isCallToolResultError(output: unknown): boolean {\n return callToolResultContentBlocks(output) !== undefined\n && (output as { isError?: unknown }).isError === true;\n}\n\n/** User-facing text from MCP `content[]` / `parts[]` when `isError` is set. */\nfunction callToolResultErrorText(output: unknown): string | undefined {\n const blocks = callToolResultContentBlocks(output);\n\n if (blocks == null) {\n return undefined;\n }\n\n const texts: string[] = [];\n\n for (const item of blocks) {\n const part = item as { type?: unknown; text?: unknown };\n\n if (part.type !== 'text' || typeof part.text !== 'string') {\n continue;\n }\n\n const t = part.text.trim();\n\n if (t !== '') {\n texts.push(t);\n }\n }\n\n return texts.length > 0 ? texts.join('\\n') : undefined;\n}\n\n/** Error/denial row for compact tools: header status icon + tooltip instead of inline danger text. */\nexport type ToolFailureRowState = {\n useFailureLabel: boolean;\n /** Detail for {@link ToolShellHeader} / {@link ToolShellCardHeader} `statusDetail`; error or denial reason. */\n tooltip: string | undefined;\n /** Pass to `ToolShellFooter` — suppressed when `useFailureLabel` (tooltip carries the message). */\n problemText: string | undefined;\n};\n\nexport function getToolFailureRowState(part: ToolUIPart | DynamicToolUIPart): ToolFailureRowState {\n const isOutputError = part.state === 'output-error';\n const isEnvelopeError = part.state === 'output-available' && isCallToolResultError(part.output);\n const isOutputDenied = part.state === 'output-denied';\n const isApprovalDenied = part.state === 'approval-responded' && part.approval?.approved === false;\n const useFailureLabel = isOutputError || isEnvelopeError || isOutputDenied || isApprovalDenied;\n\n let tooltip: string | undefined;\n\n if (isOutputError) {\n tooltip = normalizeErrorString(part.errorText);\n }\n else if (isEnvelopeError) {\n tooltip = callToolResultErrorText(part.output) ?? 'This action failed';\n }\n else if (isOutputDenied || isApprovalDenied) {\n tooltip = part.approval?.reason?.trim() || 'You declined this action';\n }\n\n const problemText = useFailureLabel ? undefined : getToolProblemText(part);\n\n return {\n useFailureLabel,\n tooltip,\n problemText,\n };\n}\n\n/**\n * Terminal AI SDK tool states — invocation finished (success, error, or denial).\n */\nexport function isToolInvocationTerminal(state: string): boolean {\n return (\n state === 'approval-responded'\n || state === 'output-available'\n || state === 'output-error'\n || state === 'output-denied'\n );\n}\n\n/** Default copy when a tool is left non-terminal after the stream ends. */\nexport const TOOL_INTERRUPTED_MESSAGE = 'Tool call was not completed';\n\n/**\n * Tool still running for UI (shimmer / spinner).\n * Non-terminal AI SDK state, and optionally gated on an active stream\n * (`isStreaming` defaults to true so call sites without turn context keep prior behavior).\n */\nexport function isToolInvocationInProgress(state: string, isStreaming = true): boolean {\n return isStreaming && !isToolInvocationTerminal(state);\n}\n\n/**\n * Non-terminal after the run ended — will never finish.\n * Excludes approval wait; pass `awaitingUser` for client tools like AskUserQuestion.\n */\nexport function isToolInvocationStalled(\n state: string,\n isStreaming: boolean,\n options?: { awaitingUser?: boolean }\n): boolean {\n if (options?.awaitingUser || isStreaming || isToolInvocationTerminal(state)) {\n return false;\n }\n\n if (state === 'approval-requested') {\n return false;\n }\n\n return true;\n}\n\nexport type EditingToolPart = Extract<Parameters<typeof getToolName>[0], { state: 'output-available' }>;\n\n/** Map path key → +/− lines for one completed Edit / Write / RemoveFile part. */\nexport function lineCountsByPathFromEditingToolPart(\n part: EditingToolPart\n): Map<string, EditingLineCountDelta> {\n const empty = new Map<string, EditingLineCountDelta>();\n\n const toolName = getToolName(part);\n\n if (toolName === 'Edit') {\n const output = part.output as EditToolOutput;\n\n if (!Array.isArray(output?.hunks)) {\n return empty;\n }\n\n const { path } = parseEditWriteToolInput(part.input);\n const key = toolPathKey(path);\n\n if (!key) {\n return empty;\n }\n\n const counts = editToolLineCounts(output);\n\n return new Map([[key, { added: counts.added, removed: counts.removed }]]);\n }\n\n if (toolName === 'Write') {\n const { path } = parseEditWriteToolInput(part.input);\n const key = toolPathKey(path);\n\n if (!key) {\n return empty;\n }\n\n const counts = writeToolLineCounts(part.output as WriteToolOutput);\n\n return new Map([[key, { added: counts.added, removed: counts.removed ?? 0 }]]);\n }\n\n if (toolName === 'RemoveFile') {\n return removeFileLineCountsByPath(part.output);\n }\n\n return empty;\n}\n\n/** Aggregate +/− lines for Edit, Write, RemoveFile */\nexport function lineCountsFromEditingToolPart(part: EditingToolPart): EditingLineCountDelta {\n const total: EditingLineCountDelta = { added: 0, removed: 0 };\n\n for (const delta of lineCountsByPathFromEditingToolPart(part).values()) {\n mergeLineCountDelta(total, delta);\n }\n\n return total;\n}\n"],"names":["toolPathKey","path","t","removeFileLineCountsByPath","output","map","results","entry","row","pathRaw","key","prev","removeFileLinesRemoved","total","delta","mergeLineCountDelta","target","normalizeErrorString","value","o","getToolProblemText","part","CALL_TOOL_CONTENT_TYPES","isCallToolContentBlock","type","callToolResultContentBlocks","parts","content","blocks","isCallToolResultError","callToolResultErrorText","texts","item","getToolFailureRowState","isOutputError","isEnvelopeError","isOutputDenied","isApprovalDenied","useFailureLabel","tooltip","problemText","isToolInvocationTerminal","state","TOOL_INTERRUPTED_MESSAGE","isToolInvocationInProgress","isStreaming","isToolInvocationStalled","options","lineCountsByPathFromEditingToolPart","empty","toolName","getToolName","parseEditWriteToolInput","counts","editToolLineCounts","writeToolLineCounts","lineCountsFromEditingToolPart"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { AttentionTriangle as x } from "@reforma/icons/14";
2
2
  import { ProgressLoader as E } from "@reforma/icons/assets";
3
- import { getToolName as G } from "ai";
3
+ import { getToolName as G } from "@reforma/types";
4
4
  import { Box as A } from "../../../Box/Box.js";
5
5
  import { For as N } from "../../../For/For.js";
6
6
  import { Image as _ } from "../../../Image/Image.js";